aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoretobi <git@e-tobi.net>2013-09-03 09:48:45 +0200
committeretobi <git@e-tobi.net>2013-09-03 09:48:45 +0200
commit9fe4d4ea9c054e539ab679ed2e9c076c35beb69d (patch)
treepre { line-height: 125%; margin: 0; } td.linenos pre { color: #000000; background-color: #f0f0f0; padding: 0 5px 0 5px; } span.linenos { color: #000000; background-color: #f0f0f0; padding: 0 5px 0 5px; } td.linenos pre.special { color: #000000; background-color: #ffffc0; padding: 0 5px 0 5px; } span.linenos.special { color: #000000; background-color: #ffffc0; padding: 0 5px 0 5px; } .highlight .hll { background-color: #ffffcc } .highlight .c { color: #888888 } /* Comment */ .highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */ .highlight .k { color: #008800; font-weight: bold } /* Keyword */ .highlight .ch { color: #888888 } /* Comment.Hashbang */ .highlight .cm { color: #888888 } /* Comment.Multiline */ .highlight .cp { color: #cc0000; font-weight: bold } /* Comment.Preproc */ .highlight .cpf { color: #888888 } /* Comment.PreprocFile */ .highlight .c1 { color: #888888 } /* Comment.Single */ .highlight .cs { color: #cc0000; font-weight: bold; background-color: #fff0f0 } /* Comment.Special */ .highlight .gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */ .highlight .ge { font-style: italic } /* Generic.Emph */ .highlight .gr { color: #aa0000 } /* Generic.Error */ .highlight .gh { color: #333333 } /* Generic.Heading */ .highlight .gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */ .highlight .go { color: #888888 } /* Generic.Output */ .highlight .gp { color: #555555 } /* Generic.Prompt */ .highlight .gs { font-weight: bold } /* Generic.Strong */ .highlight .gu { color: #666666 } /* Generic.Subheading */ .highlight .gt { color: #aa0000 } /* Generic.Traceback */ .highlight .kc { color: #008800; font-weight: bold } /* Keyword.Constant */ .highlight .kd { color: #008800; font-weight: bold } /* Keyword.Declaration */ .highlight .kn { color: #008800; font-weight: bold } /* Keyword.Namespace */ .highlight .kp { color: #008800 } /* Keyword.Pseudo */ .highlight .kr { color: #008800; font-weight: bold } /* Keyword.Reserved */ .highlight .kt { color: #888888; font-weight: bold } /* Keyword.Type */ .highlight .m { color: #0000DD; font-weight: bold } /* Literal.Number */ .highlight .s { color: #dd2200; background-color: #fff0f0 } /* Literal.String */ .highlight .na { color: #336699 } /* Name.Attribute */ .highlight .nb { color: #003388 } /* Name.Builtin */ .highlight .nc { color: #bb0066; font-weight: bold } /* Name.Class */ .highlight .no { color: #003366; font-weight: bold } /* Name.Constant */ .highlight .nd { color: #555555 } /* Name.Decorator */ .highlight .ne { color: #bb0066; font-weight: bold } /* Name.Exception */ .highlight .nf { color: #0066bb; font-weight: bold } /* Name.Function */ .highlight .nl { color: #336699; font-style: italic } /* Name.Label */ .highlight .nn { color: #bb0066; font-weight: bold } /* Name.Namespace */ .highlight .py { color: #336699; font-weight: bold } /* Name.Property */ .highlight .nt { color: #bb0066; font-weight: bold } /* Name.Tag */ .highlight .nv { color: #336699 } /* Name.Variable */ .highlight .ow { color: #008800 } /* Operator.Word */ .highlight .w { color: #bbbbbb } /* Text.Whitespace */ .highlight .mb { color: #0000DD; font-weight: bold } /* Literal.Number.Bin */ .highlight .mf { color: #0000DD; font-weight: bold } /* Literal.Number.Float */ .highlight .mh { color: #0000DD; font-weight: bold } /* Literal.Number.Hex */ .highlight .mi { color: #0000DD; font-weight: bold } /* Literal.Number.Integer */ .highlight .mo { color: #0000DD; font-weight: bold } /* Literal.Number.Oct */ .highlight .sa { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Affix */ .highlight .sb { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Backtick */ .highlight .sc { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Char */ .highlight .dl { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Delimiter */ .highlight .sd { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Doc */ .highlight .s2 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Double */ .highlight .se { color: #0044dd; background-color: #fff0f0 } /* Literal.String.Escape */ .highlight .sh { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Heredoc */ .highlight .si { color: #3333bb; background-color: #fff0f0 } /* Literal.String.Interpol */ .highlight .sx { color: #22bb22; background-color: #f0fff0 } /* Literal.String.Other */ .highlight .sr { color: #008800; background-color: #fff0ff } /* Literal.String.Regex */ .highlight .s1 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Single */ .highlight .ss { color: #aa6600; background-color: #fff0f0 } /* Literal.String.Symbol */ .highlight .bp { color: #003388 } /* Name.Builtin.Pseudo */ .highlight .fm { color: #0066bb; font-weight: bold } /* Name.Function.Magic */ .highlight .vc { color: #336699 } /* Name.Variable.Class */ .highlight .vg { color: #dd7700 } /* Name.Variable.Global */ .highlight .vi { color: #3333bb } /* Name.Variable.Instance */ .highlight .vm { color: #336699 } /* Name.Variable.Magic */ .highlight .il { color: #0000DD; font-weight: bold } /* Literal.Number.Integer.Long */
# Lorient - France (DVB-T transmitter of Lorient ( Ploemer ) )
# Lorient - France (signal DVB-T transmis depuis l'émetteur de Ploemer )
#
# ATTENTION ! Ce fichier a ete construit automatiquement a partir
# des frequences obtenues sur : http://www.tvnt.net/multiplex_frequences.htm
# en Avril 2006. Si vous constatez des problemes et voulez apporter des
# modifications au fichier, envoyez le fichier modifie a
# l'adresse linux-dvb@linuxtv.org (depot des fichiers d'init dvb)
# ou a l'auteur du fichier :
# Nicolas Estre <n_estre@yahoo.fr>
#
# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
#### Lorient - Ploemer ####
#R1
T 554000000 8MHz AUTO NONE QAM64 8k AUTO NONE
#R2
T 586000000 8MHz AUTO NONE QAM64 8k AUTO NONE
#R3
T 818000000 8MHz AUTO NONE QAM64 8k AUTO NONE
#R4
T 570000000 8MHz AUTO NONE QAM64 8k AUTO NONE
#R5
T 794000000 8MHz AUTO NONE QAM64 8k AUTO NONE
#R6
T 562000000 8MHz AUTO NONE QAM64 8k AUTO NONE
-rw-r--r--util/alevt/ReadmeGR28
-rw-r--r--util/alevt/TODO12
-rw-r--r--util/alevt/alevt-cap.153
-rw-r--r--util/alevt/alevt-cap.c280
-rw-r--r--util/alevt/alevt-date.141
-rw-r--r--util/alevt/alevt-date.c225
-rw-r--r--util/alevt/alevt.160
-rw-r--r--util/alevt/alevt.desktop9
-rw-r--r--util/alevt/bdf2xbm.c212
-rw-r--r--util/alevt/cache.c229
-rw-r--r--util/alevt/cache.h41
-rw-r--r--util/alevt/dllist.h55
-rw-r--r--util/alevt/exp-gfx.c258
-rw-r--r--util/alevt/exp-html.c299
-rw-r--r--util/alevt/exp-txt.c226
-rw-r--r--util/alevt/export.c364
-rw-r--r--util/alevt/export.h66
-rw-r--r--util/alevt/fdset.c97
-rw-r--r--util/alevt/fdset.h28
-rw-r--r--util/alevt/font.c5
-rw-r--r--util/alevt/font.h19
-rw-r--r--util/alevt/hamm.c229
-rw-r--r--util/alevt/hamm.h7
-rw-r--r--util/alevt/help.c83
-rw-r--r--util/alevt/help.h8
-rw-r--r--util/alevt/icon.xbm17
-rw-r--r--util/alevt/lang.c393
-rw-r--r--util/alevt/lang.h28
-rw-r--r--util/alevt/main.c221
-rw-r--r--util/alevt/misc.c66
-rw-r--r--util/alevt/misc.h32
-rw-r--r--util/alevt/os.h7
-rw-r--r--util/alevt/search.c127
-rw-r--r--util/alevt/search.h16
-rw-r--r--util/alevt/ui.c721
-rw-r--r--util/alevt/ui.h35
-rw-r--r--util/alevt/vbi.c942
-rw-r--r--util/alevt/vbi.h47
-rw-r--r--util/alevt/vt.h62
-rw-r--r--util/alevt/vt900.out29
-rw-r--r--util/alevt/vt901.out29
-rw-r--r--util/alevt/vt902.out29
-rw-r--r--util/alevt/vt903.out29
-rw-r--r--util/alevt/vt904.out29
-rw-r--r--util/alevt/vt905.out29
-rw-r--r--util/alevt/vt906.out29
-rw-r--r--util/alevt/vt907.out29
-rw-r--r--util/alevt/vt908.out29
-rw-r--r--util/alevt/vt909.out29
-rw-r--r--util/alevt/vt910.out29
-rw-r--r--util/alevt/vt911.out29
-rw-r--r--util/alevt/vt912.out29
-rw-r--r--util/alevt/vt913.out29
-rw-r--r--util/alevt/vt914.out29
-rw-r--r--util/alevt/vt915.out29
-rw-r--r--util/alevt/vtxt-iso8859-7.bdf5768
-rw-r--r--util/alevt/vtxt-koi8.bdf5906
-rw-r--r--util/alevt/vtxt-latin-1.bdf5906
-rw-r--r--util/alevt/vtxt-latin-2.bdf5906
-rw-r--r--util/alevt/xio.c1156
-rw-r--r--util/alevt/xio.h80
-rw-r--r--util/atsc_epg/Makefile16
-rw-r--r--util/atsc_epg/README12
-rw-r--r--util/atsc_epg/atsc_epg.c1249
-rw-r--r--util/femon/femon.c57
-rw-r--r--util/gotox/Makefile17
-rw-r--r--util/gotox/gotox.c145
-rw-r--r--util/scan/dvb-c/at-Kabel-Braunau26
-rw-r--r--util/scan/dvb-c/at-Kabelsignal38
-rw-r--r--util/scan/dvb-c/at-KarrerNet18
-rw-r--r--util/scan/dvb-c/hu-Digikabel24
-rw-r--r--util/scan/dvb-c/nl-Casema3
-rw-r--r--util/scan/dvb-c/nl-Ziggo14
-rw-r--r--util/scan/dvb-c/nl-Ziggo-Zwolle26
-rw-r--r--util/scan/dvb-c/se-comhem22
-rw-r--r--util/scan/dvb-s/Agila2_C-146.0E60
-rw-r--r--util/scan/dvb-s/Amos-4w114
-rw-r--r--util/scan/dvb-s/Apstar6_C-134.0E15
-rw-r--r--util/scan/dvb-s/AsiaSat2_C-100.5E51
-rw-r--r--util/scan/dvb-s/AsiaSat3S_C-105.5E152
-rw-r--r--util/scan/dvb-s/Asiasat4_C-122.2E27
-rw-r--r--util/scan/dvb-s/Astra-23.5E66
-rw-r--r--util/scan/dvb-s/Atlantic-Bird-1-12.5W46
-rw-r--r--util/scan/dvb-s/Atlantic-Bird-3-5.0W4
-rw-r--r--util/scan/dvb-s/Chinastar1_C-87.5E15
-rw-r--r--util/scan/dvb-s/Insat2E_C-83.0E93
-rw-r--r--util/scan/dvb-s/Insat3A_C-93.5E66
-rw-r--r--util/scan/dvb-s/Insat4A_C-83.0E93
-rw-r--r--util/scan/dvb-s/Insat4B_C-93.5E51
-rw-r--r--util/scan/dvb-s/Intelsat-1002-1.0W17
-rw-r--r--util/scan/dvb-s/Intelsat8_C-166.0E39
-rw-r--r--util/scan/dvb-s/JCSat3A_C-128.0E18
-rw-r--r--util/scan/dvb-s/Measat3_C-91.5E54
-rw-r--r--util/scan/dvb-s/Nilesat101+102-7.0W73
-rw-r--r--util/scan/dvb-s/PalapaC2_C-113.0E39
-rw-r--r--util/scan/dvb-s/ST1_C-80.0E27
-rw-r--r--util/scan/dvb-s/Sirius-5.0E57
-rw-r--r--util/scan/dvb-s/Telecom2-8.0W17
-rw-r--r--util/scan/dvb-s/Telkom1_C-108.0E48
-rw-r--r--util/scan/dvb-s/Telstar-12-15.0W32
-rw-r--r--util/scan/dvb-s/Telstar10_C-76.5E63
-rw-r--r--util/scan/dvb-s/Telstar12-15.0W26
-rw-r--r--util/scan/dvb-s/Telstar18_C-138.0E18
-rw-r--r--util/scan/dvb-s/Thaicom1A_C-120.0E24
-rw-r--r--util/scan/dvb-s/Thaicom2_C-78.5E33
-rw-r--r--util/scan/dvb-s/Thaicom5_C-78.5E69
-rw-r--r--util/scan/dvb-s/Thor-1.0W32
-rw-r--r--util/scan/dvb-s/Vinasat1_C-132.0E12
-rw-r--r--util/scan/dvb-t/au-AdelaideFoothills12
-rw-r--r--util/scan/dvb-t/au-Bendigo41
-rw-r--r--util/scan/dvb-t/au-Devonport19
-rw-r--r--util/scan/dvb-t/au-FraserCoast-Bundaberg12
-rw-r--r--util/scan/dvb-t/au-Goulburn-Rocky_Hill19
-rw-r--r--util/scan/dvb-t/au-Hervey_Bay-Ghost_Hill16
-rw-r--r--util/scan/dvb-t/au-Perth2
-rw-r--r--util/scan/dvb-t/au-SunshineCoast2
-rw-r--r--util/scan/dvb-t/au-Sutherland20
-rw-r--r--util/scan/dvb-t/be-Brussels6
-rw-r--r--util/scan/dvb-t/cz-All41
-rw-r--r--util/scan/dvb-t/cz-Brno10
-rw-r--r--util/scan/dvb-t/cz-Domazlice3
-rw-r--r--util/scan/dvb-t/cz-Klet4
-rw-r--r--util/scan/dvb-t/cz-Ostrava3
-rw-r--r--util/scan/dvb-t/cz-Plzen8
-rw-r--r--util/scan/dvb-t/cz-Praha7
-rw-r--r--util/scan/dvb-t/de-Baden-Wuerttemberg15
-rw-r--r--util/scan/dvb-t/de-Bayern28
-rw-r--r--util/scan/dvb-t/de-Berlin7
-rw-r--r--util/scan/dvb-t/de-Brandenburg4
-rw-r--r--util/scan/dvb-t/de-Bremen4
-rw-r--r--util/scan/dvb-t/de-Hamburg10
-rw-r--r--util/scan/dvb-t/de-Hessen12
-rw-r--r--util/scan/dvb-t/de-Mecklenburg-Vorpommern10
-rw-r--r--util/scan/dvb-t/de-Niedersachsen23
-rw-r--r--util/scan/dvb-t/de-Nordrhein-Westfalen10
-rw-r--r--util/scan/dvb-t/de-Rheinland-Pfalz4
-rw-r--r--util/scan/dvb-t/de-Saarland4
-rw-r--r--util/scan/dvb-t/de-Sachsen5
-rw-r--r--util/scan/dvb-t/de-Sachsen-Anhalt7
-rw-r--r--util/scan/dvb-t/de-Schleswig-Holstein14
-rw-r--r--util/scan/dvb-t/de-Thueringen4
-rw-r--r--util/scan/dvb-t/es-Albacete16
-rw-r--r--util/scan/dvb-t/es-Alfabia1
-rw-r--r--util/scan/dvb-t/es-BaixoMinho16
-rw-r--r--util/scan/dvb-t/es-Collserola16
-rw-r--r--util/scan/dvb-t/es-Granada8
-rw-r--r--util/scan/dvb-t/es-Huesca8
-rw-r--r--util/scan/dvb-t/es-Muros-Noia9
-rw-r--r--util/scan/dvb-t/es-Pamplona9
-rw-r--r--util/scan/dvb-t/es-Santiago_de_Compostela9
-rw-r--r--util/scan/dvb-t/es-Vitoria-Gasteiz8
-rw-r--r--util/scan/dvb-t/fi-Smedsbole13
-rw-r--r--util/scan/dvb-t/fr-Laval12
-rw-r--r--util/scan/dvb-t/fr-Rochefort-sur-mer14
-rw-r--r--util/scan/dvb-t/hr-All24
-rw-r--r--util/scan/dvb-t/hr-Zagreb3
-rw-r--r--util/scan/dvb-t/hu-Budapest8
-rw-r--r--util/scan/dvb-t/hu-Debrecen8
-rw-r--r--util/scan/dvb-t/hu-Gyor8
-rw-r--r--util/scan/dvb-t/hu-Kabhegy8
-rw-r--r--util/scan/dvb-t/hu-Kekes8
-rw-r--r--util/scan/dvb-t/hu-Kiskoros8
-rw-r--r--util/scan/dvb-t/hu-Nagykanizsa-Ujudvar8
-rw-r--r--util/scan/dvb-t/hu-Pecs8
-rw-r--r--util/scan/dvb-t/hu-Szeged8
-rw-r--r--util/scan/dvb-t/hu-Szentes8
-rw-r--r--util/scan/dvb-t/hu-Tokaj8
-rw-r--r--util/scan/dvb-t/hu-Uzd8
-rw-r--r--util/scan/dvb-t/hu-Vasvar-Hegyhatsal8
-rw-r--r--util/scan/dvb-t/it-Montevergine18
-rw-r--r--util/scan/dvb-t/lt-All39
-rw-r--r--util/scan/dvb-t/ro-Bucharest5
-rw-r--r--util/scan/dvb-t/se-Ornskoldsvik_As1
-rw-r--r--util/scan/dvb-t/se-Skelleftea1
-rw-r--r--util/scan/dvb-t/sk-BanskaBystrica3
-rw-r--r--util/scan/dvb-t/sk-Bardejov5
-rw-r--r--util/scan/dvb-t/sk-Bratislava3
-rw-r--r--util/scan/dvb-t/sk-Kosice3
-rw-r--r--util/scan/dvb-t/sk-Michalovce5
-rw-r--r--util/scan/dvb-t/sk-Namestovo5
-rw-r--r--util/scan/dvb-t/sk-Poprad5
-rw-r--r--util/scan/dvb-t/sk-RimavskaSobota5
-rw-r--r--util/scan/dvb-t/sk-Trencin5
-rw-r--r--util/scan/dvb-t/sk-VelkyKrtis5
-rw-r--r--util/scan/dvb-t/sk-Zilina5
-rw-r--r--util/scan/dvb-t/uk-Redruth13
-rw-r--r--util/scan/dvb-t/uk-StocklandHill15
-rw-r--r--util/scan/dvb-t/uk-Storeton15
-rw-r--r--util/scan/dvb-t/uk-WinterHill18
-rw-r--r--util/scan/dvb-t/vn-Hanoi5
-rw-r--r--util/scan/dvb-t/vn-Thaibinh5
-rw-r--r--util/scan/scan.c11
-rw-r--r--util/szap/Makefile2
-rw-r--r--util/szap/azap.c27
-rw-r--r--util/szap/czap.c91
-rw-r--r--util/szap/szap.c97
-rw-r--r--util/szap/tzap.c73
-rw-r--r--util/szap/util.c126
-rw-r--r--util/szap/util.h24
210 files changed, 35932 insertions, 637 deletions
diff --git a/.hg_archival.txt b/.hg_archival.txt
index 64b0306..51d57ab 100644
--- a/.hg_archival.txt
+++ b/.hg_archival.txt
@@ -1,2 +1,2 @@
repo: d9fe7e17226f8e321aa80a015fc8d53f33b265d7
-node: 2d700fe04e4386a32e37f3a1291cacafd375aa60
+node: 7de0663facd92bbb9049aeeda3dcba9601228f30
diff --git a/Make.rules b/Make.rules
index e867c3a..3410d7b 100644
--- a/Make.rules
+++ b/Make.rules
@@ -35,7 +35,7 @@ libdir ?= $(prefix)/lib
sharedir ?= $(prefix)/share
ifneq ($(DESTDIR),)
-DESTDIR = $(DESTDIR)/
+DESTDIR := $(DESTDIR)/
endif
ifeq ($(V),1)
diff --git a/README b/README
index ad29647..0870a66 100644
--- a/README
+++ b/README
@@ -15,6 +15,8 @@ util/dvbnet - Control digital data network interfaces.
util/dvbtraffic - Monitor traffic on a digital device.
util/femon - Monitor the tuning on a digital TV device.
util/zap - *Just* tunes a digital device - really intended for developers.
+util/gotox - Simple Rotor control utility
+util/alevt - Teletext capture and display utility
Hardware Specific Utilities:
util/av7110_loadkeys - Load remote keys into an av7110 based card
@@ -36,5 +38,10 @@ For convenience, dvb-apps contains a copy of the DVB API include
files as they are contained in the linuxtv-dvb-1.? release
and the 2.6.x Linux kernel.
+AleVT is not compiled by the main Makefile, because it depends on external
+libraries which might not be available in your system (see util/alevt/README for
+details). If you have the required libraries, to compile AleVT go to util/alevt/
+and type "make".
+
Johannes Stezenbach <js@convergence.de>
Andrew de Quincey <adq_dvb@lidskialf.net>
diff --git a/lib/libdvbsec/dvbsec_api.c b/lib/libdvbsec/dvbsec_api.c
index 5f2ae22..62d225e 100644
--- a/lib/libdvbsec/dvbsec_api.c
+++ b/lib/libdvbsec/dvbsec_api.c
@@ -537,19 +537,12 @@ int dvbsec_diseqc_goto_rotator_bearing(struct dvbfe_handle *fe,
}
// generate the command
- if (integer < -256) {
- return -EINVAL;
- } else if (integer < 0) {
- integer = -integer;
- data[3] = 0xf0;
- } else if (integer < 256) {
- data[3] = 0x00;
- } else if (integer < 512) {
- integer -= 256;
- data[3] = 0x10;
- } else {
- return -EINVAL;
+ if (integer < 0.0) {
+ data[3] = 0xD0; // West is a negative angle value
+ } else if (integer >= 0.0) {
+ data[3] = 0xE0; // East is a positive angle value
}
+ integer = abs(integer);
data[3] |= ((integer / 16) & 0x0f);
integer = integer % 16;
data[4] |= ((integer & 0x0f) << 4) | fraction;
diff --git a/util/Makefile b/util/Makefile
index c7a83db..db9e63d 100644
--- a/util/Makefile
+++ b/util/Makefile
@@ -3,6 +3,7 @@
.PHONY: all clean install
all clean install:
+ $(MAKE) -C atsc_epg $@
$(MAKE) -C av7110_loadkeys $@
$(MAKE) -C dib3000-watch $@
$(MAKE) -C dst-utils $@
@@ -15,4 +16,5 @@ all clean install:
$(MAKE) -C szap $@
$(MAKE) -C ttusb_dec_reset $@
$(MAKE) -C gnutv $@
+ $(MAKE) -C gotox $@
$(MAKE) -C zap $@
diff --git a/util/alevt/COPYRIGHT b/util/alevt/COPYRIGHT
new file mode 100644
index 0000000..17930ea
--- /dev/null
+++ b/util/alevt/COPYRIGHT
@@ -0,0 +1,297 @@
+This message applies to all files within the archive:
+
+ Copyright (C) 1998,1999,2000 Edgar Toernig (froese@gmx.de)
+ All rights reserved.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License Version 2 as
+ published by the Free Software Foundation.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+
+And here's the GNU GPL V2:
+
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+ 675 Mass Ave, Cambridge, MA 02139, USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
diff --git a/util/alevt/ChangeLog b/util/alevt/ChangeLog
new file mode 100644
index 0000000..896ddc3
--- /dev/null
+++ b/util/alevt/ChangeLog
@@ -0,0 +1,535 @@
+Thu Feb 11 22:05:00 MET 2010 (1.7.0)
+
+ - redesigned version:
+ - outfile, new starting methods, libzvbi implementation
+ - lots of bug fixes, all patches available in the Internet applied
+ - extensive code cleanup
+
+Mon Dec 3 03:11:07 MET 2007 (1.6.2)
+
+ - compilation fixes for newer gcc
+ - makefile tweaks (man vs share/man, /usr/X11R6 vs /usr, etc)
+ - default device changed to /dev/vbi0
+ - adapt to current v4l2 api
+ - some minor fixes collected during the past years
+
+ This is a build-time update to conform to newer compilers and
+ system environments. If you have a running AleVT there's no
+ reason to update. The only real fix is in the html-exporter
+ which was producing broken html (missing double-quotes).
+
+Thu Jan 23 01:53:10 MET 2003
+
+ - Fixed a bug in contrib/cap-all.c (fdset_init before vbi_open)
+ - Expaned cap-all.c to show how to save in two formats simultaneously.
+
+Tue Aug 20 05:22:16 MEST 2002 (1.6.1)
+
+ - Removed the bttv-warning from the help pages ;-)
+
+Mon Jul 23 18:34:32 MEST 2001
+
+ - Fixed bug in ui.c - found by <pawel@sakowski.eu.org>.
+ - When clicking on page numbers accept sub-page numbers too.
+
+Sat Dec 23 15:12:11 MET 2000
+
+ - Fixed 'double height last line' bug in export.c reported by
+ <Matthias.Kleinmann@urz.uni-heidelberg.de>
+
+Thu Oct 12 02:19:31 MEST 2000
+
+ - The &nbsp; fix was wrong. Removed it.
+
+Wed Oct 11 19:41:38 MEST 2000 (1.6.0)
+
+ - Some documentation tweaks.
+ - Release. Made it 1.6 because of V4l2 API.
+
+Thu Sep 21 21:07:12 MEST 2000
+
+ - Removed old bttv-only decoder. Only the v4l2-based stays.
+ If the device does not support v4l2, default parameters
+ appropriate for the bttv-driver are taken.
+ - Subpage cycling (up/down and 2nd wheel) stays in the current
+ page.
+
+Sat Sep 16 23:52:12 MEST 2000
+
+ - Experimental v4l2 interface added.
+ - Finetune defaults to 1 now. Works best for me. Tell me
+ if you don't like it.
+ - Russian patch still not added :-/
+ - Fixed the bug in xio.c that Ben Smithurst
+ <ben@scientia.demon.co.uk> found.
+ - Added the dual-wheel-mouse patch from Holger Fitzner.
+
+Tue May 30 03:09:24 MEST 2000
+
+ - As Matto Fransen <matto@matto.nl> reported: the ; after &nbsp
+ in exp-html is missing. fixed that.
+
+Tue May 9 20:21:52 MEST 2000
+
+ - Removed the -oldbttv/-newbttv options. If your driver has
+ a buffer size different from that in the current bttv you
+ either have to support the VBISIZE ioctl or change the source.
+ (Tried to implement an autodetect by non-blocking reads but
+ that confuses the driver that much that it no longers gives
+ reasonable data.)
+ - Added a compression option to the png export filter and
+ changed the default compression level to the lib's default.
+ The prev default of 9 was way to slow.
+
+Wed May 3 19:18:55 MEST 2000
+
+ - Added a smaller font. Made out of the neep9 font from
+ the really great jmk-fonts (http://www.pobox.com/~jmknoble).
+
+Sat Apr 29 02:36:41 MEST 2000
+
+ - Fixed SEGV in export.c:adjust.
+ - Fixed a possible buffer overrun in exp-txt.c
+
+Thu Nov 4 21:18:52 MET 1999 (1.5.1)
+
+ - Added os.h. That way alevt compiles right out of the
+ box on all BSD systems (I hope *g*).
+ - Fixed the DST bug in alevt-date.
+ - Put vtwiz.pl in contrib, a perl/tk/set-tv script to
+ launch alevt written by Joern Borgert.
+
+Tue Oct 26 23:55:09 MEST 1999 (1.5.1-pre1)
+
+ - Added timeout option to alevt-cap.
+ - Use install instead of cp in the Makefile.
+ - Added -I/usr/local/include and -L/usr/local/lib
+ in the Makefile.
+ - Changed #ifdef FREEBSD to #ifdef BSD.
+ - exchanged contrib/paul-export.patch with
+ paul.fmt_page.c (a replacement for export.c:fmt_page())
+ and paul.fmt_page.patch (the same in form of a
+ patch file).
+ - Some doc corrections.
+
+Thu Oct 14 02:49:48 MEST 1999
+
+ - Added FREEBSD patches.
+
+Fri Oct 8 23:36:45 MEST 1999 (1.5.0)
+
+ - Updated the documentation.
+
+ So, what's new since 1.4.9 (nearly 4 months ago)?
+ Two major things: full latin-2 support and export
+ filters for alevt-cap and alevt itself.
+
+ For the latin-2 support page enhancement packets
+ have to be decoded and some latin-1 pages may
+ benefit from that, too. Note: if you select
+ latin-2 everything is latin-2, even cut'n paste.
+ (new cmdline option -charset latin-1|2)
+
+ The export filters allow saving pages in different
+ formats. At the moment there's ascii (with and with-
+ out color), html, png, and ppm. The png filter
+ requires libpng. If you don't have it (or don't want
+ png support) just remove the WITH_PNG from the
+ Makefile. To save the currently displayed page just
+ press 's'. See alevt-cap(1) for the format string.
+
+ Preview: 1.5.1 will have the FreeBSD patches and
+ any bug fixes. (But not more *g*).
+
+Fri Oct 8 02:06:35 MEST 1999 (1.5.0-pre4)
+
+ Finally I could get away from my Playstation and
+ work a little bit on alevt *g*
+
+ - Tried to change alevt-date with freebsd patches from
+ Thomas Runge <runge@rostock.zgdv.de>. They do not
+ have the timezone and daylight variables. But I do
+ not have tm_gmtoff. So it's commented out for the
+ moment.
+ - Made font.[ch] so that only one copy of the fonts is
+ in the executable when including export modules
+ (exp-gfx.c uses them). Had to tweak the makefile.
+ - Added 's' for saving pages to files. Prompts for
+ a format string and a filename and saves the
+ currently displayed page.
+ (Formerly, 's' and 'S' were aliases for '/' and '?'
+ (searching))
+ - Found a bug in export.c regarding double height lines.
+ - Added a patch to the contrib dir to pass the URL you
+ click on to netscape.
+
+ The documentation updates are still missing. That's
+ the last thing to do for 1.5.0. But that's so boring...
+
+Fri Aug 20 21:28:18 MEST 1999
+
+ Back from holidays and time for alevt...
+
+ - Added html, png, and ppm export modules from Paul.
+ - Fixed the return status for export_output.
+ - Tweaked the makefile for libpng support.
+ - Added the export howto to the contrib dir.
+ - Added Paul's fmt_page routine to contrib as a patch
+ to export.c
+ - Added "-format help" to list all output formats and
+ its options.
+
+ Still to do: update man page of alevt-cap, add export
+ to alevt, add erc to alevt-cap.
+
+ Oh, btw, alevt is running on FreeBSD with the bt848
+ driver from Roger Hardiman <roger@cs.strath.ac.uk> *g*.
+ I wonder if it's possible to port his driver to linux.
+ Maybe it runs better then bttv... (I still get reports
+ with stuck xawtvs ...)
+
+Mon Jul 19 01:15:50 MEST 1999 (1.5.0-pre3)
+
+ - Added export modules. It's gotten much to complex.
+
+ A lot of things still to do: add other formats [Paul?],
+ add documentation, add format-help, add export to alevt,
+ add erc to alevt-cap, ...
+
+Mon Jul 12 00:09:03 MEST 1999
+
+ - Added an incomplete 20x24 font to the contrib dir.
+
+Tue Jun 29 00:46:03 MEST 1999 (1.5.0-pre2)
+
+ - Added lanugage tables from Radoslaw.
+ - Added new latin-2 font from Radoslaw.
+ - Fixed a bug with hold graphics. There's still one bug
+ on CNN's page 100 (has to do with set-after behaviour of
+ color select in hold graphics mode). The last line of the
+ earth should be blue-blue-green not blue-green-green.
+ AleVT always uses set-at behaviour. Afaik, this combination
+ (hold + set-after) is the only way to see the difference
+ between set-at and set-after. Set-after will blow up the
+ code so I will leave it as it is.
+ - vbi now collects all pkt26 and enhances the page before
+ it is passed on. Seem's to work.
+
+Tue Jun 22 22:13:45 MEST 1999 (1.5.0-pre1)
+
+ - Fixed hamm24. And, it should be fast now *g*
+ - Moved the language conversion parts to lang.c
+ - Added additional lang_chars for use with the latin-2 charset.
+ - Added -charset latin-1/2 option.
+ - Added pkt x/26 decoding. ... and noticed, that these packets
+ are sent between line 0 and 1. FUCK. Now I have to save
+ all x/26 until the page is complete. But not today... :-(
+
+ Things are getting more and more uglier. The right thing
+ to do would be to make a big font with all possible chars
+ (including cyrillic, arabic, smoothed graphics, ...).
+ That would mean to make each char in vtp->data 16 bit.
+ And then add an attribute word for each char so that the
+ enhanced attributes work, too. Searching and cut & paste
+ would be more complicated... but the worst, the pages
+ will be much bigger (4 times larger). Really bad for
+ the cache and god knows for what else...
+ Is it worth all the trouble??? I don't need that!
+
+Tue Jun 15 01:25:40 MEST 1999
+
+ - Changed .specs file again. I previously changed alevt.spec
+ instead of alevt.spec.in :-(
+
+Mon Jun 14 23:45:48 MEST 1999 (1.4.9)
+
+ - Made a very simple capture program (alevt-cap). Just collects
+ the given pages and writes them to disk in ASCII.
+ I will only accept bug reports/fixes, no enhancement requests
+ at the moment *g*
+ (I can't believe it; I even wrote a man page...)
+ - Changed the subpage delimiter on the command line from '/' to '.'
+ The old one ('/') is still accepted. (Reason: alevt-cap uses
+ the page number as part of the filename and a / is inconvenient.
+ And I already wanted to let you enter subpages with the keypad
+ and the '.' would be a nice key for that.)
+ - Tweaked the .specs file... (Btw, alevt-date and alevt-cap should
+ not be installed in the X11 tree.)
+
+Thu Jun 10 22:13:40 MEST 1999
+
+ - moved the hamming decoding and associated table to hamm.c
+ - played with pkt26 to support polish stations. not finished.
+
+Tue Jun 8 21:00:42 MEST 1999
+
+ - Added -[no]bell option. And the 'b' key.
+ - Replaced all xio_bell calls with appropriate status messages.
+
+Sat Jun 5 00:42:19 MEST 1999 (1.4.8)
+
+ - Shit. Just after the release I found a bug. The header line
+ isn't updated as it should :-( (Just affects parallel mode
+ transmission, so no new version, yet.)
+ - Created mailing list. Either go to http://alevt.listbot.com/
+ or write mail to alevt-subscribe@listbot.com.
+ - Added bttv-patch to the contrib dir for those who don't want
+ to wait for bttv-0.6.5.
+
+Fri Jun 4 17:19:41 MEST 1999 (1.4.7)
+
+ - Added autodetection of VBIBUF_SIZE (only with newer bttv, 0.6.5).
+ - Forgot to close vbi_fd in vbi_close :-/
+ - Made ERC on by default. If the page has no errors it
+ costs nothing and if it has you'll turn it on anyway.
+ - Changed parameters of EV_HEADER.
+ - Removed XAWTV_HACKS.
+ - Updated some docu.
+ - Modified the contrib samples to reflect previous API changes.
+
+Fri May 28 20:16:44 MEST 1999
+
+ - Added status messages.
+ - Added EV_TIMER event.
+ - Added channel change detection (only with newer bttv, 0.6.5).
+ Sends EV_RESET event. The XAWTV_HACKS can be removed *phww*.
+ Now the cache is automatically cleared if you switch to a
+ new channel. It even works with a SAT receiver connected to
+ Video-In.
+
+Thu May 27 23:54:32 MEST 1999 (1.4.6 unofficial)
+
+ - Cache reset didn't reset npages and hi_subno.
+ - Added XAWTV_HACKS, that is: alevt scans for a window with
+ the _XAWTV_STATION property and registers for property changes.
+ Result: when switching channels in xawtv, the cache is cleared.
+ (This is just an ugly hack. Xawtv must already be running
+ when alevt is started. If you quit and restart xawtv, it no
+ longer works. There's no method to detect if the monitored
+ xawtv is really the one controlling our /dev/vbi, etc...)
+ Added on request of Paul Ortyl <ortylp@key.net.pl>.
+ - Added error reduction circuit. It's part of the cache.
+ Errors in a new page are replaced by characters/lines from
+ an already cached (older) page. May be toggled by pressing
+ 'e' (editor is now on 'E'). It's not enabled by default
+ because it takes some CPU time. Idea by Paul Ortyl.
+ - TODO: clean up. document new features. add status messages.
+
+Sun May 23 19:13:07 MEST 1999 (1.4.5)
+
+ - New spec file from Karsten Hopp <karsten.hopp@delix.de>
+ - Changed it even further *g*
+ - Fixed a bug with graphics selection of double height lines.
+ - Documented the -oldbttv option in the man page. Now it's in
+ every page. This should finally halve the mails I get.
+ (For the other halve I have to write alevt-capture *g*)
+
+Sat May 8 02:41:21 MEST 1999
+
+ - Ehhh, changed u32 typedef from unsigned long to unsigned int.
+ Same for s32. The Alpha's longs are 64 bits.
+ Thanks to Sdruddin Rejeb <rejeb@dpmail.epfl.ch>.
+ (There's something strange with this in the X libs. They are
+ sometimes very lazy about ints and longs. Someone with an
+ Alpha should check the cut & paste, both, text and graphics
+ selections.)
+
+Thu Apr 29 22:38:37 MEST 1999
+
+ - Updated contrib/t1.c
+ - Added ':' as a subpage delimiter for clicking (2:7 is the same as 2/7)
+
+Mon Apr 19 19:40:09 MEST 1999
+
+ - Switched the scrolling direction of the wheel
+
+Mon Mar 29 01:23:06 MEST 1999 (1.4.4)
+
+ - fixed DST bug in alevt-date
+ - added crude latin-2 support. 'make FONT=latin-2' should be enough.
+ (found the stuff on the website http://www.penguin.cz/~marvin/ of
+ Daniel Smolik <smolikdan@email.cz>. I don't know if he is the one
+ who made the font).
+
+Wed Mar 17 20:53:59 MET 1999
+
+ - added timeout to alevt-date
+
+Fri Feb 19 18:22:53 MET 1999 (1.4.3>
+
+ - Makefile changes.
+
+Fri Jan 29 18:01:27 MET 1999
+
+ - fixed bug in dllist.h. dl_insert_first(h, dl_remove(n)) was only
+ working due to gcc implementation details.
+
+Mon Jan 25 18:33:42 MET 1999 (1.4.2)
+
+ - fixed 'clear cache'. no longer removes the help pages.
+ - made next/prev key/button to skip missing pages.
+ - added support for wheeled mice. (I heard it's really cool *g*)
+ - problem with subpages > 0xff fixed.
+
+Thu Jan 21 17:31:46 MET 1999 (1.4.1)
+
+ - added man pages from Thomas Schoepf <schoepf@usa.net>.
+ - added rpm-spec file from Mario Mikocevic <mozgy@times.hr>.
+ (looks a little bit odd, but I don't know very much about rpms)
+ - minor option fix in alevt-date (people are really using it!?!)
+
+Tue Jan 5 03:50:08 MET 1999 (1.4.0)
+
+ - should be 1.3.10 but that gives problems with the help pages :-(
+ - fixed varargs for alpha
+ - default is now -newbttv (aka -fuckbttv). use -oldbttv for v<0.5.20.
+
+Sat Jan 2 21:40:54 MET 1999
+
+ - small patches to alevt-date (-vbi options and tzset fix)
+ - played with pkt8/30. what a mess. MTV is 25:13 ahead *g*
+
+Wed Dec 30 19:30:14 MET 1998 (1.3.9)
+
+ - slightly modified the pll (may need further tuning)
+
+Wed Dec 30 05:27:26 MET 1998 (1.3.8)
+
+ - added pll (-finetune auto). try -debug for status msgs.
+
+Tue Dec 29 05:15:53 MET 1998 (1.3.7)
+
+ - added finetune option (see README)
+ - you may now type -newbttv instead of -fuckbttv *g*
+
+Mon Dec 28 19:36:32 MET 1998 (1.3.6)
+
+ - Makefile: R5 -> R6 :-(
+ - vbi.c now works without cache.c
+ - added alevt-date (set system time from teletext)
+ - bug in option parsing (error reporting)
+
+Thu Dec 17 19:56:16 MET 1998 (1.3.5)
+
+ - added -L/usr/X11R6/lib in Makefile
+ - put some blurb (in german) in contrib.
+
+Thu Dec 17 05:01:34 MET 1998 (1.3.4)
+
+ - added class hints on (invisible) leader window to make docking
+ in wmaker easier. instant name for leader is "VTLeader" and for
+ the viewing windows "VTPage"
+ - made the icon a little bit smaller
+
+Mon Dec 14 23:05:41 MET 1998 (1.3.3)
+
+ Release 1.3.3
+
+ - added spanish/portuguese charset decoding
+ - added similar looking glyphs for czech
+ - minor changes on the font
+ - middle click on current page number opens new parent window
+ - case dependant search if the pattern begins with a '!'
+ - line editing may be aborted with ^C
+
+Sun Dec 13 17:55:32 MET 1998 (1.3.2)
+
+ - when there were multiple windows of the same page, cycling through
+ the subpages changed all windows. fixed.
+ - hilight the found text (make it the selection).
+ - slightly modified the hilight colors.
+ - default window size set to 41x25 (looks better).
+ - rewrote the editor.
+
+Sun Dec 13 07:03:10 MET 1998 (1.3.1)
+
+ - fixed one command line option
+ - corrected bug in searching
+
+Sat Dec 12 20:27:03 MET 1998 (1.3.0)
+
+ Release 1.3.0
+
+ - searching is now ready (still need a status line for error msgs).
+ - set SIGPIPE to SIG_DFL. some shells (KDE) set it to SIG_IGN and then
+ the timer task won't be killed on exit.
+ - updated the help pages.
+ - I'm frustrated! BTTV_VERSION doesn't work on /dev/vbi. So no
+ autodetection of driver version. Added -fuckbttv option instead.
+
+Fri Dec 11 19:36:03 MET 1998 (1.2.5)
+
+ - reworked national charset (lang) handling. everthing now done in vbi.c.
+ the rest just deals with latin-1.
+ - first version of searching (functional, but dirty. needs more work.)
+
+Thu Dec 10 20:06:27 MET 1998 (1.2.4)
+
+ - new file edline.c (line editor for the menu line. start for searching...)
+ - blinking cursor
+ - added an 48x48 icon from Ulf Rompe
+ - added pasting into the line editor (insert key).
+ - release ownership of XA_PRIMARY when deselecting selection.
+
+Tue Dec 8 21:26:26 MET 1998 (1.2.3)
+
+ - new file ui.c (most user interface stuff from main.c)
+ - rewrote option parsing
+ - allow specification of child windows on command line. now
+ it's possible to regenerate the complete window layout by
+ the commandline (may be of some use for session management).
+ - some spelling fixes in the help pages from Mark Bryars
+
+Mon Dec 7 16:59:28 MET 1998 (1.2.2)
+
+ - reworked hidden handling in xio.c
+
+Sun Dec 6 19:54:10 MET 1998 (1.2.1)
+
+ - class name changed! from Alevt to AleVT.
+ - window/icon title shows current page number
+ - changed the icon to a 64 pixel width one. not nice but ...
+ - added a small mini icon for the title bar. is there a property I can set?
+ - pressing on the CPN puts the page on hold
+ - pressing on the violet * reveals concealed text
+ - added simple menu if no FastText menu is present
+ - allow subpages to be specified on the command line (eg 100/4)
+
+Sat Dec 5 20:59:51 MET 1998 (1.2.0)
+
+ Release 1.2.0
+
+ - finished the help pages.
+ - added command line handling
+ - added user geometry handling in xio.c
+
+Sat Dec 5 02:28:16 MET 1998 (1.1.2)
+
+ - allow magazin 9 (help system)
+ - start box char after a pagenumber selects subpage 1 (hack)
+ - added a crude page editor (just to create the help pages. not for users.)
+ - started with the online help system (sounds great, hehe)
+
+Tue Dec 1 20:19:53 MET 1998 (1.1.1)
+
+ - added concept of parent and child windows. now, the middle mouse
+ button changes the contens of the child window. if there isn't
+ one, it is created.
+ - Middle mouse button on x/y (subpage cycling) selects the previous
+ subpage. (updating the child with subpages is hairy...)
+
+Sun Nov 29 23:34:18 MET 1998 (1.1.0)
+
+ Release 1.1.0
+
+ - removed most of the recovery for single bad lines (does too much harm)
+ - changed handling of parallel mode transmission (untested. unused in .de)
+ - added selection (text & graphic!). try pasting into xpaint :-)
+ - added cache-clear function ('c')
+ - click on x/y selects the next subpage
+ - some minor tweaks
+ - added an icon bitmap.
+
+Wed Nov 24 23:33:34 MET 1998 (1.0.0)
+
+ First Release 1.0.0
diff --git a/util/alevt/EXPORT.HOWTO b/util/alevt/EXPORT.HOWTO
new file mode 100644
index 0000000..b9fba67
--- /dev/null
+++ b/util/alevt/EXPORT.HOWTO
@@ -0,0 +1,84 @@
+HOW TO IMPLEMENT A NEW EXPORT MODULE:
+
+As an example look at exp-txt.c (it implements two modules which
+are pretty similar).
+
+You have to create one exported structure (struct export_module).
+This structure holds the following data:
+
+1. The name of the format (example: "ascii").
+
+2. The default extension to use for building filenames ("txt").
+
+3. A list of module options. It's a 0 terminated array of char
+pointers, one for each option (similar to argv of main).
+If an option string contains a '=', it is an option that
+requires an argument. The part after the '=' is ignored at
+the moment. Later, I want to add help messages that show
+these options strings and then the part after the '=' becomes
+useful.
+If you do not have local options, set this field to 0.
+
+4. The number of bytes for local data in the export structure.
+There you may store data collected during option parsing or
+for whatever you want.
+Don't use global variables for storing this data! With
+alevt-cap you may give:
+
+alevt-cap -format ascii,color 100 -format ascii 100
+
+to save the page in two different formats. Using global
+vars would inhibit this. The data area in struct export
+starts at the 'data' field. You have to cast it to the
+appropriate type (see the D macro in exp-txt.c).
+If you do not need local data, set this field to 0.
+
+5. An open function (or call it constructor). It is called
+when your module is needed and it is passed a struct export
+(the instance). This function may be used to initialize
+the local data in the export struct.
+If all goes well return 0. Else call export_error (see
+below) and return -1.
+If you do not need an open function, set this field to 0.
+
+6. A close function (or call it destructor). It is called
+when your module is no longer needed. If you allocated
+memory in the open func, this is the place to free it.
+If you do not need a close function, set it to 0.
+
+7. An option function. It is called for each module option
+the user has given. It is passed an option number (first
+option in the option-array gives 1, ...) and a char pointer
+to the argument for that option (0 if the option does not
+need an arg). The argument pointer keeps valid until the
+close function is called.
+If all goes well, return 0. Else call export_error and
+return -1.
+If you gave an option list at point 3 you have to specify
+this function. Else set it to 0.
+
+8. An output function. It is called to produce the output.
+It is given the file name to use and a fmt_page pointer.
+The fmt_page contains an interpreted image of the page.
+There are no control chars in it. It uses the character
+set defined by the two fonts.
+These function may be called consecutive for multiple
+pages. Don't expect one output for one open/close.
+Return codes as above... (0: ok, -1: error).
+
+The export_error function: If one of your functions wants to
+report an error, it has to use the export_error function.
+It's a printf like function to set error messages. In alevt-cap
+these messages are printed to stderr, in alevt they will be
+shown in the status line (so don't make them too long).
+
+The last step is to add your export_module structure to the
+list of modules in export.c (at the top).
+Please, make sure that this structure is the only exported
+symbol. All other things should be static.
+
+That's all. A structure describing your module and 4 functions
+(open, close, option, output) to implement it. Shouldn't be too
+complicated.
+
+Ciao, ET.
diff --git a/util/alevt/Makefile b/util/alevt/Makefile
new file mode 100644
index 0000000..2f7c8da
--- /dev/null
+++ b/util/alevt/Makefile
@@ -0,0 +1,130 @@
+VER=1.7.0
+OPT=-O -g -w
+DEFS=-DWITH_PNG
+DEFS+=-DUSE_LIBZVBI
+FONT=vtxt
+MAN_DIR=man
+DESTDIR=
+PREFIX=/usr
+HOSTCC=$(CC)
+CFLAGS=$(OPT) -DVERSION=\"$(VER)\" $(DEFS) -I$(USR_X11R6)/include
+EXPOBJS=export.o exp-txt.o exp-html.o exp-gfx.o font.o
+OBJS=main.o ui.o xio.o fdset.o vbi.o cache.o help.o search.o misc.o hamm.o lang.o $(EXPOBJS)
+TOBJS=alevt-date.o vbi.o fdset.o misc.o hamm.o lang.o
+COBJS=alevt-cap.o vbi.o fdset.o misc.o hamm.o lang.o $(EXPOBJS)
+
+ifneq ($(findstring WITH_PNG,$(DEFS)),)
+EXPLIBS=-lpng -lz -lm
+endif
+
+ifneq ($(findstring USE_LIBZVBI,$(DEFS)),)
+ZVBILIB=-lzvbi -lpthread
+EXPLIBS+=$(ZVBILIB)
+endif
+
+all: alevt alevt-date alevt-cap alevt.1 alevt-date.1 alevt-cap.1
+
+alevt: $(OBJS)
+ $(CC) $(OPT) $(OBJS) -o alevt -L$(PREFIX)/lib -L$(PREFIX)/lib64 -lX11 $(EXPLIBS)
+
+alevt-date: $(TOBJS)
+ $(CC) $(OPT) $(TOBJS) -o alevt-date $(ZVBILIB)
+
+alevt-cap: $(COBJS)
+ $(CC) $(OPT) $(COBJS) -o alevt-cap $(EXPLIBS)
+
+font.o: font1.xbm font2.xbm font3.xbm font4.xbm
+fontsize.h: font1.xbm font2.xbm font3.xbm font4.xbm
+ fgrep -h "#define" font1.xbm font2.xbm font3.xbm font4.xbm >fontsize.h
+
+font1.xbm: bdf2xbm $(FONT)-latin-1.bdf
+ ./bdf2xbm font1 <$(FONT)-latin-1.bdf >font1.xbm
+
+font2.xbm: bdf2xbm $(FONT)-latin-2.bdf
+ ./bdf2xbm font2 <$(FONT)-latin-2.bdf >font2.xbm
+
+font3.xbm: bdf2xbm vtxt-koi8.bdf
+ ./bdf2xbm font3 <vtxt-koi8.bdf >font3.xbm
+
+font4.xbm: bdf2xbm vtxt-iso8859-7.bdf
+ ./bdf2xbm font4 <vtxt-iso8859-7.bdf >font4.xbm
+
+bdf2xbm: bdf2xbm.c
+ $(HOSTCC) bdf2xbm.c -o bdf2xbm
+
+clean:
+ rm -f *.o page*.txt a.out core bdf2xbm font?.xbm fontsize.h
+ rm -f alevt alevt-date alevt-cap
+
+rpm-install: all
+ install -m 0755 alevt ${RPM_BUILD_ROOT}$(USR_X11R6)/bin
+ install -m 0755 alevt-date ${RPM_BUILD_ROOT}$(USR_X11R6)/bin
+ install -m 0755 alevt-cap ${RPM_BUILD_ROOT}$(USR_X11R6)/bin
+ install -m 0644 alevt.1 ${RPM_BUILD_ROOT}$(USR_X11R6)/$(MAN)/man1
+ install -m 0644 alevt-date.1 ${RPM_BUILD_ROOT}$(USR_X11R6)/$(MAN)/man1
+ install -m 0644 alevt-cap.1 ${RPM_BUILD_ROOT}$(USR_X11R6)/$(MAN)/man1
+ install -d 0755 $(RPM_BUILD_ROOT)$(USR_X11R6)/include/X11/pixmaps
+ install -m 0644 alevt.png $(RPM_BUILD_ROOT)$(USR_X11R6)/include/X11/pixmaps
+
+install: all
+ install -m 0755 alevt $(DESTDIR)$(PREFIX)/bin
+ install -m 0755 alevt-date $(DESTDIR)$(PREFIX)/bin
+ install -m 0755 alevt-cap $(DESTDIR)$(PREFIX)/bin
+ install -m 0644 alevt.1 $(DESTDIR)$(PREFIX)/share/man/man1
+ install -m 0644 alevt-date.1 $(DESTDIR)$(PREFIX)/share/man/man1
+ install -m 0644 alevt-cap.1 $(DESTDIR)$(PREFIX)/share/man/man1
+ install -m 0644 alevt.png $(DESTDIR)$(PREFIX)/share/pixmaps
+ install -m 0644 alevt.desktop $(DESTDIR)$(PREFIX)/share/applications
+
+uninstall: clean
+ rm -f /usr/bin/alevt /usr/bin/alevt-cap /usr/bin/alevt-date \
+ /usr/share/pixmaps/alevt.png /usr/share/applications/alevt.desktop \
+ /usr/share/man/man1/alevt.1 /usr/share/man/man1/alevt-cap.1 \
+ /usr/share/man/man1/alevt-date.1
+
+depend:
+ makedepend -Y -- $(CFLAGS_none) -- *.c 2>/dev/null
+
+tar-html: alevt.1 alevt-date.1 alevt-cap.1
+ for i in alevt.1 alevt-date.1 alevt-cap.1 ; do \
+ j=`basename $$i .1` ; \
+ j=`basename $$j .1x` ; \
+ nroff -man $$i | { \
+ echo "<HTML><HEAD><TITLE>AleVT</TITLE></HEAD><BODY>" ; \
+ man2html -bare -uelem U -nodepage ; \
+ echo "</B0DY></HTML>" ; \
+ } | sed -e "s,</B> <B>, ,g" -e "s,</U> <U>, ,g" >~/exit/alevt/$$j.html ;\
+ done
+
+tar: tar-html clean
+ sed s/VERSION/$(VER)/g <alevt.lsm.in >~/exit/alevt/alevt-$(VER).lsm
+ sed s/VERSION/$(VER)/g <alevt.spec.in >alevt.spec
+ cd .. ;\
+ ln -s alevt alevt-$(VER) ;\
+ tar vcfz ~/exit/alevt/alevt-$(VER).tar.gz alevt-$(VER)/* ;\
+ rm alevt-$(VER)
+ cat <CHANGELOG >~/exit/alevt/changes
+
+# DO NOT DELETE
+
+alevt-cap.o: vt.h misc.h fdset.h dllist.h vbi.h cache.h lang.h export.h
+alevt-date.o: os.h vt.h misc.h fdset.h dllist.h vbi.h cache.h lang.h
+cache.o: misc.h dllist.h cache.h vt.h help.h
+exp-gfx.o: lang.h misc.h vt.h export.h font.h fontsize.h
+exp-html.o: lang.h misc.h vt.h export.h
+exp-txt.o: os.h export.h vt.h misc.h
+export.o: vt.h misc.h export.h
+fdset.o: dllist.h misc.h fdset.h
+font.o: font1.xbm font2.xbm font3.xbm font4.xbm
+hamm.o: vt.h misc.h hamm.h
+help.o: vt.h misc.h vt900.out vt901.out vt902.out vt903.out vt904.out vt905.out
+help.o: vt906.out vt907.out vt908.out vt909.out vt910.out vt911.out vt912.out
+lang.o: misc.h vt.h lang.h
+main.o: vt.h misc.h fdset.h dllist.h xio.h vbi.h cache.h lang.h ui.h
+main.o: search.h
+misc.o: misc.h
+search.o: vt.h misc.h cache.h dllist.h search.h
+ui.o: vt.h misc.h xio.h dllist.h vbi.h cache.h lang.h fdset.h
+ui.o: search.h export.h ui.h
+vbi.o: os.h vt.h misc.h vbi.h dllist.h cache.h lang.h fdset.h hamm.h
+xio.o: vt.h misc.h dllist.h xio.h fdset.h lang.h icon.xbm font.h fontsize.h
diff --git a/util/alevt/README b/util/alevt/README
new file mode 100644
index 0000000..83985f0
--- /dev/null
+++ b/util/alevt/README
@@ -0,0 +1,72 @@
+Hi,
+
+this software is not just a program, it's moreover a legend.
+It is THE protagonist of all videotext applications under Linux.
+
+During the past 10 years the video standards, the APIs, the kernel
+have seen lots of changes.
+But unfortunately this program has NOT seen much maintenance.
+The results of that misfit appearance are:
+
+1. lots of forks flying around in the Internet
+2. lots of patches flying around, some good, some disgusting, some out of time
+3. lots of cruft which is completely outdated or obsolete for other reasons
+
+To handle all that in one big effort I decided to redesign the program
+completely, enlarging its capabilities for DVB-S at the same time.
+
+So here are the changes:
+
+1. Erasure of old help pages and rename / reorganize / update the rest
+-> redesign of the online help system / implying alevt-date and alevt-cap
+
+2. Erasure of old outdated integers, functions, parameters:
+
+- bell, big_buf, debug, display, editor, erc, fine_tune, newbttv,
+- oldbttv
+
+3. Coding style cleanups (no superfluous comments, not more than
+ 80 characters per column, no uncommented code.
+
+4. No strange characters in the outfile, latin alphabet in purity instead.
+
+5. Alevt can be started in 4 modes now if you are running it in DVB mode:
+
+- by service id (sid)
+- by teletext pid (ttpid)
+- by channel name
+- without parameter
+
+6. Starting it in DVB mode on the command line it presents you
+a table with human readable values such as sid, teletext pid,
+PMT (Program Map Table), provider name, service name, language, service type.
+This makes it easier for you to start multiple teletext windows
+in multiple console sessions manually.
+
+If working with a script and the option -o (outfile) you can
+also start multiple teletext windows of all channels in a transponder.
+I develop a GUI using TCL / TK 8.5 and Iwidgets 4.01 to do that and other
+tasks graphically (i. e. by mouse click).
+
+7. If you install the program on the command line by typing "make &
+ make install" there is an uninstaller now to revert the installation:
+ "make uninstall".
+
+ENJOY IT!
+
+Uwe Bugla, February 11th, 2010.
+
+External dependencies
+
+AleVT needs some system libraries to be installed in your system.
+They are zlib, libX11, libpng and libzvbi.
+
+Credits go to:
+- Andreas Rottmann from debian.org for compiler fixes and
+ other kinds of investigation.
+- Francesco Lavra for supplying a kernel patch to avoid kernel demux
+ incompatibilities with kernels >= 2.6.32
+- Andy Walls for helpful investigation in kernelspace
+- Edgar Toernig for providing the source version 1.6.2 and doing all the
+ development for the basic versions
+- Tom Zoerner for the implementation of libzvbi
diff --git a/util/alevt/README.OLD b/util/alevt/README.OLD
new file mode 100644
index 0000000..4fb0e41
--- /dev/null
+++ b/util/alevt/README.OLD
@@ -0,0 +1,78 @@
+Hi, Menden, 21 Sep 2000
+
+ This program decodes and displays Videotext/Teletext from a
+ /dev/vbi device.
+
+
+COMPILE & INSTALL:
+
+ There's nothing to configure. A simple 'make' is all.
+ If you do not want png support remove the WITH_PNG in
+ the Makefile. Additionally, if you want a smaller font
+ uncomment the "FONT=neep9" line.
+
+ It gives you 'alevt', 'alevt-date', and 'alevt-cap' and
+ their man pages 'alevt.1x', 'alevt-date.1', and 'alevt-cap.1'.
+
+ You can install them where ever you want (i.e. /usr/local/bin).
+ The programs are self-contained and require no other files.
+
+ NOTE: Be careful with 'make install'. It's just for me :-)
+
+
+PROBLEMS:
+
+ If you have a lot of decoding errors (lot of these lightning symbols)
+ you may try pressing the 'f' and 'F' key. This allows fine tuning of
+ the decoder circuit. There's also a -finetune command line option.
+ This should only be necessary on really bad signals.
+
+ Maybe, I add autotuning later...
+
+ UPDATE: added autotuning. It's the default. If you add -debug the
+ the actions of the pll are printed to stdout.
+
+ To get the old (pre finetune) behaviour start it with -finetune 0.
+
+ UPDATE: disabled autotuning *g* sometimes it's too jumpy...
+
+
+ALEVT-DATE:
+ I added a little tool to set the system time from the videotext
+ time. The date is not interpreted (not even transmitted on some
+ channels). So it allows only adjustment of +/-12 hours.
+ The default allowed adjustment is limited to +/-2 hours (use
+ -delta to change). Without the -set option it just display
+ the date in the format of the date command. Look at strftime(3)
+ for possible control sequences you may use in the -format option.
+
+
+HACKING:
+
+ If you want to play with the font size, you may resize it with
+ xv (xv font1.xbm). Just make sure, that its width is a multiple of
+ 32 and its height a multiple of 8. A simple make will create
+ a version of AleTV with the new font. Warning: a make clean
+ will erase font1.xbm. The next make will recreate font.xbm from
+ vtxt.bdf.
+
+ AleVT has a built in page editor. If you start it with -editor
+ you may press 'E' to invoke it. For the usage you have to consult
+ the sources. (It's very crude!)
+
+
+TODO: (no specific order)
+
+ - Error correction in alevt-cap
+ - Better language support. Internal 16-bit charset.
+ - Separated graphics.
+ - Rewrite the whole stuff. A networked teletext daemon and clients
+ that connect to it for display, capture, cgi, ...
+
+
+NEWER VERSIONS:
+
+ The primary site of AleVT is http://goron.de/~froese
+
+Have fun,
+Edgar Toernig (froese@gmx.de)
diff --git a/util/alevt/ReadmeGR b/util/alevt/ReadmeGR
new file mode 100644
index 0000000..68d32c2
--- /dev/null
+++ b/util/alevt/ReadmeGR
@@ -0,0 +1,28 @@
+29-9-2003
+
+ ALEVT
+ patch alevt-1.6.3.rus.diff
+contrib sources alevt-1.6.3
+
+
+
+alevt -charset iso8859-7
+
+
+
+alevt -charset el
+
+ :
+ font file vtxt-iso8859-7.bdf
+ bold
+ graphics (0x01 -0x1f)
+
+
+
+ sl45sms@yahoo.gr
+
+
+
+ http://go.to/sl45sms/alevt/index.html
+
+
diff --git a/util/alevt/TODO b/util/alevt/TODO
new file mode 100644
index 0000000..4b56676
--- /dev/null
+++ b/util/alevt/TODO
@@ -0,0 +1,12 @@
+Hi, these are issues that I unfortunately cannot resolve myself:
+
+1. graphical menu written in GKT2, to be used in general connection with
+ the outfile (-o) option.
+
+2. for usage without script and outfile option:
+ DVB monitoring demon helping the program to rewrite the PAT when the
+ external player software has chosen a channel which is part of a
+ new transponder.
+ At the moment alevt hangs when the transponder is changed.
+
+Uwe Bugla, February 11th, 2010.
diff --git a/util/alevt/alevt-cap.1 b/util/alevt/alevt-cap.1
new file mode 100644
index 0000000..2af1879
--- /dev/null
+++ b/util/alevt/alevt-cap.1
@@ -0,0 +1,53 @@
+.TH alevt-cap 1 "February 07, 2010"
+.SH NAME
+alevt-cap \- capture teletext windows.
+.SH SYNOPSIS
+.B alevt-cap
+.RI [ options ]
+.br
+.SH DESCRIPTION
+This manual page documents briefly the
+.B alevt-cap
+commands.
+.PP
+\fBalevt-cap\fP is a program to capture teletext pages.
+.SH OPTIONS
+.TP
+.B \-cs -charset <latin-1/2/koi8-r/iso-8859-7>
+character set
+.TP
+.B \-f -format <fmt[,options]>
+format to save
+.TP
+.B \-f help -format help
+lists available storage formats
+.TP
+.B \-h -help
+print this page
+.TP
+.B \-n -name <filename>
+page name to save
+.B \-t -timeout <secs>
+timeout
+.TP
+.B \-s -sid <sid>
+service pid
+.TP
+.B \-t -ttpid <ttpid>
+teletext pid
+.TP
+.B \-v -vbi <vbidev>
+vbi device
+.TP
+Sequence: /dev/vbi; /dev/vbi0; /dev/video0; /dev/dvb/adapter0/demux0
+.TP
+ppp.ss stands for a page number and an optional
+subpage number (example: 123.4).
+.TP
+.SH SEE ALSO
+.BR alevt-date (1) , alevt (1).
+.br
+.SH AUTHOR
+alevt-cap was written by Edgar Toernig <froese@gmx.de>.
+.PP
+This manual page was written by Uwe Bugla <uwe.bugla@gmx.de>.
diff --git a/util/alevt/alevt-cap.c b/util/alevt/alevt-cap.c
new file mode 100644
index 0000000..9e0c3bd
--- /dev/null
+++ b/util/alevt/alevt-cap.c
@@ -0,0 +1,280 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <locale.h>
+#include <signal.h>
+#include <unistd.h>
+#include "vt.h"
+#include "misc.h"
+#include "fdset.h"
+#include "vbi.h"
+#include "lang.h"
+#include "dllist.h"
+#include "export.h"
+
+static volatile int timed_out = 0;
+static char *channel;
+char *outfile = "";
+u_int16_t sid;
+
+
+struct req
+{
+ struct dl_node node[1];
+ char *name; // file name
+ char *pgno_str; // the pgno as given on the cmdline
+ int pgno, subno; // decoded pgno
+ struct export *export; // export data
+ struct vt_page vtp[1]; // the capture page data
+};
+
+
+static void usage(FILE *fp, int exitval)
+{
+ fprintf(fp, "\nUsage: %s [options] ppp.ss...\n", prgname);
+ fprintf(fp,
+ "\n"
+ " Valid options:\t\tDefault:\n"
+ " -cs -charset\t\tlatin-1\n"
+ " <latin-1/2/koi8-r/iso8859-7>\n"
+ " -f -format <fmt,options>\tascii\n"
+ " -f help -format help\n"
+ " -h -help\n"
+ " -n -name <filename>\t\tttext-%%s.%%e\n"
+ " -s -sid <sid>\t\t(none;dvb only)\n"
+ " -to -timeout <secs>\t\t(none)\n"
+ " -t -ttpid <ttpid>\t\t(none;dvb only)\n"
+ " -v -vbi <vbidev>\t\t/dev/vbi\n"
+ " \t\t/dev/vbi0\n"
+ " \t\t/dev/video0\n"
+ " \t\t/dev/dvb/adapter0/demux0\n"
+ "\n"
+ " ppp.ss stands for a page number and an\n"
+ " optional subpage number (ie 123.4).\n"
+ );
+ exit(exitval);
+}
+
+
+static void exp_help(FILE *fp)
+{
+ struct export_module **ep;
+ char **cp, c;
+
+ fprintf(fp,
+ "\nSyntax: -format Name[,Options]\n"
+ "\n"
+ " Name\tExt.\tOptions\n"
+ " --------------------------------\n"
+ );
+ for (ep = modules; *ep; ep++)
+ {
+ fprintf(fp, " %-7s\t.%-4s", (*ep)->fmt_name, (*ep)->extension);
+ for (c = '\t', cp = (*ep)->options; cp && *cp; cp++, c = ',')
+ fprintf(fp, "%c%s", c, *cp);
+ fprintf(fp, "\n");
+ }
+ fprintf(fp,
+ "\n"
+ "Common options: reveal,hide\n"
+ "Example: -format ansi,reveal,bg=none\n"
+ "\n"
+ );
+ exit(0);
+}
+
+
+static int arg_pgno(char *p, int *subno)
+{
+ char *end;
+ int pgno;
+
+ *subno = ANY_SUB;
+ if (*p)
+ {
+ pgno = strtol(p, &end, 16);
+ if ((*end == ':' || *end == '/' || *end == '.') && end[1])
+ *subno = strtol(end + 1, &end, 16);
+ if (*end == 0)
+ if (pgno >= 0x100 && pgno <= 0x899)
+ if (*subno == ANY_SUB || (*subno >= 0x00 && *subno <= 0x3f7f))
+ return pgno;
+ }
+ fatal("%s: invalid page number", p);
+}
+
+
+static int option(int argc, char **argv, int *ind, char **arg)
+{
+ static struct { char *nam, *altnam; int arg; } opts[] = {
+ { "-charset", "-cs", 1 },
+ { "-format", "-f", 1 },
+ { "-help", "-h", 0 },
+ { "-name", "-n", 1 },
+ { "-sid", "-s", 1 },
+ { "-timeout", "-to", 1 },
+ { "-ttpid", "-t", 1 },
+ { "-vbi", "-v", 1 },
+ };
+ int i;
+
+ if (*ind >= argc)
+ return 0;
+
+ *arg = argv[(*ind)++];
+ for (i = 0; i < NELEM(opts); ++i)
+ if (streq(*arg, opts[i].nam) || streq(*arg, opts[i].altnam))
+ {
+ if (opts[i].arg)
+ if (*ind < argc)
+ *arg = argv[(*ind)++];
+ else
+ fatal("option %s requires an argument", *arg);
+ return i+1;
+ }
+
+ if (**arg == '-')
+ {
+ fatal("%s: invalid option", *arg);
+ usage(stderr, 2);
+ }
+
+ return -1;
+}
+
+
+static void event(struct dl_head *reqs, struct vt_event *ev)
+{
+ struct req *req, *nxt;
+
+ switch (ev->type)
+ {
+ case EV_PAGE: // new page
+ {
+ struct vt_page *vtp = ev->p1;
+
+ for (req = PTR reqs->first; nxt = PTR req->node->next; req = nxt)
+ if (req->pgno == vtp->pgno)
+ if (req->subno == ANY_SUB || req->subno == vtp->subno)
+ {
+ *req->vtp = *vtp;
+ dl_insert_last(reqs + 1, dl_remove(req->node));
+ }
+ }
+ }
+}
+
+
+int main(int argc, char **argv)
+{
+ char *vbi_name = NULL;
+ int timeout = 0;
+ char *fname = "ttext-%s.%e";
+ char *out_fmt = "ascii";
+ struct export *fmt = 0;
+ int opt, ind;
+ char *arg;
+ struct vbi *vbi;
+ struct req *req;
+ struct dl_head reqs[2]; // simple linear lists of requests & captures
+ int ttpid = -1;
+
+ setlocale (LC_CTYPE, "");
+ setprgname(argv[0]);
+
+ fdset_init(fds);
+ dl_init(reqs); // the requests
+ dl_init(reqs+1); // the captured pages
+
+ ind = 1;
+ while (opt = option(argc, argv, &ind, &arg))
+ switch (opt)
+ {
+ case 1: // charset
+ if (streq(arg, "latin-1") || streq(arg, "1"))
+ latin1 = 1;
+ else if (streq(arg, "latin-2") || streq(arg, "2"))
+ latin1 = 0;
+ else if (streq(arg, "koi8-r") || streq(arg, "koi"))
+ latin1 = KOI8;
+ else if (streq(arg, "iso8859-7") || streq(arg, "el"))
+ latin1 = GREEK;
+ else
+ fatal("bad charset (not latin-1/2/koi8-r/iso8859-7)");
+ break;
+ case 2: // format
+ if (streq(arg, "help") || streq(arg, "?") || streq(arg, "list"))
+ exp_help(stdout);
+ out_fmt = arg;
+ fmt = 0;
+ break;
+ case 3: // help
+ usage(stdout, 0);
+ break;
+ case 4: // name
+ fname = arg;
+ break;
+ case 5: // timeout
+ timeout = strtol(arg, 0, 10);
+ if (timeout < 1 || timeout > 999999)
+ fatal("bad timeout value", timeout);
+ break;
+ case 6: // service id
+ sid = strtoul(arg, NULL, 0);
+ break;
+ case 7: // teletext pid
+ ttpid = strtoul(arg, NULL, 0);
+ break;
+ case 8: // vbi
+ vbi_name = arg;
+ break;
+ case -1: // non-option arg
+ if (not fmt)
+ fmt = export_open(out_fmt);
+ if (not fmt)
+ fatal("%s", export_errstr());
+ if (not(req = malloc(sizeof(*req))))
+ out_of_mem(sizeof(*req));
+ req->name = fname;
+ req->pgno_str = arg;
+ req->pgno = arg_pgno(arg, &req->subno);
+ req->export = fmt;
+ dl_insert_last(reqs, req->node);
+ break;
+ }
+
+ if (dl_empty(reqs))
+ fatal("no pages requested");
+
+ // setup device
+ if (not(vbi = vbi_open(vbi_name, 0, channel, outfile, sid, ttpid)))
+ fatal("cannot open %s", vbi_name);
+ vbi_add_handler(vbi, event, reqs); // register event handler
+
+ if (timeout)
+ alarm(timeout);
+
+ // capture pages (moves requests from reqs[0] to reqs[1])
+ while (not dl_empty(reqs) && not timed_out)
+ if (fdset_select(fds, 30000) == 0) // 30sec select time out
+ {
+ error("no signal.");
+ break;
+ }
+
+ alarm(0);
+ vbi_del_handler(vbi, event, reqs);
+ vbi_close(vbi);
+ if (not dl_empty(reqs))
+ error("capture aborted. Some pages are missing.");
+
+ for (req = PTR reqs[1].first; req->node->next; req = PTR req->node->next)
+ {
+ fname = export_mkname(req->export, req->name, req->vtp, req->pgno_str);
+ if (not fname || export(req->export, req->vtp, fname))
+ error("error saving page %s: %s", req->pgno_str, export_errstr());
+ if (fname)
+ free(fname);
+ }
+ exit(dl_empty(reqs) ? 0 : 1);
+}
diff --git a/util/alevt/alevt-date.1 b/util/alevt/alevt-date.1
new file mode 100644
index 0000000..69d2f6f
--- /dev/null
+++ b/util/alevt/alevt-date.1
@@ -0,0 +1,41 @@
+.TH alevt-date 1 "February 07, 2010"
+.SH NAME
+alevt-date \- print out UTC date.
+.SH SYNOPSIS
+.B alevt-date
+.RI [ options ]
+.br
+.SH DESCRIPTION
+This manual page documents briefly the
+.B alevt-date
+commands.
+.PP
+\fBalevt-date\fP is a program to print the UTC date.
+.SH OPTIONS
+.TP
+.B \-d -delta <max_secs>
+maximum delta
+.TP
+.B \-f -format <fmtstr>
+time format
+.TP
+.B \-h -help
+print this page
+.TP
+.B \-s -set
+set the system clock
+.TP
+.B \-t -timeout <seconds>
+timeout
+.TP
+.B \-v -vbi <vbidev>
+vbi device /dev/vbi; /dev/vbi0; /dev/video0; /dev/dvb/adapter0/demux0
+.TP
+.br
+.SH SEE ALSO
+.BR alevt-cap (1) , alevt (1).
+.br
+.SH AUTHOR
+alevt-date was written by Edgar Toernig <froese@gmx.de>.
+.PP
+This manual page was written by Uwe Bugla <uwe.bugla@gmx.de>.
diff --git a/util/alevt/alevt-date.c b/util/alevt/alevt-date.c
new file mode 100644
index 0000000..5496937
--- /dev/null
+++ b/util/alevt/alevt-date.c
@@ -0,0 +1,225 @@
+#include <stdio.h>
+#include <string.h>
+#include <sys/time.h>
+#include <time.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <signal.h>
+#include "os.h"
+#include "vt.h"
+#include "fdset.h"
+#include "vbi.h"
+#include "lang.h"
+#include "misc.h"
+
+char *fmt = "%a %b %d %H:%M:%S %Z %Y";
+int max_diff = 2*60*60; // default: 2 hours
+int set_time = 0;
+char *outfile = "";
+static char *channel;
+u_int16_t sid;
+
+
+static void chk_time(int t)
+{
+ struct tm *tm;
+ time_t sys_t;
+ int dt;
+ char buf[256];
+
+ if (t < 0 || t > 235959 || t%100 > 59 || t/100%100 > 59)
+ return;
+
+ sys_t = time(0);
+ tm = localtime(&sys_t);
+
+ // Now convert to UTC seconds
+ t = t/100/100 * 60*60 + t/100%100 * 60 + t%100;
+#ifdef BSD
+ t -= tm->tm_gmtoff; // dst already included...
+#else
+ t += timezone;
+ if (tm->tm_isdst)
+ t -= 60*60;
+#endif
+
+ dt = t - sys_t % (24*60*60);
+ if (dt <= -12*60*60)
+ dt += 24*60*60;
+
+ if (dt <= -max_diff || dt >= max_diff)
+ fatal("time diff too big (%2d:%02d:%02d)", dt/60/60, abs(dt)/60%60, abs(dt)%60);
+
+ sys_t += dt;
+
+ if (set_time)
+ {
+ struct timeval tv[1];
+
+ tv->tv_sec = sys_t;
+ tv->tv_usec = 500000;
+ if (settimeofday(tv, 0) == -1)
+ ioerror("settimeofday");
+ }
+ if (*fmt)
+ {
+ tm = localtime(&sys_t);
+ if (strftime(buf, sizeof(buf), fmt, tm))
+ puts(buf);
+ }
+ exit(0);
+}
+
+
+static void event(void *_, struct vt_event *ev)
+{
+ switch (ev->type)
+ {
+ /* vbi may generate EV_PAGE, EV_HEADER, EV_XPACKET */
+ /* for event arguments see vt.h */
+
+ case EV_HEADER: // a new title line (for running headers)
+ {
+ static int last_t = -1;
+ u8 *s = ev->p1;
+ int i, t = 1;
+
+ if (ev->i2 & PG_OUTOFSEQ)
+ break;
+
+ for (i = 32; i < 40; ++i)
+ if (s[i] >= '0' && s[i] <= '9')
+ t = t * 10+ s[i] - '0';
+ if (t >= 1000000 && t <= 1235959)
+ if (t == last_t || t - last_t == 1)
+ chk_time(t - 1000000);
+ last_t = t;
+ break;
+ }
+ }
+}
+
+
+static void usage(FILE *fp, int exit_val)
+{
+ fprintf(fp, "usage: %s [options]\n", prgname);
+ fprintf(fp,
+ "\n"
+ " Valid options:\t\tDefault:\n"
+ " -d -delta <max_secs>\t7200 (2 hours)\n"
+ " -f -format <fmtstr>\t\t%%c\n"
+ " -h -help\n"
+ " -s -set\t\t\toff\n"
+ " -to -timeout <seconds>\t(none)\n"
+ " -v -vbi <vbidev>\t\t/dev/vbi\n"
+ " \t\t/dev/vbi0\n"
+ " \t\t/dev/video0\n"
+ " \t\t/dev/dvb/adapter0/demux0\n"
+ );
+ exit(exit_val);
+}
+
+
+static int option(int argc, char **argv, int *ind, char **arg)
+{
+ static struct { char *nam, *altnam; int arg; } opts[] = {
+ { "-delta", "-d", 1 },
+ { "-format", "-f", 1 },
+ { "-help", "-h", 0 },
+ { "-set", "-s", 0 },
+ { "-timeout", "-to", 1 },
+ { "-vbi", "-v", 1 },
+ };
+ int i;
+
+ if (*ind >= argc)
+ return 0;
+
+ *arg = argv[(*ind)++];
+ for (i = 0; i < NELEM(opts); ++i)
+ if (streq(*arg, opts[i].nam) || streq(*arg, opts[i].altnam))
+ {
+ if (opts[i].arg)
+ if (*ind < argc)
+ *arg = argv[(*ind)++];
+ else
+ fatal("option %s requires an argument", *arg);
+ return i+1;
+ }
+
+ if (**arg == '-')
+ {
+ fatal("%s: invalid option", *arg);
+ usage(stderr, 1);
+ }
+
+ return -1;
+}
+
+
+int main(int argc, char **argv)
+{
+ char *vbi_name = NULL;
+ int timeout = 0;
+ struct vbi *vbi;
+ int opt, ind;
+ char *arg;
+ int ttpid = -1;
+
+ setprgname(argv[0]);
+ ind = 1;
+ while (opt = option(argc, argv, &ind, &arg))
+ switch (opt)
+ {
+ case 1: // -delta
+ max_diff = atoi(arg);
+ if (max_diff < 1)
+ fatal("-delta: illegal value '%s'", arg);
+ if (max_diff > 12*60*60)
+ {
+ max_diff = 12*60*60;
+ error("-delta: %d too big. Assuming %d", arg, max_diff);
+ }
+ break;
+ case 2: // -format
+ fmt = arg;
+ break;
+ case 3: // help
+ usage(stdout, 0);
+ break;
+ case 4: // -set
+ set_time = 1;
+ break;
+ case 5: // -timeout
+ timeout = atoi(arg);
+ if (timeout < 1 || timeout > 60*60)
+ fatal("-timeout: illegal value '%s'", arg);
+ break;
+ case 6: // -vbi
+ vbi_name = arg;
+ break;
+ case -1:
+ usage(stderr, 1);
+ break;
+ }
+
+ fdset_init(fds);
+
+ if (timeout)
+ {
+ signal(SIGALRM, SIG_DFL); // kill me
+ alarm(timeout);
+ }
+ vbi = vbi_open(vbi_name, 0, channel, outfile, sid, ttpid); // open device
+ if (not vbi)
+ fatal_ioerror(vbi_name);
+ vbi_add_handler(vbi, event, 0); // register event handler
+
+ for (;;)
+ fdset_select(fds, -1); // call scheduler
+
+ /* never reached */
+ vbi_del_handler(vbi, event, 0);
+ vbi_close(vbi);
+ exit(0);
+}
diff --git a/util/alevt/alevt.1 b/util/alevt/alevt.1
new file mode 100644
index 0000000..68bff45
--- /dev/null
+++ b/util/alevt/alevt.1
@@ -0,0 +1,60 @@
+.TH alevt 1 "February 07, 2010"
+.SH NAME
+alevt \- a teletext browser for analogue and DVB channels.
+.SH SYNOPSIS
+.B alevt
+.RI [ options ]
+.br
+.SH DESCRIPTION
+This manual page documents briefly the
+.B alevt
+commands.
+.PP
+\fBalevt\fP is a program to read teletext from analogue or DVB channels.
+.SH OPTIONS
+.TP
+.B \-c <channel>
+channel name (dvb only)
+.TP
+.B \-ch -child <ppp.ss>
+child window
+.TP
+.B \-cs -charset <latin-1/2/koi8-r/iso8859-7>
+character set
+.TP
+.B \-h -help
+print this page
+.TP
+.B \-o <outfile>
+path + file for all services (dvb only)
+.TP
+.B \-p -parent <ppp.ss>
+parent window
+.TP
+.B \-s -sid <sid>
+service id (dvb only)
+.TP
+.B \-t -ttpid <ttpid>
+teletext pid (dvb only)
+.TP
+.B \-v -vbi <vbidev>
+vbi device
+.TP
+Sequence: /dev/vbi; /dev/vbi0; /dev/video0; /dev/dvb/adapter0/demux0
+.TP
+Order is important! Each page number opens a new window
+with the previously given geometry, device, and display.
+.TP
+ppp.ss stands for a page number and an optional
+subpage number (example: 123.4).
+.TP
+The -child option requires a parent window. So it must
+be preceded by a parent or another child window.
+.TP
+.SH SEE ALSO
+.BR alevt-cap (1), alevt-date (1).
+.br
+.SH AUTHOR
+alevt was written by Edgar Toernig <froese@gmx.de>.
+.PP
+This manual page was written by Uwe Bugla <uwe.bugla@gmx.de>.
diff --git a/util/alevt/alevt.desktop b/util/alevt/alevt.desktop
new file mode 100644
index 0000000..c125bb9
--- /dev/null
+++ b/util/alevt/alevt.desktop
@@ -0,0 +1,9 @@
+[Desktop Entry]
+Encoding=UTF-8
+Name=alevt
+Comment=Teletext Browser
+Exec=alevt
+Icon=alevt
+Terminal=false
+Type=Application
+Categories=GNOME;GTK;AudioVideo;Video;
diff --git a/util/alevt/bdf2xbm.c b/util/alevt/bdf2xbm.c
new file mode 100644
index 0000000..74d238e
--- /dev/null
+++ b/util/alevt/bdf2xbm.c
@@ -0,0 +1,212 @@
+/*
+ Simple program to convert a bdf-font to a bitmap.
+ The characters are arranged in a 32x8 matrix.
+ usage: bdf2xbm [identifier] <bdf >xbm
+ Copyright 1998,1999 by E. Toernig (froese@gmx.de)
+*/
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <ctype.h>
+#include <stdarg.h>
+
+#define not !
+#define streq(a,b) (strcmp((a),(b)) == 0)
+
+int lineno;
+char *word[64];
+int nword;
+
+char *font = "font%dx%d";
+int w, h, bpl;
+unsigned char *bmap;
+
+
+static void error(char *fmt, ...)
+{
+ va_list args;
+
+ va_start(args, fmt);
+ fprintf(stderr, "bdf2xbm");
+ if (lineno)
+ fprintf(stderr, ":%d", lineno);
+ fprintf(stderr, ": ");
+ vfprintf(stderr, fmt, args);
+ fputc('\n', stderr);
+ exit(1);
+}
+
+
+static int nextline()
+{
+ static char buf[256];
+ char *p;
+ int i;
+
+ do
+ {
+ nword = 0;
+ if (fgets(buf, sizeof(buf), stdin) == 0)
+ return nword;
+ lineno++;
+
+ p = buf;
+ for (;;)
+ {
+ while (isspace(*p))
+ p++;
+ if (*p == 0)
+ break;
+ word[nword++] = p;
+ while (*p && not isspace(*p))
+ *p = toupper(*p), p++;
+ if (*p == 0)
+ break;
+ *p++ = 0;
+ }
+ } while (nword == 0);
+
+ for (i = nword; i < 64; ++i)
+ word[i] = "";
+ return nword;
+}
+
+
+static inline void setbit(int ch, int x, int y)
+{
+
+ int yo = ch / 32 * h + y;
+ int xo = ch % 32 * w + x;
+
+ bmap[yo * bpl + xo / 8] |= 1 << (xo % 8);
+}
+
+
+static void dobitmap(int ch, int x, int y)
+{
+ int i, j;
+
+ for (i = 0; i < y; ++i)
+ {
+ nextline();
+ if (nword > 1 || strlen(word[0]) != (x + 7) / 8 * 2)
+ error("bad BITMAP");
+ for (j = 0; j < x; ++j)
+ {
+ int c = word[0][j / 4];
+ if (c >= '0' && c <= '9')
+ c -= '0';
+ else if (c >= 'A' && c <= 'F')
+ c -= 'A' - 10;
+ else
+ error("bad hexchar in BITMAP");
+ if (c & (8 >> (j % 4)))
+ setbit(ch, j, i);
+ }
+ }
+}
+
+
+static void dochar()
+{
+ int ch = -1, x = -1, y = -1;
+
+ while (nextline())
+ {
+ if (streq(word[0], "ENDCHAR"))
+ return;
+ else if (streq(word[0], "ENCODING") && nword == 2)
+ {
+ ch = atoi(word[1]);
+ if (ch < 0 || ch > 255)
+ error("bad character code %d", ch);
+ }
+ else if (streq(word[0], "BBX") && nword == 5)
+ {
+ x = atoi(word[1]), y = atoi(word[2]);
+ if (x < 1 || x > 64 || y < 1 || y > 64)
+ error("bad BBX (%dx%d)", x, y);
+ }
+ else if (streq(word[0], "BITMAP"))
+ {
+ if (x < 0)
+ error("missing BBX");
+ if (ch < 0)
+ error("missing ENDCODING");
+ dobitmap(ch, x, y);
+ }
+ }
+ error("unexpected EOF (missing ENDCHAR)");
+}
+
+
+static void dofile()
+{
+ lineno = 0;
+ w = h = 0;
+ bmap = 0;
+
+ nextline();
+ if (nword != 2 || not streq(word[0], "STARTFONT"))
+ error("not a bdf-file");
+
+ while (nextline())
+ {
+ if (streq(word[0], "ENDFONT"))
+ return;
+ else if (streq(word[0], "FONTBOUNDINGBOX") && nword == 5)
+ {
+ if (bmap)
+ error("multiple FONTBOUNDINGBOXes!?!");
+ w = atoi(word[1]), h = atoi(word[2]);
+ if (w < 1 || w > 64 || h < 1 || h > 64)
+ error("bad bounding box %dx%d\n", w, h);
+ bpl = (w*32+7)/8; // rounding is unnecessary
+ bmap = calloc(1, bpl * h*8);
+ if (bmap == 0)
+ error("out of memory");
+ }
+ else if (streq(word[0], "STARTCHAR"))
+ {
+ if (not bmap)
+ error("no FONTBOUNDINGBOX");
+ dochar();
+ }
+ }
+ error("unexpected EOF (missing ENDFONT)");
+}
+
+
+static void writexbm()
+{
+ char buf[256];
+ int i, j;
+ unsigned char *p = bmap;
+
+ if (not bmap)
+ return;
+
+ sprintf(buf, font, w, h);
+
+ printf("#define %s_width %d\n", buf, 32 * w);
+ printf("#define %s_height %d\n", buf, 8 * h);
+ printf("static unsigned char %s_bits[] = {\n", buf);
+ for (i = 0; i < 16 * h * w / 8; ++i)
+ {
+ for (j = 0; j < 16; ++j)
+ printf("0x%02x,", *p++);
+ printf("\n");
+ }
+ printf("};\n");
+}
+
+
+int main(int argc, char **argv)
+{
+ if (argc > 1)
+ font = argv[1];
+ dofile();
+ writexbm();
+ exit(0);
+}
diff --git a/util/alevt/cache.c b/util/alevt/cache.c
new file mode 100644
index 0000000..c747448
--- /dev/null
+++ b/util/alevt/cache.c
@@ -0,0 +1,229 @@
+#include <stdlib.h>
+#include <string.h>
+#include "misc.h"
+#include "dllist.h"
+#include "cache.h"
+#include "help.h"
+
+
+static inline int hash(int pgno)
+{
+ // very simple...
+ return pgno % HASH_SIZE;
+}
+
+
+static void do_erc(struct vt_page *ovtp, struct vt_page *nvtp)
+{
+ int l, c;
+
+ if (nvtp->errors == 0 && ovtp->lines == nvtp->lines)
+ return;
+
+ for (l = 0; l < H; ++l)
+ {
+ if (~nvtp->lines & (1 << l))
+ memcpy(nvtp->data[l], ovtp->data[l], W);
+ else if (ovtp->lines & (1 << l))
+ for (c = 0; c < W; ++c)
+ if (nvtp->data[l][c] == BAD_CHAR)
+ nvtp->data[l][c] = ovtp->data[l][c];
+ }
+ nvtp->lines |= ovtp->lines;
+}
+
+
+static void cache_close(struct cache *ca)
+{
+ struct cache_page *cp;
+ int i;
+
+ for (i = 0; i < HASH_SIZE; ++i)
+ while (not dl_empty(ca->hash + i))
+ {
+ cp = PTR ca->hash[i].first;
+ dl_remove(cp->node);
+ free(cp);
+ }
+ free(ca);
+}
+
+
+static void cache_reset(struct cache *ca)
+{
+ struct cache_page *cp, *cpn;
+ int i;
+
+ for (i = 0; i < HASH_SIZE; ++i)
+ for (cp = PTR ca->hash[i].first; cpn = PTR cp->node->next; cp = cpn)
+ if (cp->page->pgno / 256 != 9) // don't remove help pages
+ {
+ dl_remove(cp->node);
+ free(cp);
+ ca->npages--;
+ }
+ memset(ca->hi_subno, 0, sizeof(ca->hi_subno[0]) * 0x900);
+}
+
+/* Get a page from the cache.
+ If subno is SUB_ANY, the newest subpage of that page is returned */
+
+
+static struct vt_page * cache_get(struct cache *ca, int pgno, int subno)
+{
+ struct cache_page *cp;
+ int h = hash(pgno);
+
+ for (cp = PTR ca->hash[h].first; cp->node->next; cp = PTR cp->node->next)
+ if (cp->page->pgno == pgno)
+ if (subno == ANY_SUB || cp->page->subno == subno)
+ {
+ // found, move to front (make it 'new')
+ dl_insert_first(ca->hash + h, dl_remove(cp->node));
+ return cp->page;
+ }
+ return 0;
+}
+
+/* Put a page in the cache.
+ If it's already there, it is updated. */
+
+
+static struct vt_page * cache_put(struct cache *ca, struct vt_page *vtp)
+{
+ struct cache_page *cp;
+ int h = hash(vtp->pgno);
+
+ for (cp = PTR ca->hash[h].first; cp->node->next; cp = PTR cp->node->next)
+ if (cp->page->pgno == vtp->pgno && cp->page->subno == vtp->subno)
+ break;
+
+ if (cp->node->next)
+ {
+ // move to front.
+ dl_insert_first(ca->hash + h, dl_remove(cp->node));
+ if (ca->erc)
+ do_erc(cp->page, vtp);
+ }
+ else
+ {
+ cp = malloc(sizeof(*cp));
+ if (cp == 0)
+ return 0;
+ if (vtp->subno >= ca->hi_subno[vtp->pgno])
+ ca->hi_subno[vtp->pgno] = vtp->subno + 1;
+ ca->npages++;
+ dl_insert_first(ca->hash + h, cp->node);
+ }
+
+ *cp->page = *vtp;
+ return cp->page;
+}
+
+/* Same as cache_get but doesn't make the found entry new */
+
+
+static struct vt_page * cache_lookup(struct cache *ca, int pgno, int subno)
+{
+ struct cache_page *cp;
+ int h = hash(pgno);
+
+ for (cp = PTR ca->hash[h].first; cp->node->next; cp = PTR cp->node->next)
+ if (cp->page->pgno == pgno)
+ if (subno == ANY_SUB || cp->page->subno == subno)
+ return cp->page;
+ return 0;
+}
+
+
+static struct vt_page * cache_foreach_pg(struct cache *ca, int pgno, int subno,
+ int dir, int (*func)(), void *data)
+{
+ struct vt_page *vtp, *s_vtp = 0;
+
+ if (ca->npages == 0)
+ return 0;
+
+ if (vtp = cache_lookup(ca, pgno, subno))
+ subno = vtp->subno;
+ else if (subno == ANY_SUB)
+ subno = dir < 0 ? 0 : 0xffff;
+
+ for (;;)
+ {
+ subno += dir;
+ while (subno < 0 || subno >= ca->hi_subno[pgno])
+ {
+ pgno += dir;
+ if (pgno < 0x100)
+ pgno = 0x9ff;
+ if (pgno > 0x9ff)
+ pgno = 0x100;
+ subno = dir < 0 ? ca->hi_subno[pgno] - 1 : 0;
+ }
+ if (vtp = cache_lookup(ca, pgno, subno))
+ {
+ if (s_vtp == vtp)
+ return 0;
+ if (s_vtp == 0)
+ s_vtp = vtp;
+ if (func(data, vtp))
+ return vtp;
+ }
+ }
+}
+
+
+static int cache_mode(struct cache *ca, int mode, int arg)
+{
+ int res = -1;
+
+ switch (mode)
+ {
+ case CACHE_MODE_ERC:
+ res = ca->erc;
+ ca->erc = arg ? 1 : 0;
+ break;
+ }
+ return res;
+}
+
+
+static struct cache_ops cops =
+{
+ cache_close,
+ cache_get,
+ cache_put,
+ cache_reset,
+ cache_foreach_pg,
+ cache_mode,
+};
+
+
+struct cache * cache_open(void)
+{
+ struct cache *ca;
+ struct vt_page *vtp;
+ int i;
+
+ if (not(ca = malloc(sizeof(*ca))))
+ goto fail1;
+
+ for (i = 0; i < HASH_SIZE; ++i)
+ dl_init(ca->hash + i);
+
+ memset(ca->hi_subno, 0, sizeof(ca->hi_subno));
+ ca->erc = 1;
+ ca->npages = 0;
+ ca->op = &cops;
+
+ for (vtp = help_pages; vtp < help_pages + nr_help_pages; vtp++)
+ cache_put(ca, vtp);
+
+ return ca;
+
+fail2:
+ free(ca);
+fail1:
+ return 0;
+}
diff --git a/util/alevt/cache.h b/util/alevt/cache.h
new file mode 100644
index 0000000..934ef9a
--- /dev/null
+++ b/util/alevt/cache.h
@@ -0,0 +1,41 @@
+#ifndef CACHE_H
+#define CACHE_H
+
+#include "vt.h"
+#include "misc.h"
+#include "dllist.h"
+
+#define HASH_SIZE 113
+
+
+struct cache
+{
+ struct dl_head hash[HASH_SIZE];
+ int erc; // error reduction circuit on
+ int npages;
+ u16 hi_subno[0x9ff + 1]; // 0:pg not in cache, 1-3f80:highest subno + 1
+ struct cache_ops *op;
+};
+
+
+struct cache_page
+{
+ struct dl_node node[1];
+ struct vt_page page[1];
+};
+
+
+struct cache_ops
+{
+ void (*close)(struct cache *ca);
+ struct vt_page *(*get)(struct cache *ca, int pgno, int subno);
+ struct vt_page *(*put)(struct cache *ca, struct vt_page *vtp);
+ void (*reset)(struct cache *ca);
+ struct vt_page *(*foreach_pg)(struct cache *ca, int pgno, int subno, int dir,
+ int (*func)(), void *data);
+ int (*mode)(struct cache *ca, int mode, int arg);
+};
+
+struct cache *cache_open(void);
+#define CACHE_MODE_ERC 1
+#endif
diff --git a/util/alevt/dllist.h b/util/alevt/dllist.h
new file mode 100644
index 0000000..f925506
--- /dev/null
+++ b/util/alevt/dllist.h
@@ -0,0 +1,55 @@
+#ifndef DLLIST_H
+#define DLLIST_H
+
+
+struct dl_node
+{
+ struct dl_node *next;
+ struct dl_node *prev;
+};
+
+
+struct dl_head
+{
+ struct dl_node *first;
+ struct dl_node *null;
+ struct dl_node *last;
+};
+
+
+static inline struct dl_head * dl_init(struct dl_head *h)
+{
+ h->first = (struct dl_node *)&h->null;
+ h->null = 0;
+ h->last = (struct dl_node *)&h->first;
+ return h;
+}
+
+
+static inline struct dl_node * dl_remove(struct dl_node *n)
+{
+ n->prev->next = n->next;
+ n->next->prev = n->prev;
+ return n;
+}
+
+
+static inline struct dl_node *
+ dl_insert_after(struct dl_node *p, struct dl_node *n)
+{
+ n->next = p->next;
+ n->prev = p;
+ p->next = n;
+ n->next->prev = n;
+ return n;
+}
+
+#define dl_empty(h) ((h)->first->next == 0)
+#define dl_insert_before(p, n) dl_insert_after((p)->prev, (n))
+#define dl_insert_first(h, n) ({ struct dl_node *_n = (n); \
+ dl_insert_before((h)->first, _n); })
+#define dl_insert_last(h, n) ({ struct dl_node *_n = (n); \
+ dl_insert_after((h)->last, _n); })
+#define dl_remove_first(h) dl_remove((h)->first) // mustn't be empty!
+#define dl_remove_last(h) dl_remove((h)->last) // mustn't be empty!
+#endif
diff --git a/util/alevt/exp-gfx.c b/util/alevt/exp-gfx.c
new file mode 100644
index 0000000..82ab218
--- /dev/null
+++ b/util/alevt/exp-gfx.c
@@ -0,0 +1,258 @@
+/* Copyright 1999 by Paul Ortyl <ortylp@from.pl> */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include "lang.h"
+#include "export.h"
+#include "font.h"
+#define WW (W*CW) /* pixel width of window */
+#define WH (H*CH) /* pixel hegiht of window */
+
+
+static inline void draw_char(unsigned char * colour_matrix, int fg, int bg,
+ int c, int dbl, int _x, int _y, int sep)
+{
+ int x,y;
+ unsigned char* src= (latin1==LATIN1 ? font1_bits : font2_bits);
+ int dest_x=_x*CW;
+ int dest_y=_y*CH;
+
+ for(y=0;y<(CH<<dbl); y++)
+ {
+ for(x=0;x<CW; x++)
+ {
+ int bitnr, bit, maskbitnr, maskbit;
+ bitnr=(c/32*CH + (y>>dbl))*CW*32+ c%32*CW +x;
+ bit=(*(src+bitnr/8))&(1<<bitnr%8);
+ if (sep)
+ {
+ maskbitnr=(0xa0/32*CH + (y>>dbl))*CW*32+ 0xa0%32*CW +x;
+ maskbit=(*(src+maskbitnr/8))&(1<<maskbitnr%8);
+ *(colour_matrix+WW*(dest_y+y)+dest_x+x)=
+ (char)((bit && (!maskbit)) ? fg : bg);
+ }
+ else
+ *(colour_matrix+WW*(dest_y+y)+dest_x+x)=
+ (char)(bit ? fg : bg);
+ }
+ }
+ return;
+}
+
+
+static void prepare_colour_matrix(/*struct export *e,*/
+ struct fmt_page *pg,
+ unsigned char *colour_matrix)
+{
+ int x, y;
+ for (y = 0; y < H; ++y)
+ {
+ for (x = 0; x < W; ++x)
+ {
+ if (pg->dbl & (1<<(y-1)))
+ {
+ if (pg->data[y-1][x].attr & EA_HDOUBLE)
+ draw_char(colour_matrix, pg->data[y][x].fg,
+ pg->data[y][x].bg, pg->data[y][x].ch,
+ (0),
+ x, y,
+ ((pg->data[y][x].attr & EA_SEPARATED) ? 1 : 0)
+ );
+ }
+ else
+ {
+ draw_char(colour_matrix, pg->data[y][x].fg,
+ pg->data[y][x].bg, pg->data[y][x].ch,
+ ((pg->data[y][x].attr & EA_DOUBLE) ? 1 : 0),
+ x, y,
+ ((pg->data[y][x].attr & EA_SEPARATED) ? 1 : 0)
+ );
+ }
+ }
+ }
+ return;
+}
+
+
+static int ppm_output(struct export *e, char *name, struct fmt_page *pg);
+
+struct export_module export_ppm = // exported module definition
+{
+ "ppm", // id
+ "ppm", // extension
+ 0, // options
+ 0, // size
+ 0, // open
+ 0, // close
+ 0, // option
+ ppm_output // output
+};
+
+
+static int ppm_output(struct export *e, char *name, struct fmt_page *pg)
+{
+ FILE *fp;
+ long n;
+ static u8 rgb1[][3]={{0,0,0},
+ {1,0,0},
+ {0,1,0},
+ {1,1,0},
+ {0,0,1},
+ {1,0,1},
+ {0,1,1},
+ {1,1,1}};
+ unsigned char *colour_matrix;
+
+ if (!(colour_matrix=malloc(WH*WW)))
+ {
+ export_error("cannot allocate memory");
+ return 0;
+ }
+
+ prepare_colour_matrix(/*e,*/ pg, (unsigned char *)colour_matrix);
+ if (not(fp = fopen(name, "w")))
+ {
+ free(colour_matrix);
+ export_error("cannot create file");
+ return -1;
+ }
+ fprintf(fp,"P6 %d %d 1\n", WW, WH);
+
+ for(n=0;n<WH*WW;n++)
+ {
+ if (!fwrite(rgb1[(int) *(colour_matrix+n)], 3, 1, fp))
+ {
+ export_error("error while writting to file");
+ free(colour_matrix);
+ fclose(fp);
+ return -1;
+ }
+ }
+ free(colour_matrix);
+ fclose(fp);
+ return 0;
+}
+
+
+#ifdef WITH_PNG
+
+#include <png.h>
+static int png_open(struct export *e);
+static int png_option(struct export *e, int opt, char *arg);
+static int png_output(struct export *e, char *name, struct fmt_page *pg);
+static char *png_opts[] = // module options
+{
+ "compression=<0-9>", // set compression level
+ 0
+};
+
+struct png_data // private data in struct export
+{
+ int compression;
+};
+
+struct export_module export_png = // exported module definition
+{
+ "png", // id
+ "png", // extension
+ png_opts, // options
+ sizeof(struct png_data), // size
+ png_open, // open
+ 0, // close
+ png_option, // option
+ png_output // output
+};
+
+#define D ((struct png_data *)e->data)
+
+
+static int png_open(struct export *e)
+{
+ D->compression = Z_DEFAULT_COMPRESSION;
+ return 0;
+}
+
+
+static int png_option(struct export *e, int opt, char *arg)
+{
+ switch (opt)
+ {
+ case 1: // compression=
+ if (*arg >= '0' && *arg <= '9')
+ D->compression = *arg - '0';
+ break;
+ }
+ return 0;
+}
+
+
+static int png_output(struct export *e, char *name, struct fmt_page *pg)
+{
+ FILE *fp;
+ int x;
+ png_structp png_ptr;
+ png_infop info_ptr;
+ png_byte *row_pointers[WH];
+ static u8 rgb8[][3]={{ 0, 0, 0},
+ {255, 0, 0},
+ { 0,255, 0},
+ {255,255, 0},
+ { 0, 0,255},
+ {255, 0,255},
+ { 0,255,255},
+ {255,255,255}};
+ unsigned char *colour_matrix;
+
+ if (!(colour_matrix=malloc(WH*WW)))
+ {
+ export_error("cannot allocate memory");
+ return -1;
+ }
+ prepare_colour_matrix(/*e,*/ pg, (unsigned char *)colour_matrix);
+ if (not(fp = fopen(name, "w")))
+ {
+ free(colour_matrix);
+ export_error("cannot create file");
+ return -1;
+ }
+ png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING,
+ NULL, NULL, NULL);
+ if (!png_ptr)
+ {
+ free(colour_matrix);
+ fclose(fp);
+ export_error("libpng init error");
+ return -1;
+ }
+ info_ptr = png_create_info_struct(png_ptr);
+ if (!info_ptr)
+ {
+ png_destroy_write_struct(&png_ptr,
+ (png_infopp)NULL);
+ free(colour_matrix);
+ fclose(fp);
+ export_error("libpng init error");
+ return -1;
+ }
+ png_init_io(png_ptr, fp);
+ png_set_compression_level(png_ptr, D->compression);
+ png_set_compression_mem_level(png_ptr, 9);
+ png_set_compression_window_bits(png_ptr, 15);
+ png_set_IHDR(png_ptr, info_ptr, WW, WH,
+ 8, PNG_COLOR_TYPE_PALETTE , PNG_INTERLACE_NONE,
+ PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT);
+ png_set_PLTE(png_ptr, info_ptr,(png_color*) rgb8 , 8);
+ png_write_info(png_ptr, info_ptr);
+ for(x=0; x<WH; x++)
+ { row_pointers[x]=colour_matrix+x*WW; }
+ png_write_image(png_ptr, row_pointers);
+ png_write_end(png_ptr, info_ptr);
+ png_destroy_write_struct(&png_ptr, &info_ptr);
+ free(colour_matrix);
+ fclose(fp);
+ return 0;
+}
+
+#endif
+
diff --git a/util/alevt/exp-html.c b/util/alevt/exp-html.c
new file mode 100644
index 0000000..6c9312a
--- /dev/null
+++ b/util/alevt/exp-html.c
@@ -0,0 +1,299 @@
+/* Copyright 1999 by Paul Ortyl <ortylp@from.pl> */
+
+#include <stdio.h>
+#include <string.h>
+#include "lang.h"
+#include "export.h"
+
+static int html_open(struct export *e);
+static int html_option(struct export *e, int opt, char *arg);
+static int html_output(struct export *e, char *name, struct fmt_page *pg);
+static char *html_opts[] = // module options
+{
+ "gfx-chr=<char>", // substitute <char> for gfx-symbols
+ "bare", // no headers
+ 0
+};
+
+struct html_data // private data in struct export
+{
+ u8 gfx_chr;
+ u8 bare;
+};
+
+
+struct export_module export_html = // exported module definition
+{
+ "html", // id
+ "html", // extension
+ html_opts, // options
+ sizeof(struct html_data), // size
+ html_open, // open
+ 0, // close
+ html_option, // option
+ html_output // output
+};
+
+#define D ((struct html_data *)e->data)
+
+
+static int html_open(struct export *e)
+{
+ D->gfx_chr = '#';
+ D->bare = 0;
+ //e->reveal=1; // the default should be the same for all formats.
+ return 0;
+}
+
+
+static int html_option(struct export *e, int opt, char *arg)
+{
+ switch (opt)
+ {
+ case 1: // gfx-chr=
+ D->gfx_chr = *arg ?: ' ';
+ break;
+ case 2: // bare (no headers)
+ D->bare=1;
+ break;
+ }
+ return 0;
+}
+
+#define HTML_BLACK "#000000"
+#define HTML_RED "#FF0000"
+#define HTML_GREEN "#00FF00"
+#define HTML_YELLOW "#FFFF00"
+#define HTML_BLUE "#0000FF"
+#define HTML_MAGENTA "#FF00FF"
+#define HTML_CYAN "#00FFFF"
+#define HTML_WHITE "#FFFFFF"
+
+#undef UNREADABLE_HTML //no '\n'
+#define STRIPPED_HTML //only necessary fields in header
+
+static int html_output(struct export *e, char *name, struct fmt_page *pg)
+{
+
+ const char* html_colours[]={ HTML_BLACK,
+ HTML_RED,
+ HTML_GREEN,
+ HTML_YELLOW,
+ HTML_BLUE,
+ HTML_MAGENTA,
+ HTML_CYAN,
+ HTML_WHITE};
+ FILE *fp;
+ int x, y;
+
+#ifdef UNREADABLE_HTML
+#define HTML_NL
+#else
+#define HTML_NL fputc('\n',fp);
+#endif
+
+ if (not(fp = fopen(name, "w")))
+ {
+ export_error("cannot create file");
+ return -1;
+ }
+
+if (!D->bare)
+ {
+#ifndef STRIPPED_HTML
+ fputs("<!doctype html public \"-//w3c//dtd html 4.0 transitional//en\">",fp);
+ HTML_NL
+#endif
+ fputs("<html><head>",fp);
+ HTML_NL
+#ifndef STRIPPED_HTML
+ fputs("<meta http-equiv=\"Content-Type\" content=\"text/html;",fp);
+ switch(latin1) {
+ case LATIN1: fprintf(fp,"charset=iso-8859-1\">"); break;
+ case LATIN2: fprintf(fp,"charset=iso-8859-2\">"); break;
+ case KOI8: fprintf(fp,"charset=koi8-r\">"); break;
+ case GREEK: fprintf(fp,"charset=iso-8859-7\">"); break;
+ }
+ HTML_NL
+ fputs("<meta name=\"GENERATOR\" content=\"alevt-cap\">",fp);
+ HTML_NL
+#else
+ switch(latin1) {
+ case LATIN1: fprintf(fp,"<meta charset=iso-8859-1\">"); break;
+ case LATIN2: fprintf(fp,"<meta charset=iso-8859-2\">"); break;
+ case KOI8: fprintf(fp,"<meta charset=koi8-r\">"); break;
+ case GREEK: fprintf(fp,"<meta charset=iso-8859-7\">"); break;
+ }
+ HTML_NL
+#endif
+ fputs("</head>",fp);
+ fputs("<body text=\"#FFFFFF\" bgcolor=\"#000000\">",fp);
+ HTML_NL
+ } //bare
+
+ fputs("<tt><b>",fp);
+ HTML_NL
+
+ // write tables in form of HTML format
+ for (y = 0; y < 25; ++y)
+ {
+ int last_nonblank=0;
+ int first_unprinted=0;
+ int last_space=1;
+ // previous char was &nbsp;
+ // is used for deciding to put semicolon or not
+ int nbsp=0;
+
+ // for output filled with ' ' up to 40 chars
+ // set last_nonblank=39
+ for (x = 0 ; x < 40; ++x)
+ {
+ if (pg->data[y][x].attr & EA_GRAPHIC)
+ {pg->data[y][x].ch= D->gfx_chr;}
+
+ if (pg->data[y][x].ch!=' ')
+ {
+ last_nonblank=x;
+ }
+ }
+
+ for (x = 0 ; x <= last_nonblank ; ++x)
+ {
+ if (pg->data[y][x].ch==' ')
+ {
+ // if single space between blinking/colour words
+ // then make the space blinking/colour too
+ if ((x)&&(x<39))
+ {
+ if ((pg->data[y][x-1].ch!=' ')
+ &&(pg->data[y][x+1].ch!=' ')
+ &&(pg->data[y][x-1].attr & EA_BLINK)
+ &&(pg->data[y][x+1].attr & EA_BLINK))
+ {pg->data[y][x].attr |= EA_BLINK;}
+ else
+ {pg->data[y][x].attr &= ~EA_BLINK;}
+
+ if ((pg->data[y][x-1].ch!=' ')
+ &&(pg->data[y][x+1].ch!=' ')
+ &&(pg->data[y][x-1].fg==pg->data[y][x+1].fg))
+ {pg->data[y][x].fg=pg->data[y][x-1].fg;}
+ else
+ pg->data[y][x].fg=7;
+ }
+ else
+ {
+ pg->data[y][x].attr &= ~EA_BLINK;
+ pg->data[y][x].fg=7;
+ }
+ }
+ else
+ {
+ // if foreground is black set the foreground to previous
+ // background colour to let it be visible
+ if (!pg->data[y][x].fg)
+ {pg->data[y][x].fg=pg->data[y][x].bg;}
+ }
+ //check if attributes changed,
+ //if yes then print chars and update first_unprinted
+ //if not then go to next char
+ if (x)
+ {
+ if (((
+ (pg->data[y][x].attr & EA_BLINK)
+ ==
+ (pg->data[y][x-1].attr & EA_BLINK)
+ )
+ &&
+ (
+ pg->data[y][x].fg == pg->data[y][x-1].fg
+ ))
+ &&(x!=last_nonblank))
+
+ { continue; }
+ }
+ else continue;
+
+ {
+ int z=first_unprinted;
+ for(;(pg->data[y][z].ch==' ') && (z<x);z++)
+ {
+ if (last_space)
+ {
+ fprintf(fp,"&nbsp");
+ last_space=0;
+ nbsp=1;
+ }
+ else
+ {
+ fputc(' ',fp);
+ last_space=1;
+ nbsp=0;
+ }
+ }
+
+ first_unprinted=z;
+
+ if (z==x) continue;
+
+ if (pg->data[y][first_unprinted].attr & EA_BLINK)
+ {
+ fprintf(fp,"<blink>");
+ nbsp=0;
+ }
+
+ if (pg->data[y][first_unprinted].fg!=7)
+ {
+ fprintf(fp,"<font color=\"%s\">",
+ html_colours[pg->data[y][first_unprinted].fg]);
+ nbsp=0;
+ }
+ for(;(z<x)||(z==last_nonblank);z++)
+ {
+
+ if (pg->data[y][z].ch==' ')
+ {
+ for(;(pg->data[y][z].ch==' ') && (z<x);z++)
+ {
+ if (last_space)
+ {
+ fprintf(fp,"&nbsp");
+ last_space=0;
+ nbsp=1;
+ }
+ else
+ {
+ fputc(' ',fp);
+ last_space=1;
+ nbsp=0;
+ }
+ }
+ z--;
+ }
+ else
+ {
+ //if previous nbsp --> put semicolon!!!
+ if (nbsp) fputc(';',fp);
+ fputc(pg->data[y][z].ch,fp);
+ last_space=0;
+ nbsp=0;
+ }
+ }
+ if (pg->data[y][first_unprinted].fg!=7)
+ {
+ fprintf(fp,"</font>");
+ }
+ if (pg->data[y][first_unprinted].attr & EA_BLINK)
+ fprintf(fp,"</blink>");
+
+ first_unprinted=z;
+ }
+ }
+ fputs("<br>",fp);
+ HTML_NL
+ }
+ fputs("</b></tt>",fp);
+ if (!D->bare)
+ fputs("</body></html>",fp);
+ fclose(fp);
+ return 0;
+}
diff --git a/util/alevt/exp-txt.c b/util/alevt/exp-txt.c
new file mode 100644
index 0000000..8009c17
--- /dev/null
+++ b/util/alevt/exp-txt.c
@@ -0,0 +1,226 @@
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include "os.h"
+#include "export.h"
+
+static int txt_open(struct export *e);
+static int txt_option(struct export *e, int opt, char *arg);
+static int txt_output(struct export *e, char *name, struct fmt_page *pg);
+static char *txt_opts[] = // module options
+{
+ "color", // generate ansi color codes (and attributes)
+ "gfx-chr=<char>", // substitute <char> for gfx-symbols
+ "fg=<0-7|none>", // assume term has <x> as foreground color
+ "bg=<0-7|none>", // assume term has <x> as background color
+ "lines=<1-25>", // output 24 or 25 lines
+ 0
+};
+
+
+struct txt_data // private data in struct export
+{
+ u8 color;
+ u8 gfx_chr;
+ u8 def_fg;
+ u8 def_bg;
+ int endline;
+ struct fmt_char curr[1];
+ FILE *fp;
+};
+
+
+struct export_module export_txt = // exported module definition
+{
+ "ascii", // id
+ "txt", // extension
+ txt_opts, // options
+ sizeof(struct txt_data), // data size
+ txt_open, // open
+ 0, // close
+ txt_option, // option
+ txt_output, // output
+};
+
+
+struct export_module export_ansi = // exported module definition
+{
+ "ansi", // id
+ "txt", // extension
+ txt_opts, // options
+ sizeof(struct txt_data), // data size
+ txt_open, // open
+ 0, // close
+ txt_option, // option
+ txt_output, // output
+};
+
+#define D ((struct txt_data *)e->data)
+
+
+char * my_stpcpy(char *dst, const char *src)
+{
+ while (*dst = *src++)
+ dst++;
+ return dst;
+}
+
+
+static int txt_open(struct export *e)
+{
+ D->gfx_chr = '#';
+ D->def_fg = -1;
+ D->def_bg = -1;
+ D->endline = H;
+ if (e->mod == &export_ansi)
+ D->color = 1;
+ return 0;
+}
+
+
+static int txt_option(struct export *e, int opt, char *arg)
+{
+ switch (opt)
+ {
+ case 1: // color
+ D->color = 1;
+ break;
+ case 2: // gfx-chr=
+ D->gfx_chr = *arg ?: ' ';
+ break;
+ case 3: // fg=
+ D->def_fg = *arg - '0';
+ break;
+ case 4: // bg=
+ D->def_bg = *arg - '0';
+ break;
+ case 5: // lines=
+ D->endline = atoi(arg);
+ if (D->endline < 1 || D->endline > H)
+ {
+ export_error("lines: invalid number");
+ return 1;
+ }
+ }
+ return 0;
+}
+
+
+static void put_attr(struct export *e, struct fmt_char *new)
+{
+ char buf[512];
+ char *p = buf;
+ int fg, bg, attr;
+ int reset = 0;
+
+ if (D->color)
+ {
+ fg = D->curr->fg ^ new->fg;
+ bg = D->curr->bg ^ new->bg;
+ attr = (D->curr->attr ^ new->attr) & (EA_BLINK | EA_DOUBLE);
+
+ if (fg | bg | attr)
+ {
+ if (~new->attr & attr) // reset some attributes -> reset all.
+ reset = 1;
+ if (fg && new->fg == D->def_fg) // switch to def fg -> reset all
+ reset = 1;
+ if (bg && new->bg == D->def_bg) // switch to def bg -> reset all
+ reset = 1;
+
+ p = my_stpcpy(buf, "\e[");
+ if (reset)
+ {
+ p = my_stpcpy(p, ";"); // "0;" but 0 isn't neccesary
+ attr = -1; // set all attributes
+ fg = new->fg ^ D->def_fg; // set fg if != default fg
+ bg = new->bg ^ D->def_bg; // set bg if != default bg
+ }
+ if (attr & new->attr & EA_BLINK)
+ p = my_stpcpy(p, "5;"); // blink
+ if (attr & new->attr & EA_DOUBLE)
+ p = my_stpcpy(p, "1;"); // bold
+ if (fg)
+ p += sprintf(p, "%d;", new->fg + 30); // fg-color
+ if (bg)
+ p += sprintf(p, "%d;", new->bg + 40); // bg-color
+ p[-1] = 'm'; // replace last ;
+ *D->curr = *new;
+ }
+ }
+ *p++ = new->ch;
+ *p = 0;
+ fputs(buf, D->fp);
+}
+
+
+static int txt_output(struct export *e, char *name, struct fmt_page *pg)
+{
+ struct fmt_char def_c[1];
+ struct fmt_char l[W+2];
+ #define L (l+1)
+ int x, y;
+
+ D->fp = fopen(name, "w");
+ if (not D->fp)
+ {
+ export_error("cannot create file");
+ return -1;
+ }
+
+ /* initialize default colors. These have to be restored at EOL. */
+ def_c->ch = '\n';
+ def_c->fg = D->def_fg;
+ def_c->bg = D->def_bg;
+ def_c->attr = E_DEF_ATTR;
+ *D->curr = *def_c;
+ L[-1] = L[W] = *def_c;
+
+ for (y = 0; y < D->endline; y++)
+ if (~pg->hid & (1 << y)) // not hidden
+ {
+ // character conversion
+ for (x = 0; x < W; ++x)
+ {
+ struct fmt_char c = pg->data[y][x];
+
+ switch (c.ch)
+ {
+ case 0x00: case 0xa0: c.ch = ' '; break;
+ case 0x7f: c.ch = '*'; break;
+ case BAD_CHAR: c.ch = '?'; break;
+ default:
+ if (c.attr & EA_GRAPHIC)
+ c.ch = D->gfx_chr;
+ break;
+ }
+ L[x] = c;
+ }
+
+ if (D->color)
+ {
+ // optimize color and attribute changes
+ // delay fg and attr changes as far as possible
+ for (x = 0; x < W; ++x)
+ if (L[x].ch == ' ')
+ {
+ L[x].fg = L[x-1].fg;
+ l[x].attr = L[x-1].attr;
+ }
+
+ // move fg and attr changes to prev bg change point
+ for (x = W-1; x >= 0; x--)
+ if (L[x].ch == ' ' && L[x].bg == L[x+1].bg)
+ {
+ L[x].fg = L[x+1].fg;
+ L[x].attr = L[x+1].attr;
+ }
+ }
+
+ // now emit the whole line (incl EOL)
+ for (x = 0; x < W+1; ++x)
+ put_attr(e, L + x);
+ }
+ fclose(D->fp);
+ return 0;
+}
diff --git a/util/alevt/export.c b/util/alevt/export.c
new file mode 100644
index 0000000..1eb8ea9
--- /dev/null
+++ b/util/alevt/export.c
@@ -0,0 +1,364 @@
+#include <stdarg.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include "vt.h"
+#include "misc.h"
+#include "export.h"
+
+extern struct export_module export_txt;
+extern struct export_module export_ansi;
+extern struct export_module export_html;
+extern struct export_module export_png;
+extern struct export_module export_ppm;
+struct export_module *modules[] =
+{
+ &export_txt,
+ &export_ansi,
+ &export_html,
+ &export_ppm,
+#ifdef WITH_PNG
+ &export_png,
+#endif
+ 0
+};
+
+
+static char *glbl_opts[] =
+{
+ "reveal", // show hidden text
+ "hide", // don't show hidden text (default)
+ 0
+};
+
+static char errbuf[64];
+
+
+void export_error(char *str, ...)
+{
+ va_list args;
+
+ va_start(args, str);
+ vsnprintf(errbuf, sizeof(errbuf)-1, str, args);
+}
+
+
+char * export_errstr(void)
+{
+ return errbuf;
+}
+
+
+static int find_opt(char **opts, char *opt, char *arg)
+{
+ int err = 0;
+ char buf[256];
+ char **oo, *o, *a;
+
+ if (oo = opts)
+ while (o = *oo++)
+ {
+ if (a = strchr(o, '='))
+ {
+ a = buf + (a - o);
+ o = strcpy(buf, o);
+ *a++ = 0;
+ }
+ if (strcasecmp(o, opt) == 0)
+ {
+ if ((a != 0) == (arg != 0))
+ return oo - opts;
+ err = -1;
+ }
+ }
+ return err;
+}
+
+
+struct export * export_open(char *fmt)
+{
+ struct export_module **eem, *em;
+ struct export *e;
+ char *opt, *optend, *optarg;
+ int opti;
+
+ if (fmt = strdup(fmt))
+ {
+ if (opt = strchr(fmt, ','))
+ *opt++ = 0;
+ for (eem = modules; em = *eem; eem++)
+ if (strcasecmp(em->fmt_name, fmt) == 0)
+ break;
+ if (em)
+ {
+ if (e = malloc(sizeof(*e) + em->local_size))
+ {
+ e->mod = em;
+ e->fmt_str = fmt;
+ e->reveal = 0;
+ memset(e + 1, 0, em->local_size);
+ if (not em->open || em->open(e) == 0)
+ {
+ for (; opt; opt = optend)
+ {
+ if (optend = strchr(opt, ','))
+ *optend++ = 0;
+ if (not *opt)
+ continue;
+ if (optarg = strchr(opt, '='))
+ *optarg++ = 0;
+ if ((opti = find_opt(glbl_opts, opt, optarg)) > 0)
+ {
+ if (opti == 1) // reveal
+ e->reveal = 1;
+ else if (opti == 2) // hide
+ e->reveal = 0;
+ }
+ else if (opti == 0 &&
+ (opti = find_opt(em->options, opt, optarg)) > 0)
+ {
+ if (em->option(e, opti, optarg))
+ break;
+ }
+ else
+ {
+ if (opti == 0)
+ export_error("%s: unknown option", opt);
+ else if (optarg)
+ export_error("%s: takes no arg", opt);
+ else
+ export_error("%s: missing arg", opt);
+ break;
+ }
+ }
+ if (opt == 0)
+ return e;
+
+ if (em->close)
+ em->close(e);
+ }
+ free(e);
+ }
+ else
+ export_error("out of memory");
+ }
+ else
+ export_error("unknown format: %s", fmt);
+ free(fmt);
+ }
+ else
+ export_error("out of memory");
+ return 0;
+}
+
+
+void export_close(struct export *e)
+{
+ if (e->mod->close)
+ e->mod->close(e);
+ free(e->fmt_str);
+ free(e);
+}
+
+
+static char * hexnum(char *buf, unsigned int num)
+{
+ char *p = buf + 5;
+
+ num &= 0xffff;
+ *--p = 0;
+ do
+ {
+ *--p = "0123456789abcdef"[num % 16];
+ num /= 16;
+ } while (num);
+ return p;
+}
+
+
+static char * adjust(char *p, char *str, char fill, int width)
+{
+ int l = width - strlen(str);
+
+ while (l-- > 0)
+ *p++ = fill;
+ while (*p = *str++)
+ p++;
+ return p;
+}
+
+
+char * export_mkname(struct export *e, char *fmt, struct vt_page *vtp, char *usr)
+{
+ char bbuf[1024];
+ char *p = bbuf;
+
+ while (*p = *fmt++)
+ if (*p++ == '%')
+ {
+ char buf[32], buf2[32];
+ int width = 0;
+
+ p--;
+ while (*fmt >= '0' && *fmt <= '9')
+ width = width*10 + *fmt++ - '0';
+
+ switch (*fmt++)
+ {
+ case '%':
+ p = adjust(p, "%", '%', width);
+ break;
+ case 'e': // extension
+ p = adjust(p, e->mod->extension, '.', width);
+ break;
+ case 'p': // pageno[.subno]
+ if (vtp->subno)
+ p = adjust(p,strcat(strcat(hexnum(buf, vtp->pgno),
+ "."), hexnum(buf2, vtp->subno)), ' ', width);
+ else
+ p = adjust(p, hexnum(buf, vtp->pgno), ' ', width);
+ break;
+ case 'S': // subno
+ p = adjust(p, hexnum(buf, vtp->subno), '0', width);
+ break;
+ case 'P': // pgno
+ p = adjust(p, hexnum(buf, vtp->pgno), '0', width);
+ break;
+ case 's': // user strin
+ p = adjust(p, usr, ' ', width);
+ break;
+ //TODO: add date, channel name, ...
+ }
+ }
+ p = strdup(bbuf);
+ if (not p)
+ export_error("out of memory");
+ return p;
+}
+
+
+static void fmt_page(struct export *e, struct fmt_page *pg, struct vt_page *vtp)
+{
+ char buf[16];
+ int x, y;
+ u8 *p = vtp->data[0];
+
+ pg->dbl = 0;
+
+ sprintf(buf, "\2%x.%02x\7", vtp->pgno, vtp->subno & 0xff);
+
+ for (y = 0; y < H; y++)
+ {
+ struct fmt_char c;
+ int last_ch = ' ';
+ int dbl = 0, hold = 0;
+
+ c.fg = 7;
+ c.bg = 0;
+ c.attr = 0;
+
+ for (x = 0; x < W; ++x)
+ {
+ c.ch = *p++;
+ if (y == 0 && x < 8)
+ c.ch = buf[x];
+ switch (c.ch)
+ {
+ case 0x00 ... 0x07: /* alpha + fg color */
+ c.fg = c.ch & 7;
+ c.attr &= ~(EA_GRAPHIC | EA_CONCEALED);
+ goto ctrl;
+ case 0x08: /* flash */
+ c.attr |= EA_BLINK;
+ goto ctrl;
+ case 0x09: /* steady */
+ c.attr &= ~EA_BLINK;
+ goto ctrl;
+ case 0x0a: /* end box */
+ case 0x0b: /* start box */
+ goto ctrl;
+ case 0x0c: /* normal height */
+ c.attr &= EA_DOUBLE;
+ goto ctrl;
+ case 0x0d: /* double height */
+ if (y < H-2) /* ignored on last 2 lines */
+ {
+ c.attr |= EA_DOUBLE;
+ dbl = 1;
+ }
+ goto ctrl;
+ case 0x10 ... 0x17: /* gfx + fg color */
+ c.fg = c.ch & 7;
+ c.attr |= EA_GRAPHIC;
+ c.attr &= ~EA_CONCEALED;
+ goto ctrl;
+ case 0x18: /* conceal */
+ c.attr |= EA_CONCEALED;
+ goto ctrl;
+ case 0x19: /* contiguous gfx */
+ c.attr &= ~EA_SEPARATED;
+ goto ctrl;
+ case 0x1a: /* separate gfx */
+ c.attr |= EA_SEPARATED;
+ goto ctrl;
+ case 0x1c: /* black bg */
+ c.bg = 0;
+ goto ctrl;
+ case 0x1d: /* new bg */
+ c.bg = c.fg;
+ goto ctrl;
+ case 0x1e: /* hold gfx */
+ hold = 1;
+ goto ctrl;
+ case 0x1f: /* release gfx */
+ hold = 0;
+ goto ctrl;
+
+ case 0x0e: /* SO */
+ case 0x0f: /* SI */
+ case 0x1b: /* ESC */
+ c.ch = ' ';
+ break;
+
+ ctrl:
+ c.ch = ' ';
+ if (hold && (c.attr & EA_GRAPHIC))
+ c.ch = last_ch;
+ break;
+ }
+ if (c.attr & EA_GRAPHIC)
+ if ((c.ch & 0xa0) == 0x20)
+ {
+ last_ch = c.ch;
+ c.ch += (c.ch & 0x40) ? 32 : -32;
+ }
+ if (c.attr & EA_CONCEALED)
+ if (not e->reveal)
+ c.ch = ' ';
+ pg->data[y][x] = c;
+ }
+ if (dbl)
+ {
+ pg->dbl |= 1 << y;
+ for (x = 0; x < W; ++x)
+ {
+ if (~pg->data[y][x].attr & EA_DOUBLE)
+ pg->data[y][x].attr |= EA_HDOUBLE;
+ pg->data[y+1][x] = pg->data[y][x];
+ pg->data[y+1][x].ch = ' ';
+ }
+ y++;
+ p += W;
+ }
+ }
+ pg->hid = pg->dbl << 1;
+}
+
+
+int export(struct export *e, struct vt_page *vtp, char *name)
+{
+ struct fmt_page pg[1];
+
+ fmt_page(e, pg, vtp);
+ return e->mod->output(e, name, pg);
+}
diff --git a/util/alevt/export.h b/util/alevt/export.h
new file mode 100644
index 0000000..a08875c
--- /dev/null
+++ b/util/alevt/export.h
@@ -0,0 +1,66 @@
+#ifndef EXPORT_H
+#define EXPORT_H
+
+#include "vt.h"
+#include "misc.h"
+
+
+struct fmt_char
+{
+ u8 ch, fg, bg, attr;
+};
+
+#define EA_DOUBLE 1 // double height char
+#define EA_HDOUBLE 2 // single height char in double height line
+#define EA_BLINK 4 // blink
+#define EA_CONCEALED 8 // concealed
+#define EA_GRAPHIC 16 // graphic symbol
+#define EA_SEPARATED 32 // use separated graphic symbol
+
+#define E_DEF_FG 7
+#define E_DEF_BG 0
+#define E_DEF_ATTR 0
+
+
+struct fmt_page
+{
+ struct vt_page *vtp;
+ u32 dbl, hid;
+ struct fmt_char data[H][W];
+};
+
+
+struct export
+{
+ struct export_module *mod; // module type
+ char *fmt_str; // saved option string (splitted)
+ // global options
+ int reveal; // reveal hidden chars
+ // local data for module's use. initialized to 0.
+ struct { int dummy; } data[0];
+};
+
+
+struct export_module
+{
+ char *fmt_name; // the format type name (ASCII/HTML/PNG/...)
+ char *extension; // the default file name extension
+ char **options; // module options
+ int local_size;
+ int (*open)(struct export *fmt);
+ void (*close)(struct export *fmt);
+ int (*option)(struct export *fmt, int opt, char *arg);
+ int (*output)(struct export *fmt, char *name, struct fmt_page *pg);
+};
+
+
+extern struct export_module *modules[]; // list of modules (for help msgs)
+void export_error(char *str, ...); // set error
+char *export_errstr(void); // return last error
+char *export_mkname(struct export *e, char *fmt, struct vt_page *vtp, char *usr);
+
+
+struct export *export_open(char *fmt);
+void export_close(struct export *e);
+int export(struct export *e, struct vt_page *vtp, char *user_str);
+#endif
diff --git a/util/alevt/fdset.c b/util/alevt/fdset.c
new file mode 100644
index 0000000..99edac4
--- /dev/null
+++ b/util/alevt/fdset.c
@@ -0,0 +1,97 @@
+#include <stdlib.h>
+#include <unistd.h>
+#include <sys/time.h>
+#include "dllist.h"
+#include "misc.h"
+#include "fdset.h"
+
+struct fdset fds[1]; /* global fd list */
+
+
+int fdset_init(struct fdset *fds)
+{
+ dl_init(fds->list);
+ fds->del_count = 0;
+ return 0;
+}
+
+
+int fdset_add_fd(struct fdset *fds, int fd, void *handler, void *data)
+{
+ struct fdset_node *fn;
+
+ if (fd < 0)
+ return -1;
+ if (handler == 0)
+ return -1;
+
+ for (fn = PTR fds->list->first; fn->node->next; fn = PTR fn->node->next)
+ if (fn->fd == fd)
+ return -1;
+
+ if (not(fn = malloc(sizeof(*fn))))
+ return -1;
+ fn->fd = fd;
+ fn->handler = handler;
+ fn->data = data;
+ dl_insert_last(fds->list, fn->node);
+ return 0;
+}
+
+
+int fdset_del_fd(struct fdset *fds, int fd)
+{
+ struct fdset_node *fn;
+
+ for (fn = PTR fds->list->first; fn->node->next; fn = PTR fn->node->next)
+ if (fn->fd == fd)
+ {
+ dl_remove(fn->node);
+ free(fn);
+ fds->del_count++;
+ return 0;
+ }
+ return -1;
+}
+
+
+int fdset_select(struct fdset *fds, int timeout)
+{
+ struct fdset_node *fn;
+ fd_set rfds[1];
+ struct timeval tv[1], *tvp = 0;
+ int max_fd, x, del_count;
+
+ FD_ZERO(rfds);
+ max_fd = 0;
+ for (fn = PTR fds->list->first; fn->node->next; fn = PTR fn->node->next)
+ {
+ FD_SET(fn->fd, rfds);
+ if (fn->fd >= max_fd)
+ max_fd = fn->fd + 1;
+ }
+
+ if (timeout >= 0)
+ {
+ tv->tv_sec = timeout/1000;
+ tv->tv_usec = timeout%1000*1000;
+ tvp = tv;
+ }
+
+ x = select(max_fd, rfds, 0, 0, tvp);
+ if (x <= 0)
+ return x;
+
+ /* A little bit complicated. A called handler may modify the fdset... */
+restart:
+ del_count = fds->del_count;
+ for (fn = PTR fds->list->first; fn->node->next; fn = PTR fn->node->next)
+ if (FD_ISSET(fn->fd, rfds))
+ {
+ FD_CLR(fn->fd, rfds);
+ fn->handler(fn->data, fn->fd);
+ if (fds->del_count != del_count)
+ goto restart;
+ }
+ return 1;
+}
diff --git a/util/alevt/fdset.h b/util/alevt/fdset.h
new file mode 100644
index 0000000..4b786e6
--- /dev/null
+++ b/util/alevt/fdset.h
@@ -0,0 +1,28 @@
+#ifndef FDSET_H
+#define FDSET_H
+
+#include "dllist.h"
+
+
+struct fdset
+{
+ struct dl_head list[1];
+ int del_count;
+};
+
+
+struct fdset_node /*internal*/
+{
+ struct dl_node node[1];
+ int fd;
+ void (*handler)(void *data, int fd);
+ void *data;
+};
+
+extern struct fdset fds[1]; /* global fd list */
+
+int fdset_init(struct fdset *fds);
+int fdset_add_fd(struct fdset *fds, int fd, void *handler, void *data);
+int fdset_del_fd(struct fdset *fds, int fd);
+int fdset_select(struct fdset *fds, int timeout /*millisec*/);
+#endif
diff --git a/util/alevt/font.c b/util/alevt/font.c
new file mode 100644
index 0000000..da0e448
--- /dev/null
+++ b/util/alevt/font.c
@@ -0,0 +1,5 @@
+#define static /* I want them global */
+#include "font1.xbm"
+#include "font2.xbm"
+#include "font3.xbm"
+#include "font4.xbm"
diff --git a/util/alevt/font.h b/util/alevt/font.h
new file mode 100644
index 0000000..c17c4bc
--- /dev/null
+++ b/util/alevt/font.h
@@ -0,0 +1,19 @@
+#ifndef FONT_H
+#define FONT_H
+
+#include "fontsize.h" /* the #defines from font?.xbm */
+
+#if font1_width != font2_width || font1_height != font2_height
+#error different font sizes.
+#endif
+
+extern unsigned char font1_bits[];
+extern unsigned char font2_bits[];
+extern unsigned char font3_bits[];
+extern unsigned char font4_bits[];
+
+#define font_width font1_width
+#define font_height font1_height
+#define CW (font_width/32) /* pixel width of a character */
+#define CH (font_height/8) /* pixel height of a character */
+#endif
diff --git a/util/alevt/hamm.c b/util/alevt/hamm.c
new file mode 100644
index 0000000..c44a902
--- /dev/null
+++ b/util/alevt/hamm.c
@@ -0,0 +1,229 @@
+#include "vt.h"
+#include "hamm.h"
+
+// table to decode hamm8/4 encoded bytes.
+// the low 4 bits are the (corrected) data bits
+// bit 8 is set if there was a single bit error
+// bit 12 is set if there was an uncorrectable error
+
+// the idea: you may add up to 15 words and get the
+// number of single bit errors in b8-b11 and the number
+// of double errors in b12-b15
+
+
+static unsigned short hammtab[256] =
+{
+ 0x0101, 0x100f, 0x0001, 0x0101, 0x100f, 0x0100, 0x0101, 0x100f,
+ 0x100f, 0x0102, 0x0101, 0x100f, 0x010a, 0x100f, 0x100f, 0x0107,
+ 0x100f, 0x0100, 0x0101, 0x100f, 0x0100, 0x0000, 0x100f, 0x0100,
+ 0x0106, 0x100f, 0x100f, 0x010b, 0x100f, 0x0100, 0x0103, 0x100f,
+ 0x100f, 0x010c, 0x0101, 0x100f, 0x0104, 0x100f, 0x100f, 0x0107,
+ 0x0106, 0x100f, 0x100f, 0x0107, 0x100f, 0x0107, 0x0107, 0x0007,
+ 0x0106, 0x100f, 0x100f, 0x0105, 0x100f, 0x0100, 0x010d, 0x100f,
+ 0x0006, 0x0106, 0x0106, 0x100f, 0x0106, 0x100f, 0x100f, 0x0107,
+ 0x100f, 0x0102, 0x0101, 0x100f, 0x0104, 0x100f, 0x100f, 0x0109,
+ 0x0102, 0x0002, 0x100f, 0x0102, 0x100f, 0x0102, 0x0103, 0x100f,
+ 0x0108, 0x100f, 0x100f, 0x0105, 0x100f, 0x0100, 0x0103, 0x100f,
+ 0x100f, 0x0102, 0x0103, 0x100f, 0x0103, 0x100f, 0x0003, 0x0103,
+ 0x0104, 0x100f, 0x100f, 0x0105, 0x0004, 0x0104, 0x0104, 0x100f,
+ 0x100f, 0x0102, 0x010f, 0x100f, 0x0104, 0x100f, 0x100f, 0x0107,
+ 0x100f, 0x0105, 0x0105, 0x0005, 0x0104, 0x100f, 0x100f, 0x0105,
+ 0x0106, 0x100f, 0x100f, 0x0105, 0x100f, 0x010e, 0x0103, 0x100f,
+ 0x100f, 0x010c, 0x0101, 0x100f, 0x010a, 0x100f, 0x100f, 0x0109,
+ 0x010a, 0x100f, 0x100f, 0x010b, 0x000a, 0x010a, 0x010a, 0x100f,
+ 0x0108, 0x100f, 0x100f, 0x010b, 0x100f, 0x0100, 0x010d, 0x100f,
+ 0x100f, 0x010b, 0x010b, 0x000b, 0x010a, 0x100f, 0x100f, 0x010b,
+ 0x010c, 0x000c, 0x100f, 0x010c, 0x100f, 0x010c, 0x010d, 0x100f,
+ 0x100f, 0x010c, 0x010f, 0x100f, 0x010a, 0x100f, 0x100f, 0x0107,
+ 0x100f, 0x010c, 0x010d, 0x100f, 0x010d, 0x100f, 0x000d, 0x010d,
+ 0x0106, 0x100f, 0x100f, 0x010b, 0x100f, 0x010e, 0x010d, 0x100f,
+ 0x0108, 0x100f, 0x100f, 0x0109, 0x100f, 0x0109, 0x0109, 0x0009,
+ 0x100f, 0x0102, 0x010f, 0x100f, 0x010a, 0x100f, 0x100f, 0x0109,
+ 0x0008, 0x0108, 0x0108, 0x100f, 0x0108, 0x100f, 0x100f, 0x0109,
+ 0x0108, 0x100f, 0x100f, 0x010b, 0x100f, 0x010e, 0x0103, 0x100f,
+ 0x100f, 0x010c, 0x010f, 0x100f, 0x0104, 0x100f, 0x100f, 0x0109,
+ 0x010f, 0x100f, 0x000f, 0x010f, 0x100f, 0x010e, 0x010f, 0x100f,
+ 0x0108, 0x100f, 0x100f, 0x0105, 0x100f, 0x010e, 0x010d, 0x100f,
+ 0x100f, 0x010e, 0x010f, 0x100f, 0x010e, 0x000e, 0x100f, 0x010e,
+};
+
+#if 0 // this information is contained in hamm24par bit 5
+// simple parity table (sum of 1 bits modulo 2)
+
+
+static char odd_parity[256] =
+{
+ 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0,
+ 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1,
+ 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1,
+ 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0,
+ 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1,
+ 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0,
+ 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0,
+ 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1,
+ 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1,
+ 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0,
+ 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0,
+ 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1,
+ 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0,
+ 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1,
+ 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1,
+ 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0
+};
+#endif
+
+// this table generates the parity checks for hamm24/18 decoding.
+// bit 0 is for test A, 1 for B, ...
+// thanks to R. Gancarz for this fine table *g*
+
+
+static char hamm24par[3][256] =
+{
+ { // parities of first byte
+ 0, 33, 34, 3, 35, 2, 1, 32, 36, 5, 6, 39, 7, 38, 37, 4,
+ 37, 4, 7, 38, 6, 39, 36, 5, 1, 32, 35, 2, 34, 3, 0, 33,
+ 38, 7, 4, 37, 5, 36, 39, 6, 2, 35, 32, 1, 33, 0, 3, 34,
+ 3, 34, 33, 0, 32, 1, 2, 35, 39, 6, 5, 36, 4, 37, 38, 7,
+ 39, 6, 5, 36, 4, 37, 38, 7, 3, 34, 33, 0, 32, 1, 2, 35,
+ 2, 35, 32, 1, 33, 0, 3, 34, 38, 7, 4, 37, 5, 36, 39, 6,
+ 1, 32, 35, 2, 34, 3, 0, 33, 37, 4, 7, 38, 6, 39, 36, 5,
+ 36, 5, 6, 39, 7, 38, 37, 4, 0, 33, 34, 3, 35, 2, 1, 32,
+ 40, 9, 10, 43, 11, 42, 41, 8, 12, 45, 46, 15, 47, 14, 13, 44,
+ 13, 44, 47, 14, 46, 15, 12, 45, 41, 8, 11, 42, 10, 43, 40, 9,
+ 14, 47, 44, 13, 45, 12, 15, 46, 42, 11, 8, 41, 9, 40, 43, 10,
+ 43, 10, 9, 40, 8, 41, 42, 11, 15, 46, 45, 12, 44, 13, 14, 47,
+ 15, 46, 45, 12, 44, 13, 14, 47, 43, 10, 9, 40, 8, 41, 42, 11,
+ 42, 11, 8, 41, 9, 40, 43, 10, 14, 47, 44, 13, 45, 12, 15, 46,
+ 41, 8, 11, 42, 10, 43, 40, 9, 13, 44, 47, 14, 46, 15, 12, 45,
+ 12, 45, 46, 15, 47, 14, 13, 44, 40, 9, 10, 43, 11, 42, 41, 8
+ }, { // parities of second byte
+ 0, 41, 42, 3, 43, 2, 1, 40, 44, 5, 6, 47, 7, 46, 45, 4,
+ 45, 4, 7, 46, 6, 47, 44, 5, 1, 40, 43, 2, 42, 3, 0, 41,
+ 46, 7, 4, 45, 5, 44, 47, 6, 2, 43, 40, 1, 41, 0, 3, 42,
+ 3, 42, 41, 0, 40, 1, 2, 43, 47, 6, 5, 44, 4, 45, 46, 7,
+ 47, 6, 5, 44, 4, 45, 46, 7, 3, 42, 41, 0, 40, 1, 2, 43,
+ 2, 43, 40, 1, 41, 0, 3, 42, 46, 7, 4, 45, 5, 44, 47, 6,
+ 1, 40, 43, 2, 42, 3, 0, 41, 45, 4, 7, 46, 6, 47, 44, 5,
+ 44, 5, 6, 47, 7, 46, 45, 4, 0, 41, 42, 3, 43, 2, 1, 40,
+ 48, 25, 26, 51, 27, 50, 49, 24, 28, 53, 54, 31, 55, 30, 29, 52,
+ 29, 52, 55, 30, 54, 31, 28, 53, 49, 24, 27, 50, 26, 51, 48, 25,
+ 30, 55, 52, 29, 53, 28, 31, 54, 50, 27, 24, 49, 25, 48, 51, 26,
+ 51, 26, 25, 48, 24, 49, 50, 27, 31, 54, 53, 28, 52, 29, 30, 55,
+ 31, 54, 53, 28, 52, 29, 30, 55, 51, 26, 25, 48, 24, 49, 50, 27,
+ 50, 27, 24, 49, 25, 48, 51, 26, 30, 55, 52, 29, 53, 28, 31, 54,
+ 49, 24, 27, 50, 26, 51, 48, 25, 29, 52, 55, 30, 54, 31, 28, 53,
+ 28, 53, 54, 31, 55, 30, 29, 52, 48, 25, 26, 51, 27, 50, 49, 24
+ }, { // parities of third byte
+ 63, 14, 13, 60, 12, 61, 62, 15, 11, 58, 57, 8, 56, 9, 10, 59,
+ 10, 59, 56, 9, 57, 8, 11, 58, 62, 15, 12, 61, 13, 60, 63, 14,
+ 9, 56, 59, 10, 58, 11, 8, 57, 61, 12, 15, 62, 14, 63, 60, 13,
+ 60, 13, 14, 63, 15, 62, 61, 12, 8, 57, 58, 11, 59, 10, 9, 56,
+ 8, 57, 58, 11, 59, 10, 9, 56, 60, 13, 14, 63, 15, 62, 61, 12,
+ 61, 12, 15, 62, 14, 63, 60, 13, 9, 56, 59, 10, 58, 11, 8, 57,
+ 62, 15, 12, 61, 13, 60, 63, 14, 10, 59, 56, 9, 57, 8, 11, 58,
+ 11, 58, 57, 8, 56, 9, 10, 59, 63, 14, 13, 60, 12, 61, 62, 15,
+ 31, 46, 45, 28, 44, 29, 30, 47, 43, 26, 25, 40, 24, 41, 42, 27,
+ 42, 27, 24, 41, 25, 40, 43, 26, 30, 47, 44, 29, 45, 28, 31, 46,
+ 41, 24, 27, 42, 26, 43, 40, 25, 29, 44, 47, 30, 46, 31, 28, 45,
+ 28, 45, 46, 31, 47, 30, 29, 44, 40, 25, 26, 43, 27, 42, 41, 24,
+ 40, 25, 26, 43, 27, 42, 41, 24, 28, 45, 46, 31, 47, 30, 29, 44,
+ 29, 44, 47, 30, 46, 31, 28, 45, 41, 24, 27, 42, 26, 43, 40, 25,
+ 30, 47, 44, 29, 45, 28, 31, 46, 42, 27, 24, 41, 25, 40, 43, 26,
+ 43, 26, 25, 40, 24, 41, 42, 27, 31, 46, 45, 28, 44, 29, 30, 47
+ }
+};
+
+// table to extract the lower 4 bit from hamm24/18 encoded bytes
+
+
+static char hamm24val[256] =
+{
+ 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1,
+ 2, 2, 2, 2, 3, 3, 3, 3, 2, 2, 2, 2, 3, 3, 3, 3,
+ 4, 4, 4, 4, 5, 5, 5, 5, 4, 4, 4, 4, 5, 5, 5, 5,
+ 6, 6, 6, 6, 7, 7, 7, 7, 6, 6, 6, 6, 7, 7, 7, 7,
+ 8, 8, 8, 8, 9, 9, 9, 9, 8, 8, 8, 8, 9, 9, 9, 9,
+ 10, 10, 10, 10, 11, 11, 11, 11, 10, 10, 10, 10, 11, 11, 11, 11,
+ 12, 12, 12, 12, 13, 13, 13, 13, 12, 12, 12, 12, 13, 13, 13, 13,
+ 14, 14, 14, 14, 15, 15, 15, 15, 14, 14, 14, 14, 15, 15, 15, 15,
+ 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1,
+ 2, 2, 2, 2, 3, 3, 3, 3, 2, 2, 2, 2, 3, 3, 3, 3,
+ 4, 4, 4, 4, 5, 5, 5, 5, 4, 4, 4, 4, 5, 5, 5, 5,
+ 6, 6, 6, 6, 7, 7, 7, 7, 6, 6, 6, 6, 7, 7, 7, 7,
+ 8, 8, 8, 8, 9, 9, 9, 9, 8, 8, 8, 8, 9, 9, 9, 9,
+ 10, 10, 10, 10, 11, 11, 11, 11, 10, 10, 10, 10, 11, 11, 11, 11,
+ 12, 12, 12, 12, 13, 13, 13, 13, 12, 12, 12, 12, 13, 13, 13, 13,
+ 14, 14, 14, 14, 15, 15, 15, 15, 14, 14, 14, 14, 15, 15, 15, 15
+};
+
+// mapping from parity checks made by table hamm24par to error
+// results return by hamm24.
+// (0 = no error, 0x0100 = single bit error, 0x1000 = double error)
+
+
+static short hamm24err[64] =
+{
+ 0x0000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000,
+ 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000,
+ 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000,
+ 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000,
+ 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100,
+ 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100,
+ 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100,
+ 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000,
+};
+
+// mapping from parity checks made by table hamm24par to faulty bit
+// in the decoded 18 bit word.
+
+
+static int hamm24cor[64] =
+{
+ 0x00000, 0x00000, 0x00000, 0x00000, 0x00000, 0x00000, 0x00000, 0x00000,
+ 0x00000, 0x00000, 0x00000, 0x00000, 0x00000, 0x00000, 0x00000, 0x00000,
+ 0x00000, 0x00000, 0x00000, 0x00000, 0x00000, 0x00000, 0x00000, 0x00000,
+ 0x00000, 0x00000, 0x00000, 0x00000, 0x00000, 0x00000, 0x00000, 0x00000,
+ 0x00000, 0x00000, 0x00000, 0x00001, 0x00000, 0x00002, 0x00004, 0x00008,
+ 0x00000, 0x00010, 0x00020, 0x00040, 0x00080, 0x00100, 0x00200, 0x00400,
+ 0x00000, 0x00800, 0x01000, 0x02000, 0x04000, 0x08000, 0x10000, 0x20000,
+ 0x00000, 0x00000, 0x00000, 0x00000, 0x00000, 0x00000, 0x00000, 0x00000,
+};
+
+
+int hamm8(u8 *p, int *err)
+{
+ int a = hammtab[p[0]];
+ *err += a;
+ return a & 15;
+}
+
+
+int hamm16(u8 *p, int *err)
+{
+ int a = hammtab[p[0]];
+ int b = hammtab[p[1]];
+ *err += a;
+ *err += b;
+ return (a & 15) | (b & 15) * 16;
+}
+
+
+int hamm24(u8 *p, int *err)
+{
+ int e = hamm24par[0][p[0]] ^ hamm24par[1][p[1]] ^ hamm24par[2][p[2]];
+ int x = hamm24val[p[0]] + p[1] % 128 * 16 + p[2] % 128 * 2048;
+ *err += hamm24err[e];
+ return x ^ hamm24cor[e];
+}
+
+
+int chk_parity(u8 *p, int n)
+{
+ int err;
+ for (err = 0; n--; p++)
+ if (hamm24par[0][*p] & 32)
+ *p &= 0x7f;
+ else
+ *p = BAD_CHAR, err++;
+ return err;
+}
diff --git a/util/alevt/hamm.h b/util/alevt/hamm.h
new file mode 100644
index 0000000..3b8c8ad
--- /dev/null
+++ b/util/alevt/hamm.h
@@ -0,0 +1,7 @@
+#ifndef HAMM_H
+#define HAMM_H
+int hamm8(u8 *p, int *err);
+int hamm16(u8 *p, int *err);
+int hamm24(u8 *p, int *err);
+int chk_parity(u8 *p, int n);
+#endif
diff --git a/util/alevt/help.c b/util/alevt/help.c
new file mode 100644
index 0000000..b867855
--- /dev/null
+++ b/util/alevt/help.c
@@ -0,0 +1,83 @@
+#include "vt.h"
+#include "misc.h"
+
+#define VFILL " "
+#define HELP_HEADER \
+"........\6AleVT Online Help System ", \
+" \22`p0`0 p `0pppp ", \
+"\4\35\22\177 \177j5`p \177 j5 j5 \7 Version \34", \
+"\4\35\22\177,\177j5\177.! +t>! j5 \7"VFILL VERSION" \34", \
+" \22# #\42!\42# \42 \42! ",
+#define FLOF_DATA \
+ 1, { {0x100,ANY_SUB}, {0x200,ANY_SUB}, {0x300,ANY_SUB}, \
+ {0x400,ANY_SUB}, {0x0ff,ANY_SUB}, {0x100,ANY_SUB} }
+
+
+struct vt_page help_pages[] =
+{
+ { 0x900, 0, -1, 0, 0, (1<<26)-1, {
+#include "vt900.out"
+ }, FLOF_DATA },
+
+ { 0x901, 1, -1, 0, 0, (1<<26)-1, {
+#include "vt901.out"
+ }, FLOF_DATA },
+
+ { 0x902, 1, -1, 0, 0, (1<<26)-1, {
+#include "vt902.out"
+ }, FLOF_DATA },
+
+ { 0x903, 1, -1, 0, 0, (1<<26)-1, {
+#include "vt903.out"
+ }, FLOF_DATA },
+
+ { 0x904, 1, -1, 0, 0, (1<<26)-1, {
+#include "vt904.out"
+ }, FLOF_DATA },
+
+ { 0x905, 2, -1, 0, 0, (1<<26)-1, {
+#include "vt905.out"
+ }, FLOF_DATA },
+
+ { 0x906, 1, -1, 0, 0, (1<<26)-1, {
+#include "vt906.out"
+ }, FLOF_DATA },
+
+ { 0x907, 2, -1, 0, 0, (1<<26)-1, {
+#include "vt907.out"
+ }, FLOF_DATA },
+
+ { 0x908, 1, -1, 0, 0, (1<<26)-1, {
+#include "vt908.out"
+ }, FLOF_DATA },
+
+ { 0x909, 0, -1, 0, 0, (1<<26)-1, {
+#include "vt909.out"
+ }, FLOF_DATA },
+
+ { 0x910, 2, -1, 0, 0, (1<<26)-1, {
+#include "vt910.out"
+ }, FLOF_DATA },
+
+ { 0x911, 1, -1, 0, 0, (1<<26)-1, {
+#include "vt911.out"
+ }, FLOF_DATA },
+
+ { 0x912, 2, -1, 0, 0, (1<<26)-1, {
+#include "vt912.out"
+ }, FLOF_DATA },
+
+ { 0x913, 1, -1, 0, 0, (1<<26)-1, {
+#include "vt913.out"
+ }, FLOF_DATA },
+
+ { 0x914, 0, -1, 0, 0, (1<<26)-1, {
+#include "vt914.out"
+ }, FLOF_DATA },
+
+ { 0x915, 0, -1, 0, 0, (1<<26)-1, {
+#include "vt915.out"
+ }, FLOF_DATA },
+};
+
+const int nr_help_pages = NELEM(help_pages);
diff --git a/util/alevt/help.h b/util/alevt/help.h
new file mode 100644
index 0000000..5df47fc
--- /dev/null
+++ b/util/alevt/help.h
@@ -0,0 +1,8 @@
+#ifndef HELP_H
+#define HELP_H
+
+#include "vt.h"
+
+extern struct vt_page help_pages[];
+extern const int nr_help_pages;
+#endif
diff --git a/util/alevt/icon.xbm b/util/alevt/icon.xbm
new file mode 100644
index 0000000..27255a4
--- /dev/null
+++ b/util/alevt/icon.xbm
@@ -0,0 +1,17 @@
+#define icon_width 58
+#define icon_height 20
+static unsigned char icon_bits[] = {
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0x03, 0x0f, 0x30, 0xfe, 0xff, 0xf8, 0x11, 0x00, 0x03,
+ 0x0f, 0x30, 0xfe, 0xff, 0xf8, 0x11, 0x00, 0x03, 0xc5, 0x23, 0xaa, 0xaa,
+ 0xa8, 0xf1, 0xf1, 0x03, 0xc6, 0x22, 0xfe, 0xd5, 0x58, 0xb1, 0xb1, 0x02,
+ 0x45, 0x23, 0x06, 0xaa, 0xa8, 0x51, 0x51, 0x01, 0xc6, 0x22, 0x06, 0xd6,
+ 0x58, 0xb1, 0xb1, 0x02, 0x45, 0x23, 0x62, 0xac, 0xa8, 0x51, 0x51, 0x01,
+ 0xc6, 0x22, 0x62, 0xd4, 0x58, 0xb1, 0xb1, 0x02, 0x45, 0x23, 0x62, 0xac,
+ 0xa8, 0x51, 0x51, 0x01, 0xc6, 0x23, 0x62, 0xd4, 0xf8, 0xb1, 0xb1, 0x02,
+ 0x05, 0x20, 0x02, 0xae, 0x61, 0x58, 0x51, 0x01, 0x06, 0x20, 0x02, 0x56,
+ 0x61, 0xa8, 0xb1, 0x02, 0xc5, 0x23, 0xe2, 0xab, 0x06, 0x56, 0x51, 0x01,
+ 0x46, 0x22, 0xe2, 0x57, 0x05, 0xaa, 0xb1, 0x02, 0xc7, 0x23, 0x06, 0xfe,
+ 0x9f, 0xff, 0xf1, 0x03, 0xc7, 0x23, 0x06, 0xfe, 0x9f, 0xff, 0xf1, 0x03,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0x03, };
diff --git a/util/alevt/lang.c b/util/alevt/lang.c
new file mode 100644
index 0000000..3a49307
--- /dev/null
+++ b/util/alevt/lang.c
@@ -0,0 +1,393 @@
+#include <string.h>
+#include <ctype.h>
+#include "misc.h"
+#include "vt.h"
+#include "lang.h"
+
+int latin1 = -1;
+
+
+static u8 lang_char[256];
+static u8 lang_chars[1+8+8][16] =
+{
+ { 0, 0x23,0x24,0x40,0x5b,0x5c,0x5d,0x5e,0x5f,0x60,0x7b,0x7c,0x7d,0x7e },
+
+ // for latin-1 font
+ // English (100%)
+ { 0, '', '$', '@', '', '', '', '', '#', '', '', '', '', '' },
+ // German (100%)
+ { 0, '#', '$', '', '', '', '', '^', '_', '', '', '', '', '' },
+ // Swedish/Finnish/Hungarian (100%)
+ { 0, '#', '', '', '', '', '', '', '_', '', '', '', '', '' },
+ // Italian (100%)
+ { 0, '', '$', '', '', '', '', '', '#', '', '', '', '', '' },
+ // French (100%)
+ { 0, '', '', '', '', '', '', '', '#', '', '', '', '', '' },
+ // Portuguese/Spanish (100%)
+ { 0, '', '$', '', '', '', '', '', '', '', '', '', '', '' },
+ // Czech/Slovak (60%)
+ { 0, '#', 'u', 'c', 't', 'z', '', '', 'r', '', '', 'e', '', 's' },
+ // reserved (English mapping)
+ { 0, '', '$', '@', '', '', '', '', '#', '', '', '', '', '' },
+
+ // for latin-2 font
+ // Polish (100%)
+ { 0, '#', '', '', '', '', '', '', '', '', '', '', '', '' },
+ // German (100%)
+ { 0, '#', '$', '', '', '', '', '^', '_', '', '', '', '', '' },
+ // Estonian (100%)
+ { 0, '#', '', '', '', '', '', '', '', '', '', '', '', '' },
+ // Lettish/Lithuanian (90%)
+ { 0, '#', '$', '', '', '', '', '', '', '', '', 'u', '', 'i' },
+ // French (90%)
+ { 0, '', 'i', 'a', '', '', 'u', '', '#', 'e', '', '', 'u', '' },
+ // Serbian/Croation/Slovenian (100%)
+ { 0, '#', '', '', '', '', '', '', '', '', '', '', '', '' },
+ // Czech/Slovak (100%)
+ { 0, '#', '', '', '', '', '', '', '', '', '', '', '', '' },
+ // Rumanian (95%)
+ { 0, '#', '', '', '', '', '', '', 'i', '', '', '', '', '' },
+};
+
+/* Yankable latin charset :-)
+ !"#$%&'()*+,-./0123456789:;<=>?
+ @ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_
+ `abcdefghijklmnopqrstuvwxyz{|}~
+
+
+
+*/
+
+
+static struct mark { u8 *g0, *latin1, *latin2; } marks[16] =
+{
+ /* none */ { "#",
+ "",
+ "$" },
+ /* grave - ` */ { " aeiouAEIOU",
+ "`",
+ "`aeiouAEIOU" },
+ /* acute - ' */ { " aceilnorsuyzACEILNORSUYZ",
+ "'clnrszCLNRSZ",
+ "'ݬ" },
+ /* cirumflex - ^ */ { " aeiouAEIOU",
+ "^",
+ "^euEU" },
+ /* tilde - ~ */ { " anoANO",
+ "~",
+ "~anoANO" },
+ /* ??? - */ { "",
+ "",
+ "" },
+ /* breve - u */ { "aA",
+ "aA",
+ "" },
+ /* abovedot - */ { "zZ",
+ "zZ",
+ "" },
+ /* diaeresis */ { "aeiouAEIOU",
+ "",
+ "iI" },
+ /* ??? - . */ { "",
+ "",
+ "" },
+ /* ringabove - */ { " auAU",
+ "uU",
+ "aA" },
+ /* cedilla - */ { "cstCST",
+ "stST",
+ "Ǫ" },
+ /* ??? - _ */ { " ",
+ "_",
+ "_" },
+ /* dbl acute - " */ { " ouOU",
+ "\"ouOU",
+ "\"" },
+ /* ogonek - \, */ { "aeAE",
+ "aeAE",
+ "" },
+ /* caron - v */ { "cdelnrstzCDELNRSTZ",
+ "cdelnrstzCDELNRSTZ",
+ "̥ة" },
+};
+
+
+static u8 g2map_latin1[] =
+ /*0123456789abcdef*/
+ " $#'\" "
+ "׵'\""
+ " `^~ ._\" "
+ "_ "
+ " ЪH ILL TNn"
+ "Kdhiill tn\x7f";
+
+
+static u8 g2map_latin2[] =
+ /*0123456789abcdef*/
+ " icL$Y#'\"< "
+ " u '\"> "
+ " `^~ ._"
+ "- RC "
+ " aH iLO opTNn"
+ "K dhiilo ptn\x7f";
+
+
+void lang_init(void)
+{
+ int i;
+
+ memset(lang_char, 0, sizeof(lang_char));
+ for (i = 1; i <= 13; i++)
+ lang_char[lang_chars[0][i]] = i;
+}
+
+
+void conv2latin(u8 *p, int n, int lang)
+{
+ int c, gfx = 0, lat=0;
+
+ if ((latin1 == KOI8) && lang==12) { /* russian */
+ while (n--) {
+ c=*p;
+
+ if(c==0x1b) lat = !lat; /* ESC switches languages inside page */
+
+ if ( is_koi(c)) {
+ if (not gfx || (c & 0xa0) != 0x20) {
+ if(!lat) conv2koi8(p);
+ }
+ }
+ else if ((c & 0xe8) == 0)
+ gfx = c & 0x10;
+ p++;
+ }
+ }
+else if ((latin1 == GREEK) && lang==15) { /* Hellas */
+ while (n--) {
+ c=*p;
+
+ if(c==0x1b) lat = !lat; /* ESC switches languages inside page */
+
+ if ( is_greek(c)) {
+ if (not gfx || (c & 0xa0) != 0x20) {
+ if(!lat) conv2greek(p);
+ }
+ }
+ else if ((c & 0xe8) == 0)
+ gfx = c & 0x10;
+ p++;
+ }
+ }
+
+ else {
+ while (n--)
+ {
+ if (lang_char[c = *p])
+ {
+ if (not gfx || (c & 0xa0) != 0x20)
+ *p = lang_chars[lang + 1][lang_char[c]];
+ }
+ else if ((c & 0xe8) == 0)
+ gfx = c & 0x10;
+ p++;
+ }
+ }
+}
+
+
+/* check for Greek chars - needs locale iso8859-7 set */
+int is_greek(int c)
+{
+ if( isalpha(c | 0x80)) return 1;
+ return 0;
+}
+
+
+/* check for russian chars - needs locale KOI8-R set */
+int is_koi(int c)
+{
+ if( isalpha(c | 0x80)) return 1;
+ if( c=='&' ) return 1;
+ return 0;
+}
+
+
+/* teletext to koi8-r conversion */
+void conv2koi8(u8 *p)
+{
+ u8 c;
+ static u8 l2koi[]={
+ 0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9,
+ 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF, 0xF0, 0xF1, 0xF2, 0xF3,
+ 0xF4, 0xF5, 0xF6, 0xF7, 0xF8, 0xFF, 0xFA, 0xFB, 0xFC, 0xFD,
+ 0xFE, 0xF9, 0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7,
+ 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, 0xD0, 0xD1,
+ 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA, 0xDB,
+ 0xDC, 0xDD, 0xDE, 0xDF
+ };
+
+ c= *p;
+ if ( (c >= 0x40) && (c <= 0x7f)) *p=l2koi[(c & 0x7f) - 0x40];
+ if (c=='&') *p='';
+}
+
+
+/* teletext to iso8859-7 conversion */
+void conv2greek(u8 *p)
+{
+ u8 c;
+ static u8 l2greek[]={
+/* 1 @ 0x40->*/0xc0,
+/* 2 A 0x41->*/0xc1,
+/* 3 B 0x42->*/0xc2,
+/* 4 C 0x43->*/0xc3,
+/* 5 D 0x44->*/0xc4,
+/* 6 E 0x45->*/0xc5,
+/* 7 F 0x46->*/0xc6,
+/* 8 G 0x47->*/0xc7,
+/* 9 H 0x48->*/0xc8,
+/*10 I 0x49->*/0xc9,
+/*11 J 0x4a->*/0xca,
+/*12 K 0x4b->*/0xcb,
+/*13 L 0x4c->*/0xcc,
+/*14 M 0x4d->*/0xcd,
+/*15 N 0x4e->*/0xce,
+/*16 O 0x4f->*/0xcf,
+/*17 P 0x50->*/0xd0,
+/*18 Q 0x51->*/0xd1,
+/*19 R 0x52->?*/0x52,
+/*20 S 0x53->*/0xd3,
+/*21 T 0x54->*/0xd4,
+/*22 U 0x55->*/0xd5,
+/*23 V 0x56->*/0xd6,
+/*24 W 0x57->*/0xd7,
+/*25 X 0x58->*/0xd8,
+/*26 Y 0x59->*/0xd9,
+/*27 Z 0x5a->?*/0x5a,
+/*28 [ 0x5b->?*/0x5b,
+/*!29 \ 0x5c->*/0xdc,
+/*!30 ] 0x5d->*/0xdd,
+/*!31 ^ 0x5e->*/0xde,
+/*!32 _ 0x5f->*/0xdf,
+/*33 ` 0x60->?*/0x60,
+/*!34 a 0x61->*/0xe1,
+/*!35 b 0x62->*/0xe2,
+/*!36 c 0x63->*/0xe3,
+/*!37 d 0x64->*/0xe4,
+/*!38 e 0x65->*/0xe5,
+/*!39 f 0x66->*/0xe6,
+/*!40 g 0x67->*/0xe7,
+/*!41 h 0x68->*/0xe8,
+/*!42 i 0x69->*/0xe9,
+/*!43 j 0x6a->*/0xea,
+/*!44 k 0x6b->*/0xeb,
+/*!45 l 0x6c->*/0xec,
+/*!46 m 0x6d->*/0xed,
+/*!47 n 0x6e->*/0xee,
+/*!48 o 0x6f->*/0xef,
+/*!49 p 0x70->*/0xf0,
+/*!50 q 0x71->*/0xf1,
+/*!51 r 0x72->*/0xf2,
+/*!52 s 0x73->*/0xf3,
+/*!53 t 0x74->*/0xf4,
+/*!54 u 0x75->*/0xf5,
+/*!55 v 0x76->*/0xf6,
+/*!56 w 0x77->*/0xf7,
+/*!57 x 0x78->*/0xf8,
+/*!58 y 0x79->*/0xf9,
+/*59 z 0x7a->( )*/0xc0,
+/*60 { 0x7b->?*/0x7b,
+/*!61 | 0x7c->*/0xfc,
+/*!62 } 0x7d->*/0xfd,
+/*!63 ~ 0x7e->*/0xfe,
+/*64 0x7f->?*/0x7f
+ };
+ c= *p;
+ if ( (c >= 0x40) && (c <= 0x7f)) *p=l2greek[(c & 0x7f) - 0x40];
+}
+
+
+void init_enhance(struct enhance *eh)
+{
+ eh->next_des = 0;
+}
+
+
+void add_enhance(struct enhance *eh, int dcode, u32 *t)
+{
+
+ if (dcode == eh->next_des)
+ {
+ memcpy(eh->trip + dcode * 13, t, 13 * sizeof(*t));
+ eh->next_des++;
+ }
+ else
+ eh->next_des = -1;
+}
+
+
+void enhance(struct enhance *eh, struct vt_page *vtp)
+{
+ int row = 0;
+ u32 *p, *e;
+
+ if (eh->next_des < 1)
+ return;
+
+ for (p = eh->trip, e = p + eh->next_des * 13; p < e; p++)
+ if (*p % 2048 != 2047)
+ {
+ int adr = *p % 64;
+ int mode = *p / 64 % 32;
+ int data = *p / 2048 % 128;
+
+ if (adr < 40)
+ {
+ // col functions
+ switch (mode)
+ {
+ case 15: // char from G2 set
+ if (adr < W && row < H)
+ if (latin1==LATIN1)
+ vtp->data[row][adr] = g2map_latin1[data-32];
+ else if (latin1==LATIN2)
+ vtp->data[row][adr] = g2map_latin2[data-32];
+ break;
+ case 16 ... 31: // char from G0 set with diacritical mark
+ if (adr < W && row < H)
+ {
+ struct mark *mark = marks + (mode - 16);
+ u8 *x;
+
+ if (x = strchr(mark->g0, data))
+ if (latin1==LATIN1)
+ data = mark->latin1[x - mark->g0];
+ else if (latin1==LATIN2)
+ data = mark->latin2[x - mark->g0];
+ vtp->data[row][adr] = data;
+ }
+ break;
+ }
+ }
+ else
+ {
+ // row functions
+ if ((adr -= 40) == 0)
+ adr = 24;
+
+ switch (mode)
+ {
+ case 1: // full row color
+ row = adr;
+ break;
+ case 4: // set active position
+ row = adr;
+ break;
+ case 7: // address row 0 (+ full row color)
+ if (adr == 23)
+ row = 0;
+ break;
+ }
+ }
+ }
+}
diff --git a/util/alevt/lang.h b/util/alevt/lang.h
new file mode 100644
index 0000000..531f3b0
--- /dev/null
+++ b/util/alevt/lang.h
@@ -0,0 +1,28 @@
+#ifndef LANG_H
+#define LANG_H
+
+#include "misc.h"
+#include "vt.h"
+
+extern int latin1;
+
+#define LATIN1 1
+#define LATIN2 2
+#define KOI8 3
+#define GREEK 4
+
+
+struct enhance
+{
+ int next_des; // next expected designation code
+ u32 trip[13*16]; // tripplets
+};
+
+void lang_init(void);
+void conv2latin(u8 *p, int n, int lang);
+void conv2koi8(u8 *p);
+void conv2greek(u8 *p);
+void init_enhance(struct enhance *eh);
+void add_enhance(struct enhance *eh, int dcode, u32 *data);
+void enhance(struct enhance *eh, struct vt_page *vtp);
+#endif
diff --git a/util/alevt/main.c b/util/alevt/main.c
new file mode 100644
index 0000000..31fe9c3
--- /dev/null
+++ b/util/alevt/main.c
@@ -0,0 +1,221 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <locale.h>
+#include "vt.h"
+#include "misc.h"
+#include "fdset.h"
+#include "xio.h"
+#include "vbi.h"
+#include "lang.h"
+#include "cache.h"
+#include "ui.h"
+
+static char *geometry;
+static char *dpy_name;
+static char *vbi_name = NULL;
+static struct xio *xio;
+static struct vbi *vbi;
+static int erc = 1;
+char *outfile = "";
+static char *channel;
+static int ttpid = -1;
+u_int16_t sid = 0;
+
+
+static void usage(FILE *fp, int exitval)
+{
+ fprintf(fp, "\nUsage: %s [options]\n", prgname);
+ fprintf(fp,
+ "\n"
+ " Valid options:\t\tDefault:\n"
+ " -c <channel name>\t\t(none;dvb only)\n"
+ " -ch -child <ppp.ss>\t\t(none)\n"
+ " -cs -charset\t\tlatin-1\n"
+ " <latin-1/2/koi8-r/iso8859-7>\n"
+ " -h -help\n"
+ " -o <outfile>\t\t(none;dvb only)\n"
+ " -p -parent <ppp.ss>\t\t900\n"
+ " -s -sid <sid>\t\t(none;dvb only)\n"
+ " -t -ttpid <ttpid>\t\t(none;dvb only)\n"
+ " -v -vbi <vbidev>\t\t/dev/vbi\n"
+ " \t\t/dev/vbi0\n"
+ " \t\t/dev/video0\n"
+ " \t\t/dev/dvb/adapter0/demux0\n"
+ "\n"
+ " ppp.ss stands for a page number and an\n"
+ " optional subpage number (Example: 123.4).\n"
+ "\n"
+ " The -child option requires a parent\n"
+ " window. So it must be preceded by\n"
+ " a parent or another child window.\n"
+ );
+ exit(exitval);
+}
+
+
+static int arg_pgno(char *p, int *subno)
+{
+ char *end;
+ int pgno;
+
+ *subno = ANY_SUB;
+ if (*p)
+ {
+ pgno = strtol(p, &end, 16);
+ if ((*end == ':' || *end == '/' || *end == '.') && end[1])
+ *subno = strtol(end + 1, &end, 16);
+ if (*end == 0)
+ if (pgno >= 0x100 && pgno <= 0x999)
+ if (*subno == ANY_SUB || (*subno >= 0x00 && *subno <= 0x3f7f))
+ return pgno;
+ }
+ fatal("%s: invalid page number", p);
+}
+
+
+static struct vtwin * start(int argc, char **argv, struct vtwin *parent,
+ int pgno, int subno)
+{
+ static int valid_vbi_name = 1;
+
+ if (!valid_vbi_name)
+ return parent;
+
+ if (vbi == 0)
+ vbi = vbi_open(vbi_name, cache_open(), channel, outfile, sid, ttpid);
+ if (vbi == 0)
+ {
+ if (vbi_name)
+ error("cannot open device: %s", vbi_name);
+ valid_vbi_name = 0;
+ vbi = open_null_vbi(cache_open());
+ }
+ if (vbi->cache)
+ vbi->cache->op->mode(vbi->cache, CACHE_MODE_ERC, erc);
+
+ if (xio == 0)
+ xio = xio_open_dpy(dpy_name, argc, argv);
+ if (xio == 0)
+ fatal("cannot open display");
+
+ parent = vtwin_new(xio, vbi, geometry, parent, pgno, subno);
+ if (parent == 0)
+ fatal("cannot create window");
+
+ if (!valid_vbi_name)
+ {
+ if (vbi_name)
+ send_errmsg(vbi, "cannot open device: %s", vbi_name);
+ else
+ send_errmsg(vbi, "cannot open any device", vbi_name);
+ }
+
+ return parent;
+}
+
+
+static int option(int argc, char **argv, int *ind, char **arg)
+{
+ static struct { char *nam, *altnam; int arg; } opts[] = {
+ { "-channel", "-c", 1 },
+ { "-child", "-ch", 1 },
+ { "-charset", "-cs", 1 },
+ { "-help", "-h", 0 },
+ { "-outfile", "-o", 1 },
+ { "-parent", "-p", 1 },
+ { "-sid", "-s", 1 },
+ { "-ttpid", "-t", 1 },
+ { "-vbi", "-v", 1 },
+ };
+ int i;
+ if (*ind >= argc)
+ return 0;
+ *arg = argv[(*ind)++];
+ for (i = 0; i < NELEM(opts); ++i)
+ if (streq(*arg, opts[i].nam) || streq(*arg, opts[i].altnam))
+ {
+ if (opts[i].arg)
+ if (*ind < argc)
+ *arg = argv[(*ind)++];
+ else
+ fatal("option %s requires an argument", *arg);
+ return i+1;
+ }
+ if (**arg == '-')
+ {
+ fatal("%s: invalid option", *arg);
+ usage(stderr, 1);
+ }
+ return -1;
+}
+
+
+int main(int argc, char **argv)
+{
+ struct vtwin *parent = 0;
+ int pgno, subno;
+ int opt, ind;
+ char *arg;
+ sid = 0;
+
+ setprgname(argv[0]);
+ fdset_init(fds);
+
+ ind = 1;
+ while (opt = option(argc, argv, &ind, &arg))
+ switch (opt)
+ {
+
+ case 1: // channel
+ channel = arg;
+ break;
+ case 2: // child
+ if (parent == 0)
+ fatal("-child requires a parent window");
+ pgno = arg_pgno(arg, &subno);
+ parent = start(argc, argv, parent, pgno, subno);
+ geometry = 0;
+ break;
+ case 3: // charset
+ if (streq(arg, "latin-1") || streq(arg, "1"))
+ latin1 = LATIN1;
+ else if (streq(arg, "latin-2") || streq(arg, "2"))
+ latin1 = LATIN2;
+ else if (streq(arg, "koi8-r") || streq(arg, "koi"))
+ latin1 = KOI8;
+ else if (streq(arg, "iso8859-7") || streq(arg, "el"))
+ latin1 = GREEK;
+ else
+ fatal("bad charset (not latin-1/2/koi8-r/iso8859-7)");
+ break;
+ case 4: // help
+ usage(stdout, 0);
+ break;
+ case 5: // outfile
+ outfile = arg;
+ break;
+ case 6: // parent
+ case -1: // non-option arg
+ pgno = arg_pgno(arg, &subno);
+ parent = start(argc, argv, 0, pgno, subno);
+ geometry = 0;
+ break;
+ case 7: // sid
+ sid = strtoul(arg, NULL, 0);
+ break;
+ case 8: // ttpid
+ ttpid = strtoul(arg, NULL, 0);
+ break;
+ case 9: // vbi
+ vbi_name = arg;
+ vbi = 0;
+ parent = 0;
+ break;
+ }
+
+ if (parent == 0)
+ start(argc, argv, 0, 0x900, ANY_SUB);
+ xio_event_loop();
+ exit(0);
+}
diff --git a/util/alevt/misc.c b/util/alevt/misc.c
new file mode 100644
index 0000000..32d0595
--- /dev/null
+++ b/util/alevt/misc.c
@@ -0,0 +1,66 @@
+#include <stdio.h>
+#include <stdarg.h>
+#include "misc.h"
+
+char *prgname = 0;
+
+extern char *strrchr(const char *, int);
+NORETURN(exit(int));
+
+
+void setprgname(char *str)
+{
+ char *x = strrchr(str, '/');
+ prgname = x ? x+1 : str;
+}
+
+
+static void print_prgname(void)
+{
+ if (prgname && *prgname)
+ fprintf(stderr, "%s: ", prgname);
+}
+
+
+void error(const char *str, ...)
+{
+ va_list args;
+ va_start(args, str);
+ print_prgname();
+ vfprintf(stderr, str, args);
+ fputc('\n', stderr);
+}
+
+
+void ioerror(const char *str)
+{
+ print_prgname();
+ perror(str);
+}
+
+
+void fatal(const char *str, ...)
+{
+ va_list args;
+ va_start(args, str);
+ print_prgname();
+ vfprintf(stderr, str, args);
+ fputc('\n', stderr);
+ exit(2);
+}
+
+
+void fatal_ioerror(const char *str)
+{
+ print_prgname();
+ perror(str);
+ exit(2);
+}
+
+
+void out_of_mem(int size)
+{
+ if (size > 0)
+ fatal("out of memory allocating %d bytes.", size);
+ fatal("out of memory.");
+}
diff --git a/util/alevt/misc.h b/util/alevt/misc.h
new file mode 100644
index 0000000..00a71f8
--- /dev/null
+++ b/util/alevt/misc.h
@@ -0,0 +1,32 @@
+#ifndef MISC_H
+#define MISC_H
+#define PTR (void *)
+#define NELEM(x) ((int)(sizeof(x)/sizeof(*(x))))
+#define NORETURN(x) void x __attribute__((__noreturn__))
+#define DEFINE(x) typeof(x) x
+#define OFFSET_OF(type, elem) ((u8 *)&((type *)0)->elem - (u8 *)0)
+#define BASE_OF(type, elem, p) ((type *)((u8 *)(p) - OFFSET_OF(type, elem)))
+
+#define not !
+#define streq(a, b) (strcmp((a), (b)) == 0)
+#define min(a,b) ({ typeof(a) _a = a; typeof(b) _b = b; _a < _b ? _a : _b; })
+#define max(a,b) ({ typeof(a) _a = a; typeof(b) _b = b; _a > _b ? _a : _b; })
+#define bound(a,b,c) ({ typeof(a) _a = a; typeof(b) _b = b; typeof(c) _c = c; \
+ _b < _a ? _a : _b > _c ? _c : _b; })
+
+typedef unsigned char u8;
+typedef unsigned short u16;
+typedef unsigned int u32;
+typedef signed char s8;
+typedef signed short s16;
+typedef signed int s32;
+
+extern char *prgname;
+void setprgname(char *argv_0);
+
+NORETURN(fatal(const char *str, ...));
+NORETURN(fatal_ioerror(const char *str));
+NORETURN(out_of_mem(int size));
+void error(const char *str, ...);
+void ioerror(const char *str);
+#endif
diff --git a/util/alevt/os.h b/util/alevt/os.h
new file mode 100644
index 0000000..50b7662
--- /dev/null
+++ b/util/alevt/os.h
@@ -0,0 +1,7 @@
+#ifndef OS_H
+#define OS_H
+#if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBsd__) \
+ || defined(__bsdi__)
+#define BSD
+#endif
+#endif
diff --git a/util/alevt/search.c b/util/alevt/search.c
new file mode 100644
index 0000000..082cefb
--- /dev/null
+++ b/util/alevt/search.c
@@ -0,0 +1,127 @@
+#include <sys/types.h> // for freebsd
+#include <stdlib.h>
+#include "vt.h"
+#include "misc.h"
+#include "cache.h"
+#include "search.h"
+
+
+static void convert(u8 *p, u8 *buf, int *line)
+{
+ int x, y, c, ch, gfx, hid = 0;
+
+ for (y = 1, p += 40; y < 25; ++y)
+ {
+ if (not hid)
+ {
+ gfx = 0;
+ for (x = 0; x < 40; ++x)
+ {
+ c = ' ';
+ switch (ch = *p++)
+ {
+ case 0x00 ... 0x07:
+ gfx = 0;
+ break;
+ case 0x10 ... 0x17:
+ gfx = 1;
+ break;
+ case 0x0c:
+ hid = 1;
+ break;
+ case 0x7f:
+ c = '*';
+ break;
+ case 0x20 ... 0x7e:
+ if (gfx && ch != ' ' && (ch & 0xa0) == 0x20)
+ ch = '#';
+ case 0xa0 ... 0xff:
+ c= ch;
+ }
+ *buf++ = c;
+ }
+ *buf++ = '\n';
+ *line++ = y;
+ }
+ else
+ {
+ p += 40;
+ hid = 0;
+ }
+ }
+ *line = y;
+ *buf = 0;
+}
+
+
+static int search_pg(struct search *s, struct vt_page *vtp)
+{
+ regmatch_t m[1];
+ u8 buf[H *(W+1) + 1];
+ int line[H];
+
+ convert(PTR vtp->data, buf, line);
+ if (regexec(s->pattern, buf, 1, m, 0) == 0)
+ {
+ s->len = 0;
+ if (m->rm_so >= 0)
+ {
+ s->y = line[m->rm_so / (W+1)];
+ s->x = m->rm_so % (W+1);
+ s->len = m->rm_eo - m->rm_so;
+ if (s->x + s->len > 40)
+ s->len = 40 - s->x;
+ }
+ return 1;
+ }
+ return 0;
+}
+
+
+struct search * search_start(struct cache *ca, u8 *pattern)
+{
+ struct search *s;
+ int f = 0;
+
+ if (not(s = malloc(sizeof(*s))))
+ goto fail1;
+
+ if (pattern[0] == '!')
+ pattern++;
+ else
+ f = REG_ICASE;
+
+ if (regcomp(s->pattern, pattern, f | REG_NEWLINE) != 0)
+ goto fail2;
+
+ s->cache = ca;
+ return s;
+
+fail2:
+ free(s);
+fail1:
+ return 0;
+}
+
+
+void search_end(struct search *s)
+{
+ regfree(s->pattern);
+ free(s);
+}
+
+
+int search_next(struct search *s, int *pgno, int *subno, int dir)
+{
+ struct vt_page *vtp = 0;
+
+ if (s->cache)
+ vtp = s->cache->op->foreach_pg(s->cache, *pgno, *subno, dir,
+ search_pg, s);
+ if (vtp == 0)
+ return -1;
+
+ *pgno = vtp->pgno;
+ *subno = vtp->subno ?: ANY_SUB;
+ return 0;
+}
diff --git a/util/alevt/search.h b/util/alevt/search.h
new file mode 100644
index 0000000..c7e813a
--- /dev/null
+++ b/util/alevt/search.h
@@ -0,0 +1,16 @@
+#ifndef SEARCH_H
+#define SEARCH_H
+
+#include <regex.h>
+
+struct search
+{
+ struct cache *cache;
+ regex_t pattern[1];
+ int x, y, len; // the position of the match
+};
+
+struct search *search_start(struct cache *ca, u8 *pattern);
+void search_end(struct search *s);
+int search_next(struct search *s, int *pgno, int *subno, int dir);
+#endif
diff --git a/util/alevt/ui.c b/util/alevt/ui.c
new file mode 100644
index 0000000..70391c7
--- /dev/null
+++ b/util/alevt/ui.c
@@ -0,0 +1,721 @@
+#include <stdio.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <string.h>
+#include <fcntl.h>
+#include <ctype.h>
+#include <stdarg.h>
+#include "vt.h"
+#include "misc.h"
+#include "xio.h"
+#include "vbi.h"
+#include "fdset.h"
+#include "search.h"
+#include "export.h"
+#include "ui.h"
+
+static void vtwin_event(struct vtwin *w, struct vt_event *ev);
+static void msg(struct vtwin *w, u8 *str, ...);
+static void err(struct vtwin *w, u8 *str, ...);
+
+#define hist(w,o) ((w)->hist + (((w)->hist_top + (o)) & (N_HISTORY-1)))
+
+
+static int inc_hex(int i, int bcd_mode)
+{
+ i++;
+ if (bcd_mode)
+ {
+ if ((i & 0x000f) > 0x0009)
+ i = (i + 0x0010) & 0x0ff0;
+ if ((i & 0x00f0) > 0x090)
+ i = (i + 0x0100) & 0x0f00;
+ if ((i & 0x0f00) > 0x0900)
+ i = (i + 0x1000) & 0xf000;
+ }
+ return i;
+}
+
+
+static int dec_hex(int i, int bcd_mode)
+{
+ i--;
+ if (bcd_mode)
+ {
+ if ((i & 0x000f) > 0x0009)
+ i = (i & 0xfff0) + 0x0009;
+ if ((i & 0x00f0) > 0x0090)
+ i = (i & 0xff00) + 0x0099;
+ if ((i & 0x0f00) > 0x0900)
+ i = (i & 0xf000) + 0x0999;
+ }
+ return i;
+}
+
+
+static void set_title(struct vtwin *w)
+{
+ char buf[32], buf2[32];
+
+ if (w->subno == ANY_SUB)
+ sprintf(buf, "%x", w->pgno);
+ else
+ sprintf(buf, "%x/%x", w->pgno, w->subno);
+ if (w->searching)
+ sprintf(buf2, "(%s)", buf);
+ else
+ sprintf(buf2, "%s", buf);
+ xio_title(w->xw, buf2);
+}
+
+
+static void query_page(struct vtwin *w, int pgno, int subno)
+{
+ w->pgno = pgno;
+ w->subno = subno;
+ w->searching = 1;
+ w->hold = 0; //subno != ANY_SUB;
+ xio_set_concealed(w->xw, w->revealed = 0);
+
+ if (hist(w, 0)->pgno != pgno ||
+ (hist(w,0)->subno == ANY_SUB && subno != ANY_SUB))
+ w->hist_top++;
+ hist(w, 0)->pgno = pgno;
+ hist(w, 0)->subno = subno;
+ hist(w, 1)->pgno = 0; // end marker
+
+ xio_cancel_selection(w->xw);
+ if (vbi_query_page(w->vbi, pgno, subno) == 0)
+ {
+ w->vtp = 0;
+ }
+ set_title(w);
+}
+
+
+static void new_or_query(struct vtwin *w, int pgno, int subno, int new_win)
+{
+ if (new_win)
+ {
+ if (w->child)
+ query_page(w->child, pgno, subno);
+ else
+ vtwin_new(w->xw->xio, w->vbi, 0, w, pgno, subno);
+ }
+ else
+ query_page(w, pgno, subno);
+}
+
+static int _next_pgno(int *arg, struct vt_page *vtp)
+{
+ int pgno = vtp->pgno;
+
+ if (arg[0] == pgno) // want different page
+ return 0;
+ if (arg[1]) // and not a hex page
+ for (; pgno; pgno >>=4)
+ if ((pgno & 15) > 9)
+ return 0;
+ return 1;
+}
+
+
+static int _next_subno(int *arg, struct vt_page *vtp)
+{
+ return vtp->pgno == arg[0]; // only subpages of this page
+}
+
+
+static void do_next_pgno(struct vtwin *w, int dir, int bcd_mode, int subs,
+ int new_win)
+{
+ struct vt_page *vtp;
+ struct vtwin *cw = (new_win && w->child) ? w->child : w;
+ int pgno = cw->pgno;
+ int subno = cw->subno;
+
+ if (w->vbi->cache)
+ {
+ int arg[2];
+ arg[0] = pgno;
+ arg[1] = bcd_mode;
+ if (vtp = w->vbi->cache->op->foreach_pg(w->vbi->cache,
+ pgno, subno, dir, subs ? _next_subno:_next_pgno, &arg))
+ {
+ new_or_query(w, vtp->pgno, subs ? vtp->subno : ANY_SUB, new_win);
+ return;
+ }
+ }
+ err(w, "No page.");
+}
+
+#define notdigit(x) (not isdigit((x)))
+
+
+static int chk_screen_fromto(u8 *p, int x, int *n1, int *n2)
+{
+ p += x;
+
+ if (x >= 0 && x+5 < 42)
+ if (notdigit(p[1]) || notdigit(p[0]))
+ if (isdigit(p[2]))
+ if (p[3] == '/' || p[3] == ':')
+ if (isdigit(p[4]))
+ if (notdigit(p[5]) || notdigit(p[6])) /* p[6] is save here */
+ {
+ *n1 = p[2] % 16;
+ if (isdigit(p[1]))
+ *n1 += p[1] % 16 * 16;
+ *n2 = p[4] % 16;
+ if (isdigit(p[5]))
+ *n2 = *n2 * 16 + p[5] % 16;
+ return 1;
+ }
+ return 0;
+}
+
+
+static int chk_screen_pgno(u8 *p, int x, int *pgno, int *subno)
+{
+ p += x;
+
+ if (x >= 0 && x+4 < 42)
+ if (notdigit(p[0]) && notdigit(p[4]))
+ if (isdigit(p[1]) && isdigit(p[2]) && isdigit(p[3]))
+ {
+ *pgno = p[1] % 16 * 256 + p[2] % 16 * 16 + p[3] % 16;
+ if (*pgno >= 0x100 && *pgno <= 0x999)
+ {
+ *subno = ANY_SUB;
+ if (x+6 < 42)
+ if (p[4] == '.' || p[4] == '/')
+ if (isdigit(p[5]))
+ if (notdigit(p[6]) || notdigit(p[7])) /* p[7] is save here */
+ {
+ *subno = p[5] % 16;
+ if (isdigit(p[6]))
+ *subno = *subno * 16 + p[6] % 16;
+ }
+ // hackhackhack:
+ // pgno followed by start box gets subno 1
+ if (x+4 < 42 && p[4] == 11)
+ *subno = 1;
+ return 1;
+ }
+ }
+ return 0;
+}
+
+
+static void do_screen_pgno(struct vtwin *w, int x, int y, int new_win)
+{
+ u8 buf[42];
+ int n1, n2, i;
+
+ if (x >= 0 && x < 40)
+ {
+ if (xio_get_line(w->xw, y, buf+1) == 0)
+ {
+ buf[0] = buf[41] = ' ';
+ x++;
+
+ for (i = -6; i < 35; i++)
+ {
+ if (w->vtp == 0 || w->vtp->subno != 0)
+ if (chk_screen_fromto(buf, x+i, &n1, &n2))
+ {
+ // subno cycling works wrong with children.
+ // so middle button cycles backwards...
+ if (w->subno != ANY_SUB)
+ n1 = w->subno;
+ n1 = new_win ? dec_hex(n1, 1) : inc_hex(n1, 1);
+ if (n1 < 1)
+ n1 = n2;
+ if (n1 > n2)
+ n1 = 1;
+ new_or_query(w, w->pgno, n1, 0);
+ return;
+ }
+ if (i >= -4)
+ if (chk_screen_pgno(buf, x+i, &n1, &n2))
+ {
+ new_or_query(w, n1, n2, new_win);
+ return;
+ }
+ }
+ }
+ }
+ err(w, "No page.");
+}
+
+
+static void do_flof_pgno(struct vtwin *w, int button, int x, int new_win)
+{
+ struct vt_page *vtp = w->vtp;
+ int lk = 99, i, c;
+
+ if (vtp && vtp->flof)
+ {
+ switch (button)
+ {
+ case 1 ... 3:
+ for (i = 0; i <= x && i < 40; ++i)
+ if ((c = vtp->data[24][i]) < 8) // fg-color code
+ lk = c;
+ lk = "x\0\1\2\3x\3x"[lk]; // color -> link#
+ break;
+ case KEY_F(1): lk = 0; break;
+ case KEY_F(2): lk = 1; break;
+ case KEY_F(3): lk = 2; break;
+ case KEY_F(4): lk = 3; break;
+ case KEY_F(5): lk = 5; break;
+ }
+ if (lk < 6 && (vtp->link[lk].pgno & 0xff) != 0xff)
+ {
+ new_or_query(w, vtp->link[lk].pgno, vtp->link[lk].subno, new_win);
+ return;
+ }
+ }
+ else
+ {
+ switch (button)
+ {
+ case 1 ... 3: lk = x / 8; break;
+ case KEY_F(1): lk = 0; break;
+ case KEY_F(2): lk = 1; break;
+ case KEY_F(3): lk = 2; break;
+ case KEY_F(4): lk = 3; break;
+ case KEY_F(5): lk = 4; break;
+ }
+ switch (lk)
+ {
+ case 0: new_or_query(w, 0x100, ANY_SUB, new_win); return;
+ case 1: do_next_pgno(w, -1, 1, 0, new_win); return;
+ case 2: new_or_query(w, 0x900, ANY_SUB, new_win); return;
+ case 3: do_next_pgno(w, 1, 1, 0, new_win); return;
+ case 4: new_or_query(w, 0x999, ANY_SUB, new_win); return;
+ }
+ }
+ err(w, "No page.");
+}
+
+
+static void do_hist_pgno(struct vtwin *w)
+{
+ if (hist(w, -1)->pgno)
+ {
+ w->hist_top--;
+ query_page(w, hist(w, 0)->pgno, hist(w, 0)->subno);
+ }
+ else
+ err(w, "Empty history.");
+}
+
+
+static void put_head_line(struct vtwin *w, u8 *p)
+{
+ char buf[40];
+
+ if (p == 0)
+ xio_get_line(w->xw, 0, buf);
+ else
+ memcpy(buf + 8, p + 8, 32);
+
+ if (w->subno == ANY_SUB)
+ sprintf(buf, "\2%3x \5\xb7", w->pgno);
+ else
+ sprintf(buf, "\2S%02x \5\xb7", w->subno & 0xff);
+
+ if (w->searching)
+ buf[0] = 1;
+ if (w->hold)
+ buf[4] = 'H';
+ if (w->xw->concealed)
+ buf[6] = '*';
+ buf[7] = 7;
+
+ xio_put_line(w->xw, 0, buf);
+}
+
+
+static void put_menu_line(struct vtwin *w)
+{
+ if (w->status > 0)
+ xio_put_line(w->xw, 24, w->statusline);
+ else if (w->vtp && w->vtp->flof)
+ xio_put_line(w->xw, 24, w->vtp->data[24]);
+ else
+ xio_put_line(w->xw, 24, "\0 100 \4<< \6Help \4>>\0 999 ");
+}
+
+
+static void _msg(struct vtwin *w, u8 *str, va_list args)
+{
+ u8 buf[128];
+ int i;
+
+ i = vsprintf(buf, str, args);
+ if (i > W)
+ i = W;
+ memset(w->statusline, ' ', W);
+ memcpy(w->statusline + (W-i+1)/2, buf, i);
+ w->status = 6;
+ put_menu_line(w);
+}
+
+
+static void msg(struct vtwin *w, u8 *str, ...)
+{
+ va_list args;
+
+ va_start(args, str);
+ _msg(w, str, args);
+ va_end(args);
+}
+
+
+static void err(struct vtwin *w, u8 *str, ...)
+{
+ va_list args;
+
+ va_start(args, str);
+ _msg(w, str, args);
+ va_end(args);
+}
+
+
+static void next_search(struct vtwin *w, int rev)
+{
+ if (w->search)
+ {
+ int pgno = w->pgno;
+ int subno = w->subno;
+ int dir = rev ? -w->searchdir : w->searchdir;
+
+ if (search_next(w->search, &pgno, &subno, dir) == 0)
+ {
+ query_page(w, pgno, subno);
+ if (not w->searching && w->search->len)
+ xio_set_selection(w->xw, w->search->x, w->search->y,
+ w->search->x + w->search->len - 1, w->search->y);
+ return;
+ }
+ else
+ err(w, "Pattern not found.");
+ }
+ else
+ err(w, "No search pattern.");
+}
+
+
+static void start_search(struct vtwin *w, u8 *string)
+{
+ if (not string)
+ return;
+
+ if (*string)
+ {
+ if (w->search)
+ search_end(w->search);
+ w->search = search_start(w->vbi->cache, string);
+ if (w->search == 0)
+ {
+ err(w, "Bad search pattern.");
+ return;
+ }
+ }
+ next_search(w, 0);
+}
+
+
+static void start_save2(struct vtwin *w, u8 *name)
+{
+ if (name && *name)
+ if (export(w->export, w->vtp, name))
+ err(w, export_errstr());
+
+ export_close(w->export);
+ w->export = 0;
+ put_menu_line(w);
+}
+
+
+struct vtwin * vtwin_new(struct xio *xio, struct vbi *vbi, char *geom,
+ struct vtwin *parent, int pgno, int subno)
+{
+ struct vtwin *w;
+
+ if (not(w = malloc(sizeof(*w))))
+ goto fail1;
+
+ if (not (w->xw = xio_open_win(xio, geom)))
+ goto fail2;
+ w->vbi = vbi;
+ w->vtp = 0;
+ w->search = 0;
+ w->export = 0;
+ w->parent = parent;
+ w->child = 0;
+ if (parent && parent->child)
+ fatal("internal error: parent already has a child != 0");
+ if (parent)
+ parent->child = w;
+
+ w->hist_top = 1;
+ hist(w,0)->pgno = 0;
+ hist(w,1)->pgno = 0;
+ w->status = 0;
+ xio_set_handler(w->xw, vtwin_event, w);
+ vbi_add_handler(w->vbi, vtwin_event, w);
+ query_page(w, pgno, subno);
+ return w;
+
+fail2:
+ free(w);
+fail1:
+ return 0;
+}
+
+
+static void vtwin_close(struct vtwin *w)
+{
+ if (w->parent)
+ w->parent->child = w->child;
+ if (w->child)
+ w->child->parent = w->parent;
+
+ if (w->search)
+ search_end(w->search);
+ if (w->export)
+ export_close(w->export);
+
+ vbi_del_handler(w->vbi, vtwin_event, w);
+ xio_close_win(w->xw, 1);
+ free(w);
+}
+
+
+static void vtwin_event(struct vtwin *w, struct vt_event *ev)
+{
+ struct xio_win *xw = w->xw;
+ int i;
+
+ switch (ev->type)
+ {
+ case EV_CLOSE:
+ vtwin_close(w);
+ break;
+
+ case EV_TIMER:
+ if (w->status > 0 && --w->status == 0)
+ put_menu_line(w);
+ break;
+
+ case EV_KEY:
+ {
+ switch (ev->i1)
+ {
+ case '0' ... '9':
+ i = ev->i1 - '0';
+ if (w->pgno >= 0x100)
+ {
+ if (i == 0)
+ break;
+ w->pgno = i;
+ }
+ else
+ {
+ w->pgno = w->pgno * 16 + i;
+ if (w->pgno >= 0x100)
+ query_page(w, w->pgno, ANY_SUB);
+ }
+ break;
+ case 'q':
+ case '\e':
+ vtwin_close(w);
+ break;
+ case 'h':
+ query_page(w, 0x900, ANY_SUB);
+ break;
+ case 'e':
+ if (w->vbi->cache)
+ {
+ i = w->vbi->cache->op->mode(w->vbi->cache,
+ CACHE_MODE_ERC, 0);
+ w->vbi->cache->op->mode(w->vbi->cache,
+ CACHE_MODE_ERC, !i);
+ msg(w, "Error reduction %sabled.", i ? "dis" : "en");
+ }
+ break;
+ case 'o':
+ if (vtwin_new(xw->xio, w->vbi, 0, 0, w->pgno, w->subno) == 0)
+ err(w, "Unable to open new window.");
+ break;
+ case KEY_RIGHT:
+ do_next_pgno(w, 1, not ev->i2, 0, 0);
+ break;
+ case KEY_LEFT:
+ do_next_pgno(w, -1, not ev->i2, 0, 0);
+ break;
+ case KEY_UP:
+ do_next_pgno(w, -1, not ev->i2, 1, 0);
+ break;
+ case KEY_DOWN:
+ do_next_pgno(w, 1, not ev->i2, 1, 0);
+ break;
+ case '\b':
+ do_hist_pgno(w);
+ break;
+ case ' ':
+ w->hold = !w->hold;
+ break;
+ case 'c':
+ vbi_reset(w->vbi);
+ break;
+ case 'i':
+ if (w->vtp && w->vtp->flof &&
+ (w->vtp->link[5].pgno & 0xff) != 0xff)
+ query_page(w, w->vtp->link[5].pgno,
+ w->vtp->link[5].subno);
+ else
+ query_page(w, 0x100, ANY_SUB);
+ break;
+ case 'r':
+ xio_set_concealed(xw, w->revealed = !w->revealed);
+ break;
+ case KEY_F(1) ... KEY_F(5):
+ do_flof_pgno(w, ev->i1, 0, ev->i2);
+ break;
+ case 'n':
+ next_search(w, 0);
+ break;
+ case 'N':
+ next_search(w, 1);
+ break;
+ default:
+ err(w, "Unused key.");
+ break;
+ }
+ break;
+ }
+ case EV_RESET:
+ {
+ if (w->search)
+ search_end(w->search);
+ w->search = 0;
+
+ query_page(w, w->pgno, w->subno);
+ msg(w, "Cache cleared!");
+ break;
+ }
+ case EV_MOUSE:
+ {
+ if (ev->i1 == 3)
+ do_hist_pgno(w);
+ else if (ev->i1 == 5) // wheel mouse
+ do_next_pgno(w, 1, not ev->i2, 0, 0);
+ else if (ev->i1 == 4) // wheel mouse
+ do_next_pgno(w, -1, not ev->i2, 0, 0);
+ else if (ev->i1 == 7) // dual wheel mouse
+ do_next_pgno(w, 1, not ev->i2, 1, 0);
+ else if (ev->i1 == 6) // dual wheel mouse
+ do_next_pgno(w, -1, not ev->i2, 1, 0);
+ else if (ev->i4 == 24)
+ do_flof_pgno(w, ev->i1, ev->i3, ev->i1 == 2);
+ else if (ev->i4 == 0 && ev->i3 < 5)
+ {
+ if (ev->i1 == 1)
+ w->hold = !w->hold;
+ else
+ vtwin_new(xw->xio, w->vbi, 0, 0, w->pgno, w->subno);
+ }
+ else if (ev->i4 == 0 && ev->i3 < 8)
+ {
+ if (ev->i1 == 2 && w->child)
+ w = w->child;
+ xio_set_concealed(w->xw, w->revealed = !w->revealed);
+ }
+ else
+ do_screen_pgno(w, ev->i3, ev->i4, ev->i1 == 2);
+ break;
+ }
+ case EV_PAGE:
+ {
+ struct vt_page *vtp = ev->p1;
+
+ if (0)
+ if (vtp->errors)
+ printf("errors=%4d\n",vtp->errors);
+ if (w->searching || not(w->hold || ev->i1))
+ if (vtp->pgno == w->pgno)
+ if (w->subno == ANY_SUB || vtp->subno == w->subno)
+ {
+ w->searching = 0;
+ w->vtp = vtp;
+ put_head_line(w, vtp->data[0]);
+ for (i = 1; i < 24; ++i)
+ xio_put_line(w->xw, i, vtp->data[i]);
+ put_menu_line(w);
+ set_title(w);
+ }
+ break;
+ }
+ case EV_HEADER:
+ {
+ u8 *p = ev->p1;
+ int hdr_mag = ev->i1 / 256;
+ int flags = ev->i3;
+ int mag = w->pgno;
+ if (mag >= 0x10)
+ mag = mag >> 4;
+ if (mag >= 0x10)
+ mag = mag >> 4;
+ if (flags & PG_OUTOFSEQ)
+ p = 0;
+ else
+ if (~flags & PG_MAGSERIAL)
+ if (mag != hdr_mag)
+ p = 0;
+
+ put_head_line(w, p);
+ break;
+ }
+ case EV_XPACKET:
+ {
+#if 0 /* VPS data (seems to be unused in .de */
+ u8 *p = ev->p1;
+
+ if (ev->i1 == 8 && ev->i2 == 30 && p[0]/2 == 1)
+ {
+ int i;
+ int pil, cni, pty, misc;
+
+ for (i = 7; i < 20; ++i)
+ p[i] = hamm8(p+i, &ev->i3);
+ if (ev->i3 & 0xf000) /* uncorrectable errors */
+ break;
+ cni = p[9] + p[15]/4*16 + p[16]%4*64 + p[10]%4*256
+ + p[16]/4*1024 + p[17]*4096;
+ pty = p[18] + p[19]*16;
+ pil = p[10]/4 + p[11]*4 + p[12]*64 + p[13]*1024
+ + p[14]*16384 + p[15]%4*262144;
+ misc = p[7] + p[8]*16;
+ err(w, "%02x %04x %05x %02x: %.20s", misc, cni, pil, pty, p+20);
+ }
+#endif
+ break;
+ }
+ case EV_ERR:
+ {
+ char *errmsg = ev->p1;
+ if (errmsg != NULL && *errmsg != '\0')
+ {
+ err(w, errmsg);
+ w->status = 30;
+ ev->p1 = NULL;
+ free(errmsg);
+ }
+ break;
+ }
+ }
+}
diff --git a/util/alevt/ui.h b/util/alevt/ui.h
new file mode 100644
index 0000000..9efc791
--- /dev/null
+++ b/util/alevt/ui.h
@@ -0,0 +1,35 @@
+#ifndef UI_H
+#define UI_H
+
+#include "vt.h"
+#include "xio.h"
+#include "vbi.h"
+#include "search.h"
+
+#define N_HISTORY (1 << 6) // number of history entries
+
+struct vtwin
+{
+ struct vtwin *parent, *child;
+ struct xio_win *xw;
+ struct vbi *vbi;
+ struct {
+ int pgno;
+ int subno;
+ } hist[N_HISTORY];
+ int hist_top;
+ int searching;
+ int revealed;
+ int hold;
+ int pgno, subno;
+ struct vt_page *vtp;
+ struct search *search;
+ int searchdir;
+ int status;
+ u8 statusline[W+1];
+ struct export *export;
+};
+
+extern struct vtwin *vtwin_new(struct xio *xio, struct vbi *vbi, char *geom,
+ struct vtwin *parent, int pgno, int subno);
+#endif
diff --git a/util/alevt/vbi.c b/util/alevt/vbi.c
new file mode 100644
index 0000000..6a8a47e
--- /dev/null
+++ b/util/alevt/vbi.c
@@ -0,0 +1,942 @@
+#define _GNU_SOURCE
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <stdio.h>
+#include <errno.h>
+#include <stdarg.h>
+#include <sys/ioctl.h>
+#include <sys/poll.h>
+#include "os.h"
+#include "vt.h"
+#include "misc.h"
+#include "vbi.h"
+#include "fdset.h"
+#include "hamm.h"
+#include "lang.h"
+#include <libzvbi.h>
+
+
+static vbi_capture * pZvbiCapt;
+static vbi_raw_decoder * pZvbiRawDec;
+static vbi_sliced * pZvbiData;
+static vbi_proxy_client * pProxy;
+
+#define ZVBI_BUFFER_COUNT 10
+#define ZVBI_TRACE 0
+
+
+static int vbi_dvb_open(struct vbi *vbi, const char *vbi_name,
+ const char *channel, char *outfile, u_int16_t sid, int ttpid);
+static void dvb_handler(struct vbi *vbi, int fd);
+
+#define FAC (1<<16) // factor for fix-point arithmetic
+
+static u8 *rawbuf; // one common buffer for raw vbi data
+static int rawbuf_size; // its current size
+u_int16_t sid;
+static char *vbi_names[]
+ = { "/dev/vbi", "/dev/vbi0", "/dev/video0", "/dev/dvb/adapter0/demux0",
+ NULL }; // default device names if none was given at the command line
+
+
+static void out_of_sync(struct vbi *vbi)
+{
+ int i; // discard all in progress pages
+ for (i = 0; i < 8; ++i)
+ vbi->rpage[i].page->flags &= ~PG_ACTIVE;
+}
+
+
+// send an event to all clients
+static void vbi_send(struct vbi *vbi, int type, int i1, int i2, int i3, void *p1)
+{
+ struct vt_event ev[1];
+ struct vbi_client *cl, *cln;
+ ev->resource = vbi;
+ ev->type = type;
+ ev->i1 = i1;
+ ev->i2 = i2;
+ ev->i3 = i3;
+ ev->p1 = p1;
+ for (cl = PTR vbi->clients->first; cln = PTR cl->node->next; cl = cln)
+ cl->handler(cl->data, ev);
+}
+
+
+static void vbi_send_page(struct vbi *vbi, struct raw_page *rvtp, int page)
+{
+ struct vt_page *cvtp = 0;
+
+ if (rvtp->page->flags & PG_ACTIVE)
+ {
+ if (rvtp->page->pgno % 256 != page)
+ {
+ rvtp->page->flags &= ~PG_ACTIVE;
+ enhance(rvtp->enh, rvtp->page);
+ if (vbi->cache)
+ cvtp = vbi->cache->op->put(vbi->cache, rvtp->page);
+ vbi_send(vbi, EV_PAGE, 0, 0, 0, cvtp ?: rvtp->page);
+ }
+ }
+}
+
+
+static void pll_add(struct vbi *vbi, int n, int err)
+{
+}
+
+
+// process one videotext packet
+static int vt_line(struct vbi *vbi, u8 *p)
+{
+ struct vt_page *cvtp;
+ struct raw_page *rvtp;
+ int hdr, mag, mag8, pkt, i;
+ int err = 0;
+
+ hdr = hamm16(p, &err);
+ if (err & 0xf000)
+ return -4;
+ mag = hdr & 7;
+ mag8 = mag?: 8;
+ pkt = (hdr >> 3) & 0x1f;
+ p += 2;
+ rvtp = vbi->rpage + mag;
+ cvtp = rvtp->page;
+ switch (pkt)
+ {
+ case 0:
+ {
+ int b1, b2, b3, b4;
+ b1 = hamm16(p, &err); // page number
+ b2 = hamm16(p+2, &err); // subpage number + flags
+ b3 = hamm16(p+4, &err); // subpage number + flags
+ b4 = hamm16(p+6, &err); // language code + more flags
+ if (vbi->ppage->page->flags & PG_MAGSERIAL)
+ vbi_send_page(vbi, vbi->ppage, b1);
+ vbi_send_page(vbi, rvtp, b1);
+
+ if (err & 0xf000)
+ return 4;
+
+ cvtp->errors = (err >> 8) + chk_parity(p + 8, 32);;
+ cvtp->pgno = mag8 * 256 + b1;
+ cvtp->subno = (b2 + b3 * 256) & 0x3f7f;
+ cvtp->lang = "\0\4\2\6\1\5\3\7"[b4 >> 5] + (latin1==LATIN1 ? 0 : 8);
+ cvtp->flags = b4 & 0x1f;
+ cvtp->flags |= b3 & 0xc0;
+ cvtp->flags |= (b2 & 0x80) >> 2;
+ cvtp->lines = 1;
+ cvtp->flof = 0;
+ vbi->ppage = rvtp;
+ pll_add(vbi, 1, cvtp->errors);
+ conv2latin(p + 8, 32, cvtp->lang);
+ vbi_send(vbi, EV_HEADER, cvtp->pgno, cvtp->subno, cvtp->flags, p);
+
+ if (b1 == 0xff)
+ return 0;
+ cvtp->flags |= PG_ACTIVE;
+ init_enhance(rvtp->enh);
+ memcpy(cvtp->data[0]+0, p, 40);
+ memset(cvtp->data[0]+40, ' ', sizeof(cvtp->data)-40);
+ return 0;
+ }
+
+ case 1 ... 24:
+ {
+ pll_add(vbi, 1, err = chk_parity(p, 40));
+
+ if (~cvtp->flags & PG_ACTIVE)
+ return 0;
+
+ cvtp->errors += err;
+ cvtp->lines |= 1 << pkt;
+ conv2latin(p, 40, cvtp->lang);
+ memcpy(cvtp->data[pkt], p, 40);
+ return 0;
+ }
+ case 26:
+ {
+ int d, t[13];
+
+ if (~cvtp->flags & PG_ACTIVE)
+ return 0;
+
+ d = hamm8(p, &err);
+ if (err & 0xf000)
+ return 4;
+
+ for (i = 0; i < 13; ++i)
+ t[i] = hamm24(p + 1 + 3*i, &err);
+ if (err & 0xf000)
+ return 4;
+
+ add_enhance(rvtp->enh, d, t);
+ return 0;
+ }
+ case 27:
+ {
+ int b1,b2,b3,x;
+ if (~cvtp->flags & PG_ACTIVE)
+ return 0; // -1 flushes all pages. We may never resync again
+
+ b1 = hamm8(p, &err);
+ b2 = hamm8(p + 37, &err);
+ if (err & 0xf000)
+ return 4;
+ if (b1 != 0 || not(b2 & 8))
+ return 0;
+
+ for (i = 0; i < 6; ++i)
+ {
+ err = 0;
+ b1 = hamm16(p+1+6*i, &err);
+ b2 = hamm16(p+3+6*i, &err);
+ b3 = hamm16(p+5+6*i, &err);
+ if (err & 0xf000)
+ return 1;
+ x = (b2 >> 7) | ((b3 >> 5) & 0x06);
+ cvtp->link[i].pgno = ((mag ^ x) ?: 8) * 256 + b1;
+ cvtp->link[i].subno = (b2 + b3 * 256) & 0x3f7f;
+ }
+ cvtp->flof = 1;
+ return 0;
+ }
+ case 30:
+ {
+ if (mag8 != 8)
+ return 0;
+ p[0] = hamm8(p, &err); // designation code
+ p[1] = hamm16(p+1, &err); // initial page
+ p[3] = hamm16(p+3, &err); // initial subpage + mag
+ p[5] = hamm16(p+5, &err); // initial subpage + mag
+ if (err & 0xf000)
+ return 4;
+ err += chk_parity(p+20, 20);
+ conv2latin(p+20, 20, 0);
+ vbi_send(vbi, EV_XPACKET, mag8, pkt, err, p);
+ return 0;
+ }
+ default:
+ return 0;
+ }
+ return 0;
+}
+
+
+// called when new vbi data is waiting
+static void vbi_handler(struct vbi *vbi, int fd)
+{
+ double timestamp;
+ struct timeval timeout;
+ int lineCount;
+ int line;
+ int res;
+
+ timeout.tv_sec = 0;
+ timeout.tv_usec = 25000;
+ res = vbi_capture_read_sliced(pZvbiCapt, pZvbiData, &lineCount, &timestamp,
+ &timeout);
+ if (res > 0)
+ {
+ for (line=0; line < lineCount; line++)
+ {
+ if ((pZvbiData[line].id & VBI_SLICED_TELETEXT_B) != 0)
+ {
+ vt_line(vbi, pZvbiData[line].data);
+ }
+ }
+ }
+ else if (res < 0)
+ {
+ }
+}
+
+
+int vbi_add_handler(struct vbi *vbi, void *handler, void *data)
+{
+ struct vbi_client *cl;
+
+ if (not(cl = malloc(sizeof(*cl))))
+ return -1;
+ cl->handler = handler;
+ cl->data = data;
+ dl_insert_last(vbi->clients, cl->node);
+ return 0;
+}
+
+
+void vbi_del_handler(struct vbi *vbi, void *handler, void *data)
+{
+ struct vbi_client *cl;
+
+ for (cl = PTR vbi->clients->first; cl->node->next; cl = PTR cl->node->next)
+ if (cl->handler == handler && cl->data == data)
+ {
+ dl_remove(cl->node);
+ break;
+ }
+ return;
+}
+
+
+struct vbi * vbi_open(char *vbi_name, struct cache *ca,
+ const char *channel, char *outfile, u_int16_t sid, int ttpid)
+{
+ static int inited = 0;
+ struct vbi *vbi;
+ char * pErrStr;
+ int services;
+
+ if (vbi_name == NULL)
+ {
+ int i;
+ char *tried_devices = NULL;
+ char *old_tried_devices = NULL;
+ for (i = 0; vbi_names[i] != NULL; i++)
+ {
+ vbi_name = vbi_names[i];
+ // collect device names for the error message below
+ if (old_tried_devices)
+ {
+ if (asprintf(&tried_devices, "%s, %s", old_tried_devices, vbi_name) < 0)
+ tried_devices = NULL;
+ free(old_tried_devices);
+ }
+ else if (asprintf(&tried_devices, "%s", vbi_name) < 0)
+ tried_devices = NULL;
+ if (tried_devices == NULL)
+ out_of_mem(-1);
+ old_tried_devices = tried_devices;
+ if (access(vbi_name, R_OK) != 0)
+ continue;
+ vbi = vbi_open(vbi_name, ca, channel, outfile, sid, ttpid);
+ if (vbi != NULL)
+ {
+ if (tried_devices != NULL)
+ free(tried_devices);
+ return vbi;
+ }
+ }
+
+ error("could not open any of the standard devices (%s)", tried_devices);
+ free(tried_devices);
+ return NULL;
+ }
+
+ if (not inited)
+ lang_init();
+ inited = 1;
+
+ if (not(vbi = malloc(sizeof(*vbi))))
+ {
+ error("out of memory");
+ goto fail1;
+ }
+ if (!vbi_dvb_open(vbi, vbi_name, channel, outfile, sid, ttpid)) {
+ vbi->cache = ca;
+ dl_init(vbi->clients);
+ out_of_sync(vbi);
+ vbi->ppage = vbi->rpage;
+ fdset_add_fd(fds, vbi->fd, dvb_handler, vbi);
+ return vbi;
+ }
+
+ services = VBI_SLICED_TELETEXT_B;
+ pErrStr = NULL;
+ vbi->fd = -1;
+
+ pProxy = vbi_proxy_client_create(vbi_name, "alevt",
+ VBI_PROXY_CLIENT_NO_STATUS_IND, &pErrStr, ZVBI_TRACE);
+ if (pProxy != NULL)
+ {
+ pZvbiCapt = vbi_capture_proxy_new(pProxy, ZVBI_BUFFER_COUNT, 0,
+ &services, 0, &pErrStr);
+ if (pZvbiCapt == NULL)
+ {
+ vbi_proxy_client_destroy(pProxy);
+ pProxy = NULL;
+ }
+ }
+ if (pZvbiCapt == NULL)
+ pZvbiCapt = vbi_capture_v4l2_new(vbi_name, ZVBI_BUFFER_COUNT,
+ &services, 0, &pErrStr, ZVBI_TRACE);
+ if (pZvbiCapt == NULL)
+ pZvbiCapt = vbi_capture_v4l_new(vbi_name, 0, &services, 0, &pErrStr,
+ ZVBI_TRACE);
+
+ if (pZvbiCapt != NULL)
+ {
+ pZvbiRawDec = vbi_capture_parameters(pZvbiCapt);
+ if ((pZvbiRawDec != NULL) && ((services & VBI_SLICED_TELETEXT_B) != 0))
+ {
+ pZvbiData = malloc((pZvbiRawDec->count[0] + pZvbiRawDec->count[1]) \
+ * sizeof(*pZvbiData));
+
+ vbi->fd = vbi_capture_fd(pZvbiCapt);
+ }
+ else
+ vbi_capture_delete(pZvbiCapt);
+ }
+
+ if (pErrStr != NULL)
+ {
+ fprintf(stderr, "libzvbi: %s\n", pErrStr);
+ free(pErrStr);
+ }
+
+ if (vbi->fd == -1)
+ goto fail2;
+ vbi->cache = ca;
+ dl_init(vbi->clients);
+ out_of_sync(vbi);
+ vbi->ppage = vbi->rpage;
+ fdset_add_fd(fds, vbi->fd, vbi_handler, vbi);
+ return vbi;
+
+fail3:
+ close(vbi->fd);
+fail2:
+ free(vbi);
+fail1:
+ return 0;
+}
+
+
+void vbi_close(struct vbi *vbi)
+{
+ fdset_del_fd(fds, vbi->fd);
+ if (vbi->cache)
+ vbi->cache->op->close(vbi->cache);
+
+ if (pZvbiData != NULL)
+ free(pZvbiData);
+ pZvbiData = NULL;
+
+ if (pZvbiCapt != NULL)
+ {
+ vbi_capture_delete(pZvbiCapt);
+ pZvbiCapt = NULL;
+ }
+ if (pProxy != NULL)
+ {
+ vbi_proxy_client_destroy(pProxy);
+ pProxy = NULL;
+ }
+ free(vbi);
+}
+
+
+struct vt_page * vbi_query_page(struct vbi *vbi, int pgno, int subno)
+{
+ struct vt_page *vtp = 0;
+ if (vbi->cache)
+ vtp = vbi->cache->op->get(vbi->cache, pgno, subno);
+ if (vtp == 0)
+ {
+ return 0;
+ }
+ vbi_send(vbi, EV_PAGE, 1, 0, 0, vtp);
+ return vtp;
+}
+
+
+void vbi_reset(struct vbi *vbi)
+{
+ if (vbi->cache)
+ vbi->cache->op->reset(vbi->cache);
+ vbi_send(vbi, EV_RESET, 0, 0, 0, 0);
+}
+
+
+/* Starting from here: DVB API */
+#include <linux/dvb/dmx.h>
+#include <linux/dvb/frontend.h>
+#include <linux/dvb/video.h>
+
+static int dvb_get_table(int fd, u_int16_t pid, u_int8_t tblid, u_int8_t *buf,
+ size_t bufsz)
+{
+ struct dmx_sct_filter_params sctFilterParams;
+ struct pollfd pfd;
+ int r;
+ memset(&sctFilterParams, 0, sizeof(sctFilterParams));
+ sctFilterParams.pid = pid;
+ sctFilterParams.timeout = 10000;
+ sctFilterParams.flags = DMX_ONESHOT | DMX_IMMEDIATE_START | DMX_CHECK_CRC;
+ sctFilterParams.filter.filter[0] = tblid;
+ sctFilterParams.filter.mask[0] = 0xff;
+ if (ioctl(fd, DMX_SET_FILTER, &sctFilterParams)) {
+ perror("DMX_SET_FILTER");
+ return -1;
+ }
+ pfd.fd = fd;
+ pfd.events = POLLIN;
+ r = poll(&pfd, 1, 10000);
+ if (r < 0) {
+ perror("poll");
+ goto out;
+ }
+ if (r > 0) {
+ r = read(fd, buf, bufsz);
+ if (r < 0) {
+ perror("read");
+ goto out;
+ }
+ }
+ out:
+ ioctl(fd, DMX_STOP, 0);
+ return r;
+}
+
+static const u_int8_t byterev8[256] = {
+ 0x00, 0x80, 0x40, 0xc0, 0x20, 0xa0, 0x60, 0xe0,
+ 0x10, 0x90, 0x50, 0xd0, 0x30, 0xb0, 0x70, 0xf0,
+ 0x08, 0x88, 0x48, 0xc8, 0x28, 0xa8, 0x68, 0xe8,
+ 0x18, 0x98, 0x58, 0xd8, 0x38, 0xb8, 0x78, 0xf8,
+ 0x04, 0x84, 0x44, 0xc4, 0x24, 0xa4, 0x64, 0xe4,
+ 0x14, 0x94, 0x54, 0xd4, 0x34, 0xb4, 0x74, 0xf4,
+ 0x0c, 0x8c, 0x4c, 0xcc, 0x2c, 0xac, 0x6c, 0xec,
+ 0x1c, 0x9c, 0x5c, 0xdc, 0x3c, 0xbc, 0x7c, 0xfc,
+ 0x02, 0x82, 0x42, 0xc2, 0x22, 0xa2, 0x62, 0xe2,
+ 0x12, 0x92, 0x52, 0xd2, 0x32, 0xb2, 0x72, 0xf2,
+ 0x0a, 0x8a, 0x4a, 0xca, 0x2a, 0xaa, 0x6a, 0xea,
+ 0x1a, 0x9a, 0x5a, 0xda, 0x3a, 0xba, 0x7a, 0xfa,
+ 0x06, 0x86, 0x46, 0xc6, 0x26, 0xa6, 0x66, 0xe6,
+ 0x16, 0x96, 0x56, 0xd6, 0x36, 0xb6, 0x76, 0xf6,
+ 0x0e, 0x8e, 0x4e, 0xce, 0x2e, 0xae, 0x6e, 0xee,
+ 0x1e, 0x9e, 0x5e, 0xde, 0x3e, 0xbe, 0x7e, 0xfe,
+ 0x01, 0x81, 0x41, 0xc1, 0x21, 0xa1, 0x61, 0xe1,
+ 0x11, 0x91, 0x51, 0xd1, 0x31, 0xb1, 0x71, 0xf1,
+ 0x09, 0x89, 0x49, 0xc9, 0x29, 0xa9, 0x69, 0xe9,
+ 0x19, 0x99, 0x59, 0xd9, 0x39, 0xb9, 0x79, 0xf9,
+ 0x05, 0x85, 0x45, 0xc5, 0x25, 0xa5, 0x65, 0xe5,
+ 0x15, 0x95, 0x55, 0xd5, 0x35, 0xb5, 0x75, 0xf5,
+ 0x0d, 0x8d, 0x4d, 0xcd, 0x2d, 0xad, 0x6d, 0xed,
+ 0x1d, 0x9d, 0x5d, 0xdd, 0x3d, 0xbd, 0x7d, 0xfd,
+ 0x03, 0x83, 0x43, 0xc3, 0x23, 0xa3, 0x63, 0xe3,
+ 0x13, 0x93, 0x53, 0xd3, 0x33, 0xb3, 0x73, 0xf3,
+ 0x0b, 0x8b, 0x4b, 0xcb, 0x2b, 0xab, 0x6b, 0xeb,
+ 0x1b, 0x9b, 0x5b, 0xdb, 0x3b, 0xbb, 0x7b, 0xfb,
+ 0x07, 0x87, 0x47, 0xc7, 0x27, 0xa7, 0x67, 0xe7,
+ 0x17, 0x97, 0x57, 0xd7, 0x37, 0xb7, 0x77, 0xf7,
+ 0x0f, 0x8f, 0x4f, 0xcf, 0x2f, 0xaf, 0x6f, 0xef,
+ 0x1f, 0x9f, 0x5f, 0xdf, 0x3f, 0xbf, 0x7f, 0xff
+};
+
+static void dvb_handle_pes_payload(struct vbi *vbi, const u_int8_t *buf,
+ unsigned int len)
+{
+ unsigned int p, i;
+ u_int8_t data[42];
+
+ if (buf[0] < 0x10 || buf[0] > 0x1f)
+ return; /* no EBU teletext data */
+ for (p = 1; p < len; p += /*6 + 40*/ 2 + buf[p + 1]) {
+#if 0
+ printf("Txt Line:\n"
+ " data_unit_id 0x%02x\n"
+ " data_unit_length 0x%02x\n"
+ " reserved_for_future_use 0x%01x\n"
+ " field_parity 0x%01x\n"
+ " line_offset 0x%02x\n"
+ " framing_code 0x%02x\n"
+ " magazine_and_packet_addr 0x%04x\n"
+ " data_block 0x%02x 0x%02x 0x%02x 0x%02x\n",
+ buf[p], buf[p+1],
+ buf[p+2] >> 6,
+ (buf[p+2] >> 5) & 1,
+ buf[p+2] & 0x1f,
+ buf[p+3],
+ (buf[p+4] << 8) | buf[p+5],
+ buf[p+6], buf[p+7], buf[p+8], buf[p+9]);
+#endif
+ for (i = 0; i < sizeof(data); i++)
+ data[i] = byterev8[buf[p+4+i]];
+ /* note: we should probably check for missing lines and then
+ * call out_of_sync(vbi); and/or vbi_reset(vbi); */
+ vt_line(vbi, data);
+ }
+}
+
+static unsigned int rawptr;
+
+static void dvb_handler(struct vbi *vbi, int fd)
+{
+ /* PES packet start code prefix and stream_id == private_stream_1 */
+ static const u_int8_t peshdr[4] = { 0x00, 0x00, 0x01, 0xbd };
+ u_int8_t *bp;
+ int n;
+ unsigned int p, i, len;
+ u_int16_t rpid;
+ u_int32_t crc, crccomp;
+
+ if (rawptr >= (unsigned int)rawbuf_size)
+ rawptr = 0;
+ n = read(vbi->fd, rawbuf + rawptr, rawbuf_size - rawptr);
+ if (n <= 0)
+ return;
+ rawptr += n;
+ if (rawptr < 6)
+ return;
+ if (memcmp(rawbuf, peshdr, sizeof(peshdr))) {
+ bp = memmem(rawbuf, rawptr, peshdr, sizeof(peshdr));
+ if (!bp)
+ return;
+ rawptr -= (bp - rawbuf);
+ memmove(rawbuf, bp, rawptr);
+ if (rawptr < 6)
+ return;
+ }
+ len = (rawbuf[4] << 8) | rawbuf[5];
+ if (len < 9) {
+ rawptr = 0;
+ return;
+ }
+ if (rawptr < len + 6)
+ return;
+ p = 9 + rawbuf[8];
+#if 0
+ for (i = 0; i < len - p; i++) {
+ if (!(i & 15))
+ printf("\n%04x:", i);
+ printf(" %02x", rawbuf[p + i]);
+ }
+ printf("\n");
+#endif
+ if (!dl_empty(vbi->clients))
+ dvb_handle_pes_payload(vbi, rawbuf + p, len - p);
+ rawptr -= len;
+ if (rawptr)
+ memmove(rawbuf, rawbuf + len, rawptr);
+}
+
+
+static int vbi_dvb_open(struct vbi *vbi, const char *vbi_name,
+ const char *channel, char *outfile, u_int16_t sid, int ttpid)
+{
+ struct {
+ u_int16_t pmtpid;
+ u_int16_t ttpid;
+ u_int16_t service_id;
+ u_int8_t service_type;
+ char service_provider_name[64];
+ char service_name[64];
+ u_int8_t txtlang[3];
+ u_int8_t txttype;
+ u_int8_t txtmagazine;
+ u_int8_t txtpage;
+ } progtbl[16], *progp;
+ u_int8_t tbl[4096];
+ u_int8_t * ppname, * psname, pncode, sncode, pnlen, snlen;
+ int r;
+ FILE *ofd;
+ unsigned int i, j, k, l, progcnt = 0;
+ struct dmx_pes_filter_params filterpar;
+
+ /* open DVB demux device */
+ if (!vbi_name)
+ vbi_name = "/dev/dvb/adapter0/demux0";
+ if ((vbi->fd = open(vbi_name, O_RDWR)) == -1) {
+ error("cannot open demux device %s", vbi_name);
+ return -1;
+ }
+ memset(progtbl, 0, sizeof(progtbl));
+ if (ttpid >= 0x15 && ttpid < 0x1fff) {
+ vbi->ttpid = ttpid;
+ printf("Using command line specified teletext PID 0x%x\n",
+ vbi->ttpid);
+ goto ttpidfound;
+ }
+ /* parse PAT to enumerate services and to find the PMT PIDs */
+ r = dvb_get_table(vbi->fd, 0, 0, tbl, sizeof(tbl));
+ if (r == -1)
+ goto outerr;
+ if (!(tbl[5] & 1)) {
+ error("PAT not active (current_next_indicator == 0)");
+ goto outerr;
+ }
+ if (tbl[6] != 0 || tbl[7] != 0) {
+ error("PAT has multiple sections");
+ goto outerr;
+ }
+ if (r < 13) {
+ error("PAT too short\n");
+ goto outerr;
+ }
+ r -= 13;
+ for (i = 0; i < (unsigned)r; i += 4) {
+ if (progcnt >= sizeof(progtbl)/sizeof(progtbl[0])) {
+ error("Program table overflow");
+ goto outerr;
+ }
+ progtbl[progcnt].service_id = (tbl[8 + i] << 8) | tbl[9 + i];
+ if (!progtbl[progcnt].service_id) /* this is the NIT pointer */
+ continue;
+ progtbl[progcnt].pmtpid = ((tbl[10 + i] << 8) | tbl[11 + i])
+ & 0x1fff;
+ progcnt++;
+ }
+ /* find the SDT to get the station names */
+ r = dvb_get_table(vbi->fd, 0x11, 0x42, tbl, sizeof(tbl));
+ if (r == -1)
+ goto outerr;
+ if (!(tbl[5] & 1)) {
+ error("SDT not active (current_next_indicator == 0)");
+ goto outerr;
+ }
+ if (tbl[6] != 0 || tbl[7] != 0) {
+ error("SDT has multiple sections");
+ goto outerr;
+ }
+ if (r < 12) {
+ error("SDT too short\n");
+ goto outerr;
+ }
+ i = 11;
+ while (i < (unsigned)r - 1) {
+ k = (tbl[i] << 8) | tbl[i+1]; /* service ID */
+ progp = NULL;
+ for (j = 0; j < progcnt; j++)
+ if (progtbl[j].service_id == k) {
+ progp = &progtbl[j];
+ break;
+ }
+ j = i + 5;
+ i = j + (((tbl[i+3] << 8) | tbl[i+4]) & 0x0fff);
+ if (!progp) {
+ error("SDT: service_id 0x%x not in PAT\n", k);
+ continue;
+ }
+ while (j < i) {
+ switch (tbl[j]) {
+ case 0x48: // service descriptor
+ k = j + 4 + tbl[j + 3];
+ progp->service_type = tbl[j+2];
+ ppname = tbl+j+4 ; // points to 1st byte of provider_name
+ pncode = *ppname ; // 1st byte of provider_name
+ pnlen = tbl[j+3]; // length of provider_name
+ psname = tbl+k+1 ; // points to 1st byte of service_name
+ sncode = *psname ; // 1st byte of service_name
+ snlen = tbl[k] ; // length of service_name
+ if (pncode >= 0x20) {
+ pncode = 0 ; // default character set Latin alphabet fig.A.1
+ } else {
+ ppname++ ; pnlen-- ;
+ // character code from table A.3 1st byte = ctrl-code
+ }
+ if (sncode >= 0x20) {
+ sncode = 0 ; // default character set Latin alphabet fig.A.1
+ } else {
+ psname++ ; snlen-- ;
+ // character code from table A.3 ; 1st byte = ctrl-code
+ }
+ snprintf(progp->service_provider_name,
+ sizeof(progp->service_provider_name), "%.*s", pnlen, ppname);
+ snprintf(progp->service_name,
+ sizeof(progp->service_name), "%.*s", snlen, psname); break;
+ }
+ j += 2 + tbl[j + 1]; // next descriptor
+ }
+ }
+ /* parse PMT's to find Teletext Services */
+ for (l = 0; l < progcnt; l++) {
+ progtbl[l].ttpid = 0x1fff;
+ if (progtbl[l].service_type != 0x01 || /* not digital TV */
+ progtbl[l].pmtpid < 0x15 || /* PMT PID sanity check */
+ progtbl[l].pmtpid >= 0x1fff)
+ continue;
+ r = dvb_get_table(vbi->fd, progtbl[l].pmtpid, 0x02, tbl,
+ sizeof(tbl));
+ if (r == -1)
+ goto outerr;
+ if (!(tbl[5] & 1)) { error \
+ ("PMT pid 0x%x not active (current_next_indicator == 0)",
+ progtbl[l].pmtpid);
+ goto outerr;
+ }
+ if (tbl[6] != 0 || tbl[7] != 0) {
+ error("PMT pid 0x%x has multiple sections",
+ progtbl[l].pmtpid);
+ goto outerr;
+ }
+ if (r < 13) {
+ error("PMT pid 0x%x too short\n", progtbl[l].pmtpid);
+ goto outerr;
+ }
+ i = 12 + (((tbl[10] << 8) | tbl[11]) & 0x0fff);
+ /* skip program info section */
+ while (i <= (unsigned)r-6) {
+ j = i + 5;
+ i = j + (((tbl[i + 3] << 8) | tbl[i + 4]) & 0x0fff);
+ if (tbl[j - 5] != 0x06)
+ /* teletext streams have type 0x06 */
+ continue;
+ k = ((tbl[j - 4] << 8) | tbl[j - 3]) & 0x1fff;
+ /* elementary PID - save until we know if it's teletext PID */
+ while (j < i) {
+ switch (tbl[j]) {
+ case 0x56: /* EBU teletext descriptor */
+ progtbl[l].txtlang[0] = tbl[j + 2];
+ progtbl[l].txtlang[1] = tbl[j + 3];
+ progtbl[l].txtlang[2] = tbl[j + 4];
+ progtbl[l].txttype = tbl[j + 5] >> 3;
+ progtbl[l].txtmagazine = tbl[j + 5] & 7;
+ progtbl[l].txtpage = tbl[j + 6];
+ progtbl[l].ttpid = k;
+ break;
+ }
+ j += 2 + tbl[j + 1];
+ }
+ }
+ }
+
+ printf \
+ ("sid:pmtpid:ttpid:type:provider:name:language:texttype:magazine:page\n\n");
+ for (i = 0; i < progcnt; i++) {
+ printf("%d:%d:%d:%d:%s:%s:lang=%.3s:type=%d:magazine=%1u:page=%3u\n",
+ progtbl[i].service_id, progtbl[i].pmtpid, progtbl[i].ttpid,
+ progtbl[i].service_type, progtbl[i].service_provider_name,
+ progtbl[i].service_name, progtbl[i].txtlang, progtbl[i].txttype,
+ progtbl[i].txtmagazine, progtbl[i].txtpage);
+ }
+
+ if (*outfile) {
+ ofd = fopen(outfile,"w") ;
+ if (ofd == NULL) { error("cannot open outfile\n"); goto outerr ; }
+ for (i = 0; i < progcnt; i++) {
+ if (progtbl[i].ttpid == 0x1fff) continue ; // service without teletext
+ fprintf(ofd,"%d:%d:%s:%s:lang=%.3s\n",
+ progtbl[i].service_id, progtbl[i].ttpid, progtbl[i].service_provider_name,
+ progtbl[i].service_name, progtbl[i].txtlang);
+ }
+ fclose(ofd) ;
+ }
+
+ progp = NULL;
+
+ if (channel) {
+ j = strlen(channel);
+ for (i = 0; i < progcnt; i++)
+ if (!strncmp(progtbl[i].service_name, channel, j)
+ && progtbl[i].ttpid != 0x1fff) { progp = &progtbl[i];
+ break ;
+ }
+ }
+
+ if (channel && !progp) {
+ j = strlen(channel);
+ for (i = 0; i < progcnt; i++)
+ if (!strncasecmp(progtbl[i].service_name, channel, j)
+ && progtbl[i].ttpid != 0x1fff) { progp = &progtbl[i];
+ break ;
+ }
+ }
+
+ if (sid) {
+ for (i = 0; i < progcnt; i++) {
+ if ((progtbl[i].service_id == sid) && (progtbl[i].ttpid != 0x1fff)) {
+ progp = &progtbl[i]; break ; }
+ }
+ }
+
+ if (!progp) {
+ for (i = 0; i < progcnt; i++)
+ if (progtbl[i].ttpid != 0x1fff) {
+ progp = &progtbl[i]; break ;
+ }
+ }
+
+ printf("\nUsing: Service ID = %d ; PMT PID = %d ; TXT PID = %d ;\n"
+ "Service type = %d ; Provider Name = %s ; Service name = %s ;\n"
+ "language = %.3s ; Text type = %d ; Text Magazine = %1u ; Text page = %3u\n",
+ progp->service_id, progp->pmtpid, progp->ttpid, progp->service_type,
+ progp->service_provider_name, progp->service_name, progp->txtlang,
+ progp->txttype, progp->txtmagazine, progp->txtpage);
+ vbi->ttpid = progp->ttpid;
+
+ ttpidfound:
+ rawbuf = malloc(rawbuf_size = 8192);
+ if (!rawbuf)
+ goto outerr;
+ rawptr = 0;
+#if 0
+ close(vbi->fd);
+ if ((vbi->fd = open(vbi_name, O_RDWR)) == -1) {
+ error("cannot open demux device %s", vbi_name);
+ return -1;
+ }
+#endif
+ memset(&filterpar, 0, sizeof(filterpar));
+ filterpar.pid = vbi->ttpid;
+ filterpar.input = DMX_IN_FRONTEND;
+ filterpar.output = DMX_OUT_TAP;
+ filterpar.pes_type = DMX_PES_OTHER;
+ filterpar.flags = DMX_IMMEDIATE_START;
+ if (ioctl(vbi->fd, DMX_SET_PES_FILTER, &filterpar) < 0) {
+ error("ioctl: DMX_SET_PES_FILTER %s (%u)", strerror(errno), errno);
+ goto outerr;
+ }
+ return 0;
+
+ outerr:
+ close(vbi->fd);
+ vbi->fd = -1;
+ return -1;
+}
+
+
+struct vbi *open_null_vbi(struct cache *ca)
+{
+ static int inited = 0;
+ struct vbi *vbi;
+
+ if (not inited)
+ lang_init();
+ inited = 1;
+
+ vbi = malloc(sizeof(*vbi));
+ if (!vbi)
+ {
+ error("out of memory");
+ goto fail1;
+ }
+
+ vbi->fd = open("/dev/null", O_RDONLY);
+ if (vbi->fd == -1)
+ {
+ error("cannot open null device");
+ goto fail2;
+ }
+
+ vbi->ttpid = -1;
+ out_of_sync(vbi);
+ vbi->ppage = vbi->rpage;
+ fdset_add_fd(fds, vbi->fd, vbi_handler, vbi);
+ return vbi;
+
+fail3:
+ close(vbi->fd);
+fail2:
+ free(vbi);
+fail1:
+ return 0;
+}
+
+
+void send_errmsg(struct vbi *vbi, char *errmsg, ...)
+{
+ va_list args;
+ if (errmsg == NULL || *errmsg == '\0')
+ return;
+ va_start(args, errmsg);
+ char *buff = NULL;
+ if (vasprintf(&buff, errmsg, args) < 0)
+ buff = NULL;
+ va_end(args);
+ if(buff == NULL)
+ out_of_mem(-1);
+ vbi_send(vbi, EV_ERR, 0, 0, 0, buff);
+}
diff --git a/util/alevt/vbi.h b/util/alevt/vbi.h
new file mode 100644
index 0000000..edb9dab
--- /dev/null
+++ b/util/alevt/vbi.h
@@ -0,0 +1,47 @@
+#ifndef VBI_H
+#define VBI_H
+
+#include "vt.h"
+#include "dllist.h"
+#include "cache.h"
+#include "lang.h"
+
+#define PLL_ADJUST 4
+
+struct raw_page
+{
+ struct vt_page page[1];
+ struct enhance enh[1];
+};
+
+struct vbi
+{
+ int fd;
+ struct cache *cache;
+ struct dl_head clients[1];
+ // page assembly
+ struct raw_page rpage[8]; // one for each magazin
+ struct raw_page *ppage; // points to page of previous pkt0
+ // DVB stuff
+ unsigned int ttpid;
+ u_int16_t sid;
+};
+
+struct vbi_client
+{
+ struct dl_node node[1];
+ void (*handler)(void *data, struct vt_event *ev);
+ void *data;
+};
+
+struct vbi *vbi_open(char *vbi_dev_name, struct cache *ca,
+ const char *channel, char *outfile, u_int16_t sid, int ttpid);
+void vbi_close(struct vbi *vbi);
+void vbi_reset(struct vbi *vbi);
+int vbi_add_handler(struct vbi *vbi, void *handler, void *data);
+void vbi_del_handler(struct vbi *vbi, void *handler, void *data);
+struct vt_page *vbi_query_page(struct vbi *vbi, int pgno, int subno);
+
+struct vbi *open_null_vbi(struct cache *ca);
+void send_errmsg(struct vbi *vbi, char *errmsg, ...);
+#endif
diff --git a/util/alevt/vt.h b/util/alevt/vt.h
new file mode 100644
index 0000000..75986e8
--- /dev/null
+++ b/util/alevt/vt.h
@@ -0,0 +1,62 @@
+#ifndef VT_H
+#define VT_H
+
+#include "misc.h"
+
+#define W 40
+#define H 25
+#define BAD_CHAR 0xb8 // substitute for chars with bad parity
+
+struct vt_event
+{
+ int type;
+ void *resource; /* struct xio_win *, struct vbi *, ... */
+ int i1, i2, i3, i4;
+ void *p1;
+};
+
+#define EV_CLOSE 1
+#define EV_KEY 2 // i1:KEY_xxx i2:shift-flag
+#define EV_MOUSE 3 // i1:button i2:shift-flag i3:x i4:y
+#define EV_SELECTION 4 // i1:len p1:data
+#define EV_PAGE 5 // p1:vt_page i1:query-flag
+#define EV_HEADER 6 // i1:pgno i2:subno i3:flags p1:data
+#define EV_XPACKET 7 // i1:mag i2:pkt i3:errors p1:data
+#define EV_RESET 8 // ./.
+#define EV_TIMER 9 // ./.
+#define EV_ERR 10 // p1: errmsg
+#define KEY_F(i) (1000+i)
+#define KEY_LEFT 2001
+#define KEY_RIGHT 2002
+#define KEY_UP 2003
+#define KEY_DOWN 2004
+#define KEY_PUP 2005
+#define KEY_PDOWN 2006
+#define KEY_DEL 2007
+#define KEY_INS 2008
+
+struct vt_page
+{
+ int pgno, subno; // the wanted page number
+ int lang; // language code
+ int flags; // misc flags (see PG_xxx below)
+ int errors; // number of single bit errors in page
+ u32 lines; // 1 bit for each line received
+ u8 data[25][40]; // page contents
+ int flof; // page has FastText links
+ struct {
+ int pgno;
+ int subno;
+ } link[6]; // FastText links (FLOF)
+};
+
+#define PG_SUPPHEADER 0x01 // C7 row 0 is not to be displayed
+#define PG_OUTOFSEQ 0x04 // C9 page out of numerical order
+#define PG_NODISPLAY 0x08 // C10 rows 1-24 is not to be displayed
+#define PG_MAGSERIAL 0x10 // C11 serial trans. (any pkt0 terminates page)
+#define PG_ERASE 0x20 // C4 clear previously stored lines
+#define PG_NEWSFLASH 0x40 // C5 box it and insert into normal video pict.
+#define PG_SUBTITLE 0x80 // C6 box it and insert into normal video pict.
+#define PG_ACTIVE 0x100 // currently fetching this page
+#define ANY_SUB 0x3f7f // universal subpage number
+#endif
diff --git a/util/alevt/vt900.out b/util/alevt/vt900.out
new file mode 100644
index 0000000..558ee67
--- /dev/null
+++ b/util/alevt/vt900.out
@@ -0,0 +1,29 @@
+#ifndef HELP_HEADER
+" \6AleVT Online Help System ",
+" \22`p0`0 p `0pppp ",
+"\4\35\22\177 \177j5`p \177 j5 j5 \7Version \34",
+"\4\35\22\177,\177j5\177.! +t>! j5 \7 1.7.0 \34",
+" \22# #\42!\42# \42 \42! ",
+#else
+HELP_HEADER
+#endif
+" ",
+"\6\15Contents: ",
+"\6\15Contents: ",
+"\24 #################################### ",
+" ",
+" \3\177\6Starting alevt . . . . . . 902 ",
+" ",
+" \3\177\6Copying/Warranty . . . . . 904 ",
+" ",
+" \3\177\6The Status Line . . . . . 905 ",
+" ",
+" \3\177\6Selecting Pages . . . . . 907 ",
+" ",
+" \3\177\6QuickClick Page . . . . . 915 ",
+" ",
+"\24 pppppppppppppppppppppppppppppppppppp ",
+" (Click to select a page) ",
+" ",
+"\4\35\7 Next 901 \34",
+"\1Page 100 \2Page 200 \3Page 300 \6Page 400\34",
diff --git a/util/alevt/vt901.out b/util/alevt/vt901.out
new file mode 100644
index 0000000..1bde77c
--- /dev/null
+++ b/util/alevt/vt901.out
@@ -0,0 +1,29 @@
+#ifndef HELP_HEADER
+" \6AleVT Online Help System ",
+" \22`p0`0 p `0pppp ",
+"\4\35\22\177 \177j5`p \177 j5 j5 \7Version \34",
+"\4\35\22\177,\177j5\177.! +t>! j5 \7 1.7.0 \34",
+" \22# #\42!\42# \42 \42! ",
+#else
+HELP_HEADER
+#endif
+" ",
+"\6\15Contents: ",
+"\6\15Contents: ",
+"\24 #################################### ",
+" ",
+"\6 \3\177\6FastText Menu . . . . . . 909 ",
+"\6 ",
+"\6 \3\177\6Keyboard Commands . . . . 910 ",
+"\6 ",
+"\6 \3\177\6Starting alevt-cap . . . . 912 ",
+"\6 ",
+"\6 \3\177\6Starting alevt-date . . . 914 ",
+"\6 ",
+"\6 \3\177\6QuickClick Page . . . . . 915 ",
+" ",
+"\24 pppppppppppppppppppppppppppppppppppp ",
+" (Click to select a page) ",
+" ",
+"\4\35\7Back 900 Index 900 Next 902 \34",
+"\1Page 100 \2Page 200 \3Page 300 \6Page 400\34",
diff --git a/util/alevt/vt902.out b/util/alevt/vt902.out
new file mode 100644
index 0000000..665b41d
--- /dev/null
+++ b/util/alevt/vt902.out
@@ -0,0 +1,29 @@
+#ifndef HELP_HEADER
+" \6AleVT Online Help System ",
+" \22`p0`0 p `0pppp ",
+"\4\35\22\177 \177j5`p \177 j5 j5 \7 Version \34",
+"\4\35\22\177,\177j5\177.! +t>! j5 \7 1.7.0 \34",
+" \22# #\42!\42# \42 \42! ",
+#else
+HELP_HEADER
+#endif
+" ",
+"\6\15Starting alevt: ",
+"\6\15Starting alevt: ",
+"\24 #################################### ",
+"\6 $\7alevt\6[options] Default: ",
+" ",
+" -c\6<channel name> (none;dvb only) ",
+" -ch -child\6<ppp.ss> (none) ",
+" -cs -charset \6latin-1 ",
+" \6<latin-1/2/koi8-r/ ",
+" \6iso8859-7> ",
+" -h -help ",
+" ",
+" ",
+" ",
+"\24 pppppppppppppppppppppppppppppppppppp ",
+" ",
+" ",
+"\4\35\7Back 901 Index 900 Next 903 \34",
+"\1Page 100 \2Page 200 \3Page 300 \6Page 400\34",
diff --git a/util/alevt/vt903.out b/util/alevt/vt903.out
new file mode 100644
index 0000000..0df75c1
--- /dev/null
+++ b/util/alevt/vt903.out
@@ -0,0 +1,29 @@
+#ifndef HELP_HEADER
+" \6AleVT Online Help System ",
+" \22`p0`0 p `0pppp ",
+"\4\35\22\177 \177j5`p \177 j5 j5 \7Version \34",
+"\4\35\22\177,\177j5\177.! +t>! j5 \7 1.7.0 \34",
+" \22# #\42!\42# \42 \42! ",
+#else
+HELP_HEADER
+#endif
+" ",
+"\6\15Starting alevt: ",
+"\6\15Starting alevt: ",
+"\24 #################################### ",
+"\6 $\7alevt\6[options] Default: ",
+" -o\6<outfile> (none;dvb only) ",
+" -p -parent\6<ppp.ss> 900 ",
+" -s -sid\6<sid> (none;dvb only) ",
+" -t -ttpid\6<ttpid> (none;dvb only) ",
+" -v -vbi\6<vbidev> /dev/vbi ",
+" \6/dev/vbi0 ",
+" \6/dev/video0 ",
+" \6/dev/dvb/adapter0/demux0 ",
+" ",
+" ",
+"\24 pppppppppppppppppppppppppppppppppppp ",
+" ",
+" ",
+"\4\35\7Back 902 Index 900 Next 904 \34",
+"\1Page 100 \2Page 200 \3Page 300 \6Page 400\34",
diff --git a/util/alevt/vt904.out b/util/alevt/vt904.out
new file mode 100644
index 0000000..d13dcfd
--- /dev/null
+++ b/util/alevt/vt904.out
@@ -0,0 +1,29 @@
+#ifndef HELP_HEADER
+" \6AleVT Online Help System ",
+" \22`p0`0 p `0pppp ",
+"\4\35\22\177 \177j5`p \177 j5 j5 \7Version \34",
+"\4\35\22\177,\177j5\177.! +t>! j5 \7 1.7.0 \34",
+" \22# #\42!\42# \42 \42! ",
+#else
+HELP_HEADER
+#endif
+" ",
+"\6\15Copying: ",
+"\6\15Copying: ",
+"\24 #################################### ",
+"\6 2002-07 Edgar Toernig (froese@gmx.de) ",
+"\6 All Rights Reserved. ",
+"\6 ",
+"\6 This program is free software; you ",
+"\6 can redistribute it and/or modify it ",
+"\6 under the terms of the GNU General ",
+"\6 Public License Version 2 as published ",
+"\6 by the Free Software Foundation. ",
+"\6 ",
+"\6 This program is distributed in the ",
+"\6 hope that it will be useful, but ",
+"\6\7without any warranty.\6See the GNU ",
+"\6 General Public License for details. ",
+" ",
+"\4\35\7Back 903 Index 900 Next 905 \34",
+"\1Page 100 \2Page 200 \3Page 300 \6Page 400\34",
diff --git a/util/alevt/vt905.out b/util/alevt/vt905.out
new file mode 100644
index 0000000..b445ebb
--- /dev/null
+++ b/util/alevt/vt905.out
@@ -0,0 +1,29 @@
+#ifndef HELP_HEADER
+" \6AleVT Online Help System ",
+" \22`p0`0 p `0pppp ",
+"\4\35\22\177 \177j5`p \177 j5 j5 \7Version \34",
+"\4\35\22\177,\177j5\177.! +t>! j5 \7 1.7.0 \34",
+" \22# #\42!\42# \42 \42! ",
+#else
+HELP_HEADER
+#endif
+" ",
+"\6\15Status Line: ",
+"\6\15Status Line: ",
+"\24 #################################### ",
+"\6 The top line of each window is the ",
+"\6 status line. On the left it shows ",
+"\6 the current page number (CPN) and ",
+"\6 some flags. The rest of the line ",
+"\6 is the running header sent by the ",
+"\6 TV station. ",
+"\6 ",
+"\6 If the CPN is red, the program is ",
+"\6 searching for that page. If it's ",
+"\6 green, it's the PN of the currently ",
+"\6 displayed page. ",
+"\24 pppppppppppppppppppppppppppppppppppp ",
+" ",
+" ",
+"\4\35\7Back 904 Index 900 Next 906 \34",
+"\1Page 100 \2Page 200 \3Page 300 \6Page 400\34",
diff --git a/util/alevt/vt906.out b/util/alevt/vt906.out
new file mode 100644
index 0000000..156b481
--- /dev/null
+++ b/util/alevt/vt906.out
@@ -0,0 +1,29 @@
+#ifndef HELP_HEADER
+" \6AleVT Online Help System ",
+" \22`p0`0 p `0pppp ",
+"\4\35\22\177 \177j5`p \177 j5 j5 \7Version \34",
+"\4\35\22\177,\177j5\177.! +t>! j5 \7 1.7.0 \34",
+" \22# #\42!\42# \42 \42! ",
+#else
+HELP_HEADER
+#endif
+" ",
+"\6\15Status Line: \14\5\30 ",
+"\6\15Status Line: \14\5\30 ",
+"\24 #################################### ",
+"\6 An\2H\6behind the CPN indicates that ",
+"\6 the page is on hold. This inhibits ",
+"\6 subpage cycling and page updates. A ",
+"\6 click on the CPN toggles the\2H\6flag.",
+" ",
+"\6 A\5*\6indicates that the page ",
+"\6 contains concealed text. Clicking on ",
+"\6 the\5*\6reveals that text. ",
+" ",
+"\6 A CPN in the form\2Sxx\6is shown if a ",
+"\6 specific subpage is selected. ",
+"\24 pppppppppppppppppppppppppppppppppppp ",
+" ",
+" ",
+"\4\35\7Back 905 Index 900 Next 907 \34",
+"\1Page 100 \2Page 200 \3Page 300 \6Page 400\34",
diff --git a/util/alevt/vt907.out b/util/alevt/vt907.out
new file mode 100644
index 0000000..6aeb4e6
--- /dev/null
+++ b/util/alevt/vt907.out
@@ -0,0 +1,29 @@
+#ifndef HELP_HEADER
+" \6AleVT Online Help System ",
+" \22`p0`0 p `0pppp ",
+"\4\35\22\177 \177j5`p \177 j5 j5 \7Version \34",
+"\4\35\22\177,\177j5\177.! +t>! j5 \7 1.7.0 \34",
+" \22# #\42!\42# \42 \42! ",
+#else
+HELP_HEADER
+#endif
+" ",
+"\6\15Selecting Pages: ",
+"\6\15Selecting Pages: ",
+"\24 #################################### ",
+"\6 To select a specific page, you may ",
+"\6 either enter the page number with ",
+"\6 the keyboard or click with the\7left ",
+"\6 mouse button on a page number ",
+"\6 somewhere on the screen. ",
+"\6 ",
+"\6 Clicking with the\7middle\6button will ",
+"\6 show the page in a child window. If ",
+"\6 there is no child window, a new one ",
+"\6 will be opened. ",
+"\6 ",
+"\24 pppppppppppppppppppppppppppppppppppp ",
+" ",
+" ",
+"\4\35\7Back 906 Index 900 Next 908 \34",
+"\1Page 100 \2Page 200 \3Page 300 \6Page 400\34",
diff --git a/util/alevt/vt908.out b/util/alevt/vt908.out
new file mode 100644
index 0000000..851a9b5
--- /dev/null
+++ b/util/alevt/vt908.out
@@ -0,0 +1,29 @@
+#ifndef HELP_HEADER
+" \6AleVT Online Help System ",
+" \22`p0`0 p `0pppp ",
+"\4\35\22\177 \177j5`p \177 j5 j5 \7Version \34",
+"\4\35\22\177,\177j5\177.! +t>! j5 \7 1.7.0 \34",
+" \22# #\42!\42# \42 \42! ",
+#else
+HELP_HEADER
+#endif
+" ",
+"\6\15Selecting Pages: ",
+"\6\15Selecting Pages: ",
+"\24 #################################### ",
+"\6 AleVT also recognizes something like ",
+"\3 3/7\6as a valid page number. Clicking ",
+"\6 with the\7left\6button will cycle to ",
+"\6 the next subpage of the current page. ",
+"\6 The\7middle\6buttons cycles backwards. ",
+"\6 ",
+"\6 For each window a history of ",
+"\6 recently visited pages is kept. ",
+"\6 Pressing the\7right\6mouse button will ",
+"\6 take you back to the previous page. ",
+"\6 ",
+"\24 pppppppppppppppppppppppppppppppppppp ",
+" ",
+" ",
+"\4\35\7Back 907 Index 900 Next 909 \34",
+"\1Page 100 \2Page 200 \3Page 300 \6Page 400\34",
diff --git a/util/alevt/vt909.out b/util/alevt/vt909.out
new file mode 100644
index 0000000..0b28450
--- /dev/null
+++ b/util/alevt/vt909.out
@@ -0,0 +1,29 @@
+#ifndef HELP_HEADER
+" \6AleVT Online Help System ",
+" \22`p0`0 p `0pppp ",
+"\4\35\22\177 \177j5`p \177 j5 j5 \7Version \34",
+"\4\35\22\177,\177j5\177.! +t>! j5 \7 1.7.0 \34",
+" \22# #\42!\42# \42 \42! ",
+#else
+HELP_HEADER
+#endif
+" ",
+"\6\15FastText Menu: ",
+"\6\15FastText Menu: ",
+"\24 #################################### ",
+"\6 The last line of each window shows ",
+"\6 the FastText Menu (only if one is ",
+"\6 transmitted for that page). ",
+"\6 ",
+"\6 It consists of up to four colored ",
+"\6 labels. You may click on a label ",
+"\6 or press one of the function keys ",
+"\6 F1-F4 to go to the associated page. ",
+"\6 ",
+"\6 For the 5th (white) key present on ",
+"\6 some remote controls press F5. ",
+"\24 pppppppppppppppppppppppppppppppppppp ",
+" ",
+" ",
+"\4\35\7Back 908 Index 900 Next 910 \34",
+"\1Page 100 \2Page 200 \3Page 300 \6Page 400\34",
diff --git a/util/alevt/vt910.out b/util/alevt/vt910.out
new file mode 100644
index 0000000..d3a2095
--- /dev/null
+++ b/util/alevt/vt910.out
@@ -0,0 +1,29 @@
+#ifndef HELP_HEADER
+" \6AleVT Online Help System ",
+" \22`p0`0 p `0pppp ",
+"\4\35\22\177 \177j5`p \177 j5 j5 \7Version \34",
+"\4\35\22\177,\177j5\177.! +t>! j5 \7 1.7.0 \34",
+" \22# #\42!\42# \42 \42! ",
+#else
+HELP_HEADER
+#endif
+" ",
+"\6\15Keyboard Commands: ",
+"\6\15Keyboard Commands: ",
+"\24 #################################### ",
+" 0\6-\0079 \6Enter page number ",
+" q\6or\7ESC \6Close window ",
+" h \6Goto page 900 (help page) ",
+" i \6Goto page 100 (index page) ",
+" o \6Open a new window ",
+" SPACE \6Hold page ",
+" RIGHT \6Goto next page ",
+" LEFT \6Goto previous page ",
+" DOWN \6Goto next subpage ",
+" UP \6Goto previous subpage ",
+" BACKSPACE\6Previous page from history ",
+"\24 pppppppppppppppppppppppppppppppppppp ",
+" ",
+" ",
+"\4\35\7Back 909 Index 900 Next 911 \34",
+"\1Page 100 \2Page 200 \3Page 300 \6Page 400\34",
diff --git a/util/alevt/vt911.out b/util/alevt/vt911.out
new file mode 100644
index 0000000..49e6cc1
--- /dev/null
+++ b/util/alevt/vt911.out
@@ -0,0 +1,29 @@
+#ifndef HELP_HEADER
+" \6AleVT Online Help System ",
+" \22`p0`0 p `0pppp ",
+"\4\35\22\177 \177j5`p \177 j5 j5 \7 Version \34",
+"\4\35\22\177,\177j5\177.! +t>! j5 \007 1.7.0 \34",
+" \22# #\42!\42# \42 \42! ",
+#else
+HELP_HEADER
+#endif
+" ",
+"\6\15Keyboard Commands: ",
+"\6\15Keyboard Commands: ",
+"\24 #################################### ",
+" s \6Save page to file ",
+" c \6Clear page cache ",
+" r \6Reveal concealed text ",
+" F1\6-\7F5 \6FastText keys ",
+" /\6and\7? \6Search forward/backward ",
+" n\6and\7N \6Search next/previous ",
+" f\6and\7F \6Fine tune the decoder ",
+" e \6Error reduction on/off ",
+" b \6Error bell on/off ",
+"\6 Holding the\7shift\6key while pressing ",
+"\6 one of the\7cursor\6keys allows ",
+"\6 selecting the 'hex' pages (Ex.: 1f1). ",
+"\24 pppppppppppppppppppppppppppppppppppp ",
+" ",
+"\4\35\7Back 910 Index 900 Next 912 \34",
+"\1Page 100 \2Page 200 \3Page 300 \6Page 400\34",
diff --git a/util/alevt/vt912.out b/util/alevt/vt912.out
new file mode 100644
index 0000000..6fd7d12
--- /dev/null
+++ b/util/alevt/vt912.out
@@ -0,0 +1,29 @@
+#ifndef HELP_HEADER
+" \6AleVT Online Help System ",
+" \22`p0`0 p `0pppp ",
+"\4\35\22\177 \177j5`p \177 j5 j5 \7 Version \34",
+"\4\35\22\177,\177j5\177.! +t>! j5 \7 1.7.0 \34",
+" \22# #\42!\42# \42 \42! ",
+#else
+HELP_HEADER
+#endif
+" ",
+"\6\15Starting alevt-cap: ",
+"\6\15Starting alevt-cap: ",
+"\24 #################################### ",
+"\6 $\7alevt-cap\6[options] Default: ",
+" ",
+" -cs -charset \6latin-1 ",
+" \6<latin-1/2/koi8-r/ ",
+" \6iso8859-7> ",
+" -f -format \6ascii ",
+" \6<fmt,options> ",
+" -f help -format help ",
+" -h -help ",
+" -n -name \6<filename> ttext-%s.%e ",
+" ",
+"\24 pppppppppppppppppppppppppppppppppppp ",
+" ",
+" ",
+"\4\35\7Back 911 Index 900 Next 913 \34",
+"\1Page 100 \2Page 200 \3Page 300 \6Page 400\34",
diff --git a/util/alevt/vt913.out b/util/alevt/vt913.out
new file mode 100644
index 0000000..e0f4878
--- /dev/null
+++ b/util/alevt/vt913.out
@@ -0,0 +1,29 @@
+#ifndef HELP_HEADER
+" \6AleVT Online Help System ",
+" \22`p0`0 p `0pppp ",
+"\4\35\22\177 \177j5`p \177 j5 j5 \7 Version \34",
+"\4\35\22\177,\177j5\177.! +t>! j5 \7 1.7.0 \34",
+" \22# #\42!\42# \42 \42! ",
+#else
+HELP_HEADER
+#endif
+" ",
+"\6\15Starting alevt-cap: ",
+"\6\15Starting alevt-cap: ",
+"\24 #################################### ",
+"\6 $\7alevt-cap\6[options] Default: ",
+" ",
+" -s -sid\6<sid> (none;dvb only) ",
+" -t -ttpid\6<ttpid> (none;dvb only) ",
+" -to -timeout\6<secs> (none) ",
+" -v -vbi\6<vbidev> /dev/vbi ",
+" \6/dev/vbi0 ",
+" \6/dev/video0 ",
+" \6/dev/dvb/adapter0/demux0 ",
+" ",
+" ",
+"\24 pppppppppppppppppppppppppppppppppppp ",
+" ",
+" ",
+"\4\35\7Back 912 Index 900 Next 914 \34",
+"\1Page 100 \2Page 200 \3Page 300 \6Page 400\34",
diff --git a/util/alevt/vt914.out b/util/alevt/vt914.out
new file mode 100644
index 0000000..a55eed1
--- /dev/null
+++ b/util/alevt/vt914.out
@@ -0,0 +1,29 @@
+#ifndef HELP_HEADER
+" \6AleVT Online Help System ",
+" \22`p0`0 p `0pppp ",
+"\4\35\22\177 \177j5`p \177 j5 j5 \7 Version \34",
+"\4\35\22\177,\177j5\177.! +t>! j5 \7 1.7.0 \34",
+" \22# #\42!\42# \42 \42! ",
+#else
+HELP_HEADER
+#endif
+" ",
+"\6\15Starting alevt-date: ",
+"\6\15Starting alevt-date: ",
+"\24 #################################### ",
+"\6 $\7alevt-date\6[options] Default: ",
+" ",
+" -d -delta\6<max_secs> 7200 (2 hours) ",
+" -f -format\6<fmtstr> %c ",
+" -h -help ",
+" -s -set \6off ",
+" -to -timeout\6<seconds>(none) ",
+" -v -vbi\6<vbidev> /dev/vbi ",
+" \6/dev/vbi0 ",
+" \6/dev/video0 ",
+" \6/dev/dvb/adapter0/demux0 ",
+"\24 pppppppppppppppppppppppppppppppppppp ",
+" ",
+" ",
+"\4\35\7Back 913 Index 900 Next 915 \34",
+"\1Page 100 \2Page 200 \3Page 300 \6Page 400\34",
diff --git a/util/alevt/vt915.out b/util/alevt/vt915.out
new file mode 100644
index 0000000..66041ac
--- /dev/null
+++ b/util/alevt/vt915.out
@@ -0,0 +1,29 @@
+#ifndef HELP_HEADER
+" \6AleVT Online Help System ",
+" \22`p0`0 p `0pppp ",
+"\4\35\22\177 \177j5`p \177 j5 j5 \7Version \34",
+"\4\35\22\177,\177j5\177.! +t>! j5 \7 1.7.0 \34",
+" \22# #\42!\42# \42 \42! ",
+#else
+HELP_HEADER
+#endif
+" ",
+"\6\15QuickClick: ",
+"\6\15QuickClick: ",
+"\24 #################################### ",
+"\6 100 200 300 400 500 600 700 800 ",
+"\6 101 201 301 401 501 601 701 801 ",
+"\6 110 210 310 410 510 610 710 810 ",
+"\6 120\006220 320 420 520 620 720 820 ",
+"\6 130 230 330 430 530 630 730 830 ",
+"\6 140\006240 340 440 540 640 740 840 ",
+"\6 150 250 350 450 550 650 750 850 ",
+"\6 160\006260 360 460 560 660 760 860 ",
+"\6 170 270 370 470 570 670 770 870 ",
+"\6 180\006280 380 480 580 680 780 880 ",
+"\6 190 290 390 490 590 690 790 890 ",
+"\24 pppppppppppppppppppppppppppppppppppp ",
+" ",
+" ",
+"\4\35\7 Index 900 \34",
+"\1Page 100 \2Page 200 \3Page 300 \6Page 400\34",
diff --git a/util/alevt/vtxt-iso8859-7.bdf b/util/alevt/vtxt-iso8859-7.bdf
new file mode 100644
index 0000000..7d62c95
--- /dev/null
+++ b/util/alevt/vtxt-iso8859-7.bdf
@@ -0,0 +1,5768 @@
+STARTFONT 2.1
+FONT -alevt-teletext-medium-r-normal--16-1-75-75-c-90-fontspecific-1
+SIZE 1 75 75
+FONTBOUNDINGBOX 9 16 0 -4
+STARTPROPERTIES 10
+POINT_SIZE 1
+PIXEL_SIZE 16
+RESOLUTION_X 75
+RESOLUTION_Y 75
+FONT_ASCENT 12
+FONT_DESCENT 4
+AVERAGE_WIDTH 90
+SPACING "C"
+_XMBDFED_INFO "Edited with xmbdfed 4.5."
+FONT "vtxt"
+ENDPROPERTIES
+CHARS 250
+STARTCHAR char0
+ENCODING 0
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char1
+ENCODING 1
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char2
+ENCODING 2
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char1
+ENCODING 3
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char0
+ENCODING 4
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+F000
+F000
+F000
+F000
+F000
+F000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char1
+ENCODING 5
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char2
+ENCODING 6
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+F000
+F000
+F000
+F000
+F000
+F000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char1
+ENCODING 7
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+F000
+F000
+F000
+F000
+F000
+F000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char0
+ENCODING 8
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char1
+ENCODING 9
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char2
+ENCODING 10
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char1
+ENCODING 11
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char0
+ENCODING 12
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char1
+ENCODING 13
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char2
+ENCODING 14
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char1
+ENCODING 15
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char0
+ENCODING 16
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+F000
+F000
+F000
+0000
+0000
+ENDCHAR
+STARTCHAR char1
+ENCODING 17
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+0000
+0000
+0000
+0000
+0000
+0000
+F000
+F000
+F000
+0000
+0000
+ENDCHAR
+STARTCHAR char2
+ENCODING 18
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+0000
+0000
+0000
+0000
+0000
+0000
+F000
+F000
+F000
+0000
+0000
+ENDCHAR
+STARTCHAR char1
+ENCODING 19
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+0000
+0000
+0000
+0000
+0000
+0000
+F000
+F000
+F000
+0000
+0000
+ENDCHAR
+STARTCHAR char0
+ENCODING 20
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+0000
+0000
+ENDCHAR
+STARTCHAR char1
+ENCODING 21
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+0000
+0000
+ENDCHAR
+STARTCHAR char2
+ENCODING 22
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+0000
+0000
+ENDCHAR
+STARTCHAR char1
+ENCODING 23
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+0000
+0000
+ENDCHAR
+STARTCHAR char0
+ENCODING 24
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+F000
+F000
+F000
+0000
+0000
+ENDCHAR
+STARTCHAR char1
+ENCODING 25
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+F000
+F000
+F000
+0000
+0000
+ENDCHAR
+STARTCHAR char2
+ENCODING 26
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+F000
+F000
+F000
+0000
+0000
+ENDCHAR
+STARTCHAR char1
+ENCODING 27
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+F000
+F000
+F000
+0000
+0000
+ENDCHAR
+STARTCHAR char0
+ENCODING 28
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+F000
+F000
+F000
+0000
+0000
+ENDCHAR
+STARTCHAR char1
+ENCODING 29
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+F000
+F000
+F000
+0000
+0000
+ENDCHAR
+STARTCHAR char2
+ENCODING 30
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+F000
+F000
+F000
+0000
+0000
+ENDCHAR
+STARTCHAR char1
+ENCODING 31
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+F000
+F000
+F000
+0000
+0000
+ENDCHAR
+STARTCHAR char32
+ENCODING 32
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char33
+ENCODING 33
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+1800
+3C00
+3C00
+3C00
+1800
+1800
+1800
+0000
+1800
+1800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char34
+ENCODING 34
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+6600
+6600
+6600
+2400
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char35
+ENCODING 35
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+3600
+3600
+7F00
+3600
+3600
+3600
+7F00
+3600
+3600
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char36
+ENCODING 36
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0C00
+0C00
+3E00
+6300
+6100
+6000
+3E00
+0300
+0300
+4300
+6300
+3E00
+0C00
+0C00
+0000
+0000
+ENDCHAR
+STARTCHAR char37
+ENCODING 37
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+6100
+6300
+0600
+0C00
+1800
+3000
+6300
+4300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char38
+ENCODING 38
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+1C00
+3600
+3600
+1C00
+3B00
+6E00
+6600
+6600
+6600
+3B00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char39
+ENCODING 39
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+3000
+3000
+3000
+6000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char40
+ENCODING 40
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0C00
+1800
+3000
+3000
+3000
+3000
+3000
+3000
+1800
+0C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char41
+ENCODING 41
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3000
+1800
+0C00
+0C00
+0C00
+0C00
+0C00
+0C00
+1800
+3000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char42
+ENCODING 42
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+6600
+3C00
+FF00
+3C00
+6600
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char43
+ENCODING 43
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+1800
+1800
+7E00
+1800
+1800
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char44
+ENCODING 44
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+1800
+1800
+1800
+3000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char45
+ENCODING 45
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+7F00
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char46
+ENCODING 46
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+1800
+1800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char47
+ENCODING 47
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0100
+0300
+0600
+0C00
+1800
+3000
+6000
+4000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char48
+ENCODING 48
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3C00
+6600
+C300
+C300
+DB00
+DB00
+C300
+C300
+6600
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char49
+ENCODING 49
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+1800
+3800
+7800
+1800
+1800
+1800
+1800
+1800
+1800
+7E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char50
+ENCODING 50
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3E00
+6300
+0300
+0600
+0C00
+1800
+3000
+6000
+6300
+7F00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char51
+ENCODING 51
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3E00
+6300
+0300
+0300
+1E00
+0300
+0300
+0300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char52
+ENCODING 52
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0600
+0E00
+1E00
+3600
+6600
+7F00
+0600
+0600
+0600
+0F00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char53
+ENCODING 53
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7F00
+6000
+6000
+6000
+7E00
+0300
+0300
+0300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char54
+ENCODING 54
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+1C00
+3000
+6000
+6000
+7E00
+6300
+6300
+6300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char55
+ENCODING 55
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7F00
+6300
+0300
+0300
+0600
+0C00
+1800
+1800
+1800
+1800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char56
+ENCODING 56
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3E00
+6300
+6300
+6300
+3E00
+6300
+6300
+6300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char57
+ENCODING 57
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3E00
+6300
+6300
+6300
+3F00
+0300
+0300
+0300
+0600
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char58
+ENCODING 58
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+1800
+1800
+0000
+0000
+0000
+1800
+1800
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char59
+ENCODING 59
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+1800
+1800
+0000
+0000
+0000
+1800
+1800
+1800
+3000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char60
+ENCODING 60
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0600
+0C00
+1800
+3000
+6000
+3000
+1800
+0C00
+0600
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char61
+ENCODING 61
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+7E00
+0000
+0000
+7E00
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char62
+ENCODING 62
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+6000
+3000
+1800
+0C00
+0600
+0C00
+1800
+3000
+6000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char63
+ENCODING 63
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3E00
+6300
+6300
+0600
+0C00
+0C00
+0C00
+0000
+0C00
+0C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char64
+ENCODING 64
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+3E00
+6300
+6300
+6F00
+6F00
+6F00
+6E00
+6000
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char65
+ENCODING 65
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0800
+1C00
+3600
+6300
+6300
+7F00
+6300
+6300
+6300
+6300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char66
+ENCODING 66
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7E00
+3300
+3300
+3300
+3E00
+3300
+3300
+3300
+3300
+7E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char67
+ENCODING 67
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+1E00
+3300
+6100
+6000
+6000
+6000
+6000
+6100
+3300
+1E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char68
+ENCODING 68
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7C00
+3600
+3300
+3300
+3300
+3300
+3300
+3300
+3600
+7C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char69
+ENCODING 69
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7F00
+3300
+3100
+3400
+3C00
+3400
+3000
+3100
+3300
+7F00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char70
+ENCODING 70
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7F00
+3300
+3100
+3400
+3C00
+3400
+3000
+3000
+3000
+7800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char71
+ENCODING 71
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+1E00
+3300
+6100
+6000
+6000
+6F00
+6300
+6300
+3300
+1D00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char72
+ENCODING 72
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+6300
+6300
+6300
+6300
+7F00
+6300
+6300
+6300
+6300
+6300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char73
+ENCODING 73
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3C00
+1800
+1800
+1800
+1800
+1800
+1800
+1800
+1800
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char74
+ENCODING 74
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0F00
+0600
+0600
+0600
+0600
+0600
+6600
+6600
+6600
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char75
+ENCODING 75
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7300
+3300
+3300
+3600
+3C00
+3C00
+3600
+3300
+3300
+7300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char76
+ENCODING 76
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7800
+3000
+3000
+3000
+3000
+3000
+3000
+3100
+3300
+7F00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char77
+ENCODING 77
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+C300
+E700
+FF00
+FF00
+DB00
+C300
+C300
+C300
+C300
+C300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char78
+ENCODING 78
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+6300
+7300
+7B00
+7F00
+6F00
+6700
+6300
+6300
+6300
+6300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char79
+ENCODING 79
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3E00
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char80
+ENCODING 80
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7E00
+3300
+3300
+3300
+3E00
+3000
+3000
+3000
+3000
+7800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char81
+ENCODING 81
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3E00
+6300
+6300
+6300
+6300
+6300
+6300
+6B00
+6F00
+3E00
+0600
+0700
+0000
+0000
+ENDCHAR
+STARTCHAR char82
+ENCODING 82
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7E00
+3300
+3300
+3300
+3E00
+3600
+3300
+3300
+3300
+7300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char83
+ENCODING 83
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3E00
+6300
+6300
+3000
+1C00
+0600
+0300
+6300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char84
+ENCODING 84
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+FF00
+DB00
+9900
+1800
+1800
+1800
+1800
+1800
+1800
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char85
+ENCODING 85
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char86
+ENCODING 86
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+C300
+C300
+C300
+C300
+C300
+C300
+C300
+6600
+3C00
+1800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char87
+ENCODING 87
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+C300
+C300
+C300
+C300
+C300
+DB00
+DB00
+FF00
+6600
+6600
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char88
+ENCODING 88
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+C300
+C300
+6600
+3C00
+1800
+1800
+3C00
+6600
+C300
+C300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char89
+ENCODING 89
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+C300
+C300
+C300
+6600
+3C00
+1800
+1800
+1800
+1800
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char90
+ENCODING 90
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+FF00
+C300
+8600
+0C00
+1800
+3000
+6000
+C100
+C300
+FF00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char91
+ENCODING 91
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3C00
+3000
+3000
+3000
+3000
+3000
+3000
+3000
+3000
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char92
+ENCODING 92
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+4000
+6000
+7000
+3800
+1C00
+0E00
+0700
+0300
+0100
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char93
+ENCODING 93
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3C00
+0C00
+0C00
+0C00
+0C00
+0C00
+0C00
+0C00
+0C00
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char94
+ENCODING 94
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0800
+1C00
+3600
+6300
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char95
+ENCODING 95
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+FF80
+0000
+0000
+ENDCHAR
+STARTCHAR char96
+ENCODING 96
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+3000
+3000
+1800
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char97
+ENCODING 97
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+3C00
+0600
+3E00
+6600
+6600
+6600
+3B00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char98
+ENCODING 98
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7000
+3000
+3000
+3C00
+3600
+3300
+3300
+3300
+3300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char99
+ENCODING 99
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+3E00
+6300
+6000
+6000
+6000
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char100
+ENCODING 100
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0E00
+0600
+0600
+1E00
+3600
+6600
+6600
+6600
+6600
+3B00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char101
+ENCODING 101
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+3E00
+6300
+7F00
+6000
+6000
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char102
+ENCODING 102
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+1C00
+3600
+3200
+3000
+7800
+3000
+3000
+3000
+3000
+7800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char103
+ENCODING 103
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+3B00
+6600
+6600
+6600
+6600
+6600
+3E00
+0600
+6600
+3C00
+0000
+ENDCHAR
+STARTCHAR char104
+ENCODING 104
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7000
+3000
+3000
+3600
+3B00
+3300
+3300
+3300
+3300
+7300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char105
+ENCODING 105
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+1800
+1800
+0000
+3800
+1800
+1800
+1800
+1800
+1800
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char106
+ENCODING 106
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0600
+0600
+0000
+0E00
+0600
+0600
+0600
+0600
+0600
+0600
+6600
+6600
+3C00
+0000
+ENDCHAR
+STARTCHAR char107
+ENCODING 107
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7000
+3000
+3000
+3300
+3600
+3C00
+3C00
+3600
+3300
+7300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char108
+ENCODING 108
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3800
+1800
+1800
+1800
+1800
+1800
+1800
+1800
+1800
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char109
+ENCODING 109
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+E600
+FF00
+DB00
+DB00
+DB00
+DB00
+DB00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char110
+ENCODING 110
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+6E00
+3300
+3300
+3300
+3300
+3300
+3300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char111
+ENCODING 111
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+3E00
+6300
+6300
+6300
+6300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char112
+ENCODING 112
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+6E00
+3300
+3300
+3300
+3300
+3300
+3E00
+3000
+3000
+3000
+0000
+ENDCHAR
+STARTCHAR char113
+ENCODING 113
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+3B00
+6600
+6600
+6600
+6600
+6600
+3E00
+0600
+0600
+0600
+0000
+ENDCHAR
+STARTCHAR char114
+ENCODING 114
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+6E00
+3B00
+3300
+3000
+3000
+3000
+7800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char115
+ENCODING 115
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+3E00
+6300
+3000
+1C00
+0600
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char116
+ENCODING 116
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0800
+1800
+1800
+7E00
+1800
+1800
+1800
+1800
+1B00
+0E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char117
+ENCODING 117
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+6600
+6600
+6600
+6600
+6600
+6600
+3B00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char118
+ENCODING 118
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+C300
+C300
+C300
+C300
+6600
+3C00
+1800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char119
+ENCODING 119
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+C300
+C300
+C300
+DB00
+DB00
+FF00
+6600
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char120
+ENCODING 120
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+C300
+6600
+3C00
+1800
+3C00
+6600
+C300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char121
+ENCODING 121
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+6300
+6300
+6300
+6300
+6300
+6300
+3F00
+0300
+0600
+0C00
+0000
+ENDCHAR
+STARTCHAR char122
+ENCODING 122
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+7F00
+6600
+0C00
+1800
+3000
+6300
+7F00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char123
+ENCODING 123
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0E00
+1800
+1800
+1800
+7000
+1800
+1800
+1800
+1800
+0E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char124
+ENCODING 124
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+1800
+1800
+1800
+1800
+1800
+1800
+1800
+1800
+1800
+1800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char125
+ENCODING 125
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7000
+1800
+1800
+1800
+0E00
+1800
+1800
+1800
+1800
+7000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char126
+ENCODING 126
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3B00
+6E00
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char127
+ENCODING 127
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+7F00
+7F00
+7F00
+7F00
+7F00
+7F00
+7F00
+7F00
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char0
+ENCODING 128
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0F80
+0F80
+0F80
+0000
+0000
+ENDCHAR
+STARTCHAR char1
+ENCODING 129
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+0000
+0000
+0000
+0000
+0000
+0000
+0F80
+0F80
+0F80
+0000
+0000
+ENDCHAR
+STARTCHAR char2
+ENCODING 130
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+0000
+0000
+0000
+0000
+0000
+0000
+0F80
+0F80
+0F80
+0000
+0000
+ENDCHAR
+STARTCHAR char1
+ENCODING 131
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+0000
+0000
+0000
+0000
+0000
+0000
+0F80
+0F80
+0F80
+0000
+0000
+ENDCHAR
+STARTCHAR char0
+ENCODING 132
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+F000
+F000
+F000
+F000
+F000
+F000
+0F80
+0F80
+0F80
+0000
+0000
+ENDCHAR
+STARTCHAR char1
+ENCODING 133
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+0F80
+0F80
+0F80
+0000
+0000
+ENDCHAR
+STARTCHAR char2
+ENCODING 134
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+F000
+F000
+F000
+F000
+F000
+F000
+0F80
+0F80
+0F80
+0000
+0000
+ENDCHAR
+STARTCHAR char1
+ENCODING 135
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+F000
+F000
+F000
+F000
+F000
+F000
+0F80
+0F80
+0F80
+0000
+0000
+ENDCHAR
+STARTCHAR char0
+ENCODING 136
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0000
+0000
+ENDCHAR
+STARTCHAR char1
+ENCODING 137
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0000
+0000
+ENDCHAR
+STARTCHAR char2
+ENCODING 138
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0000
+0000
+ENDCHAR
+STARTCHAR char1
+ENCODING 139
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0000
+0000
+ENDCHAR
+STARTCHAR char0
+ENCODING 140
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+0F80
+0F80
+0F80
+0000
+0000
+ENDCHAR
+STARTCHAR char1
+ENCODING 141
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+0F80
+0F80
+0F80
+0000
+0000
+ENDCHAR
+STARTCHAR char2
+ENCODING 142
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+0F80
+0F80
+0F80
+0000
+0000
+ENDCHAR
+STARTCHAR char1
+ENCODING 143
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+0F80
+0F80
+0F80
+0000
+0000
+ENDCHAR
+STARTCHAR char0
+ENCODING 144
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+FF80
+FF80
+FF80
+0000
+0000
+ENDCHAR
+STARTCHAR char1
+ENCODING 145
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+0000
+0000
+0000
+0000
+0000
+0000
+FF80
+FF80
+FF80
+0000
+0000
+ENDCHAR
+STARTCHAR char2
+ENCODING 146
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+0000
+0000
+0000
+0000
+0000
+0000
+FF80
+FF80
+FF80
+0000
+0000
+ENDCHAR
+STARTCHAR char1
+ENCODING 147
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+0000
+0000
+0000
+0000
+0000
+0000
+FF80
+FF80
+FF80
+0000
+0000
+ENDCHAR
+STARTCHAR char0
+ENCODING 148
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+F000
+F000
+F000
+F000
+F000
+F000
+FF80
+FF80
+FF80
+0000
+0000
+ENDCHAR
+STARTCHAR char1
+ENCODING 149
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+FF80
+FF80
+FF80
+0000
+0000
+ENDCHAR
+STARTCHAR char2
+ENCODING 150
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+F000
+F000
+F000
+F000
+F000
+F000
+FF80
+FF80
+FF80
+0000
+0000
+ENDCHAR
+STARTCHAR char1
+ENCODING 151
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+F000
+F000
+F000
+F000
+F000
+F000
+FF80
+FF80
+FF80
+0000
+0000
+ENDCHAR
+STARTCHAR char0
+ENCODING 152
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+FF80
+FF80
+FF80
+0000
+0000
+ENDCHAR
+STARTCHAR char1
+ENCODING 153
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+FF80
+FF80
+FF80
+0000
+0000
+ENDCHAR
+STARTCHAR char2
+ENCODING 154
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+FF80
+FF80
+FF80
+0000
+0000
+ENDCHAR
+STARTCHAR char1
+ENCODING 155
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+FF80
+FF80
+FF80
+0000
+0000
+ENDCHAR
+STARTCHAR char0
+ENCODING 156
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+0000
+0000
+ENDCHAR
+STARTCHAR char1
+ENCODING 157
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+0000
+0000
+ENDCHAR
+STARTCHAR char2
+ENCODING 158
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+0000
+0000
+ENDCHAR
+STARTCHAR char1
+ENCODING 159
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+0000
+0000
+ENDCHAR
+STARTCHAR U+00A0 NO-BREAK SPACE
+ENCODING 160
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+02BD MODIFIER LETTER REVERSED COMMA
+ENCODING 161
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+1800
+1000
+1000
+0800
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+02BC MODIFIER LETTER APOSTROPHE
+ENCODING 162
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+1800
+0800
+0800
+1000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+00A3 POUND SIGN
+ENCODING 163
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0E00
+1000
+1000
+1000
+7C00
+1000
+1000
+1000
+3E00
+6100
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+00A6 BROKEN BAR
+ENCODING 166
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0800
+0800
+0800
+0800
+0000
+0000
+0800
+0800
+0800
+0800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+00A7 SECTION SIGN
+ENCODING 167
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3C00
+4200
+4000
+3C00
+4200
+4200
+3C00
+0200
+4200
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+00A8 DIAERESIS
+ENCODING 168
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+2400
+2400
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+00A9 COPYRIGHT SIGN
+ENCODING 169
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3C00
+4200
+9900
+A500
+A100
+A100
+A500
+9900
+4200
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+00AB LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+ENCODING 171
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+1200
+1200
+2400
+2400
+4800
+2400
+2400
+1200
+1200
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+00AC NOT SIGN
+ENCODING 172
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+7E00
+0200
+0200
+0200
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+00AD SOFT HYPHEN
+ENCODING 173
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+7E00
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+2015 HORIZONTAL BAR
+ENCODING 175
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+FF00
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+00B0 DEGREE SIGN
+ENCODING 176
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+1000
+2800
+2800
+1000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+00B1 PLUS-MINUS SIGN
+ENCODING 177
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0800
+0800
+0800
+7F00
+0800
+0800
+0800
+0000
+7F00
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+00B2 SUPERSCRIPT TWO
+ENCODING 178
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+1C00
+2200
+0200
+1C00
+2000
+2000
+3E00
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+00B3 SUPERSCRIPT THREE
+ENCODING 179
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+1C00
+2200
+0200
+1C00
+0200
+2200
+1C00
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+0384 GREEK TONOS
+ENCODING 180
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+1000
+1000
+1000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+0385 GREEK DIALYTIKA TONOS
+ENCODING 181
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+1000
+1000
+1000
+4400
+4400
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+0386 GREEK CAPITAL LETTER ALPHA WITH TONOS
+ENCODING 182
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+4000
+4000
+0000
+1800
+2400
+2400
+4200
+4200
+7E00
+4200
+4200
+4200
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+00B7 MIDDLE DOT
+ENCODING 183
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+1800
+1800
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+0388 GREEK CAPITAL LETTER EPSILON WITH TONOS
+ENCODING 184
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+4000
+4000
+0000
+7E00
+4000
+4000
+4000
+7C00
+4000
+4000
+4000
+7E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+0389 GREEK CAPITAL LETTER ETA WITH TONOS
+ENCODING 185
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+4000
+4000
+0000
+4200
+4200
+4200
+4200
+7E00
+4200
+4200
+4200
+4200
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+038A GREEK CAPITAL LETTER IOTA WITH TONOS
+ENCODING 186
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+4000
+4000
+0000
+3E00
+0800
+0800
+0800
+0800
+0800
+0800
+0800
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+00BB RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+ENCODING 187
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+4800
+4800
+2400
+2400
+1200
+2400
+2400
+4800
+4800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+038C GREEK CAPITAL LETTER OMICRON WITH TONOS
+ENCODING 188
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+4000
+4000
+0000
+3C00
+4200
+4200
+4200
+4200
+4200
+4200
+4200
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+00BD VULGAR FRACTION ONE HALF
+ENCODING 189
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+2200
+6200
+2400
+2800
+2800
+1400
+1A00
+2200
+4400
+4E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+038E GREEK CAPITAL LETTER UPSILON WITH TONOS
+ENCODING 190
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+4000
+4000
+0000
+4100
+4100
+2200
+2200
+1400
+0800
+0800
+0800
+0800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+038F GREEK CAPITAL LETTER OMEGA WITH TONOS
+ENCODING 191
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+4000
+4000
+0000
+3E00
+4100
+4100
+4100
+4100
+2200
+1400
+1400
+7700
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+0390 GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS
+ENCODING 192
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+1000
+5400
+4400
+0000
+1000
+1000
+1000
+1000
+1000
+1000
+0C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+0391 GREEK CAPITAL LETTER ALPHA
+ENCODING 193
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+1800
+2400
+2400
+4200
+4200
+7E00
+4200
+4200
+4200
+4200
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+0392 GREEK CAPITAL LETTER BETA
+ENCODING 194
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7C00
+4200
+4200
+4200
+7C00
+4200
+4200
+4200
+4200
+7C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+0393 GREEK CAPITAL LETTER GAMMA
+ENCODING 195
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7E00
+4000
+4000
+4000
+4000
+4000
+4000
+4000
+4000
+4000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+0394 GREEK CAPITAL LETTER DELTA
+ENCODING 196
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0800
+0800
+1400
+1400
+2200
+2200
+2200
+4100
+4100
+7F00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+0395 GREEK CAPITAL LETTER EPSILON
+ENCODING 197
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7E00
+4000
+4000
+4000
+7C00
+4000
+4000
+4000
+4000
+7E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+0396 GREEK CAPITAL LETTER ZETA
+ENCODING 198
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7E00
+0200
+0200
+0400
+0800
+1000
+2000
+4000
+4000
+7E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+0397 GREEK CAPITAL LETTER ETA
+ENCODING 199
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+4200
+4200
+4200
+4200
+7E00
+4200
+4200
+4200
+4200
+4200
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+0398 GREEK CAPITAL LETTER THETA
+ENCODING 200
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3C00
+4200
+4200
+4200
+7E00
+4200
+4200
+4200
+4200
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+0399 GREEK CAPITAL LETTER IOTA
+ENCODING 201
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3E00
+0800
+0800
+0800
+0800
+0800
+0800
+0800
+0800
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+039A GREEK CAPITAL LETTER KAPPA
+ENCODING 202
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+4200
+4400
+4800
+5000
+6000
+6000
+5000
+4800
+4400
+4200
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+039B GREEK CAPITAL LETTER LAMDA
+ENCODING 203
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0800
+0800
+1400
+1400
+2200
+2200
+2200
+4100
+4100
+4100
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+039C GREEK CAPITAL LETTER MU
+ENCODING 204
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+4200
+4200
+6600
+6600
+5A00
+5A00
+4200
+4200
+4200
+4200
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+039D GREEK CAPITAL LETTER NU
+ENCODING 205
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+4200
+6200
+6200
+5200
+5200
+4A00
+4A00
+4600
+4600
+4200
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+039E GREEK CAPITAL LETTER XI
+ENCODING 206
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7E00
+0000
+0000
+0000
+3C00
+0000
+0000
+0000
+0000
+7E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+039F GREEK CAPITAL LETTER OMICRON
+ENCODING 207
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3C00
+4200
+4200
+4200
+4200
+4200
+4200
+4200
+4200
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+03A0 GREEK CAPITAL LETTER PI
+ENCODING 208
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7F00
+2200
+2200
+2200
+2200
+2200
+2200
+2200
+2200
+2200
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+03A1 GREEK CAPITAL LETTER RHO
+ENCODING 209
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7C00
+4200
+4200
+4200
+7C00
+4000
+4000
+4000
+4000
+4000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+03A3 GREEK CAPITAL LETTER SIGMA
+ENCODING 211
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7E00
+4000
+2000
+1000
+0800
+0800
+1000
+2000
+4000
+7E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+03A4 GREEK CAPITAL LETTER TAU
+ENCODING 212
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7F00
+0800
+0800
+0800
+0800
+0800
+0800
+0800
+0800
+0800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+03A5 GREEK CAPITAL LETTER UPSILON
+ENCODING 213
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+4100
+4100
+2200
+2200
+1400
+0800
+0800
+0800
+0800
+0800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+03A6 GREEK CAPITAL LETTER PHI
+ENCODING 214
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+1C00
+0800
+3E00
+4900
+4900
+4900
+4900
+3E00
+0800
+1C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+03A7 GREEK CAPITAL LETTER CHI
+ENCODING 215
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+4200
+4200
+2400
+2400
+1800
+1800
+2400
+2400
+4200
+4200
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+03A8 GREEK CAPITAL LETTER PSI
+ENCODING 216
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+4900
+4900
+4900
+4900
+4900
+3E00
+0800
+0800
+0800
+0800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+03A9 GREEK CAPITAL LETTER OMEGA
+ENCODING 217
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3E00
+4100
+4100
+4100
+4100
+4100
+2200
+1400
+1400
+7700
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+03AA GREEK CAPITAL LETTER IOTA WITH DIALYTIKA
+ENCODING 218
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+2400
+2400
+0000
+3E00
+0800
+0800
+0800
+0800
+0800
+0800
+0800
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+03AB GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA
+ENCODING 219
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+2400
+2400
+0000
+4100
+4100
+2200
+2200
+1400
+0800
+0800
+0800
+0800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+03AC GREEK SMALL LETTER ALPHA WITH TONOS
+ENCODING 220
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+1000
+1000
+0000
+0000
+3200
+4A00
+4400
+4400
+4400
+4400
+4A00
+3200
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+03AD GREEK SMALL LETTER EPSILON WITH TONOS
+ENCODING 221
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+1000
+1000
+0000
+0000
+3E00
+4000
+4000
+3C00
+4000
+4000
+4000
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+03AE GREEK SMALL LETTER ETA WITH TONOS
+ENCODING 222
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+1000
+1000
+0000
+0000
+5C00
+6200
+4200
+4200
+4200
+4200
+4200
+4200
+0200
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+03AF GREEK SMALL LETTER IOTA WITH TONOS
+ENCODING 223
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+1000
+1000
+0000
+0000
+1000
+1000
+1000
+1000
+1000
+1000
+1000
+0C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+03B0 GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS
+ENCODING 224
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+1000
+1000
+4400
+4400
+0000
+4200
+4200
+4200
+4200
+4200
+4200
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+03B1 GREEK SMALL LETTER ALPHA
+ENCODING 225
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+3200
+4A00
+4400
+4400
+4400
+4400
+4A00
+3200
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+03B2 GREEK SMALL LETTER BETA
+ENCODING 226
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3800
+4400
+4400
+4400
+7C00
+4200
+4200
+4200
+6200
+5C00
+4000
+4000
+0000
+0000
+ENDCHAR
+STARTCHAR U+03B3 GREEK SMALL LETTER GAMMA
+ENCODING 227
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+3100
+4900
+0A00
+0400
+0800
+0800
+1000
+1000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+03B4 GREEK SMALL LETTER DELTA
+ENCODING 228
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+1C00
+2000
+2000
+2000
+1800
+2400
+4200
+4200
+4200
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+03B5 GREEK SMALL LETTER EPSILON
+ENCODING 229
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+3C00
+4200
+4000
+3C00
+4000
+4000
+4200
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+03B6 GREEK SMALL LETTER ZETA
+ENCODING 230
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+2000
+2000
+1C00
+0800
+1000
+2000
+2000
+2000
+2000
+1C00
+0200
+1C00
+0000
+0000
+ENDCHAR
+STARTCHAR U+03B7 GREEK SMALL LETTER ETA
+ENCODING 231
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+5C00
+6200
+4200
+4200
+4200
+4200
+4200
+4200
+0200
+0200
+0000
+0000
+ENDCHAR
+STARTCHAR U+03B8 GREEK SMALL LETTER THETA
+ENCODING 232
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+1800
+2400
+2400
+4200
+7E00
+4200
+4200
+2400
+2400
+1800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+03B9 GREEK SMALL LETTER IOTA
+ENCODING 233
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+1000
+1000
+1000
+1000
+1000
+1000
+1000
+0C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+03BA GREEK SMALL LETTER KAPPA
+ENCODING 234
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+2200
+2400
+2800
+3000
+3000
+2800
+2400
+2200
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+03BB GREEK SMALL LETTER LAMDA
+ENCODING 235
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+2000
+2000
+1000
+1000
+0800
+1800
+2400
+2400
+4200
+4200
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+03BC GREEK SMALL LETTER MU
+ENCODING 236
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+4200
+4200
+4200
+4200
+6600
+6600
+5A00
+4200
+4000
+4000
+0000
+0000
+ENDCHAR
+STARTCHAR U+03BD GREEK SMALL LETTER NU
+ENCODING 237
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+4200
+4200
+4200
+4400
+4400
+4800
+5000
+6000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+03BE GREEK SMALL LETTER XI
+ENCODING 238
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+4000
+4000
+3C00
+4000
+4000
+3C00
+4000
+4000
+3C00
+0200
+0200
+3C00
+0000
+0000
+ENDCHAR
+STARTCHAR U+03BF GREEK SMALL LETTER OMICRON
+ENCODING 239
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+3C00
+4200
+4200
+4200
+4200
+4200
+4200
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+03C0 GREEK SMALL LETTER PI
+ENCODING 240
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+7E00
+2400
+2400
+2400
+2400
+2400
+2400
+2400
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+03C1 GREEK SMALL LETTER RHO
+ENCODING 241
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+3C00
+4200
+4200
+4200
+4200
+4200
+6200
+5C00
+4000
+4000
+0000
+0000
+ENDCHAR
+STARTCHAR U+03C2 GREEK SMALL LETTER FINAL SIGMA
+ENCODING 242
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+1E00
+2000
+4000
+4000
+4000
+2000
+1C00
+0200
+0200
+1C00
+0000
+0000
+ENDCHAR
+STARTCHAR U+03C3 GREEK SMALL LETTER SIGMA
+ENCODING 243
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+3F00
+4800
+4400
+4400
+4400
+4400
+4400
+3800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+03C4 GREEK SMALL LETTER TAU
+ENCODING 244
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+7E00
+1000
+1000
+1000
+1000
+1000
+1000
+0C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+03C5 GREEK SMALL LETTER UPSILON
+ENCODING 245
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+4200
+4200
+4200
+4200
+4200
+4200
+4200
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+03C6 GREEK SMALL LETTER PHI
+ENCODING 246
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+3E00
+4900
+4900
+4900
+4900
+4900
+4900
+3E00
+0800
+0800
+0000
+0000
+ENDCHAR
+STARTCHAR U+03C7 GREEK SMALL LETTER CHI
+ENCODING 247
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+4200
+4200
+2400
+2400
+1800
+1800
+2400
+2400
+4200
+4200
+0000
+0000
+ENDCHAR
+STARTCHAR U+03C8 GREEK SMALL LETTER PSI
+ENCODING 248
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+4900
+4900
+4900
+4900
+4900
+3E00
+0800
+0800
+0000
+0000
+ENDCHAR
+STARTCHAR U+03C9 GREEK SMALL LETTER OMEGA
+ENCODING 249
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+2200
+4100
+4100
+4900
+4900
+4900
+4900
+3600
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+03CA GREEK SMALL LETTER IOTA WITH DIALYTIKA
+ENCODING 250
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+2400
+2400
+0000
+0000
+1000
+1000
+1000
+1000
+1000
+1000
+1000
+0C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+03CB GREEK SMALL LETTER UPSILON WITH DIALYTIKA
+ENCODING 251
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+2400
+2400
+0000
+0000
+4200
+4200
+4200
+4200
+4200
+4200
+4200
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+03CC GREEK SMALL LETTER OMICRON WITH TONOS
+ENCODING 252
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+1000
+1000
+0000
+0000
+3C00
+4200
+4200
+4200
+4200
+4200
+4200
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+03CD GREEK SMALL LETTER UPSILON WITH TONOS
+ENCODING 253
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+1000
+1000
+0000
+0000
+4200
+4200
+4200
+4200
+4200
+4200
+4200
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+03CE GREEK SMALL LETTER OMEGA WITH TONOS
+ENCODING 254
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0800
+0800
+0000
+0000
+2200
+4100
+4100
+4900
+4900
+4900
+4900
+3600
+0000
+0000
+0000
+0000
+ENDCHAR
+ENDFONT
diff --git a/util/alevt/vtxt-koi8.bdf b/util/alevt/vtxt-koi8.bdf
new file mode 100644
index 0000000..a7398b2
--- /dev/null
+++ b/util/alevt/vtxt-koi8.bdf
@@ -0,0 +1,5906 @@
+STARTFONT 2.1
+FONT -alevt-teletext-medium-r-normal--16-1-75-75-c-90-fontspecific-1
+SIZE 1 75 75
+FONTBOUNDINGBOX 9 16 0 -4
+STARTPROPERTIES 10
+POINT_SIZE 1
+PIXEL_SIZE 16
+RESOLUTION_X 75
+RESOLUTION_Y 75
+FONT_ASCENT 12
+FONT_DESCENT 4
+AVERAGE_WIDTH 90
+SPACING "C"
+_XMBDFED_INFO "Edited with xmbdfed 3.0."
+FONT "vtxt"
+ENDPROPERTIES
+CHARS 256
+STARTCHAR char0
+ENCODING 0
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char1
+ENCODING 1
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char2
+ENCODING 2
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char1
+ENCODING 3
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char0
+ENCODING 4
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+F000
+F000
+F000
+F000
+F000
+F000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char1
+ENCODING 5
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char2
+ENCODING 6
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+F000
+F000
+F000
+F000
+F000
+F000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char1
+ENCODING 7
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+F000
+F000
+F000
+F000
+F000
+F000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char0
+ENCODING 8
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char1
+ENCODING 9
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char2
+ENCODING 10
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char1
+ENCODING 11
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char0
+ENCODING 12
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char1
+ENCODING 13
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char2
+ENCODING 14
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char1
+ENCODING 15
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char0
+ENCODING 16
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+F000
+F000
+F000
+F000
+F000
+ENDCHAR
+STARTCHAR char1
+ENCODING 17
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+0000
+0000
+0000
+0000
+0000
+0000
+F000
+F000
+F000
+F000
+F000
+ENDCHAR
+STARTCHAR char2
+ENCODING 18
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+0000
+0000
+0000
+0000
+0000
+0000
+F000
+F000
+F000
+F000
+F000
+ENDCHAR
+STARTCHAR char1
+ENCODING 19
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+0000
+0000
+0000
+0000
+0000
+0000
+F000
+F000
+F000
+F000
+F000
+ENDCHAR
+STARTCHAR char0
+ENCODING 20
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+ENDCHAR
+STARTCHAR char1
+ENCODING 21
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+ENDCHAR
+STARTCHAR char2
+ENCODING 22
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+ENDCHAR
+STARTCHAR char1
+ENCODING 23
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+ENDCHAR
+STARTCHAR char0
+ENCODING 24
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+F000
+F000
+F000
+F000
+F000
+ENDCHAR
+STARTCHAR char1
+ENCODING 25
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+F000
+F000
+F000
+F000
+F000
+ENDCHAR
+STARTCHAR char2
+ENCODING 26
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+F000
+F000
+F000
+F000
+F000
+ENDCHAR
+STARTCHAR char1
+ENCODING 27
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+F000
+F000
+F000
+F000
+F000
+ENDCHAR
+STARTCHAR char0
+ENCODING 28
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+F000
+F000
+F000
+F000
+F000
+ENDCHAR
+STARTCHAR char1
+ENCODING 29
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+F000
+F000
+F000
+F000
+F000
+ENDCHAR
+STARTCHAR char2
+ENCODING 30
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+F000
+F000
+F000
+F000
+F000
+ENDCHAR
+STARTCHAR char1
+ENCODING 31
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+F000
+F000
+F000
+F000
+F000
+ENDCHAR
+STARTCHAR char32
+ENCODING 32
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char33
+ENCODING 33
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+1800
+3C00
+3C00
+3C00
+1800
+1800
+1800
+0000
+1800
+1800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char34
+ENCODING 34
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+6600
+6600
+6600
+2400
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char35
+ENCODING 35
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+3600
+3600
+7F00
+3600
+3600
+3600
+7F00
+3600
+3600
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char36
+ENCODING 36
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0C00
+0C00
+3E00
+6300
+6100
+6000
+3E00
+0300
+0300
+4300
+6300
+3E00
+0C00
+0C00
+0000
+0000
+ENDCHAR
+STARTCHAR char37
+ENCODING 37
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+6100
+6300
+0600
+0C00
+1800
+3000
+6300
+4300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char38
+ENCODING 38
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+1C00
+3600
+3600
+1C00
+3B00
+6E00
+6600
+6600
+6600
+3B00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char39
+ENCODING 39
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+3000
+3000
+3000
+6000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char40
+ENCODING 40
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0C00
+1800
+3000
+3000
+3000
+3000
+3000
+3000
+1800
+0C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char41
+ENCODING 41
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3000
+1800
+0C00
+0C00
+0C00
+0C00
+0C00
+0C00
+1800
+3000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char42
+ENCODING 42
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+6600
+3C00
+FF00
+3C00
+6600
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char43
+ENCODING 43
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+1800
+1800
+7E00
+1800
+1800
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char44
+ENCODING 44
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+1800
+1800
+1800
+3000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char45
+ENCODING 45
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+7F00
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char46
+ENCODING 46
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+1800
+1800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char47
+ENCODING 47
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0100
+0300
+0600
+0C00
+1800
+3000
+6000
+4000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char48
+ENCODING 48
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3C00
+6600
+C300
+C300
+DB00
+DB00
+C300
+C300
+6600
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char49
+ENCODING 49
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+1800
+3800
+7800
+1800
+1800
+1800
+1800
+1800
+1800
+7E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char50
+ENCODING 50
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3E00
+6300
+0300
+0600
+0C00
+1800
+3000
+6000
+6300
+7F00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char51
+ENCODING 51
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3E00
+6300
+0300
+0300
+1E00
+0300
+0300
+0300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char52
+ENCODING 52
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0600
+0E00
+1E00
+3600
+6600
+7F00
+0600
+0600
+0600
+0F00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char53
+ENCODING 53
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7F00
+6000
+6000
+6000
+7E00
+0300
+0300
+0300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char54
+ENCODING 54
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+1C00
+3000
+6000
+6000
+7E00
+6300
+6300
+6300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char55
+ENCODING 55
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7F00
+6300
+0300
+0300
+0600
+0C00
+1800
+1800
+1800
+1800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char56
+ENCODING 56
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3E00
+6300
+6300
+6300
+3E00
+6300
+6300
+6300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char57
+ENCODING 57
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3E00
+6300
+6300
+6300
+3F00
+0300
+0300
+0300
+0600
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char58
+ENCODING 58
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+1800
+1800
+0000
+0000
+0000
+1800
+1800
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char59
+ENCODING 59
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+1800
+1800
+0000
+0000
+0000
+1800
+1800
+1800
+3000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char60
+ENCODING 60
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0600
+0C00
+1800
+3000
+6000
+3000
+1800
+0C00
+0600
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char61
+ENCODING 61
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+7E00
+0000
+0000
+7E00
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char62
+ENCODING 62
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+6000
+3000
+1800
+0C00
+0600
+0C00
+1800
+3000
+6000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char63
+ENCODING 63
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3E00
+6300
+6300
+0600
+0C00
+0C00
+0C00
+0000
+0C00
+0C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char64
+ENCODING 64
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+3E00
+6300
+6300
+6F00
+6F00
+6F00
+6E00
+6000
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char65
+ENCODING 65
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0800
+1C00
+3600
+6300
+6300
+7F00
+6300
+6300
+6300
+6300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char66
+ENCODING 66
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7E00
+3300
+3300
+3300
+3E00
+3300
+3300
+3300
+3300
+7E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char67
+ENCODING 67
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+1E00
+3300
+6100
+6000
+6000
+6000
+6000
+6100
+3300
+1E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char68
+ENCODING 68
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7C00
+3600
+3300
+3300
+3300
+3300
+3300
+3300
+3600
+7C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char69
+ENCODING 69
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7F00
+3300
+3100
+3400
+3C00
+3400
+3000
+3100
+3300
+7F00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char70
+ENCODING 70
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7F00
+3300
+3100
+3400
+3C00
+3400
+3000
+3000
+3000
+7800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char71
+ENCODING 71
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+1E00
+3300
+6100
+6000
+6000
+6F00
+6300
+6300
+3300
+1D00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char72
+ENCODING 72
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+6300
+6300
+6300
+6300
+7F00
+6300
+6300
+6300
+6300
+6300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char73
+ENCODING 73
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3C00
+1800
+1800
+1800
+1800
+1800
+1800
+1800
+1800
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char74
+ENCODING 74
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0F00
+0600
+0600
+0600
+0600
+0600
+6600
+6600
+6600
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char75
+ENCODING 75
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7300
+3300
+3300
+3600
+3C00
+3C00
+3600
+3300
+3300
+7300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char76
+ENCODING 76
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7800
+3000
+3000
+3000
+3000
+3000
+3000
+3100
+3300
+7F00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char77
+ENCODING 77
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+C300
+E700
+FF00
+FF00
+DB00
+C300
+C300
+C300
+C300
+C300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char78
+ENCODING 78
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+6300
+7300
+7B00
+7F00
+6F00
+6700
+6300
+6300
+6300
+6300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char79
+ENCODING 79
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3E00
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char80
+ENCODING 80
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7E00
+3300
+3300
+3300
+3E00
+3000
+3000
+3000
+3000
+7800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char81
+ENCODING 81
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3E00
+6300
+6300
+6300
+6300
+6300
+6300
+6B00
+6F00
+3E00
+0600
+0700
+0000
+0000
+ENDCHAR
+STARTCHAR char82
+ENCODING 82
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7E00
+3300
+3300
+3300
+3E00
+3600
+3300
+3300
+3300
+7300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char83
+ENCODING 83
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3E00
+6300
+6300
+3000
+1C00
+0600
+0300
+6300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char84
+ENCODING 84
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+FF00
+DB00
+9900
+1800
+1800
+1800
+1800
+1800
+1800
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char85
+ENCODING 85
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char86
+ENCODING 86
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+C300
+C300
+C300
+C300
+C300
+C300
+C300
+6600
+3C00
+1800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char87
+ENCODING 87
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+C300
+C300
+C300
+C300
+C300
+DB00
+DB00
+FF00
+6600
+6600
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char88
+ENCODING 88
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+C300
+C300
+6600
+3C00
+1800
+1800
+3C00
+6600
+C300
+C300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char89
+ENCODING 89
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+C300
+C300
+C300
+6600
+3C00
+1800
+1800
+1800
+1800
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char90
+ENCODING 90
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+FF00
+C300
+8600
+0C00
+1800
+3000
+6000
+C100
+C300
+FF00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char91
+ENCODING 91
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3C00
+3000
+3000
+3000
+3000
+3000
+3000
+3000
+3000
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char92
+ENCODING 92
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+4000
+6000
+7000
+3800
+1C00
+0E00
+0700
+0300
+0100
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char93
+ENCODING 93
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3C00
+0C00
+0C00
+0C00
+0C00
+0C00
+0C00
+0C00
+0C00
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char94
+ENCODING 94
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0800
+1C00
+3600
+6300
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char95
+ENCODING 95
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+FF80
+0000
+0000
+ENDCHAR
+STARTCHAR char96
+ENCODING 96
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+3000
+3000
+1800
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char97
+ENCODING 97
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+3C00
+0600
+3E00
+6600
+6600
+6600
+3B00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char98
+ENCODING 98
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7000
+3000
+3000
+3C00
+3600
+3300
+3300
+3300
+3300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char99
+ENCODING 99
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+3E00
+6300
+6000
+6000
+6000
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char100
+ENCODING 100
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0E00
+0600
+0600
+1E00
+3600
+6600
+6600
+6600
+6600
+3B00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char101
+ENCODING 101
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+3E00
+6300
+7F00
+6000
+6000
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char102
+ENCODING 102
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+1C00
+3600
+3200
+3000
+7800
+3000
+3000
+3000
+3000
+7800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char103
+ENCODING 103
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+3B00
+6600
+6600
+6600
+6600
+6600
+3E00
+0600
+6600
+3C00
+0000
+ENDCHAR
+STARTCHAR char104
+ENCODING 104
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7000
+3000
+3000
+3600
+3B00
+3300
+3300
+3300
+3300
+7300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char105
+ENCODING 105
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+1800
+1800
+0000
+3800
+1800
+1800
+1800
+1800
+1800
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char106
+ENCODING 106
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0600
+0600
+0000
+0E00
+0600
+0600
+0600
+0600
+0600
+0600
+6600
+6600
+3C00
+0000
+ENDCHAR
+STARTCHAR char107
+ENCODING 107
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7000
+3000
+3000
+3300
+3600
+3C00
+3C00
+3600
+3300
+7300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char108
+ENCODING 108
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3800
+1800
+1800
+1800
+1800
+1800
+1800
+1800
+1800
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char109
+ENCODING 109
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+E600
+FF00
+DB00
+DB00
+DB00
+DB00
+DB00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char110
+ENCODING 110
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+6E00
+3300
+3300
+3300
+3300
+3300
+3300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char111
+ENCODING 111
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+3E00
+6300
+6300
+6300
+6300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char112
+ENCODING 112
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+6E00
+3300
+3300
+3300
+3300
+3300
+3E00
+3000
+3000
+7800
+0000
+ENDCHAR
+STARTCHAR char113
+ENCODING 113
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+3B00
+6600
+6600
+6600
+6600
+6600
+3E00
+0600
+0600
+0F00
+0000
+ENDCHAR
+STARTCHAR char114
+ENCODING 114
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+6E00
+3B00
+3300
+3000
+3000
+3000
+7800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char115
+ENCODING 115
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+3E00
+6300
+3000
+1C00
+0600
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char116
+ENCODING 116
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0800
+1800
+1800
+7E00
+1800
+1800
+1800
+1800
+1B00
+0E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char117
+ENCODING 117
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+6600
+6600
+6600
+6600
+6600
+6600
+3B00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char118
+ENCODING 118
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+C300
+C300
+C300
+C300
+6600
+3C00
+1800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char119
+ENCODING 119
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+C300
+C300
+C300
+DB00
+DB00
+FF00
+6600
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char120
+ENCODING 120
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+C300
+6600
+3C00
+1800
+3C00
+6600
+C300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char121
+ENCODING 121
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+6300
+6300
+6300
+6300
+6300
+6300
+3F00
+0300
+0600
+7C00
+0000
+ENDCHAR
+STARTCHAR char122
+ENCODING 122
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+7F00
+6600
+0C00
+1800
+3000
+6300
+7F00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char123
+ENCODING 123
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0E00
+1800
+1800
+1800
+7000
+1800
+1800
+1800
+1800
+0E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char124
+ENCODING 124
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+1800
+1800
+1800
+1800
+1800
+1800
+1800
+1800
+1800
+1800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char125
+ENCODING 125
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7000
+1800
+1800
+1800
+0E00
+1800
+1800
+1800
+1800
+7000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char126
+ENCODING 126
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3B00
+6E00
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char127
+ENCODING 127
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+7F00
+7F00
+7F00
+7F00
+7F00
+7F00
+7F00
+7F00
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char0
+ENCODING 128
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0F80
+0F80
+0F80
+0F80
+0F80
+ENDCHAR
+STARTCHAR char1
+ENCODING 129
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+0000
+0000
+0000
+0000
+0000
+0000
+0F80
+0F80
+0F80
+0F80
+0F80
+ENDCHAR
+STARTCHAR char2
+ENCODING 130
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+0000
+0000
+0000
+0000
+0000
+0000
+0F80
+0F80
+0F80
+0F80
+0F80
+ENDCHAR
+STARTCHAR char1
+ENCODING 131
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+0000
+0000
+0000
+0000
+0000
+0000
+0F80
+0F80
+0F80
+0F80
+0F80
+ENDCHAR
+STARTCHAR char0
+ENCODING 132
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+F000
+F000
+F000
+F000
+F000
+F000
+0F80
+0F80
+0F80
+0F80
+0F80
+ENDCHAR
+STARTCHAR char1
+ENCODING 133
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+0F80
+0F80
+0F80
+0F80
+0F80
+ENDCHAR
+STARTCHAR char2
+ENCODING 134
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+F000
+F000
+F000
+F000
+F000
+F000
+0F80
+0F80
+0F80
+0F80
+0F80
+ENDCHAR
+STARTCHAR char1
+ENCODING 135
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+F000
+F000
+F000
+F000
+F000
+F000
+0F80
+0F80
+0F80
+0F80
+0F80
+ENDCHAR
+STARTCHAR char0
+ENCODING 136
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+ENDCHAR
+STARTCHAR char1
+ENCODING 137
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+ENDCHAR
+STARTCHAR char2
+ENCODING 138
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+ENDCHAR
+STARTCHAR char1
+ENCODING 139
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+ENDCHAR
+STARTCHAR char0
+ENCODING 140
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+0F80
+0F80
+0F80
+0F80
+0F80
+ENDCHAR
+STARTCHAR char1
+ENCODING 141
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+0F80
+0F80
+0F80
+0F80
+0F80
+ENDCHAR
+STARTCHAR char2
+ENCODING 142
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+0F80
+0F80
+0F80
+0F80
+0F80
+ENDCHAR
+STARTCHAR char1
+ENCODING 143
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+0F80
+0F80
+0F80
+0F80
+0F80
+ENDCHAR
+STARTCHAR char0
+ENCODING 144
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+FF80
+FF80
+FF80
+FF80
+FF80
+ENDCHAR
+STARTCHAR char1
+ENCODING 145
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+0000
+0000
+0000
+0000
+0000
+0000
+FF80
+FF80
+FF80
+FF80
+FF80
+ENDCHAR
+STARTCHAR char2
+ENCODING 146
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+0000
+0000
+0000
+0000
+0000
+0000
+FF80
+FF80
+FF80
+FF80
+FF80
+ENDCHAR
+STARTCHAR char1
+ENCODING 147
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+0000
+0000
+0000
+0000
+0000
+0000
+FF80
+FF80
+FF80
+FF80
+FF80
+ENDCHAR
+STARTCHAR char0
+ENCODING 148
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+F000
+F000
+F000
+F000
+F000
+F000
+FF80
+FF80
+FF80
+FF80
+FF80
+ENDCHAR
+STARTCHAR char1
+ENCODING 149
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+FF80
+FF80
+FF80
+FF80
+FF80
+ENDCHAR
+STARTCHAR char2
+ENCODING 150
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+F000
+F000
+F000
+F000
+F000
+F000
+FF80
+FF80
+FF80
+FF80
+FF80
+ENDCHAR
+STARTCHAR char1
+ENCODING 151
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+F000
+F000
+F000
+F000
+F000
+F000
+FF80
+FF80
+FF80
+FF80
+FF80
+ENDCHAR
+STARTCHAR char0
+ENCODING 152
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+FF80
+FF80
+FF80
+FF80
+FF80
+ENDCHAR
+STARTCHAR char1
+ENCODING 153
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+FF80
+FF80
+FF80
+FF80
+FF80
+ENDCHAR
+STARTCHAR char2
+ENCODING 154
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+FF80
+FF80
+FF80
+FF80
+FF80
+ENDCHAR
+STARTCHAR char1
+ENCODING 155
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+FF80
+FF80
+FF80
+FF80
+FF80
+ENDCHAR
+STARTCHAR char0
+ENCODING 156
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+ENDCHAR
+STARTCHAR char1
+ENCODING 157
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+ENDCHAR
+STARTCHAR char2
+ENCODING 158
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+ENDCHAR
+STARTCHAR char1
+ENCODING 159
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+ENDCHAR
+STARTCHAR char160
+ENCODING 160
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+0880
+0880
+0880
+0880
+FF80
+0880
+0880
+0880
+0880
+0880
+FF80
+0880
+0880
+0880
+0880
+ENDCHAR
+STARTCHAR char161
+ENCODING 161
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+1800
+1800
+0000
+1800
+1800
+1800
+3C00
+3C00
+3C00
+1800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char162
+ENCODING 162
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+1800
+1800
+7E00
+C300
+C000
+C000
+C000
+C300
+7E00
+1800
+1800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char163
+ENCODING 163
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+1C00
+3600
+3200
+3000
+7800
+3000
+3000
+3000
+3000
+7300
+7E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char164
+ENCODING 164
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+4100
+6300
+3E00
+6300
+6300
+6300
+6300
+3E00
+6300
+4100
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char165
+ENCODING 165
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+C300
+6600
+3C00
+1800
+FF00
+1800
+FF00
+1800
+1800
+1800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char166
+ENCODING 166
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+6600
+6600
+6600
+6600
+6600
+6600
+6600
+6600
+6600
+6600
+6600
+6600
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char167
+ENCODING 167
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+3E00
+6300
+3000
+1C00
+3600
+6300
+6300
+3600
+1C00
+0600
+6300
+3E00
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char168
+ENCODING 168
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3C00
+7E00
+DB00
+FF00
+BD00
+C300
+E700
+FF00
+7E00
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char169
+ENCODING 169
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3E00
+6300
+4100
+5D00
+5100
+5100
+5D00
+4100
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char170
+ENCODING 170
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+3800
+0C00
+3C00
+6400
+3C00
+0000
+7C00
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char171
+ENCODING 171
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+1800
+3000
+7F00
+7F00
+3000
+1800
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char172
+ENCODING 172
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+1800
+3C00
+7E00
+5A00
+1800
+1800
+1800
+1800
+1800
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char173
+ENCODING 173
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+FF80
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char174
+ENCODING 174
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3E00
+6300
+4100
+5D00
+5500
+5900
+5500
+4100
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char175
+ENCODING 175
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+7F00
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char176
+ENCODING 176
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+1C00
+3600
+3600
+1C00
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char177
+ENCODING 177
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+1800
+1800
+7E00
+1800
+1800
+0000
+0000
+7E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char178
+ENCODING 178
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+3800
+6C00
+1800
+3000
+6400
+7C00
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char179
+ENCODING 179
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+7C00
+0C00
+1800
+0C00
+6C00
+3800
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char180
+ENCODING 180
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+1800
+3000
+6000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char181
+ENCODING 181
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+6600
+6600
+6600
+6600
+6600
+7E00
+6300
+6000
+C000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char182
+ENCODING 182
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7F00
+DB00
+DB00
+DB00
+7B00
+1B00
+1B00
+1B00
+1B00
+1B00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char183
+ENCODING 183
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+1800
+1800
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char184
+ENCODING 184
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0080
+0100
+0300
+0600
+0C00
+1C00
+3000
+7F00
+7700
+0E00
+1C00
+1800
+3000
+6000
+8000
+0000
+ENDCHAR
+STARTCHAR char185
+ENCODING 185
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+3000
+7000
+3000
+3000
+3000
+7800
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char186
+ENCODING 186
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+3800
+6C00
+4400
+6C00
+3800
+0000
+7C00
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char187
+ENCODING 187
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0C00
+0600
+7F00
+7F00
+0600
+0C00
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char188
+ENCODING 188
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+6000
+6000
+6100
+6300
+6600
+0C00
+1800
+3300
+6700
+4B00
+1F00
+0300
+0300
+0000
+0000
+ENDCHAR
+STARTCHAR char189
+ENCODING 189
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+6000
+6000
+6100
+6300
+6600
+0C00
+1800
+3000
+6700
+4D80
+0300
+0600
+0F80
+0000
+0000
+ENDCHAR
+STARTCHAR char190
+ENCODING 190
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+7800
+1800
+3900
+1B00
+7600
+0C00
+1800
+3300
+6700
+4B00
+1F00
+0300
+0300
+0000
+0000
+ENDCHAR
+STARTCHAR char191
+ENCODING 191
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+1800
+1800
+0000
+1800
+1800
+3000
+6000
+6300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char238
+ENCODING 192
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+CE00
+DB00
+DB00
+FB00
+DB00
+DB00
+CE00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char160
+ENCODING 193
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+7800
+0C00
+7C00
+CC00
+CC00
+CC00
+7600
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char161
+ENCODING 194
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0200
+0600
+3C00
+6000
+6000
+7C00
+6600
+6600
+6600
+6600
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char230
+ENCODING 195
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+CC00
+CC00
+CC00
+CC00
+CC00
+CC00
+FE00
+0600
+0600
+0000
+0000
+ENDCHAR
+STARTCHAR char164
+ENCODING 196
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+1E00
+3600
+3600
+6600
+6600
+6600
+FF00
+C300
+C300
+0000
+0000
+ENDCHAR
+STARTCHAR char165
+ENCODING 197
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+7C00
+C600
+FE00
+C000
+C000
+C600
+7C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char228
+ENCODING 198
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+3C00
+1800
+7E00
+DB00
+DB00
+DB00
+DB00
+7E00
+1800
+1800
+3C00
+0000
+ENDCHAR
+STARTCHAR char163
+ENCODING 199
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+7E00
+3200
+3200
+3000
+3000
+3000
+7800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char229
+ENCODING 200
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+C600
+6C00
+3800
+3800
+3800
+6C00
+C600
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char168
+ENCODING 201
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+C600
+C600
+CE00
+D600
+E600
+C600
+C600
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char169
+ENCODING 202
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+3800
+3800
+C600
+C600
+CE00
+D600
+E600
+C600
+C600
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char170
+ENCODING 203
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+E600
+6C00
+7800
+7800
+6C00
+6600
+E600
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char171
+ENCODING 204
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+1E00
+3600
+6600
+6600
+6600
+6600
+6600
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char172
+ENCODING 205
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+C600
+EE00
+FE00
+FE00
+D600
+D600
+C600
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char173
+ENCODING 206
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+C600
+C600
+C600
+FE00
+C600
+C600
+C600
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char174
+ENCODING 207
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+7C00
+C600
+C600
+C600
+C600
+C600
+7C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char175
+ENCODING 208
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+FE00
+C600
+C600
+C600
+C600
+C600
+C600
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char239
+ENCODING 209
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+7E00
+CC00
+CC00
+FC00
+6C00
+CC00
+CE00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char224
+ENCODING 210
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+DC00
+6600
+6600
+6600
+6600
+6600
+7C00
+6000
+6000
+F000
+0000
+ENDCHAR
+STARTCHAR char225
+ENCODING 211
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+7C00
+C600
+C000
+C000
+C000
+C600
+7C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char226
+ENCODING 212
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+7E00
+5A00
+1800
+1800
+1800
+1800
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char227
+ENCODING 213
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+C600
+C600
+C600
+C600
+C600
+7E00
+0600
+0600
+C600
+7C00
+0000
+ENDCHAR
+STARTCHAR char166
+ENCODING 214
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+D600
+D600
+5400
+7C00
+5400
+D600
+D600
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char162
+ENCODING 215
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+FC00
+6600
+6600
+7C00
+6600
+6600
+FC00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char236
+ENCODING 216
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+F000
+6000
+6000
+7C00
+6600
+6600
+FC00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char235
+ENCODING 217
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+C600
+C600
+C600
+F600
+DE00
+DE00
+F600
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char167
+ENCODING 218
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+3C00
+6600
+0600
+0C00
+0600
+6600
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char232
+ENCODING 219
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+D600
+D600
+D600
+D600
+D600
+D600
+FE00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char237
+ENCODING 220
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+3C00
+6600
+0600
+1E00
+0600
+6600
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char233
+ENCODING 221
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+D600
+D600
+D600
+D600
+D600
+D600
+FE00
+0300
+0300
+0000
+0000
+ENDCHAR
+STARTCHAR char231
+ENCODING 222
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+C600
+C600
+C600
+C600
+7E00
+0600
+0600
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char234
+ENCODING 223
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+F800
+B000
+3000
+3E00
+3300
+3300
+7E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char158
+ENCODING 224
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+CE00
+DB00
+DB00
+DB00
+FB00
+DB00
+DB00
+DB00
+DB00
+CE00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char128
+ENCODING 225
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+1E00
+3600
+6600
+C600
+C600
+FE00
+C600
+C600
+C600
+C600
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char129
+ENCODING 226
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+FE00
+6200
+6200
+6000
+7C00
+6600
+6600
+6600
+6600
+FC00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char150
+ENCODING 227
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+CC00
+CC00
+CC00
+CC00
+CC00
+CC00
+CC00
+CC00
+CC00
+FE00
+0600
+0600
+0000
+0000
+ENDCHAR
+STARTCHAR char132
+ENCODING 228
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+1E00
+3600
+6600
+6600
+6600
+6600
+6600
+6600
+6600
+FF00
+C300
+8100
+0000
+0000
+ENDCHAR
+STARTCHAR char133
+ENCODING 229
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+FE00
+6600
+6200
+6800
+7800
+6800
+6000
+6200
+6600
+FE00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char148
+ENCODING 230
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+3C00
+1800
+7E00
+DB00
+DB00
+DB00
+DB00
+DB00
+7E00
+1800
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char131
+ENCODING 231
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+FE00
+6200
+6200
+6000
+6000
+6000
+6000
+6000
+6000
+F000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char149
+ENCODING 232
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+C600
+C600
+6C00
+7C00
+3800
+3800
+7C00
+6C00
+C600
+C600
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char136
+ENCODING 233
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+C600
+C600
+CE00
+CE00
+D600
+E600
+E600
+C600
+C600
+C600
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char137
+ENCODING 234
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+3800
+3800
+C600
+C600
+CE00
+CE00
+D600
+E600
+E600
+C600
+C600
+C600
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char138
+ENCODING 235
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+E600
+6600
+6C00
+6C00
+7800
+7800
+6C00
+6C00
+6600
+E600
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char139
+ENCODING 236
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+1E00
+3600
+6600
+C600
+C600
+C600
+C600
+C600
+C600
+C600
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char140
+ENCODING 237
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+C600
+EE00
+FE00
+FE00
+D600
+C600
+C600
+C600
+C600
+C600
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char141
+ENCODING 238
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+C600
+C600
+C600
+C600
+FE00
+C600
+C600
+C600
+C600
+C600
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char142
+ENCODING 239
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7C00
+C600
+C600
+C600
+C600
+C600
+C600
+C600
+C600
+7C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char143
+ENCODING 240
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+FE00
+C600
+C600
+C600
+C600
+C600
+C600
+C600
+C600
+C600
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char159
+ENCODING 241
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3F00
+6600
+6600
+6600
+3E00
+3E00
+6600
+6600
+6600
+E700
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char144
+ENCODING 242
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+FC00
+6600
+6600
+6600
+7C00
+6000
+6000
+6000
+6000
+F000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char145
+ENCODING 243
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3C00
+6600
+C200
+C000
+C000
+C000
+C000
+C200
+6600
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char146
+ENCODING 244
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7E00
+5A00
+1800
+1800
+1800
+1800
+1800
+1800
+1800
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char147
+ENCODING 245
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+C600
+C600
+C600
+C600
+C600
+7E00
+0600
+0600
+C600
+7C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char134
+ENCODING 246
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+D600
+D600
+5400
+5400
+7C00
+7C00
+5400
+D600
+D600
+D600
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char130
+ENCODING 247
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+FC00
+6600
+6600
+6600
+7C00
+6600
+6600
+6600
+6600
+FC00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char156
+ENCODING 248
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+F000
+6000
+6000
+6000
+7C00
+6600
+6600
+6600
+6600
+FC00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char155
+ENCODING 249
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+C300
+C300
+C300
+C300
+F300
+DB00
+DB00
+DB00
+DB00
+F300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char135
+ENCODING 250
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7C00
+C600
+0600
+0600
+3C00
+0600
+0600
+0600
+C600
+7C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char152
+ENCODING 251
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+DB00
+DB00
+DB00
+DB00
+DB00
+DB00
+DB00
+DB00
+DB00
+FF00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char157
+ENCODING 252
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7C00
+C600
+0600
+2600
+3E00
+2600
+0600
+0600
+C600
+7C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char153
+ENCODING 253
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+DB00
+DB00
+DB00
+DB00
+DB00
+DB00
+DB00
+DB00
+DB00
+FF00
+0300
+0300
+0000
+0000
+ENDCHAR
+STARTCHAR char151
+ENCODING 254
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+C600
+C600
+C600
+C600
+C600
+7E00
+0600
+0600
+0600
+0600
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char154
+ENCODING 255
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+F800
+B000
+3000
+3000
+3C00
+3600
+3600
+3600
+3600
+7C00
+0000
+0000
+0000
+0000
+ENDCHAR
+ENDFONT
diff --git a/util/alevt/vtxt-latin-1.bdf b/util/alevt/vtxt-latin-1.bdf
new file mode 100644
index 0000000..2f1a11b
--- /dev/null
+++ b/util/alevt/vtxt-latin-1.bdf
@@ -0,0 +1,5906 @@
+STARTFONT 2.1
+FONT -alevt-teletext-medium-r-normal--16-1-75-75-c-90-fontspecific-1
+SIZE 1 75 75
+FONTBOUNDINGBOX 9 16 0 -4
+STARTPROPERTIES 10
+POINT_SIZE 1
+PIXEL_SIZE 16
+RESOLUTION_X 75
+RESOLUTION_Y 75
+FONT_ASCENT 12
+FONT_DESCENT 4
+AVERAGE_WIDTH 90
+SPACING "C"
+_XMBDFED_INFO "Edited with xmbdfed 2.4."
+FONT "vtxt"
+ENDPROPERTIES
+CHARS 256
+STARTCHAR char0
+ENCODING 0
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char1
+ENCODING 1
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char2
+ENCODING 2
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char1
+ENCODING 3
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char0
+ENCODING 4
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+F000
+F000
+F000
+F000
+F000
+F000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char1
+ENCODING 5
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char2
+ENCODING 6
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+F000
+F000
+F000
+F000
+F000
+F000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char1
+ENCODING 7
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+F000
+F000
+F000
+F000
+F000
+F000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char0
+ENCODING 8
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char1
+ENCODING 9
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char2
+ENCODING 10
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char1
+ENCODING 11
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char0
+ENCODING 12
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char1
+ENCODING 13
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char2
+ENCODING 14
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char1
+ENCODING 15
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char0
+ENCODING 16
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+F000
+F000
+F000
+F000
+F000
+ENDCHAR
+STARTCHAR char1
+ENCODING 17
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+0000
+0000
+0000
+0000
+0000
+0000
+F000
+F000
+F000
+F000
+F000
+ENDCHAR
+STARTCHAR char2
+ENCODING 18
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+0000
+0000
+0000
+0000
+0000
+0000
+F000
+F000
+F000
+F000
+F000
+ENDCHAR
+STARTCHAR char1
+ENCODING 19
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+0000
+0000
+0000
+0000
+0000
+0000
+F000
+F000
+F000
+F000
+F000
+ENDCHAR
+STARTCHAR char0
+ENCODING 20
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+ENDCHAR
+STARTCHAR char1
+ENCODING 21
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+ENDCHAR
+STARTCHAR char2
+ENCODING 22
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+ENDCHAR
+STARTCHAR char1
+ENCODING 23
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+ENDCHAR
+STARTCHAR char0
+ENCODING 24
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+F000
+F000
+F000
+F000
+F000
+ENDCHAR
+STARTCHAR char1
+ENCODING 25
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+F000
+F000
+F000
+F000
+F000
+ENDCHAR
+STARTCHAR char2
+ENCODING 26
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+F000
+F000
+F000
+F000
+F000
+ENDCHAR
+STARTCHAR char1
+ENCODING 27
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+F000
+F000
+F000
+F000
+F000
+ENDCHAR
+STARTCHAR char0
+ENCODING 28
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+F000
+F000
+F000
+F000
+F000
+ENDCHAR
+STARTCHAR char1
+ENCODING 29
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+F000
+F000
+F000
+F000
+F000
+ENDCHAR
+STARTCHAR char2
+ENCODING 30
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+F000
+F000
+F000
+F000
+F000
+ENDCHAR
+STARTCHAR char1
+ENCODING 31
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+F000
+F000
+F000
+F000
+F000
+ENDCHAR
+STARTCHAR char32
+ENCODING 32
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char33
+ENCODING 33
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+1800
+3C00
+3C00
+3C00
+1800
+1800
+1800
+0000
+1800
+1800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char34
+ENCODING 34
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+6600
+6600
+6600
+2400
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char35
+ENCODING 35
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+3600
+3600
+7F00
+3600
+3600
+3600
+7F00
+3600
+3600
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char36
+ENCODING 36
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0C00
+0C00
+3E00
+6300
+6100
+6000
+3E00
+0300
+0300
+4300
+6300
+3E00
+0C00
+0C00
+0000
+0000
+ENDCHAR
+STARTCHAR char37
+ENCODING 37
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+6100
+6300
+0600
+0C00
+1800
+3000
+6300
+4300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char38
+ENCODING 38
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+1C00
+3600
+3600
+1C00
+3B00
+6E00
+6600
+6600
+6600
+3B00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char39
+ENCODING 39
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+3000
+3000
+3000
+6000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char40
+ENCODING 40
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0C00
+1800
+3000
+3000
+3000
+3000
+3000
+3000
+1800
+0C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char41
+ENCODING 41
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3000
+1800
+0C00
+0C00
+0C00
+0C00
+0C00
+0C00
+1800
+3000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char42
+ENCODING 42
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+6600
+3C00
+FF00
+3C00
+6600
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char43
+ENCODING 43
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+1800
+1800
+7E00
+1800
+1800
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char44
+ENCODING 44
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+1800
+1800
+1800
+3000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char45
+ENCODING 45
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+7F00
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char46
+ENCODING 46
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+1800
+1800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char47
+ENCODING 47
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0100
+0300
+0600
+0C00
+1800
+3000
+6000
+4000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char48
+ENCODING 48
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3C00
+6600
+C300
+C300
+DB00
+DB00
+C300
+C300
+6600
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char49
+ENCODING 49
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+1800
+3800
+7800
+1800
+1800
+1800
+1800
+1800
+1800
+7E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char50
+ENCODING 50
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3E00
+6300
+0300
+0600
+0C00
+1800
+3000
+6000
+6300
+7F00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char51
+ENCODING 51
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3E00
+6300
+0300
+0300
+1E00
+0300
+0300
+0300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char52
+ENCODING 52
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0600
+0E00
+1E00
+3600
+6600
+7F00
+0600
+0600
+0600
+0F00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char53
+ENCODING 53
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7F00
+6000
+6000
+6000
+7E00
+0300
+0300
+0300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char54
+ENCODING 54
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+1C00
+3000
+6000
+6000
+7E00
+6300
+6300
+6300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char55
+ENCODING 55
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7F00
+6300
+0300
+0300
+0600
+0C00
+1800
+1800
+1800
+1800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char56
+ENCODING 56
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3E00
+6300
+6300
+6300
+3E00
+6300
+6300
+6300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char57
+ENCODING 57
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3E00
+6300
+6300
+6300
+3F00
+0300
+0300
+0300
+0600
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char58
+ENCODING 58
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+1800
+1800
+0000
+0000
+0000
+1800
+1800
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char59
+ENCODING 59
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+1800
+1800
+0000
+0000
+0000
+1800
+1800
+1800
+3000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char60
+ENCODING 60
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0600
+0C00
+1800
+3000
+6000
+3000
+1800
+0C00
+0600
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char61
+ENCODING 61
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+7E00
+0000
+0000
+7E00
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char62
+ENCODING 62
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+6000
+3000
+1800
+0C00
+0600
+0C00
+1800
+3000
+6000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char63
+ENCODING 63
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3E00
+6300
+6300
+0600
+0C00
+0C00
+0C00
+0000
+0C00
+0C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char64
+ENCODING 64
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+3E00
+6300
+6300
+6F00
+6F00
+6F00
+6E00
+6000
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char65
+ENCODING 65
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0800
+1C00
+3600
+6300
+6300
+7F00
+6300
+6300
+6300
+6300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char66
+ENCODING 66
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7E00
+3300
+3300
+3300
+3E00
+3300
+3300
+3300
+3300
+7E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char67
+ENCODING 67
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+1E00
+3300
+6100
+6000
+6000
+6000
+6000
+6100
+3300
+1E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char68
+ENCODING 68
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7C00
+3600
+3300
+3300
+3300
+3300
+3300
+3300
+3600
+7C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char69
+ENCODING 69
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7F00
+3300
+3100
+3400
+3C00
+3400
+3000
+3100
+3300
+7F00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char70
+ENCODING 70
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7F00
+3300
+3100
+3400
+3C00
+3400
+3000
+3000
+3000
+7800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char71
+ENCODING 71
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+1E00
+3300
+6100
+6000
+6000
+6F00
+6300
+6300
+3300
+1D00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char72
+ENCODING 72
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+6300
+6300
+6300
+6300
+7F00
+6300
+6300
+6300
+6300
+6300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char73
+ENCODING 73
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3C00
+1800
+1800
+1800
+1800
+1800
+1800
+1800
+1800
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char74
+ENCODING 74
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0F00
+0600
+0600
+0600
+0600
+0600
+6600
+6600
+6600
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char75
+ENCODING 75
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7300
+3300
+3300
+3600
+3C00
+3C00
+3600
+3300
+3300
+7300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char76
+ENCODING 76
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7800
+3000
+3000
+3000
+3000
+3000
+3000
+3100
+3300
+7F00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char77
+ENCODING 77
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+C300
+E700
+FF00
+FF00
+DB00
+C300
+C300
+C300
+C300
+C300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char78
+ENCODING 78
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+6300
+7300
+7B00
+7F00
+6F00
+6700
+6300
+6300
+6300
+6300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char79
+ENCODING 79
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3E00
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char80
+ENCODING 80
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7E00
+3300
+3300
+3300
+3E00
+3000
+3000
+3000
+3000
+7800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char81
+ENCODING 81
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3E00
+6300
+6300
+6300
+6300
+6300
+6300
+6B00
+6F00
+3E00
+0600
+0700
+0000
+0000
+ENDCHAR
+STARTCHAR char82
+ENCODING 82
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7E00
+3300
+3300
+3300
+3E00
+3600
+3300
+3300
+3300
+7300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char83
+ENCODING 83
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3E00
+6300
+6300
+3000
+1C00
+0600
+0300
+6300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char84
+ENCODING 84
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+FF00
+DB00
+9900
+1800
+1800
+1800
+1800
+1800
+1800
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char85
+ENCODING 85
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char86
+ENCODING 86
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+C300
+C300
+C300
+C300
+C300
+C300
+C300
+6600
+3C00
+1800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char87
+ENCODING 87
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+C300
+C300
+C300
+C300
+C300
+DB00
+DB00
+FF00
+6600
+6600
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char88
+ENCODING 88
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+C300
+C300
+6600
+3C00
+1800
+1800
+3C00
+6600
+C300
+C300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char89
+ENCODING 89
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+C300
+C300
+C300
+6600
+3C00
+1800
+1800
+1800
+1800
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char90
+ENCODING 90
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+FF00
+C300
+8600
+0C00
+1800
+3000
+6000
+C100
+C300
+FF00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char91
+ENCODING 91
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3C00
+3000
+3000
+3000
+3000
+3000
+3000
+3000
+3000
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char92
+ENCODING 92
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+4000
+6000
+7000
+3800
+1C00
+0E00
+0700
+0300
+0100
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char93
+ENCODING 93
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3C00
+0C00
+0C00
+0C00
+0C00
+0C00
+0C00
+0C00
+0C00
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char94
+ENCODING 94
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0800
+1C00
+3600
+6300
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char95
+ENCODING 95
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+FF80
+0000
+0000
+ENDCHAR
+STARTCHAR char96
+ENCODING 96
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+3000
+3000
+1800
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char97
+ENCODING 97
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+3C00
+0600
+3E00
+6600
+6600
+6600
+3B00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char98
+ENCODING 98
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7000
+3000
+3000
+3C00
+3600
+3300
+3300
+3300
+3300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char99
+ENCODING 99
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+3E00
+6300
+6000
+6000
+6000
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char100
+ENCODING 100
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0E00
+0600
+0600
+1E00
+3600
+6600
+6600
+6600
+6600
+3B00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char101
+ENCODING 101
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+3E00
+6300
+7F00
+6000
+6000
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char102
+ENCODING 102
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+1C00
+3600
+3200
+3000
+7800
+3000
+3000
+3000
+3000
+7800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char103
+ENCODING 103
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+3B00
+6600
+6600
+6600
+6600
+6600
+3E00
+0600
+6600
+3C00
+0000
+ENDCHAR
+STARTCHAR char104
+ENCODING 104
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7000
+3000
+3000
+3600
+3B00
+3300
+3300
+3300
+3300
+7300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char105
+ENCODING 105
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+1800
+1800
+0000
+3800
+1800
+1800
+1800
+1800
+1800
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char106
+ENCODING 106
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0600
+0600
+0000
+0E00
+0600
+0600
+0600
+0600
+0600
+0600
+6600
+6600
+3C00
+0000
+ENDCHAR
+STARTCHAR char107
+ENCODING 107
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7000
+3000
+3000
+3300
+3600
+3C00
+3C00
+3600
+3300
+7300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char108
+ENCODING 108
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3800
+1800
+1800
+1800
+1800
+1800
+1800
+1800
+1800
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char109
+ENCODING 109
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+E600
+FF00
+DB00
+DB00
+DB00
+DB00
+DB00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char110
+ENCODING 110
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+6E00
+3300
+3300
+3300
+3300
+3300
+3300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char111
+ENCODING 111
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+3E00
+6300
+6300
+6300
+6300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char112
+ENCODING 112
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+6E00
+3300
+3300
+3300
+3300
+3300
+3E00
+3000
+3000
+7800
+0000
+ENDCHAR
+STARTCHAR char113
+ENCODING 113
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+3B00
+6600
+6600
+6600
+6600
+6600
+3E00
+0600
+0600
+0F00
+0000
+ENDCHAR
+STARTCHAR char114
+ENCODING 114
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+6E00
+3B00
+3300
+3000
+3000
+3000
+7800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char115
+ENCODING 115
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+3E00
+6300
+3000
+1C00
+0600
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char116
+ENCODING 116
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0800
+1800
+1800
+7E00
+1800
+1800
+1800
+1800
+1B00
+0E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char117
+ENCODING 117
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+6600
+6600
+6600
+6600
+6600
+6600
+3B00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char118
+ENCODING 118
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+C300
+C300
+C300
+C300
+6600
+3C00
+1800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char119
+ENCODING 119
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+C300
+C300
+C300
+DB00
+DB00
+FF00
+6600
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char120
+ENCODING 120
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+C300
+6600
+3C00
+1800
+3C00
+6600
+C300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char121
+ENCODING 121
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+6300
+6300
+6300
+6300
+6300
+6300
+3F00
+0300
+0600
+7C00
+0000
+ENDCHAR
+STARTCHAR char122
+ENCODING 122
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+7F00
+6600
+0C00
+1800
+3000
+6300
+7F00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char123
+ENCODING 123
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0E00
+1800
+1800
+1800
+7000
+1800
+1800
+1800
+1800
+0E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char124
+ENCODING 124
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+1800
+1800
+1800
+1800
+1800
+1800
+1800
+1800
+1800
+1800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char125
+ENCODING 125
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7000
+1800
+1800
+1800
+0E00
+1800
+1800
+1800
+1800
+7000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char126
+ENCODING 126
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3B00
+6E00
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char127
+ENCODING 127
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+7F00
+7F00
+7F00
+7F00
+7F00
+7F00
+7F00
+7F00
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char0
+ENCODING 128
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0F80
+0F80
+0F80
+0F80
+0F80
+ENDCHAR
+STARTCHAR char1
+ENCODING 129
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+0000
+0000
+0000
+0000
+0000
+0000
+0F80
+0F80
+0F80
+0F80
+0F80
+ENDCHAR
+STARTCHAR char2
+ENCODING 130
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+0000
+0000
+0000
+0000
+0000
+0000
+0F80
+0F80
+0F80
+0F80
+0F80
+ENDCHAR
+STARTCHAR char1
+ENCODING 131
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+0000
+0000
+0000
+0000
+0000
+0000
+0F80
+0F80
+0F80
+0F80
+0F80
+ENDCHAR
+STARTCHAR char0
+ENCODING 132
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+F000
+F000
+F000
+F000
+F000
+F000
+0F80
+0F80
+0F80
+0F80
+0F80
+ENDCHAR
+STARTCHAR char1
+ENCODING 133
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+0F80
+0F80
+0F80
+0F80
+0F80
+ENDCHAR
+STARTCHAR char2
+ENCODING 134
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+F000
+F000
+F000
+F000
+F000
+F000
+0F80
+0F80
+0F80
+0F80
+0F80
+ENDCHAR
+STARTCHAR char1
+ENCODING 135
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+F000
+F000
+F000
+F000
+F000
+F000
+0F80
+0F80
+0F80
+0F80
+0F80
+ENDCHAR
+STARTCHAR char0
+ENCODING 136
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+ENDCHAR
+STARTCHAR char1
+ENCODING 137
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+ENDCHAR
+STARTCHAR char2
+ENCODING 138
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+ENDCHAR
+STARTCHAR char1
+ENCODING 139
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+ENDCHAR
+STARTCHAR char0
+ENCODING 140
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+0F80
+0F80
+0F80
+0F80
+0F80
+ENDCHAR
+STARTCHAR char1
+ENCODING 141
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+0F80
+0F80
+0F80
+0F80
+0F80
+ENDCHAR
+STARTCHAR char2
+ENCODING 142
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+0F80
+0F80
+0F80
+0F80
+0F80
+ENDCHAR
+STARTCHAR char1
+ENCODING 143
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+0F80
+0F80
+0F80
+0F80
+0F80
+ENDCHAR
+STARTCHAR char0
+ENCODING 144
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+FF80
+FF80
+FF80
+FF80
+FF80
+ENDCHAR
+STARTCHAR char1
+ENCODING 145
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+0000
+0000
+0000
+0000
+0000
+0000
+FF80
+FF80
+FF80
+FF80
+FF80
+ENDCHAR
+STARTCHAR char2
+ENCODING 146
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+0000
+0000
+0000
+0000
+0000
+0000
+FF80
+FF80
+FF80
+FF80
+FF80
+ENDCHAR
+STARTCHAR char1
+ENCODING 147
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+0000
+0000
+0000
+0000
+0000
+0000
+FF80
+FF80
+FF80
+FF80
+FF80
+ENDCHAR
+STARTCHAR char0
+ENCODING 148
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+F000
+F000
+F000
+F000
+F000
+F000
+FF80
+FF80
+FF80
+FF80
+FF80
+ENDCHAR
+STARTCHAR char1
+ENCODING 149
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+FF80
+FF80
+FF80
+FF80
+FF80
+ENDCHAR
+STARTCHAR char2
+ENCODING 150
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+F000
+F000
+F000
+F000
+F000
+F000
+FF80
+FF80
+FF80
+FF80
+FF80
+ENDCHAR
+STARTCHAR char1
+ENCODING 151
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+F000
+F000
+F000
+F000
+F000
+F000
+FF80
+FF80
+FF80
+FF80
+FF80
+ENDCHAR
+STARTCHAR char0
+ENCODING 152
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+FF80
+FF80
+FF80
+FF80
+FF80
+ENDCHAR
+STARTCHAR char1
+ENCODING 153
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+FF80
+FF80
+FF80
+FF80
+FF80
+ENDCHAR
+STARTCHAR char2
+ENCODING 154
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+FF80
+FF80
+FF80
+FF80
+FF80
+ENDCHAR
+STARTCHAR char1
+ENCODING 155
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+FF80
+FF80
+FF80
+FF80
+FF80
+ENDCHAR
+STARTCHAR char0
+ENCODING 156
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+ENDCHAR
+STARTCHAR char1
+ENCODING 157
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+ENDCHAR
+STARTCHAR char2
+ENCODING 158
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+ENDCHAR
+STARTCHAR char1
+ENCODING 159
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+ENDCHAR
+STARTCHAR char160
+ENCODING 160
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+0880
+0880
+0880
+0880
+FF80
+0880
+0880
+0880
+0880
+0880
+FF80
+0880
+0880
+0880
+0880
+ENDCHAR
+STARTCHAR char161
+ENCODING 161
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+1800
+1800
+0000
+1800
+1800
+1800
+3C00
+3C00
+3C00
+1800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char162
+ENCODING 162
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+1800
+1800
+7E00
+C300
+C000
+C000
+C000
+C300
+7E00
+1800
+1800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char163
+ENCODING 163
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+1C00
+3600
+3200
+3000
+7800
+3000
+3000
+3000
+3000
+7300
+7E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char164
+ENCODING 164
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+4100
+6300
+3E00
+6300
+6300
+6300
+6300
+3E00
+6300
+4100
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char165
+ENCODING 165
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+C300
+6600
+3C00
+1800
+FF00
+1800
+FF00
+1800
+1800
+1800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char166
+ENCODING 166
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+6600
+6600
+6600
+6600
+6600
+6600
+6600
+6600
+6600
+6600
+6600
+6600
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char167
+ENCODING 167
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+3E00
+6300
+3000
+1C00
+3600
+6300
+6300
+3600
+1C00
+0600
+6300
+3E00
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char168
+ENCODING 168
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3C00
+7E00
+DB00
+FF00
+BD00
+C300
+E700
+FF00
+7E00
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char169
+ENCODING 169
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3E00
+6300
+4100
+5D00
+5100
+5100
+5D00
+4100
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char170
+ENCODING 170
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+3800
+0C00
+3C00
+6400
+3C00
+0000
+7C00
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char171
+ENCODING 171
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+1800
+3000
+7F00
+7F00
+3000
+1800
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char172
+ENCODING 172
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+1800
+3C00
+7E00
+5A00
+1800
+1800
+1800
+1800
+1800
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char173
+ENCODING 173
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+FF80
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char174
+ENCODING 174
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3E00
+6300
+4100
+5D00
+5500
+5900
+5500
+4100
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char175
+ENCODING 175
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+7F00
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char176
+ENCODING 176
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+1C00
+3600
+3600
+1C00
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char177
+ENCODING 177
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+1800
+1800
+7E00
+1800
+1800
+0000
+0000
+7E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char178
+ENCODING 178
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+3800
+6C00
+1800
+3000
+6400
+7C00
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char179
+ENCODING 179
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+7C00
+0C00
+1800
+0C00
+6C00
+3800
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char180
+ENCODING 180
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+1800
+3000
+6000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char181
+ENCODING 181
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+6600
+6600
+6600
+6600
+6600
+7E00
+6300
+6000
+C000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char182
+ENCODING 182
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7F00
+DB00
+DB00
+DB00
+7B00
+1B00
+1B00
+1B00
+1B00
+1B00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char183
+ENCODING 183
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+1800
+1800
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char184
+ENCODING 184
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0080
+0100
+0300
+0600
+0C00
+1C00
+3000
+7F00
+7700
+0E00
+1C00
+1800
+3000
+6000
+8000
+0000
+ENDCHAR
+STARTCHAR char185
+ENCODING 185
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+3000
+7000
+3000
+3000
+3000
+7800
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char186
+ENCODING 186
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+3800
+6C00
+4400
+6C00
+3800
+0000
+7C00
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char187
+ENCODING 187
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0C00
+0600
+7F00
+7F00
+0600
+0C00
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char188
+ENCODING 188
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+6000
+6000
+6100
+6300
+6600
+0C00
+1800
+3300
+6700
+4B00
+1F00
+0300
+0300
+0000
+0000
+ENDCHAR
+STARTCHAR char189
+ENCODING 189
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+6000
+6000
+6100
+6300
+6600
+0C00
+1800
+3000
+6700
+4D80
+0300
+0600
+0F80
+0000
+0000
+ENDCHAR
+STARTCHAR char190
+ENCODING 190
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+7800
+1800
+3900
+1B00
+7600
+0C00
+1800
+3300
+6700
+4B00
+1F00
+0300
+0300
+0000
+0000
+ENDCHAR
+STARTCHAR char191
+ENCODING 191
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+1800
+1800
+0000
+1800
+1800
+3000
+6000
+6300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char192
+ENCODING 192
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+1800
+0C00
+0800
+1C00
+3600
+6300
+6300
+7F00
+6300
+6300
+6300
+6300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char193
+ENCODING 193
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0C00
+1800
+0800
+1C00
+3600
+6300
+6300
+7F00
+6300
+6300
+6300
+6300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char194
+ENCODING 194
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+1C00
+3600
+0800
+1C00
+3600
+6300
+6300
+7F00
+6300
+6300
+6300
+6300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char195
+ENCODING 195
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+3B00
+6E00
+0000
+1C00
+3600
+6300
+6300
+7F00
+6300
+6300
+6300
+6300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char196
+ENCODING 196
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+6300
+0000
+0800
+1C00
+3600
+6300
+6300
+7F00
+6300
+6300
+6300
+6300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char197
+ENCODING 197
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+1C00
+1400
+1C00
+1C00
+3600
+6300
+6300
+7F00
+6300
+6300
+6300
+6300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char198
+ENCODING 198
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+1F00
+3600
+6600
+6600
+7F00
+6600
+6600
+6600
+6600
+6700
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char199
+ENCODING 199
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+1E00
+3300
+6100
+6000
+6000
+6000
+6100
+3300
+1E00
+0600
+0300
+3E00
+0000
+ENDCHAR
+STARTCHAR char200
+ENCODING 200
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+1800
+0C00
+7F00
+3300
+3100
+3400
+3C00
+3400
+3000
+3100
+3300
+7F00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char201
+ENCODING 201
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0C00
+1800
+7F00
+3300
+3100
+3400
+3C00
+3400
+3000
+3100
+3300
+7F00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char202
+ENCODING 202
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+1C00
+3600
+7F00
+3300
+3100
+3400
+3C00
+3400
+3000
+3100
+3300
+7F00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char203
+ENCODING 203
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+6300
+0000
+7F00
+3300
+3100
+3400
+3C00
+3400
+3000
+3100
+3300
+7F00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char204
+ENCODING 204
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+3000
+1800
+0000
+3C00
+1800
+1800
+1800
+1800
+1800
+1800
+1800
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char205
+ENCODING 205
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0C00
+1800
+0000
+3C00
+1800
+1800
+1800
+1800
+1800
+1800
+1800
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char206
+ENCODING 206
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+3C00
+6600
+0000
+3C00
+1800
+1800
+1800
+1800
+1800
+1800
+1800
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char207
+ENCODING 207
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+6600
+0000
+3C00
+1800
+1800
+1800
+1800
+1800
+1800
+1800
+1800
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char208
+ENCODING 208
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3C00
+3600
+3300
+3300
+7B00
+7B00
+3300
+3300
+3600
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char209
+ENCODING 209
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+3B00
+6E00
+6300
+7300
+7B00
+7F00
+6F00
+6700
+6300
+6300
+6300
+6300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char210
+ENCODING 210
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+3000
+1800
+3E00
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char211
+ENCODING 211
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0600
+0C00
+3E00
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char212
+ENCODING 212
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+1C00
+3600
+3E00
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char213
+ENCODING 213
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+3B00
+6E00
+3E00
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char214
+ENCODING 214
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+6300
+0000
+3E00
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char215
+ENCODING 215
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+6300
+3600
+1C00
+0800
+1C00
+3600
+6300
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char216
+ENCODING 216
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0100
+0300
+3E00
+6700
+6700
+6F00
+6B00
+6B00
+7B00
+7300
+7300
+3E00
+6000
+4000
+0000
+0000
+ENDCHAR
+STARTCHAR char217
+ENCODING 217
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+3000
+1800
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char218
+ENCODING 218
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0600
+0C00
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char219
+ENCODING 219
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+1C00
+1400
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char220
+ENCODING 220
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+6300
+0000
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char221
+ENCODING 221
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+1800
+3000
+C300
+C300
+C300
+6600
+3C00
+1800
+1800
+1800
+1800
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char222
+ENCODING 222
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+7800
+3000
+3E00
+3300
+3300
+3300
+3E00
+3000
+3000
+3000
+3000
+7800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char223
+ENCODING 223
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+1C00
+3600
+6300
+6700
+6E00
+6C00
+6600
+6300
+6B00
+6E00
+6000
+4000
+0000
+0000
+ENDCHAR
+STARTCHAR char224
+ENCODING 224
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+3000
+1800
+0C00
+0000
+3C00
+0600
+3E00
+6600
+6600
+6600
+3B00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char225
+ENCODING 225
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0C00
+1800
+3000
+0000
+3C00
+0600
+3E00
+6600
+6600
+6600
+3B00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char226
+ENCODING 226
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0800
+1C00
+3600
+0000
+3C00
+0600
+3E00
+6600
+6600
+6600
+3B00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char227
+ENCODING 227
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3B00
+6E00
+0000
+3C00
+0600
+3E00
+6600
+6600
+6600
+3B00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char228
+ENCODING 228
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+6600
+0000
+0000
+3C00
+0600
+3E00
+6600
+6600
+6600
+3B00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char229
+ENCODING 229
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+1C00
+3600
+1C00
+0000
+3C00
+0600
+3E00
+6600
+6600
+6600
+3B00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char230
+ENCODING 230
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+6E00
+3B00
+1B00
+7E00
+D800
+DC00
+7700
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char231
+ENCODING 231
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+3E00
+6300
+6000
+6000
+6000
+6300
+3E00
+0C00
+0600
+3C00
+0000
+ENDCHAR
+STARTCHAR char232
+ENCODING 232
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+3000
+1800
+0C00
+0000
+3E00
+6300
+7F00
+6000
+6000
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char233
+ENCODING 233
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0600
+0C00
+1800
+0000
+3E00
+6300
+7F00
+6000
+6000
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char234
+ENCODING 234
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0800
+1C00
+3600
+0000
+3E00
+6300
+7F00
+6000
+6000
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char235
+ENCODING 235
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+6300
+0000
+0000
+3E00
+6300
+7F00
+6000
+6000
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char236
+ENCODING 236
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+6000
+3000
+1800
+0000
+3800
+1800
+1800
+1800
+1800
+1800
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char237
+ENCODING 237
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0600
+0C00
+1800
+0000
+3800
+1800
+1800
+1800
+1800
+1800
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char238
+ENCODING 238
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+1800
+3C00
+6600
+0000
+3800
+1800
+1800
+1800
+1800
+1800
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char239
+ENCODING 239
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+6600
+0000
+0000
+3800
+1800
+1800
+1800
+1800
+1800
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char100
+ENCODING 240
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0E00
+0600
+0F00
+0600
+3E00
+6600
+6600
+6600
+6600
+3B00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char241
+ENCODING 241
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3B00
+6E00
+0000
+6E00
+3300
+3300
+3300
+3300
+3300
+3300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char242
+ENCODING 242
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+3000
+1800
+0C00
+0000
+3E00
+6300
+6300
+6300
+6300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char243
+ENCODING 243
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0C00
+1800
+3000
+0000
+3E00
+6300
+6300
+6300
+6300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char244
+ENCODING 244
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0800
+1C00
+3600
+0000
+3E00
+6300
+6300
+6300
+6300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char245
+ENCODING 245
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3B00
+6E00
+0000
+3E00
+6300
+6300
+6300
+6300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char246
+ENCODING 246
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+6300
+0000
+0000
+3E00
+6300
+6300
+6300
+6300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char247
+ENCODING 247
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+1800
+1800
+0000
+7E00
+0000
+1800
+1800
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char248
+ENCODING 248
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0100
+0300
+3E00
+6700
+6F00
+6B00
+7B00
+7300
+3E00
+6000
+4000
+0000
+0000
+ENDCHAR
+STARTCHAR char249
+ENCODING 249
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+3000
+1800
+0C00
+0000
+6600
+6600
+6600
+6600
+6600
+6600
+3B00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char250
+ENCODING 250
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0C00
+1800
+3000
+0000
+6600
+6600
+6600
+6600
+6600
+6600
+3B00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char251
+ENCODING 251
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+1800
+3C00
+6600
+0000
+6600
+6600
+6600
+6600
+6600
+6600
+3B00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char252
+ENCODING 252
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+6600
+0000
+0000
+6600
+6600
+6600
+6600
+6600
+6600
+3B00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char253
+ENCODING 253
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0C00
+1800
+3000
+0000
+6300
+6300
+6300
+6300
+6300
+6300
+3F00
+0300
+0600
+7C00
+0000
+ENDCHAR
+STARTCHAR char254
+ENCODING 254
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+7800
+3000
+3E00
+3300
+3300
+3300
+3300
+3300
+3E00
+3000
+3000
+7800
+0000
+ENDCHAR
+STARTCHAR char255
+ENCODING 255
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+6300
+0000
+0000
+6300
+6300
+6300
+6300
+6300
+6300
+3F00
+0300
+0600
+7C00
+0000
+ENDCHAR
+ENDFONT
diff --git a/util/alevt/vtxt-latin-2.bdf b/util/alevt/vtxt-latin-2.bdf
new file mode 100644
index 0000000..6505c6e
--- /dev/null
+++ b/util/alevt/vtxt-latin-2.bdf
@@ -0,0 +1,5906 @@
+STARTFONT 2.1
+FONT -alevt-teletext-medium-r-normal--16-1-75-75-c-90-fontspecific-2
+SIZE 1 75 75
+FONTBOUNDINGBOX 9 16 0 -4
+STARTPROPERTIES 10
+POINT_SIZE 1
+PIXEL_SIZE 16
+RESOLUTION_X 75
+RESOLUTION_Y 75
+FONT_ASCENT 12
+FONT_DESCENT 4
+AVERAGE_WIDTH 90
+SPACING "C"
+_XMBDFED_INFO "Edited with xmbdfed 3.3."
+FONT "vtxt"
+ENDPROPERTIES
+CHARS 256
+STARTCHAR char0
+ENCODING 0
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char1
+ENCODING 1
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char2
+ENCODING 2
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char1
+ENCODING 3
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char0
+ENCODING 4
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+F000
+F000
+F000
+F000
+F000
+F000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char1
+ENCODING 5
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char2
+ENCODING 6
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+F000
+F000
+F000
+F000
+F000
+F000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char1
+ENCODING 7
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+F000
+F000
+F000
+F000
+F000
+F000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char0
+ENCODING 8
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char1
+ENCODING 9
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char2
+ENCODING 10
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char1
+ENCODING 11
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char0
+ENCODING 12
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char1
+ENCODING 13
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char2
+ENCODING 14
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char1
+ENCODING 15
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char0
+ENCODING 16
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+F000
+F000
+F000
+F000
+F000
+ENDCHAR
+STARTCHAR char1
+ENCODING 17
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+0000
+0000
+0000
+0000
+0000
+0000
+F000
+F000
+F000
+F000
+F000
+ENDCHAR
+STARTCHAR char2
+ENCODING 18
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+0000
+0000
+0000
+0000
+0000
+0000
+F000
+F000
+F000
+F000
+F000
+ENDCHAR
+STARTCHAR char1
+ENCODING 19
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+0000
+0000
+0000
+0000
+0000
+0000
+F000
+F000
+F000
+F000
+F000
+ENDCHAR
+STARTCHAR char0
+ENCODING 20
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+ENDCHAR
+STARTCHAR char1
+ENCODING 21
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+ENDCHAR
+STARTCHAR char2
+ENCODING 22
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+ENDCHAR
+STARTCHAR char1
+ENCODING 23
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+ENDCHAR
+STARTCHAR char0
+ENCODING 24
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+F000
+F000
+F000
+F000
+F000
+ENDCHAR
+STARTCHAR char1
+ENCODING 25
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+F000
+F000
+F000
+F000
+F000
+ENDCHAR
+STARTCHAR char2
+ENCODING 26
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+F000
+F000
+F000
+F000
+F000
+ENDCHAR
+STARTCHAR char1
+ENCODING 27
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+F000
+F000
+F000
+F000
+F000
+ENDCHAR
+STARTCHAR char0
+ENCODING 28
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+F000
+F000
+F000
+F000
+F000
+ENDCHAR
+STARTCHAR char1
+ENCODING 29
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+F000
+F000
+F000
+F000
+F000
+ENDCHAR
+STARTCHAR char2
+ENCODING 30
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+F000
+F000
+F000
+F000
+F000
+ENDCHAR
+STARTCHAR char1
+ENCODING 31
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+F000
+F000
+F000
+F000
+F000
+ENDCHAR
+STARTCHAR char32
+ENCODING 32
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char33
+ENCODING 33
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+1800
+3C00
+3C00
+3C00
+1800
+1800
+1800
+0000
+1800
+1800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char34
+ENCODING 34
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+6600
+6600
+6600
+2400
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char35
+ENCODING 35
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+3600
+3600
+7F00
+3600
+3600
+3600
+7F00
+3600
+3600
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char36
+ENCODING 36
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0C00
+0C00
+3E00
+6300
+6100
+6000
+3E00
+0300
+0300
+4300
+6300
+3E00
+0C00
+0C00
+0000
+0000
+ENDCHAR
+STARTCHAR char37
+ENCODING 37
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+6100
+6300
+0600
+0C00
+1800
+3000
+6300
+4300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char38
+ENCODING 38
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+1C00
+3600
+3600
+1C00
+3B00
+6E00
+6600
+6600
+6600
+3B00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char39
+ENCODING 39
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+3000
+3000
+3000
+6000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char40
+ENCODING 40
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0C00
+1800
+3000
+3000
+3000
+3000
+3000
+3000
+1800
+0C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char41
+ENCODING 41
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3000
+1800
+0C00
+0C00
+0C00
+0C00
+0C00
+0C00
+1800
+3000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char42
+ENCODING 42
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+6600
+3C00
+FF00
+3C00
+6600
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char43
+ENCODING 43
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+1800
+1800
+7E00
+1800
+1800
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char44
+ENCODING 44
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+1800
+1800
+1800
+3000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char45
+ENCODING 45
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+7F00
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char46
+ENCODING 46
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+1800
+1800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char47
+ENCODING 47
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0100
+0300
+0600
+0C00
+1800
+3000
+6000
+4000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char48
+ENCODING 48
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3C00
+6600
+C300
+C300
+DB00
+DB00
+C300
+C300
+6600
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char49
+ENCODING 49
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+1800
+3800
+7800
+1800
+1800
+1800
+1800
+1800
+1800
+7E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char50
+ENCODING 50
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3E00
+6300
+0300
+0600
+0C00
+1800
+3000
+6000
+6300
+7F00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char51
+ENCODING 51
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3E00
+6300
+0300
+0300
+1E00
+0300
+0300
+0300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char52
+ENCODING 52
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0600
+0E00
+1E00
+3600
+6600
+7F00
+0600
+0600
+0600
+0F00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char53
+ENCODING 53
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7F00
+6000
+6000
+6000
+7E00
+0300
+0300
+0300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char54
+ENCODING 54
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+1C00
+3000
+6000
+6000
+7E00
+6300
+6300
+6300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char55
+ENCODING 55
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7F00
+6300
+0300
+0300
+0600
+0C00
+1800
+1800
+1800
+1800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char56
+ENCODING 56
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3E00
+6300
+6300
+6300
+3E00
+6300
+6300
+6300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char57
+ENCODING 57
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3E00
+6300
+6300
+6300
+3F00
+0300
+0300
+0300
+0600
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char58
+ENCODING 58
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+1800
+1800
+0000
+0000
+0000
+1800
+1800
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char59
+ENCODING 59
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+1800
+1800
+0000
+0000
+0000
+1800
+1800
+1800
+3000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char60
+ENCODING 60
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0600
+0C00
+1800
+3000
+6000
+3000
+1800
+0C00
+0600
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char61
+ENCODING 61
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+7E00
+0000
+0000
+7E00
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char62
+ENCODING 62
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+6000
+3000
+1800
+0C00
+0600
+0C00
+1800
+3000
+6000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char63
+ENCODING 63
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3E00
+6300
+6300
+0600
+0C00
+0C00
+0C00
+0000
+0C00
+0C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char64
+ENCODING 64
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+3E00
+6300
+6300
+6F00
+6F00
+6F00
+6E00
+6000
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char65
+ENCODING 65
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0800
+1C00
+3600
+6300
+6300
+7F00
+6300
+6300
+6300
+6300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char66
+ENCODING 66
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7E00
+3300
+3300
+3300
+3E00
+3300
+3300
+3300
+3300
+7E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char67
+ENCODING 67
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+1E00
+3300
+6100
+6000
+6000
+6000
+6000
+6100
+3300
+1E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char68
+ENCODING 68
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7C00
+3600
+3300
+3300
+3300
+3300
+3300
+3300
+3600
+7C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char69
+ENCODING 69
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7F00
+3300
+3100
+3400
+3C00
+3400
+3000
+3100
+3300
+7F00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char70
+ENCODING 70
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7F00
+3300
+3100
+3400
+3C00
+3400
+3000
+3000
+3000
+7800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char71
+ENCODING 71
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+1E00
+3300
+6100
+6000
+6000
+6F00
+6300
+6300
+3300
+1D00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char72
+ENCODING 72
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+6300
+6300
+6300
+6300
+7F00
+6300
+6300
+6300
+6300
+6300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char73
+ENCODING 73
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3C00
+1800
+1800
+1800
+1800
+1800
+1800
+1800
+1800
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char74
+ENCODING 74
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0F00
+0600
+0600
+0600
+0600
+0600
+6600
+6600
+6600
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char75
+ENCODING 75
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7300
+3300
+3300
+3600
+3C00
+3C00
+3600
+3300
+3300
+7300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char76
+ENCODING 76
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7800
+3000
+3000
+3000
+3000
+3000
+3000
+3100
+3300
+7F00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char77
+ENCODING 77
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+C300
+E700
+FF00
+FF00
+DB00
+C300
+C300
+C300
+C300
+C300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char78
+ENCODING 78
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+6300
+7300
+7B00
+7F00
+6F00
+6700
+6300
+6300
+6300
+6300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char79
+ENCODING 79
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3E00
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char80
+ENCODING 80
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7E00
+3300
+3300
+3300
+3E00
+3000
+3000
+3000
+3000
+7800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char81
+ENCODING 81
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3E00
+6300
+6300
+6300
+6300
+6300
+6300
+6B00
+6F00
+3E00
+0600
+0700
+0000
+0000
+ENDCHAR
+STARTCHAR char82
+ENCODING 82
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7E00
+3300
+3300
+3300
+3E00
+3600
+3300
+3300
+3300
+7300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char83
+ENCODING 83
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3E00
+6300
+6300
+3000
+1C00
+0600
+0300
+6300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char84
+ENCODING 84
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+FF00
+DB00
+9900
+1800
+1800
+1800
+1800
+1800
+1800
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char85
+ENCODING 85
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char86
+ENCODING 86
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+C300
+C300
+C300
+C300
+C300
+C300
+C300
+6600
+3C00
+1800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char87
+ENCODING 87
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+C300
+C300
+C300
+C300
+C300
+DB00
+DB00
+FF00
+6600
+6600
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char88
+ENCODING 88
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+C300
+C300
+6600
+3C00
+1800
+1800
+3C00
+6600
+C300
+C300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char89
+ENCODING 89
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+C300
+C300
+C300
+6600
+3C00
+1800
+1800
+1800
+1800
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char90
+ENCODING 90
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+FF00
+C300
+8600
+0C00
+1800
+3000
+6000
+C100
+C300
+FF00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char91
+ENCODING 91
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3C00
+3000
+3000
+3000
+3000
+3000
+3000
+3000
+3000
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char92
+ENCODING 92
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+4000
+6000
+7000
+3800
+1C00
+0E00
+0700
+0300
+0100
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char93
+ENCODING 93
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3C00
+0C00
+0C00
+0C00
+0C00
+0C00
+0C00
+0C00
+0C00
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char94
+ENCODING 94
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0800
+1C00
+3600
+6300
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char95
+ENCODING 95
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+FF80
+0000
+0000
+ENDCHAR
+STARTCHAR char96
+ENCODING 96
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+3000
+3000
+1800
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char97
+ENCODING 97
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+3C00
+0600
+3E00
+6600
+6600
+6600
+3B00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char98
+ENCODING 98
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7000
+3000
+3000
+3C00
+3600
+3300
+3300
+3300
+3300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char99
+ENCODING 99
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+3E00
+6300
+6000
+6000
+6000
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char100
+ENCODING 100
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0E00
+0600
+0600
+1E00
+3600
+6600
+6600
+6600
+6600
+3B00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char101
+ENCODING 101
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+3E00
+6300
+7F00
+6000
+6000
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char102
+ENCODING 102
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+1C00
+3600
+3200
+3000
+7800
+3000
+3000
+3000
+3000
+7800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char103
+ENCODING 103
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+3B00
+6600
+6600
+6600
+6600
+6600
+3E00
+0600
+6600
+3C00
+0000
+ENDCHAR
+STARTCHAR char104
+ENCODING 104
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7000
+3000
+3000
+3600
+3B00
+3300
+3300
+3300
+3300
+7300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char105
+ENCODING 105
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+1800
+1800
+0000
+3800
+1800
+1800
+1800
+1800
+1800
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char106
+ENCODING 106
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0600
+0600
+0000
+0E00
+0600
+0600
+0600
+0600
+0600
+0600
+6600
+6600
+3C00
+0000
+ENDCHAR
+STARTCHAR char107
+ENCODING 107
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7000
+3000
+3000
+3300
+3600
+3C00
+3C00
+3600
+3300
+7300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char108
+ENCODING 108
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3800
+1800
+1800
+1800
+1800
+1800
+1800
+1800
+1800
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char109
+ENCODING 109
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+E600
+FF00
+DB00
+DB00
+DB00
+DB00
+DB00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char110
+ENCODING 110
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+6E00
+3300
+3300
+3300
+3300
+3300
+3300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char111
+ENCODING 111
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+3E00
+6300
+6300
+6300
+6300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char112
+ENCODING 112
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+6E00
+3300
+3300
+3300
+3300
+3300
+3E00
+3000
+3000
+7800
+0000
+ENDCHAR
+STARTCHAR char113
+ENCODING 113
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+3B00
+6600
+6600
+6600
+6600
+6600
+3E00
+0600
+0600
+0F00
+0000
+ENDCHAR
+STARTCHAR char114
+ENCODING 114
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+6E00
+3B00
+3300
+3000
+3000
+3000
+7800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char115
+ENCODING 115
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+3E00
+6300
+3000
+1C00
+0600
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char116
+ENCODING 116
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0800
+1800
+1800
+7E00
+1800
+1800
+1800
+1800
+1B00
+0E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char117
+ENCODING 117
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+6600
+6600
+6600
+6600
+6600
+6600
+3B00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char118
+ENCODING 118
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+C300
+C300
+C300
+C300
+6600
+3C00
+1800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char119
+ENCODING 119
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+C300
+C300
+C300
+DB00
+DB00
+FF00
+6600
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char120
+ENCODING 120
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+C300
+6600
+3C00
+1800
+3C00
+6600
+C300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char121
+ENCODING 121
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+6300
+6300
+6300
+6300
+6300
+6300
+3F00
+0300
+0600
+7C00
+0000
+ENDCHAR
+STARTCHAR char122
+ENCODING 122
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+7F00
+6600
+0C00
+1800
+3000
+6300
+7F00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char123
+ENCODING 123
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0E00
+1800
+1800
+1800
+7000
+1800
+1800
+1800
+1800
+0E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char124
+ENCODING 124
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+1800
+1800
+1800
+1800
+1800
+1800
+1800
+1800
+1800
+1800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char125
+ENCODING 125
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7000
+1800
+1800
+1800
+0E00
+1800
+1800
+1800
+1800
+7000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char126
+ENCODING 126
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3B00
+6E00
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char127
+ENCODING 127
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+7F00
+7F00
+7F00
+7F00
+7F00
+7F00
+7F00
+7F00
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char0
+ENCODING 128
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0F80
+0F80
+0F80
+0F80
+0F80
+ENDCHAR
+STARTCHAR char1
+ENCODING 129
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+0000
+0000
+0000
+0000
+0000
+0000
+0F80
+0F80
+0F80
+0F80
+0F80
+ENDCHAR
+STARTCHAR char2
+ENCODING 130
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+0000
+0000
+0000
+0000
+0000
+0000
+0F80
+0F80
+0F80
+0F80
+0F80
+ENDCHAR
+STARTCHAR char1
+ENCODING 131
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+0000
+0000
+0000
+0000
+0000
+0000
+0F80
+0F80
+0F80
+0F80
+0F80
+ENDCHAR
+STARTCHAR char0
+ENCODING 132
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+F000
+F000
+F000
+F000
+F000
+F000
+0F80
+0F80
+0F80
+0F80
+0F80
+ENDCHAR
+STARTCHAR char1
+ENCODING 133
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+0F80
+0F80
+0F80
+0F80
+0F80
+ENDCHAR
+STARTCHAR char2
+ENCODING 134
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+F000
+F000
+F000
+F000
+F000
+F000
+0F80
+0F80
+0F80
+0F80
+0F80
+ENDCHAR
+STARTCHAR char1
+ENCODING 135
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+F000
+F000
+F000
+F000
+F000
+F000
+0F80
+0F80
+0F80
+0F80
+0F80
+ENDCHAR
+STARTCHAR char0
+ENCODING 136
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+ENDCHAR
+STARTCHAR char1
+ENCODING 137
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+ENDCHAR
+STARTCHAR char2
+ENCODING 138
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+ENDCHAR
+STARTCHAR char1
+ENCODING 139
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+ENDCHAR
+STARTCHAR char0
+ENCODING 140
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+0F80
+0F80
+0F80
+0F80
+0F80
+ENDCHAR
+STARTCHAR char1
+ENCODING 141
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+0F80
+0F80
+0F80
+0F80
+0F80
+ENDCHAR
+STARTCHAR char2
+ENCODING 142
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+0F80
+0F80
+0F80
+0F80
+0F80
+ENDCHAR
+STARTCHAR char1
+ENCODING 143
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+0F80
+0F80
+0F80
+0F80
+0F80
+ENDCHAR
+STARTCHAR char0
+ENCODING 144
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+FF80
+FF80
+FF80
+FF80
+FF80
+ENDCHAR
+STARTCHAR char1
+ENCODING 145
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+0000
+0000
+0000
+0000
+0000
+0000
+FF80
+FF80
+FF80
+FF80
+FF80
+ENDCHAR
+STARTCHAR char2
+ENCODING 146
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+0000
+0000
+0000
+0000
+0000
+0000
+FF80
+FF80
+FF80
+FF80
+FF80
+ENDCHAR
+STARTCHAR char1
+ENCODING 147
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+0000
+0000
+0000
+0000
+0000
+0000
+FF80
+FF80
+FF80
+FF80
+FF80
+ENDCHAR
+STARTCHAR char0
+ENCODING 148
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+F000
+F000
+F000
+F000
+F000
+F000
+FF80
+FF80
+FF80
+FF80
+FF80
+ENDCHAR
+STARTCHAR char1
+ENCODING 149
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+FF80
+FF80
+FF80
+FF80
+FF80
+ENDCHAR
+STARTCHAR char2
+ENCODING 150
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+F000
+F000
+F000
+F000
+F000
+F000
+FF80
+FF80
+FF80
+FF80
+FF80
+ENDCHAR
+STARTCHAR char1
+ENCODING 151
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+F000
+F000
+F000
+F000
+F000
+F000
+FF80
+FF80
+FF80
+FF80
+FF80
+ENDCHAR
+STARTCHAR char0
+ENCODING 152
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+FF80
+FF80
+FF80
+FF80
+FF80
+ENDCHAR
+STARTCHAR char1
+ENCODING 153
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+FF80
+FF80
+FF80
+FF80
+FF80
+ENDCHAR
+STARTCHAR char2
+ENCODING 154
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+FF80
+FF80
+FF80
+FF80
+FF80
+ENDCHAR
+STARTCHAR char1
+ENCODING 155
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+FF80
+FF80
+FF80
+FF80
+FF80
+ENDCHAR
+STARTCHAR char0
+ENCODING 156
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+ENDCHAR
+STARTCHAR char1
+ENCODING 157
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+ENDCHAR
+STARTCHAR char2
+ENCODING 158
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+ENDCHAR
+STARTCHAR char1
+ENCODING 159
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+ENDCHAR
+STARTCHAR char160
+ENCODING 160
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+0880
+0880
+0880
+0880
+FF80
+0880
+0880
+0880
+0880
+0880
+FF80
+0880
+0880
+0880
+0880
+ENDCHAR
+STARTCHAR char65
+ENCODING 161
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0800
+1C00
+3600
+6300
+6300
+7F00
+6300
+6300
+6300
+6300
+0600
+0300
+0000
+0000
+ENDCHAR
+STARTCHAR char162
+ENCODING 162
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+6600
+3C00
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char76
+ENCODING 163
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7800
+3000
+3000
+3C00
+3800
+3000
+7000
+F100
+3300
+7F00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char164
+ENCODING 164
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+4100
+6300
+3E00
+6300
+6300
+6300
+6300
+3E00
+6300
+4100
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char76
+ENCODING 165
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7B00
+3300
+3600
+3000
+3000
+3000
+3000
+3100
+3300
+7F00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char83
+ENCODING 166
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0C00
+1800
+3E00
+6300
+6300
+3000
+1C00
+0600
+0300
+6300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char167
+ENCODING 167
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+3E00
+6300
+3000
+1C00
+3600
+6300
+6300
+3600
+1C00
+0600
+6300
+3E00
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char196
+ENCODING 168
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+6300
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char169
+ENCODING 169
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+6600
+3C00
+3E00
+6300
+6300
+3000
+1C00
+0600
+0300
+6300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char83
+ENCODING 170
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3E00
+6300
+6300
+3000
+1C00
+0600
+0300
+6300
+6300
+3E00
+0600
+0300
+3E00
+0000
+ENDCHAR
+STARTCHAR char171
+ENCODING 171
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+6600
+3C00
+FF00
+DB00
+9900
+1800
+1800
+1800
+1800
+1800
+1800
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char90
+ENCODING 172
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0C00
+1800
+FF00
+C300
+8600
+0C00
+1800
+3000
+6000
+C100
+C300
+FF00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char173
+ENCODING 173
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+FF80
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char174
+ENCODING 174
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+6600
+3C00
+FF00
+C300
+8600
+0C00
+1800
+3000
+6000
+C100
+C300
+FF00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char90
+ENCODING 175
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+FF00
+C300
+8600
+0C00
+7E00
+3000
+6000
+C100
+C300
+FF00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char176
+ENCODING 176
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+1C00
+3600
+3600
+1C00
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char97
+ENCODING 177
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+3C00
+0600
+3E00
+6600
+6600
+6600
+3B00
+0600
+0300
+0000
+0000
+ENDCHAR
+STARTCHAR char97
+ENCODING 178
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0C00
+1800
+0E00
+0000
+0000
+ENDCHAR
+STARTCHAR char108
+ENCODING 179
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3800
+1800
+1E00
+1C00
+1800
+3800
+7800
+1800
+1800
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char180
+ENCODING 180
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+1800
+3000
+6000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char108
+ENCODING 181
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3980
+1980
+1B00
+1800
+1800
+1800
+1800
+1800
+1800
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char115
+ENCODING 182
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0600
+0C00
+0000
+3E00
+6300
+3000
+1C00
+0600
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char171
+ENCODING 183
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+6600
+3C00
+1800
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char184
+ENCODING 184
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0080
+0100
+0300
+0600
+0C00
+1C00
+3000
+7F00
+7700
+0E00
+1C00
+1800
+3000
+6000
+8000
+0000
+ENDCHAR
+STARTCHAR char185
+ENCODING 185
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+3600
+1C00
+3E00
+6300
+3000
+1C00
+0600
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char115
+ENCODING 186
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+3E00
+6300
+3000
+1C00
+0600
+6300
+3E00
+0300
+1E00
+0000
+0000
+ENDCHAR
+STARTCHAR char187
+ENCODING 187
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0180
+0980
+1B00
+1800
+7E00
+1800
+1800
+1800
+1800
+1B00
+0E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char122
+ENCODING 188
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0600
+0C00
+0000
+7F00
+6600
+0C00
+1800
+3000
+6300
+7F00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char189
+ENCODING 189
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+3300
+6600
+CC00
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char190
+ENCODING 190
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+6600
+3C00
+7F00
+6600
+0C00
+1800
+3000
+6300
+7F00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char122
+ENCODING 191
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0C00
+0C00
+0000
+7F00
+6600
+0C00
+1800
+3000
+6300
+7F00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char82
+ENCODING 192
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0600
+0C00
+7E00
+3300
+3300
+3300
+3E00
+3600
+3300
+3300
+3300
+7300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char193
+ENCODING 193
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0300
+0600
+0000
+1C00
+3600
+6300
+6300
+7F00
+6300
+6300
+6300
+6300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char194
+ENCODING 194
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+1C00
+3600
+0800
+1C00
+3600
+6300
+6300
+7F00
+6300
+6300
+6300
+6300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char195
+ENCODING 195
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+6300
+3E00
+0000
+1C00
+3600
+6300
+6300
+7F00
+6300
+6300
+6300
+6300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char196
+ENCODING 196
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+6300
+0000
+0800
+1C00
+3600
+6300
+6300
+7F00
+6300
+6300
+6300
+6300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char76
+ENCODING 197
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0C00
+1800
+7C00
+3000
+3000
+3000
+3000
+3000
+3000
+3100
+3300
+7F00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char67
+ENCODING 198
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0600
+0C00
+1E00
+3300
+6100
+6000
+6000
+6000
+6000
+6100
+3300
+1E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char199
+ENCODING 199
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+1E00
+3300
+6100
+6000
+6000
+6000
+6100
+3300
+1E00
+0600
+0300
+3E00
+0000
+ENDCHAR
+STARTCHAR char200
+ENCODING 200
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+3300
+1E00
+1E00
+3300
+6100
+6000
+6000
+6000
+6000
+6100
+3300
+1E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char201
+ENCODING 201
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0C00
+1800
+7F00
+3300
+3100
+3400
+3C00
+3400
+3000
+3100
+3300
+7F00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char202
+ENCODING 202
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7F00
+3300
+3100
+3400
+3C00
+3400
+3000
+3100
+3300
+7F00
+0C00
+0600
+0000
+0000
+ENDCHAR
+STARTCHAR char203
+ENCODING 203
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+6300
+0000
+7F00
+3300
+3100
+3400
+3C00
+3400
+3000
+3100
+3300
+7F00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char204
+ENCODING 204
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+3300
+1E00
+7F00
+3300
+3100
+3400
+3C00
+3400
+3000
+3100
+3300
+7F00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char205
+ENCODING 205
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0C00
+1800
+0000
+3C00
+1800
+1800
+1800
+1800
+1800
+1800
+1800
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char206
+ENCODING 206
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+3C00
+6600
+0000
+3C00
+1800
+1800
+1800
+1800
+1800
+1800
+1800
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char207
+ENCODING 207
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+6600
+3C00
+7C00
+3600
+3300
+3300
+3300
+3300
+3300
+3300
+3600
+7C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char208
+ENCODING 208
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3C00
+3600
+3300
+3300
+7B00
+7B00
+3300
+3300
+3600
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char78
+ENCODING 209
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0C00
+1800
+6300
+7300
+7B00
+7F00
+6F00
+6700
+6300
+6300
+6300
+6300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char210
+ENCODING 210
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+6600
+3C00
+6300
+7300
+7B00
+7F00
+6F00
+6700
+6300
+6300
+6300
+6300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char211
+ENCODING 211
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0600
+0C00
+3E00
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char212
+ENCODING 212
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+1C00
+3600
+3E00
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char213
+ENCODING 213
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+3300
+6600
+3E00
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char214
+ENCODING 214
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+6300
+0000
+3E00
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char215
+ENCODING 215
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+6300
+3600
+1C00
+0800
+1C00
+3600
+6300
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char216
+ENCODING 216
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+6600
+3C00
+7E00
+3300
+3300
+3300
+3E00
+3600
+3300
+3300
+3300
+7300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char217
+ENCODING 217
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0800
+1400
+6B00
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char218
+ENCODING 218
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0600
+0C00
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char219
+ENCODING 219
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+1B00
+3600
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char220
+ENCODING 220
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+6300
+0000
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char221
+ENCODING 221
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+1800
+3000
+C300
+C300
+C300
+6600
+3C00
+1800
+1800
+1800
+1800
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char84
+ENCODING 222
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+FF00
+DB00
+9900
+1800
+1800
+1800
+1800
+1800
+1800
+3C00
+0600
+3C00
+0000
+0000
+ENDCHAR
+STARTCHAR char223
+ENCODING 223
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+1C00
+3600
+6300
+6700
+6E00
+6C00
+6600
+6300
+6B00
+6E00
+6000
+4000
+0000
+0000
+ENDCHAR
+STARTCHAR char224
+ENCODING 224
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0C00
+1800
+6E00
+3B00
+3300
+3000
+3000
+3000
+7800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char225
+ENCODING 225
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0C00
+1800
+3000
+0000
+3C00
+0600
+3E00
+6600
+6600
+6600
+3B00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char226
+ENCODING 226
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0800
+1C00
+3600
+0000
+3C00
+0600
+3E00
+6600
+6600
+6600
+3B00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char227
+ENCODING 227
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+6600
+3C00
+0000
+3C00
+0600
+3E00
+6600
+6600
+6600
+3B00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char228
+ENCODING 228
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+6600
+0000
+0000
+3C00
+0600
+3E00
+6600
+6600
+6600
+3B00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char108
+ENCODING 229
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0C00
+1800
+0000
+3800
+1800
+1800
+1800
+1800
+1800
+1800
+1800
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char99
+ENCODING 230
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0600
+0C00
+0000
+3E00
+6300
+6000
+6000
+6000
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char231
+ENCODING 231
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+3E00
+6300
+6000
+6000
+6000
+6300
+3E00
+0C00
+0600
+3C00
+0000
+ENDCHAR
+STARTCHAR char232
+ENCODING 232
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+6600
+3C00
+3E00
+6300
+6000
+6000
+6000
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char233
+ENCODING 233
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0600
+0C00
+1800
+0000
+3E00
+6300
+7F00
+6000
+6000
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char234
+ENCODING 234
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+3E00
+6300
+7F00
+6000
+6000
+6300
+3E00
+1800
+0E00
+0000
+0000
+ENDCHAR
+STARTCHAR char235
+ENCODING 235
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+6300
+0000
+0000
+3E00
+6300
+7F00
+6000
+6000
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char236
+ENCODING 236
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+3300
+1E00
+3E00
+6300
+7F00
+6000
+6000
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char237
+ENCODING 237
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0600
+0C00
+1800
+0000
+3800
+1800
+1800
+1800
+1800
+1800
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char238
+ENCODING 238
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+1800
+3C00
+6600
+0000
+3800
+1800
+1800
+1800
+1800
+1800
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char239
+ENCODING 239
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+6000
+6E00
+3600
+0600
+1E00
+3600
+6600
+6600
+6600
+6600
+3B00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char100
+ENCODING 240
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0E00
+0600
+0F00
+0600
+3E00
+6600
+6600
+6600
+6600
+3B00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char241
+ENCODING 241
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0600
+0C00
+0000
+6E00
+3300
+3300
+3300
+3300
+3300
+3300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char242
+ENCODING 242
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+3300
+1E00
+6E00
+3300
+3300
+3300
+3300
+3300
+3300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char243
+ENCODING 243
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0600
+0C00
+0000
+3E00
+6300
+6300
+6300
+6300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char244
+ENCODING 244
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0800
+1C00
+3600
+0000
+3E00
+6300
+6300
+6300
+6300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char245
+ENCODING 245
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3300
+6600
+0000
+3E00
+6300
+6300
+6300
+6300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char246
+ENCODING 246
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+6300
+0000
+0000
+3E00
+6300
+6300
+6300
+6300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char247
+ENCODING 247
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+1800
+1800
+0000
+7E00
+0000
+1800
+1800
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char248
+ENCODING 248
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+3300
+1E00
+6E00
+3B00
+3300
+3000
+3000
+3000
+7800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char249
+ENCODING 249
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+1800
+2400
+2400
+1800
+6600
+6600
+6600
+6600
+6600
+6600
+3B00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char250
+ENCODING 250
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0C00
+1800
+3000
+0000
+6600
+6600
+6600
+6600
+6600
+6600
+3B00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char251
+ENCODING 251
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3300
+6600
+0000
+6600
+6600
+6600
+6600
+6600
+6600
+3B00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char252
+ENCODING 252
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+6600
+0000
+0000
+6600
+6600
+6600
+6600
+6600
+6600
+3B00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char253
+ENCODING 253
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0C00
+1800
+3000
+0000
+6300
+6300
+6300
+6300
+6300
+6300
+3F00
+0300
+0600
+7C00
+0000
+ENDCHAR
+STARTCHAR char116
+ENCODING 254
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0800
+1800
+1800
+7E00
+1800
+1800
+1800
+1800
+1B00
+0E00
+0300
+1E00
+0000
+0000
+ENDCHAR
+STARTCHAR char255
+ENCODING 255
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0C00
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+ENDFONT
diff --git a/util/alevt/xio.c b/util/alevt/xio.c
new file mode 100644
index 0000000..4c0bca2
--- /dev/null
+++ b/util/alevt/xio.c
@@ -0,0 +1,1156 @@
+#include <stdio.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <string.h>
+#include <fcntl.h>
+#include <signal.h>
+#include <X11/Xlib.h>
+#include <X11/Xutil.h>
+#include <X11/Xatom.h>
+#define XK_MISCELLANY
+#define XK_LATIN1
+#include <X11/keysymdef.h>
+#include <sys/time.h>
+#include "vt.h"
+#include "misc.h"
+#include "dllist.h"
+#include "xio.h"
+#include "fdset.h"
+#include "lang.h"
+#include "icon.xbm"
+#include "font.h"
+
+#define WW (W*CW) /* pixel width of window */
+#define WH (H*CH) /* pixel hegiht of window */
+#define NO_SEL 999 /* sel_y1 value if no selection */
+#define SEL_MIN_TIME 500 /* anything shorter is a click */
+
+static struct dl_head dpys[1]; /* list of all displays */
+static void xio_timer(void *data, int fd);
+static void handle_event(struct xio *xio, int fd);
+
+
+static int timer_init(int argc, char **argv)
+{
+ int p[2], timer_pid, i;
+
+ if (pipe(p) == -1)
+ return -1;
+
+ signal(SIGPIPE, SIG_DFL);
+ timer_pid = fork();
+ if (timer_pid == -1)
+ return -1;
+ if (timer_pid > 0)
+ {
+ fdset_add_fd(fds, p[0], xio_timer, 0);
+ close(p[1]);
+ return 0;
+ }
+
+ close(p[0]);
+ for (i = 0; i < 32; ++i)
+ if (p[1] != i)
+ close(i);
+ memcpy(argv[0], "Timer", 6);
+
+ for (;;)
+ {
+ usleep(300000);
+ write(p[1], "*", 1);
+ }
+}
+
+
+static int local_init(int argc, char **argv)
+{
+ static int inited = 0;
+
+ if (inited)
+ return 0;
+
+ if (timer_init(argc, argv) == -1)
+ return -1;
+
+ dl_init(dpys);
+
+ inited = 1;
+ return 0;
+}
+
+
+static int get_colors(struct xio *xio)
+{
+ int i;
+ XColor c;
+
+ static short rgb[][3] =
+ {
+ { 0x0000,0x0000,0x0000 },
+ { 0xffff,0x0000,0x0000 },
+ { 0x0000,0xffff,0x0000 },
+ { 0xffff,0xffff,0x0000 },
+ { 0x0000,0x0000,0xffff },
+ { 0xffff,0x0000,0xffff },
+ { 0x0000,0xffff,0xffff },
+ { 0xffff,0xffff,0xffff },
+ { 0x7fff,0x7fff,0x7fff },
+ { 0x7fff,0x0000,0x0000 },
+ { 0x0000,0x7fff,0x0000 },
+ { 0x7fff,0x7fff,0x0000 },
+ { 0x0000,0x0000,0x7fff },
+ { 0x7fff,0x0000,0x7fff },
+ { 0x0000,0x7fff,0x7fff },
+ { 0x3fff,0x3fff,0x3fff },
+ };
+
+ for (i = 0; i < 16; ++i)
+ {
+ c.red = rgb[i][0];
+ c.green = rgb[i][1];
+ c.blue = rgb[i][2];
+ if (XAllocColor(xio->dpy, xio->cmap, &c) == 0)
+ return -1;
+ xio->color[i] = c.pixel;
+ }
+ return 0;
+}
+
+
+static int get_fonts(struct xio *xio)
+{
+ GC gc;
+ int i;
+ unsigned char *font_bits;
+ switch(latin1) {
+ case LATIN1: font_bits=font1_bits; break;
+ case LATIN2: font_bits=font2_bits; break;
+ case KOI8: font_bits=font3_bits; break;
+ case GREEK: font_bits=font4_bits; break;
+ default: font_bits=font1_bits; break;
+ }
+
+ xio->font[0] = XCreateBitmapFromData(xio->dpy, xio->root,
+ font_bits, font_width, font_height);
+ xio->font[1] = XCreatePixmap(xio->dpy, xio->root,
+ font_width, font_height*2, 1);
+ gc = XCreateGC(xio->dpy, xio->font[0], 0, 0);
+ for (i = 0; i < font_height; ++i)
+ {
+ XCopyArea(xio->dpy, xio->font[0], xio->font[1], gc, 0, i,
+ font_width, 1, 0, i*2);
+ XCopyArea(xio->dpy, xio->font[0], xio->font[1], gc, 0, i,
+ font_width, 1, 0, i*2+1);
+ }
+ XFreeGC(xio->dpy, gc);
+ return 0;
+}
+
+
+static void xlib_conn_watch(Display *dpy, void *fds, int fd, int open_flag, void *data)
+{
+ if (open_flag)
+ fdset_add_fd(fds, fd, XProcessInternalConnection, dpy);
+ else
+ fdset_del_fd(fds, fd);
+}
+
+
+struct xio * xio_open_dpy(char *dpy, int argc, char **argv)
+{
+ XClassHint classhint[1];
+ struct xio *xio;
+
+ if (local_init(argc, argv) == -1)
+ goto fail1;
+
+ if (not(xio = malloc(sizeof(*xio))))
+ goto fail1;
+
+ if (not(xio->dpy = XOpenDisplay(dpy)))
+ goto fail2;
+
+ xio->fd = ConnectionNumber(xio->dpy);
+ xio->argc = argc;
+ xio->argv = argv;
+ dl_init(xio->windows);
+ xio->screen = DefaultScreen(xio->dpy);
+ xio->depth = DefaultDepth(xio->dpy, xio->screen);
+ xio->width = DisplayWidth(xio->dpy, xio->screen);
+ xio->height = DisplayHeight(xio->dpy, xio->screen);
+ xio->root = DefaultRootWindow(xio->dpy);
+ xio->cmap = DefaultColormap(xio->dpy, xio->screen);
+ xio->xa_del_win = XInternAtom(xio->dpy, "WM_DELETE_WINDOW", False);
+ xio->xa_targets = XInternAtom(xio->dpy, "TARGETS", False);
+ xio->xa_timestamp = XInternAtom(xio->dpy, "TIMESTAMP", False);
+ xio->xa_multiple = XInternAtom(xio->dpy, "MULTIPLE", False);
+ xio->xa_text = XInternAtom(xio->dpy, "TEXT", False);
+
+ if (get_colors(xio) == -1)
+ goto fail3;
+
+ if (get_fonts(xio) == -1)
+ goto fail3;
+
+ if (fdset_add_fd(fds, xio->fd, handle_event, xio) == -1)
+ goto fail3;
+
+ XAddConnectionWatch(xio->dpy, PTR xlib_conn_watch, PTR fds);
+
+ xio->icon = XCreateBitmapFromData(xio->dpy, xio->root,
+ icon_bits, icon_width, icon_height);
+
+ xio->group_leader = XCreateSimpleWindow(xio->dpy, xio->root,
+ 0, 0, 1, 1, 0, 0, 0);
+ XSetCommand(xio->dpy, xio->group_leader, xio->argv, xio->argc);
+ classhint->res_name = "VTLeader";
+ classhint->res_class = "AleVT";
+ XSetClassHint(xio->dpy, xio->group_leader, classhint);
+
+ dl_insert_first(dpys, xio->node);
+ return xio;
+
+fail4:
+ fdset_del_fd(fds, xio->fd);
+fail3:
+ XCloseDisplay(xio->dpy);
+fail2:
+ free(xio);
+fail1:
+ return 0;
+}
+
+
+static void set_user_geometry(struct xio_win *xw, char *geom, XSizeHints *sh, int bwidth)
+{
+ static int gravs[] = { NorthWestGravity, NorthEastGravity,
+ SouthWestGravity, SouthEastGravity };
+ int f, g = 0;
+
+ f = XParseGeometry(geom, &sh->x, &sh->y, &sh->width, &sh->height);
+
+ if (f & WidthValue)
+ sh->width = sh->base_width + sh->width * sh->width_inc;
+ if (f & HeightValue)
+ sh->height = sh->base_height + sh->height * sh->height_inc;
+ if (f & XNegative)
+ g+=1, sh->x = xw->xio->width + sh->x - sh->width - bwidth;
+ if (f & YNegative)
+ g+=2, sh->y = xw->xio->height + sh->y - sh->height - bwidth;
+
+ sh->width = bound(sh->min_width, sh->width, sh->max_width);
+ sh->height = bound(sh->min_height, sh->height, sh->max_height);
+
+ if (f & (WidthValue | HeightValue))
+ sh->flags |= USSize;
+ if (f & (XValue | YValue))
+ sh->flags |= USPosition | PWinGravity;
+
+ sh->win_gravity = gravs[g];
+}
+
+
+struct xio_win * xio_open_win(struct xio *xio, char *geom)
+{
+ struct xio_win *xw;
+ XSetWindowAttributes attr;
+ XGCValues gcval;
+ XSizeHints sizehint[1];
+ XClassHint classhint[1];
+ XWMHints wmhint[1];
+
+ if (not(xw = malloc(sizeof(*xw))))
+ goto fail1;
+
+ xw->xio = xio;
+
+ sizehint->flags = PSize | PBaseSize | PMinSize | PMaxSize | PResizeInc;
+ sizehint->x = sizehint->y = 0;
+ sizehint->width_inc = CW;
+ sizehint->height_inc = CH;
+ sizehint->base_width = 0;
+ sizehint->base_height = 0;
+ sizehint->min_width = 11*CW;
+ sizehint->min_height = 1*CH;
+ sizehint->max_width = sizehint->width = WW + CW;
+ sizehint->max_height = sizehint->height = WH;
+ set_user_geometry(xw, geom, sizehint, 1);
+
+ attr.background_pixel = xio->color[0];
+ attr.event_mask = KeyPressMask |
+ ButtonPressMask|ButtonReleaseMask|Button1MotionMask |
+ ExposureMask;
+ xw->win = XCreateWindow(xio->dpy, xio->root,
+ sizehint->x, sizehint->y, sizehint->width, sizehint->height, 1,
+ CopyFromParent, CopyFromParent, CopyFromParent,
+ CWBackPixel|CWEventMask, &attr);
+
+ classhint->res_name = "VTPage";
+ classhint->res_class = "AleVT";
+
+ wmhint->flags = InputHint | StateHint | WindowGroupHint | IconPixmapHint;
+ wmhint->input = True;
+ wmhint->initial_state = NormalState; //IconicState;
+ wmhint->window_group = xio->group_leader;
+ wmhint->icon_pixmap = xio->icon;
+
+ XSetWMProperties(xio->dpy, xw->win, 0,0, 0,0, sizehint, wmhint, classhint);
+ XSetWMProtocols(xio->dpy, xw->win, &xio->xa_del_win, 1);
+
+ xw->title[0] = 0;
+ xio_title(xw, "AleVT"); // will be reset pretty soon
+
+ gcval.graphics_exposures = False;
+ xw->gc = XCreateGC(xio->dpy, xw->win, GCGraphicsExposures, &gcval);
+
+ xw->tstamp = CurrentTime;
+ xw->fg = xw->bg = -1; /* unknown colors */
+
+ xw->curs_x = xw->curs_y = 999; // no cursor
+
+ xw->sel_y1 = NO_SEL; /* no selection area */
+ xw->sel_start_t = 0; /* no selection-drag active */
+ xw->sel_set_t = 0; /* not selection owner */
+ xw->sel_pixmap = 0; /* no selection pixmap yet */
+
+ xio_clear_win(xw);
+ xw->blink_on = xw->reveal = 0;
+
+ xw->handler = 0;
+
+ XMapWindow(xio->dpy, xw->win);
+ dl_insert_first(xio->windows, xw->node);
+ return xw;
+
+fail2:
+ free(xw);
+fail1:
+ return 0;
+}
+
+
+void xio_close_win(struct xio_win *xw, int dpy_too)
+{
+ struct xio *xio = xw->xio;
+
+ XDestroyWindow(xio->dpy, xw->win);
+ dl_remove(xw->node);
+ free(xw);
+
+ if (dpy_too && dl_empty(xio->windows))
+ xio_close_dpy(xio);
+}
+
+
+void xio_close_dpy(struct xio *xio)
+{
+ while (not dl_empty(xio->windows))
+ xio_close_win((struct xio_win *)xio->windows->first, 0);
+
+ XDestroyWindow(xio->dpy, xio->group_leader);
+ XRemoveConnectionWatch(xio->dpy, PTR xlib_conn_watch, PTR fds);
+ fdset_del_fd(fds, xio->fd);
+ dl_remove(xio->node);
+ free(xio);
+}
+
+
+void xio_set_handler(struct xio_win *xw, void *handler, void *data)
+{
+ xw->handler = handler;
+ xw->data = data;
+}
+
+
+void xio_title(struct xio_win *xw, char *title)
+{
+ char buf[sizeof(xw->title) + 32];
+
+ if (strlen(title) >= sizeof(xw->title))
+ return; //TODO: trimm...
+ if (strcmp(xw->title, title) == 0)
+ return;
+
+ strcpy(xw->title, title);
+ sprintf(buf, "AleVT " VERSION " %s", xw->title);
+ XStoreName(xw->xio->dpy, xw->win, buf);
+ XSetIconName(xw->xio->dpy, xw->win, xw->title);
+}
+
+
+void xio_clear_win(struct xio_win *xw)
+{
+ memset(xw->ch, ' ', sizeof(xw->ch));
+ xw->dheight = xw->blink = xw->concealed = 0;
+ xw->hidden = xw->lhidden = 0;
+ xw->modified = ALL_LINES;
+}
+
+
+void xio_put_line(struct xio_win *xw, int y, u8 *data)
+{
+ u8 *p = xw->ch + y*W;
+ u8 *ep = p + W;
+ lbits yb = 1 << y;
+ lbits x = xw->dheight;
+
+ if (y < 0 || y >= H)
+ return;
+
+ if (memcmp(data, p, ep - p) == 0)
+ return;
+
+ xw->modified |= yb;
+ xw->blink &= ~yb;
+ xw->dheight &= ~yb;
+ xw->concealed &= ~yb;
+
+ while (p < ep)
+ switch (*p++ = *data++)
+ {
+ case 0x08:
+ xw->blink |= yb;
+ break;
+ case 0x0d:
+ if (y < H-1)
+ xw->dheight |= yb;
+ break;
+ case 0x18:
+ xw->concealed |= yb;
+ break;
+ }
+
+ if ((xw->dheight ^ x) & yb) // dheight has changed, recalc hidden
+ {
+ xw->hidden &= yb*2 - 1;
+ for (; yb & ALL_LINES/2; yb *= 2)
+ if (~xw->hidden & xw->dheight & yb)
+ xw->hidden |= yb*2;
+ }
+}
+
+
+void xio_put_str(struct xio_win *xw, int y, u8 *str)
+{
+ u8 buf[W];
+ int l;
+ l = strlen(str);
+ if (l < W)
+ {
+ memcpy(buf, str, l);
+ memset(buf + l, ' ', W - l);
+ }
+ else
+ memcpy(buf, str, W);
+ xio_put_line(xw, y, buf);
+}
+
+
+static void dirty(struct xio_win *xw, int y1, int y2) // mark [y1,y2[ dirty
+{
+ if (y1 >= 0 && y1 < H && y1 < y2)
+ {
+ if (y2 > H)
+ y2 = H;
+ if (xw->hidden & (1 << y1))
+ y1--;
+ while (y1 < y2)
+ xw->modified |= 1 << y1++;
+ }
+}
+
+
+int xio_get_line(struct xio_win *xw, int y, u8 *data)
+{
+ if (y < 0 || y >= H)
+ return -1;
+ if (xw->hidden & (1 << y))
+ y--;
+ memcpy(data, xw->ch + y*W, 40);
+ return 0;
+}
+
+
+void xio_set_cursor(struct xio_win *xw, int x, int y)
+{
+ if (xw->curs_y >= 0 && xw->curs_y < H)
+ dirty(xw, xw->curs_y, xw->curs_y + 1);
+ if (x >= 0 && x < W && y >= 0 && y < H)
+ dirty(xw, y, y + 1);
+ else
+ x = y = 999;
+ xw->curs_x = x;
+ xw->curs_y = y;
+}
+
+
+static inline void draw_char(struct xio_win *xw, Window win, int fg, int bg,
+ int c, int dbl, int x, int y, int ry)
+{
+ struct xio *xio = xw->xio;
+
+ if (fg != xw->fg)
+ XSetForeground(xio->dpy, xw->gc, xio->color[xw->fg = fg]);
+ if (bg != xw->bg)
+ XSetBackground(xio->dpy, xw->gc, xio->color[xw->bg = bg]);
+
+ if (dbl)
+ {
+ XCopyPlane(xio->dpy, xio->font[1], win, xw->gc,
+ c%32*CW, c/32*CH*2, CW, CH*2, x*CW, y*CH, 1);
+ }
+ else
+ {
+ XCopyPlane(xio->dpy, xio->font[0], win, xw->gc,
+ c%32*CW, c/32*CH, CW, CH, x*CW, y*CH, 1);
+ if (xw->dheight & (1<<ry))
+ XCopyPlane(xio->dpy, xio->font[0], win, xw->gc,
+ ' '%32*CW, ' '/32*CH, CW, CH, x*CW, y*CH+CH, 1);
+ }
+}
+
+static void draw_cursor(struct xio_win *xw, int x, int y, int dbl)
+{
+ struct xio *xio = xw->xio;
+
+ if (xw->blink_on)
+ XSetForeground(xio->dpy, xw->gc, xio->color[xw->fg = xw->bg ^ 8]);
+ XDrawRectangle(xio->dpy, xw->win, xw->gc, x * CW, y * CH, CW-1,
+ (dbl ? 2*CH : CH)-1);
+}
+
+
+void xio_update_win(struct xio_win *xw)
+{
+ u8 *p = xw->ch;
+ lbits yb, redraw;
+ int x, y, c;
+
+ if (xw->modified == 0)
+ return;
+
+ redraw = xw->modified; // all modified lines
+ redraw |= xw->lhidden; // all previously hidden lines
+ redraw &= ~xw->hidden;
+
+ xw->lhidden = xw->hidden;
+ xw->modified = 0;
+
+ if (redraw == 0)
+ return;
+
+ for (yb = 1, y = 0; y < H; ++y, yb *= 2)
+ if (redraw & yb)
+ {
+ int fg = 7, bg = 0, _fg, _bg;
+ int dbl = 0, blk = 0, con = 0, gfx = 0, sep = 0, hld = 0;
+ int last_ch = ' ';
+
+ for (x = 0; x < W; ++x)
+ {
+ switch (c = *p++)
+ {
+ case 0x00 ... 0x07: /* alpha + foreground color */
+ fg = c & 7;
+ gfx = 0;
+ con = 0;
+ goto ctrl;
+ case 0x08: /* flash */
+ blk = not xw->blink_on;
+ goto ctrl;
+ case 0x09: /* steady */
+ blk = 0;
+ goto ctrl;
+ case 0x0a: /* end box */
+ case 0x0b: /* start box */
+ goto ctrl;
+ case 0x0c: /* normal height */
+ dbl = 0;
+ goto ctrl;
+ case 0x0d: /* double height */
+ dbl = y < H-1;
+ goto ctrl;
+ case 0x10 ... 0x17: /* graphics + foreground color */
+ fg = c & 7;
+ gfx = 1;
+ con = 0;
+ goto ctrl;
+ case 0x18: /* conceal display */
+ con = not xw->reveal;
+ goto ctrl;
+ case 0x19: /* contiguous graphics */
+ sep = 0;
+ goto ctrl;
+ case 0x1a: /* separate graphics */
+ sep = 1;
+ goto ctrl;
+ case 0x1c: /* black background */
+ bg = 0;
+ goto ctrl;
+ case 0x1d: /* new background */
+ bg = fg;
+ goto ctrl;
+ case 0x1e: /* hold graphics */
+ hld = 1;
+ goto ctrl;
+ case 0x1f: /* release graphics */
+ hld = 0;
+ goto ctrl;
+
+ case 0x0e: /* SO (reserved, double width) */
+ case 0x0f: /* SI (reserved, double size) */
+ c= ' '; break;
+ case 0x1b: /* ESC (reserved) */
+ c = ' ';
+ break;
+
+ ctrl:
+ c = ' ';
+ if (hld && gfx)
+ c = last_ch;
+ break;
+
+ case 0x80 ... 0x9f: /* these aren't used */
+ c = BAD_CHAR;
+ break;
+
+ default: /* mapped to selected font */
+ break;
+ }
+
+ if (gfx && (c & 0xa0) == 0x20)
+ {
+ last_ch = c;
+ c += (c & 0x40) ? 32 : -32;
+ }
+
+ _fg = fg;
+ _bg = bg;
+ if (blk)
+ _fg |= 8;
+ if (y >= xw->sel_y1 && y < xw->sel_y2 &&
+ x >= xw->sel_x1 && x < xw->sel_x2)
+ _bg |= 8;
+ if (con)
+ _fg = _bg;
+
+ draw_char(xw, xw->win, _fg, _bg, c, dbl, x, y, y);
+
+ if (y == xw->curs_y && x == xw->curs_x)
+ draw_cursor(xw, xw->curs_x, xw->curs_y, dbl);
+
+ if (xw->sel_pixmap && (_bg & 8))
+ draw_char(xw, xw->sel_pixmap, con ? bg : fg, bg, c, dbl,
+ x - xw->sel_x1, y - xw->sel_y1, y);
+ }
+ }
+ else
+ p += 40;
+}
+
+
+static void for_all_windows(void (*func)(struct xio_win *xw), struct xio_win *except)
+{
+ struct xio *xio, *vtn;
+ struct xio_win *xw, *vwn;
+
+ for (xio = PTR dpys->first; vtn = PTR xio->node->next; xio = vtn)
+ for (xw = PTR xio->windows->first; vwn = PTR xw->node->next; xw = vwn)
+ if (xw != except)
+ func(xw);
+}
+
+
+int xio_set_concealed(struct xio_win *xw, int on)
+{
+ on = !!on;
+ if (xw->reveal == on)
+ return on;
+
+ xw->reveal = on;
+ xw->modified |= xw->concealed;
+ return !on;
+}
+
+
+static void sel_set(struct xio_win *xw, int x1, int y1, int x2, int y2)
+{
+ int t;
+
+ x1 = bound(0, x1, W-1);
+ y1 = bound(0, y1, H-1);
+ x2 = bound(0, x2, W-1);
+ y2 = bound(0, y2, H-1);
+
+ if (x1 > x2)
+ t = x1, x1 = x2, x2 = t;
+ if (y1 > y2)
+ t = y1, y1 = y2, y2 = t;
+
+ dirty(xw, xw->sel_y1, xw->sel_y2);
+
+ if (xw->hidden & (1 << y1))
+ y1--;
+ if (xw->hidden & (2 << y2))
+ y2++;
+
+ xw->sel_x1 = x1;
+ xw->sel_y1 = y1;
+ xw->sel_x2 = x2 + 1;
+ xw->sel_y2 = y2 + 1;
+ dirty(xw, xw->sel_y1, xw->sel_y2);
+}
+
+
+static void sel_abort(struct xio_win *xw)
+{
+ if (xw->sel_set_t)
+ XSetSelectionOwner(xw->xio->dpy, XA_PRIMARY, None, xw->sel_set_t);
+ if (xw->sel_y1 != NO_SEL)
+ dirty(xw, xw->sel_y1, xw->sel_y2);
+ xw->sel_y1 = NO_SEL;
+ xw->sel_set_t = 0;
+ xw->sel_start_t = 0;
+}
+
+
+static void sel_start(struct xio_win *xw, int x, int y, Time t)
+{
+ sel_abort(xw);
+ xw->sel_start_x = x;
+ xw->sel_start_y = y;
+ xw->sel_start_t = t;
+}
+
+
+static void sel_move(struct xio_win *xw, int x, int y, Time t)
+{
+ if (xw->sel_start_t == 0)
+ return;
+ if (xw->sel_y1 == NO_SEL)
+ if (t - xw->sel_start_t < SEL_MIN_TIME)
+ if (x == xw->sel_start_x)
+ if (y == xw->sel_start_y)
+ return;
+ sel_set(xw, xw->sel_start_x, xw->sel_start_y, x, y);
+}
+
+
+static int sel_end(struct xio_win *xw, int x, int y, Time t)
+{
+ sel_move(xw, x, y, t);
+ xw->sel_start_t = 0;
+
+ if (xw->sel_y1 == NO_SEL)
+ return 0;
+
+ for_all_windows(sel_abort, xw);
+ XSetSelectionOwner(xw->xio->dpy, XA_PRIMARY, xw->win, t);
+ if (XGetSelectionOwner(xw->xio->dpy, XA_PRIMARY) == xw->win)
+ xw->sel_set_t = t;
+ else
+ sel_abort(xw);
+ return 1;
+}
+
+
+static int sel_convert2ascii(struct xio_win *xw, u8 *buf)
+{
+ u8 *d = buf;
+ int x, y, nl = 0;
+
+ for (y = xw->sel_y1; y < xw->sel_y2; y++)
+ {
+ u8 *s = xw->ch + y * W;
+ int gfx = 0, con = 0;
+
+ if (~xw->hidden & (1 << y))
+ {
+ for (x = 0; x < xw->sel_x2; ++x)
+ {
+ int ch, c = ' ';
+ switch (ch = *s++)
+ {
+ case 0x00 ... 0x07:
+ gfx = con = 0;
+ break;
+ case 0x10 ... 0x17:
+ gfx = 1, con = 0;
+ break;
+ case 0x18:
+ con = not xw->reveal;
+ break;
+ case 0xa0 ... 0xff:
+ case 0x20 ... 0x7f:
+ if (not con)
+ if (gfx && ch != ' ' && (ch & 0xa0) == 0x20)
+ c = '#';
+ else if (ch == 0x7f)
+ c = '*';
+ else
+ c = ch;
+ break;
+ }
+ if (x >= xw->sel_x1)
+ {
+ if (nl)
+ *d++ = '\n', nl = 0;
+ *d++ = c;
+ }
+ }
+ nl = 1;
+ }
+ }
+ *d = 0; // not necessary
+ return d - buf;
+}
+
+
+static Pixmap sel_convert2pixmap(struct xio_win *xw)
+{
+ struct xio *xio = xw->xio;
+ Pixmap pm;
+
+ if (xw->sel_y1 == NO_SEL)
+ return None;
+
+ pm = XCreatePixmap(xio->dpy, xio->root, (xw->sel_x2 - xw->sel_x1) * CW,
+ (xw->sel_y2 - xw->sel_y1) * CH,
+ xio->depth);
+ xw->sel_pixmap = pm;
+ dirty(xw, xw->sel_y1, xw->sel_y2);
+ xio_update_win(xw);
+ xw->sel_pixmap = 0;
+
+ return pm;
+}
+
+
+static int sel_do_conv(struct xio_win *xw, Window w, Atom type, Atom prop)
+{
+ struct xio *xio = xw->xio;
+
+ if (type == xio->xa_targets)
+ {
+ u32 atoms[6];
+
+ atoms[0] = XA_STRING;
+ atoms[1] = xio->xa_text;
+ atoms[2] = XA_PIXMAP;
+ atoms[3] = XA_COLORMAP;
+ atoms[4] = xio->xa_multiple;
+ atoms[5] = xio->xa_timestamp;
+ XChangeProperty(xio->dpy, w, prop, type,
+ 32, PropModeReplace, PTR atoms, NELEM(atoms));
+ }
+ else if (type == xio->xa_timestamp)
+ {
+ u32 t = xw->sel_set_t;
+
+ XChangeProperty(xio->dpy, w, prop, type, 32, PropModeReplace, PTR &t, 1);
+ }
+ else if (type == XA_COLORMAP)
+ {
+ u32 t = xio->cmap;
+
+ XChangeProperty(xio->dpy, w, prop, type, 32, PropModeReplace, PTR &t, 1);
+ }
+ else if (type == XA_STRING || type == xio->xa_text)
+ {
+ u8 buf[H * (W+1)];
+ int len;
+
+ len = sel_convert2ascii(xw, buf);
+
+ XChangeProperty(xio->dpy, w, prop, type, 8, PropModeReplace, buf, len);
+ }
+ else if (type == XA_PIXMAP || type == XA_DRAWABLE)
+ {
+ Pixmap pm;
+
+ pm = sel_convert2pixmap(xw);
+
+ XChangeProperty(xio->dpy, w, prop, type, 32, PropModeReplace, PTR &pm, 1);
+ }
+ else if (type == xio->xa_multiple)
+ {
+ u32 *atoms, ty, fo, i;
+ unsigned long n, b;
+
+ if (prop != None)
+ {
+ if (Success == XGetWindowProperty(xio->dpy, w, prop, 0, 1024, 0,
+ AnyPropertyType, PTR &ty, PTR &fo, &n, &b, PTR &atoms))
+ {
+ if (fo == 32 && n%2 == 0)
+ {
+ for (i = 0; i < n; i += 2)
+ if (sel_do_conv(xw, w, atoms[i], atoms[i+1]) == None)
+ atoms[i] = None;
+ }
+ XChangeProperty(xio->dpy, w, prop, type, 32, PropModeReplace,
+ PTR atoms, n);
+ XFree(atoms);
+ }
+ }
+ }
+ else
+ return None;
+ return prop;
+}
+
+
+static void sel_send(struct xio_win *xw, XSelectionRequestEvent *req)
+{
+ XSelectionEvent ev[1];
+
+ if (req->property == None)
+ req->property = req->target;
+
+ ev->type = SelectionNotify;
+ ev->requestor = req->requestor;
+ ev->selection = req->selection;
+ ev->target = req->target;
+ ev->property = sel_do_conv(xw, req->requestor, req->target, req->property);
+ ev->time = req->time;
+ XSendEvent(xw->xio->dpy, req->requestor, False, 0, PTR ev);
+}
+
+
+static void sel_retrieve(struct xio_win *xw, Window w, Atom prop, int del)
+{
+ u8 *data;
+ u32 ty, fo;
+ unsigned long n, b;
+ struct xio *xio = xw->xio;
+
+ if (prop == None)
+ return;
+
+ if (Success == XGetWindowProperty(xio->dpy, w, prop, 0, 1024, del,
+ AnyPropertyType, PTR &ty, PTR &fo, &n, &b, PTR &data))
+ {
+ if (fo == 8 && n != 0)
+ {
+ struct vt_event vtev[1];
+
+ vtev->resource = xw;
+ vtev->type = EV_SELECTION;
+ vtev->i1 = n;
+ vtev->p1 = data;
+ xw->handler(xw->data, vtev);
+ }
+ XFree(data);
+ }
+}
+
+
+void xio_cancel_selection(struct xio_win *xw)
+{
+ sel_abort(xw);
+}
+
+
+void xio_query_selection(struct xio_win *xw)
+{
+ struct xio *xio = xw->xio;
+
+ if (XGetSelectionOwner(xio->dpy, XA_PRIMARY) == None)
+ sel_retrieve(xw, xio->root, XA_CUT_BUFFER0, False);
+ else
+ {
+ XDeleteProperty(xio->dpy, xw->win, XA_STRING);
+ XConvertSelection(xio->dpy, XA_PRIMARY, XA_STRING,
+ XA_STRING, xw->win, xw->tstamp);
+ }
+}
+
+
+void xio_set_selection(struct xio_win *xw, int x1, int y1, int x2, int y2)
+{
+ sel_start(xw, x1, y1, xw->tstamp - SEL_MIN_TIME);
+ sel_end(xw, x2, y2, xw->tstamp);
+}
+
+
+static void handle_event(struct xio *xio, int fd)
+{
+ struct xio_win *xw;
+ struct vt_event vtev[1];
+ XEvent ev[1];
+
+ XNextEvent(xio->dpy, ev);
+
+ for (xw = PTR xio->windows->first; xw->node->next; xw = PTR xw->node->next)
+ if (xw->win == ev->xany.window)
+ break;
+ if (xw->node->next == 0)
+ return;
+
+ vtev->resource = xw;
+
+ switch(ev->type)
+ {
+ case Expose:
+ {
+ int y1 = ev->xexpose.y / CH;
+ int y2 = (ev->xexpose.y + ev->xexpose.height + CH-1) / CH;
+
+ dirty(xw, y1, y2);
+ break;
+ }
+ case ClientMessage:
+ {
+ vtev->type = EV_CLOSE;
+ if (ev->xclient.format == 32)
+ if ((Atom)ev->xclient.data.l[0] == xio->xa_del_win)
+ xw->handler(xw->data, vtev);
+ break;
+ }
+ case KeyPress:
+ {
+ unsigned char ch;
+ KeySym k;
+
+ xw->tstamp = ev->xkey.time;
+ vtev->type = EV_KEY;
+ vtev->i1 = 0;
+ vtev->i2 = (ev->xkey.state & ShiftMask) != 0;
+ if (XLookupString(&ev->xkey, &ch, 1, &k, 0))
+ vtev->i1 = ch;
+ else
+ switch (k)
+ {
+ case XK_Left: vtev->i1 = KEY_LEFT; break;
+ case XK_Right: vtev->i1 = KEY_RIGHT; break;
+ case XK_Up: vtev->i1 = KEY_UP; break;
+ case XK_Down: vtev->i1 = KEY_DOWN; break;
+ case XK_Prior: vtev->i1 = KEY_PUP; break;
+ case XK_Next: vtev->i1 = KEY_PDOWN; break;
+ case XK_Delete: vtev->i1 = KEY_DEL; break;
+ case XK_Insert: vtev->i1 = KEY_INS; break;
+ case XK_F1: vtev->i1 = KEY_F(1); break;
+ case XK_F2: vtev->i1 = KEY_F(2); break;
+ case XK_F3: vtev->i1 = KEY_F(3); break;
+ case XK_F4: vtev->i1 = KEY_F(4); break;
+ case XK_F5: vtev->i1 = KEY_F(5); break;
+ case XK_F6: vtev->i1 = KEY_F(6); break;
+ case XK_F7: vtev->i1 = KEY_F(7); break;
+ case XK_F8: vtev->i1 = KEY_F(8); break;
+ case XK_F9: vtev->i1 = KEY_F(9); break;
+ case XK_F10: vtev->i1 = KEY_F(10); break;
+ case XK_F11: vtev->i1 = KEY_F(11); break;
+ case XK_F12: vtev->i1 = KEY_F(12); break;
+ }
+ if (vtev->i1)
+ xw->handler(xw->data, vtev);
+ break;
+ }
+ case ButtonPress:
+ {
+ xw->tstamp = ev->xkey.time;
+ ev->xbutton.x /= CW;
+ ev->xbutton.y /= CH;
+ if (ev->xbutton.button == Button1)
+ sel_start(xw, ev->xbutton.x, ev->xbutton.y, ev->xbutton.time);
+ break;
+ }
+ case MotionNotify:
+ {
+ xw->tstamp = ev->xkey.time;
+ ev->xmotion.x /= CW;
+ ev->xmotion.y /= CH;
+ if (ev->xmotion.state & Button1Mask)
+ sel_move(xw, ev->xmotion.x, ev->xmotion.y, ev->xmotion.time);
+ break;
+ }
+ case ButtonRelease:
+ {
+ xw->tstamp = ev->xkey.time;
+ ev->xbutton.x /= CW;
+ ev->xbutton.y /= CH;
+ if (ev->xbutton.button == Button1)
+ if (sel_end(xw, ev->xbutton.x, ev->xbutton.y, ev->xbutton.time))
+ break;
+
+ vtev->type = EV_MOUSE;
+ vtev->i1 = ev->xbutton.button;
+ vtev->i2 = (ev->xbutton.state & ShiftMask) != 0;
+ vtev->i3 = ev->xbutton.x;
+ vtev->i4 = ev->xbutton.y;
+ if (vtev->i3 >= 0 && vtev->i3 < W && vtev->i4 >= 0 && vtev->i4 < H)
+ xw->handler(xw->data, vtev);
+ break;
+ }
+ case SelectionClear:
+ {
+ // may be our own Owner=None due to sel_start
+ if (xw->sel_set_t && ev->xselectionclear.time >= xw->sel_set_t)
+ {
+ xw->sel_set_t = 0; // no need to reset owner
+ sel_abort(xw);
+ }
+ break;
+ }
+ case SelectionRequest:
+ {
+ sel_send(xw, &ev->xselectionrequest);
+ break;
+ }
+ case SelectionNotify:
+ {
+ sel_retrieve(xw, ev->xselection.requestor, ev->xselection.property, True);
+ break;
+ }
+ default:
+ break;
+ }
+}
+
+
+static void switch_blink_state(struct xio_win *xw)
+{
+ xw->blink_on = !xw->blink_on;
+ xw->modified |= xw->blink;
+ dirty(xw, xw->curs_y, xw->curs_y + 1);
+}
+
+
+static void send_timer_event(struct xio_win *xw)
+{
+ struct vt_event vtev[1];
+ vtev->type = EV_TIMER;
+ xw->handler(xw->data, vtev);
+}
+
+
+static void xio_timer(void *data, int fd)
+{
+ char buf[64];
+ read(fd, buf, sizeof(buf));
+ for_all_windows(switch_blink_state, 0);
+ for_all_windows(send_timer_event, 0);
+}
+
+
+void xio_event_loop(void)
+{
+ struct xio *xio, *vtn;
+ int f;
+
+ while (not dl_empty(dpys))
+ {
+ do
+ {
+ for_all_windows(xio_update_win, 0);
+ f = 0;
+ for (xio = PTR dpys->first; vtn = PTR xio->node->next; xio = vtn)
+ while (XPending(xio->dpy))
+ {
+ handle_event(xio, xio->fd);
+ f++;
+ }
+ } while (f);
+ fdset_select(fds, -1);
+ }
+}
diff --git a/util/alevt/xio.h b/util/alevt/xio.h
new file mode 100644
index 0000000..664b701
--- /dev/null
+++ b/util/alevt/xio.h
@@ -0,0 +1,80 @@
+#ifndef VTXIO_H
+#define VTXIO_H
+
+#include <X11/Xlib.h>
+#include "vt.h"
+#include "dllist.h"
+
+typedef u32 lbits;
+#define ALL_LINES ((1ul << H) - 1)
+
+/* one xio per display */
+struct xio
+{
+ struct dl_node node[1];
+ int argc;
+ char **argv;
+ Display *dpy; /* display connection */
+ int fd; /* the displays file descriptor */
+ Atom xa_del_win; /* WM_DELETE_WINDOW atom */
+ Atom xa_targets; /* TARGETS atom (selection) */
+ Atom xa_timestamp; /* TIMESTAMP atom (selection) */
+ Atom xa_text; /* TEXT atom (selection) */
+ Atom xa_multiple; /* MULTIPLE atom (selection) */
+ Window group_leader; /* unmapped window */
+ int screen; /* DefaultScreen */
+ int width, height; /* DisplayWidth/Height */
+ int depth; /* DefaultDepth */
+ Window root; /* DefaultRoot */
+ Colormap cmap;
+ int color[16]; /* 8 normal, 8 dim intensity */
+ Pixmap font[2]; /* normal, dbl-height */
+ Pixmap icon; /* icon pixmap */
+ struct dl_head windows[1]; /* all windows on this display */
+};
+
+/* one vt_win per window */
+struct xio_win
+{
+ struct dl_node node[1];
+ struct xio *xio; /* display */
+ Window win; /* the drawing window */
+ Time tstamp; /* timestamp of last user event */
+ GC gc; /* it's graphics context */
+ u8 ch[H*W]; /* the page contents */
+ lbits modified, hidden, lhidden; /* states for each line */
+ lbits dheight, blink, concealed; /* attributes for each line */
+ int fg, bg; /* current foreground/background */
+ int blink_on; /* blinking on */
+ int reveal; /* reveal concealed text */
+ void (*handler)(void *data, struct vt_event *ev); /* event-handler */
+ void *data; /* data for the event-handler */
+ int curs_x, curs_y; /* cursor position */
+ u8 title[32]; /* the user title */
+ // selection support
+ int sel_start_x, sel_start_y;
+ Time sel_start_t;
+ Time sel_set_t; /* time we got selection owner */
+ int sel_x1, sel_y1, sel_x2, sel_y2; /* selected area */
+ Pixmap sel_pixmap; /* for pixmap-selection requests */
+};
+
+struct xio *xio_open_dpy(char *dpy, int argc, char **argv);
+struct xio_win *xio_open_win(struct xio *xio, char *geom);
+void xio_close_win(struct xio_win *xw, int dpy_too);
+void xio_close_dpy(struct xio *xio);
+void xio_set_handler(struct xio_win *xw, void *handler, void *data);
+void xio_clear_win(struct xio_win *xw);
+void xio_put_line(struct xio_win *xw, int line, u8 *data);
+void xio_put_str(struct xio_win *xw, int line, u8 *c_str);
+int xio_get_line(struct xio_win *xw, int line, u8 *data);
+int xio_set_concealed(struct xio_win *xw, int on);
+void xio_update_win(struct xio_win *xw);
+void xio_fd_handler(int fd, void *handler, void *data);
+void xio_cancel_selection(struct xio_win *xw);
+void xio_query_selection(struct xio_win *xw);
+void xio_set_selection(struct xio_win *xw, int x1, int y1, int x2, int y2);
+void xio_set_cursor(struct xio_win *xw, int x, int y);
+void xio_event_loop(void);
+void xio_title(struct xio_win *xw, char *title);
+#endif
diff --git a/util/atsc_epg/Makefile b/util/atsc_epg/Makefile
new file mode 100644
index 0000000..747e2b8
--- /dev/null
+++ b/util/atsc_epg/Makefile
@@ -0,0 +1,16 @@
+# Makefile for linuxtv.org dvb-apps/util/atsc_epg
+
+binaries = atsc_epg
+
+inst_bin = $(binaries)
+
+CPPFLAGS += -I../../lib -std=c99 -D_POSIX_SOURCE
+#LDFLAGS += -static -L../../lib/libdvbapi -L../../lib/libucsi
+LDFLAGS += -L../../lib/libdvbapi -L../../lib/libucsi
+LDLIBS += -ldvbapi -lucsi
+
+.PHONY: all
+
+all: $(binaries)
+
+include ../../Make.rules
diff --git a/util/atsc_epg/README b/util/atsc_epg/README
new file mode 100644
index 0000000..6a82453
--- /dev/null
+++ b/util/atsc_epg/README
@@ -0,0 +1,12 @@
+Hi there,
+
+atsc_epg is a small utility for obtaining information such as programs, EPG
+(electronic program guide) from an ATSC channel.
+
+Pulling the detailed information, i.e., option '-t', may take fairly long
+time, or never ending, which is a bug of the PSIP generator. Ctrl+C can be
+used to abort and the received parts will be printed.
+
+Enjoy,
+Yufei
+
diff --git a/util/atsc_epg/atsc_epg.c b/util/atsc_epg/atsc_epg.c
new file mode 100644
index 0000000..55e266d
--- /dev/null
+++ b/util/atsc_epg/atsc_epg.c
@@ -0,0 +1,1249 @@
+/*
+ * atsc_epg utility
+ *
+ * Copyright (C) 2009 Yufei Yuan <yfyuan@gmail.com>
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ *
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+#include <time.h>
+#include <signal.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <sys/ioctl.h>
+#include <sys/poll.h>
+#include <errno.h>
+#include <getopt.h>
+#include <stdarg.h>
+#include <libdvbapi/dvbfe.h>
+#include <libdvbapi/dvbdemux.h>
+#include <libucsi/dvb/section.h>
+#include <libucsi/atsc/section.h>
+#include <libucsi/atsc/types.h>
+
+#define TIMEOUT 60
+#define RRT_TIMEOUT 60
+#define MAX_NUM_EVENT_TABLES 128
+#define TITLE_BUFFER_LEN 4096
+#define MESSAGE_BUFFER_LEN (16 * 1024)
+#define MAX_NUM_CHANNELS 16
+#define MAX_NUM_EVENTS_PER_CHANNEL (4 * 24 * 7)
+
+static int atsc_scan_table(int dmxfd, uint16_t pid, enum atsc_section_tag tag,
+ void **table_section);
+
+static const char *program;
+static int adapter = 0;
+static int period = 12; /* hours */
+static int frequency;
+static int enable_ett = 0;
+static int ctrl_c = 0;
+static const char *modulation = NULL;
+static char separator[80];
+void (*old_handler)(int);
+
+struct atsc_string_buffer {
+ int buf_len;
+ int buf_pos;
+ char *string;
+};
+
+struct atsc_event_info {
+ uint16_t id;
+ struct tm start;
+ struct tm end;
+ int title_pos;
+ int title_len;
+ int msg_pos;
+ int msg_len;
+};
+
+struct atsc_eit_section_info {
+ uint8_t section_num;
+ uint8_t num_events;
+ uint8_t num_etms;
+ uint8_t num_received_etms;
+ struct atsc_event_info **events;
+};
+
+struct atsc_eit_info {
+ int num_eit_sections;
+ struct atsc_eit_section_info *section;
+};
+
+struct atsc_channel_info {
+ uint8_t num_eits;
+ uint8_t service_type;
+ char short_name[8];
+ uint16_t major_num;
+ uint16_t minor_num;
+ uint16_t tsid;
+ uint16_t prog_num;
+ uint16_t src_id;
+ struct atsc_eit_info *eit;
+ struct atsc_event_info *last_event;
+ int event_info_index;
+ struct atsc_event_info e[MAX_NUM_EVENTS_PER_CHANNEL];
+ struct atsc_string_buffer title_buf;
+ struct atsc_string_buffer msg_buf;
+};
+
+struct atsc_virtual_channels_info {
+ int num_channels;
+ uint16_t eit_pid[MAX_NUM_EVENT_TABLES];
+ uint16_t ett_pid[MAX_NUM_EVENT_TABLES];
+ struct atsc_channel_info ch[MAX_NUM_CHANNELS];
+} guide;
+
+struct mgt_table_name {
+ uint16_t range;
+ const char *string;
+};
+
+struct mgt_table_name mgt_tab_name_array[] = {
+ {0x0000, "terrestrial VCT with current_next_indictor=1"},
+ {0x0001, "terrestrial VCT with current_next_indictor=0"},
+ {0x0002, "cable VCT with current_next_indictor=1"},
+ {0x0003, "cable VCT with current_next_indictor=0"},
+ {0x0004, "channel ETT"},
+ {0x0005, "DCCSCT"},
+ {0x00FF, "reserved for future ATSC use"},
+ {0x017F, "EIT"},
+ {0x01FF, "reserved for future ATSC use"},
+ {0x027F, "event ETT"},
+ {0x02FF, "reserved for future ATSC use"}, /* FIXME */
+ {0x03FF, "RRT with rating region"},
+ {0x0FFF, "user private"},
+ {0x13FF, "reserved for future ATSC use"},
+ {0x14FF, "DCCT with dcc_id"},
+ {0xFFFF, "reserved for future ATSC use"}
+};
+
+const char *channel_modulation_mode[] = {
+ "",
+ "analog",
+ "SCTE mode 1",
+ "SCTE mode 2",
+ "ATSC 8VSB",
+ "ATSC 16VSB"
+};
+
+const char *channel_service_type[] = {
+ "",
+ "analog TV",
+ "ATSC digital TV",
+ "ATSC audio",
+ "ATSC data-only"
+};
+
+void *(*table_callback[16])(struct atsc_section_psip *) =
+{
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+ (void *(*)(struct atsc_section_psip *))atsc_mgt_section_codec,
+ (void *(*)(struct atsc_section_psip *))atsc_tvct_section_codec,
+ (void *(*)(struct atsc_section_psip *))atsc_cvct_section_codec,
+ (void *(*)(struct atsc_section_psip *))atsc_rrt_section_codec,
+ (void *(*)(struct atsc_section_psip *))atsc_eit_section_codec,
+ (void *(*)(struct atsc_section_psip *))atsc_ett_section_codec,
+ (void *(*)(struct atsc_section_psip *))atsc_stt_section_codec,
+ NULL, NULL
+};
+
+static void int_handler(int sig_num)
+{
+ if(SIGINT != sig_num) {
+ return;
+ }
+ ctrl_c = 1;
+}
+
+/* shamelessly stolen from dvbsnoop, but almost not modified */
+static uint32_t get_bits(const uint8_t *buf, int startbit, int bitlen)
+{
+ const uint8_t *b;
+ uint32_t mask,tmp_long;
+ int bitHigh,i;
+
+ b = &buf[startbit / 8];
+ startbit %= 8;
+
+ bitHigh = 8;
+ tmp_long = b[0];
+ for (i = 0; i < ((bitlen-1) >> 3); i++) {
+ tmp_long <<= 8;
+ tmp_long |= b[i+1];
+ bitHigh += 8;
+ }
+
+ startbit = bitHigh - startbit - bitlen;
+ tmp_long = tmp_long >> startbit;
+ mask = (1ULL << bitlen) - 1;
+ return tmp_long & mask;
+}
+
+static void usage(void)
+{
+ fprintf(stderr, "usage: %s [-a <n>] -f <frequency> [-p <period>]"
+ " [-m <modulation>] [-t] [-h]\n", program);
+}
+
+static void help(void)
+{
+ fprintf(stderr,
+ "\nhelp:\n"
+ "%s [-a <n>] -f <frequency> [-p <period>] [-m <modulation>] [-t] [-h]\n"
+ " -a: adapter index to use, (default 0)\n"
+ " -f: tuning frequency\n"
+ " -p: period in hours, (default 12)\n"
+ " -m: modulation ATSC vsb_8|vsb_16 (default vsb_8)\n"
+ " -t: enable ETT to receive program details, if available\n"
+ " -h: display this message\n", program);
+}
+
+static int close_frontend(struct dvbfe_handle *fe)
+{
+ if(NULL == fe) {
+ fprintf(stderr, "%s(): NULL pointer detected\n", __FUNCTION__);
+ }
+
+ dvbfe_close(fe);
+
+ return 0;
+}
+
+static int open_frontend(struct dvbfe_handle **fe)
+{
+ struct dvbfe_info fe_info;
+
+ if(NULL == (*fe = dvbfe_open(adapter, 0, 0))) {
+ fprintf(stderr, "%s(): error calling dvbfe_open()\n",
+ __FUNCTION__);
+ return -1;
+ }
+ dvbfe_get_info(*fe, 0, &fe_info, DVBFE_INFO_QUERYTYPE_IMMEDIATE, 0);
+ if(DVBFE_TYPE_ATSC != fe_info.type) {
+ fprintf(stderr, "%s(): only ATSC frontend supported currently\n",
+ __FUNCTION__);
+ return -1;
+ }
+ fe_info.feparams.frequency = frequency;
+ fe_info.feparams.inversion = DVBFE_INVERSION_AUTO;
+ fe_info.feparams.u.atsc.modulation = DVBFE_ATSC_MOD_VSB_8;
+ fprintf(stdout, "tuning to %d Hz, please wait...\n", frequency);
+ if(dvbfe_set(*fe, &fe_info.feparams, TIMEOUT * 1000)) {
+ fprintf(stderr, "%s(): cannot lock to %d Hz in %d seconds\n",
+ __FUNCTION__, frequency, TIMEOUT);
+ return -1;
+ }
+ fprintf(stdout, "tuner locked.\n");
+
+ return 0;
+}
+
+#if ENABLE_RRT
+/* this is untested as since this part of the library is broken */
+static int parse_rrt(int dmxfd)
+{
+ const enum atsc_section_tag tag = stag_atsc_rating_region;
+ struct atsc_rrt_section *rrt;
+ struct atsc_text *region_name;
+ struct atsc_text_string *atsc_str;
+ int i, j, ret;
+
+ i = 0;
+ fprintf(stdout, "waiting for RRT: ");
+ fflush(stdout);
+ while(i < RRT_TIMEOUT) {
+ ret = atsc_scan_table(dmxfd, ATSC_BASE_PID, tag, (void **)&rrt);
+ if(0 > ret) {
+ fprintf(stderr, "%s(): error calling atsc_scan_table()\n",
+ __FUNCTION__);
+ return -1;
+ }
+ if(0 == ret) {
+ if(RRT_TIMEOUT > i) {
+ fprintf(stdout, ".");
+ fflush(stdout);
+ } else {
+ fprintf(stdout, "\nno RRT in %d seconds\n",
+ RRT_TIMEOUT);
+ return 0;
+ }
+ i += TIMEOUT;
+ } else {
+ fprintf(stdout, "\n");
+ fflush(stdout);
+ break;
+ }
+ }
+
+ region_name = atsc_rrt_section_rating_region_name_text(rrt);
+ atsc_text_strings_for_each(region_name, atsc_str, i) {
+ struct atsc_text_string_segment *seg;
+
+ atsc_text_string_segments_for_each(atsc_str, seg, j) {
+ const char *c;
+ int k;
+ if(seg->mode < 0x3E) {
+ fprintf(stderr, "%s(): text mode of 0x%02X "
+ "not supported yet\n",
+ __FUNCTION__, seg->mode);
+ return -1;
+ }
+ c = (const char *)atsc_text_string_segment_bytes(seg);
+ for(k = 0; k < seg->number_bytes; k++) {
+ fprintf(stdout, "%c", c[k]);
+ }
+ }
+ }
+
+ return 0;
+}
+#endif
+
+static int parse_stt(int dmxfd)
+{
+ const enum atsc_section_tag tag = stag_atsc_system_time;
+ const struct atsc_stt_section *stt;
+ time_t rx_time;
+ time_t sys_time;
+ int ret;
+
+ ret = atsc_scan_table(dmxfd, ATSC_BASE_PID, tag, (void **)&stt);
+ if(0 > ret) {
+ fprintf(stderr, "%s(): error calling atsc_scan_table()\n",
+ __FUNCTION__);
+ return -1;
+ }
+ if(0 == ret) {
+ fprintf(stdout, "no STT in %d seconds\n", TIMEOUT);
+ return 0;
+ }
+
+ rx_time = atsctime_to_unixtime(stt->system_time);
+ time(&sys_time);
+ fprintf(stdout, "system time: %s", ctime(&sys_time));
+ fprintf(stdout, "TS STT time: %s", ctime(&rx_time));
+
+ return 0;
+}
+
+static int parse_tvct(int dmxfd)
+{
+ int num_sections;
+ uint32_t section_pattern;
+ const enum atsc_section_tag tag = stag_atsc_terrestrial_virtual_channel;
+ struct atsc_tvct_section *tvct;
+ struct atsc_tvct_channel *ch;
+ struct atsc_channel_info *curr_info;
+ int i, k, ret;
+
+ section_pattern = 0;
+ num_sections = -1;
+
+ do {
+ ret = atsc_scan_table(dmxfd, ATSC_BASE_PID, tag, (void **)&tvct);
+ if(0 > ret) {
+ fprintf(stderr, "%s(): error calling atsc_scan_table()\n",
+ __FUNCTION__);
+ return -1;
+ }
+ if(0 == ret) {
+ fprintf(stdout, "no TVCT in %d seconds\n", TIMEOUT);
+ return 0;
+ }
+
+ if(-1 == num_sections) {
+ num_sections = 1 + tvct->head.ext_head.last_section_number;
+ if(32 < num_sections) {
+ fprintf(stderr, "%s(): no support yet for "
+ "tables having more than 32 sections\n",
+ __FUNCTION__);
+ return -1;
+ }
+ } else {
+ if(num_sections !=
+ 1 + tvct->head.ext_head.last_section_number) {
+ fprintf(stderr,
+ "%s(): last section number does not match\n",
+ __FUNCTION__);
+ return -1;
+ }
+ }
+ if(section_pattern & (1 << tvct->head.ext_head.section_number)) {
+ continue;
+ }
+ section_pattern |= 1 << tvct->head.ext_head.section_number;
+
+ if(MAX_NUM_CHANNELS < guide.num_channels +
+ tvct->num_channels_in_section) {
+ fprintf(stderr, "%s(): no support for more than %d "
+ "virtual channels in a pyhsical channel\n",
+ __FUNCTION__, MAX_NUM_CHANNELS);
+ return -1;
+ }
+ curr_info = &guide.ch[guide.num_channels];
+ guide.num_channels += tvct->num_channels_in_section;
+
+ atsc_tvct_section_channels_for_each(tvct, ch, i) {
+ /* initialize the curr_info structure */
+ /* each EIT covers 3 hours */
+ curr_info->num_eits = (period / 3) + !!(period % 3);
+ while (curr_info->num_eits &&
+ (0xFFFF == guide.eit_pid[curr_info->num_eits - 1])) {
+ curr_info->num_eits -= 1;
+ }
+ if(curr_info->eit) {
+ fprintf(stderr, "%s(): non-NULL pointer detected "
+ "during initialization", __FUNCTION__);
+ return -1;
+ }
+ if(NULL == (curr_info->eit = calloc(curr_info->num_eits,
+ sizeof(struct atsc_eit_info)))) {
+ fprintf(stderr, "%s(): error calling calloc()\n",
+ __FUNCTION__);
+ return -1;
+ }
+ if(NULL == (curr_info->title_buf.string = calloc(TITLE_BUFFER_LEN,
+ sizeof(char)))) {
+ fprintf(stderr, "%s(): error calling calloc()\n",
+ __FUNCTION__);
+ return -1;
+ }
+ curr_info->title_buf.buf_len = TITLE_BUFFER_LEN;
+ curr_info->title_buf.buf_pos = 0;
+
+ if(NULL == (curr_info->msg_buf.string = calloc(MESSAGE_BUFFER_LEN,
+ sizeof(char)))) {
+ fprintf(stderr, "%s(): error calling calloc()\n",
+ __FUNCTION__);
+ return -1;
+ }
+ curr_info->msg_buf.buf_len = MESSAGE_BUFFER_LEN;
+ curr_info->msg_buf.buf_pos = 0;
+
+ for(k = 0; k < 7; k++) {
+ curr_info->short_name[k] =
+ get_bits((const uint8_t *)ch->short_name,
+ k * 16, 16);
+ }
+ curr_info->service_type = ch->service_type;
+ curr_info->major_num = ch->major_channel_number;
+ curr_info->minor_num = ch->minor_channel_number;
+ curr_info->tsid = ch->channel_TSID;
+ curr_info->prog_num = ch->program_number;
+ curr_info->src_id = ch->source_id;
+ curr_info++;
+ }
+ } while(section_pattern != (uint32_t)((1 << num_sections) - 1));
+
+ return 0;
+}
+
+static int match_event(struct atsc_eit_info *eit, uint16_t event_id,
+ struct atsc_event_info **event, uint8_t *curr_index)
+{
+ int j, k;
+ struct atsc_eit_section_info *section;
+
+ if(NULL == eit || NULL == event || NULL == curr_index) {
+ fprintf(stderr, "%s(): NULL pointer detected\n", __FUNCTION__);
+ return -1;
+ }
+
+ for(j = 0; j < eit->num_eit_sections; j++) {
+ section = &eit->section[j];
+
+ for(k = 0; k < section->num_events; k++) {
+ if(section->events[k] && section->events[k]->id ==
+ event_id) {
+ *event = section->events[k];
+ break;
+ }
+ }
+ if(*event) {
+ *curr_index = j;
+ break;
+ }
+ }
+
+ return 0;
+}
+
+static int parse_message(struct atsc_channel_info *channel,
+ struct atsc_ett_section *ett, struct atsc_event_info *event)
+{
+ int i, j;
+ struct atsc_text *text;
+ struct atsc_text_string *str;
+
+ if(NULL == ett || NULL == event || NULL == channel) {
+ fprintf(stderr, "%s(): NULL pointer detected\n", __FUNCTION__);
+ return -1;
+ }
+
+ text = atsc_ett_section_extended_text_message(ett);
+ atsc_text_strings_for_each(text, str, i) {
+ struct atsc_text_string_segment *seg;
+
+ atsc_text_string_segments_for_each(str, seg, j) {
+ event->msg_pos = channel->msg_buf.buf_pos;
+ if(0 > atsc_text_segment_decode(seg,
+ (uint8_t **)&channel->msg_buf.string,
+ (size_t *)&channel->msg_buf.buf_len,
+ (size_t *)&channel->msg_buf.buf_pos)) {
+ fprintf(stderr, "%s(): error calling "
+ "atsc_text_segment_decode()\n",
+ __FUNCTION__);
+ return -1;
+ }
+ event->msg_len = 1 + channel->msg_buf.buf_pos -
+ event->msg_pos;
+ }
+ }
+
+ return 0;
+}
+
+static int parse_ett(int dmxfd, int index, uint16_t pid)
+{
+ uint8_t curr_index;
+ uint32_t section_pattern;
+ const enum atsc_section_tag tag = stag_atsc_extended_text;
+ struct atsc_eit_info *eit;
+ struct atsc_ett_section *ett;
+ struct atsc_channel_info *channel;
+ struct atsc_event_info *event;
+ struct atsc_eit_section_info *section;
+ uint16_t source_id, event_id;
+ int c, ret;
+
+ if(0xFFFF == guide.ett_pid[index]) {
+ return 0;
+ }
+
+ for(c = 0; c < guide.num_channels; c++) {
+ channel = &guide.ch[c];
+ eit = &channel->eit[index];
+
+ section_pattern = 0;
+ while(section_pattern !=
+ (uint32_t)((1 << eit->num_eit_sections) - 1)) {
+ if(ctrl_c) {
+ return 0;
+ }
+ ret = atsc_scan_table(dmxfd, pid, tag, (void **)&ett);
+ fprintf(stdout, ".");
+ fflush(stdout);
+ if(0 > ret) {
+ fprintf(stderr, "%s(): error calling "
+ "atsc_scan_table()\n", __FUNCTION__);
+ return -1;
+ }
+ if(0 == ret) {
+ fprintf(stdout, "no ETT %d in %d seconds\n",
+ index, TIMEOUT);
+ return 0;
+ }
+
+ source_id = ett->ETM_source_id;
+ event_id = ett->ETM_sub_id;
+ if(source_id != channel->src_id) {
+ continue;
+ }
+
+ event = NULL;
+ if(match_event(eit, event_id, &event, &curr_index)) {
+ fprintf(stderr, "%s(): error calling "
+ "match_event()\n", __FUNCTION__);
+ return -1;
+ }
+ if(NULL == event) {
+ continue;
+ }
+ if(section_pattern & (1 << curr_index)) {
+ /* the section has been filled, so skip,
+ * not consider version yet
+ */
+ continue;
+ }
+ if(event->msg_len) {
+ /* the message has been filled */
+ continue;
+ }
+
+ if(parse_message(channel, ett, event)) {
+ fprintf(stderr, "%s(): error calling "
+ "parse_message()\n", __FUNCTION__);
+ return -1;
+ }
+ section = &eit->section[curr_index];
+ if(++section->num_received_etms == section->num_etms) {
+ section_pattern |= 1 << curr_index;
+ }
+ }
+ }
+
+ return 0;
+}
+
+static int parse_events(struct atsc_channel_info *curr_info,
+ struct atsc_eit_section *eit, struct atsc_eit_section_info *section)
+{
+ int i, j, k;
+ struct atsc_eit_event *e;
+ time_t start_time, end_time;
+
+ if(NULL == curr_info || NULL == eit) {
+ fprintf(stderr, "%s(): NULL pointer detected\n", __FUNCTION__);
+ return -1;
+ }
+
+ atsc_eit_section_events_for_each(eit, e, i) {
+ struct atsc_text *title;
+ struct atsc_text_string *str;
+ struct atsc_event_info *e_info =
+ &curr_info->e[curr_info->event_info_index];
+
+ if(0 == i && curr_info->last_event) {
+ if(e->event_id == curr_info->last_event->id) {
+ section->events[i] = NULL;
+ /* skip if it's the same event spanning
+ * over sections
+ */
+ continue;
+ }
+ }
+ curr_info->event_info_index += 1;
+ section->events[i] = e_info;
+ e_info->id = e->event_id;
+ start_time = atsctime_to_unixtime(e->start_time);
+ end_time = start_time + e->length_in_seconds;
+ localtime_r(&start_time, &e_info->start);
+ localtime_r(&end_time, &e_info->end);
+ if(0 != e->ETM_location && 3 != e->ETM_location) {
+ /* FIXME assume 1 and 2 is interchangable as of now */
+ section->num_etms++;
+ }
+
+ title = atsc_eit_event_name_title_text(e);
+ atsc_text_strings_for_each(title, str, j) {
+ struct atsc_text_string_segment *seg;
+
+ atsc_text_string_segments_for_each(str, seg, k) {
+ e_info->title_pos = curr_info->title_buf.buf_pos;
+ if(0 > atsc_text_segment_decode(seg,
+ (uint8_t **)&curr_info->title_buf.string,
+ (size_t *)&curr_info->title_buf.buf_len,
+ (size_t *)&curr_info->title_buf.buf_pos)) {
+ fprintf(stderr, "%s(): error calling "
+ "atsc_text_segment_decode()\n",
+ __FUNCTION__);
+ return -1;
+ }
+ e_info->title_len = curr_info->title_buf.buf_pos -
+ e_info->title_pos + 1;
+ }
+ }
+ }
+
+ return 0;
+}
+
+static int parse_eit(int dmxfd, int index, uint16_t pid)
+{
+ int num_sections;
+ uint8_t section_num;
+ uint8_t curr_channel_index;
+ uint32_t section_pattern;
+ const enum atsc_section_tag tag = stag_atsc_event_information;
+ struct atsc_eit_section *eit;
+ struct atsc_channel_info *curr_info;
+ struct atsc_eit_info *eit_info;
+ struct atsc_eit_section_info *section;
+ uint16_t source_id;
+ uint32_t eit_instance_pattern = 0;
+ int i, k, ret;
+
+ while(eit_instance_pattern !=
+ (uint32_t)((1 << guide.num_channels) - 1)) {
+ source_id = 0xFFFF;
+ section_pattern = 0;
+ num_sections = -1;
+
+ do {
+ ret = atsc_scan_table(dmxfd, pid, tag, (void **)&eit);
+ fprintf(stdout, ".");
+ fflush(stdout);
+ if(0 > ret) {
+ fprintf(stderr, "%s(): error calling "
+ "atsc_scan_table()\n", __FUNCTION__);
+ return -1;
+ }
+ if(0 == ret) {
+ fprintf(stdout, "no EIT %d in %d seconds\n",
+ index, TIMEOUT);
+ return 0;
+ }
+
+ if(0xFFFF == source_id) {
+ source_id = atsc_eit_section_source_id(eit);
+ for(k = 0; k < guide.num_channels; k++) {
+ if(source_id == guide.ch[k].src_id) {
+ curr_info = &guide.ch[k];
+ curr_channel_index = k;
+ if(0 == index) {
+ curr_info->last_event = NULL;
+ }
+ break;
+ }
+ }
+ if(k == guide.num_channels) {
+ fprintf(stderr, "%s(): cannot find source_id "
+ "0x%04X in the EIT\n",
+ __FUNCTION__, source_id);
+ return -1;
+ }
+ } else {
+ if(source_id !=
+ atsc_eit_section_source_id(eit)) {
+ continue;
+ }
+ }
+ if(eit_instance_pattern & (1 << curr_channel_index)) {
+ /* we have received this instance,
+ * so quit quick
+ */
+ break;
+ }
+
+ if(-1 == num_sections) {
+ num_sections = 1 +
+ eit->head.ext_head.last_section_number;
+ if(32 < num_sections) {
+ fprintf(stderr,
+ "%s(): no support yet for "
+ "tables having more than "
+ "32 sections\n", __FUNCTION__);
+ return -1;
+ }
+ } else {
+ if(num_sections != 1 +
+ eit->head.ext_head.last_section_number) {
+ fprintf(stderr,
+ "%s(): last section number "
+ "does not match\n",
+ __FUNCTION__);
+ return -1;
+ }
+ }
+ if(section_pattern &
+ (1 << eit->head.ext_head.section_number)) {
+ continue;
+ }
+ section_pattern |= 1 << eit->head.ext_head.section_number;
+
+ eit_info = &curr_info->eit[index];
+ if(NULL == (eit_info->section =
+ realloc(eit_info->section,
+ (eit_info->num_eit_sections + 1) *
+ sizeof(struct atsc_eit_section_info)))) {
+ fprintf(stderr,
+ "%s(): error calling realloc()\n",
+ __FUNCTION__);
+ return -1;
+ }
+ section_num = eit->head.ext_head.section_number;
+ if(0 == eit_info->num_eit_sections) {
+ eit_info->num_eit_sections = 1;
+ section = eit_info->section;
+ } else {
+ /* have to sort it into section order
+ * (temporal order)
+ */
+ for(i = 0; i < eit_info->num_eit_sections; i++) {
+ if(eit_info->section[i].section_num >
+ section_num) {
+ break;
+ }
+ }
+ memmove(&eit_info->section[i + 1],
+ &eit_info->section[i],
+ (eit_info->num_eit_sections - i) *
+ sizeof(struct atsc_eit_section_info));
+ section = &eit_info->section[i - 1];
+ section = &eit_info->section[i];
+ eit_info->num_eit_sections += 1;
+ }
+
+ section->section_num = section_num;
+ section->num_events = eit->num_events_in_section;
+ section->num_etms = 0;
+ section->num_received_etms = 0;
+ if(NULL == (section->events = calloc(section->num_events,
+ sizeof(struct atsc_event_info *)))) {
+ fprintf(stderr, "%s(): error calling calloc()\n",
+ __FUNCTION__);
+ return -1;
+ }
+ if(parse_events(curr_info, eit, section)) {
+ fprintf(stderr, "%s(): error calling "
+ "parse_events()\n", __FUNCTION__);
+ return -1;
+ }
+ } while(section_pattern != (uint32_t)((1 << num_sections) - 1));
+ eit_instance_pattern |= 1 << curr_channel_index;
+ }
+
+ for(i = 0; i < guide.num_channels; i++) {
+ struct atsc_channel_info *channel = &guide.ch[i];
+ struct atsc_eit_info *ei = &channel->eit[index];
+ struct atsc_eit_section_info *s;
+
+ if(0 == ei->num_eit_sections) {
+ channel->last_event = NULL;
+ continue;
+ }
+ s = &ei->section[ei->num_eit_sections - 1];
+ /* BUG: it's incorrect when last section has no event */
+ if(0 == s->num_events) {
+ channel->last_event = NULL;
+ continue;
+ }
+ channel->last_event = s->events[s->num_events - 1];
+ }
+
+ return 0;
+}
+
+static int parse_mgt(int dmxfd)
+{
+ const enum atsc_section_tag tag = stag_atsc_master_guide;
+ struct atsc_mgt_section *mgt;
+ struct atsc_mgt_table *t;
+ int i, j, ret;
+
+ ret = atsc_scan_table(dmxfd, ATSC_BASE_PID, tag, (void **)&mgt);
+ if(0 > ret) {
+ fprintf(stderr, "%s(): error calling atsc_scan_table()\n",
+ __FUNCTION__);
+ return -1;
+ }
+ if(0 == ret) {
+ fprintf(stdout, "no MGT in %d seconds\n", TIMEOUT);
+ return 0;
+ }
+
+ fprintf(stdout, "MGT table:\n");
+ atsc_mgt_section_tables_for_each(mgt, t, i) {
+ struct mgt_table_name table;
+
+ for(j = 0; j < (int)(sizeof(mgt_tab_name_array) /
+ sizeof(struct mgt_table_name)); j++) {
+ if(t->table_type > mgt_tab_name_array[j].range) {
+ continue;
+ }
+ table = mgt_tab_name_array[j];
+ if(0 == j || mgt_tab_name_array[j - 1].range + 1 ==
+ mgt_tab_name_array[j].range) {
+ j = -1;
+ } else {
+ j = t->table_type - mgt_tab_name_array[j - 1].range - 1;
+ if(0x017F == table.range) {
+ guide.eit_pid[j] = t->table_type_PID;
+ } else if (0x027F == table.range) {
+ guide.ett_pid[j] = t->table_type_PID;
+ }
+ }
+ break;
+ }
+
+ fprintf(stdout, " %2d: type = 0x%04X, PID = 0x%04X, %s", i,
+ t->table_type, t->table_type_PID, table.string);
+ if(-1 != j) {
+ fprintf(stdout, " %d", j);
+ }
+ fprintf(stdout, "\n");
+ }
+
+ return 0;
+}
+
+static int cleanup_guide(void)
+{
+ int i, j, k;
+
+ for(i = 0; i < guide.num_channels; i++) {
+ struct atsc_channel_info *channel = &guide.ch[i];
+
+ if(channel->title_buf.string) {
+ free(channel->title_buf.string);
+ }
+ if(channel->msg_buf.string) {
+ free(channel->msg_buf.string);
+ }
+ for(j = 0; j < channel->num_eits; j++) {
+ struct atsc_eit_info *eit = &channel->eit[j];
+
+ for(k = 0; k < eit->num_eit_sections; k++) {
+ struct atsc_eit_section_info *section =
+ &eit->section[k];
+ if(section->num_events) {
+ free(section->events);
+ }
+ }
+ if(k) {
+ free(eit->section);
+ }
+ }
+ if(j) {
+ free(channel->eit);
+ }
+ }
+
+ return 0;
+}
+
+static int print_events(struct atsc_channel_info *channel,
+ struct atsc_eit_section_info *section)
+{
+ int m;
+ char line[256];
+
+ if(NULL == section) {
+ fprintf(stderr, "%s(): NULL pointer detected", __FUNCTION__);
+ return -1;
+ }
+ for(m = 0; m < section->num_events; m++) {
+ struct atsc_event_info *event =
+ section->events[m];
+
+ if(NULL == event) {
+ continue;
+ }
+ fprintf(stdout, "|%02d:%02d--%02d:%02d| ",
+ event->start.tm_hour, event->start.tm_min,
+ event->end.tm_hour, event->end.tm_min);
+ snprintf(line, event->title_len, "%s",
+ &channel->title_buf.string[event->title_pos]);
+ line[event->title_len] = '\0';
+ fprintf(stdout, "%s\n", line);
+ if(event->msg_len) {
+ int len = event->msg_len;
+ int pos = event->msg_pos;
+ size_t part;
+
+ do {
+ part = len > 255 ? 255 : len;
+ snprintf(line, part, "%s",
+ &channel->msg_buf.string[pos]);
+ line[part] = '\0';
+ fprintf(stdout, "%s", line);
+ len -= part;
+ pos += part;
+ } while(0 < len);
+ fprintf(stdout, "\n");
+ }
+ }
+ return 0;
+}
+
+static int print_guide(void)
+{
+ int i, j, k;
+
+ fprintf(stdout, "%s\n", separator);
+ for(i = 0; i < guide.num_channels; i++) {
+ struct atsc_channel_info *channel = &guide.ch[i];
+
+ fprintf(stdout, "%d.%d %s\n", channel->major_num,
+ channel->minor_num, channel->short_name);
+ for(j = 0; j < channel->num_eits; j++) {
+ struct atsc_eit_info *eit = &channel->eit[j];
+
+ for(k = 0; k < eit->num_eit_sections; k++) {
+ struct atsc_eit_section_info *section =
+ &eit->section[k];
+ if(print_events(channel, section)) {
+ fprintf(stderr, "%s(): error calling "
+ "print_events()\n", __FUNCTION__);
+ return -1;
+ }
+ }
+ }
+ fprintf(stdout, "%s\n", separator);
+ }
+
+ return 0;
+}
+
+static int open_demux(int *dmxfd)
+{
+ if((*dmxfd = dvbdemux_open_demux(adapter, 0, 0)) < 0) {
+ fprintf(stderr, "%s(): error calling dvbdemux_open_demux()\n",
+ __FUNCTION__);
+ return -1;
+ }
+ return 0;
+}
+
+static int close_demux(int dmxfd)
+{
+ if(dvbdemux_stop(dmxfd)) {
+ fprintf(stderr, "%s(): error calling dvbdemux_stop()\n",
+ __FUNCTION__);
+ return -1;
+ }
+ return 0;
+}
+
+/* used other utilities as template and generalized here */
+static int atsc_scan_table(int dmxfd, uint16_t pid, enum atsc_section_tag tag,
+ void **table_section)
+{
+ uint8_t filter[18];
+ uint8_t mask[18];
+ unsigned char sibuf[4096];
+ int size;
+ int ret;
+ struct pollfd pollfd;
+ struct section *section;
+ struct section_ext *section_ext;
+ struct atsc_section_psip *psip;
+
+ /* create a section filter for the table */
+ memset(filter, 0, sizeof(filter));
+ memset(mask, 0, sizeof(mask));
+ filter[0] = tag;
+ mask[0] = 0xFF;
+ if(dvbdemux_set_section_filter(dmxfd, pid, filter, mask, 1, 1)) {
+ fprintf(stderr, "%s(): error calling atsc_scan_table()\n",
+ __FUNCTION__);
+ return -1;
+ }
+
+ /* poll for data */
+ pollfd.fd = dmxfd;
+ pollfd.events = POLLIN | POLLERR |POLLPRI;
+ if((ret = poll(&pollfd, 1, TIMEOUT * 1000)) < 0) {
+ if(ctrl_c) {
+ return 0;
+ }
+ fprintf(stderr, "%s(): error calling poll()\n", __FUNCTION__);
+ return -1;
+ }
+
+ if(0 == ret) {
+ return 0;
+ }
+
+ /* read it */
+ if((size = read(dmxfd, sibuf, sizeof(sibuf))) < 0) {
+ fprintf(stderr, "%s(): error calling read()\n", __FUNCTION__);
+ return -1;
+ }
+
+ /* parse section */
+ section = section_codec(sibuf, size);
+ if(NULL == section) {
+ fprintf(stderr, "%s(): error calling section_codec()\n",
+ __FUNCTION__);
+ return -1;
+ }
+
+ section_ext = section_ext_decode(section, 0);
+ if(NULL == section_ext) {
+ fprintf(stderr, "%s(): error calling section_ext_decode()\n",
+ __FUNCTION__);
+ return -1;
+ }
+
+ psip = atsc_section_psip_decode(section_ext);
+ if(NULL == psip) {
+ fprintf(stderr,
+ "%s(): error calling atsc_section_psip_decode()\n",
+ __FUNCTION__);
+ return -1;
+ }
+
+ *table_section = table_callback[tag & 0x0F](psip);
+ if(NULL == *table_section) {
+ fprintf(stderr, "%s(): error decode table section\n",
+ __FUNCTION__);
+ return -1;
+ }
+
+ return 1;
+}
+
+int main(int argc, char *argv[])
+{
+ int i, dmxfd;
+ struct dvbfe_handle *fe;
+
+ program = argv[0];
+
+ if(1 == argc) {
+ usage();
+ exit(-1);
+ }
+
+ for( ; ; ) {
+ char c;
+
+ if(-1 == (c = getopt(argc, argv, "a:f:p:m:th"))) {
+ break;
+ }
+
+ switch(c) {
+ case 'a':
+ adapter = strtoll(optarg, NULL, 0);
+ break;
+
+ case 'f':
+ frequency = strtol(optarg, NULL, 0);
+ break;
+
+ case 'p':
+ period = strtol(optarg, NULL, 0);
+ /* each table covers 3 hours */
+ if((3 * MAX_NUM_EVENT_TABLES) < period) {
+ period = 3 * MAX_NUM_EVENT_TABLES;
+ }
+ break;
+
+ case 'm':
+ /* just stub, so far ATSC only has VSB_8 */
+ modulation = optarg;
+ break;
+
+ case 't':
+ enable_ett = 1;
+ break;
+
+ case 'h':
+ help();
+ exit(0);
+
+ default:
+ usage();
+ exit(-1);
+ }
+ }
+
+ memset(separator, '-', sizeof(separator));
+ separator[79] = '\0';
+ memset(&guide, 0, sizeof(struct atsc_virtual_channels_info));
+ memset(guide.eit_pid, 0xFF, MAX_NUM_EVENT_TABLES * sizeof(uint16_t));
+ memset(guide.ett_pid, 0xFF, MAX_NUM_EVENT_TABLES * sizeof(uint16_t));
+
+ if(open_frontend(&fe)) {
+ fprintf(stderr, "%s(): error calling open_frontend()\n",
+ __FUNCTION__);
+ return -1;
+ }
+
+ if(open_demux(&dmxfd)) {
+ fprintf(stderr, "%s(): error calling open_demux()\n",
+ __FUNCTION__);
+ return -1;
+ }
+
+ if(parse_stt(dmxfd)) {
+ fprintf(stderr, "%s(): error calling parse_stt()\n",
+ __FUNCTION__);
+ return -1;
+ }
+
+ if(parse_mgt(dmxfd)) {
+ fprintf(stderr, "%s(): error calling parse_mgt()\n",
+ __FUNCTION__);
+ return -1;
+ }
+
+ if(parse_tvct(dmxfd)) {
+ fprintf(stderr, "%s(): error calling parse_tvct()\n",
+ __FUNCTION__);
+ return -1;
+ }
+
+#ifdef ENABLE_RRT
+ if(parse_rrt(dmxfd)) {
+ fprintf(stderr, "%s(): error calling parse_rrt()\n",
+ __FUNCTION__);
+ return -1;
+ }
+#endif
+
+ fprintf(stdout, "receiving EIT ");
+ for(i = 0; i < guide.ch[0].num_eits; i++) {
+ if(parse_eit(dmxfd, i, guide.eit_pid[i])) {
+ fprintf(stderr, "%s(): error calling parse_eit()\n",
+ __FUNCTION__);
+ return -1;
+ }
+ }
+ fprintf(stdout, "\n");
+
+ old_handler = signal(SIGINT, int_handler);
+ if(enable_ett) {
+ fprintf(stdout, "receiving ETT ");
+ for(i = 0; i < guide.ch[0].num_eits; i++) {
+ if(0xFFFF != guide.ett_pid[i]) {
+ if(parse_ett(dmxfd, i, guide.ett_pid[i])) {
+ fprintf(stderr, "%s(): error calling "
+ "parse_eit()\n", __FUNCTION__);
+ return -1;
+ }
+ }
+ if(ctrl_c) {
+ break;
+ }
+ }
+ fprintf(stdout, "\n");
+ }
+ signal(SIGINT, old_handler);
+
+ if(print_guide()) {
+ fprintf(stderr, "%s(): error calling print_guide()\n",
+ __FUNCTION__);
+ return -1;
+ }
+
+ if(cleanup_guide()) {
+ fprintf(stderr, "%s(): error calling cleanup_guide()\n",
+ __FUNCTION__);
+ return -1;
+ }
+
+ if(close_demux(dmxfd)) {
+ fprintf(stderr, "%s(): error calling close_demux()\n",
+ __FUNCTION__);
+ return -1;
+ }
+
+ if(close_frontend(fe)) {
+ fprintf(stderr, "%s(): error calling close_demux()\n",
+ __FUNCTION__);
+ return -1;
+ }
+
+ return 0;
+}
diff --git a/util/femon/femon.c b/util/femon/femon.c
index 46d239d..a50fe17 100644
--- a/util/femon/femon.c
+++ b/util/femon/femon.c
@@ -42,14 +42,21 @@
static char *usage_str =
"\nusage: femon [options]\n"
" -H : human readable output\n"
+ " -A : Acoustical mode. A sound indicates the signal quality.\n"
+ " -r : If 'Acoustical mode' is active it tells the application\n"
+ " is called remotely via ssh. The sound is heard on the 'real'\n"
+ " machine but. The user has to be root.\n"
" -a number : use given adapter (default 0)\n"
" -f number : use given frontend (default 0)\n"
" -c number : samples to take (default 0 = infinite)\n\n";
+int sleep_time=1000000;
+int acoustical_mode=0;
+int remote=0;
static void usage(void)
{
- fprintf(stderr, usage_str);
+ fprintf(stderr, "%s", usage_str);
exit(1);
}
@@ -59,6 +66,27 @@ int check_frontend (struct dvbfe_handle *fe, int human_readable, unsigned int co
{
struct dvbfe_info fe_info;
unsigned int samples = 0;
+ FILE *ttyFile=NULL;
+
+ // We dont write the "beep"-codes to stdout but to /dev/tty1.
+ // This is neccessary for Thin-Client-Systems or Streaming-Boxes
+ // where the computer does not have a monitor and femon is called via ssh.
+ if(acoustical_mode)
+ {
+ if(remote)
+ {
+ ttyFile=fopen("/dev/tty1","w");
+ if(!ttyFile)
+ {
+ fprintf(stderr, "Could not open /dev/tty1. No access rights?\n");
+ exit(-1);
+ }
+ }
+ else
+ {
+ ttyFile=stdout;
+ }
+ }
do {
if (dvbfe_get_info(fe, FE_STATUS_PARAMS, &fe_info, DVBFE_INFO_QUERYTYPE_IMMEDIATE, 0) != FE_STATUS_PARAMS) {
@@ -94,12 +122,24 @@ int check_frontend (struct dvbfe_handle *fe, int human_readable, unsigned int co
if (fe_info.lock)
printf("FE_HAS_LOCK");
+ // create beep if acoustical_mode enabled
+ if(acoustical_mode)
+ {
+ int signal=(fe_info.signal_strength * 100) / 0xffff;
+ fprintf( ttyFile, "\033[10;%d]\a", 500+(signal*2));
+ // printf("Variable : %d\n", signal);
+ fflush(ttyFile);
+ }
+
printf("\n");
fflush(stdout);
- usleep(1000000);
+ usleep(sleep_time);
samples++;
} while ((!count) || (count-samples));
-
+
+ if(ttyFile)
+ fclose(ttyFile);
+
return 0;
}
@@ -148,7 +188,7 @@ int main(int argc, char *argv[])
int human_readable = 0;
int opt;
- while ((opt = getopt(argc, argv, "Ha:f:c:")) != -1) {
+ while ((opt = getopt(argc, argv, "rAHa:f:c:")) != -1) {
switch (opt)
{
default:
@@ -166,6 +206,15 @@ int main(int argc, char *argv[])
case 'H':
human_readable = 1;
break;
+ case 'A':
+ // Acoustical mode: we have to reduce the delay between
+ // checks in order to hear nice sound
+ sleep_time=5000;
+ acoustical_mode=1;
+ break;
+ case 'r':
+ remote=1;
+ break;
}
}
diff --git a/util/gotox/Makefile b/util/gotox/Makefile
new file mode 100644
index 0000000..673586a
--- /dev/null
+++ b/util/gotox/Makefile
@@ -0,0 +1,17 @@
+# Makefile for linuxtv.org dvb-apps/util/gotox
+
+binaries = gotox
+
+inst_bin = $(binaries)
+
+CPPFLAGS += -I../../lib
+LDFLAGS += -L../../lib/libdvbapi
+LDFLAGS += -L../../lib/libdvbsec
+LDLIBS += -ldvbapi
+LDLIBS += -ldvbsec
+
+.PHONY: all
+
+all: $(binaries)
+
+include ../../Make.rules
diff --git a/util/gotox/gotox.c b/util/gotox/gotox.c
new file mode 100644
index 0000000..6616133
--- /dev/null
+++ b/util/gotox/gotox.c
@@ -0,0 +1,145 @@
+/*
+ * Copyright (C) 2006 by Michel Verbraak <michel@verbraak.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the
+ * Free Software Foundation, Inc.,
+ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <libdvbapi/dvbfe.h>
+#include <libdvbsec/dvbsec_api.h>
+
+static char *usage_str =
+ "\nusage: gotox [options] -d <angle>\n"
+ " Goto the specified angle. Positive value for East rotation\n"
+ " Negative value for West rotation on Northern Hemisphere.\n"
+ " -d degrees : Angle to turn to in degrees (default 0)\n"
+ " -a number : use given adapter (default 0)\n"
+ " -f number : use given frontend (default 0)\n"
+ " -t seconds : leave power on to rotor for at least specified seconds of time (default 30)\n\n";
+
+int main(int argc, char *argv[])
+{
+ struct dvbfe_handle *fe;
+ unsigned int adapter = 0, frontend = 0;
+ double angle = 0;
+ int opt;
+ unsigned int sleepcount = 30;
+ static char *weststr = "west";
+ static char *eaststr = "east";
+
+ while ((opt = getopt(argc, argv, "ha:f:t:d:")) != -1) {
+
+ switch (opt){
+ case '?':
+ case 'h':
+ default:
+ fprintf(stderr, "%s", usage_str);
+ return EXIT_SUCCESS;
+
+ case 'a':
+ adapter = strtoul(optarg, NULL, 0);
+ break;
+
+ case 'f':
+ frontend = strtoul(optarg, NULL, 0);
+ break;
+
+ case 't':
+ sleepcount = strtoul(optarg, NULL, 0);
+ break;
+
+ case 'd':
+ angle = strtod(optarg, NULL);
+ break;
+ }
+ }
+
+ printf("Will try to rotate %s to %.2f degrees.\n", (angle < 0.0) ? weststr : eaststr, angle );
+
+ fe = dvbfe_open(adapter, frontend, 0);
+ if (fe == NULL) {
+ fprintf(stderr, "Could not open frontend %d on adapter %d.\n", frontend, adapter);
+ exit(1);
+ }
+
+ if (dvbfe_set_voltage(fe, DVBFE_SEC_VOLTAGE_OFF) != 0) {
+ fprintf(stderr, "Could not turn off power.\n");
+ dvbfe_close(fe);
+ return 1;
+ }
+ else
+ printf("Power OFF.\n");
+
+ sleep(1);
+
+ if (dvbfe_set_voltage(fe, DVBFE_SEC_VOLTAGE_18) != 0) {
+ fprintf(stderr, "Could not turn on power.\n");
+ dvbfe_close(fe);
+ return 1;
+ }
+ else
+ printf("Power on to 18V.\n");
+
+ sleep(1);
+
+ if (abs(angle) == 0.0) {
+
+ if (dvbsec_diseqc_goto_satpos_preset(fe, DISEQC_ADDRESS_POLAR_AZIMUTH_POSITIONER, 0) != 0) {
+ fprintf(stderr, "Could not goto 0.\n");
+ dvbfe_close(fe);
+ return 2;
+ } else {
+ printf("Going to home base 0 degrees.\n");
+ }
+ } else {
+
+ if (dvbsec_diseqc_goto_rotator_bearing(fe, DISEQC_ADDRESS_POLAR_AZIMUTH_POSITIONER, angle) != 0) {
+ fprintf(stderr, "Could not rotate.\n");
+ dvbfe_close(fe);
+ return 2;
+ }
+ }
+
+ while (sleepcount != 0) {
+ printf("%d: Rotating to %.2f.\r", sleepcount, angle);
+ fflush(NULL);
+ sleepcount--;
+ sleep(1);
+ }
+
+ printf("\nRotated.\n");
+
+ if (dvbfe_set_voltage(fe, DVBFE_SEC_VOLTAGE_OFF) != 0) {
+ fprintf(stderr, "Could not turn off power.\n");
+ dvbfe_close(fe);
+ return 1;
+ }
+ else
+ printf("Power OFF.\n");
+
+ sleep(1);
+
+ dvbfe_close(fe);
+
+ return EXIT_SUCCESS;
+}
diff --git a/util/scan/dvb-c/at-Kabel-Braunau b/util/scan/dvb-c/at-Kabel-Braunau
new file mode 100644
index 0000000..1d93567
--- /dev/null
+++ b/util/scan/dvb-c/at-Kabel-Braunau
@@ -0,0 +1,26 @@
+# Kabel Braunau
+# freq sr fec mod
+C 386000000 6900000 NONE QAM64
+C 394000000 6875000 NONE QAM64
+C 402000000 6875000 NONE QAM64
+C 410000000 6875000 NONE QAM64
+C 418000000 6875000 NONE QAM64
+C 426000000 6875000 NONE QAM64
+C 434000000 6875000 NONE QAM64
+C 458000000 6875000 NONE QAM64
+C 466000000 6900000 NONE QAM64
+C 474000000 6900000 NONE QAM64
+C 482000000 6111000 NONE QAM64
+C 490000000 6111000 NONE QAM64
+C 498000000 6875000 NONE QAM64
+C 506000000 6111000 NONE QAM64
+C 514000000 6111000 NONE QAM64
+C 522000000 6428000 NONE QAM128
+C 530000000 6428000 NONE QAM128
+C 546000000 6875000 NONE QAM64
+C 554000000 6875000 NONE QAM64
+C 562000000 6875000 NONE QAM64
+C 570000000 6111000 NONE QAM64
+C 578000000 6900000 NONE QAM256
+C 586000000 6900000 NONE QAM256
+C 594000000 6875000 NONE QAM64
diff --git a/util/scan/dvb-c/at-Kabelsignal b/util/scan/dvb-c/at-Kabelsignal
new file mode 100644
index 0000000..4f7ec11
--- /dev/null
+++ b/util/scan/dvb-c/at-Kabelsignal
@@ -0,0 +1,38 @@
+# kabelsignal
+# freq sr fec mod
+C 314000000 6900000 NONE QAM256
+C 322000000 6900000 NONE QAM256
+C 330000000 6900000 NONE QAM256
+C 338000000 6900000 NONE QAM256
+C 346000000 6900000 NONE QAM256
+C 354000000 6900000 NONE QAM256
+C 362000000 6900000 NONE QAM256
+C 370000000 6900000 NONE QAM256
+C 378000000 6900000 NONE QAM256
+C 386000000 6900000 NONE QAM256
+C 394000000 6900000 NONE QAM256
+C 402000000 6900000 NONE QAM256
+C 410000000 6900000 NONE QAM256
+C 418000000 6900000 NONE QAM256
+C 426000000 6900000 NONE QAM256
+C 434000000 6900000 NONE QAM256
+C 442000000 6900000 NONE QAM256
+C 450000000 6900000 NONE QAM256
+C 666000000 6900000 NONE QAM256
+C 674000000 6900000 NONE QAM256
+C 682000000 6900000 NONE QAM256
+C 690000000 6900000 NONE QAM256
+C 698000000 6900000 NONE QAM256
+C 706000000 6900000 NONE QAM256
+C 714000000 6900000 NONE QAM256
+C 722000000 6900000 NONE QAM256
+C 730000000 6900000 NONE QAM256
+C 738000000 6900000 NONE QAM256
+C 746000000 6900000 NONE QAM256
+C 762000000 6900000 NONE QAM256
+C 770000000 6900000 NONE QAM256
+C 778000000 6900000 NONE QAM256
+C 786000000 6900000 NONE QAM256
+C 794000000 6900000 NONE QAM256
+C 802000000 6900000 NONE QAM256
+C 810000000 6900000 NONE QAM256
diff --git a/util/scan/dvb-c/at-KarrerNet b/util/scan/dvb-c/at-KarrerNet
index 27e143a..a00c6a2 100644
--- a/util/scan/dvb-c/at-KarrerNet
+++ b/util/scan/dvb-c/at-KarrerNet
@@ -1,18 +1,26 @@
# Kabel St. Florian bei Linz/AT KarrerNet
# 2009-01-10
# freq sr fec mod
-C 418000000 6900000 NONE QAM64
-C 426000000 6900000 NONE QAM64
-C 434000000 6900000 NONE QAM64
C 442000000 6900000 NONE QAM64
-C 450000000 6900000 NONE QAM64
C 458000000 6900000 NONE QAM64
C 466000000 6900000 NONE QAM64
C 474000000 6900000 NONE QAM64
C 482000000 6900000 NONE QAM64
+C 490000000 6900000 NONE QAM64
+C 498000000 6900000 NONE QAM64
+C 506000000 6900000 NONE QAM64
+C 514000000 6900000 NONE QAM64
C 522000000 6900000 NONE QAM64
C 530000000 6900000 NONE QAM64
C 538000000 6900000 NONE QAM64
+C 546000000 6900000 NONE QAM64
+C 554000000 6900000 NONE QAM64
+C 562000000 6900000 NONE QAM64
+C 570000000 6900000 NONE QAM64
C 578000000 6900000 NONE QAM64
-C 402000000 6900000 NONE QAM256
+C 586000000 6900000 NONE QAM64
+C 610000000 6900000 NONE QAM64
+C 386000000 6900000 NONE QAM256
+C 394000000 6900000 NONE QAM256
C 410000000 6900000 NONE QAM256
+C 434000000 6900000 NONE QAM256
diff --git a/util/scan/dvb-c/hu-Digikabel b/util/scan/dvb-c/hu-Digikabel
new file mode 100644
index 0000000..c885bff
--- /dev/null
+++ b/util/scan/dvb-c/hu-Digikabel
@@ -0,0 +1,24 @@
+# Digikabel, Hungary
+# For the following cities:
+# Budapest, Dorog, Hatvan, Kiskunhalas, Debrecen, Szekesfehervar, Pecs,
+# Veszprem, Dunaujvaros, Miskolc, Gyongyos, Tatabanya, Varpalota, Nagykanizsa,
+# Salgotarjan, Batonyterenye, Szolnok, Szentistvan, Nyiregyhaza, Gyor,
+# Szazhalombatta, Bekescsaba, Bekes, Eger, Komlo, Oroszlany
+# In some of the cities not all the frequencies are available.
+# freq sr fec mod
+C 354000000 6900000 NONE QAM256
+C 362000000 6900000 NONE QAM256
+C 370000000 6900000 NONE QAM256
+C 378000000 6900000 NONE QAM256
+C 386000000 6900000 NONE QAM256
+C 394000000 6900000 NONE QAM256
+C 402000000 6900000 NONE QAM256
+C 410000000 6900000 NONE QAM256
+C 770000000 6900000 NONE QAM256
+C 778000000 6900000 NONE QAM256
+C 786000000 6900000 NONE QAM256
+C 794000000 6900000 NONE QAM256
+C 834000000 6900000 NONE QAM256
+C 842000000 6900000 NONE QAM256
+C 850000000 6900000 NONE QAM256
+C 858000000 6900000 NONE QAM256
diff --git a/util/scan/dvb-c/nl-Casema b/util/scan/dvb-c/nl-Casema
deleted file mode 100644
index 5c42d85..0000000
--- a/util/scan/dvb-c/nl-Casema
+++ /dev/null
@@ -1,3 +0,0 @@
-# Casema Netherlands
-# freq sr fec mod
-C 372000000 6875000 NONE QAM64
diff --git a/util/scan/dvb-c/nl-Ziggo b/util/scan/dvb-c/nl-Ziggo
new file mode 100644
index 0000000..037cca1
--- /dev/null
+++ b/util/scan/dvb-c/nl-Ziggo
@@ -0,0 +1,14 @@
+# Initial Tuning file for nl-Ziggo
+# This file only lists the main
+# frequencies. You still need to do
+# a network scan to find other
+# transponders.
+#
+# based on:
+# http://blob.ziggo.nl/dynamic/NL_HOME/PDF-UPLOAD/Gebruikers-Handleiding-DigitaleTV.pdf
+# Chapter 4
+#
+C 372000000 6875000 NONE QAM64 # Main Frequency Ziggo/Casema
+C 514000000 6875000 NONE QAM64 # Main Frequency Ziggo/Multikabel
+C 356000000 6875000 NONE QAM64 # Main Frequency Ziggo/@Home Zuid
+C 369000000 6875000 NONE QAM64 # Main Frequency Ziggo/@Home Noord
diff --git a/util/scan/dvb-c/nl-Ziggo-Zwolle b/util/scan/dvb-c/nl-Ziggo-Zwolle
new file mode 100644
index 0000000..e47b4ac
--- /dev/null
+++ b/util/scan/dvb-c/nl-Ziggo-Zwolle
@@ -0,0 +1,26 @@
+C 313000000 6875000 NONE QAM64 # TS 1
+C 361000000 6875000 NONE QAM64 # TS 2
+C 353000000 6875000 NONE QAM64 # TS 3
+C 345000000 6875000 NONE QAM64 # TS 4
+C 818000000 6875000 NONE QAM64 # TS 5
+C 329000000 6875000 NONE QAM64 # TS 6
+C 810000000 6875000 NONE QAM64 # TS 7
+C 305000000 6875000 NONE QAM64 # TS 8
+C 762000000 6875000 NONE QAM64 # TS 9
+C 618000000 6875000 NONE QAM64 # TS 10
+C 610000000 6875000 NONE QAM64 # TS 11
+C 337000000 6875000 NONE QAM64 # TS 12
+C 321000000 6875000 NONE QAM64 # TS 13
+C 385000000 6875000 NONE QAM64 # TS 14
+C 393000000 6875000 NONE QAM64 # TS 15
+C 401000000 6875000 NONE QAM64 # TS 16
+C 369000000 6875000 NONE QAM64 # TS 18 (main TS)
+C 297000000 6875000 NONE QAM64 # TS 19
+C 377000000 6875000 NONE QAM64 # TS 22
+C 754000000 6875000 NONE QAM64 # TS 23
+C 642000000 6875000 NONE QAM64 # TS 24
+C 650000000 6875000 NONE QAM64 # TS 25
+C 794000000 6875000 NONE QAM64 # TS 26
+C 409000000 6875000 NONE QAM64 # TS 27
+C 425000000 6875000 NONE QAM64 # TS 206
+C 417000000 6875000 NONE QAM64 # TS 207
diff --git a/util/scan/dvb-c/se-comhem b/util/scan/dvb-c/se-comhem
index 16bd7dd..7452c7f 100644
--- a/util/scan/dvb-c/se-comhem
+++ b/util/scan/dvb-c/se-comhem
@@ -1,3 +1,25 @@
# com hem
# freq sr fec mod
+C 289500000 6875000 NONE QAM64
+C 298000000 6875000 NONE QAM64
+C 306000000 6875000 NONE QAM64
+C 314000000 6875000 NONE QAM64
+C 322000000 6875000 NONE QAM64
+C 338000000 6875000 NONE QAM64
+C 346000000 6875000 NONE QAM64
+C 354000000 6875000 NONE QAM64
C 362000000 6875000 NONE QAM64
+C 370000000 6875000 NONE QAM64
+C 378000000 6875000 NONE QAM64
+C 386000000 6875000 NONE QAM64
+C 394000000 6875000 NONE QAM64
+C 402000000 6875000 NONE QAM64
+C 418000000 6875000 NONE QAM64
+C 434000000 6875000 NONE QAM64
+C 442000000 6875000 NONE QAM64
+C 450000000 6875000 NONE QAM64
+C 458000000 6875000 NONE QAM64
+C 714000000 6875000 NONE QAM64
+C 722000000 6875000 NONE QAM64
+C 738000000 6875000 NONE QAM64
+C 786000000 6875000 NONE QAM64
diff --git a/util/scan/dvb-s/Agila2_C-146.0E b/util/scan/dvb-s/Agila2_C-146.0E
new file mode 100644
index 0000000..ac30747
--- /dev/null
+++ b/util/scan/dvb-s/Agila2_C-146.0E
@@ -0,0 +1,60 @@
+# Agila 2 @ 146.0E C-BAND
+# Generated by Pietro Casoar
+# 1st March 2009
+
+# MPEG-2 & MPEG-4 QPSK (DVBS/S2)
+# freq pol sr fec
+
+# Viva Prime Channel
+S 3725000 H 2345000 3/4
+
+# Zoe Philippines
+S 3774000 V 3300000 3/4
+
+# Da Ai TV indonesia
+S 3791000 H 3100000 3/4
+
+# Trinity Broadcasting Multiplex
+S 3791000 V 10091000 5/6
+
+# Bayon TV
+S 3796000 H 3360000 3/4
+
+# White Springs TV
+S 3846000 H 6110000 3/4
+
+# TCT World
+S 3854000 H 2603000 5/6
+
+# CCTN
+S 3873000 V 2532000 3/4
+
+# NBN Philippines
+S 3875000 H 3000000 3/4
+
+# Al Masriyah
+S 3880000 H 2000000 3/4
+
+# Viva Entertainment Multiplex
+S 3887000 H 6716000 3/4
+
+# IBC13
+S 3896000 H 3000000 3/4
+
+# CTN Cambodia Multiplex
+S 3979000 V 9628000 3/4
+
+# Divya TV
+S 3990000 V 13330000 3/4
+
+# Familyland TV Network
+S 4164000 V 3735000 7/8
+
+# MTV Philippines
+S 4171000 V 3213000 3/4
+
+# The Old Path TV
+S 4183000 V 2170000 3/4
+
+# UNTV
+S 4188000 V 2170000 3/4
diff --git a/util/scan/dvb-s/Amos-4w b/util/scan/dvb-s/Amos-4w
index 3a80591..d10c48a 100644
--- a/util/scan/dvb-s/Amos-4w
+++ b/util/scan/dvb-s/Amos-4w
@@ -1,70 +1,48 @@
# Amos 6 @ 4W
# freq pol sr fec
-
-S 11419000 H 2604000 AUTO
-S 11347000 H 2800000 AUTO
-S 11423000 H 2894000 AUTO
-S 11338000 H 2960000 AUTO
-S 11133000 H 2963000 AUTO
-S 11631000 H 3200000 AUTO
-S 11132000 V 3254000 AUTO
-S 11154000 V 3255000 AUTO
-S 11319000 H 3333000 AUTO
-S 11426000 H 3333000 AUTO
-S 11575000 H 3333000 AUTO
-S 11638000 H 3333000 AUTO
-S 11323000 H 3350000 AUTO
-S 11328000 H 3350000 AUTO
-S 11350000 H 3350000 AUTO
-S 11359000 H 3350000 AUTO
-S 11332000 H 3500000 AUTO
-S 11128000 V 3700000 AUTO
-S 11343000 H 3700000 AUTO
-S 11626000 H 4000000 AUTO
-S 11443000 H 4164000 AUTO
-S 11644000 V 4340000 AUTO
-S 11432000 V 4500000 AUTO
-S 10993000 H 4850000 AUTO
-S 11191000 H 6111000 AUTO
-S 11183000 H 6428000 AUTO
-S 10986000 H 6666000 AUTO
-S 11144000 H 6666000 AUTO
-S 11151000 H 6666000 AUTO
-S 11161000 H 6666000 AUTO
-S 11172000 H 6666000 AUTO
-S 11209000 H 6666000 AUTO
-S 11219000 H 6666000 AUTO
-S 11413000 H 6666000 AUTO
-S 11673000 H 6900000 AUTO
-S 11435000 H 7480000 AUTO
-S 11546000 H 8050000 AUTO
-S 11177000 V 8520000 AUTO
-S 11585000 H 8888000 AUTO
-S 11235000 H 10000000 AUTO
-S 11144000 V 11110000 AUTO
-S 11652000 V 11111000 AUTO
-S 11560000 H 13400000 AUTO
-S 11690000 H 15000000 AUTO
-S 11652000 H 16100000 AUTO
-S 11303000 H 19540000 AUTO
-S 11390000 H 24000000 AUTO
-S 10762000 H 26000000 AUTO
-S 10720000 V 27500000 AUTO
-S 10723000 H 27500000 AUTO
-S 10758000 V 27500000 AUTO
-S 10803000 V 27500000 AUTO
-S 10805000 H 27500000 AUTO
-S 10841000 V 27500000 AUTO
-S 10842000 H 27500000 AUTO
-S 10889000 H 27500000 AUTO
-S 10889000 V 27500000 AUTO
-S 10924000 H 27500000 AUTO
-S 10924000 V 27500000 AUTO
-S 10972000 V 27500000 AUTO
-S 11008000 V 27500000 AUTO
-S 11260000 H 27500000 AUTO
-S 11474000 V 27500000 AUTO
-S 11510000 V 27500000 AUTO
-S 11558000 V 27500000 AUTO
-S 11592000 V 27500000 AUTO
-S 11677000 V 27500000 AUTO
+S 10722000 H 27500000 3/4
+S 10722000 V 27500000 3/4
+S 10722000 V 30000000 2/3
+S 10758000 V 27500000 3/4
+S 10758000 V 30000000 2/3
+S 10759000 H 30000000 3/4
+S 10806000 H 27500000 5/6
+S 10806000 V 27500000 3/4
+S 10842000 H 27500000 7/8
+S 10842000 V 27500000 3/4
+S 10842000 V 30000000 2/3
+S 10890000 H 27500000 7/8
+S 10890000 V 27500000 3/4
+S 10925000 H 27500000 7/8
+S 10925000 V 27500000 3/4
+S 10972000 V 27500000 3/4
+S 11008000 V 27500000 3/4
+S 11015000 H 2295000 3/4
+S 11123000 H 1850000 7/8
+S 11167000 H 12500000 5/6
+S 11179000 H 6666000 3/4
+S 11260000 H 27500000 3/4
+S 11304000 H 19540000 3/4
+S 11319000 H 2750000 3/4
+S 11329000 H 3333000 3/4
+S 11333000 H 3500000 3/4
+S 11347000 H 3350000 3/4
+S 11384000 H 19000000 5/6
+S 11411000 H 7925000 5/6
+S 11429000 H 5925000 3/4
+S 11435000 H 2089000 3/4
+S 11474000 V 27500000 3/4
+S 11510000 V 30000000 2/3
+S 11558000 V 27500000 3/4
+S 11559000 H 13400000 7/8
+S 11572000 H 8888000 3/4
+S 11592000 H 21350000 3/4
+S 11593000 V 27500000 3/4
+S 11625000 V 3000000 3/4
+S 11630000 H 2963000 3/4
+S 11630000 V 3000000 3/4
+S 11637000 V 1480000 3/4
+S 11647000 H 9167000 3/4
+S 11647000 V 8518000 3/4
+S 11654000 H 2000000 5/6
+S 11658000 V 8520000 5/6
diff --git a/util/scan/dvb-s/Apstar6_C-134.0E b/util/scan/dvb-s/Apstar6_C-134.0E
new file mode 100644
index 0000000..6a8a1f1
--- /dev/null
+++ b/util/scan/dvb-s/Apstar6_C-134.0E
@@ -0,0 +1,15 @@
+# Apstar 6 @ 134.0E C-BAND
+# Generated by Pietro Casoar
+# 1st March 2009
+
+# MPEG-2 & MPEG-4 QPSK (DVBS/S2)
+# freq pol sr fec
+
+# New Entertainment
+S 3766000 H 4285000 3/4
+
+# Test
+S 3840000 H 27500000 3/4
+
+# TV Nusantara
+S 3905000 H 3250000 3/4
diff --git a/util/scan/dvb-s/AsiaSat2_C-100.5E b/util/scan/dvb-s/AsiaSat2_C-100.5E
new file mode 100644
index 0000000..1cc8035
--- /dev/null
+++ b/util/scan/dvb-s/AsiaSat2_C-100.5E
@@ -0,0 +1,51 @@
+# AsiaSat 2 100.5E C-BAND
+# Generated by Pietro Casoar
+# 1st March 2009
+
+# MPEG-2 & MPEG-4 QPSK (DVBS/S2)
+# freq pol sr fec
+
+# Iris Sat Multiplex
+S 3660000 V 27500000 3/4
+
+# APTN Direct
+S 3706000 H 4167000 5/6
+
+# APTN Global Video Wire (MPEG-4 S/2)
+S 3732000 H 8889000 2/3
+
+# BYU TV
+S 3767000 V 6527000 1/2
+
+# AJK TV
+S 3778000 V 3333000 3/4
+
+# RTB International Brunei
+S 3786000 H 6000000 7/8
+
+# Shamshad TV
+S 3790000 V 2444000 3/4
+
+# FTV HD (MPEG-4 S/2)
+S 3794000 H 4640000 3/4
+
+# Arabsat ASBU Bouquet Multiplex
+S 3820000 V 27500000 3/4
+
+# Star TV Multiplex (MPEG-4 S/2)
+S 3840000 H 30000000 3/4
+
+# E Network Multiplex
+S 3880000 H 27500000 3/4
+
+# SatLink Multiplex
+S 3960000 H 27500000 3/4
+
+# Star TV Multiplex
+S 3980000 V 28100000 3/4
+
+# SatLink European Bouquet (MPEG-2 & MPEG-4 S2)
+S 4000000 H 28125000 3/4
+
+# Macau Satellite TV Multiplex
+S 4148000 V 11852000 3/4
diff --git a/util/scan/dvb-s/AsiaSat3S_C-105.5E b/util/scan/dvb-s/AsiaSat3S_C-105.5E
index 8e98a5d..4d09ef5 100644
--- a/util/scan/dvb-s/AsiaSat3S_C-105.5E
+++ b/util/scan/dvb-s/AsiaSat3S_C-105.5E
@@ -1,122 +1,102 @@
# AsiaSat 3S 105.5E C-BAND
-# Generated by Xingbo Wang
-# Apr 2, 2005
+# Generated by Pietro Casoar
+# 1st March 2009
-# MPEG-2 QPSK
+# MPEG-2 & MPEG-4 QPSK (DVBS/S2)
# freq pol sr fec
-# [encrypted] ZEE English, ZEE TV International, ZEE Movies, MX, ZEE TV SE Asia, ZEE TV Asia, Trendz
-S 3700000 V 27500000 3/4
+# China Entertainment TV & Maharishi Veda Vision
+S 3680000 H 26670000 3/4
+
+# MediaCorp Channel News Asia
+S 3706000 H 6000000 3/4
# BTV World
S 3725000 V 4450000 3/4
-# SAB TV
-S 3743000 V 3300000 3/4
-
-# AAJ TV
-S 3750000 V 2820000 3/4
-
-# Arirang TV
-S 3755150 V 4417900 7/8
-
-# [encrypted] STAR Plus India, STAR Movies India, STAR News India, National Geographic India, STAR Gold, STAR Movies (Middle East)
-# STAR Utsav
-S 3780000 V 28100000 3/4
+# Galaxy TVB
+S 3729000 H 13650000 3/4
-# Chinese Provincial TV: Guangxi, Shanxi, Anhui, Jiangsu, Heilongjiang
-S 3806000 V 4420000 3/4
-S 3813000 V 4420000 3/4
-S 3820000 V 4420000 3/4
-S 3827000 V 4420000 3/4
-S 3834000 V 4420000 3/4
+# Zee Network
+S 3733000 V 6500000 3/4
-# [encrypted] ESPN Taiwan, STAR Sports Taiwan, ESPN Asia, STAR Sports South East Asia, STAR Sports India, ESPN India, ESPN Philippines
-S 3860000 V 27500000 3/4
+# Madani Channel
+S 3739000 V 2815000 3/4
-# Dragon TV
-S 3886000 V 4800000 3/4
+# Fashion TV
+S 3746000 V 2625000 3/4
-# Shandong TV
-S 3895000 V 6813000 3/4
+# Aaj News
+S 3750000 V 2821000 3/4
-# CCTV-1(comprehensive), China National Radio Channel 1
-S 3904000 V 4420000 7/8
+# Arirang Arab
+S 3755000 V 4418000 7/8
-# Jilin Provincial TV
-S 3914500 V 4420000 3/4
+# Globecast multiplex
+S 3760000 H 26000000 7/8
-# [encrypted] A1, History, STAR Movies SEA/China, STAR World India, STAR Plus Pakistan, Channel[V] India, STAR Chinese Movies, CNBC India, STAR One, STAR Vijay
-S 3980000 V 28100000 3/4
+# Star TV Multiplex
+S 3780000 V 28100000 3/4
-# Sahara One, Sahara Samay National, Sahara Samay Mumbai, Sahara Samay Uttar Pradesh, Sahara Samay Bihar, Sahara Samay Madhya Pradesh
-S 4020000 V 27250000 3/4
+# Airwaves Media Multiplex
+S 3786000 H 5700000 3/4
-# Tianjin TV
-S 4046000 V 5950000 3/4
+# Zee Network Multiplex
+S 3820000 V 27500000 3/4
-# PTV-1, PTV World, PTV Channel 3, AVT Khyber
-S 4091000 V 13333000 3/4
+# Star TV Multiplex
+S 3840000 H 26850000 7/8
-# PTV National
-S 4106000 V 3333300 3/4
+# Star TV Multiplex
+S 3860000 V 27500000 3/4
-# Indus News
-S 4115750 V 3333000 3/4
+# B4U INDIA - MPEG-4 S/2 Multiplex
+S 3880000 H 27500000 3/4
-# [encrypted] ZEE Biz, ZEE News, ZEE Cinema, ZEE Music, Alpha TV Punjabi, Alpha TV Gujarati, Alpha TV Bangla, Alpha TV Marathi, Smile TV
-S 4140000 V 27500000 3/4
+# Star TV Multiplex
+S 3940000 V 28100000 3/4
-# Chinese Provincial TV: Henan, Fujian, Jiangxi, Liaoning
-S 4166000 V 4420000 3/4
-S 4180000 V 4420000 3/4
-S 4187000 V 4420000 3/4
-S 4194000 V 4420000 3/4
+# Tuner International Multiplex
+S 3960000 H 28100000 3/4
-# CETV
-S 3680000 H 26670000 3/4
+# Star TV Multiplex
+S 3980000 V 28100000 3/4
-# Channel NewsAsia
-S 3706000 H 6000000 3/4
+# Star TV Multiplex
+S 4000000 H 26850000 7/8
-# Asia Plus
-S 3715500 H 7000000 3/4
+# Sahara Samay Multiplex
+S 4020000 V 27250000 3/4
-# TVB 8, CETV
-S 3729000 H 13650000 3/4
+# VOA Voice Of America Multiplex
+S 4040000 H 20400000 1/2
-# Network of the World, Bloomberg TV Asia, Indus Vision, Indus Music, Muslim TV Ahmadiyya, Living Asia Channel
-# [encrypted] Filmazia
-S 3760000 H 26000000 7/8
+# Globecast Multiplex
+S 4071000 H 14240000 3/4
-# [encrypted] Fox News, Sky News, STAR Movies Int'l Taiwan, National Geographic Taiwan, STAR Chinese Channel, STAR Movies mandarin, Channel[V] Taiwan
-S 3840000 H 26850000 7/8
+# PTV Multiplex
+S 4091000 V 13333000 3/4
-# STAR Sports Asia
-# [encrypted] ESPN China, STAR Sports Hong Kong, ESPN Hong Kong
-S 3920000 H 26750000 7/8
+# Sun TV
+S 4095000 H 5554000 3/4
-# [encrypted] CNN International Asia, CNN Newsource, Cartoon Network Asia, Cartoon Network Taiwan, Cartoon Network Philippines, Cartoon Network Australia/New Zealand, TCM Australia, Boomerang
-S 3960000 H 27500000 3/4
+# PTV Global USA
+S 4102000 V 2894000 3/4
-# [encrypted] Phoenix Movies, star World Asia, Star Movies Int'l, Channel[V] International, National Geographic Regional
-# Phoenix Chinese Channel, Phoenix Info News Channel, Xiong Kong Int'l, Xing Kong Regional, Channel[V](Greater China)
-S 4000000 H 26850000 7/8
+# PTV Global UK & Europe
+S 4106000 V 2894000 3/4
-# Chinese Provincial TV: Hubei, Sichuan
-S 4034600 H 4420000 3/4
-S 4051000 H 4420000 3/4
+# Galaxy TVB Multiplex
+S 4111000 H 13650000 3/4
-# Chinese Provincial TV: Qinghai, Hunan
-S 4067000 H 4420000 3/4
-S 4082000 H 4420000 3/4
+# PTV Multiplex
+S 4114000 V 7000000 3/4
-# Sun TV
-S 4094000 H 5555000 3/4
+# Eye TV Multiplex
+S 4129000 H 13600000 3/4
-# MATV, Horizon Channel
-# [encrypted] Tian Ying Movies Channel, TVB Xing He Channel
-S 4111000 H 13650000 3/4
+# Zee Network Multiplex
+S 4140000 V 27500000 3/4
-# CCTV Channel 4 (International), Channel 9 (English language), CCTV E&F
-S 4129000 H 13240000 3/4
+# Geo TV Network Multiplex
+S 4180000 V 26666000 3/4
diff --git a/util/scan/dvb-s/Asiasat4_C-122.2E b/util/scan/dvb-s/Asiasat4_C-122.2E
new file mode 100644
index 0000000..60a9730
--- /dev/null
+++ b/util/scan/dvb-s/Asiasat4_C-122.2E
@@ -0,0 +1,27 @@
+# Asiasat 4 @ 122.2E C-BAND
+# Generated by Pietro Casoar
+# 1st March 2009
+
+# MPEG-2 & MPEG-4 QPSK (DVBS/S2)
+# freq pol sr fec
+
+# SITI Digital Network Multiplex
+S 3760000 H 27500000 3/4
+
+# SITI Digital Network Multiplex
+S 3820000 V 27500000 3/4
+
+# Henan Radio Multiplex
+S 3856000 H 2170000 3/4
+
+# SITI Digital Network Multiplex
+S 3880000 H 27500000 3/4
+
+# SITI Digital network Multiplex
+S 3920000 H 27500000 3/4
+
+# SITI Digital network Multiplex
+S 3960000 H 27500000 3/4
+
+# SITI Digital network Multiplex
+S 4180000 V 27500000 3/4
diff --git a/util/scan/dvb-s/Astra-23.5E b/util/scan/dvb-s/Astra-23.5E
new file mode 100644
index 0000000..6e45dbf
--- /dev/null
+++ b/util/scan/dvb-s/Astra-23.5E
@@ -0,0 +1,66 @@
+# Astra 23.5E
+# freq pol sr fec
+S 10758000 V 22000000 7/8
+S 10788000 V 22000000 5/6
+S 10802000 H 22000000 5/6
+S 10842000 V 13333000 5/6
+S 10862000 H 22000000 5/6
+# Astra2Connect
+# S2 10891250 H 22000000 3/4 AUTO 8PSK
+S 11475000 V 27500000 3/4
+S 11515000 H 27500000 3/4
+S2 11515000 V 28500000 9/10 AUTO QPSK
+S2 11555000 H 28500000 9/10 AUTO QPSK
+S2 11555000 V 28500000 9/10 AUTO QPSK
+S2 11592000 V 28500000 9/10 AUTO QPSK
+S2 11595000 H 28500000 9/10 AUTO QPSK
+S2 11635000 H 28500000 9/10 AUTO QPSK
+S2 11635000 V 28500000 9/10 AUTO QPSK
+S 11675000 H 27500000 3/4
+S2 11675000 V 28500000 9/10 AUTO QPSK
+S2 11719000 H 27500000 9/10 AUTO QPSK
+S 11739000 V 27500000 3/4
+# Astra2Connect
+# S2 11758000 H 27500000 5/6 AUTO 8PSK
+S2 11778000 V 27500000 9/10 AUTO QPSK
+S 11798000 H 27500000 3/4
+S2 11817000 V 27500000 9/10 AUTO QPSK
+S 11836000 H 29900000 3/4
+S2 11856000 V 27500000 5/6 AUTO QPSK
+S 11875000 H 27500000 3/4
+S 11914000 H 27500000 3/4
+# Astra2Connect
+# S2 11954000 H 27500000 3/4 AUTO 8PSK
+S 11992000 H 27500000 3/4
+S 12012000 V 27500000 3/4
+S2 12032000 H 27500000 9/10 AUTO QPSK
+S 12070000 H 27500000 3/4
+S2 12109000 H 27500000 9/10 AUTO QPSK
+# Astra2Connect
+# S2 12148000 H 27500000 3/4 AUTO 8PSK
+S 12168000 V 27500000 3/4
+# Astra2Connect
+# S2 12226000 H 27500000 3/5 AUTO 8PSK
+# Astra2Connect
+# S2 12304000 H 27500000 5/6 AUTO 8PSK
+# Astra2Connect
+# S2 12344000 H 28200000 5/6 AUTO 8PSK
+# Astra2Connect
+# S2 12382000 H 27500000 3/4 AUTO 8PSK
+S 12525000 H 27500000 3/4
+S 12525000 V 27500000 3/4
+S 12565000 H 27500000 2/3
+S 12565000 V 27500000 3/4
+S2 12605000 H 28500000 9/10 AUTO QPSK
+S2 12605000 V 28500000 9/10 AUTO QPSK
+S 12630000 V 6000000 3/4
+S 12631000 H 6666000 7/8
+S 12636000 V 2277000 5/6
+S 12641000 H 2220000 7/8
+S 12644000 H 2170000 3/4
+S 12649000 H 5600000 5/6
+S 12661000 H 2170000 5/6
+S 12685000 V 27500000 3/4
+S 12696000 H 3255000 1/2
+S 12711000 H 6111000 AUTO
+S 12725000 V 27500000 3/4
diff --git a/util/scan/dvb-s/Atlantic-Bird-1-12.5W b/util/scan/dvb-s/Atlantic-Bird-1-12.5W
index 5c38433..6735d70 100644
--- a/util/scan/dvb-s/Atlantic-Bird-1-12.5W
+++ b/util/scan/dvb-s/Atlantic-Bird-1-12.5W
@@ -1,20 +1,30 @@
# Atlantic Bird 1 @ 12.5W
# freq pol sr fec
-
-S 11682000 H 05632000 AUTO
-S 11673000 H 06111000 AUTO
-S 11664000 H 06111000 AUTO
-S 11655000 H 06666000 AUTO
-S 11690000 H 05700000 AUTO
-S 11596000 V 27500000 AUTO
-S 11618000 H 02324000 AUTO
-S 11590000 H 06111000 AUTO
-S 11597000 H 03184000 AUTO
-S 11629000 H 06507000 AUTO
-S 11622000 H 03255000 AUTO
-S 11585000 H 05632000 AUTO
-S 11643000 H 02398000 AUTO
-S 11647000 H 03990000 AUTO
-S 11647000 V 03990000 AUTO
-S 11693000 V 04800000 AUTO
-S 11644000 V 04800000 AUTO
+S 11099000 H 2000000 5/6
+S 11132000 H 3255000 3/4
+S 11136000 V 3700000 5/6
+S 11174000 H 15190000 3/4
+S 11179000 V 22400000 2/3
+S 11188000 H 5722000 5/6
+S 11332000 H 6428000 2/3
+S 11337000 H 1923000 7/8
+S 11340000 H 2279000 5/6
+S 11355000 H 11781000 7/8
+S 11408000 V 27500000 3/4
+S 11428000 H 30000000 5/6
+S 11595000 V 27500000 5/6
+S 11622000 H 3255000 AUTO
+S 11643000 H 2398000 AUTO
+S 11645000 V 4790000 AUTO
+S 11651000 V 3688000 AUTO
+S 12515000 H 17455000 3/4
+S 12535000 V 2000000 3/4
+S 12545000 H 17455000 3/4
+S 12594000 H 2170000 3/4
+S 12597000 H 1730000 3/4
+S 12604000 H 1481000 3/4
+S 12655000 H 4285000 3/4
+S 12659000 H 2141000 3/4
+S 12662000 V 3928000 3/4
+S 12720000 V 1808000 3/4
+S 12743000 V 3214000 3/4
diff --git a/util/scan/dvb-s/Atlantic-Bird-3-5.0W b/util/scan/dvb-s/Atlantic-Bird-3-5.0W
new file mode 100644
index 0000000..4e7f007
--- /dev/null
+++ b/util/scan/dvb-s/Atlantic-Bird-3-5.0W
@@ -0,0 +1,4 @@
+# Atlantic Bird 3 @ 5.0W
+# freq pol sr fec
+S 11096000 V 29950000 7/8
+S 11591000 V 20000000 2/3
diff --git a/util/scan/dvb-s/Chinastar1_C-87.5E b/util/scan/dvb-s/Chinastar1_C-87.5E
new file mode 100644
index 0000000..0c03cfc
--- /dev/null
+++ b/util/scan/dvb-s/Chinastar1_C-87.5E
@@ -0,0 +1,15 @@
+# ChinaStar 1 @ 87.5E C-BAND
+# Generated by Pietro Casoar
+# 1st March 2009
+
+# MPEG-2 & MPEG-4 QPSK (DVBS/S2)
+# freq pol sr fec
+
+# Myawady TV
+S 3734000 H 5925000 3/4
+
+# Zam TV Tests
+S 4076000 H 2532000 3/4
+
+# Test Card
+S 4081000 H 4687000 3/4
diff --git a/util/scan/dvb-s/Insat2E_C-83.0E b/util/scan/dvb-s/Insat2E_C-83.0E
new file mode 100644
index 0000000..8e76b8e
--- /dev/null
+++ b/util/scan/dvb-s/Insat2E_C-83.0E
@@ -0,0 +1,93 @@
+# Insat 2E @ 83.0E C-BAND
+# Generated by Pietro Casoar
+# 1st March 2009
+
+# MPEG-2 & MPEG-4 QPSK (DVBS/S2)
+# freq pol sr fec
+
+# NE TV Multiplex
+S 3521000 V 8640000 3/4
+
+# NE TV Multiplex
+S 3537000 V 10800000 3/4
+
+# TV 9 Telugu
+S 3550000 V 3255000 3/4
+
+# S1 Channel
+S 3559000 V 3366000 3/4
+
+# TV 9 Kannada
+S 3581000 V 3255000 3/4
+
+# Jaya TV
+S 3593000 V 8680000 3/4
+
+# Tata Communications Multiplex
+S 3593000 V 9629000 3/4
+
+# Asianet Multiplex
+S 3643000 V 19531000 3/4
+
+# Amrita TV Middle East
+S 3678000 V 5926000 3/4
+
+# Mahaa TV
+S 3689000 V 2893000 3/4
+
+# Tata Communications Multiplex
+S 3696000 V 6111000 3/4
+
+# CNBC India
+S 3760000 V 6500000 3/4
+
+# Raj TV Network Multiplex
+S 3774000 V 13021000 3/4
+
+# UTVi TV
+S 3794000 V 3500000 3/5
+
+# PTC Multiplex (MPEG-4 S/2)
+S 3815000 V 6000000 3/4
+
+# Tata Communications Multiplex
+S 3845000 V 26043000 3/4
+
+# Indiavision
+S 3914000 V 3000000 3/4
+
+# Yes Indiavision
+S 3919000 V 3000000 3/4
+
+# Manorama News International
+S 3923000 V 3000000 3/4
+
+# Tata Communications Multiplex
+S 3934000 V 13021000 3/4
+
+# Raj Musix kanada
+S 3961000 V 6656000 3/4
+
+# TV 9 Multiplex
+S 3974000 V 13333000 3/4
+
+# Asianet Multiplex
+S 4010000 V 19531000 3/4
+
+# Tata Communications Multiplex
+S 4031000 V 7440000 7/8
+
+# RRSat Multiplex
+S 4042000 V 7420000 7/8
+
+# Tata Communications Multiplex
+S 4050000 V 5084000 7/8
+
+# DD national
+S 4070000 V 5000000 3/4
+
+# Indiasign Mulitplex
+S 4091000 V 9230000 7/8
+
+# News Live (MPEG-4 S/2)
+S 4100000 V 4700000 3/4
diff --git a/util/scan/dvb-s/Insat3A_C-93.5E b/util/scan/dvb-s/Insat3A_C-93.5E
new file mode 100644
index 0000000..b4430df
--- /dev/null
+++ b/util/scan/dvb-s/Insat3A_C-93.5E
@@ -0,0 +1,66 @@
+# Insat 3A @ 93.5E C-BAND
+# Generated by Pietro Casoar
+# 1st March 2009
+
+# MPEG-2 & MPEG-4 QPSK (DVBS/S2)
+# freq pol sr fec
+
+# DD Bangla
+S 3732000 V 6250000 3/4
+
+# DD Punjab
+S 3740000 V 6250000 3/4
+
+# DD Gujarati
+S 3750000 V 6250000 3/4
+
+# DD Chandana
+S 3759000 V 6250000 3/4
+
+# DD Oriya
+S 3772000 V 6250000 3/4
+
+# DD kashir
+S 3782000 V 6250000 3/4
+
+# DD Sahyadri
+S 3791000 V 8600000 3/4
+
+# DD Malayalam
+S 3812000 V 6250000 3/4
+
+# DD Saptagiri
+S 3820000 V 6250000 3/4
+
+# DD podhigai
+S 3831000 V 8600000 3/4
+
+# DD Himachal Pradesh
+S 3932000 V 6250000 3/4
+
+# DD Jaipur
+S 3940000 V 6250000 3/4
+
+# Madhya Pradesh
+S 3950000 V 6250000 3/4
+
+# DD Uttar Pradesh
+S 3958000 V 6250000 3/4
+
+# DD North East
+S 4092000 V 6250000 3/4
+
+# DD Mizoram
+S 4101000 V 6250000 3/4
+
+# DD Tripura
+S 4109000 V 4250000 3/4
+
+# RTA Afghanistan
+S 4132000 V 4000000 3/4
+
+# RTA Afghanistan Nangarhar
+S 4136000 V 2000000 3/4
+
+# Ariana TV Network Multiplex
+S 4141000 V 5150000 3/4
diff --git a/util/scan/dvb-s/Insat4A_C-83.0E b/util/scan/dvb-s/Insat4A_C-83.0E
new file mode 100644
index 0000000..fa27210
--- /dev/null
+++ b/util/scan/dvb-s/Insat4A_C-83.0E
@@ -0,0 +1,93 @@
+# Insat 4A @ 83.0E C-BAND
+# Generated by Pietro Casoar
+# 1st March 2009
+
+# MPEG-2 & MPEG-4 QPSK (DVBS/S2)
+# freq pol sr fec
+
+# NSTPL Multiplex
+S 3725000 H 26665000 3/4
+
+# Indiasign multiplex
+S 3756000 H 13333000 3/4
+
+# Star TV Multiplex
+S 3777000 H 10900000 3/4
+
+# Essel Shyam Multiplex
+S 3805000 H 28500000 7/8
+
+# Tarang TV Multiplex (MPEG-4 S/2)
+S 3841000 H 6920000 3/4
+
+# CTVN AKD Plus
+S 3853000 H 3265000 3/4
+
+# Kasthuri TV
+S 3857000 H 3462000 3/4
+
+# Kamyab TV
+S 3874000 H 3403000 3/4
+
+# Vanitha TV
+S 3892000 H 3300000 3/4
+
+# Essel Shayam Multiplex
+S 3898000 H 6800000 3/4
+
+# Channel 10 India
+S 3910000 H 3600000 7/8
+
+# Essel Shyam
+S 3923000 H 13000000 3/4
+
+# DY 365
+S 3949000 H 3225000 3/4
+
+# Multiplex
+S 3958000 H 9500000 7/8
+
+# Zee News Uttar Pradesh
+S 3976000 H 3200000 3/4
+
+# ETV Network Multiplex
+S 4004000 H 22220000 5/6
+
+# Essel Shyam
+S 4040000 H 7500000 7/8
+
+# Lamhas Multiplex
+S 4054000 H 13230000 3/4
+
+# Network 18 Multiplex
+S 4072000 H 6500000 3/4
+
+# IBN Lokmat
+S 4078000 H 3250000 3/4
+
+# Live India
+S 4087000 H 3300000 3/4
+
+# Mi Marathi
+S 4091000 H 3000000 3/4
+
+# BBS TV
+S 4100000 H 4750000 3/4
+
+# Manorama News
+S 4115000 H 5555000 3/4
+
+# BAG Films
+S 4134000 H 10600000 3/4
+
+# Zee Network Multiplex
+S 4151000 H 6500000 3/4
+
+# Zee Network Multiplex
+S 4161000 H 6500000 3/4
+
+# Lok Sabha TV
+S 4170000 H 6500000 3/4
+
+# Kolkata TV
+S 4180000 H 3233000 3/4
diff --git a/util/scan/dvb-s/Insat4B_C-93.5E b/util/scan/dvb-s/Insat4B_C-93.5E
new file mode 100644
index 0000000..5431ae0
--- /dev/null
+++ b/util/scan/dvb-s/Insat4B_C-93.5E
@@ -0,0 +1,51 @@
+# Insat 4B @ 93.5E C-BAND
+# Generated by Pietro Casoar
+# 1st March 2009
+
+# MPEG-2 & MPEG-4 QPSK (DVBS/S2)
+# freq pol sr fec
+
+# Doordarshan Multiplex
+S 3725000 H 27500000 3/4
+
+# DD Dehradun
+S 3750000 H 4250000 3/4
+
+# DD Raipur
+S 3762000 H 4250000 3/4
+
+# DD Ranchi
+S 3768000 H 4250000 3/4
+
+# DD Jammu
+S 3774000 H 4250000 3/4
+
+# DD Hissar
+S 3802000 H 4250000 3/4
+
+# DD Chandigarh
+S 3808000 H 4250000 3/4
+
+# DD Port Blair
+S 3822000 H 4250000 3/4
+
+# DD Bihar
+S 3832000 H 6250000 3/4
+
+# DD North East
+S 3841000 H 6250000 3/4
+
+# Sun network
+S 3885000 H 28000000 3/4
+
+# Doordarshan Multiplex
+S 3925000 H 27500000 3/4
+
+# Sakshi TV
+S 3950000 H 4440000 3/4
+
+# Tata Communications Multiplex
+S 4005000 H 25422000 7/8
+
+# Sun Network
+S 4045000 H 28000000 3/4
diff --git a/util/scan/dvb-s/Intelsat-1002-1.0W b/util/scan/dvb-s/Intelsat-1002-1.0W
index 09d82ca..0142ded 100644
--- a/util/scan/dvb-s/Intelsat-1002-1.0W
+++ b/util/scan/dvb-s/Intelsat-1002-1.0W
@@ -1,5 +1,20 @@
# Intelsat 1002 @ 1.0W
# freq pol sr fec
-
S 4175000 V 28000000 AUTO
S 4180000 H 21050000 AUTO
+S 11093000 H 19191000 7/8
+S 11166000 V 1450000 7/8
+S 11182000 V 3100000 7/8
+S 11606000 H 13356000 7/8
+S 12527000 H 27500000 3/4
+S 12563000 H 27500000 3/4
+S 12563000 V 27500000 3/4
+S 12607000 H 27500000 3/4
+S 12607000 V 27500000 3/4
+S 12643000 H 27500000 3/4
+S 12643000 V 27500000 3/4
+S 12687000 H 27500000 3/4
+S 12687000 V 27500000 3/4
+S 12718000 V 18400000 3/4
+S 12723000 H 27500000 3/4
+S 12735000 V 8800000 5/6
diff --git a/util/scan/dvb-s/Intelsat8_C-166.0E b/util/scan/dvb-s/Intelsat8_C-166.0E
new file mode 100644
index 0000000..6c671cc
--- /dev/null
+++ b/util/scan/dvb-s/Intelsat8_C-166.0E
@@ -0,0 +1,39 @@
+# Intelsat 8 @ 166.0E C-BAND
+# Generated by Pietro Casoar
+# 1st March 2009
+
+# MPEG-2 & MPEG-4 QPSK (DVBS/S2)
+# freq pol sr fec
+
+# Viacom Multiplex
+S 3740000 H 27500000 2/3
+
+# South Korean Multiplex
+S 3790000 V 6510000 3/4
+
+# Arirang World
+S 3815000 V 4400000 3/4
+
+# Australian network Multiplex
+S 3829000 H 13238000 3/4
+
+# TVBS multiplex
+S 3833000 V 17500000 3/4
+
+# NBC Universal
+S 3900000 H 27500000 3/4
+
+# Intelsat multiplex
+S 3940000 H 27690000 7/8
+
+# China Radio multiplex
+S 3959000 V 3428000 3/4
+
+# NHK World network Multiplex
+S 4060000 H 16180000 1/2
+
+# Philippines Network TV Multiplex
+S 4122000 V 5554000 3/4
+
+# TAS Multiplex
+S 4130000 V 5800000 3/4
diff --git a/util/scan/dvb-s/JCSat3A_C-128.0E b/util/scan/dvb-s/JCSat3A_C-128.0E
new file mode 100644
index 0000000..71f68d1
--- /dev/null
+++ b/util/scan/dvb-s/JCSat3A_C-128.0E
@@ -0,0 +1,18 @@
+# JCSAT 3A @ 128.0E C-BAND
+# Generated by Pietro Casoar
+# 1st March 2009
+
+# MPEG-2 & MPEG-4 QPSK (DVBS/S2)
+# freq pol sr fec
+
+# TAS Multiplex
+S 3960000 V 30000000 5/6
+
+# TAS Multiplex
+S 4000000 V 30000000 5/6
+
+# Miraclenet
+S 4055000 V 3332000 3/4
+
+# TAS Multiplex
+S 4120000 V 30000000 5/6
diff --git a/util/scan/dvb-s/Measat3_C-91.5E b/util/scan/dvb-s/Measat3_C-91.5E
new file mode 100644
index 0000000..2753ac0
--- /dev/null
+++ b/util/scan/dvb-s/Measat3_C-91.5E
@@ -0,0 +1,54 @@
+# Measat 3 @ 91.5E C-BAND
+# Generated by Pietro Casoar
+# 1st March 2009
+
+# MPEG-2 & MPEG-4 QPSK (DVBS/S2)
+# freq pol sr fec
+
+# Shop TV
+S 3629000 V 2200000 3/4
+
+# Aora TV Mulitplex
+S 3644000 H 22320000 3/4
+
+# Solar Entertainment
+S 3645000 V 19510000 3/4
+
+# National Geographic music
+S 3718000 V 1700000 7/8
+
+# DZRH TV Multiplex
+S 3721000 V 2170000 3/4
+
+# Ascent Media (MPEG-4 S/2)
+S 3751000 V 13330000 2/3
+
+# Globecast Multiplex (MPEG-4 S/2)
+S 3769000 V 14000000 3/4
+
+# HTV Multiplex
+S 3796000 V 7030000 3/4
+
+# Sky International
+S 3814000 V 6666000 3/4
+
+# Un-named Mulitplex
+S 3865000 V 3835000 3/4
+
+# RTM Multiplex
+S 3877000 V 12525000 7/8
+
+# RTM Sarawak Feeds
+S 3887000 V 3984000 3/4
+
+# Globecast Multiplex
+S 3920000 V 28000000 7/8
+
+# Ginx TV
+S 4113000 V 2960000 3/4
+
+# YR Asia TV
+S 4117000 V 2963000 3/4
+
+# All Sports Network (MPEG-4 S/2)
+S 4134000 V 7200000 3/4
diff --git a/util/scan/dvb-s/Nilesat101+102-7.0W b/util/scan/dvb-s/Nilesat101+102-7.0W
index 64c1921..8ef176f 100644
--- a/util/scan/dvb-s/Nilesat101+102-7.0W
+++ b/util/scan/dvb-s/Nilesat101+102-7.0W
@@ -1,36 +1,41 @@
# Nilesat 101/102 & Atlantic Bird @ 7W
# freq pol sr fec
-S 10758000 V 27500000 AUTO
-S 10796000 V 27500000 AUTO
-S 10853000 H 27500000 AUTO
-S 10873000 V 27500000 AUTO
-S 10892000 H 27500000 AUTO
-S 10911000 V 27500000 AUTO
-S 10930000 H 27500000 AUTO
-S 11747000 V 27500000 AUTO
-S 11766000 H 27500000 AUTO
-S 11785000 V 27500000 AUTO
-S 11804000 H 27500000 AUTO
-S 11823000 V 27500000 AUTO
-S 11843000 H 27500000 AUTO
-S 11862000 V 27500000 AUTO
-S 11881000 H 27500000 AUTO
-S 11900000 V 27500000 AUTO
-S 11919000 H 27500000 AUTO
-S 11938000 V 27500000 AUTO
-S 11958000 H 27500000 AUTO
-S 11977000 V 27500000 AUTO
-S 11996000 H 27500000 AUTO
-S 12015000 V 27500000 AUTO
-S 12034000 H 27500000 AUTO
-S 12054000 V 27500000 AUTO
-S 12073000 H 27500000 AUTO
-S 12130000 V 27500000 AUTO
-S 12149000 H 27500000 AUTO
-S 12207000 V 27500000 AUTO
-S 12226000 H 27500000 AUTO
-S 12284000 V 27500000 AUTO
-S 12303000 H 27500000 AUTO
-S 12341000 V 27500000 AUTO
-S 12360000 H 27500000 AUTO
-S 12399000 H 27500000 AUTO
+S 10719000 V 27500000 3/4
+S 10723000 H 27500000 3/4
+S 10758000 V 27500000 3/4
+S 10775000 H 27500000 3/4
+S 10796000 V 27500000 3/4
+S 10892000 H 27500000 3/4
+S 10911000 V 27500000 3/4
+S 10930000 H 27500000 3/4
+S 11317000 V 27500000 3/4
+S 11747000 V 27500000 3/4
+S 11766000 H 27500000 3/4
+S 11785000 V 27500000 3/4
+S 11804000 H 27500000 3/4
+S 11823000 V 27500000 3/4
+S 11843000 H 27500000 3/4
+S 11862000 V 27500000 3/4
+S 11881000 H 27500000 3/4
+S 11900000 V 27500000 3/4
+S 11919000 H 27500000 3/4
+S 11938000 V 27500000 3/4
+S 11958000 H 27500000 3/4
+S 11977000 V 27600000 5/6
+S 11996000 H 27500000 3/4
+S 12015000 V 27500000 3/4
+S 12034000 H 27500000 3/4
+S 12054000 V 27500000 3/4
+S 12073000 H 27500000 3/4
+S 12130000 V 27500000 3/4
+S 12149000 H 27500000 3/4
+S 12207000 V 27500000 3/4
+S 12226000 H 27500000 3/4
+S 12284000 V 27500000 3/4
+S 12303000 H 27500000 3/4
+S 12341000 V 27500000 3/4
+S 12360000 H 27500000 3/4
+S 12380000 V 27500000 3/4
+S 12399000 H 27500000 3/4
+S 12418000 V 27500000 3/4
+S 12476000 H 27500000 3/4
diff --git a/util/scan/dvb-s/PalapaC2_C-113.0E b/util/scan/dvb-s/PalapaC2_C-113.0E
new file mode 100644
index 0000000..d9b0fc8
--- /dev/null
+++ b/util/scan/dvb-s/PalapaC2_C-113.0E
@@ -0,0 +1,39 @@
+# Palapa C2 @ 113.0E C-BAND
+# Generated by Pietro Casoar
+# 1st March 2009
+
+# MPEG-2 & MPEG-4 QPSK (DVBS/S2)
+# freq pol sr fec
+
+# SCTV Jawa Timur
+S 3745000 H 3125000 3/4
+
+# SCTV
+S 3758000 H 4470000 3/4
+
+# TVRI Nasional
+S 3765000 H 5555000 3/4
+
+# RCTI
+S 3774000 H 6520000 3/4
+
+# KBS World Indonesia
+S 3836000 V 2097000 3/4
+
+# Bali TV
+S 3926000 H 4208000 3/4
+
+# TV One Indonesia
+S 4054000 H 5632000 3/4
+
+# ANTV Indonesia
+S 4055000 V 6510000 3/4
+
+# Indosiar
+S 4074000 V 6500000 3/4
+
+# Satelindo Multiplex
+S 4080000 H 28125000 3/4
+
+# TPI Indonesia
+S 4184000 V 6700000 3/4
diff --git a/util/scan/dvb-s/ST1_C-80.0E b/util/scan/dvb-s/ST1_C-80.0E
new file mode 100644
index 0000000..92d5b80
--- /dev/null
+++ b/util/scan/dvb-s/ST1_C-80.0E
@@ -0,0 +1,27 @@
+# ST1 @ 88.0E C-BAND
+# Generated by Pietro Casoar
+# 1st March 2009
+
+# MPEG-2 & MPEG-4 QPSK (DVBS/S2)
+# freq pol sr fec
+
+# GTV Multiplex
+S 3469000 V 30000000 3/4
+
+# ABTV Multiplex
+S 3521000 H 8332000 5/6
+
+# Videoland Multiplex
+S 3550000 V 30000000 3/4
+
+# GTV Multiplex
+S 3595000 H 30000000 3/4
+
+# Videoland multiplex
+S 3632000 V 30000000 3/4
+
+# Chungwa Telecom
+S 3671000 H 9256000 3/4
+
+# NTD TV Asia-Pacific
+S 3689000 H 3000000 3/4
diff --git a/util/scan/dvb-s/Sirius-5.0E b/util/scan/dvb-s/Sirius-5.0E
index ec4e4ea..949d0e2 100644
--- a/util/scan/dvb-s/Sirius-5.0E
+++ b/util/scan/dvb-s/Sirius-5.0E
@@ -1,5 +1,62 @@
# Sirius 5.0E
# freq pol sr fec
+S 11215000 V 6666000 1/2
+S 11227000 H 23145000 3/4
+S 11247000 V 23145000 3/4
+S 11420000 H 23145000 3/4
+S 11727000 H 27500000 5/6
+S 11747000 V 27500000 3/4
+S 11766000 H 27500000 3/4
+S 11785000 V 27500000 3/4
+S 11804000 H 27500000 3/4
S 11823000 V 27500000 3/4
+S 11843000 H 27500000 3/4
+S 11862000 V 27500000 3/4
+S 11881000 H 27500000 3/4
+S 11900000 V 27500000 3/4
+S 11919000 H 27500000 3/4
+S 11938000 V 27500000 3/4
+S 11958000 H 27500000 3/4
S 11977000 V 27500000 3/4
+S 11996000 H 27500000 3/4
+S 12015000 V 27500000 5/6
+S 12034000 H 27500000 3/4
S 12054000 V 27500000 3/4
+S 12073000 H 27500000 3/4
+S 12092000 V 27500000 3/4
+S 12111000 H 27500000 5/6
+S 12130000 V 27500000 3/4
+S 12149000 H 27500000 3/4
+S 12169000 V 27500000 3/4
+S 12188000 H 27500000 7/8
+S 12207000 V 27500000 3/4
+S 12226000 H 25540000 7/8
+S 12245000 V 27500000 3/4
+S 12265000 H 27500000 3/4
+S 12284000 V 27500000 3/4
+S 12303000 H 25547000 7/8
+S 12322000 V 27500000 3/4
+S 12341000 H 27500000 3/4
+S 12360000 V 27500000 7/8
+S 12379000 H 27500000 3/4
+S 12399000 V 27500000 2/3
+S 12418000 H 27500000 3/4
+S 12437000 V 27500000 2/3
+S 12456000 H 27500000 3/4
+S 12476000 V 27500000 3/4
+S 12608000 H 27500000 3/4
+S 12637000 H 14465000 3/4
+S 12668000 V 6666000 1/2
+S 12672000 H 3300000 3/4
+S 12674000 V 10000000 3/4
+S 12678000 V 13333000 5/6
+S 12680000 H 9404000 3/4
+S 12685000 V 4444000 3/4
+S 12690000 H 3330000 3/4
+S 12693000 V 3333000 5/6
+S 12701000 H 6111000 3/4
+S 12715000 H 3330000 3/4
+S 12718000 V 23500000 3/4
+S 12724000 H 1772000 3/4
+S 12728000 V 19720000 3/4
+S 12737000 V 6150000 3/4
diff --git a/util/scan/dvb-s/Telecom2-8.0W b/util/scan/dvb-s/Telecom2-8.0W
index 91678b4..5f48631 100644
--- a/util/scan/dvb-s/Telecom2-8.0W
+++ b/util/scan/dvb-s/Telecom2-8.0W
@@ -1,4 +1,17 @@
# Telecom2 8.0W
# freq pol sr fec
-S 11635000 H 6800000 5/6
-S 12687000 V 1879000 3/4
+S 10972000 V 27500000 3/4
+S 10974000 H 27500000 3/4
+S 11010000 H 27500000 3/4
+S 11011000 V 27500000 3/4
+S 11042000 H 7860000 3/4
+S 11053000 H 2850000 3/4
+S 11064000 H 12667000 3/4
+S 11387000 H 24740000 5/6
+S 11428000 H 27500000 3/4
+S 11500000 H 3460000 AUTO
+S 11554000 V 27500000 3/4
+S 11595000 V 27500000 3/4
+S 12545000 H 3038000 3/4
+S 12566000 V 27500000 3/4
+S 12649000 V 27500000 3/4
diff --git a/util/scan/dvb-s/Telkom1_C-108.0E b/util/scan/dvb-s/Telkom1_C-108.0E
new file mode 100644
index 0000000..f60c246
--- /dev/null
+++ b/util/scan/dvb-s/Telkom1_C-108.0E
@@ -0,0 +1,48 @@
+# Telkom 1 @ 108.0E C-BAND
+# Generated by Pietro Casoar
+# 1st March 2009
+
+# MPEG-2 & MPEG-4 QPSK (DVBS/S2)
+# freq pol sr fec
+
+# Telkom Vision Multiplex
+S 3580000 H 28000000 3/4
+
+# Telkom Vision Multiplex
+S 3620000 H 28000000 3/4
+
+# Telkom Vision Multiplex
+S 3640000 V 28000000 3/4
+
+# TV Timor Leste
+S 3776000 H 4285000 3/4
+
+# TV Edukasi 1
+S 3785000 H 4000000 3/4
+
+# TVRI Kalbar
+S 3793000 H 3000000 3/4
+
+# TVRI Papua
+S 3797000 H 3900000 3/4
+
+# TV Edukasi 2
+S 3807000 H 4000000 3/4
+
+# Trans 7
+S 3990000 H 6000000 3/4
+
+# TVRI Aceh
+S 4015000 H 6000000 3/4
+
+# RCTI Jawa Timur
+S 4025000 H 3000000 3/4
+
+# Trans TV
+S 4084000 H 6000000 3/4
+
+# Papua TV
+S 4092000 H 3570000 3/4
+
+# JTV
+S 4097000 H 3125000 3/4
diff --git a/util/scan/dvb-s/Telstar-12-15.0W b/util/scan/dvb-s/Telstar-12-15.0W
deleted file mode 100644
index fb902ab..0000000
--- a/util/scan/dvb-s/Telstar-12-15.0W
+++ /dev/null
@@ -1,32 +0,0 @@
-# Telstar 12 @ 15.0W
-# freq pol sr fec
-
-S 12180000 H 03255000 AUTO
-S 11895000 V 05000000 AUTO
-S 11974000 V 03400000 AUTO
-S 12185000 H 04214000 AUTO
-S 12081000 H 03935000 AUTO
-S 12050000 V 03198000 AUTO
-S 11756000 H 06666000 AUTO
-S 12093000 V 02000000 AUTO
-S 11916000 H 06111000 AUTO
-S 11707000 H 03198000 AUTO
-S 11718000 V 05632000 AUTO
-S 11740000 V 03255000 AUTO
-S 12000000 H 06666000 AUTO
-S 12116000 H 02062000 AUTO
-S 12111000 H 02062000 AUTO
-S 12175000 H 03504000 AUTO
-S 12167000 H 03502000 AUTO
-S 12129000 V 02000000 AUTO
-S 12110000 V 06620000 AUTO
-S 11724000 H 13225000 AUTO
-S 11984000 H 13570000 AUTO
-S 12125000 H 03800000 AUTO
-S 11713000 V 09626000 AUTO
-S 11804000 V 07595000 AUTO
-S 11965000 H 14714000 AUTO
-S 12039000 V 05632000 AUTO
-S 12082000 V 06396000 AUTO
-S 12087000 V 03198000 AUTO
-S 12097000 V 03198000 AUTO
diff --git a/util/scan/dvb-s/Telstar10_C-76.5E b/util/scan/dvb-s/Telstar10_C-76.5E
new file mode 100644
index 0000000..36b0431
--- /dev/null
+++ b/util/scan/dvb-s/Telstar10_C-76.5E
@@ -0,0 +1,63 @@
+# Telstar 10 @ 76.5E C-BAND
+# Generated by Pietro Casoar
+# 1st March 2009
+
+# MPEG-2 & MPEG-4 QPSK (DVBS/S2)
+# freq pol sr fec
+
+# Racing International
+S 3646000 H 5064000 3/4
+
+# Image Channel
+S 3655000 H 3214000 3/4
+
+# Globe Cast Asia multiplex
+S 3680000 H 27500000 3/4
+
+# UBI World TV Multiplex
+S 3760000 H 28066000 2/3
+
+# UBI World TV Multiplex
+S 3780000 V 28066000 2/3
+
+# Ekushey TV
+S 3787000 H 4600000 2/3
+
+# Diganta TV
+S 3793000 H 4340000 3/4
+
+# RRSat Global Network Multiplex
+S 3840000 H 27500000 3/4
+
+# Channel 1
+S 4003000 H 4080000 3/4
+
+# Boishakhi TV
+S 4009000 H 4300000 3/4
+
+# TV Maldives
+S 4030000 V 6312000 1/2
+
+# Channel I
+S 4034000 H 4300000 3/4
+
+# Bangla Vision
+S 4049000 H 3600000 3/4
+
+# Kantipur TV
+S 4056000 H 3214000 3/4
+
+# BBC World Service Multiplex
+S 4073000 H 13020000 1/2
+
+# MNC Indonesia
+S 4105000 H 3125000 3/4
+
+# NDTV Arabia
+S 4137000 H 2893000 3/4
+
+# Islamic TV
+S 4146000 H 3600000 3/4
+
+# Bangladesh Multiplex
+S 4173000 H 7400000 3/4
diff --git a/util/scan/dvb-s/Telstar12-15.0W b/util/scan/dvb-s/Telstar12-15.0W
index 529b91f..db14a6e 100644
--- a/util/scan/dvb-s/Telstar12-15.0W
+++ b/util/scan/dvb-s/Telstar12-15.0W
@@ -1,4 +1,26 @@
# Telstar 12 15.0W
# freq pol sr fec
-S 12041000 H 3256000 2/3
-S 12520000 V 8700000 1/2
+S 10988000 H 2893000 3/4
+S 10992000 H 2893000 3/4
+S 11060000 H 19279000 3/4
+S 11123000 V 19279000 3/4
+S 11124000 H 18386000 3/4
+S 11150000 H 18386000 3/4
+S 11150000 V 19279000 3/4
+S 11531000 H 3198000 7/8
+S 11566000 H 4284000 3/4
+S 11677000 V 2200000 1/2
+S 11709000 V 3195000 AUTO
+S 11806000 V 7596000 3/4
+S 11963000 H 14714000 3/4
+S 12082000 H 3935000 3/4
+S 12117000 H 4772000 AUTO
+S 12159000 H 7777000 2/3
+S 12166000 H 3503000 3/4
+S 12173000 H 3503000 3/4
+S 12524000 V 26470000 3/4
+S 12547000 H 11900000 2/3
+S 12589000 V 4503000 1/2
+S 12608000 H 19279000 2/3
+S 12615000 V 11939000 2/3
+S 12645000 H 3255000 3/4
diff --git a/util/scan/dvb-s/Telstar18_C-138.0E b/util/scan/dvb-s/Telstar18_C-138.0E
new file mode 100644
index 0000000..6bd70c6
--- /dev/null
+++ b/util/scan/dvb-s/Telstar18_C-138.0E
@@ -0,0 +1,18 @@
+# Telstar 18 @ 138.0E C-BAND
+# Generated by Pietro Casoar
+# 1st March 2009
+
+# MPEG-2 & MPEG-4 QPSK (DVBS/S2)
+# freq pol sr fec
+
+# I-Sky-Net Multiplex
+S 3599000 V 30000000 3/4
+
+# I-Sky-Net Multiplex
+S 3660000 V 30000000 3/4
+
+# LNTV Laos
+S 3704000 V 3034000 3/4
+
+# BBC World Service Multiplex
+S 4124000 V 3255000 1/2
diff --git a/util/scan/dvb-s/Thaicom1A_C-120.0E b/util/scan/dvb-s/Thaicom1A_C-120.0E
new file mode 100644
index 0000000..1a9d11f
--- /dev/null
+++ b/util/scan/dvb-s/Thaicom1A_C-120.0E
@@ -0,0 +1,24 @@
+# Thaicom 1A @ 120.0E C-BAND
+# Generated by Pietro Casoar
+# 1st March 2009
+
+# MPEG-2 & MPEG-4 QPSK (DVBS/S2)
+# freq pol sr fec
+
+# TV3 Cambodia
+S 3725000 V 3255000 3/4
+
+# Panyapiwat
+S 3745000 V 2850000 5/6
+
+# CTN Cambodia Multiplex
+S 3854000 V 9628000 3/4
+
+# Kasikorn TV
+S 3881000 V 2000000 3/4
+
+# Bayon TV
+S 3916000 V 3359000 3/4
+
+# Radio Thailand Multiplex
+S 4135000 V 1808000 3/4
diff --git a/util/scan/dvb-s/Thaicom2_C-78.5E b/util/scan/dvb-s/Thaicom2_C-78.5E
new file mode 100644
index 0000000..4e1fbcd
--- /dev/null
+++ b/util/scan/dvb-s/Thaicom2_C-78.5E
@@ -0,0 +1,33 @@
+# Thaicom 2 @ 78.5E C-BAND
+# Generated by Pietro Casoar
+# 1st March 2009
+
+# MPEG-2 & MPEG-4 QPSK (DVBS/S2)
+# freq pol sr fec
+
+# BBTV Channel 7
+S 3764000 H 5900000 3/4
+
+# SBT TV
+S 3803000 H 1445000 7/8
+
+# MCOT Multiplex
+S 3888000 H 15625000 3/4
+
+# Royal Thai Army TV 5
+S 3905000 H 6250000 3/4
+
+# Thai TV Color Channel 3
+S 3967000 H 4551000 3/4
+
+# RU TV 1
+S 4003000 H 1085000 3/4
+
+# Ten TV & Rich Channel
+S 4016000 H 2305000 7/8
+
+# NBT TV
+S 4106000 H 4688000 3/4
+
+# Thai PBS
+S 4145000 H 4815000 3/4
diff --git a/util/scan/dvb-s/Thaicom5_C-78.5E b/util/scan/dvb-s/Thaicom5_C-78.5E
new file mode 100644
index 0000000..902ddac
--- /dev/null
+++ b/util/scan/dvb-s/Thaicom5_C-78.5E
@@ -0,0 +1,69 @@
+# Thaicom 5 @ 78.5E C-BAND
+# Generated by Pietro Casoar
+# 1st March 2009
+
+# MPEG-2 & MPEG-4 QPSK (DVBS/S2)
+# freq pol sr fec
+
+# ETC India Multiplex
+S 3421000 V 6667000 3/4
+
+# Europe Media Port Multiplex
+S 3431000 H 13333000 3/4
+
+# Nepal TV Multiplex
+S 3432000 V 6667000 3/4
+
+# CTV9
+S 3448000 V 2222000 3/4
+
+# RRSat Global Network (MPEG-4 S/2)
+S 3450000 H 13333000 3/4
+
+# Avenues TV
+S 3454000 V 3333000 3/4
+
+# PSI Channel
+S 3460000 V 1538000 3/4
+
+# Sagarmatha TV
+S 3489000 V 3333000 3/4
+
+# Dhi TV
+S 3502000 V 4444000 2/3
+
+# Korean Central TV
+S 3504000 H 3367000 2/3
+
+# Gang Cartoon Channel
+S 3505000 V 1852000 3/4
+
+# Lao Star Channel
+S 3521000 V 2917000 3/4
+
+# Thaicom Multiplex
+S 3545000 V 30000000 5/6
+
+# RRSat Global Network
+S 3551000 H 13333000 3/4
+
+# VTV Maldives
+S 3562000 H 4444000 1/2
+
+# MRTV Multiplex
+S 3574000 H 7492000 2/3
+
+# Thaicom Multiplex
+S 3585000 V 26667000 3/4
+
+# Thaicom Multiplex
+S 3600000 H 26667000 3/4
+
+# MRTV Multiplex
+S 3617000 V 12500000 3/4
+
+# RRSat Global Network Multiplex
+S 3640000 H 28066000 3/4
+
+# TVK Cambodia
+S 3664000 H 3704000 3/4
diff --git a/util/scan/dvb-s/Thor-1.0W b/util/scan/dvb-s/Thor-1.0W
index 1f8f1d2..99e98d4 100644
--- a/util/scan/dvb-s/Thor-1.0W
+++ b/util/scan/dvb-s/Thor-1.0W
@@ -1,8 +1,36 @@
# Thor 1.0W
# freq pol sr fec
+S 11216000 V 24500000 7/8
+S 11229000 H 24500000 7/8
S 11247000 V 24500000 7/8
+S 11261000 H 24500000 7/8
+S 11278000 V 24500000 7/8
S 11293000 H 24500000 7/8
+S 11309000 V 24500000 7/8
S 11325000 H 24500000 7/8
-S 12054000 H 28000000 7/8
+S 11325000 V 24500000 7/8
+S 11325000 V 24500000 7/8
+S 11341000 V 24500000 7/8
+S 11357000 H 24500000 7/8
+S 11372000 V 24500000 7/8
+S 11389000 H 24500000 7/8
+S 11403000 V 24500000 7/8
+S 11421000 H 24500000 7/8
+S 11434000 V 24500000 7/8
+S 11747000 H 28000000 5/6
+S 11785000 H 28000000 5/6
+S 11823000 H 28000000 7/8
+S 11938000 H 25000000 3/4
+S 12015000 H 30000000 3/4
+S 12130000 H 30000000 3/4
+S 12149000 V 28000000 5/6
S 12169000 H 28000000 7/8
-S 12226000 V 28000000 7/8
+S 12188000 V 25000000 3/4
+S 12226000 V 28000000 3/4
+S 12245000 H 28000000 5/6
+S 12303000 V 28000000 5/6
+S 12322000 H 27800000 3/4
+S 12399000 H 28000000 7/8
+S 12418000 V 28000000 7/8
+S 12456000 V 28000000 3/4
+S 12476000 H 28000000 5/6
diff --git a/util/scan/dvb-s/Vinasat1_C-132.0E b/util/scan/dvb-s/Vinasat1_C-132.0E
new file mode 100644
index 0000000..4d611de
--- /dev/null
+++ b/util/scan/dvb-s/Vinasat1_C-132.0E
@@ -0,0 +1,12 @@
+# VINASAT 1 @ 132.0E C-BAND
+# Generated by Pietro Casoar
+# 1st March 2009
+
+# MPEG-2 & MPEG-4 QPSK (DVBS/S2)
+# freq pol sr fec
+
+# VTV Multiplex (VTV 1, VTV 2, VTV 3, VTV 4, VTV6)
+S 3413000 V 9766000 3/4
+
+# VOV TV (Voice of VietNam)
+S 3529000 V 2500000 2/3
diff --git a/util/scan/dvb-t/au-AdelaideFoothills b/util/scan/dvb-t/au-AdelaideFoothills
new file mode 100644
index 0000000..466a354
--- /dev/null
+++ b/util/scan/dvb-t/au-AdelaideFoothills
@@ -0,0 +1,12 @@
+# Australia / Adelaide / Grenfell Street
+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
+# ABC
+T 781625000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
+# Seven
+T 711500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
+# Nine
+T 795500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
+# Ten
+T 732500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
+# SBS
+T 760500000 7MHz 2/3 NONE QAM64 8k 1/8 NONE
diff --git a/util/scan/dvb-t/au-Bendigo b/util/scan/dvb-t/au-Bendigo
new file mode 100644
index 0000000..a5df229
--- /dev/null
+++ b/util/scan/dvb-t/au-Bendigo
@@ -0,0 +1,41 @@
+# Australia / Bendigo (Mt Alexandria transmitters)
+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
+# ABC
+T 669500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
+T 620500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
+T 572500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
+
+# Seven
+T 690500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
+T 655500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
+T 555250000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
+
+# Nine
+T 576250000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
+T 592500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
+
+# Ten
+T 618250000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
+
+# SBS
+T 529500000 7MHz 2/3 NONE QAM64 8k 1/8 NONE
+T 634500000 7MHz 2/3 NONE QAM64 8k 1/8 NONE
+T 534250000 7MHz 2/3 NONE QAM64 8k 1/8 NONE
+
+# UNK1
+T 676500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
+# UNK2
+T 571500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
+
+T 536625000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
+T 585625000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
+T 564500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
+T 543500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
+T 536500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
+T 529500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
+T 205500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
+T 564500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
+T 536625000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
+T 690500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
+T 711500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
+T 550500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
diff --git a/util/scan/dvb-t/au-Devonport b/util/scan/dvb-t/au-Devonport
new file mode 100644
index 0000000..4985f09
--- /dev/null
+++ b/util/scan/dvb-t/au-Devonport
@@ -0,0 +1,19 @@
+# Australia / Tasmania / Devonport
+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
+#
+# Brett S Hallett October 2009 , may not be complete !!
+#
+# ABC VHF 57
+T 730250000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
+# ABC Digital 45
+T 648500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
+# SBS VHF 54
+T 709250000 7MHz 2/3 NONE QAM64 8k 1/8 NONE
+# SBS Digital 39
+T 606500000 7MHz 2/3 NONE QAM64 8k 1/8 NONE
+# SCTV
+T 613498000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
+# WIN
+T 627498000 7MHz 3/4 NONE QAM64 8k 1/8 NONE
+# TDT
+T 585498000 7MHz 2/3 NONE QAM64 8k 1/8 NONE
diff --git a/util/scan/dvb-t/au-FraserCoast-Bundaberg b/util/scan/dvb-t/au-FraserCoast-Bundaberg
new file mode 100644
index 0000000..562fc34
--- /dev/null
+++ b/util/scan/dvb-t/au-FraserCoast-Bundaberg
@@ -0,0 +1,12 @@
+# Australia / QLD / Fraser Coast - Bundaberg / Mt Goonaneman
+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
+# ABC VHF9A
+T 205625000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
+# SBS UHF28
+T 529500000 7MHz 2/3 NONE QAM64 8k 1/8 NONE
+# Seven VHF7
+T 184625000 7MHz 2/3 NONE QAM64 8k 1/16 NONE
+# WIN Wide Bay VHF10
+T 212500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
+# Southern Cross Ten VHF9
+T 198525000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
diff --git a/util/scan/dvb-t/au-Goulburn-Rocky_Hill b/util/scan/dvb-t/au-Goulburn-Rocky_Hill
new file mode 100644
index 0000000..bff0dbe
--- /dev/null
+++ b/util/scan/dvb-t/au-Goulburn-Rocky_Hill
@@ -0,0 +1,19 @@
+# Australia / Goulburn / Rocky Hill
+#
+# Scanned 17/10/2009 - Alex Ferrara (alex@receptiveit.com.au)
+
+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
+# ABC - netid (4112) tid (547) offset (+125Khz)
+T 725625000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
+
+# SBS - netid (12802) tid (848) offset (+125Khz)
+T 746625000 7MHz 2/3 NONE QAM64 8k 1/8 NONE
+
+# WIN - netid (12915) tid (12922) offset (+125Khz)
+T 767625000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
+
+# Prime - netid (12929) tid (2462) offset (+125Khz)
+T 788625000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
+
+# TEN - netid (12812) tid (2055) offset (0Khz)
+T 809500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
diff --git a/util/scan/dvb-t/au-Hervey_Bay-Ghost_Hill b/util/scan/dvb-t/au-Hervey_Bay-Ghost_Hill
new file mode 100644
index 0000000..04dee51
--- /dev/null
+++ b/util/scan/dvb-t/au-Hervey_Bay-Ghost_Hill
@@ -0,0 +1,16 @@
+# Australia / Hervey Bay / Ghost Hill
+#
+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
+#
+# ABC UHF56
+T 725500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
+# Seven UHF59
+T 746500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
+# Nine UHF62
+T 767625000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
+# Ten UHF68
+T 809500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
+# SBS UHF28
+T 529500000 7MHz 2/3 NONE QAM64 8k 1/8 NONE
+# SBS UHF34
+T 704500000 7MHz 2/3 NONE QAM64 8k 1/8 NONE
diff --git a/util/scan/dvb-t/au-Perth b/util/scan/dvb-t/au-Perth
index 1d6778d..48c046f 100644
--- a/util/scan/dvb-t/au-Perth
+++ b/util/scan/dvb-t/au-Perth
@@ -9,4 +9,4 @@ T 191625000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
# Network TEN
T 219500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
# SBS
-T 536500000 7MHz 2/3 NONE QAM64 8k 1/8 NONE
+T 536625000 7MHz 2/3 NONE QAM64 8k 1/8 NONE
diff --git a/util/scan/dvb-t/au-SunshineCoast b/util/scan/dvb-t/au-SunshineCoast
index 9fb17ef..c376678 100644
--- a/util/scan/dvb-t/au-SunshineCoast
+++ b/util/scan/dvb-t/au-SunshineCoast
@@ -3,7 +3,7 @@
# SBS36 SBS ***
T 585625000 7MHz 2/3 NONE QAM64 8k 1/8 NONE
# TNQ47 10 ***
-T 662625000 7MHz 2/3 NONE QAM64 8k 1/8 NONE
+T 662625000 7MHz 3/4 NONE QAM64 8k 1/8 NONE
# ABQ62 ABC ***
T 767625000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
# STQ65 7 ***
diff --git a/util/scan/dvb-t/au-Sutherland b/util/scan/dvb-t/au-Sutherland
new file mode 100644
index 0000000..6c21a73
--- /dev/null
+++ b/util/scan/dvb-t/au-Sutherland
@@ -0,0 +1,20 @@
+# Australia / Sutherland
+#
+# Australia modulation params:
+# - http://www.dba.org.au/index.asp?sectionID=120
+#
+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
+#
+# North (Broadcast Site Escarpment Road BROKERS NOSE)
+# - http://www.dba.org.au/index.asp?query=true&sectionID=22&recLocation=Wollongong+%2D+North
+#
+#Channel 7 stations
+T 177500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
+#Channel 9 bundle
+# T 191500000 7MHz AUTO AUTO AUTO AUTO AUTO AUTO
+#One and Channel 10
+T 219500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
+#Aunty
+T 226500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
+#SBS
+T 571500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
diff --git a/util/scan/dvb-t/be-Brussels b/util/scan/dvb-t/be-Brussels
index f81b83b..6998b48 100644
--- a/util/scan/dvb-t/be-Brussels
+++ b/util/scan/dvb-t/be-Brussels
@@ -1,5 +1,5 @@
# Brussels - Belgium (Transmitters of the RTBF and the VRT)
# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
-T 754000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE # RTBF
-T 746000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE # BE-TV
-T 482000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE # VRT
+T 754000000 8MHz 1/2 NONE QAM64 8k 1/4 NONE # RTBF
+T 746000000 8MHz 1/2 NONE QAM64 8k 1/4 NONE # BE-TV
+T 482000000 8MHz 1/2 NONE QAM64 8k 1/4 NONE # VRT
diff --git a/util/scan/dvb-t/cz-All b/util/scan/dvb-t/cz-All
new file mode 100644
index 0000000..7c6d601
--- /dev/null
+++ b/util/scan/dvb-t/cz-All
@@ -0,0 +1,41 @@
+# Czech Republic, whole country
+# Created from http://www.digizone.cz/texty/mapy-pokryti-multiplex-1-ceska-televize/
+# and http://www.digizone.cz/texty/mapy-pokryti-multiplex-2-radiokomunikace/
+# and http://www.digizone.cz/texty/mapy-pokryti-multiplex-3-czech-digital-group/
+# and http://www.digizone.cz/texty/mapy-pokryti-multiplex-4-telefonica-o2/
+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
+T 482000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
+T 506000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
+T 538000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
+T 546000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
+T 562000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
+T 570000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
+T 578000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
+T 586000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
+T 594000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
+T 602000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
+T 618000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
+T 626000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
+T 634000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
+T 642000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+T 650000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
+T 658000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+T 666000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+T 674000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+T 690000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
+T 698000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
+T 706000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
+T 714000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
+T 722000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
+T 730000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
+T 738000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
+T 746000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
+T 770000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
+T 778000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
+T 786000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
+T 794000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
+T 802000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+T 810000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+T 818000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+T 826000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+T 834000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
diff --git a/util/scan/dvb-t/cz-Brno b/util/scan/dvb-t/cz-Brno
deleted file mode 100644
index b82e108..0000000
--- a/util/scan/dvb-t/cz-Brno
+++ /dev/null
@@ -1,10 +0,0 @@
-# DVB-T Brno (Brno, Czech Republic)
-# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
-# MUX 1 Ceska televize
-T 506000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
-# MUX 2 Ceske radiokomunikace
-T 626000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
-# MUX 3 Czech Digital Group
-T 778000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
-# MUX 4 Telefonica O2
-T 818000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
diff --git a/util/scan/dvb-t/cz-Domazlice b/util/scan/dvb-t/cz-Domazlice
deleted file mode 100644
index c20f70a..0000000
--- a/util/scan/dvb-t/cz-Domazlice
+++ /dev/null
@@ -1,3 +0,0 @@
-# DVB-T Domažlice (Domažlice, Czech Republic)
-# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
-T 610000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
diff --git a/util/scan/dvb-t/cz-Klet b/util/scan/dvb-t/cz-Klet
deleted file mode 100644
index 880db35..0000000
--- a/util/scan/dvb-t/cz-Klet
+++ /dev/null
@@ -1,4 +0,0 @@
-# DVB-T Ceske Budejovice (Klet, Czech Republic)
-# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
-# CRa - Ceske radiokomunikace, TX Klet
-T 698000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
diff --git a/util/scan/dvb-t/cz-Ostrava b/util/scan/dvb-t/cz-Ostrava
deleted file mode 100644
index d2ea69f..0000000
--- a/util/scan/dvb-t/cz-Ostrava
+++ /dev/null
@@ -1,3 +0,0 @@
-# DVB-T Ostrava (Ostrava, Czech Republic)
-# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
-T 618000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
diff --git a/util/scan/dvb-t/cz-Plzen b/util/scan/dvb-t/cz-Plzen
deleted file mode 100644
index 0b916af..0000000
--- a/util/scan/dvb-t/cz-Plzen
+++ /dev/null
@@ -1,8 +0,0 @@
-# DVB-T Plzen (Pilsen, Czech Republic)
-# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
-# MUX 1 Ceska televize
-T 578000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
-# MUX 2 Ceske Radiokomunikace
-T 690000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
-# MUX 3 Czech Digital Group
-T 722000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
diff --git a/util/scan/dvb-t/cz-Praha b/util/scan/dvb-t/cz-Praha
deleted file mode 100644
index 0d6721f..0000000
--- a/util/scan/dvb-t/cz-Praha
+++ /dev/null
@@ -1,7 +0,0 @@
-# DVB-T Praha (Prague, Czech Republic)
-# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
-T 634000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
-T 674000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
-T 730000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
-T 778000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
-T 818000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
diff --git a/util/scan/dvb-t/de-Baden-Wuerttemberg b/util/scan/dvb-t/de-Baden-Wuerttemberg
index 3e5bec2..4dff1fd 100644
--- a/util/scan/dvb-t/de-Baden-Wuerttemberg
+++ b/util/scan/dvb-t/de-Baden-Wuerttemberg
@@ -1,20 +1,19 @@
# DVB-T Baden-Württemberg
# Created from http://www.ueberallfernsehen.de/data/senderliste.pdf
# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
-T 482000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH22: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
-T 490000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH23: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
+T 474000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH21: ZDF, 3sat, KiKa / ZDFneo, ZDFinfokanal
+T 482000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH22: ZDF, 3sat, KiKa / ZDFneo, ZDFinfokanal
+T 490000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH23: ZDF, 3sat, KiKa / ZDFneo, ZDFinfokanal
T 514000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH26: Das Erste, arte, Phoenix, EinsPlus
-T 522000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH27: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
-T 570000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH33: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
+T 570000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH33: ZDF, 3sat, KiKa / ZDFneo, ZDFinfokanal
T 618000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH39: SWR-BW, BR, hr, WDR
T 626000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH40: SWR-BW, BR, hr, WDR
T 634000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH41: SWR-BW, BR, hr, WDR
T 650000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH43: Das Erste, arte, Phoenix, EinsPlus
+T 666000000 8MHz 3/4 NONE QAM16 8k 1/8 NONE # CH45: RTL, RTL II, Super RTL, VOX, RTL Crime, Passion [Sendenorm: MPEG-4]
T 698000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH49: SWR-BW, BR, hr, WDR
-T 706000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH50: Das Erste, arte, Phoenix, EinsPlus
- # CH50: SWR-BW, BR, hr, WDR
+T 706000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH50: SWR-BW, BR, hr, WDR
T 722000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH52: Das Erste, arte, Phoenix, EinsPlus
-T 730000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH53: Das Erste, arte, Phoenix, EinsPlus
- # CH53: SWR-BW, BR, hr, WDR
T 738000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH54: Das Erste, arte, Phoenix, EinsPlus
+T 778000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH59: Das Erste, arte, Phoenix, EinsPlus
T 786000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH60: Das Erste, arte, Phoenix, EinsPlus
diff --git a/util/scan/dvb-t/de-Bayern b/util/scan/dvb-t/de-Bayern
index 50229fd..07ceeb0 100644
--- a/util/scan/dvb-t/de-Bayern
+++ b/util/scan/dvb-t/de-Bayern
@@ -1,26 +1,26 @@
# DVB-T Bayern
# Created from http://www.ueberallfernsehen.de/data/senderliste.pdf
# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
-T 184500000 7MHz 3/4 NONE QAM16 8k 1/4 NONE # CH06: Das Erste, arte, Phoenix, EinsPlus
T 191500000 7MHz 3/4 NONE QAM16 8k 1/4 NONE # CH07: Das Erste, arte, Phoenix, EinsPlus
T 212500000 7MHz 3/4 NONE QAM16 8k 1/4 NONE # CH10: Das Erste, arte, Phoenix, EinsPlus
-T 490000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH23: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
+T 490000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH23: ZDF, 3sat, KiKa / ZDFneo, ZDFinfokanal
T 506000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH25: BR, BRalpha, SWR, Das Erste
- # CH25: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
+ # CH25: ZDF, 3sat, KiKa / ZDFneo, ZDFinfokanal
T 522000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH27: BR, BRalpha, SWR, Das Erste
T 530000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH28: BR, BRalpha, SWR, Das Erste
- # CH28: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
+ # CH28: ZDF, 3sat, KiKa / ZDFneo, ZDFinfokanal
T 538000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH29: Das Erste, arte, Phoenix, EinsPlus
T 546000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH30: Das Erste, arte, Phoenix, EinsPlus
-T 570000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH33: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
+T 570000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH33: ZDF, 3sat, KiKa / ZDFneo, ZDFinfokanal
T 578000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH34: RTL, RTL II, Super RTL, VOX
- # CH34: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
-T 586000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH35: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
+ # CH34: ZDF, 3sat, KiKa / ZDFneo, ZDFinfokanal
+T 586000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH35: ZDF, 3sat, KiKa / ZDFneo, ZDFinfokanal
T 594000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH36: Das Erste, arte, Phoenix, EinsPlus
+T 618000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH39: BR, BRalpha, SWR, Das Erste
T 626000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH40: BR, BRalpha, hr, mdr
# CH40: Das Erste, arte, Phoenix, EinsPlus
-T 642000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH42: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
-T 658000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH44: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
+T 642000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH42: ZDF, 3sat, KiKa / ZDFneo, ZDFinfokanal
+T 658000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH44: ZDF, 3sat, KiKa / ZDFneo, ZDFinfokanal
T 666000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH45: BR, BRalpha, hr, mdr
# CH45: Das Erste, arte, Phoenix, EinsPlus
T 674000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH46: BR, BRalpha, SWR, Das Erste
@@ -28,13 +28,13 @@ T 674000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH46: BR, BRalpha, SWR, Das Erste
T 682000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH47: BR, BRalpha, hr, mdr
# CH47: Das Erste, arte, Phoenix, EinsPlus
T 690000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH48: Pro7, Sat.1, Kabel1, N24
+T 698000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH49: Das Erste, arte, Phoenix, EinsPlus
T 722000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH52: Pro7, Sat.1, Kabel1, N24
T 730000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH53: BR, BRalpha, SWR, Das Erste
- # CH53: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
-T 738000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH54: http://www.digitalfernsehen.de/news/news_769785.html
+ # CH53: ZDF, 3sat, KiKa / ZDFneo, ZDFinfokanal
+T 738000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH54: Das Erste, arte, Phoenix, EinsPlus
T 746000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH55: Das Erste, arte, Phoenix, EinsPlus
T 754000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH56: BR, BRalpha, SWR, Das Erste
-T 770000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH58: Das Erste, arte, Phoenix, EinsPlus
-T 786000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH60: Tele 5, Eurosport, MonA, Franken Fernsehen
+T 786000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH60: Tele 5, Eurosport, MonaTV, Franken TV
T 834000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH66: RTL, RTL II, Super RTL, VOX
- # CH66: Tele 5, Eurosport, HSE 24, münchen.tv
+ # CH66: Tele 5, Eurosport, HSE 24, München.TV
diff --git a/util/scan/dvb-t/de-Berlin b/util/scan/dvb-t/de-Berlin
index 86f875b..5b040c7 100644
--- a/util/scan/dvb-t/de-Berlin
+++ b/util/scan/dvb-t/de-Berlin
@@ -1,11 +1,12 @@
# DVB-T Berlin
# Created from http://www.ueberallfernsehen.de/data/senderliste.pdf
# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
-T 177500000 7MHz 3/4 NONE QAM16 8k 1/8 NONE # CH05: HSE 24/MONA, FAB, WDR, SWR
+T 177500000 7MHz 3/4 NONE QAM16 8k 1/8 NONE # CH05: Tele 5, HSE 24 / MonaTV(+ DMAX / Bibel.TV), WDR, SWR (BW / RP)
T 191500000 7MHz 2/3 NONE QAM16 8k 1/8 NONE # CH07: MDR, NDR, arte
T 506000000 8MHz 2/3 NONE QAM16 8k 1/8 NONE # CH25: RTL, RTL II, Super RTL, VOX
T 522000000 8MHz 2/3 NONE QAM16 8k 1/8 NONE # CH27: Das Erste, RBB, Phoenix, EinsExtra
-T 570000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH33: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
+T 570000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH33: ZDF, 3sat, KiKa / ZDFneo, ZDFinfokanal
+T 618000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # CH39: Das Vierte, Bibel.TV, QVC, TVP Polonia (ab Januar 2010)
T 658000000 8MHz 2/3 NONE QAM16 8k 1/8 NONE # CH44: Pro7, Sat.1, Kabel1, N24
T 754000000 8MHz 2/3 NONE QAM16 8k 1/8 NONE # CH56: Eurosport, TV.B, DSF, Neun live
-T 778000000 8MHz 2/3 NONE QAM16 8k 1/8 NONE # CH59: n-tv, EuroNews, + 26 Radioprogramme
+T 778000000 8MHz 2/3 NONE QAM16 8k 1/8 NONE # CH59: n-tv, EuroNews / Channel 21 Shop, + 14 Radioprogramme
diff --git a/util/scan/dvb-t/de-Brandenburg b/util/scan/dvb-t/de-Brandenburg
index 3949267..9fc6ebe 100644
--- a/util/scan/dvb-t/de-Brandenburg
+++ b/util/scan/dvb-t/de-Brandenburg
@@ -1,7 +1,7 @@
# DVB-T Brandenburg
# Created from http://www.ueberallfernsehen.de/data/senderliste.pdf
# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
-T 570000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH33: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
-T 594000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH36: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
+T 570000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH33: ZDF, 3sat, KiKa / ZDFneo, ZDFinfokanal
+T 594000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH36: ZDF, 3sat, KiKa / ZDFneo, ZDFinfokanal
T 730000000 8MHz 3/4 NONE QAM16 8k 1/4 NONE # CH53: Das Erste, RBB, Phoenix, EinsExtra
T 762000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH57: MDR, NDR, arte
diff --git a/util/scan/dvb-t/de-Bremen b/util/scan/dvb-t/de-Bremen
index 7540bbf..9a79038 100644
--- a/util/scan/dvb-t/de-Bremen
+++ b/util/scan/dvb-t/de-Bremen
@@ -3,7 +3,7 @@
# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
T 482000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH22: Das Erste (RB), RB TV (NDR NDS), arte, Phoenix
T 538000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH29: NDR NDS, WDR/NDR SH, MDR/NDR MVP, HR/NDR HH
-T 562000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH32: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
+T 562000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH32: ZDF, 3sat, KiKa / ZDFneo, ZDFinfokanal
T 642000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH42: RTL, RTL II, Super RTL, VOX
-T 666000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH45: Tele 5, Neun live, Eurosport, MONA/DMAX
+T 666000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH45: Tele 5, Neun live, Eurosport, MonaTV/ DMAX
T 698000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH49: Pro7, Sat.1, Kabel1, N24
diff --git a/util/scan/dvb-t/de-Hamburg b/util/scan/dvb-t/de-Hamburg
index 4588748..f746043 100644
--- a/util/scan/dvb-t/de-Hamburg
+++ b/util/scan/dvb-t/de-Hamburg
@@ -1,16 +1,10 @@
# DVB-T Hamburg
# Created from http://www.ueberallfernsehen.de/data/senderliste.pdf
# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
-T 490000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH23: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
-T 490000000 8MHz 2/3 NONE QAM16 8k 1/8 NONE # CH23: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
+T 490000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH23: ZDF, 3sat, KiKa / ZDFneo, ZDFinfokanal
T 530000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH28: NDR SH, WDR/NDR NDS, MDR/NDR MVP, BR/NDR HH
T 546000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH30: Pro7, Sat.1, Kabel1, N24
-T 546000000 8MHz 2/3 NONE QAM16 8k 1/8 NONE # CH30: Pro7, Sat.1, Kabel1, N24
T 570000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH33: Das Erste, arte, Phoenix, EinsExtra
-T 570000000 8MHz 2/3 NONE QAM16 8k 1/8 NONE # CH33: Das Erste, arte, Phoenix, EinsExtra
T 626000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH40: RTL, RTL II, Super RTL, VOX
-T 626000000 8MHz 2/3 NONE QAM16 8k 1/8 NONE # CH40: RTL, RTL II, Super RTL, VOX
-T 674000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH46: Neun live, HH1, BibelTV, Eurosport
-T 674000000 8MHz 2/3 NONE QAM16 8k 1/8 NONE # CH46: Neun live, HH1, BibelTV, Eurosport
+T 674000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH46: Neun live, HH1, Bibel.TV, Eurosport
T 738000000 8MHz 1/2 NONE QAM64 8k 1/8 NONE # CH54: NDR HH, WDR/NDR NDS, MDR/NDR MVP, BR/NDR SH
-T 738000000 8MHz 3/4 NONE QAM16 8k 1/8 NONE # CH54: NDR HH, WDR/NDR NDS, MDR/NDR MVP, BR/NDR SH
diff --git a/util/scan/dvb-t/de-Hessen b/util/scan/dvb-t/de-Hessen
index 7aa5d02..e4ad39c 100644
--- a/util/scan/dvb-t/de-Hessen
+++ b/util/scan/dvb-t/de-Hessen
@@ -2,18 +2,18 @@
# Created from http://www.ueberallfernsehen.de/data/senderliste.pdf
# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
T 198500000 7MHz 2/3 NONE QAM16 8k 1/4 NONE # CH08: Phoenix, BR, SWR-RP
-T 474000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH21: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
-T 482000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH22: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
+T 474000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH21: ZDF, 3sat, KiKa / ZDFneo, ZDFinfokanal
+T 482000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH22: ZDF, 3sat, KiKa / ZDFneo, ZDFinfokanal
T 498000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH24: Phoenix, BR, SWR-RP, WDR
-T 506000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH25: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
+T 506000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH25: ZDF, 3sat, KiKa / ZDFneo, ZDFinfokanal
T 562000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH32: Das Erste, hr, EinsExtra/arte
T 578000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH34: RTL, RTL II, Super RTL, VOX
T 602000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH37: Das Erste, hr, EinsExtra/arte
T 618000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH39: Phoenix, BR, SWR-RP, mdr
-T 642000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH42: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
+T 642000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH42: ZDF, 3sat, KiKa / ZDFneo, ZDFinfokanal
T 650000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH43: Das Erste, hr, EinsExtra/arte
-T 722000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH52: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
+T 722000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH52: ZDF, 3sat, KiKa / ZDFneo, ZDFinfokanal
T 730000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH53: BR, hr, SWR-BW, WDR
T 738000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH54: Pro7, Sat.1, Kabel1, N24
T 746000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH55: Phoenix, NDR, mdr, WDR
-T 818000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH64: Tele5, Eurosport, rheinmaintv
+T 818000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH64: Tele5, Eurosport, rheinmaintv, Bibel.TV
diff --git a/util/scan/dvb-t/de-Mecklenburg-Vorpommern b/util/scan/dvb-t/de-Mecklenburg-Vorpommern
index d1b0800..24e90ea 100644
--- a/util/scan/dvb-t/de-Mecklenburg-Vorpommern
+++ b/util/scan/dvb-t/de-Mecklenburg-Vorpommern
@@ -2,11 +2,11 @@
# Created from http://www.ueberallfernsehen.de/data/senderliste.pdf
# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
T 482000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH22: Das Erste, NDR MVP, RBB, MDR/NDR SH
-T 490000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH23: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
+T 490000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH23: ZDF, 3sat, KiKa / ZDFneo, ZDFinfokanal
T 514000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH26: Das Erste, NDR MVP, RBB, MDR/NDR SH
T 538000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH29: Das Erste, NDR MVP, RBB, MDR/NDR SH
T 594000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH36: Das Erste, NDR MVP, RBB, MDR/NDR SH
-T 626000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH40: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
-T 674000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH46: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
-T 714000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH51: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
-T 738000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH54: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
+T 602000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH37: ZDF, 3sat, KiKa / ZDFneo, ZDFinfokanal
+T 626000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH40: ZDF, 3sat, KiKa / ZDFneo, ZDFinfokanal
+T 674000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH46: ZDF, 3sat, KiKa / ZDFneo, ZDFinfokanal
+T 738000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH54: ZDF, 3sat, KiKa / ZDFneo, ZDFinfokanal
diff --git a/util/scan/dvb-t/de-Niedersachsen b/util/scan/dvb-t/de-Niedersachsen
index 7066933..636c1ec 100644
--- a/util/scan/dvb-t/de-Niedersachsen
+++ b/util/scan/dvb-t/de-Niedersachsen
@@ -5,21 +5,22 @@ T 474000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH21: NDR NDS, WDR/NDR SH, MDR/NDR
T 482000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH22: Das Erste (RB), RB TV (NDR NDS), arte, Phoenix
# CH22: Das Erste, arte, Phoenix, EinsExtra
# CH22: NDR NDS, WDR/NDR SH, MDR/NDR MVP, HR/NDR HH
-T 490000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH23: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
+T 490000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH23: ZDF, 3sat, KiKa / ZDFneo, ZDFinfokanal
T 498000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH24: RTL, RTL II, Super RTL, VOX
- # CH24: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
-T 522000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH27: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
-T 530000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH28: Tele 5, NICK/Comedy Central, Eurosport, MONA/DMAX
+T 514000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH26: Das Erste, arte, Phoenix, EinsExtra
+T 522000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH27: ZDF, 3sat, KiKa / ZDFneo, ZDFinfokanal
+T 530000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH28: Tele 5, NICK / Comedy Central, Eurosport, MONA/DMAX
T 538000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH29: NDR NDS, WDR/NDR SH, MDR/NDR MVP, HR/NDR HH
-T 562000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH32: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
+T 554000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH31: ZDF, 3sat, KiKa / ZDFneo, ZDFinfokanal
+T 562000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH32: ZDF, 3sat, KiKa / ZDFneo, ZDFinfokanal
T 570000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH33: Das Erste, arte, Phoenix, EinsExtra
-T 586000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH35: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
+T 586000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH35: ZDF, 3sat, KiKa / ZDFneo, ZDFinfokanal
T 594000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH36: NDR NDS, WDR/NDR SH, MDR/NDR MVP, HR/NDR HH
T 602000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH37: NDR NDS, WDR/NDR SH, MDR/NDR MVP, HR/NDR HH
-T 610000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH38: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
+T 610000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH38: ZDF, 3sat, KiKa / ZDFneo, ZDFinfokanal
T 634000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH41: Das Erste, arte, Phoenix, EinsExtra
T 642000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH42: RTL, RTL II, Super RTL, VOX
- # CH42: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
+ # CH42: ZDF, 3sat, KiKa / ZDFneo, ZDFinfokanal
T 650000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH43: Das Erste, arte, Phoenix, EinsExtra
# CH43: NDR NDS, WDR/NDR SH, MDR/NDR MVP, HR/NDR HH
T 658000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH44: Pro7, Sat.1, Kabel1, N24
@@ -29,12 +30,10 @@ T 682000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH47: Das Erste, arte, Phoenix, Ei
T 690000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH48: Das Erste, arte, Phoenix, EinsExtra
T 698000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH49: Pro7, Sat.1, Kabel1, N24
T 706000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH50: Das Erste, arte, Phoenix, EinsExtra
-T 714000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH51: NDR NDS, WDR/NDR SH, MDR/NDR MVP, HR/NDR HH
T 746000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH55: Das Erste, arte, Phoenix, EinsExtra
T 754000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH56: NDR NDS, WDR/NDR SH, MDR/NDR MVP, HR/NDR HH
T 770000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH58: NDR NDS, WDR/NDR SH, MDR/NDR MVP, HR/NDR HH
T 778000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH59: Das Erste, arte, Phoenix, EinsExtra
- # CH59: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
-T 786000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH60: Tele 5, Comedy Central, Eurosport, MONA/DMAX
- # CH60: Tele 5, NICK/Comedy Central, Eurosport, MONA/DMAX
+ # CH59: ZDF, 3sat, KiKa / ZDFneo, ZDFinfokanal
+T 786000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH60: Tele 5, NICK / Comedy Central, Eurosport, MONA/DMAX
T 826000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH65: Das Erste, arte, Phoenix, EinsExtra
diff --git a/util/scan/dvb-t/de-Nordrhein-Westfalen b/util/scan/dvb-t/de-Nordrhein-Westfalen
index 4541df7..ec768a3 100644
--- a/util/scan/dvb-t/de-Nordrhein-Westfalen
+++ b/util/scan/dvb-t/de-Nordrhein-Westfalen
@@ -5,13 +5,13 @@ T 474000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH21: Das Erste, arte, Phoenix, Ei
T 482000000 8MHz 2/3 NONE QAM16 8k 1/8 NONE # CH22: WDR-Wuppertal, NDR/WDR-Düsseldorf, MDR, SWR
T 506000000 8MHz 2/3 NONE QAM16 8k 1/8 NONE # CH25: WDR-Dortmund, NDR/WDR-Essen, MDR, SWR
T 514000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH26: Das Erste, arte, Phoenix, EinsFestival
- # CH26: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
+ # CH26: ZDF, 3sat, KiKa / ZDFneo, ZDFinfokanal
T 522000000 8MHz 1/2 NONE QAM64 8k 1/4 NONE # CH27: WDR-Siegen, NDR, MDR, SWR
T 538000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH29: RTL, RTL II, Super RTL, VOX
-T 546000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH30: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
+T 546000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH30: ZDF, 3sat, KiKa / ZDFneo, ZDFinfokanal
T 554000000 8MHz 1/2 NONE QAM64 8k 1/4 NONE # CH31: WDR-Bielefeld, NDR/WDR-Siegen, MDR, SWR
-T 570000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH33: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
-T 586000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH35: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
+T 570000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH33: ZDF, 3sat, KiKa / ZDFneo, ZDFinfokanal
+T 586000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH35: ZDF, 3sat, KiKa / ZDFneo, ZDFinfokanal
T 594000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH36: CNN, Eurosport, Tele5, VIVA
T 602000000 8MHz 1/2 NONE QAM64 8k 1/4 NONE # CH37: WDR-Aachen, NDR/WDR-Köln, MDR, SWR
T 666000000 8MHz 1/2 NONE QAM64 8k 1/4 NONE # CH45: WDR-Münster, NDR/WDR-Dortmund, MDR, SWR
@@ -23,5 +23,5 @@ T 722000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH52: CNN, Eurosport, Tele5, VIVA
T 730000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH53: Pro7, Sat.1, Kabel1, N24
T 746000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH55: Pro7, Sat.1, Kabel1, N24
T 762000000 8MHz 2/3 NONE QAM16 8k 1/8 NONE # CH57: WDR-Essen, NDR/WDR-Dortmund, MDR, SWR
-T 778000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH59: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
+T 778000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH59: ZDF, 3sat, KiKa / ZDFneo, ZDFinfokanal
T 786000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH60: Das Erste, arte, Phoenix, EinsFestival
diff --git a/util/scan/dvb-t/de-Rheinland-Pfalz b/util/scan/dvb-t/de-Rheinland-Pfalz
index bf57d4d..a7d1d98 100644
--- a/util/scan/dvb-t/de-Rheinland-Pfalz
+++ b/util/scan/dvb-t/de-Rheinland-Pfalz
@@ -1,8 +1,8 @@
# DVB-T Rheinland-Pfalz
# Created from http://www.ueberallfernsehen.de/data/senderliste.pdf
# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
-T 530000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH28: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
-T 546000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH30: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
+T 530000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH28: ZDF, 3sat, KiKa / ZDFneo, ZDFinfokanal
+T 546000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH30: ZDF, 3sat, KiKa / ZDFneo, ZDFinfokanal
T 570000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH33: SWR-RP, BR, hr, WDR
T 658000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH44: SWR-RP, BR, hr, WDR
T 674000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH46: Das Erste, arte, Phoenix, EinsPlus
diff --git a/util/scan/dvb-t/de-Saarland b/util/scan/dvb-t/de-Saarland
index 330075b..049ae71 100644
--- a/util/scan/dvb-t/de-Saarland
+++ b/util/scan/dvb-t/de-Saarland
@@ -1,7 +1,7 @@
# DVB-T Saarland
# Created from http://www.ueberallfernsehen.de/data/senderliste.pdf
# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
-T 546000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH30: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
+T 546000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH30: ZDF, 3sat, KiKa / ZDFneo, ZDFinfokanal
T 642000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH42: Das Erste, SR Fernsehen, arte, Phoenix
T 658000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH44: SWR-RP, BR, hr, WDR
-T 698000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH49: SaarTV, Tele 5, QVC, BibelTV
+T 698000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH49: Tele 5, QVC, Bibel.TV, freie Kapazität
diff --git a/util/scan/dvb-t/de-Sachsen b/util/scan/dvb-t/de-Sachsen
index 42e01eb..b3fcffd 100644
--- a/util/scan/dvb-t/de-Sachsen
+++ b/util/scan/dvb-t/de-Sachsen
@@ -2,11 +2,12 @@
# Created from http://www.ueberallfernsehen.de/data/senderliste.pdf
# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
T 205500000 7MHz 2/3 NONE QAM64 8k 1/16 NONE # CH09: MDR-SN, rbb, BR, WDR
-T 482000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH22: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
+T 482000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH22: ZDF, 3sat, KiKa / ZDFneo, ZDFinfokanal
T 498000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # CH24: Das Erste, arte, Phoenix, EinsFestival
T 506000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # CH25: Das Erste, arte, Phoenix, EinsFestival
T 522000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # CH27: MDR-SN, rbb, BR, WDR
+T 530000000 8MHz 3/4 NONE QAM16 8k 1/8 NONE # CH28: RTL, RTL II, Super RTL, VOX, RTL Crime, Passion [Sendenorm: MPEG-4]
T 538000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # CH29: MDR-SN, rbb, BR, WDR
T 562000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # CH32: MDR-SN, rbb, BR, WDR
-T 594000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH36: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
+T 594000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH36: ZDF, 3sat, KiKa / ZDFneo, ZDFinfokanal
T 618000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # CH39: Das Erste, arte, Phoenix, EinsFestival
diff --git a/util/scan/dvb-t/de-Sachsen-Anhalt b/util/scan/dvb-t/de-Sachsen-Anhalt
index ee59498..d8582f2 100644
--- a/util/scan/dvb-t/de-Sachsen-Anhalt
+++ b/util/scan/dvb-t/de-Sachsen-Anhalt
@@ -1,11 +1,12 @@
# DVB-T Sachsen-Anhalt
# Created from http://www.ueberallfernsehen.de/data/senderliste.pdf
# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
-T 482000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH22: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
+T 482000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH22: ZDF, 3sat, KiKa / ZDFneo, ZDFinfokanal
T 498000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # CH24: Das Erste, arte, Phoenix, EinsFestival
+T 530000000 8MHz 3/4 NONE QAM16 8k 1/8 NONE # CH28: RTL, RTL II, Super RTL, VOX, RTL Crime, Passion [Sendenorm: MPEG-4]
T 538000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # CH29: Das Erste, arte, Phoenix, EinsFestival
-T 546000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH30: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
-T 554000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH31: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
+T 546000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH30: ZDF, 3sat, KiKa / ZDFneo, ZDFinfokanal
+T 554000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH31: ZDF, 3sat, KiKa / ZDFneo, ZDFinfokanal
T 578000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # CH34: MDR-ST, rbb, NDR, WDR
T 586000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # CH35: MDR-ST, rbb, NDR, WDR
T 610000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # CH38: MDR-ST, rbb, NDR, WDR
diff --git a/util/scan/dvb-t/de-Schleswig-Holstein b/util/scan/dvb-t/de-Schleswig-Holstein
index 7b544d6..18728e1 100644
--- a/util/scan/dvb-t/de-Schleswig-Holstein
+++ b/util/scan/dvb-t/de-Schleswig-Holstein
@@ -1,18 +1,18 @@
# DVB-T Schleswig-Holstein
# Created from http://www.ueberallfernsehen.de/data/senderliste.pdf
# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
-T 474000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH21: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
-T 490000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH23: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
-T 514000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH26: NDR SH, WDR/NDR NDS, MDR/NDR MVP, BR/NDR HH
+T 474000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH21: ZDF, 3sat, KiKa / ZDFneo, ZDFinfokanal
+T 490000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH23: ZDF, 3sat, KiKa / ZDFneo, ZDFinfokanal
+T 498000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH24: NDR SH, WDR/NDR NDS, MDR/NDR MVP, BR/NDR HH
+T 514000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH26: Das Erste, arte, Phoenix, EinsExtra
T 530000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH28: NDR SH, WDR/NDR NDS, MDR/NDR MVP, BR/NDR HH
T 546000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH30: Pro7, Sat.1, Kabel1, N24
-T 554000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH31: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
+T 554000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH31: ZDF, 3sat, KiKa / ZDFneo, ZDFinfokanal
T 570000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH33: Das Erste, arte, Phoenix, EinsExtra
T 586000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH35: Pro7, Sat.1, Kabel1, N24
T 618000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH39: NDR SH, WDR/NDR NDS, MDR/NDR MVP, BR/NDR HH
T 626000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH40: RTL, RTL II, Super RTL, VOX
T 666000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH45: RTL, RTL II, Super RTL, VOX
T 682000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH47: Das Erste, arte, Phoenix, EinsExtra
-T 762000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH57: Neun live, Tele 5, Eurosport, MONA/DMAX
-T 778000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH59: Neun live, Tele 5, Eurosport, MONA/DMAX
-T 786000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH60: Das Erste, arte, Phoenix, EinsExtra
+T 762000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH57: Neun live, Tele 5, Eurosport, Bibel.TV
+T 778000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH59: Neun live, Tele 5, Eurosport, Bibel.TV
diff --git a/util/scan/dvb-t/de-Thueringen b/util/scan/dvb-t/de-Thueringen
index c159ea4..94bbf2c 100644
--- a/util/scan/dvb-t/de-Thueringen
+++ b/util/scan/dvb-t/de-Thueringen
@@ -2,9 +2,9 @@
# Created from http://www.ueberallfernsehen.de/data/senderliste.pdf
# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
T 474000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # CH21: Das Erste, arte, Phoenix, EinsFestival
-T 482000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH22: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
+T 482000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH22: ZDF, 3sat, KiKa / ZDFneo, ZDFinfokanal
T 506000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # CH25: Das Erste, arte, Phoenix, EinsFestival
T 522000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # CH27: MDR-TH, rbb, hr, BR
T 690000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # CH48: MDR-TH, rbb, hr, BR
-T 706000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH50: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
+T 706000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH50: ZDF, 3sat, KiKa / ZDFneo, ZDFinfokanal
T 730000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # CH53: Das Erste, arte, Phoenix, EinsFestival
diff --git a/util/scan/dvb-t/es-Albacete b/util/scan/dvb-t/es-Albacete
index 419156b..26b1e92 100644
--- a/util/scan/dvb-t/es-Albacete
+++ b/util/scan/dvb-t/es-Albacete
@@ -1,8 +1,10 @@
-# Spain, Albacete
+# Spain, Albacete - Update 2009/12/20 (Freud)
# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
-T 778000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 59: La Primera, La 2, Canal 24H, Clan/TVE 50, RNE1, RNE Clásica, RNE 3
-T 810000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 63: CLMTV
-T 834000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 66: Veo, Veo 2, Net TV, Teledeporte
-T 842000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 67: Cuatro, CNN+, 40 Latino, La Sexta 1
-T 850000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 68: Telecinco, Telecinco Sport, Telecinco Estrellas, Fly Music
-T 858000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 69: Antena 3, Antena Neox, Antena Nova, La Sexta 2
+T 618000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 39: La Regional, AB TeVe/TVCM, CRN, La Tribuna TV
+T 682000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 47: CNC, Vision6, ABTeVe
+T 778000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 59: La 1, La 2, 24H, Clan, RNE1, RNE Clásica, RNE 3
+T 810000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 63: CMT, CMT2, RCM
+T 834000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 66: Veo7, Sony TV en Veo, Tienda en Veo, Intereconomía, Teledeporte, Radio Intereconomía, Radio Marca, esRadio, Vaughan Radio
+T 842000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 67: Cuatro, CNN+, 40 Latino, Canal Club, La Sexta, SER, 40 Principales, Cadena Dial
+T 850000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 68: Telecinco, La Siete, FDF, CincoShop, Disney Channel, Punto Radio
+T 858000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 69: Antena 3, Antena.Neox, Antena.Nova, Gol Televisión, Onda Cero, Europa FM, Onda Melodía
diff --git a/util/scan/dvb-t/es-Alfabia b/util/scan/dvb-t/es-Alfabia
index dc2956c..a7e1a5a 100644
--- a/util/scan/dvb-t/es-Alfabia
+++ b/util/scan/dvb-t/es-Alfabia
@@ -1,5 +1,6 @@
# DVB-T Alfabia, Mallorca, Balearic Islands, Spain.
# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
+T 602000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # TVM, Canal4, OnaMallorca Radio
T 810000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # C.63: 24h, 50 aniv., ClanTV, La 2, TVE1; RNE 1, RNE 3, RNE C; Digitext, EPG, Lanzadera.
T 826000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # C.65: IB3, Aprenda Ingles TV
T 834000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # C.66: NetTV, Teledeporte, VeoTV1, VeoTV2.
diff --git a/util/scan/dvb-t/es-BaixoMinho b/util/scan/dvb-t/es-BaixoMinho
new file mode 100644
index 0000000..6f6fde4
--- /dev/null
+++ b/util/scan/dvb-t/es-BaixoMinho
@@ -0,0 +1,16 @@
+# file automatically generated by w_scan
+# (http://wirbel.htpc-forum.de/w_scan/index2.html)
+#! <w_scan> 20090528 1 0 OFDM ES </w_scan>
+#------------------------------------------------------------------------------
+# location and provider: Baixo Minho, Pontevedra (Spain)
+# date (yyyy-mm-dd) : 2009-07-11
+# provided by (opt) : neonmann@gmail.com
+#
+# T[2] <freq> <bw> <fec_hi> <fec_lo> <mod> <tm> <guard> <hi> [# comment]
+#------------------------------------------------------------------------------
+T 834000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # SFN
+T 842000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
+T 850000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # SFN
+T 858000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
+T 770000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # RAR Pontevedra
+T 810000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # RGE GALICIA
diff --git a/util/scan/dvb-t/es-Collserola b/util/scan/dvb-t/es-Collserola
index bec8c8b..395bd16 100644
--- a/util/scan/dvb-t/es-Collserola
+++ b/util/scan/dvb-t/es-Collserola
@@ -1,10 +1,12 @@
# DVB-T Collserola (Barcelona)
# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
-T 514000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE #c26: BTV
-T 570000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE #c33: CityTV
-T 794000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE #c61: TV3, K3/33, 3/24, 300
+T 514000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE #c26: BTV, TV Badalona, TV L'Hospitalet, TV del Besòs, COM Ràdio, Ràdio Ciutat Badalona, Ràdio L'Hospitalet
+T 570000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE #c33: 8TV, Barça TV, EDC3, 105TV, RAC 1, RAC 105
+T 650000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE #c43: TV3HD, 3/24, Canal 9, IB3, Catalunya Música, iCat FM
+T 690000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE #c48: Urbe TV, Canal Català, 25 TV, Localia, Ona FM, Onda Rambla, Sensació Ràdio
+T 794000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE #c61: TV3, 33, 3/24, K3/300, Catalunya Ràdio, Catalunya Informació
T 818000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE #c64: TVE1, TVE2, TVE 24H, Clan/TVE 50 Años, RNE1, RNEC, RNE3
-T 834000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE #c66: Veo TV, Veo2, Net TV, Teledeporte
-T 842000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE #c67: Cuatro, CNN+, 40 Latino, La Sexta1
-T 850000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE #c68: Telecino, T5 Sport, T5 Estrellas, Fly Music
-T 858000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE #c69: Antena 3, Antena.Neox, Antena.Nova, La Sexta2
+T 834000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE #c66: Veo7, Sony TV en Veo, Tienda en Veo, Intereconomía, Teledeporte, Radio Intereconomía, Radio Marca
+T 842000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE #c67: Cuatro, CNN+, 40 Latino, La Sexta, Ser, 40 Principales, Cadena Dial
+T 850000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE #c68: Telecino, La Siete, FDF, CincoShop, Disney Channel, Punto Radio
+T 858000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE #c69: Antena 3, Antena.Neox, Antena.Nova, Hogar 10, Onda Cero, Europa FM, Onda Melodía
diff --git a/util/scan/dvb-t/es-Granada b/util/scan/dvb-t/es-Granada
new file mode 100644
index 0000000..05847f1
--- /dev/null
+++ b/util/scan/dvb-t/es-Granada
@@ -0,0 +1,8 @@
+# Spain, Granada
+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
+T 762000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
+T 770000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
+T 834000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
+T 842000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
+T 850000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
+T 858000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
diff --git a/util/scan/dvb-t/es-Huesca b/util/scan/dvb-t/es-Huesca
new file mode 100644
index 0000000..8079b83
--- /dev/null
+++ b/util/scan/dvb-t/es-Huesca
@@ -0,0 +1,8 @@
+# DVB-T Huesca (Aragón) [Spain] [es-Huesca]
+# Generated by Vicente Hernando Ara <bizenton@gmail.com>
+T 762000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE # Canal 57: ARAGON TV, ARAGON RADIO, ARAGON HD
+T 794000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 61: La 1, La 2, 24h, Clan, RNE1, RNEC, RNE3
+T 834000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 66: Teledeporte, Canal Ingenieria, VEO7, SONY TV en VEO, Tienda en VEO, GUIDE PLUS+, Intereconomia, Radio Intereconomia, RADIO MARCA
+T 842000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 67: laSexta, CUATRO, CNN+, 40 LATINO, PROMO, SER, 40 PRINCIPALES, CADENA DIAL
+T 850000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 68: Telecinco, FDF, Telecinco 2, Disney Channel, Cincoshop
+T 858000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 69: ANTENA 3, ANTENA.NEOX, ANTENA.NOVA, ONDA CERO, EUROPA FM, ONDA MELODÍA, HOGAR 10
diff --git a/util/scan/dvb-t/es-Muros-Noia b/util/scan/dvb-t/es-Muros-Noia
new file mode 100644
index 0000000..a02c31d
--- /dev/null
+++ b/util/scan/dvb-t/es-Muros-Noia
@@ -0,0 +1,9 @@
+# DVB-T Muros and Noia
+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
+T 522000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 27: Local Ribeira
+T 794000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 61: RAR A Corunha
+T 810000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 63: RGE Galicia
+T 834000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 66: SFN 1
+T 842000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 67: SFN 2
+T 850000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 68: SFN 3
+T 858000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 69: SFN 4
diff --git a/util/scan/dvb-t/es-Pamplona b/util/scan/dvb-t/es-Pamplona
new file mode 100644
index 0000000..4644b2d
--- /dev/null
+++ b/util/scan/dvb-t/es-Pamplona
@@ -0,0 +1,9 @@
+# DVB-T Pamplona
+# T freq bw fec_hi fec_lo mod transm-mode guard-interval hierarchy
+T 610000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
+T 778000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
+T 802000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
+T 834000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
+T 842000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
+T 850000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
+T 858000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
diff --git a/util/scan/dvb-t/es-Santiago_de_Compostela b/util/scan/dvb-t/es-Santiago_de_Compostela
new file mode 100644
index 0000000..cf63e64
--- /dev/null
+++ b/util/scan/dvb-t/es-Santiago_de_Compostela
@@ -0,0 +1,9 @@
+# DVB-T Santiago de Compostela
+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
+T 490000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 23: Local Santiago
+T 626000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 40: RAR Santiago
+T 810000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 63: RGE Galicia
+T 834000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 66: SFN 1
+T 842000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 67: SFN 2
+T 850000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 68: SFN 3
+T 858000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 69: SFN 4
diff --git a/util/scan/dvb-t/es-Vitoria-Gasteiz b/util/scan/dvb-t/es-Vitoria-Gasteiz
new file mode 100644
index 0000000..5d97413
--- /dev/null
+++ b/util/scan/dvb-t/es-Vitoria-Gasteiz
@@ -0,0 +1,8 @@
+# Channel names in use at 2009/07/12, in Channel 66 [fffe] is a scrambled channel.
+# In the generated *channels.conf file could be necesary to change Intereconomía, Radio Intereconomía, ONDA MELODÍA to Intereconomia, Radio Intereconomia, ONDA MELODIA for Totem to work well.
+T 770000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 58: ETB1, ETB2, ETB3, ETBSAT, Euskadi Irratia, Gaztea, EiTB Irratia, Radio Euskadi, Radio Vitoria
+T 810000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 63: La 1, La 2, 24h, Clan, RNE1, RNEC, RNE3
+T 834000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 66: Teledeporte, Canal Ingenieria, VEO7, SONY TV en VEO, Tienda en VEO, GUIDE PLUS+, Intereconomía, Radio Intereconomía, [fffe], RADIO MARCA
+T 842000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 67: laSexta, CUATRO, CNN+, 40 LATINO, CANAL CLUB, SER, 40 PRINCIPALES, CADENA DIAL
+T 850000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 68: Telecinco, FDF, LaSiete, Disney Channel, Cincoshop
+T 858000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 69: ANTENA 3, ANTENA.NEOX, ANTENA.NOVA, ONDA CERO, EUROPA FM, ONDA MELODÍA, HOGAR 10
diff --git a/util/scan/dvb-t/fi-Smedsbole b/util/scan/dvb-t/fi-Smedsbole
new file mode 100644
index 0000000..fa9bc03
--- /dev/null
+++ b/util/scan/dvb-t/fi-Smedsbole
@@ -0,0 +1,13 @@
+#------------------------------------------------------------------------------
+# file automatically generated by w_scan
+# (http://wirbel.htpc-forum.de/w_scan/index2.html)
+#! <w_scan> 20090808 2 0 OFDM FI </w_scan>
+#------------------------------------------------------------------------------
+# location and provider: Åland Smedsböle/Sund
+# date (yyyy-mm-dd) : 2009-12-23
+# provided by (opt) : k.hampf@gmail.com
+#
+# T[2] <freq> <bw> <fec_hi> <fec_lo> <mod> <tm> <guard> <hi> [# comment]
+#------------------------------------------------------------------------------
+T 506000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE # Åland Network
+T 586000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE # Åland Network
diff --git a/util/scan/dvb-t/fr-Laval b/util/scan/dvb-t/fr-Laval
index 61c0aa0..d97f04c 100644
--- a/util/scan/dvb-t/fr-Laval
+++ b/util/scan/dvb-t/fr-Laval
@@ -12,14 +12,14 @@
# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
#### Laval - MontRochard ####
#R1
-T 778000000 8MHz AUTO NONE QAM64 8k AUTO NONE
+T 778166000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
#R2
-T 610000000 8MHz AUTO NONE QAM64 8k AUTO NONE
+T 610166000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
#R3
-T 754000000 8MHz AUTO NONE QAM64 8k AUTO NONE
+T 754166000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
#R4
-T 794000000 8MHz AUTO NONE QAM64 8k AUTO NONE
+T 794166000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
#R5
-T 602000000 8MHz AUTO NONE QAM64 8k AUTO NONE
+T 602166000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
#R6
-T 802000000 8MHz AUTO NONE QAM64 8k AUTO NONE
+T 802166000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
diff --git a/util/scan/dvb-t/fr-Rochefort-sur-mer b/util/scan/dvb-t/fr-Rochefort-sur-mer
new file mode 100644
index 0000000..c32bc0d
--- /dev/null
+++ b/util/scan/dvb-t/fr-Rochefort-sur-mer
@@ -0,0 +1,14 @@
+# TNT à Rochefort (17)
+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
+
+#multiplex 6 ( TF1 LCI Eurosport TF6 NRJ12 TMC )
+T 498166000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
+
+#multiplex 4 ( M6 W9 NT1 Paris Première ARTE HD )
+T 738166000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
+
+#multiplex 1 ( France 2 France 3 France 5 ARTE LCP Chaîne locale ou France Ô )
+T 602166000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
+
+#multiplex 2 ( Direct 8 France 4 BFM TV Virgin 17 Gulli i>Télé )
+T 778167000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
diff --git a/util/scan/dvb-t/hr-All b/util/scan/dvb-t/hr-All
new file mode 100644
index 0000000..9a7223c
--- /dev/null
+++ b/util/scan/dvb-t/hr-All
@@ -0,0 +1,24 @@
+# Croatia, whole country
+# Created from http://www.hrt.hr/index.php?id=173&tx_ttnews[cat]=102&tx_ttnews[tt_news]=56725&tx_ttnews[backPid]=185&cHash=bdf5a53e91
+# and http://213.147.101.105/DVBT_MUXA_MUXB_Popis_odasiljackih_lokacija.html
+# and http://www.hrt.hr/index.php?id=173&tx_ttnews[cat]=102&tx_ttnews[tt_news]=7456&tx_ttnews[backPid]=185&cHash=d02ef00f9b
+# and http://www.oiv.hr/default.asp?ru=129&gl=200907100000002&sid=&jezik=0
+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
+T 490000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE
+T 530000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE
+T 546000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE
+T 570000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+T 570000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE
+T 594000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+T 618000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE
+T 642000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE
+T 650000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+T 658000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE
+T 666000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
+T 682000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE
+T 690000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE
+T 714000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE
+T 730000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE
+T 738000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE
+T 754000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+T 778000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE
diff --git a/util/scan/dvb-t/hr-Zagreb b/util/scan/dvb-t/hr-Zagreb
deleted file mode 100644
index b385c87..0000000
--- a/util/scan/dvb-t/hr-Zagreb
+++ /dev/null
@@ -1,3 +0,0 @@
-# DVB-T Hamburg
-# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
-T 522000000 8MHz 3/4 NONE AUTO 8k 1/32 NONE # CH27:
diff --git a/util/scan/dvb-t/hu-Budapest b/util/scan/dvb-t/hu-Budapest
new file mode 100644
index 0000000..a697fda
--- /dev/null
+++ b/util/scan/dvb-t/hu-Budapest
@@ -0,0 +1,8 @@
+# Hungary / Budapest
+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
+# A1.multiplex UHF-55:
+# MTV-1 HD Budapest, MTV-2 HD, ATV (Hungary), Hir TV, MR-1 Kossuth R, MR-2 Petofi R, MR-3 Bartok R, Katolikus R
+T 746000000 8MHz 3/4 NONE QAM64 8k 1/8 NONE
+# C.multiplex UHF-62:
+# Duna TV HD, Duna-II. Autonomia, RTL Klub, TV-2 (Hungary), Euronews
+T 802000000 8MHz 3/4 NONE QAM64 8k 1/8 NONE
diff --git a/util/scan/dvb-t/hu-Debrecen b/util/scan/dvb-t/hu-Debrecen
new file mode 100644
index 0000000..29898d3
--- /dev/null
+++ b/util/scan/dvb-t/hu-Debrecen
@@ -0,0 +1,8 @@
+# Hungary / Debrecen
+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
+# A1.multiplex UHF-46:
+# MTV-1 HD Budapest, MTV-2 HD, ATV (Hungary), Hir TV, MR-1 Kossuth R, MR-2 Petofi R, MR-3 Bartok R, Katolikus R
+T 714000000 8MHz 3/4 NONE QAM64 8k 1/8 NONE
+# C.multiplex UHF-62:
+# Duna TV HD, Duna-II. Autonomia, RTL Klub, TV-2 (Hungary), Euronews
+T 802000000 8MHz 3/4 NONE QAM64 8k 1/8 NONE
diff --git a/util/scan/dvb-t/hu-Gyor b/util/scan/dvb-t/hu-Gyor
new file mode 100644
index 0000000..9650df5
--- /dev/null
+++ b/util/scan/dvb-t/hu-Gyor
@@ -0,0 +1,8 @@
+# Hungary / Gyor
+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
+# A1.multiplex UHF-42:
+# MTV-1 HD Budapest, MTV-2 HD, ATV (Hungary), Hir TV, MR-1 Kossuth R, MR-2 Petofi R, MR-3 Bartok R, Katolikus R
+T 642000000 8MHz 3/4 NONE QAM64 8k 1/8 NONE
+# C.multiplex UHF-61:
+# Duna TV HD, Duna-II. Autonomia, RTL Klub, TV-2 (Hungary), Euronews
+T 794000000 8MHz 3/4 NONE QAM64 8k 1/8 NONE
diff --git a/util/scan/dvb-t/hu-Kabhegy b/util/scan/dvb-t/hu-Kabhegy
new file mode 100644
index 0000000..7dfcecf
--- /dev/null
+++ b/util/scan/dvb-t/hu-Kabhegy
@@ -0,0 +1,8 @@
+# Hungary / Kabhegy
+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
+# C.multiplex UHF-61:
+# Duna TV HD, Duna-II. Autonomia, RTL Klub, TV-2 (Hungary), Euronews
+T 794000000 8MHz 3/4 NONE QAM64 8k 1/8 NONE
+# A2.multiplex UHF-64:
+# MTV-1 HD Sopron, MTV-2 HD, ATV (Hungary), Hir TV, MR-1 Kossuth R, MR-2 Petofi R, MR-3 Bartok R, Katolikus R
+T 818000000 8MHz 3/4 NONE QAM64 8k 1/8 NONE
diff --git a/util/scan/dvb-t/hu-Kekes b/util/scan/dvb-t/hu-Kekes
new file mode 100644
index 0000000..76807df
--- /dev/null
+++ b/util/scan/dvb-t/hu-Kekes
@@ -0,0 +1,8 @@
+# Hungary / Kekes
+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
+# A1.multiplex UHF-44:
+# MTV-1 HD Budapest, MTV-2 HD, ATV (Hungary), Hir TV, MR-1 Kossuth R, MR-2 Petofi R, MR-3 Bartok R, Katolikus R
+T 658000000 8MHz 3/4 NONE QAM64 8k 1/8 NONE
+# C.multiplex UHF-69:
+# Duna TV HD, Duna-II. Autonomia, RTL Klub, TV-2 (Hungary), Euronews
+T 858000000 8MHz 3/4 NONE QAM64 8k 1/8 NONE
diff --git a/util/scan/dvb-t/hu-Kiskoros b/util/scan/dvb-t/hu-Kiskoros
new file mode 100644
index 0000000..edf3d90
--- /dev/null
+++ b/util/scan/dvb-t/hu-Kiskoros
@@ -0,0 +1,8 @@
+# Hungary / Kiskoros
+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
+# A1.multiplex UHF-45:
+# MTV-1 HD Budapest, MTV-2 HD, ATV (Hungary), Hir TV, MR-1 Kossuth R, MR-2 Petofi R, MR-3 Bartok R, Katolikus R
+T 666000000 8MHz 3/4 NONE QAM64 8k 1/8 NONE
+# C.multiplex UHF-68:
+# Duna TV HD, Duna-II. Autonomia, RTL Klub, TV-2 (Hungary), Euronews
+T 850000000 8MHz 3/4 NONE QAM64 8k 1/8 NONE
diff --git a/util/scan/dvb-t/hu-Nagykanizsa-Ujudvar b/util/scan/dvb-t/hu-Nagykanizsa-Ujudvar
new file mode 100644
index 0000000..35f23d9
--- /dev/null
+++ b/util/scan/dvb-t/hu-Nagykanizsa-Ujudvar
@@ -0,0 +1,8 @@
+# Hungary / Nagykanizsa / Ujudvar
+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
+# A1.multiplex UHF-24:
+# MTV-1 HD Budapest, MTV-2 HD, ATV (Hungary), Hir TV, MR-1 Kossuth R, MR-2 Petofi R, MR-3 Bartok R, Katolikus R
+T 498000000 8MHz 3/4 NONE QAM64 8k 1/8 NONE
+# C.multiplex UHF-65:
+# Duna TV HD, Duna-II. Autonomia, RTL Klub, TV-2 (Hungary), Euronews
+T 826000000 8MHz 3/4 NONE QAM64 8k 1/8 NONE
diff --git a/util/scan/dvb-t/hu-Pecs b/util/scan/dvb-t/hu-Pecs
new file mode 100644
index 0000000..caf7643
--- /dev/null
+++ b/util/scan/dvb-t/hu-Pecs
@@ -0,0 +1,8 @@
+# Hungary / Pecs
+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
+# A1.multiplex UHF-52:
+# MTV-1 HD Budapest, MTV-2 HD, ATV (Hungary), Hir TV, MR-1 Kossuth R, MR-2 Petofi R, MR-3 Bartok R, Katolikus R
+T 722000000 8MHz 3/4 NONE QAM64 8k 1/8 NONE
+# C.multiplex UHF-67:
+# Duna TV HD, Duna-II. Autonomia, RTL Klub, TV-2 (Hungary), Euronews
+T 842000000 8MHz 3/4 NONE QAM64 8k 1/8 NONE
diff --git a/util/scan/dvb-t/hu-Szeged b/util/scan/dvb-t/hu-Szeged
new file mode 100644
index 0000000..23f1c05
--- /dev/null
+++ b/util/scan/dvb-t/hu-Szeged
@@ -0,0 +1,8 @@
+# Hungary / Szeged
+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
+# A1.multiplex UHF-60:
+# MTV-1 HD Budapest, MTV-2 HD, ATV (Hungary), Hir TV, MR-1 Kossuth R, MR-2 Petofi R, MR-3 Bartok R, Katolikus R
+T 786000000 8MHz 3/4 NONE QAM64 8k 1/8 NONE
+# C.multiplex UHF-65:
+# Duna TV HD, Duna-II. Autonomia, RTL Klub, TV-2 (Hungary), Euronews
+T 826000000 8MHz 3/4 NONE QAM64 8k 1/8 NONE
diff --git a/util/scan/dvb-t/hu-Szentes b/util/scan/dvb-t/hu-Szentes
new file mode 100644
index 0000000..41b9225
--- /dev/null
+++ b/util/scan/dvb-t/hu-Szentes
@@ -0,0 +1,8 @@
+# Hungary / Szentes
+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
+# A3.multiplex UHF-60:
+# MTV-1 HD Szeged, MTV-2 HD, ATV (Hungary), Hir TV, MR-1 Kossuth R, MR-2 Petofi R, MR-3 Bartok R, Katolikus R
+T 786000000 8MHz 3/4 NONE QAM64 8k 1/8 NONE
+# C.multiplex UHF-65:
+# Duna TV HD, Duna-II. Autonomia, RTL Klub, TV-2 (Hungary), Euronews
+T 826000000 8MHz 3/4 NONE QAM64 8k 1/8 NONE
diff --git a/util/scan/dvb-t/hu-Tokaj b/util/scan/dvb-t/hu-Tokaj
new file mode 100644
index 0000000..6ef172a
--- /dev/null
+++ b/util/scan/dvb-t/hu-Tokaj
@@ -0,0 +1,8 @@
+# Hungary / Tokaj
+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
+# A1.multiplex UHF-68:
+# MTV-1 HD Budapest, MTV-2 HD, ATV (Hungary), Hir TV, MR-1 Kossuth R, MR-2 Petofi R, MR-3 Bartok R, Katolikus R
+T 850000000 8MHz 3/4 NONE QAM64 8k 1/8 NONE
+# C.multiplex UHF-63:
+# Duna TV HD, Duna-II. Autonomia, RTL Klub, TV-2 (Hungary), Euronews
+T 810000000 8MHz 3/4 NONE QAM64 8k 1/8 NONE
diff --git a/util/scan/dvb-t/hu-Uzd b/util/scan/dvb-t/hu-Uzd
new file mode 100644
index 0000000..c2d270e
--- /dev/null
+++ b/util/scan/dvb-t/hu-Uzd
@@ -0,0 +1,8 @@
+# Hungary / Uzd
+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
+# A1.multiplex UHF-52:
+# MTV-1 HD Budapest, MTV-2 HD, ATV (Hungary), Hir TV, MR-1 Kossuth R, MR-2 Petofi R, MR-3 Bartok R, Katolikus R
+T 722000000 8MHz 3/4 NONE QAM64 8k 1/8 NONE
+# C.multiplex UHF-67:
+# Duna TV HD, Duna-II. Autonomia, RTL Klub, TV-2 (Hungary), Euronews
+T 842000000 8MHz 3/4 NONE QAM64 8k 1/8 NONE
diff --git a/util/scan/dvb-t/hu-Vasvar-Hegyhatsal b/util/scan/dvb-t/hu-Vasvar-Hegyhatsal
new file mode 100644
index 0000000..4190e4d
--- /dev/null
+++ b/util/scan/dvb-t/hu-Vasvar-Hegyhatsal
@@ -0,0 +1,8 @@
+# Hungary / Vasvar / Hegyhatsal
+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
+# A1.multiplex UHF-58:
+# MTV-1 HD Budapest, MTV-2 HD, ATV (Hungary), Hir TV, MR-1 Kossuth R, MR-2 Petofi R, MR-3 Bartok R, Katolikus R
+T 770000000 8MHz 3/4 NONE QAM64 8k 1/8 NONE
+# C.multiplex UHF-68:
+# Duna TV HD, Duna-II. Autonomia, RTL Klub, TV-2 (Hungary), Euronews
+T 850000000 8MHz 3/4 NONE QAM64 8k 1/8 NONE
diff --git a/util/scan/dvb-t/it-Montevergine b/util/scan/dvb-t/it-Montevergine
new file mode 100644
index 0000000..0d7c30d
--- /dev/null
+++ b/util/scan/dvb-t/it-Montevergine
@@ -0,0 +1,18 @@
+# DVB-T Montevergine (Avellino) 83100
+# 12/12/2009 by Antonio Galasso anto1714@libero.it
+# (ricordati di mettere il lettore in posizione stop orima di iniziare la scansione dei canali)
+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
+# C-MUX
+T 177500000 7MHz 2/3 NONE QAM64 8k 1/32 NONE
+T 482000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
+T 498000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
+T 514000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
+T 522000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
+T 530000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
+T 546000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
+T 554000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
+T 594000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
+T 642000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+T 682000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
+T 690000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
+T 698000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
diff --git a/util/scan/dvb-t/lt-All b/util/scan/dvb-t/lt-All
new file mode 100644
index 0000000..daf2da2
--- /dev/null
+++ b/util/scan/dvb-t/lt-All
@@ -0,0 +1,39 @@
+# Lithuania, whole country
+# Created from http://www.skaitmenine.lt/lt/skaitmenine_tv_lietuvoje/antzemine_dvb_t.html
+# Created by baruse@gmail.com
+
+# LRTC I tinklas
+T 482000000 8MHz AUTO NONE QAM64 8k 1/16 NONE # kanalas 22
+T 514000000 8MHz AUTO NONE QAM64 8k 1/16 NONE # kanalas 26
+T 618000000 8MHz AUTO NONE QAM64 8k 1/16 NONE # kanalas 39
+T 658000000 8MHz AUTO NONE QAM64 8k 1/16 NONE # kanalas 44
+T 682000000 8MHz AUTO NONE QAM64 8k 1/16 NONE # kanalas 47
+T 762000000 8MHz AUTO NONE QAM64 8k 1/16 NONE # kanalas 57
+T 770000000 8MHz AUTO NONE QAM64 8k 1/16 NONE # kanalas 58
+T 786000000 8MHz AUTO NONE QAM64 8k 1/16 NONE # kanalas 60
+T 794000000 8MHz AUTO NONE QAM64 8k 1/16 NONE # kanalas 61
+
+# LRTC II tinklas
+T 570000000 8MHz AUTO NONE QAM64 8k 1/16 NONE # kanalas 33
+T 610000000 8MHz AUTO NONE QAM64 8k 1/16 NONE # kanalas 38
+T 690000000 8MHz AUTO NONE QAM64 8k 1/16 NONE # kanalas 48
+T 738000000 8MHz AUTO NONE QAM64 8k 1/16 NONE # kanalas 54
+T 802000000 8MHz AUTO NONE QAM64 8k 1/16 NONE # kanalas 62
+T 810000000 8MHz AUTO NONE QAM64 8k 1/16 NONE # kanalas 63
+T 818000000 8MHz AUTO NONE QAM64 8k 1/16 NONE # kanalas 64
+
+# TEO LT I tinklas
+T 594000000 8MHz AUTO NONE QAM64 8k 1/16 NONE # kanalas 36
+T 706000000 8MHz AUTO NONE QAM64 8k 1/16 NONE # kanalas 50
+T 778000000 8MHz AUTO NONE QAM64 8k 1/16 NONE # kanalas 59
+T 826000000 8MHz AUTO NONE QAM64 8k 1/16 NONE # kanalas 65
+
+# TEO LT II tinklas
+T 474000000 8MHz AUTO NONE QAM64 8k 1/16 NONE # kanalas 21
+T 546000000 8MHz AUTO NONE QAM64 8k 1/16 NONE # kanalas 30
+T 730000000 8MHz AUTO NONE QAM64 8k 1/16 NONE # kanalas 53
+#T 786000000 8MHz AUTO NONE QAM64 8k 1/16 NONE # kanalas 60
+
+# Vilniui bonusas
+T 602000000 8MHz AUTO NONE QAM64 8k 1/16 NONE # kanalas 37
+#T 730000000 8MHz AUTO NONE QAM64 8k 1/16 NONE # kanalas 53
diff --git a/util/scan/dvb-t/ro-Bucharest b/util/scan/dvb-t/ro-Bucharest
new file mode 100644
index 0000000..fac0ca9
--- /dev/null
+++ b/util/scan/dvb-t/ro-Bucharest
@@ -0,0 +1,5 @@
+# Romania / Bucharest
+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
+T 546000000 8MHz 2/3 NONE QAM16 8k 1/16 NONE
+T 738000000 8MHz 2/3 NONE QAM64 8k 1/16 NONE # SRTV
+T 778000000 8MHz 2/3 NONE QAM64 8k 1/16 NONE # SNR DVB-T
diff --git a/util/scan/dvb-t/se-Ornskoldsvik_As b/util/scan/dvb-t/se-Ornskoldsvik_As
index e793d70..8fa6edb 100644
--- a/util/scan/dvb-t/se-Ornskoldsvik_As
+++ b/util/scan/dvb-t/se-Ornskoldsvik_As
@@ -4,3 +4,4 @@ T 490000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
T 474000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
T 578000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
T 506000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+T 642000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
diff --git a/util/scan/dvb-t/se-Skelleftea b/util/scan/dvb-t/se-Skelleftea
index 818beda..d831d9e 100644
--- a/util/scan/dvb-t/se-Skelleftea
+++ b/util/scan/dvb-t/se-Skelleftea
@@ -4,3 +4,4 @@ T 490000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
T 514000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
T 778000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
T 650000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+T 698000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
diff --git a/util/scan/dvb-t/sk-BanskaBystrica b/util/scan/dvb-t/sk-BanskaBystrica
index 48d3170..80d73a2 100644
--- a/util/scan/dvb-t/sk-BanskaBystrica
+++ b/util/scan/dvb-t/sk-BanskaBystrica
@@ -1,4 +1,5 @@
# DVB-T Banska Bystrica (Banska Bystrica, Slovak Republic)
# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
-T 778000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+# on channel 65
+T 826000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
diff --git a/util/scan/dvb-t/sk-Bardejov b/util/scan/dvb-t/sk-Bardejov
new file mode 100644
index 0000000..95daa9e
--- /dev/null
+++ b/util/scan/dvb-t/sk-Bardejov
@@ -0,0 +1,5 @@
+# DVB-T Bardejov (Bardejov, Slovak Republic)
+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
+
+# on channel 62
+T 802000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
diff --git a/util/scan/dvb-t/sk-Bratislava b/util/scan/dvb-t/sk-Bratislava
index 4924be4..57683a4 100644
--- a/util/scan/dvb-t/sk-Bratislava
+++ b/util/scan/dvb-t/sk-Bratislava
@@ -1,4 +1,5 @@
# DVB-T Bratislava (Bratislava, Slovak Republic)
# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
-T 834000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+# on channel 66
+T 834000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
diff --git a/util/scan/dvb-t/sk-Kosice b/util/scan/dvb-t/sk-Kosice
index 46f7a7e..9046f28 100644
--- a/util/scan/dvb-t/sk-Kosice
+++ b/util/scan/dvb-t/sk-Kosice
@@ -1,4 +1,5 @@
# DVB-T Kosice (Kosice, Slovak Republic)
# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
-T 658000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+# on channel 64
+T 818000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
diff --git a/util/scan/dvb-t/sk-Michalovce b/util/scan/dvb-t/sk-Michalovce
new file mode 100644
index 0000000..f91b298
--- /dev/null
+++ b/util/scan/dvb-t/sk-Michalovce
@@ -0,0 +1,5 @@
+# DVB-T Michalovce (Michalovce, Slovak Republic)
+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
+
+# on channel 64
+T 818000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
diff --git a/util/scan/dvb-t/sk-Namestovo b/util/scan/dvb-t/sk-Namestovo
new file mode 100644
index 0000000..da916ee
--- /dev/null
+++ b/util/scan/dvb-t/sk-Namestovo
@@ -0,0 +1,5 @@
+# DVB-T Namestovo (Namestovo, Slovak Republic)
+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
+
+# on channel 68
+T 850000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
diff --git a/util/scan/dvb-t/sk-Poprad b/util/scan/dvb-t/sk-Poprad
new file mode 100644
index 0000000..74040ff
--- /dev/null
+++ b/util/scan/dvb-t/sk-Poprad
@@ -0,0 +1,5 @@
+# DVB-T Poprad (Poprad, Slovak Republic)
+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
+
+# on channel 66
+T 834000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
diff --git a/util/scan/dvb-t/sk-RimavskaSobota b/util/scan/dvb-t/sk-RimavskaSobota
new file mode 100644
index 0000000..6dfe7af
--- /dev/null
+++ b/util/scan/dvb-t/sk-RimavskaSobota
@@ -0,0 +1,5 @@
+# DVB-T Rimavska Sobota (Rimavska Sobota, Slovak Republic)
+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
+
+# on channel 61
+T 794000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
diff --git a/util/scan/dvb-t/sk-Trencin b/util/scan/dvb-t/sk-Trencin
new file mode 100644
index 0000000..9a0d7c1
--- /dev/null
+++ b/util/scan/dvb-t/sk-Trencin
@@ -0,0 +1,5 @@
+# DVB-T Trencin (Trencin, Slovak Republic)
+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
+
+# on channel 69
+T 858000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
diff --git a/util/scan/dvb-t/sk-VelkyKrtis b/util/scan/dvb-t/sk-VelkyKrtis
new file mode 100644
index 0000000..90d186a
--- /dev/null
+++ b/util/scan/dvb-t/sk-VelkyKrtis
@@ -0,0 +1,5 @@
+# DVB-T Velky Krtis (Velky Krtis, Slovak Republic)
+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
+
+# on channel 65
+T 826000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
diff --git a/util/scan/dvb-t/sk-Zilina b/util/scan/dvb-t/sk-Zilina
new file mode 100644
index 0000000..b1629b2
--- /dev/null
+++ b/util/scan/dvb-t/sk-Zilina
@@ -0,0 +1,5 @@
+# DVB-T Zilina (Zilina, Slovak Republic)
+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
+
+# on channel 68
+T 850000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
diff --git a/util/scan/dvb-t/uk-Redruth b/util/scan/dvb-t/uk-Redruth
index e8285a5..8f15fa0 100644
--- a/util/scan/dvb-t/uk-Redruth
+++ b/util/scan/dvb-t/uk-Redruth
@@ -2,9 +2,12 @@
# Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html
# and http://www.ofcom.org.uk/static/reception_advice/index.asp.html
# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
-T 618000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
-T 642167000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
-T 666167000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
-T 697833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
+T 474167000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
+T 497833000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
+T 506167000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
+T 521833000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
+T 634167000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
T 650167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
-T 705833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
+T 658167000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
+T 690000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
+T 714000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
diff --git a/util/scan/dvb-t/uk-StocklandHill b/util/scan/dvb-t/uk-StocklandHill
index c0d3c3e..f89a86d 100644
--- a/util/scan/dvb-t/uk-StocklandHill
+++ b/util/scan/dvb-t/uk-StocklandHill
@@ -1,10 +1,9 @@
# UK, Stockland Hill
-# Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html
-# and http://www.ofcom.org.uk/static/reception_advice/index.asp.html
+# http://www.ukfree.tv/txdetail.php?a=ST222014
# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
-T 481833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
-T 529833000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
-T 505833000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
-T 561833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
-T 546167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
-T 578167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
+T 514167000 8MHz 2/3 NONE QAM64 8k 1/32 NONE # PSB1
+T 490167000 8MHz 2/3 NONE QAM64 8k 1/32 NONE # PSB2
+#T 538167000 8MHz 2/3 NONE QAM64 8k 1/32 NONE # PSB3 (DVB-T2)
+T 505833000 8MHz 2/3 NONE QAM64 8k 1/32 NONE # COM4
+T 481833000 8MHz 2/3 NONE QAM64 8k 1/32 NONE # COM5
+T 529833000 8MHz 2/3 NONE QAM64 8k 1/32 NONE # COM6
diff --git a/util/scan/dvb-t/uk-Storeton b/util/scan/dvb-t/uk-Storeton
index 1ca0841..8580aaa 100644
--- a/util/scan/dvb-t/uk-Storeton
+++ b/util/scan/dvb-t/uk-Storeton
@@ -2,9 +2,12 @@
# Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html
# and http://www.ofcom.org.uk/static/reception_advice/index.asp.html
# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
-T 546167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
-T 578167000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
-T 490167000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
-T 514167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
-T 538167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
-T 570167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
+T 490000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
+T 506000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
+T 514000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
+T 530000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
+T 538000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
+T 546000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
+T 730000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
+T 762000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
+T 786000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
diff --git a/util/scan/dvb-t/uk-WinterHill b/util/scan/dvb-t/uk-WinterHill
index 3ea6abd..635f227 100644
--- a/util/scan/dvb-t/uk-WinterHill
+++ b/util/scan/dvb-t/uk-WinterHill
@@ -1,13 +1,9 @@
# UK, Winter Hill
-# Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html
-# and http://www.ofcom.org.uk/static/reception_advice/index.asp.html
+# Populated by J. Hornsby from a scan of active multiplexes
+# UK, Winter Hill B Ceased broadcasting on 02 December 2009
# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
-T 754167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
-T 834167000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
-T 850167000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
-T 842167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
-T 786167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
-T 810167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
-# UK, Winter Hill B
-T 650000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
-T 626000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
+T 746000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
+T 770000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
+T 778000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
+T 794000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
+T 801833000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
diff --git a/util/scan/dvb-t/vn-Hanoi b/util/scan/dvb-t/vn-Hanoi
new file mode 100644
index 0000000..451a07f
--- /dev/null
+++ b/util/scan/dvb-t/vn-Hanoi
@@ -0,0 +1,5 @@
+# Hanoi - Vietnam - DVB-T by VTC
+# contributed by Pham Thanh Nam <phamthanhnam.ptn@gmail.com>
+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
+T 514000000 8MHz 3/4 NONE QAM64 2k 1/32 NONE
+T 578000000 8MHz 3/4 NONE QAM64 2k 1/32 NONE
diff --git a/util/scan/dvb-t/vn-Thaibinh b/util/scan/dvb-t/vn-Thaibinh
new file mode 100644
index 0000000..85f8098
--- /dev/null
+++ b/util/scan/dvb-t/vn-Thaibinh
@@ -0,0 +1,5 @@
+# Thaibinh - Vietnam - DVB-T by VTC
+# contributed by Pham Thanh Nam <phamthanhnam.ptn@gmail.com>
+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
+T 626000000 8MHz 3/4 NONE QAM64 2k 1/32 NONE
+T 634000000 8MHz 3/4 NONE QAM64 2k 1/32 NONE
diff --git a/util/scan/scan.c b/util/scan/scan.c
index 1b7a3e5..3058bdb 100644
--- a/util/scan/scan.c
+++ b/util/scan/scan.c
@@ -236,6 +236,17 @@ static struct transponder *find_transponder(uint32_t frequency)
static void copy_transponder(struct transponder *d, struct transponder *s)
{
+ struct list_head *pos;
+ struct service *service;
+
+ if (d->transport_stream_id != s->transport_stream_id) {
+ /* propagate change to any already allocated services */
+ list_for_each(pos, &d->services) {
+ service = list_entry(pos, struct service, list);
+ service->transport_stream_id = s->transport_stream_id;
+ }
+ }
+
d->network_id = s->network_id;
d->original_network_id = s->original_network_id;
d->transport_stream_id = s->transport_stream_id;
diff --git a/util/szap/Makefile b/util/szap/Makefile
index b341c74..48d7149 100644
--- a/util/szap/Makefile
+++ b/util/szap/Makefile
@@ -1,6 +1,6 @@
# Makefile for linuxtv.org dvb-apps/util/szap
-objects = lnb.o
+objects = lnb.o util.o
binaries = azap \
czap \
diff --git a/util/szap/azap.c b/util/szap/azap.c
index 5bd7f33..93addf8 100644
--- a/util/szap/azap.c
+++ b/util/szap/azap.c
@@ -13,6 +13,8 @@
#include <linux/dvb/frontend.h>
#include <linux/dvb/dmx.h>
+#include "util.h"
+
static char FRONTEND_DEV [80];
static char DEMUX_DEV [80];
@@ -209,31 +211,6 @@ int parse(const char *fname, const char *channel,
static
-int set_pesfilter (int fd, int pid, dmx_pes_type_t type, int dvr)
-{
- struct dmx_pes_filter_params pesfilter;
-
- if (pid <= 0 || pid >= 0x1fff)
- return 0;
-
- pesfilter.pid = pid;
- pesfilter.input = DMX_IN_FRONTEND;
- pesfilter.output = dvr ? DMX_OUT_TS_TAP : DMX_OUT_DECODER;
- pesfilter.pes_type = type;
- pesfilter.flags = DMX_IMMEDIATE_START;
-
- if (ioctl(fd, DMX_SET_PES_FILTER, &pesfilter) < 0) {
- PERROR ("ioctl(DMX_SET_PES_FILTER) for %s PID failed",
- type == DMX_PES_AUDIO ? "Audio" :
- type == DMX_PES_VIDEO ? "Video" : "??");
- return -1;
- }
-
- return 0;
-}
-
-
-static
int setup_frontend (int fe_fd, struct dvb_frontend_parameters *frontend)
{
struct dvb_frontend_info fe_info;
diff --git a/util/szap/czap.c b/util/szap/czap.c
index 469df56..e04ed4b 100644
--- a/util/szap/czap.c
+++ b/util/szap/czap.c
@@ -13,6 +13,8 @@
#include <linux/dvb/frontend.h>
#include <linux/dvb/dmx.h>
+#include "util.h"
+
static char FRONTEND_DEV [80];
static char DEMUX_DEV [80];
@@ -118,7 +120,7 @@ char *find_channel(FILE *f, int list_channels, int *chan_no, const char *channel
int parse(const char *fname, int list_channels, int chan_no, const char *channel,
- struct dvb_frontend_parameters *frontend, int *vpid, int *apid)
+ struct dvb_frontend_parameters *frontend, int *vpid, int *apid, int *sid)
{
FILE *f;
char *chan;
@@ -141,10 +143,10 @@ int parse(const char *fname, int list_channels, int chan_no, const char *channel
}
printf("%3d %s", chan_no, chan);
- if ((sscanf(chan, "%a[^:]:%d:%a[^:]:%d:%a[^:]:%a[^:]:%d:%d\n",
+ if ((sscanf(chan, "%m[^:]:%d:%m[^:]:%d:%m[^:]:%m[^:]:%d:%d:%d\n",
&name, &frontend->frequency,
&inv, &frontend->u.qam.symbol_rate,
- &fec, &mod, vpid, apid) != 8)
+ &fec, &mod, vpid, apid, sid) != 9)
|| !name || !inv || !fec | !mod) {
ERROR("cannot parse service data");
return -3;
@@ -165,10 +167,10 @@ int parse(const char *fname, int list_channels, int chan_no, const char *channel
ERROR("modulation field syntax '%s'", mod);
return -6;
}
- printf("%3d %s: f %d, s %d, i %d, fec %d, qam %d, v %#x, a %#x\n",
+ printf("%3d %s: f %d, s %d, i %d, fec %d, qam %d, v %#x, a %#x, s %#x \n",
chan_no, name, frontend->frequency, frontend->u.qam.symbol_rate,
frontend->inversion, frontend->u.qam.fec_inner,
- frontend->u.qam.modulation, *vpid, *apid);
+ frontend->u.qam.modulation, *vpid, *apid, *sid);
free(name);
free(inv);
free(fec);
@@ -178,31 +180,6 @@ int parse(const char *fname, int list_channels, int chan_no, const char *channel
}
-
-static
-int set_pesfilter (int fd, int pid, dmx_pes_type_t type, int dvr)
-{
- struct dmx_pes_filter_params pesfilter;
-
- if (pid <= 0 || pid >= 0x1fff)
- return 0;
-
- pesfilter.pid = pid;
- pesfilter.input = DMX_IN_FRONTEND;
- pesfilter.output = dvr ? DMX_OUT_TS_TAP : DMX_OUT_DECODER;
- pesfilter.pes_type = type;
- pesfilter.flags = DMX_IMMEDIATE_START;
-
- if (ioctl(fd, DMX_SET_PES_FILTER, &pesfilter) < 0) {
- PERROR ("ioctl(DMX_SET_PES_FILTER) for %s PID failed",
- type == DMX_PES_AUDIO ? "Audio" :
- type == DMX_PES_VIDEO ? "Video" : "??");
- return -1;
- }
-
- return 0;
-}
-
static
int setup_frontend(int fe_fd, struct dvb_frontend_parameters *frontend)
{
@@ -264,9 +241,20 @@ int check_frontend (int fe_fd, int human_readable)
}
-static const char *usage = "\nusage: %s [-a adapter_num] [-f frontend_id] [-d demux_id] [-c conf_file] [ -H ] {<channel name>| -n channel_num} [-x]\n"
- " or: %s [-c conf_file] -l\n\n";
-
+static const char *usage =
+ "\nusage: %s [options] -l\n"
+ " list known channels\n"
+ " %s [options] {-n channel-number|channel_name}\n"
+ " zap to channel via number or full name (case insensitive)\n"
+ " -a number : use given adapter (default 0)\n"
+ " -f number : use given frontend (default 0)\n"
+ " -d number : use given demux (default 0)\n"
+ " -c file : read channels list from 'file'\n"
+ " -x : exit after tuning\n"
+ " -H : human readable output\n"
+ " -r : set up /dev/dvb/adapterX/dvr0 for TS recording\n"
+ " -p : add pat and pmt to TS recording (implies -r)\n"
+;
int main(int argc, char **argv)
{
@@ -275,12 +263,12 @@ int main(int argc, char **argv)
char *confname = NULL;
char *channel = NULL;
int adapter = 0, frontend = 0, demux = 0, dvr = 0;
- int vpid, apid;
- int frontend_fd, video_fd, audio_fd;
+ int vpid, apid, sid, pmtpid = 0;
+ int frontend_fd, video_fd, audio_fd, pat_fd, pmt_fd;
int opt, list_channels = 0, chan_no = 0;
- int human_readable = 0;
+ int human_readable = 0, rec_psi = 0;
- while ((opt = getopt(argc, argv, "Hln:hrn:a:f:d:c:x")) != -1) {
+ while ((opt = getopt(argc, argv, "Hln:hrn:a:f:d:c:x:p")) != -1) {
switch (opt) {
case 'a':
adapter = strtoul(optarg, NULL, 0);
@@ -300,6 +288,9 @@ int main(int argc, char **argv)
case 'n':
chan_no = strtoul(optarg, NULL, 0);
break;
+ case 'p':
+ rec_psi = 1;
+ break;
case 'x':
exit_after_tuning = 1;
break;
@@ -352,7 +343,7 @@ int main(int argc, char **argv)
memset(&frontend_param, 0, sizeof(struct dvb_frontend_parameters));
- if (parse(confname, list_channels, chan_no, channel, &frontend_param, &vpid, &apid))
+ if (parse(confname, list_channels, chan_no, channel, &frontend_param, &vpid, &apid, &sid))
return -1;
if (list_channels)
return 0;
@@ -365,6 +356,28 @@ int main(int argc, char **argv)
if (setup_frontend(frontend_fd, &frontend_param) < 0)
return -1;
+ if (rec_psi) {
+ pmtpid = get_pmt_pid(DEMUX_DEV, sid);
+ if (pmtpid <= 0) {
+ fprintf(stderr,"couldn't find pmt-pid for sid %04x\n",sid);
+ return -1;
+ }
+
+ if ((pat_fd = open(DEMUX_DEV, O_RDWR)) < 0) {
+ perror("opening pat demux failed");
+ return -1;
+ }
+ if (set_pesfilter(pat_fd, 0, DMX_PES_OTHER, dvr) < 0)
+ return -1;
+
+ if ((pmt_fd = open(DEMUX_DEV, O_RDWR)) < 0) {
+ perror("opening pmt demux failed");
+ return -1;
+ }
+ if (set_pesfilter(pmt_fd, pmtpid, DMX_PES_OTHER, dvr) < 0)
+ return -1;
+ }
+
if ((video_fd = open(DEMUX_DEV, O_RDWR)) < 0) {
PERROR("failed opening '%s'", DEMUX_DEV);
return -1;
@@ -383,6 +396,8 @@ int main(int argc, char **argv)
check_frontend (frontend_fd, human_readable);
+ close (pat_fd);
+ close (pmt_fd);
close (audio_fd);
close (video_fd);
close (frontend_fd);
diff --git a/util/szap/szap.c b/util/szap/szap.c
index ed1aa51..78da3a6 100644
--- a/util/szap/szap.c
+++ b/util/szap/szap.c
@@ -48,6 +48,7 @@
#include <linux/dvb/dmx.h>
#include <linux/dvb/audio.h>
#include "lnb.h"
+#include "util.h"
#ifndef TRUE
#define TRUE (1==1)
@@ -92,94 +93,6 @@ static char *usage_str =
" -p : add pat and pmt to TS recording (implies -r)\n"
" or -n numbers for zapping\n";
-static int set_demux(int dmxfd, int pid, int pes_type, int dvr)
-{
- struct dmx_pes_filter_params pesfilter;
-
- if (pid < 0 || pid >= 0x1fff) /* ignore this pid to allow radio services */
- return TRUE;
-
- if (dvr) {
- int buffersize = 64 * 1024;
- if (ioctl(dmxfd, DMX_SET_BUFFER_SIZE, buffersize) == -1)
- perror("DMX_SET_BUFFER_SIZE failed");
- }
-
- pesfilter.pid = pid;
- pesfilter.input = DMX_IN_FRONTEND;
- pesfilter.output = dvr ? DMX_OUT_TS_TAP : DMX_OUT_DECODER;
- pesfilter.pes_type = pes_type;
- pesfilter.flags = DMX_IMMEDIATE_START;
-
- if (ioctl(dmxfd, DMX_SET_PES_FILTER, &pesfilter) == -1) {
- fprintf(stderr, "DMX_SET_PES_FILTER failed "
- "(PID = 0x%04x): %d %m\n", pid, errno);
- return FALSE;
- }
-
- return TRUE;
-}
-
-int get_pmt_pid(char *dmxdev, int sid)
-{
- int patfd, count;
- int pmt_pid = 0;
- int patread = 0;
- int section_length;
- unsigned char buft[4096];
- unsigned char *buf = buft;
- struct dmx_sct_filter_params f;
-
- memset(&f, 0, sizeof(f));
- f.pid = 0;
- f.filter.filter[0] = 0x00;
- f.filter.mask[0] = 0xff;
- f.timeout = 0;
- f.flags = DMX_IMMEDIATE_START | DMX_CHECK_CRC;
-
- if ((patfd = open(dmxdev, O_RDWR)) < 0) {
- perror("openening pat demux failed");
- return -1;
- }
-
- if (ioctl(patfd, DMX_SET_FILTER, &f) == -1) {
- perror("ioctl DMX_SET_FILTER failed");
- close(patfd);
- return -1;
- }
-
- while (!patread){
- if (((count = read(patfd, buf, sizeof(buft))) < 0) && errno == EOVERFLOW)
- count = read(patfd, buf, sizeof(buft));
- if (count < 0) {
- perror("read_sections: read error");
- close(patfd);
- return -1;
- }
-
- section_length = ((buf[1] & 0x0f) << 8) | buf[2];
- if (count != section_length + 3)
- continue;
-
- buf += 8;
- section_length -= 8;
-
- patread = 1; /* assumes one section contains the whole pat */
- while (section_length > 0) {
- int service_id = (buf[0] << 8) | buf[1];
- if (service_id == sid) {
- pmt_pid = ((buf[2] & 0x1f) << 8) | buf[3];
- section_length = 0;
- }
- buf += 4;
- section_length -= 4;
- }
- }
-
- close(patfd);
- return pmt_pid;
-}
-
struct diseqc_cmd {
struct dvb_diseqc_master_cmd cmd;
uint32_t wait;
@@ -390,10 +303,10 @@ int zap_to(unsigned int adapter, unsigned int frontend, unsigned int demux,
if (diseqc(fefd, sat_no, pol, hiband))
if (do_tune(fefd, ifreq, sr))
- if (set_demux(dmxfdv, vpid, DMX_PES_VIDEO, dvr))
+ if (set_pesfilter(dmxfdv, vpid, DMX_PES_VIDEO, dvr))
if (audiofd >= 0)
(void)ioctl(audiofd, AUDIO_SET_BYPASS_MODE, bypass);
- if (set_demux(dmxfda, apid, DMX_PES_AUDIO, dvr)) {
+ if (set_pesfilter(dmxfda, apid, DMX_PES_AUDIO, dvr)) {
if (rec_psi) {
pmtpid = get_pmt_pid(dmxdev, sid);
if (pmtpid < 0) {
@@ -403,8 +316,8 @@ int zap_to(unsigned int adapter, unsigned int frontend, unsigned int demux,
fprintf(stderr,"couldn't find pmt-pid for sid %04x\n",sid);
result = FALSE;
}
- if (set_demux(patfd, 0, DMX_PES_OTHER, dvr))
- if (set_demux(pmtfd, pmtpid, DMX_PES_OTHER, dvr))
+ if (set_pesfilter(patfd, 0, DMX_PES_OTHER, dvr))
+ if (set_pesfilter(pmtfd, pmtpid, DMX_PES_OTHER, dvr))
result = TRUE;
} else {
result = TRUE;
diff --git a/util/szap/tzap.c b/util/szap/tzap.c
index cd87bfa..b24bc2c 100644
--- a/util/szap/tzap.c
+++ b/util/szap/tzap.c
@@ -35,6 +35,8 @@
#include <linux/dvb/frontend.h>
#include <linux/dvb/dmx.h>
+#include "util.h"
+
static char FRONTEND_DEV [80];
static char DEMUX_DEV [80];
static char DVR_DEV [80];
@@ -269,7 +271,8 @@ static int check_fec(fe_code_rate_t *fec)
int parse(const char *fname, const char *channel,
- struct dvb_frontend_parameters *frontend, int *vpid, int *apid)
+ struct dvb_frontend_parameters *frontend, int *vpid, int *apid,
+ int *sid)
{
int fd;
int err;
@@ -343,7 +346,11 @@ int parse(const char *fname, const char *channel,
if ((err = try_parse_int(fd, apid, "Audio PID")))
return -13;
-
+
+ if ((err = try_parse_int(fd, sid, "Service ID")))
+ return -14;
+
+
close(fd);
return 0;
@@ -351,31 +358,6 @@ int parse(const char *fname, const char *channel,
static
-int set_pesfilter (int fd, int pid, dmx_pes_type_t type, int dvr)
-{
- struct dmx_pes_filter_params pesfilter;
-
- if (pid <= 0 || pid >= 0x1fff)
- return 0;
-
- pesfilter.pid = pid;
- pesfilter.input = DMX_IN_FRONTEND;
- pesfilter.output = dvr ? DMX_OUT_TS_TAP : DMX_OUT_DECODER;
- pesfilter.pes_type = type;
- pesfilter.flags = DMX_IMMEDIATE_START;
-
- if (ioctl(fd, DMX_SET_PES_FILTER, &pesfilter) < 0) {
- PERROR ("ioctl(DMX_SET_PES_FILTER) for %s PID failed",
- type == DMX_PES_AUDIO ? "Audio" :
- type == DMX_PES_VIDEO ? "Video" : "??");
- return -1;
- }
-
- return 0;
-}
-
-
-static
int setup_frontend (int fe_fd, struct dvb_frontend_parameters *frontend)
{
struct dvb_frontend_info fe_info;
@@ -503,6 +485,7 @@ static char *usage =
" -c file : read channels list from 'file'\n"
" -x : exit after tuning\n"
" -r : set up /dev/dvb/adapterX/dvr0 for TS recording\n"
+ " -p : add pat and pmt to TS recording (implies -r)\n"
" -s : only print summary\n"
" -S : run silently (no output)\n"
" -H : human readable output\n"
@@ -519,15 +502,16 @@ int main(int argc, char **argv)
char *confname = NULL;
char *channel = NULL;
int adapter = 0, frontend = 0, demux = 0, dvr = 0;
- int vpid, apid;
+ int vpid, apid, sid, pmtpid = 0;
+ int pat_fd, pmt_fd;
int frontend_fd, audio_fd = 0, video_fd = 0, dvr_fd, file_fd;
int opt;
int record = 0;
int frontend_only = 0;
char *filename = NULL;
- int human_readable = 0;
+ int human_readable = 0, rec_psi = 0;
- while ((opt = getopt(argc, argv, "H?hrxRsFSn:a:f:d:c:t:o:")) != -1) {
+ while ((opt = getopt(argc, argv, "H?hrpxRsFSn:a:f:d:c:t:o:")) != -1) {
switch (opt) {
case 'a':
adapter = strtoul(optarg, NULL, 0);
@@ -548,6 +532,9 @@ int main(int argc, char **argv)
case 'r':
dvr = 1;
break;
+ case 'p':
+ rec_psi = 1;
+ break;
case 'x':
exit_after_tuning = 1;
break;
@@ -610,7 +597,7 @@ int main(int argc, char **argv)
memset(&frontend_param, 0, sizeof(struct dvb_frontend_parameters));
- if (parse (confname, channel, &frontend_param, &vpid, &apid))
+ if (parse (confname, channel, &frontend_param, &vpid, &apid, &sid))
return -1;
if ((frontend_fd = open(FRONTEND_DEV, O_RDWR)) < 0) {
@@ -624,6 +611,28 @@ int main(int argc, char **argv)
if (frontend_only)
goto just_the_frontend_dude;
+ if (rec_psi) {
+ pmtpid = get_pmt_pid(DEMUX_DEV, sid);
+ if (pmtpid <= 0) {
+ fprintf(stderr,"couldn't find pmt-pid for sid %04x\n",sid);
+ return -1;
+ }
+
+ if ((pat_fd = open(DEMUX_DEV, O_RDWR)) < 0) {
+ perror("opening pat demux failed");
+ return -1;
+ }
+ if (set_pesfilter(pat_fd, 0, DMX_PES_OTHER, dvr) < 0)
+ return -1;
+
+ if ((pmt_fd = open(DEMUX_DEV, O_RDWR)) < 0) {
+ perror("opening pmt demux failed");
+ return -1;
+ }
+ if (set_pesfilter(pmt_fd, pmtpid, DMX_PES_OTHER, dvr) < 0)
+ return -1;
+ }
+
if ((video_fd = open(DEMUX_DEV, O_RDWR)) < 0) {
PERROR("failed opening '%s'", DEMUX_DEV);
return -1;
@@ -689,6 +698,8 @@ just_the_frontend_dude:
check_frontend (frontend_fd, human_readable);
}
+ close (pat_fd);
+ close (pmt_fd);
close (audio_fd);
close (video_fd);
close (frontend_fd);
diff --git a/util/szap/util.c b/util/szap/util.c
new file mode 100644
index 0000000..301d666
--- /dev/null
+++ b/util/szap/util.c
@@ -0,0 +1,126 @@
+/*
+ * util functions for various ?zap implementations
+ *
+ * Copyright (C) 2001 Johannes Stezenbach (js@convergence.de)
+ * for convergence integrated media
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <string.h>
+#include <unistd.h>
+#include <stdio.h>
+#include <errno.h>
+
+#include <sys/ioctl.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+
+#include <linux/dvb/frontend.h>
+#include <linux/dvb/dmx.h>
+
+
+int set_pesfilter(int dmxfd, int pid, int pes_type, int dvr)
+{
+ struct dmx_pes_filter_params pesfilter;
+
+ /* ignore this pid to allow radio services */
+ if (pid < 0 ||
+ pid >= 0x1fff ||
+ (pid == 0 && pes_type != DMX_PES_OTHER))
+ return 0;
+
+ if (dvr) {
+ int buffersize = 64 * 1024;
+ if (ioctl(dmxfd, DMX_SET_BUFFER_SIZE, buffersize) == -1)
+ perror("DMX_SET_BUFFER_SIZE failed");
+ }
+
+ pesfilter.pid = pid;
+ pesfilter.input = DMX_IN_FRONTEND;
+ pesfilter.output = dvr ? DMX_OUT_TS_TAP : DMX_OUT_DECODER;
+ pesfilter.pes_type = pes_type;
+ pesfilter.flags = DMX_IMMEDIATE_START;
+
+ if (ioctl(dmxfd, DMX_SET_PES_FILTER, &pesfilter) == -1) {
+ fprintf(stderr, "DMX_SET_PES_FILTER failed "
+ "(PID = 0x%04x): %d %m\n", pid, errno);
+ return -1;
+ }
+
+ return 0;
+}
+
+
+int get_pmt_pid(char *dmxdev, int sid)
+{
+ int patfd, count;
+ int pmt_pid = 0;
+ int patread = 0;
+ int section_length;
+ unsigned char buft[4096];
+ unsigned char *buf = buft;
+ struct dmx_sct_filter_params f;
+
+ memset(&f, 0, sizeof(f));
+ f.pid = 0;
+ f.filter.filter[0] = 0x00;
+ f.filter.mask[0] = 0xff;
+ f.timeout = 0;
+ f.flags = DMX_IMMEDIATE_START | DMX_CHECK_CRC;
+
+ if ((patfd = open(dmxdev, O_RDWR)) < 0) {
+ perror("openening pat demux failed");
+ return -1;
+ }
+
+ if (ioctl(patfd, DMX_SET_FILTER, &f) == -1) {
+ perror("ioctl DMX_SET_FILTER failed");
+ close(patfd);
+ return -1;
+ }
+
+ while (!patread){
+ if (((count = read(patfd, buf, sizeof(buft))) < 0) && errno == EOVERFLOW)
+ count = read(patfd, buf, sizeof(buft));
+ if (count < 0) {
+ perror("read_sections: read error");
+ close(patfd);
+ return -1;
+ }
+
+ section_length = ((buf[1] & 0x0f) << 8) | buf[2];
+ if (count != section_length + 3)
+ continue;
+
+ buf += 8;
+ section_length -= 8;
+
+ patread = 1; /* assumes one section contains the whole pat */
+ while (section_length > 0) {
+ int service_id = (buf[0] << 8) | buf[1];
+ if (service_id == sid) {
+ pmt_pid = ((buf[2] & 0x1f) << 8) | buf[3];
+ section_length = 0;
+ }
+ buf += 4;
+ section_length -= 4;
+ }
+ }
+
+ close(patfd);
+ return pmt_pid;
+}
diff --git a/util/szap/util.h b/util/szap/util.h
new file mode 100644
index 0000000..f4b7f12
--- /dev/null
+++ b/util/szap/util.h
@@ -0,0 +1,24 @@
+/*
+ * util functions for various ?zap implementations
+ *
+ * Copyright (C) 2001 Johannes Stezenbach (js@convergence.de)
+ * for convergence integrated media
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+int set_pesfilter(int dmxfd, int pid, int pes_type, int dvr);
+
+int get_pmt_pid(char *dmxdev, int sid);