diff options
author | Klaus Schmidinger <kls (at) cadsoft (dot) de> | 2004-01-04 18:00:00 +0100 |
---|---|---|
committer | Klaus Schmidinger <kls (at) cadsoft (dot) de> | 2004-01-04 18:00:00 +0100 |
commit | 93a94b18b540fbcb9bcdaaea9abd26cdf23d6ee6 (patch) | |
tree | bede17e6cd329d36ec02bc53dfe567b95ec835a5 | |
parent | c432905dd60630f906ac89f58592ad835a9063ef (diff) | |
download | vdr-patch-lnbsharing-93a94b18b540fbcb9bcdaaea9abd26cdf23d6ee6.tar.gz vdr-patch-lnbsharing-93a94b18b540fbcb9bcdaaea9abd26cdf23d6ee6.tar.bz2 |
Version 1.3.0vdr-1.3.0
- Changed thread handling to make it work with NPTL ("Native Posix Thread Library").
Thanks to Jon Burgess, Andreas Schultz, Werner Fink and Stefan Huelswitt.
- The cThread class now accepts a 'Description' parameter, which is used to log
the beginning and end of the thread, together with its process and thread id.
For descriptions that need additional parameters you can use the function
cThread::SetDescription(), which accepts 'printf()' like arguments.
Existing plugins that use threads should be changed to use this functionality
instead of explicit 'dsyslog()' calls inside their Action() function in order
to support logging the thread ids.
- Added "Slovak Link" and "Czech Link" to 'ca.conf' (thanks to Emil Petersky).
However, 'ca.conf' is now pretty much obsolete due to the automatic CA handling.
- Mutexes are now created with PTHREAD_MUTEX_ERRORCHECK_NP, which makes the
'lockingTid' stuff obsolete (thanks to Stefan Huelswitt).
- Changed font handling to allow language specific character sets.
- Adopted the small font character set from the "Elchi" patch (originally
provided by Alessio Sangalli).
- Greek language texts now use iso8859-7 character set (thanks to Dimitrios
Dimitrakos).
- Rearranged section data handling, so that the actual data handling can be done
separately, even from within plugins.
- The EPG data structures have been moved from eit.[hc] to epg.[hc] and have been
adapted to the general VDR coding style. Plugins that use these data structures
may need to change some function names (which should be obvious).
The name 'subtitle' has been changed to 'shortText' to avoid clashes with actual
subtitles that are part of a movie. The name 'extendedDescription' has been
shortened to 'description'.
- Replaced 'libdtv' with 'libsi' (thanks to Marcel Wiesweg), which is thread
safe and can be used by multiple section filters simultaneously.
- Added 'cRwLock' to 'thread.[hc]'. Note that all plugin Makefiles need to
define _GNU_SOURCE for this to work (see the example plugin Makefiles and
'newplugin').
- Fixed a problem with crc32 in SI handling on 64bit systems (thanks to Pedro
Miguel Sequeira de Justo Teixeira for reporting this one).
- Fixed an alignment problem in CAM access on 64bit systems (thanks to Pedro
Miguel Sequeira de Justo Teixeira for reporting this one).
- Added 'StreamType' setting to CAM communication, which is important for
Aston/SECA CAMs (thanks to Antonino Sergi).
- Now the CA descriptors are sent to the CAM in the 'program' or 'ES level'
sections, depending on where they are found in the PMT (thanks to Hans-Peter
Raschke for reporting this one). This should make SkyCrypt CAMs work.
- Now using the 'version number' of EPG events to avoid unnecessary work.
- Channel data is now automatically derived from the DVB data stream (inspired
by the 'autopid' patch from Andreas Schultz).
- The current channel is now automatically re-tuned if the PIDs or other settings
change. If a recording is going on on a channel that has a change in its
settings, the recording will be stopped and immediately restarted to use the
new channel settings.
- EPG events now use the complete channel ID with NID, TID and SID.
- Channel names in 'channels.conf' can now have a short form, as provided
by some tv stations (see man vdr(5)). Currently channels that provide short
names in addition to long ones are listed in the OSD as "short,long name",
as in "RTL,RTL Television". The short names will be used explicitly later.
- The Ca parameter in 'channels.conf' has been extended and now contains all the
CA system ids for the given channel. When switching to a channel VDR now tests
for a device that provides one of these CA system ids. The devices automatically
get their supported ids from the CI handler.
- The values in 'ca.conf' are currently without any real meaning. Whether or not
a channel with conditional access can be received is now determined automatically
by evaluating its CA descriptors and comparing them to the CA system ids
provided by the installed CAM. Only the special values 1-16 are used to assign
a channel to a particular device.
- Increased the maximum number of possible OSD colors to 256.
- Limited the line length in the EPG bugfix report, which appears to fix a buffer
overflow that caused a crash when cleaning up the EPG data (at 05:00 in the
morning).
-rw-r--r-- | CONTRIBUTORS | 25 | ||||
-rw-r--r-- | HISTORY | 70 | ||||
-rw-r--r-- | INSTALL | 12 | ||||
-rw-r--r-- | Makefile | 50 | ||||
-rw-r--r-- | PLUGINS.html | 223 | ||||
-rw-r--r-- | PLUGINS/src/hello/Makefile | 4 | ||||
-rw-r--r-- | PLUGINS/src/osddemo/Makefile | 4 | ||||
-rw-r--r-- | PLUGINS/src/sky/HISTORY | 4 | ||||
-rw-r--r-- | PLUGINS/src/sky/Makefile | 4 | ||||
-rw-r--r-- | PLUGINS/src/sky/sky.c | 12 | ||||
-rw-r--r-- | PLUGINS/src/status/Makefile | 4 | ||||
-rw-r--r-- | README.developer | 83 | ||||
-rw-r--r-- | ca.conf | 2 | ||||
-rw-r--r-- | channels.c | 223 | ||||
-rw-r--r-- | channels.conf | 254 | ||||
-rw-r--r-- | channels.h | 52 | ||||
-rw-r--r-- | ci.c | 71 | ||||
-rw-r--r-- | ci.h | 13 | ||||
-rw-r--r-- | config.h | 8 | ||||
-rw-r--r-- | cutter.c | 6 | ||||
-rw-r--r-- | device.c | 95 | ||||
-rw-r--r-- | device.h | 37 | ||||
-rw-r--r-- | dvbdevice.c | 140 | ||||
-rw-r--r-- | dvbdevice.h | 17 | ||||
-rw-r--r-- | dvbplayer.c | 10 | ||||
-rw-r--r-- | eit.c | 1596 | ||||
-rw-r--r-- | eit.h | 190 | ||||
-rw-r--r-- | eitscan.c | 144 | ||||
-rw-r--r-- | eitscan.h | 7 | ||||
-rw-r--r-- | epg.c | 684 | ||||
-rw-r--r-- | epg.h | 134 | ||||
-rw-r--r-- | filter.c | 126 | ||||
-rw-r--r-- | filter.h | 74 | ||||
-rw-r--r-- | font.c | 78 | ||||
-rw-r--r-- | font.h | 35 | ||||
-rw-r--r-- | fontfix-iso8859-7.c | 6498 | ||||
-rw-r--r-- | fontfix.c | 2 | ||||
-rw-r--r-- | fontosd-iso8859-7.c | 5826 | ||||
-rw-r--r-- | fontosd.c | 2 | ||||
-rw-r--r-- | fontsml-iso8859-7.c | 4930 | ||||
-rw-r--r-- | fontsml.c | 5602 | ||||
-rw-r--r-- | i18n.c | 418 | ||||
-rw-r--r-- | i18n.h | 3 | ||||
-rw-r--r-- | libdtv/COPYING | 339 | ||||
-rw-r--r-- | libdtv/Makefile | 73 | ||||
-rw-r--r-- | libdtv/README | 27 | ||||
-rw-r--r-- | libdtv/liblx/COPYING | 339 | ||||
-rw-r--r-- | libdtv/liblx/Makefile | 62 | ||||
-rw-r--r-- | libdtv/liblx/liblx.h | 449 | ||||
-rw-r--r-- | libdtv/liblx/xListFuncs.c | 189 | ||||
-rw-r--r-- | libdtv/liblx/xMemMgt.c | 624 | ||||
-rw-r--r-- | libdtv/libsi/COPYING | 339 | ||||
-rw-r--r-- | libdtv/libsi/Makefile | 83 | ||||
-rw-r--r-- | libdtv/libsi/README | 2 | ||||
-rw-r--r-- | libdtv/libsi/include/libsi.h | 1248 | ||||
-rw-r--r-- | libdtv/libsi/si_debug_services.c | 674 | ||||
-rw-r--r-- | libdtv/libsi/si_debug_services.h | 245 | ||||
-rw-r--r-- | libdtv/libsi/si_parser.c | 1335 | ||||
-rw-r--r-- | libdtv/libvdr/COPYING | 339 | ||||
-rw-r--r-- | libdtv/libvdr/Makefile | 63 | ||||
-rw-r--r-- | libdtv/libvdr/libvdr.c | 157 | ||||
-rw-r--r-- | libdtv/libvdr/libvdr.h | 111 | ||||
-rw-r--r-- | libsi/Makefile | 52 | ||||
-rw-r--r-- | libsi/descriptor.c | 635 | ||||
-rw-r--r-- | libsi/descriptor.h | 477 | ||||
-rwxr-xr-x | libsi/gendescr.pl | 83 | ||||
-rw-r--r-- | libsi/headers.h (renamed from libdtv/libsi/include/si_tables.h) | 1074 | ||||
-rw-r--r-- | libsi/section.c | 328 | ||||
-rw-r--r-- | libsi/section.h | 252 | ||||
-rw-r--r-- | libsi/si.c | 415 | ||||
-rw-r--r-- | libsi/si.h | 392 | ||||
-rw-r--r-- | libsi/util.c | 281 | ||||
-rw-r--r-- | libsi/util.h | 157 | ||||
-rw-r--r-- | lirc.c | 5 | ||||
-rw-r--r-- | menu.c | 245 | ||||
-rw-r--r-- | menu.h | 13 | ||||
-rwxr-xr-x | newplugin | 4 | ||||
-rw-r--r-- | osdbase.c | 6 | ||||
-rw-r--r-- | osdbase.h | 6 | ||||
-rw-r--r-- | pat.c | 378 | ||||
-rw-r--r-- | pat.h | 43 | ||||
-rw-r--r-- | rcu.c | 5 | ||||
-rw-r--r-- | recorder.c | 7 | ||||
-rw-r--r-- | remote.c | 5 | ||||
-rw-r--r-- | ringbuffer.c | 10 | ||||
-rw-r--r-- | ringbuffer.h | 4 | ||||
-rw-r--r-- | sdt.c | 146 | ||||
-rw-r--r-- | sdt.h | 27 | ||||
-rw-r--r-- | sections.c | 187 | ||||
-rw-r--r-- | sections.h | 45 | ||||
-rw-r--r-- | svdrp.c | 17 | ||||
-rw-r--r-- | thread.c | 112 | ||||
-rw-r--r-- | thread.h | 20 | ||||
-rw-r--r-- | timers.c | 20 | ||||
-rw-r--r-- | timers.h | 6 | ||||
-rw-r--r-- | transfer.c | 7 | ||||
-rw-r--r-- | vdr.5 | 43 | ||||
-rw-r--r-- | vdr.c | 48 |
98 files changed, 30388 insertions, 9637 deletions
diff --git a/CONTRIBUTORS b/CONTRIBUTORS index b1dee06..d2f715d 100644 --- a/CONTRIBUTORS +++ b/CONTRIBUTORS @@ -83,6 +83,8 @@ Dave Chapman <dave@dchapman.com> Hans-Peter Raschke <Hans-Peter.Raschke@Wintermann-DatenService.de> for his support in adapting VDR to DVB-C for adding the 'statdvb2vdr' tool (see Tools/statdvb2vdr) + for reporting that the CA descriptors need to be sent to the CAM in the 'program' + or 'ES level' sections to make SkyCrypt CAMs work Peter Hofmann <software@pxh.de> for his support in adapting VDR to DVB-C @@ -177,6 +179,9 @@ Stefan Huelswitt <huels@iname.com> for fixing an uninitialized variable in cDisplayChannel for fixing a possible access of invalid file handles in cSIProcessor::Action() for fixing extracting the ES data in cDvbDevice::StillPicture() + for changing thread handling to make it work with NPTL ("Native Posix Thread Library") + for creating mutexes with PTHREAD_MUTEX_ERRORCHECK_NP, which made the 'lockingTid' + stuff obsolete Ulrich Röder <roeder@efr-net.de> for pointing out that there are channels that have a symbol rate higher than @@ -210,6 +215,9 @@ Andreas Schultz <aschultz@warp10.net> for changing C++ style comments in libdtv into C style to avoid warnings in gcc 3.x for implementing the TerrestrialDeliverySystemDescriptor in libdtv for fixing setting the locking pid after a timed wait + for changing thread handling to make it work with NPTL ("Native Posix Thread Library") + for his 'autopid' patch which was helpful when implementing automatic + channel data gathering Aaron Holtzman for writing 'ac3dec' @@ -243,6 +251,7 @@ Werner Fink <werner@suse.de> for replacing the 'for' loops in StripAudioPackets() with memset() calls for modifying handling of audio packets in cDvbPlayer for better sync with external AC3 replay + for changing thread handling to make it work with NPTL ("Native Posix Thread Library") Rolf Hakenes <hakenes@hippomi.de> for providing 'libdtv' and adapting the EIT mechanisms to it @@ -403,6 +412,7 @@ Simon Dean <linux-dvb@sickhack.com> Dimitrios Dimitrakos <mail@dimitrios.de> for translating OSD texts to the Greek language for fixing handling the LOG_LOCALn parameters in the -l option + for providing the iso8859-7 fonts Marcus Kuba <marcus@kuba4u.de> for reporting a bug in the unit of the "SVDRP timeout" setup parameter @@ -636,6 +646,7 @@ Marcel Wiesweg <marcel.wiesweg@gmx.de> for reporting a problem with cReceivers that want to receive from PIDs that are currently not transmitting for fixing volume display in case a plugin has its own OSD open + for providing 'libsi' and adapting the EIT mechanisms to it Torsten Herz <torsten.herz@web.de> for fixing a possible deadlock when using the "Blue" button in the "Schedules" menu @@ -762,6 +773,7 @@ Karim Afifi <karim.afifi@free.fr> Jon Burgess <mplayer@jburgess.uklinux.net> for pointing out a problem with NPTL ("Native Posix Thread Library") + for changing thread handling to make it work with NPTL ("Native Posix Thread Library") Thomas Schmidt <thomas.schmidt@in.stud.tu-ilmenau.de> for reporting a crash when cancelling a newly created timer @@ -862,3 +874,16 @@ Luke Jenkins <a@xmission.com> Dirk Mueller <dmuell@gmx.net> for fixing getting the list of recordings in case VDR is started from a directory where it doesn't have access to + +Emil Petersky <petersky@isr.uni-stuttgart.de> + for adding "Slovak Link" and "Czech Link" to 'ca.conf' + +Alessio Sangalli <alesan@manoweb.com> + for providing the iso8859-1 small font + +Pedro Miguel Sequeira de Justo Teixeira <pedro.miguel.teixeira@bigfoot.com> + for reporting a problem with crc32 in SI handling on 64bit systems + for reporting an alignment problem in CAM access on 64bit systems + +Antonino Sergi <voyaser@tiscalinet.it> + for adding 'StreamType' setting to CAM communication @@ -2393,7 +2393,7 @@ Video Disk Recorder Revision History not loaded (suggested by Alexander Wetzel). - Fixed checking for VIDEO_STREAM_S in cRemux::SetBrokenLink() (thanks to Oliver Endriss). -- Added 'repeat' function keys '7' and '9' ("jump to mark") in replay mode +- Added 'repeat' function to keys '7' and '9' ("jump to mark") in replay mode (suggested by Oliver Endriss). - Made cOsdMenu::Display() virtual, which allows plugins to do some additional processing after calling the base class function (suggested by Jan Rieger). @@ -2469,3 +2469,71 @@ Video Disk Recorder Revision History 2003-11-14: Version 1.2.6 - Final release of version 1.2.6. + +2004-01-04: Version 1.3.0 + +- Changed thread handling to make it work with NPTL ("Native Posix Thread Library"). + Thanks to Jon Burgess, Andreas Schultz, Werner Fink and Stefan Huelswitt. +- The cThread class now accepts a 'Description' parameter, which is used to log + the beginning and end of the thread, together with its process and thread id. + For descriptions that need additional parameters you can use the function + cThread::SetDescription(), which accepts 'printf()' like arguments. + Existing plugins that use threads should be changed to use this functionality + instead of explicit 'dsyslog()' calls inside their Action() function in order + to support logging the thread ids. +- Added "Slovak Link" and "Czech Link" to 'ca.conf' (thanks to Emil Petersky). + However, 'ca.conf' is now pretty much obsolete due to the automatic CA handling. +- Mutexes are now created with PTHREAD_MUTEX_ERRORCHECK_NP, which makes the + 'lockingTid' stuff obsolete (thanks to Stefan Huelswitt). +- Changed font handling to allow language specific character sets. +- Adopted the small font character set from the "Elchi" patch (originally + provided by Alessio Sangalli). +- Greek language texts now use iso8859-7 character set (thanks to Dimitrios + Dimitrakos). +- Rearranged section data handling, so that the actual data handling can be done + separately, even from within plugins. +- The EPG data structures have been moved from eit.[hc] to epg.[hc] and have been + adapted to the general VDR coding style. Plugins that use these data structures + may need to change some function names (which should be obvious). + The name 'subtitle' has been changed to 'shortText' to avoid clashes with actual + subtitles that are part of a movie. The name 'extendedDescription' has been + shortened to 'description'. +- Replaced 'libdtv' with 'libsi' (thanks to Marcel Wiesweg), which is thread + safe and can be used by multiple section filters simultaneously. +- Added 'cRwLock' to 'thread.[hc]'. Note that all plugin Makefiles need to + define _GNU_SOURCE for this to work (see the example plugin Makefiles and + 'newplugin'). +- Fixed a problem with crc32 in SI handling on 64bit systems (thanks to Pedro + Miguel Sequeira de Justo Teixeira for reporting this one). +- Fixed an alignment problem in CAM access on 64bit systems (thanks to Pedro + Miguel Sequeira de Justo Teixeira for reporting this one). +- Added 'StreamType' setting to CAM communication, which is important for + Aston/SECA CAMs (thanks to Antonino Sergi). +- Now the CA descriptors are sent to the CAM in the 'program' or 'ES level' + sections, depending on where they are found in the PMT (thanks to Hans-Peter + Raschke for reporting this one). This should make SkyCrypt CAMs work. +- Now using the 'version number' of EPG events to avoid unnecessary work. +- Channel data is now automatically derived from the DVB data stream (inspired + by the 'autopid' patch from Andreas Schultz). +- The current channel is now automatically re-tuned if the PIDs or other settings + change. If a recording is going on on a channel that has a change in its + settings, the recording will be stopped and immediately restarted to use the + new channel settings. +- EPG events now use the complete channel ID with NID, TID and SID. +- Channel names in 'channels.conf' can now have a short form, as provided + by some tv stations (see man vdr(5)). Currently channels that provide short + names in addition to long ones are listed in the OSD as "short,long name", + as in "RTL,RTL Television". The short names will be used explicitly later. +- The Ca parameter in 'channels.conf' has been extended and now contains all the + CA system ids for the given channel. When switching to a channel VDR now tests + for a device that provides one of these CA system ids. The devices automatically + get their supported ids from the CI handler. +- The values in 'ca.conf' are currently without any real meaning. Whether or not + a channel with conditional access can be received is now determined automatically + by evaluating its CA descriptors and comparing them to the CA system ids + provided by the installed CAM. Only the special values 1-16 are used to assign + a channel to a particular device. +- Increased the maximum number of possible OSD colors to 256. +- Limited the line length in the EPG bugfix report, which appears to fix a buffer + overflow that caused a crash when cleaning up the EPG data (at 05:00 in the + morning). @@ -1,19 +1,9 @@ Installation of the Video Disk Recorder --------------------------------------- -Version 1.2 +Version 1.3 ----------- -IMPORTANT NOTE: ---------------- - -VDR currently doesn't work with NPTL ("Native Posix Thread Library"). -Either don't use NPTL, or set the environment variable - - LD_ASSUME_KERNEL=2.4.1 - -before running VDR. - Compiling and running the program: ---------------------------------- @@ -4,7 +4,7 @@ # See the main source file 'vdr.c' for copyright information and # how to reach the author. # -# $Id: Makefile 1.58 2003/08/09 11:09:45 kls Exp $ +# $Id: Makefile 1.62 2003/12/25 13:38:56 kls Exp $ .DELETE_ON_ERROR: @@ -15,7 +15,7 @@ CXX ?= g++ CXXFLAGS ?= -g -O2 -Wall -Woverloaded-virtual DVBDIR = ../DVB -DTVDIR = ./libdtv +LSIDIR = ./libsi MANDIR = /usr/local/man BINDIR = /usr/local/bin @@ -31,16 +31,20 @@ DOXYFILE = Doxyfile INCLUDES = -I$(DVBDIR)/include -DTVLIB = $(DTVDIR)/libdtv.a +SILIB = $(LSIDIR)/libsi.a OBJS = audio.o channels.o ci.o config.o cutter.o device.o diseqc.o dvbdevice.o dvbosd.o\ - dvbplayer.o dvbspu.o eit.o eitscan.o font.o i18n.o interface.o keys.o\ - lirc.o menu.o menuitems.o osdbase.o osd.o player.o plugin.o rcu.o\ - receiver.o recorder.o recording.o remote.o remux.o ringbuffer.o sources.o\ + dvbplayer.o dvbspu.o eit.o eitscan.o epg.o filter.o font.o i18n.o interface.o keys.o\ + lirc.o menu.o menuitems.o osdbase.o osd.o pat.o player.o plugin.o rcu.o\ + receiver.o recorder.o recording.o remote.o remux.o ringbuffer.o sdt.o sections.o sources.o\ spu.o status.o svdrp.o thread.o timers.o tools.o transfer.o vdr.o videodir.o -OSDFONT = -adobe-helvetica-medium-r-normal--23-*-100-100-p-*-iso8859-1 -FIXFONT = -adobe-courier-bold-r-normal--25-*-100-100-m-*-iso8859-1 +FIXFONT_ISO8859_1 = -adobe-courier-bold-r-normal--25-*-100-100-m-*-iso8859-1 +OSDFONT_ISO8859_1 = -adobe-helvetica-medium-r-normal--23-*-100-100-p-*-iso8859-1 +SMLFONT_ISO8859_1 = -adobe-helvetica-medium-r-normal--18-*-100-100-p-*-iso8859-1 +FIXFONT_ISO8859_7 = --user-medium-r-normal--26-171-110-110-m-140-iso8859-7 +OSDFONT_ISO8859_7 = --user-medium-r-normal--23-179-85-85-m-120-iso8859-7 +SMLFONT_ISO8859_7 = --user-medium-r-normal--19-160-72-72-m-110-iso8859-7 ifndef NO_KBD DEFINES += -DREMOTE_KBD @@ -64,7 +68,9 @@ DEFINES += -DVFAT endif all: vdr -font: genfontfile fontfix.c fontosd.c +font: genfontfile\ + fontfix.c fontosd.c fontsml.c\ + fontfix_iso8859_7.c fontosd_iso8859_7.c fontsml_iso8859_7.c @echo "font files created." # Implicit rules: @@ -83,25 +89,33 @@ $(DEPFILE): Makefile # The main program: -vdr: $(OBJS) $(DTVLIB) - $(CXX) $(CXXFLAGS) -rdynamic $(OBJS) $(NCURSESLIB) -ljpeg -lpthread -ldl $(LIBDIRS) $(DTVLIB) -o vdr +vdr: $(OBJS) $(SILIB) + $(CXX) $(CXXFLAGS) -rdynamic $(OBJS) $(NCURSESLIB) -ljpeg -lpthread -ldl $(LIBDIRS) $(SILIB) -o vdr # The font files: fontfix.c: - ./genfontfile "cFont::tPixelData FontFix" "$(FIXFONT)" > $@ + ./genfontfile "cFont::tPixelData FontFix_iso8859_1" "$(FIXFONT_ISO8859_1)" > $@ fontosd.c: - ./genfontfile "cFont::tPixelData FontOsd" "$(OSDFONT)" > $@ + ./genfontfile "cFont::tPixelData FontOsd_iso8859_1" "$(OSDFONT_ISO8859_1)" > $@ +fontsml.c: + ./genfontfile "cFont::tPixelData FontSml_iso8859_1" "$(SMLFONT_ISO8859_1)" > $@ +fontfix_iso8859_1.c: + ./genfontfile "cFont::tPixelData FontFix_iso8859_7" "$(FIXFONT_ISO8859_7)" > $@ +fontosd_iso8859_1.c: + ./genfontfile "cFont::tPixelData FontOsd_iso8859_7" "$(OSDFONT_ISO8859_7)" > $@ +fontsml_iso8859_1.c: + ./genfontfile "cFont::tPixelData FontSml_iso8859_7" "$(SMLFONT_ISO8859_7)" > $@ # The font file generator: genfontfile: genfontfile.c $(CC) $(CFLAGS) -o $@ -L/usr/X11R6/lib $< -lX11 -# The libdtv library: +# The libsi library: -$(DTVLIB) $(DTVDIR)/libdtv.h: - $(MAKE) -C $(DTVDIR) all +$(SILIB): + $(MAKE) -C $(LSIDIR) all # The 'include' directory (for plugins): @@ -140,11 +154,11 @@ srcdoc: # Housekeeping: clean: - $(MAKE) -C $(DTVDIR) clean + $(MAKE) -C $(LSIDIR) clean -rm -f $(OBJS) $(DEPFILE) vdr genfontfile genfontfile.o core* *~ -rm -rf include -rm -rf srcdoc fontclean: - -rm -f fontfix.c fontosd.c + -rm -f fontfix*.c fontosd*.c fontsml*.c CLEAN: clean fontclean diff --git a/PLUGINS.html b/PLUGINS.html index 95ba5d7..d13ca4a 100644 --- a/PLUGINS.html +++ b/PLUGINS.html @@ -6,7 +6,7 @@ <center><h1>The VDR Plugin System</h1></center> -<center><b>Version 1.2.6</b></center> +<center><b>Version 1.3</b></center> <p> <center> Copyright © 2003 Klaus Schmidinger<br> @@ -14,9 +14,12 @@ Copyright © 2003 Klaus Schmidinger<br> <a href="http://www.cadsoft.de/vdr">www.cadsoft.de/vdr</a> </center> <p> -<!--X1.1.32--><table width=100%><tr><td bgcolor=#FF0000> </td><td width=100%> +<!--X1.2.6--><table width=100%><tr><td bgcolor=#AA0000> </td><td width=100%> Important modifications introduced in version 1.2.6 are marked like this. -<!--X1.1.32--></td></tr></table> +<!--X1.2.6--></td></tr></table> +<!--X1.3.0--><table width=100%><tr><td bgcolor=#FF0000> </td><td width=100%> +Important modifications introduced in version 1.3.0 are marked like this. +<!--X1.3.0--></td></tr></table> <p> VDR provides an easy to use plugin interface that allows additional functionality to be added to the program by implementing a dynamically loadable library file. @@ -64,6 +67,9 @@ structures and allows it to hook itself into specific areas to perform special a <li><a href="#Status monitor">Status monitor</a> <li><a href="#Players">Players</a> <li><a href="#Receivers">Receivers</a> +<!--X1.3.0--><table width=100%><tr><td bgcolor=#FF0000> </td><td width=100%> +<li><a href="#Filters">Filters</a> +<!--X1.3.0--></td></tr></table> <li><a href="#The On Screen Display">The On Screen Display</a> <li><a href="#Devices">Devices</a> <li><a href="#Dolby Digital">Dolby Digital</a> @@ -112,7 +118,7 @@ No other characters should be used here. <p> A plugin can access its name through the (non virtual) member function -<p><table><tr><td bgcolor=#F0F0F0><pre><br> +<p><table><tr><td bgcolor=#F0F0F0><pre> const char *Name(void); </pre></td></tr></table><p> @@ -127,7 +133,7 @@ By default plugins are located in a directory named <tt>PLUGINS</tt> below the VDR source directory. Inside this directory the following subdirectory structure is used: -<p><table><tr><td bgcolor=#F0F0F0><pre><br> +<p><table><tr><td bgcolor=#F0F0F0><pre> VDR/PLUGINS/src VDR/PLUGINS/src/hello VDR/PLUGINS/lib @@ -172,7 +178,7 @@ To use the <tt>plugins</tt> and <tt>plugins-clean</tt> targets from the VDR <tt> you need to unpack such an archive into the <tt>VDR/PLUGINS/src</tt> directory and create a symbolic link with the basic plugin name, as in -<p><table><tr><td bgcolor=#F0F0F0><pre><br> +<p><table><tr><td bgcolor=#F0F0F0><pre> ln -s hello-0.0.1 hello </pre></td></tr></table><p> @@ -226,7 +232,7 @@ If your plugin shall not be accessible through VDR's main menu, simply remove <p> At the end of the plugin's source file you will find a line that looks like this: -<p><table><tr><td bgcolor=#F0F0F0><pre><br> +<p><table><tr><td bgcolor=#F0F0F0><pre> VDRPLUGINCREATOR(cPluginHello); </pre></td></tr></table><p> @@ -239,7 +245,7 @@ source directory and adjust the <tt>Makefile</tt> accordingly. Header files usually contain preprocessor statements that prevent the same file (or rather its contents, to be precise) from being included more than once, like -<p><table><tr><td bgcolor=#F0F0F0><pre><br> +<p><table><tr><td bgcolor=#F0F0F0><pre> #ifndef __I18N_H #define __I18N_H @@ -274,7 +280,7 @@ and two replacing the dot). The constructor and destructor of a plugin are defined as -<p><table><tr><td bgcolor=#F0F0F0><pre><br> +<p><table><tr><td bgcolor=#F0F0F0><pre> cPlugin(void); virtual ~cPlugin(); </pre></td></tr></table><p> @@ -304,7 +310,7 @@ Every plugin must have a version number of its own, which does not necessarily have to be in any way related to the VDR version number. VDR requests a plugin's version number through a call to the function -<p><table><tr><td bgcolor=#F0F0F0><pre><br> +<p><table><tr><td bgcolor=#F0F0F0><pre> virtual const char *Version(void) = 0; </pre></td></tr></table><p> @@ -315,7 +321,7 @@ information, like for instance "0.0.1pre2" or the like. The string should only be as long as really necessary, and shall not contain the plugin's name itself. Here's an example: -<p><table><tr><td bgcolor=#F0F0F0><pre><br> +<p><table><tr><td bgcolor=#F0F0F0><pre> static const char *VERSION = "0.0.1"; const char *cPluginHello::Version(void) @@ -347,13 +353,13 @@ would be acceptable. In order to tell the user what exactly a plugin does, it must implement the function -<p><table><tr><td bgcolor=#F0F0F0><pre><br> +<p><table><tr><td bgcolor=#F0F0F0><pre> virtual const char *Description(void) = 0; </pre></td></tr></table><p> which returns a short, one line description of the plugin's purpose: -<p><table><tr><td bgcolor=#F0F0F0><pre><br> +<p><table><tr><td bgcolor=#F0F0F0><pre> static const char *DESCRIPTION = "A friendly greeting"; virtual const char *Description(void) @@ -373,7 +379,7 @@ A VDR plugin can have command line arguments just like any normal program. If a plugin wants to react on command line arguments, it needs to implement the function -<p><table><tr><td bgcolor=#F0F0F0><pre><br> +<p><table><tr><td bgcolor=#F0F0F0><pre> virtual bool ProcessArgs(int argc, char *argv[]); </pre></td></tr></table><p> @@ -390,7 +396,7 @@ these arguments. As with any normal C program, the strings pointed to by <tt>arg will survive the entire lifetime of the plugin, so it is safe to store pointers to these values inside the plugin. Here's an example: -<p><table><tr><td bgcolor=#F0F0F0><pre><br> +<p><table><tr><td bgcolor=#F0F0F0><pre> bool cPluginHello::ProcessArgs(int argc, char *argv[]) { // Implement command line argument processing here if applicable. @@ -425,7 +431,7 @@ to exit. If a plugin accepts command line options, it should implement the function -<p><table><tr><td bgcolor=#F0F0F0><pre><br> +<p><table><tr><td bgcolor=#F0F0F0><pre> virtual const char *CommandLineHelp(void); </pre></td></tr></table><p> @@ -433,7 +439,7 @@ which will be called if the user enters the <b><tt>-h</tt></b> option when start The returned string should contain the command line help for this plugin, formatted in the same way as done by VDR itself: -<p><table><tr><td bgcolor=#F0F0F0><pre><br> +<p><table><tr><td bgcolor=#F0F0F0><pre> const char *cPluginHello::CommandLineHelp(void) { // Return a string that describes all known command line options. @@ -456,7 +462,7 @@ If a plugin implements a function that runs in the background (presumably in a thread of its own), or wants to make use of <a href="#Internationalization">internationalization</a>, it needs to implement one of the functions -<p><table><tr><td bgcolor=#F0F0F0><pre><br> +<p><table><tr><td bgcolor=#F0F0F0><pre> virtual bool Initialize(void); virtual bool Start(void); </pre></td></tr></table><p> @@ -493,7 +499,7 @@ texts, it doesn't need to implement either of these functions. If the plugin implements a feature that the user shall be able to access from VDR's main menu, it needs to implement the function -<p><table><tr><td bgcolor=#F0F0F0><pre><br> +<p><table><tr><td bgcolor=#F0F0F0><pre> virtual const char *MainMenuEntry(void); </pre></td></tr></table><p> @@ -501,7 +507,7 @@ The default implementation returns a <tt>NULL</tt> pointer, which means that this plugin will not have an item in the main menu. Here's an example of a plugin that will have a main menu item: -<p><table><tr><td bgcolor=#F0F0F0><pre><br> +<p><table><tr><td bgcolor=#F0F0F0><pre> static const char *MAINMENUENTRY = "Hello"; const char *cPluginHello::MainMenuEntry(void) @@ -520,7 +526,7 @@ in the call to VDR. If the user selects the main menu entry of a plugin, VDR calls the function -<p><table><tr><td bgcolor=#F0F0F0><pre><br> +<p><table><tr><td bgcolor=#F0F0F0><pre> virtual cOsdObject *MainMenuAction(void); </pre></td></tr></table><p> @@ -554,7 +560,7 @@ the plugin should launch a separate thread to do this. From time to time a plugin may want to do some regular tasks, like cleaning up some files or other things. In order to do this it can implement the function -<p><table><tr><td bgcolor=#F0F0F0><pre><br> +<p><table><tr><td bgcolor=#F0F0F0><pre> virtual void Housekeeping(void); </pre></td></tr></table><p> @@ -579,7 +585,7 @@ the plugin should launch a separate thread to do this. If a plugin requires its own setup parameters, it needs to implement the following functions to handle these parameters: -<p><table><tr><td bgcolor=#F0F0F0><pre><br> +<p><table><tr><td bgcolor=#F0F0F0><pre> virtual cMenuSetupPage *SetupMenu(void); virtual bool SetupParse(const char *Name, const char *Value); </pre></td></tr></table><p> @@ -594,7 +600,7 @@ an error. If <i>false</i> is returned, an error message will be written to the log file (and program execution will continue). A possible implementation of <tt>SetupParse()</tt> could look like this: -<p><table><tr><td bgcolor=#F0F0F0><pre><br> +<p><table><tr><td bgcolor=#F0F0F0><pre> bool cPluginHello::SetupParse(const char *Name, const char *Value) { // Parse your own setup parameters and store their values. @@ -620,7 +626,7 @@ plugins need not worry about this. <p> To store its values in the global setup, a plugin has to call the function -<p><table><tr><td bgcolor=#F0F0F0><pre><br> +<p><table><tr><td bgcolor=#F0F0F0><pre> void SetupStore(const char *Name, <i>type</i> Value); </pre></td></tr></table><p> @@ -653,7 +659,7 @@ To implement a <i>Setup</i> menu, a plugin needs to derive a class from <tt>cMenuSetupPage</tt> and implement its constructor and the pure virtual <tt>Store()</tt> member function: -<p><table><tr><td bgcolor=#F0F0F0><pre><br> +<p><table><tr><td bgcolor=#F0F0F0><pre> int GreetingTime = 3; int UseAlternateGreeting = false; @@ -714,7 +720,7 @@ configuration file. While the plugin is free to store such files anywhere it sees fit, it might be a good idea to put them in a common place, preferably where other configuration data already exists. VDR provides the function -<p><table><tr><td bgcolor=#F0F0F0><pre><br> +<p><table><tr><td bgcolor=#F0F0F0><pre> const char *ConfigDirectory(const char *PluginName = NULL); </pre></td></tr></table><p> @@ -737,7 +743,7 @@ these in a subdirectory of its own, named after the plugin. To easily get such a the <tt>ConfigDirectory()</tt> function can be given an additional string that will be appended to the returned directory name, as in -<p><table><tr><td bgcolor=#F0F0F0><pre><br> +<p><table><tr><td bgcolor=#F0F0F0><pre> const char *MyConfigDir = ConfigDirectory(Name()); </pre></td></tr></table><p> @@ -754,7 +760,7 @@ The <tt>ConfigDirectory()</tt> function is a static member function of the <tt>c class. This allows it to be called even from outside any member function of the derived plugin class, by writing -<p><table><tr><td bgcolor=#F0F0F0><pre><br> +<p><table><tr><td bgcolor=#F0F0F0><pre> const char *MyConfigDir = cPlugin::ConfigDirectory(); </pre></td></tr></table><p> @@ -765,7 +771,7 @@ const char *MyConfigDir = cPlugin::ConfigDirectory(); If a plugin displays texts to the user, it should implement internationalized versions of these texts and call the function -<p><table><tr><td bgcolor=#F0F0F0><pre><br> +<p><table><tr><td bgcolor=#F0F0F0><pre> void RegisterI18n(const tI18nPhrase * const Phrases); </pre></td></tr></table><p> @@ -774,7 +780,7 @@ to register them with VDR's internationalization mechanism. The call to this function must be done in the <a href="#Getting started"><tt>Initialize()</tt></a> or <a href="#Getting started"><tt>Start()</tt></a> function of the plugin: -<p><table><tr><td bgcolor=#F0F0F0><pre><br> +<p><table><tr><td bgcolor=#F0F0F0><pre> const tI18nPhrase Phrases[] = { { "Hello world!", "Hallo Welt!", @@ -815,7 +821,7 @@ you may want to contact the maintainers of these languages (listed in the file The actual runtime selection of the texts corresponding to the selected language is done by wrapping each internationalized text with the <tt>tr()</tt> macro: -<p><table><tr><td bgcolor=#F0F0F0><pre><br> +<p><table><tr><td bgcolor=#F0F0F0><pre> const char *s = tr("Hello world!"); </pre></td></tr></table><p> @@ -833,20 +839,20 @@ core VDR code. Plugins are loaded into VDR using the command line option <b><tt>-P</tt></b>, as in -<p><table><tr><td bgcolor=#F0F0F0><pre><br> +<p><table><tr><td bgcolor=#F0F0F0><pre> vdr -Phello </pre></td></tr></table><p> If the plugin accepts command line options, they are given as part of the argument to the <b><tt>-P</tt></b> option, which then has to be enclosed in quotes: -<p><table><tr><td bgcolor=#F0F0F0><pre><br> +<p><table><tr><td bgcolor=#F0F0F0><pre> vdr -P"hello -a abc -b" </pre></td></tr></table><p> Any number of plugins can be loaded this way, each with its own <b><tt>-P</tt></b> option: -<p><table><tr><td bgcolor=#F0F0F0><pre><br> +<p><table><tr><td bgcolor=#F0F0F0><pre> vdr -P"hello -a abc -b" -Pdvd -Pmp3 </pre></td></tr></table><p> @@ -854,7 +860,7 @@ If you are not starting VDR from the VDR source directory (and thus your plugins cannot be found at their default location) you need to tell VDR the location of the plugins through the <b><tt>-L</tt></b> option: -<p><table><tr><td bgcolor=#F0F0F0><pre><br> +<p><table><tr><td bgcolor=#F0F0F0><pre> vdr -L/usr/lib/vdr -Phello </pre></td></tr></table><p> @@ -879,14 +885,14 @@ provides the target <tt>dist</tt>, which does this for you. <p> Simply change into your source directory and execute <tt>make dist</tt>: -<p><table><tr><td bgcolor=#F0F0F0><pre><br> +<p><table><tr><td bgcolor=#F0F0F0><pre> cd VDR/PLUGINS/src/hello make dist </pre></td></tr></table><p> After this you should find a file named like -<p><table><tr><td bgcolor=#F0F0F0><pre><br> +<p><table><tr><td bgcolor=#F0F0F0><pre> vdr-hello-0.0.1.tgz </pre></td></tr></table><p> @@ -902,7 +908,7 @@ plugin's name, and <tt>0.0.1</tt> will be your plugin's current version number. If a plugin wants to get informed on various events in VDR, it can derive a class from <tt>cStatus</tt>, as in -<p><table><tr><td bgcolor=#F0F0F0><pre><br> +<p><table><tr><td bgcolor=#F0F0F0><pre> #include <vdr/status.h> class cMyStatusMonitor : public cStatus { @@ -922,7 +928,7 @@ void cMyStatusMonitor::ChannelSwitch(const cDevice *Device, int ChannelNumber) An object of this class will be informed whenever the channel is switched on one of the DVB devices. It could be used in a plugin like this: -<p><table><tr><td bgcolor=#F0F0F0><pre><br> +<p><table><tr><td bgcolor=#F0F0F0><pre> #include <vdr/plugin.h> class cPluginStatus : public cPlugin { @@ -975,7 +981,7 @@ the functions you actually want to use. Implementing a player is a two step process. First you need the actual player class, which is derived from the abstract <tt>cPlayer</tt>: -<p><table><tr><td bgcolor=#F0F0F0><pre><br> +<p><table><tr><td bgcolor=#F0F0F0><pre> #include <vdr/player.h> class cMyPlayer : public cPlayer { @@ -991,7 +997,7 @@ What exactly you do in this class is entirely up to you. If you want to run a se thread which, e.g., reads data from a file, you can additionally derive your class from <tt>cThread</tt> and implement the necessary functionality: -<p><table><tr><td bgcolor=#F0F0F0><pre><br> +<p><table><tr><td bgcolor=#F0F0F0><pre> #include <vdr/player.h> class cMyPlayer : public cPlayer, cThread { @@ -1009,7 +1015,7 @@ its own player for the VDR recordings. <p> To play the video data, the player needs to call its member function -<p><table><tr><td bgcolor=#F0F0F0><pre><br> +<p><table><tr><td bgcolor=#F0F0F0><pre> int PlayVideo(const uchar *Data, int Length); </pre></td></tr></table><p> @@ -1020,7 +1026,7 @@ desired video data stream, and it must be delivered fast enough so that the DVB device doesn't run out of data. To avoid busy loops the player should call its member function -<p><table><tr><td bgcolor=#F0F0F0><pre><br> +<p><table><tr><td bgcolor=#F0F0F0><pre> bool DevicePoll(cPoller &Poller, int TimeoutMs = 0); </pre></td></tr></table><p> @@ -1029,7 +1035,7 @@ to determine whether the device is ready for further data. If the player can provide more than a single audio track, it can implement the following functions to make them available: -<p><table><tr><td bgcolor=#F0F0F0><pre><br> +<p><table><tr><td bgcolor=#F0F0F0><pre> virtual int NumAudioTracks(void) const; virtual const char **GetAudioTracks(int *CurrentTrack = NULL); virtual void SetAudioTrack(int Index); @@ -1039,7 +1045,7 @@ virtual void SetAudioTrack(int Index); If there is an additional audio track that has to be replayed with external hardware, the player shall call its member function -<p><table><tr><td bgcolor=#F0F0F0><pre><br> +<p><table><tr><td bgcolor=#F0F0F0><pre> void PlayAudio(const uchar *Data, int Length); </pre></td></tr></table><p> @@ -1048,7 +1054,7 @@ where <tt>Data</tt> points to a complete audio PES packet of <tt>Length</tt> byt The second part needed here is a control object that receives user input from the main program loop and reacts on this by telling the player what to do: -<p><table><tr><td bgcolor=#F0F0F0><pre><br> +<p><table><tr><td bgcolor=#F0F0F0><pre> #include <vdr/player.h> class cMyControl : public cControl { @@ -1066,7 +1072,7 @@ public: hand over a pointer to it to the <tt>cControl</tt> base class, so that it can be later attached to the primary DVB device: -<p><table><tr><td bgcolor=#F0F0F0><pre><br> +<p><table><tr><td bgcolor=#F0F0F0><pre> cMyControl::cMyControl(void) :cControl(player = new cMyPlayer) { @@ -1093,7 +1099,7 @@ Finally, to get things going, a plugin that implements a player (and the surroun infrastructure like displaying a list of playable stuff etc) simply has to call the static function <tt>cControl::Launch()</tt> with the player control object, as in -<p><table><tr><td bgcolor=#F0F0F0><pre><br> +<p><table><tr><td bgcolor=#F0F0F0><pre> cControl::Launch(new cMyControl); </pre></td></tr></table><p> @@ -1104,7 +1110,7 @@ use the primary DVB device, or the user decides to start a different replay). <p> The <tt>cPlayer</tt> class has a member function -<p><table><tr><td bgcolor=#F0F0F0><pre><br> +<p><table><tr><td bgcolor=#F0F0F0><pre> void DeviceStillPicture(const uchar *Data, int Length); </pre></td></tr></table><p> @@ -1149,7 +1155,7 @@ ahead - it's your show... In order to receive any kind of data from a <tt>cDevice</tt>, a plugin must set up an object derived from the <tt>cReceiver</tt> class: -<p><table><tr><td bgcolor=#F0F0F0><pre><br> +<p><table><tr><td bgcolor=#F0F0F0><pre> #include <vdr/receiver.h> class cMyReceiver : public cReceiver, cThread { @@ -1187,7 +1193,7 @@ a <tt>cReceiver</tt> to be detached from its <tt>cDevice</tt> at any time. Once a <tt>cReceiver</tt> has been created, it needs to be <i>attached</i> to a <tt>cDevice</tt>: -<p><table><tr><td bgcolor=#F0F0F0><pre><br> +<p><table><tr><td bgcolor=#F0F0F0><pre> cMyReceiver *Receiver = new cMyReceiver(123); cDevice::ActualDevice()->AttachReceiver(Receiver); @@ -1201,6 +1207,52 @@ Mode</i>). If the <tt>cReceiver</tt> isn't needed any more, it may simply be <i>deleted</i> and will automatically detach itself from the <tt>cDevice</tt>. +<!--X1.3.0--><table width=100%><tr><td bgcolor=#FF0000> </td><td width=100%> +<a name="Filters"><hr><h2>Filters</h2> + +<center><i><b>A Fistful of Datas</b></i></center><p> + +If you want to receive section data you have to implement a derived <tt>cFilter</tt> +class which at least implements the <tt>Process()</tt> function and a constructor +that sets the (initial) filter parameters: + +<p><table><tr><td bgcolor=#F0F0F0><pre> +#include <vdr/filter.h> + +class cMyFilter : public cFilter { +protected: + virtual void Process(u_short Pid, u_char Tid, const u_char *Data, int Length); +public: + cMyFilter(void); + ... + }; + +cMyFilter::cMyFilter(void) +{ + Set(0x14, 0x70); // TDT +} + +void cMyFilter::Process(u_short Pid, u_char Tid, const u_char *Data, int Length) +{ + // do something with the data here +} +</pre></td></tr></table><p> + +An instance of such a filter needs to be attached to the device from +which it shall receive data, as in + +<p><table><tr><td bgcolor=#F0F0F0><pre> +cMyFilter Filter; + +cDevice::ActualDevice()->AttachFilter(Filter); +</pre></td></tr></table><p> + +If the <tt>cFilter</tt> isn't needed any more, it may simply be <i>deleted</i> +and will automatically detach itself from the <tt>cDevice</tt>. +<p> +See VDR/eit.c or VDR/pat.c to learn how to process filter data. +<!--X1.3.0--></td></tr></table> + <a name="The On Screen Display"><hr><h2>The On Screen Display</h2> <center><i><b>Express yourself</b></i></center><p> @@ -1213,7 +1265,7 @@ windows and color depths. If a plugin needs to have total control over the OSD, it can call the static function -<p><table><tr><td bgcolor=#F0F0F0><pre><br> +<p><table><tr><td bgcolor=#F0F0F0><pre> #include <vdr/osd.h> cOsdBase *MyOsd = cOsd::OpenRaw(x, y); @@ -1223,7 +1275,7 @@ where <tt>x</tt> and <tt>y</tt> are the coordinates of the upper left corner of the OSD area on the screen. Such a "raw" OSD doesn't display anything yet, so you need to at least call the function -<p><table><tr><td bgcolor=#F0F0F0><pre><br> +<p><table><tr><td bgcolor=#F0F0F0><pre> MyOsd->Create(...); </pre></td></tr></table><p> @@ -1247,7 +1299,7 @@ stream and displays it, for instance, on an existing graphics adapter. <p> To implement an additional device, a plugin must derive a class from cDevice: -<p><table><tr><td bgcolor=#F0F0F0><pre><br> +<p><table><tr><td bgcolor=#F0F0F0><pre> #include <vdr/device.h> class cMyDevice : public cDevice { @@ -1266,7 +1318,7 @@ the <tt>cDvbDevice</tt>, which is used to access the DVB PCI cards. If the new device can receive, it most likely needs to provide a way of selecting which channel it shall tune to: -<p><table><tr><td bgcolor=#F0F0F0><pre><br> +<p><table><tr><td bgcolor=#F0F0F0><pre> virtual bool ProvidesSource(int Source) const; virtual bool ProvidesChannel(const cChannel *Channel, int Priority = -1, bool *NeedsDetachReceivers = NULL); virtual bool SetChannelDevice(const cChannel *Channel, bool LiveView); @@ -1281,7 +1333,7 @@ repectively. If the device can provide more than a single audio track, it can implement the following functions to make them available: -<p><table><tr><td bgcolor=#F0F0F0><pre><br> +<p><table><tr><td bgcolor=#F0F0F0><pre> virtual int NumAudioTracksDevice(void) const; virtual const char **GetAudioTracksDevice(int *CurrentTrack = NULL) const; virtual void SetAudioTrackDevice(int Index); @@ -1292,7 +1344,7 @@ virtual void SetAudioTrackDevice(int Index); <p> A device that can be used for recording must implement the functions -<p><table><tr><td bgcolor=#F0F0F0><pre><br> +<p><table><tr><td bgcolor=#F0F0F0><pre> virtual bool SetPid(cPidHandle *Handle, int Type, bool On); virtual bool OpenDvr(void); virtual void CloseDvr(void); @@ -1308,7 +1360,7 @@ must deliver exactly one such packet (if one is currently available). If this device allows receiving several different data streams, it can implement -<p><table><tr><td bgcolor=#F0F0F0><pre><br> +<p><table><tr><td bgcolor=#F0F0F0><pre> virtual bool CanBeReUsed(int Frequency, int Vpid); </pre></td></tr></table><p> @@ -1318,13 +1370,13 @@ to indicate this to VDR. <p> The functions to implement replaying capabilites are -<p><table><tr><td bgcolor=#F0F0F0><pre><br> +<p><table><tr><td bgcolor=#F0F0F0><pre> virtual bool HasDecoder(void) const; virtual bool CanReplay(void) const; virtual bool SetPlayMode(ePlayMode PlayMode); -<!--X1.1.32--><table width=100%><tr><td bgcolor=#FF0000> </td><td width=100%> +<!--X1.2.6--><table width=100%><tr><td bgcolor=#AA0000> </td><td width=100%> virtual int64_t GetSTC(void); -<!--X1.1.32--></td></tr></table> +<!--X1.2.6--></td></tr></table> virtual void TrickSpeed(int Speed); virtual void Clear(void); virtual void Play(void); @@ -1338,12 +1390,39 @@ virtual int PlayVideo(const uchar *Data, int Length); In addition, the following functions may be implemented to provide further functionality: -<p><table><tr><td bgcolor=#F0F0F0><pre><br> +<p><table><tr><td bgcolor=#F0F0F0><pre> virtual bool GrabImage(const char *FileName, bool Jpeg = true, int Quality = -1, int Si virtual void SetVideoFormat(bool VideoFormat16_9); virtual void SetVolumeDevice(int Volume); </pre></td></tr></table><p> +<!--X1.3.0--><table width=100%><tr><td bgcolor=#FF0000> </td><td width=100%> +<p> +<b>Section Filtering</b> +<p> +If your device provides section filtering capabilities it can implement +the function + +<p><table><tr><td bgcolor=#F0F0F0><pre> +virtual int OpenFilter(u_short Pid, u_char Tid, u_char Mask); +</pre></td></tr></table><p> + +which must open a file handle that delivers section data for the given +filter parameters. +<p> +In order to actually start section handling, the +device also needs to call the function + +<p><table><tr><td bgcolor=#F0F0F0><pre> +StartSectionHandler(); +</pre></td></tr></table><p> + +from its constructor. +<p> +See <a href="#Filters">Filters</a> on how to set up actual filters that can +handle section data. +<!--X1.3.0--></td></tr></table> + <p> <b>On Screen Display</b> <p> @@ -1351,7 +1430,7 @@ If your device provides On Screen Display (OSD) capabilities (which every device that is supposed to be used as a primary device should do), it can implement the function -<p><table><tr><td bgcolor=#F0F0F0><pre><br> +<p><table><tr><td bgcolor=#F0F0F0><pre> virtual cOsdBase *NewOsd(int x, int y); </pre></td></tr></table><p> @@ -1391,7 +1470,7 @@ audio replay facility. To implement a new audio output facility, simply derive a class from <tt>cAudio</tt>, as in -<p><table><tr><td bgcolor=#F0F0F0><pre><br> +<p><table><tr><td bgcolor=#F0F0F0><pre> #include <vdr/audio.h> #include <vdr/thread.h> @@ -1435,7 +1514,7 @@ remote control, so a plugin can use the <tt>cRemote</tt> class to do that. The simplest method for a plugin to issue commands to VDR is to call the static function <tt>cRemote::Put(eKeys Key)</tt>, as in -<p><table><tr><td bgcolor=#F0F0F0><pre><br> +<p><table><tr><td bgcolor=#F0F0F0><pre> cRemote::Put(kUp); </pre></td></tr></table><p> @@ -1447,7 +1526,7 @@ In cases where the incoming codes are not known, or not all available keys may be supported by the actual remote control in use, you may want to derive your own remote control class from <tt>cRemote</tt>, as in -<p><table><tr><td bgcolor=#F0F0F0><pre><br> +<p><table><tr><td bgcolor=#F0F0F0><pre> #include <vdr/remote.h> #include <vdr/thread.h> @@ -1472,7 +1551,7 @@ when the program ends). <p> The constructor of your remote control class should look like this -<p><table><tr><td bgcolor=#F0F0F0><pre><br> +<p><table><tr><td bgcolor=#F0F0F0><pre> cMyRemote::cMyRemote(const char *Name) :cRemote(Name) { @@ -1492,7 +1571,7 @@ member variables, you should do so before calling <tt>Start()</tt>. If your remote control for some reason can't work (maybe because it was unable to open some file handle it requires) it can implement the virtual function -<p><table><tr><td bgcolor=#F0F0F0><pre><br> +<p><table><tr><td bgcolor=#F0F0F0><pre> virtual bool Ready(void); </pre></td></tr></table><p> @@ -1513,7 +1592,7 @@ If your remote control class needs some setup data that shall be readily available next time VDR starts (without having to go through the initialization procedure again) it can use the <tt>cRemote</tt> member functions -<p><table><tr><td bgcolor=#F0F0F0><pre><br> +<p><table><tr><td bgcolor=#F0F0F0><pre> void PutSetup(const char *Setup); const char *GetSetup(void); </pre></td></tr></table><p> @@ -1527,7 +1606,7 @@ The <tt>cRemote</tt> class assumes that any incoming remote control code can be expressed as a character string. So whatever data your remote control provides needs to be given to the base class by calling -<p><table><tr><td bgcolor=#F0F0F0><pre><br> +<p><table><tr><td bgcolor=#F0F0F0><pre> Put(const char *Code, bool Repeat = false, bool Release = false); </pre></td></tr></table><p> @@ -1538,7 +1617,7 @@ Since a common case for remote control data is to be given as a numerical value, there is another <tt>Put()</tt> function available for your convenience, which takes a 64 bit unsigned integer value instead of a character string: -<p><table><tr><td bgcolor=#F0F0F0><pre><br> +<p><table><tr><td bgcolor=#F0F0F0><pre> Put(uint64 Code, bool Repeat = false, bool Release = false); </pre></td></tr></table><p> diff --git a/PLUGINS/src/hello/Makefile b/PLUGINS/src/hello/Makefile index 068f6e9..9f35d20 100644 --- a/PLUGINS/src/hello/Makefile +++ b/PLUGINS/src/hello/Makefile @@ -1,7 +1,7 @@ # # Makefile for a Video Disk Recorder plugin # -# $Id: Makefile 1.8 2002/12/13 14:54:14 kls Exp $ +# $Id: Makefile 1.9 2003/12/21 15:47:22 kls Exp $ # The official name of this plugin. # This name will be used in the '-P...' option of VDR to load the plugin. @@ -42,7 +42,7 @@ PACKAGE = vdr-$(ARCHIVE) INCLUDES += -I$(VDRDIR)/include -I$(DVBDIR)/include -DEFINES += -DPLUGIN_NAME_I18N='"$(PLUGIN)"' +DEFINES += -D_GNU_SOURCE -DPLUGIN_NAME_I18N='"$(PLUGIN)"' ### The object files (add further files here): diff --git a/PLUGINS/src/osddemo/Makefile b/PLUGINS/src/osddemo/Makefile index db87161..8116d05 100644 --- a/PLUGINS/src/osddemo/Makefile +++ b/PLUGINS/src/osddemo/Makefile @@ -1,7 +1,7 @@ # # Makefile for a Video Disk Recorder plugin # -# $Id: Makefile 1.2 2002/12/13 14:54:29 kls Exp $ +# $Id: Makefile 1.3 2003/12/21 15:47:26 kls Exp $ # The official name of this plugin. # This name will be used in the '-P...' option of VDR to load the plugin. @@ -42,7 +42,7 @@ PACKAGE = vdr-$(ARCHIVE) INCLUDES += -I$(VDRDIR)/include -I$(DVBDIR)/include -DEFINES += -DPLUGIN_NAME_I18N='"$(PLUGIN)"' +DEFINES += -D_GNU_SOURCE -DPLUGIN_NAME_I18N='"$(PLUGIN)"' ### The object files (add further files here): diff --git a/PLUGINS/src/sky/HISTORY b/PLUGINS/src/sky/HISTORY index d41904e..d3da71e 100644 --- a/PLUGINS/src/sky/HISTORY +++ b/PLUGINS/src/sky/HISTORY @@ -12,3 +12,7 @@ VDR Plugin 'sky' Revision History 2003-05-09: Version 0.1.1 - Changed Start() to Initialize(). + +2004-01-04: Version 0.2.0 + +- Implemented automatic PID switching and channel detection diff --git a/PLUGINS/src/sky/Makefile b/PLUGINS/src/sky/Makefile index 3df93c1..13d623b 100644 --- a/PLUGINS/src/sky/Makefile +++ b/PLUGINS/src/sky/Makefile @@ -1,7 +1,7 @@ # # Makefile for a Video Disk Recorder plugin # -# $Id: Makefile 1.2 2002/12/13 14:54:24 kls Exp $ +# $Id: Makefile 1.3 2003/12/21 15:47:31 kls Exp $ # The official name of this plugin. # This name will be used in the '-P...' option of VDR to load the plugin. @@ -42,7 +42,7 @@ PACKAGE = vdr-$(ARCHIVE) INCLUDES += -I$(VDRDIR)/include -I$(DVBDIR)/include -DEFINES += -DPLUGIN_NAME_I18N='"$(PLUGIN)"' +DEFINES += -D_GNU_SOURCE -DPLUGIN_NAME_I18N='"$(PLUGIN)"' ### The object files (add further files here): diff --git a/PLUGINS/src/sky/sky.c b/PLUGINS/src/sky/sky.c index ae59137..750d778 100644 --- a/PLUGINS/src/sky/sky.c +++ b/PLUGINS/src/sky/sky.c @@ -3,7 +3,7 @@ * * See the README file for copyright information and how to reach the author. * - * $Id: sky.c 1.3 2003/05/09 15:27:16 kls Exp $ + * $Id: sky.c 1.4 2004/01/04 15:29:15 kls Exp $ */ #include <sys/socket.h> @@ -14,7 +14,7 @@ #include <vdr/plugin.h> #include <vdr/sources.h> -static const char *VERSION = "0.1.1"; +static const char *VERSION = "0.2.0"; static const char *DESCRIPTION = "Sky Digibox interface"; // --- cDigiboxDevice -------------------------------------------------------- @@ -37,6 +37,7 @@ public: cDigiboxDevice(void); virtual ~cDigiboxDevice(); virtual bool ProvidesSource(int Source) const; + virtual bool ProvidesTransponder(const cChannel *Channel) const; virtual bool ProvidesChannel(const cChannel *Channel, int Priority = -1, bool *NeedsSetChannel = NULL) const; virtual bool SetChannelDevice(const cChannel *Channel, bool LiveView); }; @@ -137,13 +138,18 @@ bool cDigiboxDevice::ProvidesSource(int Source) const return source == Source; } +bool cDigiboxDevice::ProvidesTransponder(const cChannel *Channel) const +{ + return false; // can't provide any actual transponder +} + bool cDigiboxDevice::ProvidesChannel(const cChannel *Channel, int Priority, bool *NeedsDetachReceivers) const { bool result = false; bool hasPriority = Priority < 0 || Priority > this->Priority(); bool needsDetachReceivers = true; - if (ProvidesSource(Channel->Source()) && ProvidesCa(Channel->Ca())) { + if (ProvidesSource(Channel->Source()) && Channel->Ca() == 0x30) {//XXX if (Receiving()) { if (digiboxChannelNumber == Channel->Frequency()) { needsDetachReceivers = false; diff --git a/PLUGINS/src/status/Makefile b/PLUGINS/src/status/Makefile index 18d5eee..4216e75 100644 --- a/PLUGINS/src/status/Makefile +++ b/PLUGINS/src/status/Makefile @@ -1,7 +1,7 @@ # # Makefile for a Video Disk Recorder plugin # -# $Id: Makefile 1.6 2002/12/13 14:54:19 kls Exp $ +# $Id: Makefile 1.7 2003/12/21 15:47:41 kls Exp $ # The official name of this plugin. # This name will be used in the '-P...' option of VDR to load the plugin. @@ -42,7 +42,7 @@ PACKAGE = vdr-$(ARCHIVE) INCLUDES += -I$(VDRDIR)/include -I$(DVBDIR)/include -DEFINES += -DPLUGIN_NAME_I18N='"$(PLUGIN)"' +DEFINES += -D_GNU_SOURCE -DPLUGIN_NAME_I18N='"$(PLUGIN)"' ### The object files (add further files here): diff --git a/README.developer b/README.developer new file mode 100644 index 0000000..eabb091 --- /dev/null +++ b/README.developer @@ -0,0 +1,83 @@ +Version 1.3.0 marks the beginning of a new developer version +of VDR, in which I am going to integrate functionality from +patches that have been written by various people for previous +versions of VDR. + +IMPORTANT NOTE: Beginning with version 1.3.0, VDR will automatically +=============== modify the 'channels.conf' file. Please run this version + of VDR in a controlled environment only, and work with + copies of all your config files! + +This version of VDR focuses on some improvements regarding +CAM support and, most important, the first step towards automatic +PID handling. Some things are still in a raw state, but at least +the program should now dynamically react on any changes in the +channel settings. + +Here's a list of the highlights - and what _not_ to expect yet +(but don't worry, these things will come soon ;-): + +- Automatic switching when PIDs are changed (e.g. for regional + programmes). +- There is no explicit transponder list yet, so you just + have to define one channel for a new transponder and VDR + will automatically detect all other channels on that transponder. +- New channels are added to the end of the channel list, so + it might be a good idea to add a line like + + :@1000 New channels + + to have them start at some high number. +- Improved CAM support. Channels with conditional access now automatically + use the device that contains the proper CAM. +- No NVOD or "linked services" support yet. +- No radio support yet. +- No transponder scan yet. + +Note that this is currently work in progress, so there may be some +areas that don't work as smooth as expected, yet. + +Known issues: +============= + +- The Setup/CICAM menu is currently without much meaning. + CA detection is done automatically. +- The channel "EURO1080" on Astra 19.2E currently broadcasts HDTV + test signals. Unfortunately, the full featured DVB cards crash + pretty ugly when tuned to that channel, so it might be a good idea + to have the channel definition + + EURO1080:12168:v:S19.2E:27500:308:256:0:FF:21100:1:1088:0 + + in your 'channels.conf' file. Note the Ca parameter 'F' (255 in hex), + which gives this channel a non-existent Ca mode, so that it won't + be tuned to at all. If you really want to tune to this channel for + tests, do it on your own risk. +- The 'sky' plugin now temporarily uses Ca value 30 (this will be changed + later). +- Since the CA detection is now done automatically, a timer that starts + immediately after VDR has been launched and wants to record a CA channel + may not work. This will be changed later to make this work safely. + +What to test: +============= + +Apart from the usual general functionality, special attention should +be given to the following matters: + +- Does the automatic PID switching really work in all cases, especially + in conjunction with conditional access channels? +- Does CAM support work for all kinds of CAMs? + +Known bugs: +=========== + +- Sometimes a new channel is created with the wrong 'source' + parameter. This presumably happens when the transponder and source + are switched, and there is still an SDT data packet being processed. + The call to device->HasLock() in sections.c should fix this (and it + apparently does for most cases), but there must still be soemthing + wrong in that area. +- Sometimes the current channel gets re-tuned even though the channel + data of this channel didn't change (but that of an other channel did + change). @@ -18,6 +18,8 @@ # Cryptoworks 201 GOD-DIGITAL +202 Slovak Link +203 Czech Link # Videoguard @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: channels.c 1.16 2003/10/17 15:42:40 kls Exp $ + * $Id: channels.c 1.17 2004/01/04 12:28:49 kls Exp $ */ #include "channels.h" @@ -159,6 +159,7 @@ char *cChannel::buffer = NULL; cChannel::cChannel(void) { + memset(&__BeginData__, 0, (char *)&__EndData__ - (char *)&__BeginData__); strcpy(name, "Pro7"); frequency = 12480; source = cSource::FromString("S19.2E"); @@ -170,7 +171,7 @@ cChannel::cChannel(void) dpid1 = 257; dpid2 = 0; tpid = 32; - ca = 0; + caids[0] = 0; nid = 0; tid = 0; sid = 888; @@ -186,6 +187,28 @@ cChannel::cChannel(void) transmission = TRANSMISSION_MODE_AUTO; guard = GUARD_INTERVAL_AUTO; hierarchy = HIERARCHY_AUTO; + modification = CHANNELMOD_NONE; +} + +cChannel::cChannel(const cChannel *Channel) +{ + *this = *Channel; + *name = 0; + vpid = 0; + ppid = 0; + apid1 = 0; + apid2 = 0; + dpid1 = 0; + dpid2 = 0; + tpid = 0; + caids[0] = 0; + nid = 0; + tid = 0; + sid = 0; + rid = 0; + number = 0; + groupSep = false; + modification = CHANNELMOD_NONE; } cChannel& cChannel::operator= (const cChannel &Channel) @@ -194,16 +217,117 @@ cChannel& cChannel::operator= (const cChannel &Channel) return *this; } -static int MHz(int frequency) +int cChannel::Transponder(void) const { - while (frequency > 20000) - frequency /= 1000; - return frequency; + int tf = frequency; + while (tf > 20000) + tf /= 1000; + return tf; } tChannelID cChannel::GetChannelID(void) const { - return tChannelID(source, nid, nid ? tid : MHz(frequency), sid, rid); + return tChannelID(source, nid, nid ? tid : Transponder(), sid, rid); +} + +int cChannel::Modification(int Mask) +{ + int Result = modification & Mask; + modification = CHANNELMOD_NONE; + return Result; +} + +void cChannel::SetId(int Nid, int Tid, int Sid, int Rid, bool Log) +{ + if (nid != Nid || tid != Tid || sid != Sid || rid != Rid) { + if (Log) + dsyslog("changing id of channel %d from %d-%d-%d-%d to %d-%d-%d-%d", Number(), nid, tid, sid, rid, Nid, Tid, Sid, Rid); + nid = Nid; + tid = Tid; + sid = Sid; + rid = Rid; + modification |= CHANNELMOD_ID; + Channels.SetModified(); + } +} + +void cChannel::SetName(const char *Name, bool Log) +{ + if (!isempty(Name) && strcmp(name, Name) != 0) { + if (Log) + dsyslog("changing name of channel %d from '%s' to '%s'", Number(), name, Name); + strn0cpy(name, Name, MaxChannelName); + modification |= CHANNELMOD_NAME; + Channels.SetModified(); + } +} + +void cChannel::SetPids(int Vpid, int Ppid, int Apid1, int Apid2, int Dpid1, int Dpid2, int Tpid) +{ + //XXX if (vpid != Vpid || ppid != Ppid || apid1 != Apid1 || apid2 != Apid2 || dpid1 != Dpid1 || dpid2 != Dpid2 || tpid != Tpid) { + if (vpid != Vpid || ppid != Ppid || apid1 != Apid1 || (Apid2 && apid2 != Apid2) || dpid1 != Dpid1 || dpid2 != Dpid2 || tpid != Tpid) { + dsyslog("changing pids of channel %d from %d+%d:%d,%d;%d,%d:%d to %d+%d:%d,%d;%d,%d:%d", Number(), vpid, ppid, apid1, apid2, dpid1, dpid2, tpid, Vpid, Ppid, Apid1, Apid2, Dpid1, Dpid2, Tpid); + vpid = Vpid; + ppid = Ppid; + apid1 = Apid1; + if (Apid2)//XXX should we actually react here? + apid2 = Apid2; + dpid1 = Dpid1; + dpid2 = Dpid2; + tpid = Tpid; + modification |= CHANNELMOD_PIDS; + Channels.SetModified(); + } +} + +void cChannel::SetCaIds(const int *CaIds) +{ + if (caids[0] && caids[0] <= 0x00FF) + return; // special values will not be overwritten + bool modified = false; + for (int i = 0; i < MAXCAIDS; i++) { + if (caids[i] != CaIds[i]) { + modified = true; + break; + } + if (!caids[i] || !CaIds[i]) + break; + } + if (modified) { + char OldCaIdsBuf[MAXCAIDS * 5 + 10]; // 5: 4 digits plus delimiting ',', 10: paranoia + char NewCaIdsBuf[MAXCAIDS * 5 + 10]; + char *qo = OldCaIdsBuf; + char *qn = NewCaIdsBuf; + int i; + for (i = 0; i < MAXCAIDS; i++) { + if (i == 0 || caids[i]) + qo += snprintf(qo, sizeof(OldCaIdsBuf), "%s%X", i > 0 ? "," : "", caids[i]); + if (!caids[i]) + break; + } + for (i = 0; i < MAXCAIDS; i++) { + if (i == 0 || CaIds[i]) + qn += snprintf(qn, sizeof(NewCaIdsBuf), "%s%X", i > 0 ? "," : "", CaIds[i]); + caids[i] = CaIds[i]; + if (!CaIds[i]) + break; + } + caids[i] = 0; + *qo = *qn = 0; + dsyslog("changing caids of channel %d from %s to %s", Number(), OldCaIdsBuf, NewCaIdsBuf); + modification |= CHANNELMOD_CA; + Channels.SetModified(); + } +} + +void cChannel::SetCaDescriptors(int Level) +{ + if (Level > 0) { + modification |= CHANNELMOD_CA; + Channels.SetModified(); + if (Level > 1) + dsyslog("changing ca descriptors of channel %d", Number()); + } } static int PrintParameter(char *p, char Name, int Value) @@ -290,10 +414,10 @@ const char *cChannel::ToText(cChannel *Channel) char vpidbuf[32]; char *q = vpidbuf; q += snprintf(q, sizeof(vpidbuf), "%d", Channel->vpid); - if (Channel->ppid) + if (Channel->ppid && Channel->ppid != Channel->vpid) q += snprintf(q, sizeof(vpidbuf) - (q - vpidbuf), "+%d", Channel->ppid); *q = 0; - char apidbuf[32]; + char apidbuf[MAXAPIDS * 2 * 6 + 10]; // 2: Apids and Dpids, 6: 5 digits plus delimiting ',' or ';', 10: paranoia q = apidbuf; q += snprintf(q, sizeof(apidbuf), "%d", Channel->apid1); if (Channel->apid2) @@ -303,7 +427,16 @@ const char *cChannel::ToText(cChannel *Channel) if (Channel->dpid2) q += snprintf(q, sizeof(apidbuf) - (q - apidbuf), ",%d", Channel->dpid2); *q = 0; - asprintf(&buffer, "%s:%d:%s:%s:%d:%s:%s:%d:%d:%d:%d:%d:%d\n", s, Channel->frequency, Channel->ParametersToString(), cSource::ToString(Channel->source), Channel->srate, vpidbuf, apidbuf, Channel->tpid, Channel->ca, Channel->sid, Channel->nid, Channel->tid, Channel->rid); + char caidbuf[MAXCAIDS * 5 + 10]; // 5: 4 digits plus delimiting ',', 10: paranoia + q = caidbuf; + for (int i = 0; i < MAXCAIDS; i++) { + if (i == 0 || Channel->caids[i]) + q += snprintf(q, sizeof(caidbuf), "%s%X", i > 0 ? "," : "", Channel->caids[i]); + if (!Channel->caids[i]) + break; + } + *q = 0; + asprintf(&buffer, "%s:%d:%s:%s:%d:%s:%s:%d:%s:%d:%d:%d:%d\n", s, Channel->frequency, Channel->ParametersToString(), cSource::ToString(Channel->source), Channel->srate, vpidbuf, apidbuf, Channel->tpid, caidbuf, Channel->sid, Channel->nid, Channel->tid, Channel->rid); } return buffer; } @@ -336,12 +469,16 @@ bool cChannel::Parse(const char *s, bool AllowNonUniqueID) char *parambuf = NULL; char *vpidbuf = NULL; char *apidbuf = NULL; - int fields = sscanf(s, "%a[^:]:%d :%a[^:]:%a[^:] :%d :%a[^:]:%a[^:]:%d :%d :%d :%d :%d :%d ", &namebuf, &frequency, ¶mbuf, &sourcebuf, &srate, &vpidbuf, &apidbuf, &tpid, &ca, &sid, &nid, &tid, &rid); + char *caidbuf = NULL; + int fields = sscanf(s, "%a[^:]:%d :%a[^:]:%a[^:] :%d :%a[^:]:%a[^:]:%d :%a[^:]:%d :%d :%d :%d ", &namebuf, &frequency, ¶mbuf, &sourcebuf, &srate, &vpidbuf, &apidbuf, &tpid, &caidbuf, &sid, &nid, &tid, &rid); if (fields >= 9) { if (fields == 9) { // allow reading of old format - sid = ca; - ca = tpid; + sid = atoi(caidbuf); + delete caidbuf; + caidbuf = NULL; + caids[0] = tpid; + caids[1] = 0; tpid = 0; } vpid = ppid = 0; @@ -350,24 +487,46 @@ bool cChannel::Parse(const char *s, bool AllowNonUniqueID) ok = false; if (parambuf && sourcebuf && vpidbuf && apidbuf) { ok = StringToParameters(parambuf) && (source = cSource::FromString(sourcebuf)) >= 0; + char *p = strchr(vpidbuf, '+'); if (p) *p++ = 0; sscanf(vpidbuf, "%d", &vpid); if (p) sscanf(p, "%d", &ppid); + else + ppid = vpid; + p = strchr(apidbuf, ';'); if (p) *p++ = 0; sscanf(apidbuf, "%d ,%d ", &apid1, &apid2); if (p) sscanf(p, "%d ,%d ", &dpid1, &dpid2); + + if (caidbuf) { + char *p = caidbuf; + char *q; + int NumCaIds = 0; + while ((q = strtok(p, ",")) != NULL) { + if (NumCaIds < MAXCAIDS) { + caids[NumCaIds++] = strtol(q, NULL, 16) & 0xFFFF; + if (NumCaIds == 1 && caids[0] <= 0x00FF) + break; + } + else + esyslog("ERROR: too many CA ids!"); // no need to set ok to 'false' + p = NULL; + } + caids[NumCaIds] = 0; + } } strn0cpy(name, namebuf, MaxChannelName); free(parambuf); free(sourcebuf); free(vpidbuf); free(apidbuf); + free(caidbuf); free(namebuf); if (!GetChannelID().Valid()) { esyslog("ERROR: channel data results in invalid ID!"); @@ -394,6 +553,12 @@ bool cChannel::Save(FILE *f) cChannels Channels; +cChannels::cChannels(void) +{ + maxNumber = 0; + modified = false; +} + bool cChannels::Load(const char *FileName, bool AllowComments, bool MustExist) { if (cConfig<cChannel>::Load(FileName, AllowComments, MustExist)) { @@ -457,10 +622,10 @@ cChannel *cChannels::GetByNumber(int Number, int SkipGap) return NULL; } -cChannel *cChannels::GetByServiceID(int Source, unsigned short ServiceID) +cChannel *cChannels::GetByServiceID(int Source, int Transponder, unsigned short ServiceID) { for (cChannel *channel = First(); channel; channel = Next(channel)) { - if (!channel->GroupSep() && channel->Source() == Source && channel->Sid() == ServiceID) + if (!channel->GroupSep() && channel->Source() == Source && ISTRANSPONDER(channel->Transponder(), Transponder) && channel->Sid() == ServiceID) return channel; } return NULL; @@ -497,3 +662,31 @@ bool cChannels::SwitchTo(int Number) cChannel *channel = GetByNumber(Number); return channel && cDevice::PrimaryDevice()->SwitchChannel(channel, true); } + +void cChannels::SetModified(void) +{ + modified = true; +} + +bool cChannels::Modified(void) +{ + bool Result = modified; + modified = false; + return Result; +} + +cChannel *cChannels::NewChannel(int Source, int Transponder, const char *Name, int Nid, int Tid, int Sid, int Rid) +{ + dsyslog("creating new channel '%s' on %s transponder %d with id %d-%d-%d-%d", Name, cSource::ToString(Source), Transponder, Nid, Tid, Sid, Rid); + for (cChannel *channel = First(); channel; channel = Next(channel)) { + if (!channel->GroupSep() && channel->Source() == Source && ISTRANSPONDER(channel->Transponder(), Transponder)) { + cChannel *NewChannel = new cChannel(channel); + Add(NewChannel); + ReNumber(); + NewChannel->SetId(Nid, Tid, Sid, Rid, false); + NewChannel->SetName(Name, false); + return NewChannel; + } + } + return NULL; +} diff --git a/channels.conf b/channels.conf index f0ba587..b1ad616 100644 --- a/channels.conf +++ b/channels.conf @@ -1,162 +1,110 @@ -RTL:12188:h:S19.2E:27500:163:104:105:0:12003:0:0:0 -Sat.1:12480:v:S19.2E:27500:1791:1792:34:0:46:0:0:0 -Pro-7:12480:v:S19.2E:27500:255:256;257:32:0:898:0:0:0 -RTL2:12188:h:S19.2E:27500:166:128:68:0:12020:0:0:0 -ARD:11837:h:S19.2E:27500:101:102:104:0:28106:0:0:0 -BR3:11837:h:S19.2E:27500:201:202:204:0:28107:0:0:0 -Hessen-3:11837:h:S19.2E:27500:301:302:304:0:28108:0:0:0 -N3:12110:h:S19.2E:27500:2401:2402:2404:0:28224:0:0:0 -SR3:11837:h:S19.2E:27500:501:502:504:0:28110:0:0:0 -WDR:11837:h:S19.2E:27500:601:602:604:0:28111:0:0:0 -BR-alpha:11837:h:S19.2E:27500:701:702:704:0:28112:0:0:0 -SWR BW:11837:h:S19.2E:27500:801:802:804:0:28113:0:0:0 -Phoenix:11837:h:S19.2E:27500:901:902:904:0:28114:0:0:0 -ZDF:11954:h:S19.2E:27500:110:120:130:0:28006:0:0:0 -3sat:11954:h:S19.2E:27500:210:220:230:0:28007:0:0:0 -KiKa:11954:h:S19.2E:27500:310:320:330:0:28008:0:0:0 -arte:11836:h:S19.2E:27500:401:402:404:0:28109:0:0:0 -ORF1:12692:h:S19.2E:22000:160:161:165:102:13001:0:0:0 -ORF2:12692:h:S19.2E:22000:500:501:505:102:13002:0:0:0 -ZDF.info:11954:h:S19.2E:27500:610:620:0:0:28011:0:0:0 -CNN:11778:v:S19.2E:27500:165:100:0:0:28522:0:0:0 -Super RTL:12188:h:S19.2E:27500:165:120:65:0:12040:0:0:0 -VOX:12188:h:S19.2E:27500:167:136:71:0:12060:0:0:0 -:#DW TV:10788:v:S19.2E:22000:305:306:0:0:8905:0:0:0 -Kabel 1:12480:v:S19.2E:27500:511:512:33:0:899:0:0:0 -Neun Live:12480:v:S19.2E:27500:767:768:35:0:897:0:0:0 -DSF:12480:v:S19.2E:27500:1023:1024:0:0:900:0:0:0 -HOT:12480:v:S19.2E:27500:1279:1280:0:0:40:0:0:0 -Bloomberg TV Germany:12552:v:S19.2E:22000:162:99:0:0:12160:0:0:0 -Bloomberg TV France:11817:v:S19.2E:27500:163:92:0:0:8004:0:0:0 -Bloomberg TV Spain:12168:v:S19.2E:27500:167:112:0:0:12721:0:0:0 -Sky News:11597:v:S19.2E:22000:305:306:0:0:28707:0:0:0 -Fox Kids Netherlands:12574:h:S19.2E:22000:163:92:0:0:5020:0:0:0 -BVN:12574:h:S19.2E:22000:164+131:96:0:0:5025:0:0:0 -Alice:12610:v:S19.2E:22000:162:96:0:0:12200:0:0:0 -n-tv:12670:v:S19.2E:22000:162:96:55:0:12730:0:0:0 -Al Jazeera:11568:v:S19.2E:22000:55:56:0:0:9021:0:0:0 -Grand Tourisme:12670:v:S19.2E:22000:289:290:0:0:17300:0:0:0 -TW1:12692:h:S19.2E:22000:166:167:0:0:13013:0:0:0 -Eurosport:11954:h:S19.2E:27500:410:420:0:0:28009:0:0:0 -EinsExtra:12110:h:S19.2E:27500:101:102:0:0:28201:0:0:0 -EinsFestival:12110:h:S19.2E:27500:201:202:0:0:28202:0:0:0 -EinsMuXx:12110:h:S19.2E:27500:301:302:0:0:28203:0:0:0 -ZDF Theaterkanal:11954:h:S19.2E:27500:1110:1120:0:0:28016:0:0:0 -ZDF.doku:11954:h:S19.2E:27500:660:670:0:0:28014:0:0:0 -MDR:12110:h:S19.2E:27500:401:402:404:0:28204:0:0:0 -RBB Brandenburg:12110:h:S19.2E:27500:501:502:504:0:28205:0:0:0 -RBB Berlin:12110:h:S19.2E:27500:601:602:604:0:28206:0:0:0 +RTL,RTL Television:12188:h:S19.2E:27500:163:104:105:0:12003:1:1089:0 +SAT.1:12480:v:S19.2E:27500:1791:1792;1795:34:0:46:133:33:0 +ProSieben:12480:v:S19.2E:27500:255:256;257:32:0:898:133:33:0 +RTL2:12188:h:S19.2E:27500:166:128:68:0:12020:1:1089:0 +Das Erste:11837:h:S19.2E:27500:101:102:104:0:28106:1:1101:0 +Bayerisches FS:11837:h:S19.2E:27500:201:202:204:0:28107:1:1101:0 +hessen fernsehen:11837:h:S19.2E:27500:301:302:304:0:28108:1:1101:0 +NDR FS MV:12110:h:S19.2E:27500:2401:2402:2404:0:28224:1:1073:0 +SR Fernsehen Suedwest:11837:h:S19.2E:27500:501:502:504:0:28110:1:1101:0 +WDR FERNSEHEN:11837:h:S19.2E:27500:601:602:604:0:28111:1:1101:0 +BR-alpha:11837:h:S19.2E:27500:701:702:704:0:28112:1:1101:0 +SÜDWEST BW:11837:h:S19.2E:27500:801:802:804:0:28113:1:1101:0 +Phoenix:11837:h:S19.2E:27500:901:902:904:0:28114:1:1101:0 +ZDF:11954:h:S19.2E:27500:110:120;125:130:0:28006:1:1079:0 +3sat:11954:h:S19.2E:27500:210:220:230:0:28007:1:1079:0 +KiKa:11954:h:S19.2E:27500:310:320:330:0:28008:1:1079:0 +arte:11836:h:S19.2E:27500:401:402,403:404:0:28109:1:1101:0 +ORF 1:12692:h:S19.2E:22000:160:161;163:165:1762,D05,1702,1801:13001:1:1117:0 +ORF 2:12692:h:S19.2E:22000:500:501;503:505:1762,D05,1702,1801:13002:1:1117:0 +ZDFinfokanal:11954:h:S19.2E:27500:610:620:130:0:28011:1:1079:0 +CNN Int.:11778:v:S19.2E:27500:165:100:47:0:28522:1:1068:0 +S RTL,Super RTL:12188:h:S19.2E:27500:165:120:65:0:12040:1:1089:0 +VOX:12188:h:S19.2E:27500:167:136:71:0:12060:1:1089:0 +KABEL1:12480:v:S19.2E:27500:511:512:33:0:899:133:33:0 +NEUN LIVE,NEUN LIVE Television:12480:v:S19.2E:27500:767:768:35:0:897:133:33:0 +DSF:12480:v:S19.2E:27500:1023:1024:0:0:900:133:33:0 +HSEurope,Home Shopping Europe:12480:v:S19.2E:27500:1279:1280:37:0:40:133:33:0 +Bloomberg TV Germany:12552:v:S19.2E:22000:162:99:0:0:12160:1:1108:0 +EURONEWS:11817:v:S19.2E:27500:163:92,93:0:500,100:8004:1:1070:0 +Sky News:11597:v:S19.2E:22000:305:306:0:0:28707:1:1026:0 +Veronica/FoxKids:12574:h:S19.2E:22000:518+8190:92:38:622,602,100:5020:53:1109:0 +BVN:12574:h:S19.2E:22000:515+8190:96:36:0:5025:53:1109:0 +CNBC Europe:12610:v:S19.2E:22000:944:945:0:0:12200:1:1112:0 +n-tv:12670:v:S19.2E:22000:162:96:55:0:12730:1:1116:0 +Al Jazeera:11568:v:S19.2E:22000:55:56:0:0:9021:1:1024:0 +TW1:12692:h:S19.2E:22000:166:167:168:0:13013:1:1117:0 +Eurosport:11954:h:S19.2E:27500:410:420:430:0:28009:1:1079:0 +EinsExtra:12110:h:S19.2E:27500:101:102:0:0:28201:1:1073:0 +EinsFestival:12110:h:S19.2E:27500:201:202:0:0:28202:1:1073:0 +EinsMuXx:12110:h:S19.2E:27500:301:302:0:0:28203:1:1073:0 +ZDFtheaterkanal:11954:h:S19.2E:27500:1110:1120:130:0:28016:1:1079:0 +ZDFdokukanal:11954:h:S19.2E:27500:660:670:130:0:28014:1:1079:0 +MDR FERNSEHEN:12110:h:S19.2E:27500:401:402:404:0:28204:1:1073:0 +RBB Brandenburg:12110:h:S19.2E:27500:501:502:504:0:28205:1:1073:0 +RBB Berlin:12110:h:S19.2E:27500:601:602:604:0:28206:1:1073:0 :Premiere World -Premiere Start:11797:h:S19.2E:27500:255:256:0:101:8:0:0:0 -Premiere 1:11797:h:S19.2E:27500:511:512,513;515:0:101:10:0:0:0 -Premiere 2:11797:h:S19.2E:27500:1791:1792,1793;1795:0:101:11:0:0:0 -Premiere 3:11797:h:S19.2E:27500:2303:2304,2305:0:101:43:0:0:0 -Premiere 4:11797:h:S19.2E:27500:767:768,769:0:101:9:0:0:0 -Premiere 5:11797:h:S19.2E:27500:1279:1280,1281:0:101:29:0:0:0 -Premiere 6:11797:h:S19.2E:27500:1535:1536:0:101:41:0:0:0 -Premiere 7:11797:h:S19.2E:27500:1023:1024:0:101:20:0:0:0 -13th Street:11758:h:S19.2E:27500:2303:2304:0:101:42:0:0:0 -Sci-Fi:11758:h:S19.2E:27500:2047:2048:0:101:36:0:0:0 -Premiere Serie:12031:h:S19.2E:27500:1023:1024:0:101:16:0:0:0 -Disney Channel:11758:h:S19.2E:27500:2559:2560:0:101:34:0:0:0 -Premiere Nostalgie:12031:h:S19.2E:27500:2559:2560:0:101:516:0:0:0 -Discovery Channel:11758:h:S19.2E:27500:1023:1024:8181:101:14:0:0:0 -Planet:12090:v:S19.2E:27500:1279:1280:0:101:13:0:0:0 -Fox Kids:11758:h:S19.2E:27500:1279:1280:0:101:28:0:0:0 -Junior:11758:h:S19.2E:27500:255:256:0:101:19:0:0:0 -K-Toon:11758:h:S19.2E:27500:511:512:0:101:12:0:0:0 -Krimi&Co:12031:h:S19.2E:27500:1535:1536:0:101:23:0:0:0 -Goldstar TV:11758:h:S19.2E:27500:3839:3840:0:101:518:0:0:0 -MGM:11758:h:S19.2E:27500:767:768:2:101:515:0:0:0 -Sonnenklar TV:12090:v:S19.2E:27500:1023:1024:0:0:32:0:0:0 +START,PREMIERE START:11797:h:S19.2E:27500:255:256:32:1702,1722,1801:8:133:2:0 +PREM 1,PREMIERE 1:11797:h:S19.2E:27500:511:512,513;515:0:1702,1722,1801:10:133:2:0 +PREM 2,PREMIERE 2:11797:h:S19.2E:27500:1791:1792,1793;1795:0:1702,1722,1801:11:133:2:0 +PREM 3,PREMIERE 3:11797:h:S19.2E:27500:2303:2304,2305:0:1702,1722,1801:43:133:2:0 +PREM 4,PREMIERE 4:11797:h:S19.2E:27500:767:768,769:0:1702,1722,1801:9:133:2:0 +PREM 5,PREMIERE 5:11797:h:S19.2E:27500:1279:1280,1281:0:1702,1722,1801:29:133:2:0 +PREM 6,PREMIERE 6:11797:h:S19.2E:27500:1535:1536:0:1702,1722,1801:41:133:2:0 +PREM 7,PREMIERE 7:11797:h:S19.2E:27500:1023:1024:0:1702,1722,1801:20:133:2:0 +DISNEY,DISNEY CHANNEL:11758:h:S19.2E:27500:2559:2560:0:1702,1722,1801:34:133:17:0 :Premiere Direkt -Premiere Direkt Portal:12031:h:S19.2E:27500:2815:2816:0:101:18:0:0:0 -Premiere Direkt 1A:11719:h:S19.2E:27500:2047:2048:0:101:240:0:0:0 -Premiere Direkt 1B:11719:h:S19.2E:27500:2303:2304:0:101:241:0:0:0 -Premiere Direkt 1C:11719:h:S19.2E:27500:2559:2560:0:101:242:0:0:0 -Premiere Direkt 2A:11719:h:S19.2E:27500:2815:2816:0:101:243:0:0:0 -Premiere Direkt 2B:11719:h:S19.2E:27500:3071:3072:0:101:244:0:0:0 -Premiere Direkt 2C:12031:h:S19.2E:27500:3071:3072:0:101:208:0:0:0 -Premiere Direkt 2D:11719:h:S19.2E:27500:3327:3328:0:101:245:0:0:0 -Premiere Direkt 3A:12031:h:S19.2E:27500:3327:3328:0:101:209:0:0:0 -Premiere Direkt 3B:12031:h:S19.2E:27500:2303:2304:0:101:210:0:0:0 -Premiere Direkt 3C:11758:h:S19.2E:27500:511:512:0:101:211:0:0:0 -Premiere Direkt 3D:12070:h:S19.2E:27500:511:512:0:101:212:0:0:0 +DIREKT,PREMIERE DIREKT:12031:h:S19.2E:27500:2815:2816,2817;2819:0:0:18:133:4:0 :PW Erotic -Beate-Uhse.TV:12071:h:S19.2E:27500:1023:1024:0:101:21:0:0:0 -Premiere Erotik 1:12031:h:S19.2E:27500:1279:1280:2:101:513:0:0:0 -Premiere Erotik 2:12070:h:S19.2E:27500:1535:1536:0:101:778:0:0:0 -Premiere Erotik 3:12070:h:S19.2E:27500:1791:1792:0:101:779:0:0:0 -Premiere Erotik 4:12070:h:S19.2E:27500:3583:3584:0:101:780:0:0:0 +B-UHSE,BEATE-UHSE.TV:12071:h:S19.2E:27500:1023:1024:0:1702,1722,1801:21:133:1:0 +EROTIK,PREMIERE EROTIK:12031:h:S19.2E:27500:1279:0:0:1702,1722,1801:513:133:4:0 :Sportsworld -Premiere Sport 1:11720:h:S19.2E:27500:255:256,257:0:101:17:0:0:0 -Premiere Sport 2:12031:h:S19.2E:27500:3839:3840:0:101:27:0:0:0 -:Formel 1 -:#Supersignal:12070:h:S19.2E:27500:255:256:0:101:211:0:0:0 -:#Cockpitkanal:12070:h:S19.2E:27500:511:512:0:101:212:0:0:0 -:#Boxengasse:12070:h:S19.2E:27500:767:768:0:101:213:0:0:0 -:#Verfolgerfeld:12070:h:S19.2E:27500:1023:1024:0:101:214:0:0:0 -:#Infokanal:12070:h:S19.2E:27500:1279:1280:0:101:215:0:0:0 -:#Multikanal:11720:h:S19.2E:27500:255:256:0:101:17:0:0:0 +SPORT 1,PREMIERE SPORT 1:11720:h:S19.2E:27500:255:256,257:0:1702,1722,1801:17:133:3:0 +SPORT 2,PREMIERE SPORT 2:12031:h:S19.2E:27500:3839:3840,3841:0:1702,1722,1801:27:133:4:0 :Beta Digital -N24:12480:v:S19.2E:27500:2047:2048:0:0:47:0:0:0 -CNBC:11954:h:S19.2E:27500:510:520:0:0:28010:0:0:0 -Liberty TV.com:12610:v:S19.2E:22000:941:943,942:0:0:12199:0:0:0 -:Premiere Bundesliga -BL-Konferenz:12031:h:S19.2E:27500:2303:2304,2305:0:101:210:0:0:1 -BuLi 1:11719:h:S19.2E:27500:255:256,257:0:101:17:0:0:1 -BuLi 2:11719:h:S19.2E:27500:2047:2048,2049:0:101:240:0:0:1 -BuLi 3:11719:h:S19.2E:27500:2303:2304,2305:0:101:241:0:0:1 -BuLi 4:11719:h:S19.2E:27500:2559:2560,2561:0:101:242:0:0:1 -BuLi 5:11719:h:S19.2E:27500:2815:2816,2817:0:101:243:0:0:1 -BuLi 6:11719:h:S19.2E:27500:3071:3072,3073:0:101:244:0:0:1 -BuLi 7:11719:h:S19.2E:27500:3327:3328,3329:0:101:245:0:0:1 -BuLi 8:12031:h:S19.2E:27500:3071:3072,3073:0:101:208:0:0:1 -BuLi 9:12031:h:S19.2E:27500:3327:3328,3329:0:101:209:0:0:1 +N24:12480:v:S19.2E:27500:2047:2048:36:0:47:133:33:0 +CNBC:11954:h:S19.2E:27500:510:520:530:0:28010:1:1079:0 +Liberty TV.com:12610:v:S19.2E:22000:941:943:0:0:12199:1:1112:0 :- -Mosaico:11934:v:S19.2E:27500:165:100:0:0:29010:0:0:0 -Andalucia TV:11934:v:S19.2E:27500:166:104:0:0:29011:0:0:0 -Canal J:11934:v:S19.2E:27500:167:108:0:0:8157:0:0:0 -Extreme Sports Channel:11992:h:S19.2E:27500:165:98,99:0:0:20365:0:0:0 -Pro 7 Austria:12051:v:S19.2E:27500:161:84:0:0:20002:0:0:0 -Kabel 1 Schweiz:12051:v:S19.2E:27500:162:163:0:0:20003:0:0:0 -Kabel 1 Austria:12051:v:S19.2E:27500:166:167:0:0:20004:0:0:0 -Pro 7 Schweiz:12051:v:S19.2E:27500:289:290:0:0:20001:0:0:0 -:#KTO:11739:v:S19.2E:27500:163:90:0:0:8304:0:0:0 -Cartoon Network France:12168:v:S19.2E:27500:161:84:0:0:28511:0:0:0 -TVBS Europe:12168:v:S19.2E:27500:162:88,89:0:0:28631:0:0:0 -travel channel:12168:v:S19.2E:27500:163:92,93:0:0:28001:0:0:0 -TCM Espana:12168:v:S19.2E:27500:164:96,97:0:0:28516:0:0:0 -TCM France:12168:v:S19.2E:27500:169:64,65:0:0:28515:0:0:0 -La Cinquieme:12207:v:S19.2E:27500:160:80:0:0:8501:0:0:0 -LCP:12207:v:S19.2E:27500:165:100:0:0:8506:0:0:0 -:#AB Moteurs:12266:h:S19.2E:27500:160:80:0:0:17000:0:0:0 -:#AB 1:12266:h:S19.2E:27500:161:84:0:0:17001:0:0:0 -Escales:12285:v:S19.2E:27500:165:100:0:0:17025:0:0:0 -Canal Club:12324:v:S19.2E:27500:160:80:0:0:8612:0:0:0 -:#RAI Uno:10788:v:S19.2E:22000:289:290:0:0:9004:0:0:0 -K13:12402:v:S19.2E:27500:163:92:0:0:8704:0:0:0 -Astra Mosaic 1:12552:v:S19.2E:22000:175:176:0:0:3988:0:0:0 -Astra Mosaic 2:12552:v:S19.2E:22000:179:120:0:0:3987:0:0:0 -Astra Mosaic 3:12552:v:S19.2E:22000:182:169:0:0:3986:0:0:0 -Astra Mosaic 4:12552:v:S19.2E:22000:185:170:0:0:3985:0:0:0 -Astra Mosaic 5:12552:v:S19.2E:22000:163:170:0:0:3984:0:0:0 -Chamber TV:12552:v:S19.2E:22000:55:56:0:0:12180:0:0:0 -RTL Tele Letzebuerg:12552:v:S19.2E:22000:168:144,146:0:0:3994:0:0:0 -VERONICA:12574:h:S19.2E:22000:161:84:0:0:5010:0:0:0 -VH1 Classic:12670:v:S19.2E:22000:3071:3072:0:0:28647:0:0:0 -MTV 2:12225:h:S19.2E:27500:513:661:577:0:28640:0:0:0 +ProSieben Austria:12051:v:S19.2E:27500:161:84:36:0:20002:1:1082:0 +Kabel 1 Schweiz:12051:v:S19.2E:27500:162:163:165:0:20003:1:1082:0 +Kabel 1 Austria:12051:v:S19.2E:27500:166:167:169:0:20004:1:1082:0 +ProSieben Schweiz:12051:v:S19.2E:27500:289:290:33:0:20001:1:1082:0 +FRANCE 5:12207:v:S19.2E:27500:160:80:32:0:8501:1:1090:0 +LCP:12207:v:S19.2E:27500:165:100:0:0:8506:1:1090:0 +ESCALES:12285:v:S19.2E:27500:165:100:0:500,100:17025:1:1094:0 +CANAL CLUB:12324:v:S19.2E:27500:160:80:0:0:8612:1:1096:0 +ASTRA-Mosaic:12552:v:S19.2E:22000:175:176:0:0:3988:1:1108:0 +ASTRA-Mosaic 2:12552:v:S19.2E:22000:179:120:0:0:3987:1:1108:0 +ASTRA-Mosaic 3:12552:v:S19.2E:22000:182:169:0:0:3986:1:1108:0 +ASTRA-Mosaic 4:12552:v:S19.2E:22000:185:170:0:0:3985:1:1108:0 +ASTRA-Mosaic 5:12552:v:S19.2E:22000:163:164:0:0:3984:1:1108:0 +Chamber TV:12552:v:S19.2E:22000:55:56:0:0:12180:1:1108:0 +RTL TELE Letzebuerg:12552:v:S19.2E:22000:168:144,146:74:0:3994:1:1108:0 +Yorin:12574:h:S19.2E:22000:512+8190:84:33:622,602,100:5010:53:1109:0 +MTV2 Pop Channel:12225:h:S19.2E:27500:513:661:577:0:28640:1:1091:0 Via 1 - Schöner Reisen:12148:h:S19.2E:27500:511:512:0:0:44:0:0:0 Video Italia:12610:v:S19.2E:22000:121:122:0:0:12220:0:0:0 -ORF/ZDF:12670:h:S19.2E:22000:506:507:0:0:13012:0:0:0 -VIVA:12670:v:S19.2E:22000:309:310:311:0:12732:0:0:0 -VIVA PLUS:12552:v:S19.2E:22000:171:172:179:0:12120:0:0:0 -MTV Central:11739:v:S19.2E:27500:3031:3032:3034:0:28653:0:0:0 -QVC Germany:12552:v:S19.2E:22000:165:166:0:0:12100:0:0:0 -Tele 5:12480:v:S19.2E:27500:1535:1536:0:0:51:0:0:0 +VIVA:12670:v:S19.2E:22000:309:310:311:0:12732:1:1116:0 +VIVA PLUS:12552:v:S19.2E:22000:171:172:173:0:12120:1:1108:0 +MTV Central:11739:v:S19.2E:27500:3031:3032:3034:0:28653:1:1066:0 +QVC GERMANY:12552:v:S19.2E:22000:165:166:167:0:12100:1:1108:0 +TELE 5:12480:v:S19.2E:27500:1535:1536:38:0:51:133:33:0 :@201 Sky -Sky One:106:h:S28.2E:0:160:80:0:301:222:0:0:0 -Sky One Mix:107:h:S28.2E:0:160:80:0:301:919:0:0:0 -itv2:226:h:S28.2E:0:160:80:0:301:451:0:0:0 -sci-fi:130:h:S28.2E:0:160:80:0:301:161:0:0:0 -Paramount Comedy:127:h:S28.2E:0:160:80:0:301:185:0:0:0 +Sky One:106:h:S28.2E:0:160:80:0:30:222:0:0:0 +Sky One Mix:107:h:S28.2E:0:160:80:0:30:919:0:0:0 +itv2:226:h:S28.2E:0:160:80:0:30:451:0:0:0 +sci-fi:130:h:S28.2E:0:160:80:0:30:161:0:0:0 +Paramount Comedy:127:h:S28.2E:0:160:80:0:30:185:0:0:0 +:@900 Some 'seed' channels +Chelsea TV:11778:v:S28.2E:27500:2308+2304:2309:0:960,961:9307:2:2004:0 +Sky One:12285:v:S28.2E:27500:2311+2304:2312,2313:2307:960,961:4703:2:2030:0 +WDR Münster:12421:h:S19.2E:27500:101:102:104:0:28310:1:1201:0 +Going Places:10921:h:S28.2E:22000:2310+2304:2311:2312:0:5008:2:2055:0 +Animal Plnt+:12070:h:S28.2E:27500:2315+2307:2316:0:960,961:50002:2:2019:0 +S1T:11954:h:S28.2E:27500:0:0:0:0:4409:2:2030:0 +CNN:12032:v:S28.2E:27500:2309:2311:2310:0:7140:2:2018:0 +BBC PARL'MNT:12129:v:S28.2E:27500:2306:2308,2309:2307:0:7300:2:2022:0 +AL HAYAT:11200:v:S13.0E:27500:413:414:0:0:4733:318:13400:0 +EURO1080:12168:v:S19.2E:27500:308:256:0:FF:21100:1:1088:0 +:@1000 New channels @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: channels.h 1.9 2003/10/26 13:21:59 kls Exp $ + * $Id: channels.h 1.10 2004/01/04 12:26:37 kls Exp $ */ #ifndef __CHANNELS_H @@ -12,10 +12,22 @@ #include "config.h" #include "sources.h" +#include "thread.h" #include "tools.h" #define ISTRANSPONDER(f1, f2) (abs((f1) - (f2)) < 4) //XXX +#define CHANNELMOD_NONE 0x00 +#define CHANNELMOD_ALL 0xFF +#define CHANNELMOD_NAME 0x01 +#define CHANNELMOD_PIDS 0x02 +#define CHANNELMOD_ID 0x04 +#define CHANNELMOD_CA 0x10 +#define CHANNELMOD_RETUNE (CHANNELMOD_PIDS | CHANNELMOD_CA) + +#define MAXAPIDS 2 +#define MAXCAIDS 8 + struct tChannelParameterMap { int userValue; int driverValue; @@ -46,7 +58,7 @@ public: tChannelID(void) { source = nid = tid = sid = rid = 0; } tChannelID(int Source, int Nid, int Tid, int Sid, int Rid = 0) { source = Source; nid = Nid; tid = Tid; sid = Sid; rid = Rid; } bool operator== (const tChannelID &arg) const; - bool Valid(void) { return tid && sid; } // nid and rid are optional and source may be 0 + bool Valid(void) { return tid && sid; } // nid and rid are optional and source may be 0//XXX source may not be 0??? tChannelID &ClrRid(void) { rid = 0; return *this; } static tChannelID FromString(const char *s); const char *ToString(void); @@ -58,7 +70,7 @@ class cChannel : public cListObject { private: static char *buffer; static const char *ToText(cChannel *Channel); - enum { MaxChannelName = 32 }; // 31 chars + terminating 0! + enum { MaxChannelName = 64 }; // 63 chars + terminating 0! int __BeginData__; char name[MaxChannelName]; int frequency; // MHz @@ -69,7 +81,7 @@ private: int apid1, apid2; int dpid1, dpid2; int tpid; - int ca; + int caids[MAXCAIDS + 1]; // list is zero-terminated int nid; int tid; int sid; @@ -86,16 +98,19 @@ private: int guard; int hierarchy; int __EndData__; + int modification; const char *ParametersToString(void); bool StringToParameters(const char *s); public: cChannel(void); + cChannel(const cChannel *Channel); cChannel& operator= (const cChannel &Channel); const char *ToText(void); bool Parse(const char *s, bool AllowNonUniqueID = false); bool Save(FILE *f); const char *Name(void) const { return name; } - int Frequency(void) const { return frequency; } + int Frequency(void) const { return frequency; } ///< Returns the actual frequency, as given in 'channels.conf' + int Transponder(void) const; ///< Returns the transponder frequency in MHz int Source(void) const { return source; } int Srate(void) const { return srate; } int Vpid(void) const { return vpid; } @@ -105,8 +120,11 @@ public: int Dpid1(void) const { return dpid1; } int Dpid2(void) const { return dpid2; } int Tpid(void) const { return tpid; } - int Ca(void) const { return ca; } + int Ca(int Index = 0) const { return Index < MAXCAIDS ? caids[Index] : 0; } + int Nid(void) const { return nid; } + int Tid(void) const { return tid; } int Sid(void) const { return sid; } + int Rid(void) const { return rid; } int Number(void) const { return number; } void SetNumber(int Number) { number = Number; } bool GroupSep(void) const { return groupSep; } @@ -123,24 +141,38 @@ public: bool IsSat(void) const { return (source & cSource::st_Mask) == cSource::stSat; } bool IsTerr(void) const { return (source & cSource::st_Mask) == cSource::stTerr; } tChannelID GetChannelID(void) const; + int Modification(int Mask = CHANNELMOD_ALL); + void SetId(int Nid, int Tid, int Sid, int Rid = 0, bool Log = true); + void SetName(const char *Name, bool Log = true); + void SetPids(int Vpid, int Ppid, int Apid1, int Apid2, int Dpid1, int Dpid2, int Tpid); + void SetCaIds(const int *CaIds); // list must be zero-terminated + void SetCaDescriptors(int Level); }; -class cChannels : public cConfig<cChannel> { -protected: +class cChannels : public cRwLock, public cConfig<cChannel> { +private: int maxNumber; + bool modified; + int beingEdited; public: - cChannels(void) { maxNumber = 0; } + cChannels(void); virtual bool Load(const char *FileName, bool AllowComments = false, bool MustExist = false); int GetNextGroup(int Idx); // Get next channel group int GetPrevGroup(int Idx); // Get previous channel group int GetNextNormal(int Idx); // Get next normal channel (not group) void ReNumber(void); // Recalculate 'number' based on channel type cChannel *GetByNumber(int Number, int SkipGap = 0); - cChannel *GetByServiceID(int Source, unsigned short ServiceID); + cChannel *GetByServiceID(int Source, int Transponder, unsigned short ServiceID); cChannel *GetByChannelID(tChannelID ChannelID, bool TryWithoutRid = false); + int BeingEdited(void) { return beingEdited; } + void IncBeingEdited(void) { beingEdited++; } + void DecBeingEdited(void) { beingEdited--; } bool HasUniqueChannelID(cChannel *NewChannel, cChannel *OldChannel = NULL); bool SwitchTo(int Number); int MaxNumber(void) { return maxNumber; } + void SetModified(void); + bool Modified(void); + cChannel *NewChannel(int Source, int Transponder, const char *Name, int Nid, int Tid, int Sid, int Rid = 0); }; extern cChannels Channels; @@ -4,14 +4,11 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: ci.c 1.17 2003/10/26 13:04:23 kls Exp $ + * $Id: ci.c 1.21 2004/01/02 15:07:36 kls Exp $ */ -/* XXX TODO -- update CA descriptors in case they change -XXX*/ - #include "ci.h" +#include <asm/unaligned.h> #include <ctype.h> #include <linux/dvb/ca.h> #include <malloc.h> @@ -21,6 +18,7 @@ XXX*/ #include <sys/ioctl.h> #include <time.h> #include <unistd.h> +#include "pat.h" #include "tools.h" /* these might come in handy in case you want to use this code without VDR's other files: @@ -793,10 +791,10 @@ bool cCiApplicationInformation::Process(int Length, const uint8_t *Data) if ((l -= 1) < 0) break; applicationType = *d++; if ((l -= 2) < 0) break; - applicationManufacturer = ntohs(*(uint16_t *)d); + applicationManufacturer = ntohs(get_unaligned((uint16_t *)d)); d += 2; if ((l -= 2) < 0) break; - manufacturerCode = ntohs(*(uint16_t *)d); + manufacturerCode = ntohs(get_unaligned((uint16_t *)d)); d += 2; free(menuString); menuString = GetString(l, &d); @@ -1265,8 +1263,9 @@ bool cCiEnquiry::Cancel(void) #define CPCI_QUERY 0x03 #define CPCI_NOT_SELECTED 0x04 -cCiCaPmt::cCiCaPmt(int ProgramNumber) +cCiCaPmt::cCiCaPmt(int Source, int Transponder, int ProgramNumber, const unsigned short *CaSystemIds) { + caDescriptorsLength = GetCaDescriptors(Source, Transponder, ProgramNumber, CaSystemIds, sizeof(caDescriptors), caDescriptors, streamFlag); length = 0; capmt[length++] = CPLM_ONLY; capmt[length++] = (ProgramNumber >> 8) & 0xFF; @@ -1275,20 +1274,31 @@ cCiCaPmt::cCiCaPmt(int ProgramNumber) esInfoLengthPos = length; capmt[length++] = 0x00; // program_info_length H (at program level) capmt[length++] = 0x00; // program_info_length L + if (!streamFlag) + AddCaDescriptors(caDescriptorsLength, caDescriptors); } -void cCiCaPmt::AddPid(int Pid) +bool cCiCaPmt::Valid(void) { - //XXX buffer overflow check??? - capmt[length++] = 0x00; //XXX stream_type (apparently doesn't matter) - capmt[length++] = (Pid >> 8) & 0xFF; - capmt[length++] = Pid & 0xFF; - esInfoLengthPos = length; - capmt[length++] = 0x00; // ES_info_length H (at ES level) - capmt[length++] = 0x00; // ES_info_length L + return caDescriptorsLength > 0; +} + +void cCiCaPmt::AddPid(int Pid, uint8_t StreamType) +{ + if (Pid) { + //XXX buffer overflow check??? + capmt[length++] = StreamType; + capmt[length++] = (Pid >> 8) & 0xFF; + capmt[length++] = Pid & 0xFF; + esInfoLengthPos = length; + capmt[length++] = 0x00; // ES_info_length H (at ES level) + capmt[length++] = 0x00; // ES_info_length L + if (streamFlag) + AddCaDescriptors(caDescriptorsLength, caDescriptors); + } } -void cCiCaPmt::AddCaDescriptor(int Length, uint8_t *Data) +void cCiCaPmt::AddCaDescriptors(int Length, const uint8_t *Data) { if (esInfoLengthPos) { if (length + Length < int(sizeof(capmt))) { @@ -1355,7 +1365,7 @@ cCiHandler *cCiHandler::CreateCiHandler(const char *FileName) int cCiHandler::ResourceIdToInt(const uint8_t *Data) { - return (ntohl(*(int *)Data)); + return (ntohl(get_unaligned((int32_t *)Data))); } bool cCiHandler::Send(uint8_t Tag, int SessionId, int ResourceId, int Status) @@ -1367,10 +1377,10 @@ bool cCiHandler::Send(uint8_t Tag, int SessionId, int ResourceId, int Status) if (Status >= 0) *p++ = Status; if (ResourceId) { - *(int *)p = htonl(ResourceId); + put_unaligned(htonl(ResourceId), (int32_t *)p); p += 4; } - *(short *)p = htons(SessionId); + put_unaligned(htons(SessionId), (uint16_t *)p); p += 2; buffer[1] = p - buffer - 2; // length return tc && tc->SendData(p - buffer, buffer) == OK; @@ -1481,7 +1491,7 @@ bool cCiHandler::Process(void) if (Data && Length > 1) { switch (*Data) { case ST_SESSION_NUMBER: if (Length > 4) { - int SessionId = ntohs(*(short *)&Data[2]); + int SessionId = ntohs(get_unaligned((uint16_t *)&Data[2])); cCiSession *Session = GetSessionBySessionId(SessionId); if (Session) Session->Process(Length - 4, Data + 4); @@ -1492,7 +1502,7 @@ bool cCiHandler::Process(void) case ST_OPEN_SESSION_REQUEST: OpenSession(Length, Data); break; case ST_CLOSE_SESSION_REQUEST: if (Length == 4) - CloseSession(ntohs(*(short *)&Data[2])); + CloseSession(ntohs(get_unaligned((uint16_t *)&Data[2]))); break; case ST_CREATE_SESSION_RESPONSE: //XXX fall through to default case ST_CLOSE_SESSION_RESPONSE: //XXX fall through to default @@ -1556,6 +1566,23 @@ const unsigned short *cCiHandler::GetCaSystemIds(int Slot) return cas ? cas->GetCaSystemIds() : NULL; } +bool cCiHandler::ProvidesCa(const unsigned short *CaSystemIds) +{ + cMutexLock MutexLock(&mutex); + for (int Slot = 0; Slot < numSlots; Slot++) { + cCiConditionalAccessSupport *cas = (cCiConditionalAccessSupport *)GetSessionByResourceId(RI_CONDITIONAL_ACCESS_SUPPORT, Slot); + if (cas) { + for (const unsigned short *ids = cas->GetCaSystemIds(); ids && *ids; ids++) { + for (const unsigned short *id = CaSystemIds; *id; id++) { + if (*id == *ids) + return true; + } + } + } + } + return false; +} + bool cCiHandler::SetCaPmt(cCiCaPmt &CaPmt, int Slot) { cMutexLock MutexLock(&mutex); @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: ci.h 1.9 2003/10/26 12:22:09 kls Exp $ + * $Id: ci.h 1.12 2003/12/31 13:49:49 kls Exp $ */ #ifndef __CI_H @@ -66,10 +66,14 @@ private: int length; int esInfoLengthPos; uint8_t capmt[2048]; ///< XXX is there a specified maximum? + int caDescriptorsLength; + uint8_t caDescriptors[2048]; + bool streamFlag; + void AddCaDescriptors(int Length, const uint8_t *Data); public: - cCiCaPmt(int ProgramNumber); - void AddPid(int Pid); - void AddCaDescriptor(int Length, uint8_t *Data); + cCiCaPmt(int Source, int Transponder, int ProgramNumber, const unsigned short *CaSystemIds); + bool Valid(void); + void AddPid(int Pid, uint8_t StreamType); }; #define MAX_CI_SESSION 16 //XXX @@ -107,6 +111,7 @@ public: cCiMenu *GetMenu(void); cCiEnquiry *GetEnquiry(void); const unsigned short *GetCaSystemIds(int Slot); + bool ProvidesCa(const unsigned short *CaSystemIds); //XXX Slot??? bool SetCaPmt(cCiCaPmt &CaPmt, int Slot); bool Reset(int Slot); }; @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: config.h 1.176.1.6 2003/11/14 13:29:13 kls Exp $ + * $Id: config.h 1.178 2003/12/27 13:57:56 kls Exp $ */ #ifndef __CONFIG_H @@ -19,8 +19,8 @@ #include "device.h" #include "tools.h" -#define VDRVERSION "1.2.6" -#define VDRVERSNUM 10206 // Version * 10000 + Major * 100 + Minor +#define VDRVERSION "1.3.0" +#define VDRVERSNUM 10300 // Version * 10000 + Major * 100 + Minor #define MAXPRIORITY 99 #define MAXLIFETIME 99 @@ -87,7 +87,7 @@ public: cConfig(void) { fileName = NULL; } virtual ~cConfig() { free(fileName); } const char *FileName(void) { return fileName; } - bool Load(const char *FileName = NULL, bool AllowComments = false, bool MustExist = false) + virtual bool Load(const char *FileName = NULL, bool AllowComments = false, bool MustExist = false) { Clear(); if (FileName) { @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: cutter.c 1.5 2003/08/17 09:04:04 kls Exp $ + * $Id: cutter.c 1.6 2003/10/18 11:29:37 kls Exp $ */ #include "cutter.h" @@ -32,6 +32,7 @@ public: }; cCuttingThread::cCuttingThread(const char *FromFileName, const char *ToFileName) +:cThread("video cutting") { error = NULL; active = false; @@ -62,8 +63,6 @@ cCuttingThread::~cCuttingThread() void cCuttingThread::Action(void) { - dsyslog("video cutting thread started (pid=%d)", getpid()); - cMark *Mark = fromMarks.First(); if (Mark) { fromFile = fromFileName->Open(); @@ -175,7 +174,6 @@ void cCuttingThread::Action(void) } else esyslog("no editing marks found!"); - dsyslog("end video cutting thread"); } // --- cCutter --------------------------------------------------------------- @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: device.c 1.47.1.1 2003/11/07 13:16:12 kls Exp $ + * $Id: device.c 1.51 2004/01/04 11:30:05 kls Exp $ */ #include "device.h" @@ -13,7 +13,6 @@ #include <sys/mman.h> #include "audio.h" #include "channels.h" -#include "eit.h" #include "i18n.h" #include "player.h" #include "receiver.h" @@ -36,6 +35,8 @@ cDevice::cDevice(void) { cardIndex = nextCardIndex++; + SetDescription("receiver on device %d", CardIndex() + 1); + SetVideoFormat(Setup.VideoFormat); active = false; @@ -43,6 +44,11 @@ cDevice::cDevice(void) mute = false; volume = Setup.CurrentVolume; + sectionHandler = NULL; + eitFilter = NULL; + patFilter = NULL; + sdtFilter = NULL; + ciHandler = NULL; player = NULL; @@ -63,6 +69,10 @@ cDevice::~cDevice() for (int i = 0; i < MAXRECEIVERS; i++) Detach(receiver[i]); delete ciHandler; + delete sdtFilter; + delete patFilter; + delete eitFilter; + delete sectionHandler; } void cDevice::SetUseDevice(int n) @@ -149,7 +159,7 @@ cDevice *cDevice::GetDevice(const cChannel *Channel, int Priority, bool *NeedsDe if (device[i]->ProvidesChannel(Channel, Priority, &ndr)) { // this device is basicly able to do the job if (device[i]->Receiving() && !ndr) pri = 0; // receiving and allows additional receivers - else if (d && !device[i]->Receiving() && device[i]->ProvidesCa(Channel->Ca()) < d->ProvidesCa(Channel->Ca())) + else if (d && !device[i]->Receiving() && device[i]->ProvidesCa(Channel) < d->ProvidesCa(Channel)) pri = 1; // free and fewer Ca's else if (!device[i]->Receiving() && !device[i]->IsPrimaryDevice()) pri = 2; // free and not the primary device @@ -157,7 +167,7 @@ cDevice *cDevice::GetDevice(const cChannel *Channel, int Priority, bool *NeedsDe pri = 3; // free else if (d && device[i]->Priority() < d->Priority()) pri = 4; // receiving but priority is lower - else if (d && device[i]->Priority() == d->Priority() && device[i]->ProvidesCa(Channel->Ca()) < d->ProvidesCa(Channel->Ca())) + else if (d && device[i]->Priority() == d->Priority() && device[i]->ProvidesCa(Channel) < d->ProvidesCa(Channel)) pri = 5; // receiving with same priority but fewer Ca's else pri = 6; // all others @@ -311,11 +321,42 @@ bool cDevice::SetPid(cPidHandle *Handle, int Type, bool On) return false; } +void cDevice::StartSectionHandler(void) +{ + if (!sectionHandler) { + sectionHandler = new cSectionHandler(this); + AttachFilter(eitFilter = new cEitFilter); + AttachFilter(patFilter = new cPatFilter); + AttachFilter(sdtFilter = new cSdtFilter(patFilter)); + sectionHandler->SetStatus(true); + } +} + +int cDevice::OpenFilter(u_short Pid, u_char Tid, u_char Mask) +{ + return -1; +} + +void cDevice::AttachFilter(cFilter *Filter) +{ + sectionHandler->Attach(Filter); +} + +void cDevice::Detach(cFilter *Filter) +{ + sectionHandler->Detach(Filter); +} + bool cDevice::ProvidesSource(int Source) const { return false; } +bool cDevice::ProvidesTransponder(const cChannel *Channel) const +{ + return false; +} + bool cDevice::ProvidesChannel(const cChannel *Channel, int Priority, bool *NeedsDetachReceivers) const { return false; @@ -398,16 +439,28 @@ eSetChannelResult cDevice::SetChannel(const cChannel *Channel, bool LiveView) Result = scrNotAvailable; } else { + Channels.Lock(false); cStatus::MsgChannelSwitch(this, 0); // only report status if we are actually going to switch the channel - if (!SetChannelDevice(Channel, LiveView)) + // Stop section handling: + if (sectionHandler) { + sectionHandler->SetStatus(false); + sectionHandler->SetSource(0, 0); + } + if (SetChannelDevice(Channel, LiveView)) { + // Start section handling: + if (sectionHandler) { + sectionHandler->SetSource(Channel->Source(), Channel->Transponder()); + sectionHandler->SetStatus(true); + } + } + else Result = scrFailed; + Channels.Unlock(); } if (Result == scrOk) { - if (LiveView && IsPrimaryDevice()) { - cSIProcessor::SetCurrentChannelID(Channel->GetChannelID()); + if (LiveView && IsPrimaryDevice()) currentChannel = Channel->Number(); - } cStatus::MsgChannelSwitch(this, Channel->Number()); // only report status if channel switch successfull } @@ -419,6 +472,11 @@ bool cDevice::SetChannelDevice(const cChannel *Channel, bool LiveView) return false; } +bool cDevice::HasLock(void) +{ + return true; +} + bool cDevice::HasProgramme(void) { return Replaying() || pidHandles[ptAudio].pid || pidHandles[ptVideo].pid; @@ -608,6 +666,7 @@ int cDevice::Priority(void) const int cDevice::CanShift(int Ca, int Priority, int UsedCards) const { return -1;//XXX+ too complex with multiple recordings per device + /*XXX // Test whether a receiver on this device can be shifted to another one // in order to perform a new receiving with the given Ca and Priority on this device: int ShiftLevel = -1; // default means this device can't be shifted @@ -638,25 +697,17 @@ int cDevice::CanShift(int Ca, int Priority, int UsedCards) const else if (Priority > this->Priority()) ShiftLevel = 0; // no shifting necessary, this device can do the job return ShiftLevel; + XXX*/ } -int cDevice::ProvidesCa(int Ca) const +int cDevice::ProvidesCa(const cChannel *Channel) const { + int Ca = Channel->Ca(); if (Ca == CardIndex() + 1) return 1; // exactly _this_ card was requested if (Ca && Ca <= MAXDEVICES) return 0; // a specific card was requested, but not _this_ one - int result = Ca ? 0 : 1; // by default every card can provide FTA - int others = Ca ? 1 : 0; - for (int i = 0; i < MAXCACAPS; i++) { - if (caCaps[i]) { - if (caCaps[i] == Ca) - result = 1; - else - others++; - } - } - return result ? result + others : 0; + return !Ca; // by default every card can provide FTA } bool cDevice::Receiving(bool CheckAny) const @@ -670,8 +721,6 @@ bool cDevice::Receiving(bool CheckAny) const void cDevice::Action(void) { - dsyslog("receiver thread started on device %d (pid=%d)", CardIndex() + 1, getpid()); - if (OpenDvr()) { active = true; for (; active;) { @@ -694,8 +743,6 @@ void cDevice::Action(void) } CloseDvr(); } - - dsyslog("receiver thread ended on device %d (pid=%d)", CardIndex() + 1, getpid()); } bool cDevice::OpenDvr(void) @@ -4,13 +4,18 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: device.h 1.35 2003/11/07 13:15:45 kls Exp $ + * $Id: device.h 1.37 2004/01/04 11:52:00 kls Exp $ */ #ifndef __DEVICE_H #define __DEVICE_H #include "ci.h" +#include "eit.h" +#include "filter.h" +#include "pat.h" +#include "sdt.h" +#include "sections.h" #include "thread.h" #include "tools.h" @@ -127,7 +132,8 @@ public: ///< Returns the card index of this device (0 ... MAXDEVICES - 1). int DeviceNumber(void) const; ///< Returns the number of this device (0 ... MAXDEVICES - 1). - int ProvidesCa(int Ca) const; + virtual int ProvidesCa(const cChannel *Channel) const;//XXX PLUGINS.html!!! + //XXX describe changed functionality!!! ///< Checks whether this device provides the given value in its ///< caCaps. Returns 0 if the value is not provided, 1 if only this ///< value is provided, and > 1 if this and other values are provided. @@ -157,6 +163,8 @@ protected: public: virtual bool ProvidesSource(int Source) const; ///< Returns true if this device can provide the given source. + virtual bool ProvidesTransponder(const cChannel *Channel) const; + ///< XXX -> PLUGINS.html! virtual bool ProvidesChannel(const cChannel *Channel, int Priority = -1, bool *NeedsDetachReceivers = NULL) const; ///< Returns true if this device can provide the given channel. ///< In case the device has cReceivers attached to it or it is the primary @@ -188,6 +196,10 @@ protected: public: static int CurrentChannel(void) { return primaryDevice ? currentChannel : 0; } ///< Returns the number of the current channel on the primary device. + virtual bool HasLock(void);//XXX PLUGINS.html + ///< Returns true if the device has a lock on the requested transponder. + ///< Default is true, a specific device implementation may return false + ///< to indicate that it is not ready yet. virtual bool HasProgramme(void); ///< Returns true if the device is currently showing any programme to ///< the user, either through replaying or live. @@ -222,6 +234,27 @@ protected: ///< Type indicates some special types of PIDs, which the device may ///< need to set in a specific way. +// Section filter facilities + +private: + cSectionHandler *sectionHandler; + cEitFilter *eitFilter; + cPatFilter *patFilter; + cSdtFilter *sdtFilter; +protected: + void StartSectionHandler(void); + ///< A derived device that provides section data must call + ///< this function to actually set up the section handler. +public: + virtual int OpenFilter(u_short Pid, u_char Tid, u_char Mask); + ///< Opens a file handle for the given filter data. + ///< A derived device that provides section data must + ///< implement this function. + void AttachFilter(cFilter *Filter); + ///< Attaches the given filter to this device. + void Detach(cFilter *Filter); + ///< Detaches the given filter from this device. + // Common Interface facilities: protected: diff --git a/dvbdevice.c b/dvbdevice.c index 5ae8c6f..e42ff4b 100644 --- a/dvbdevice.c +++ b/dvbdevice.c @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: dvbdevice.c 1.67.1.4 2003/11/09 11:08:22 kls Exp $ + * $Id: dvbdevice.c 1.76 2004/01/04 14:48:37 kls Exp $ */ #include "dvbdevice.h" @@ -86,7 +86,7 @@ public: virtual ~cDvbTuner(); bool IsTunedTo(const cChannel *Channel) const; void Set(const cChannel *Channel, bool Tune, bool UseCa); - bool Locked(void) { return tunerStatus == tsLocked; } + bool Locked(void) { return tunerStatus >= tsLocked; } }; cDvbTuner::cDvbTuner(int Fd_Frontend, int CardIndex, fe_type_t FrontendType, cCiHandler *CiHandler) @@ -100,6 +100,7 @@ cDvbTuner::cDvbTuner(int Fd_Frontend, int CardIndex, fe_type_t FrontendType, cCi useCa = false; tunerStatus = tsIdle; startTime = time(NULL); + SetDescription("tuner on device %d", cardIndex + 1); Start(); } @@ -113,19 +114,18 @@ cDvbTuner::~cDvbTuner() bool cDvbTuner::IsTunedTo(const cChannel *Channel) const { - return tunerStatus != tsIdle && channel.Source() == Channel->Source() && channel.Frequency() == Channel->Frequency(); + return tunerStatus != tsIdle && channel.Source() == Channel->Source() && channel.Transponder() == Channel->Transponder(); } void cDvbTuner::Set(const cChannel *Channel, bool Tune, bool UseCa) { cMutexLock MutexLock(&mutex); - bool CaChange = !(Channel->GetChannelID() == channel.GetChannelID()); if (Tune) tunerStatus = tsSet; - else if (tunerStatus == tsCam && CaChange) + else if (tunerStatus == tsCam) tunerStatus = tsTuned; useCa = UseCa; - if (Channel->Ca() && CaChange) + if (Channel->Ca() && tunerStatus != tsCam) startTime = time(NULL); channel = *Channel; newSet.Broadcast(); @@ -247,7 +247,6 @@ bool cDvbTuner::SetFrontend(void) void cDvbTuner::Action(void) { - dsyslog("tuner thread started on device %d (pid=%d)", cardIndex + 1, getpid()); active = true; while (active) { cMutexLock MutexLock(&mutex); @@ -268,41 +267,31 @@ void cDvbTuner::Action(void) continue; } } - if (tunerStatus >= tsLocked) { - if (ciHandler) { - if (ciHandler->Process() && useCa) { - if (tunerStatus != tsCam) {//XXX TODO update in case the CA descriptors have changed - for (int Slot = 0; Slot < ciHandler->NumSlots(); Slot++) { - uchar buffer[2048]; - int length = cSIProcessor::GetCaDescriptors(channel.Source(), channel.Frequency(), channel.Sid(), ciHandler->GetCaSystemIds(Slot), sizeof(buffer), buffer); - if (length > 0) { - cCiCaPmt CaPmt(channel.Sid()); - CaPmt.AddCaDescriptor(length, buffer); - if (channel.Vpid()) - CaPmt.AddPid(channel.Vpid()); - if (channel.Apid1()) - CaPmt.AddPid(channel.Apid1()); - if (channel.Apid2()) - CaPmt.AddPid(channel.Apid2()); - if (channel.Dpid1()) - CaPmt.AddPid(channel.Dpid1()); - if (ciHandler->SetCaPmt(CaPmt, Slot)) { - tunerStatus = tsCam; - startTime = 0; - } - } + } + if (ciHandler) { + if (ciHandler->Process() && useCa) { + if (tunerStatus == tsLocked) { + for (int Slot = 0; Slot < ciHandler->NumSlots(); Slot++) { + cCiCaPmt CaPmt(channel.Source(), channel.Frequency(), channel.Sid(), ciHandler->GetCaSystemIds(Slot)); + if (CaPmt.Valid()) { + CaPmt.AddPid(channel.Vpid(), 2); + CaPmt.AddPid(channel.Apid1(), 4); + CaPmt.AddPid(channel.Apid2(), 4); + CaPmt.AddPid(channel.Dpid1(), 0); + if (ciHandler->SetCaPmt(CaPmt, Slot)) { + tunerStatus = tsCam; + startTime = 0; } - } - } - else - tunerStatus = tsLocked; + } + } } } + else if (tunerStatus > tsLocked) + tunerStatus = tsLocked; } // in the beginning we loop more often to let the CAM connection start up fast newSet.TimedWait(mutex, (ciHandler && (time(NULL) - startTime < 20)) ? 100 : 1000); } - dsyslog("tuner thread ended on device %d (pid=%d)", cardIndex + 1, getpid()); } // --- cDvbDevice ------------------------------------------------------------ @@ -313,13 +302,12 @@ cDvbDevice::cDvbDevice(int n) { dvbTuner = NULL; frontendType = fe_type_t(-1); // don't know how else to initialize this - there is no FE_UNKNOWN - siProcessor = NULL; spuDecoder = NULL; playMode = pmNone; // Devices that are present on all card types: - int fd_frontend = DvbOpen(DEV_DVB_FRONTEND, n, O_RDWR | O_NONBLOCK); + int fd_frontend = DvbOpen(DEV_DVB_FRONTEND, n, O_RDWR | O_NONBLOCK); // Devices that are only present on cards with decoders: @@ -369,7 +357,6 @@ cDvbDevice::cDvbDevice(int n) if (fd_frontend >= 0) { dvb_frontend_info feinfo; - siProcessor = new cSIProcessor(DvbName(DEV_DVB_DEMUX, n)); if (ioctl(fd_frontend, FE_GET_INFO, &feinfo) >= 0) { frontendType = feinfo.type; ciHandler = cCiHandler::CreateCiHandler(DvbName(DEV_DVB_CA, n)); @@ -382,12 +369,13 @@ cDvbDevice::cDvbDevice(int n) esyslog("ERROR: can't open DVB device %d", n); aPid1 = aPid2 = 0; + + StartSectionHandler(); } cDvbDevice::~cDvbDevice() { delete spuDecoder; - delete siProcessor; delete dvbTuner; // We're not explicitly closing any device files here, since this sometimes // caused segfaults. Besides, the program is about to terminate anyway... @@ -445,6 +433,17 @@ bool cDvbDevice::HasDecoder(void) const return fd_video >= 0 && fd_audio >= 0; } +int cDvbDevice::ProvidesCa(const cChannel *Channel) const +{ + if (Channel->Ca() >= 0x0100 && ciHandler) { + unsigned short ids[MAXCAIDS + 1]; + for (int i = 0; i <= MAXCAIDS; i++) // '<=' copies the terminating 0! + ids[i] = Channel->Ca(i); + return ciHandler->ProvidesCa(ids); + } + return cDevice::ProvidesCa(Channel); +} + cOsdBase *cDvbDevice::NewOsd(int x, int y) { return new cDvbOsd(x, y); @@ -618,6 +617,30 @@ bool cDvbDevice::SetPid(cPidHandle *Handle, int Type, bool On) return true; } +int cDvbDevice::OpenFilter(u_short Pid, u_char Tid, u_char Mask) +{ + const char *FileName = DvbName(DEV_DVB_DEMUX, CardIndex()); + int f = open(FileName, O_RDWR | O_NONBLOCK); + if (f >= 0) { + dmx_sct_filter_params sctFilterParams; + memset(&sctFilterParams, 0, sizeof(sctFilterParams)); + sctFilterParams.pid = Pid; + sctFilterParams.timeout = 0; + sctFilterParams.flags = DMX_IMMEDIATE_START; + sctFilterParams.filter.filter[0] = Tid; + sctFilterParams.filter.mask[0] = Mask; + if (ioctl(f, DMX_SET_FILTER, &sctFilterParams) >= 0) + return f; + else { + esyslog("ERROR: can't set filter (pid=%d, tid=%02X, mask=%02X)", Pid, Tid, Mask); + close(f); + } + } + else + esyslog("ERROR: can't open filter handle on '%s'", FileName); + return -1; +} + void cDvbDevice::TurnOffLiveMode(void) { // Avoid noise while switching: @@ -646,13 +669,18 @@ bool cDvbDevice::ProvidesSource(int Source) const return true; } +bool cDvbDevice::ProvidesTransponder(const cChannel *Channel) const +{ + return ProvidesSource(Channel->Source()) && ((Channel->Source() & cSource::st_Mask) != cSource::stSat || Diseqcs.Get(Channel->Source(), Channel->Frequency(), Channel->Polarization())); +} + bool cDvbDevice::ProvidesChannel(const cChannel *Channel, int Priority, bool *NeedsDetachReceivers) const { bool result = false; bool hasPriority = Priority < 0 || Priority > this->Priority(); bool needsDetachReceivers = false; - if (ProvidesSource(Channel->Source()) && ProvidesCa(Channel->Ca())) { + if ((Channel->Vpid() || Channel->Apid1()) && ProvidesSource(Channel->Source()) && ProvidesCa(Channel)) { result = hasPriority; if (Priority >= 0 && Receiving()) { if (dvbTuner->IsTunedTo(Channel)) { @@ -716,27 +744,19 @@ bool cDvbDevice::SetChannelDevice(const cChannel *Channel, bool LiveView) TurnOnLivePIDs = false; } - // Stop SI filtering: - - if (siProcessor) { - siProcessor->SetCurrentTransponder(0, 0); - siProcessor->SetStatus(false); - } - // Turn off live PIDs if necessary: if (TurnOffLivePIDs) TurnOffLiveMode(); - dvbTuner->Set(Channel, DoTune, !EITScanner.UsesDevice(this)); //XXX 1.3: this is an ugly hack - find a cleaner solution + dvbTuner->Set(Channel, DoTune, !EITScanner.UsesDevice(this)); //XXX 1.3: this is an ugly hack - find a cleaner solution//XXX // PID settings: if (TurnOnLivePIDs) { aPid1 = Channel->Apid1(); aPid2 = Channel->Apid2(); - int pPid = Channel->Ppid() ? Channel->Ppid() : Channel->Vpid(); - if (!(AddPid(pPid, ptPcr) && AddPid(Channel->Apid1(), ptAudio) && AddPid(Channel->Vpid(), ptVideo))) {//XXX+ dolby dpid1!!! (if audio plugins are attached) + if (!(AddPid(Channel->Ppid(), ptPcr) && AddPid(Channel->Apid1(), ptAudio) && AddPid(Channel->Vpid(), ptVideo))) {//XXX+ dolby dpid1!!! (if audio plugins are attached) esyslog("ERROR: failed to set PIDs for channel %d on device %d", Channel->Number(), CardIndex() + 1); return false; } @@ -747,16 +767,14 @@ bool cDvbDevice::SetChannelDevice(const cChannel *Channel, bool LiveView) else if (StartTransferMode) cControl::Launch(new cTransferControl(this, Channel->Vpid(), Channel->Apid1(), Channel->Apid2(), Channel->Dpid1(), Channel->Dpid2())); - // Start SI filtering: - - if (siProcessor) { - siProcessor->SetCurrentTransponder(Channel->Source(), Channel->Frequency()); - siProcessor->SetStatus(true); - } - return true; } +bool cDvbDevice::HasLock(void) +{ + return dvbTuner->Locked(); +} + void cDvbDevice::SetVolumeDevice(int Volume) { if (HasDecoder()) { @@ -830,16 +848,12 @@ bool cDvbDevice::SetPlayMode(ePlayMode PlayMode) CHECK(ioctl(fd_audio, AUDIO_SELECT_SOURCE, AUDIO_SOURCE_DEMUX)); CHECK(ioctl(fd_audio, AUDIO_SET_AV_SYNC, true)); CHECK(ioctl(fd_audio, AUDIO_SET_MUTE, false)); - if (siProcessor) - siProcessor->SetStatus(true); break; case pmAudioVideo: if (playMode == pmNone) TurnOffLiveMode(); // continue with next... case pmAudioOnlyBlack: - if (siProcessor) - siProcessor->SetStatus(false); CHECK(ioctl(fd_video, VIDEO_SET_BLANK, true)); CHECK(ioctl(fd_audio, AUDIO_SELECT_SOURCE, AUDIO_SOURCE_MEMORY)); CHECK(ioctl(fd_audio, AUDIO_SET_AV_SYNC, PlayMode == pmAudioVideo)); @@ -848,8 +862,6 @@ bool cDvbDevice::SetPlayMode(ePlayMode PlayMode) CHECK(ioctl(fd_video, VIDEO_PLAY)); break; case pmAudioOnly: - if (siProcessor) - siProcessor->SetStatus(false); CHECK(ioctl(fd_video, VIDEO_SET_BLANK, true)); CHECK(ioctl(fd_audio, AUDIO_STOP, true)); CHECK(ioctl(fd_audio, AUDIO_CLEAR_BUFFER)); @@ -859,8 +871,6 @@ bool cDvbDevice::SetPlayMode(ePlayMode PlayMode) CHECK(ioctl(fd_video, VIDEO_SET_BLANK, false)); break; case pmExtern_THIS_SHOULD_BE_AVOIDED: - if (siProcessor) - siProcessor->SetStatus(false); close(fd_video); close(fd_audio); fd_video = fd_audio = -1; diff --git a/dvbdevice.h b/dvbdevice.h index 56f1c2b..f64e6dd 100644 --- a/dvbdevice.h +++ b/dvbdevice.h @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: dvbdevice.h 1.24 2003/11/07 13:17:13 kls Exp $ + * $Id: dvbdevice.h 1.26 2004/01/03 10:21:50 kls Exp $ */ #ifndef __DVBDEVICE_H @@ -14,7 +14,6 @@ #include <linux/dvb/version.h> #include "device.h" #include "dvbspu.h" -#include "eit.h" #if DVB_API_VERSION != 3 #error VDR requires Linux DVB driver API version 3! @@ -45,6 +44,7 @@ protected: public: cDvbDevice(int n); virtual ~cDvbDevice(); + virtual int ProvidesCa(const cChannel *Channel) const; virtual bool HasDecoder(void) const; // OSD facilities @@ -62,15 +62,23 @@ private: void TurnOffLiveMode(void); public: virtual bool ProvidesSource(int Source) const; + virtual bool ProvidesTransponder(const cChannel *Channel) const; virtual bool ProvidesChannel(const cChannel *Channel, int Priority = -1, bool *NeedsDetachReceivers = NULL) const; protected: virtual bool SetChannelDevice(const cChannel *Channel, bool LiveView); +public: + virtual bool HasLock(void); // PID handle facilities protected: virtual bool SetPid(cPidHandle *Handle, int Type, bool On); +// Section filter facilities + +protected: + virtual int OpenFilter(u_short Pid, u_char Tid, u_char Mask); + // Image Grab facilities private: @@ -95,11 +103,6 @@ protected: virtual const char **GetAudioTracksDevice(int *CurrentTrack = NULL) const; virtual void SetAudioTrackDevice(int Index); -// EIT facilities - -private: - cSIProcessor *siProcessor; - // Player facilities protected: diff --git a/dvbplayer.c b/dvbplayer.c index 6b7fe07..c3bd542 100644 --- a/dvbplayer.c +++ b/dvbplayer.c @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: dvbplayer.c 1.22 2003/05/24 09:04:26 kls Exp $ + * $Id: dvbplayer.c 1.23 2003/10/18 11:31:54 kls Exp $ */ #include "dvbplayer.h" @@ -93,6 +93,7 @@ public: }; cNonBlockingFileReader::cNonBlockingFileReader(void) +:cThread("non blocking file reader") { f = -1; buffer = NULL; @@ -146,7 +147,6 @@ int cNonBlockingFileReader::Read(int FileHandle, uchar *Buffer, int Length) void cNonBlockingFileReader::Action(void) { - dsyslog("non blocking file reader thread started (pid=%d)", getpid()); active = true; while (active) { cMutexLock MutexLock(&mutex); @@ -165,7 +165,6 @@ void cNonBlockingFileReader::Action(void) } newSet.TimedWait(mutex, 1000); } - dsyslog("non blocking file reader thread ended (pid=%d)", getpid()); } // --- cDvbPlayer ------------------------------------------------------------ @@ -235,6 +234,7 @@ public: int cDvbPlayer::Speeds[] = { 0, -2, -4, -8, 1, 2, 4, 12, 0 }; cDvbPlayer::cDvbPlayer(const char *FileName) +:cThread("dvbplayer") { nonBlockingFileReader = NULL; ringBuffer = NULL; @@ -405,8 +405,6 @@ void cDvbPlayer::Activate(bool On) void cDvbPlayer::Action(void) { - dsyslog("dvbplayer thread started (pid=%d)", getpid()); - uchar *b = NULL; uchar *p = NULL; int pc = 0; @@ -550,8 +548,6 @@ void cDvbPlayer::Action(void) cNonBlockingFileReader *nbfr = nonBlockingFileReader; nonBlockingFileReader = NULL; delete nbfr; - - dsyslog("dvbplayer thread ended (pid=%d)", getpid()); } void cDvbPlayer::Pause(void) @@ -1,1483 +1,201 @@ -/*************************************************************************** - eit.c - description - ------------------- - begin : Fri Aug 25 2000 - copyright : (C) 2000 by Robert Schneider - email : Robert.Schneider@web.de - - 2001-08-15: Adapted to 'libdtv' by Rolf Hakenes <hakenes@hippomi.de> - - ***************************************************************************/ - -/*************************************************************************** - * * - * 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. * - * * - * $Id: eit.c 1.80 2003/10/12 11:05:42 kls Exp $ - ***************************************************************************/ +/* + * eit.c: EIT section filter + * + * See the main source file 'vdr.c' for copyright information and + * how to reach the author. + * + * Original version (as used in VDR before 1.3.0) written by + * Robert Schneider <Robert.Schneider@web.de> and Rolf Hakenes <hakenes@hippomi.de>. + * Adapted to 'libsi' for VDR 1.3.0 by Marcel Wiesweg <marcel.wiesweg@gmx.de>. + * + * $Id: eit.c 1.84 2004/01/02 22:27:29 kls Exp $ + */ #include "eit.h" -#include <ctype.h> -#include <fcntl.h> -#include <limits.h> -#include <linux/dvb/dmx.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <sys/ioctl.h> -#include <sys/poll.h> -#include <sys/stat.h> -#include <sys/types.h> -#include <time.h> -#include <unistd.h> -#include "channels.h" -#include "config.h" -#include "libdtv/libdtv.h" -#include "videodir.h" - -// --- cMJD ------------------------------------------------------------------ - -class cMJD { -public: - cMJD(); - cMJD(u_char date_hi, u_char date_lo); - cMJD(u_char date_hi, u_char date_lo, u_char timehr, u_char timemi, u_char timese); - ~cMJD(); - /** */ - void ConvertToTime(); - /** */ - bool SetSystemTime(); - /** */ - time_t GetTime_t(); -protected: // Protected attributes - /** */ - time_t mjdtime; -protected: // Protected attributes - /** */ - u_char time_second; -protected: // Protected attributes - /** */ - u_char time_minute; -protected: // Protected attributes - /** */ - u_char time_hour; -protected: // Protected attributes - /** */ - u_short mjd; -}; - -cMJD::cMJD() -{ -} - -cMJD::cMJD(u_char date_hi, u_char date_lo) -{ - mjd = date_hi << 8 | date_lo; - time_hour = time_minute = time_second = 0; - ConvertToTime(); -} - -cMJD::cMJD(u_char date_hi, u_char date_lo, u_char timehr, u_char timemi, u_char timese) -{ - mjd = date_hi << 8 | date_lo; - time_hour = timehr; - time_minute = timemi; - time_second = timese; - ConvertToTime(); -} - -cMJD::~cMJD() -{ -} - -/** */ -void cMJD::ConvertToTime() -{ - struct tm t; - - t.tm_sec = time_second; - t.tm_min = time_minute; - t.tm_hour = time_hour; - int k; +#include "epg.h" +#include "libsi/section.h" +#include "libsi/descriptor.h" - t.tm_year = (int) ((mjd - 15078.2) / 365.25); - t.tm_mon = (int) ((mjd - 14956.1 - (int)(t.tm_year * 365.25)) / 30.6001); - t.tm_mday = (int) (mjd - 14956 - (int)(t.tm_year * 365.25) - (int)(t.tm_mon * 30.6001)); - k = (t.tm_mon == 14 || t.tm_mon == 15) ? 1 : 0; - t.tm_year = t.tm_year + k; - t.tm_mon = t.tm_mon - 1 - k * 12; - t.tm_mon--; - - t.tm_isdst = -1; - t.tm_gmtoff = 0; - - mjdtime = timegm(&t); - - //isyslog("Time parsed = %s\n", ctime(&mjdtime)); -} - -/** */ -bool cMJD::SetSystemTime() -{ - struct tm *ptm; - time_t loctim; - - struct tm tm_r; - ptm = localtime_r(&mjdtime, &tm_r); - loctim = time(NULL); - - if (abs(mjdtime - loctim) > 2) - { - isyslog("System Time = %s (%ld)\n", ctime(&loctim), loctim); - isyslog("Local Time = %s (%ld)\n", ctime(&mjdtime), mjdtime); - if (stime(&mjdtime) < 0) - esyslog("ERROR while setting system time: %m"); - return true; - } - - return false; -} -/** */ -time_t cMJD::GetTime_t() -{ - return mjdtime; -} - -// --- cTDT ------------------------------------------------------------------ +// --- cEIT ------------------------------------------------------------------ -class cTDT { +class cEIT : public SI::EIT { public: - cTDT(tdt_t *ptdt); - ~cTDT(); - /** */ - bool SetSystemTime(); -protected: // Protected attributes - /** */ - tdt_t tdt; - /** */ - cMJD mjd; // kls 2001-03-02: made this a member instead of a pointer (it wasn't deleted in the destructor!) -}; - -#define BCD2DEC(b) (((b >> 4) & 0x0F) * 10 + (b & 0x0F)) - -cTDT::cTDT(tdt_t *ptdt) -:tdt(*ptdt) -,mjd(tdt.utc_mjd_hi, tdt.utc_mjd_lo, BCD2DEC(tdt.utc_time_h), BCD2DEC(tdt.utc_time_m), BCD2DEC(tdt.utc_time_s)) -{ -} - -cTDT::~cTDT() -{ -} -/** */ -bool cTDT::SetSystemTime() -{ - return mjd.SetSystemTime(); -} - -// --- cEventInfo ------------------------------------------------------------ - -cEventInfo::cEventInfo(tChannelID channelid, unsigned short eventid) -{ - pTitle = NULL; - pSubtitle = NULL; - pExtendedDescription = NULL; - bIsPresent = bIsFollowing = false; - lDuration = 0; - tTime = 0; - uTableID = 0; - uEventID = eventid; - channelID = channelid; - nChannelNumber = 0; -} - -cEventInfo::~cEventInfo() -{ - free(pTitle); - free(pSubtitle); - free(pExtendedDescription); -} - -/** */ -const char * cEventInfo::GetTitle() const -{ - return pTitle; -} -/** */ -const char * cEventInfo::GetSubtitle() const -{ - return pSubtitle; -} -/** */ -const char * cEventInfo::GetExtendedDescription() const -{ - return pExtendedDescription; -} -/** */ -bool cEventInfo::IsPresent() const -{ - return bIsPresent; -} -/** */ -void cEventInfo::SetPresent(bool pres) -{ - bIsPresent = pres; -} -/** */ -bool cEventInfo::IsFollowing() const -{ - return bIsFollowing; -} - -void cEventInfo::SetTableID(unsigned char tableid) -{ - uTableID = tableid; -} - -/** */ -void cEventInfo::SetFollowing(bool foll) -{ - bIsFollowing = foll; -} -/** */ -const char * cEventInfo::GetDate() const -{ - static char szDate[25]; - - struct tm tm_r; - strftime(szDate, sizeof(szDate), "%d.%m.%Y", localtime_r(&tTime, &tm_r)); - - return szDate; -} - -const unsigned char cEventInfo::GetTableID(void) const -{ - return uTableID; -} - -/** */ -const char * cEventInfo::GetTimeString() const -{ - static char szTime[25]; - - struct tm tm_r; - strftime(szTime, sizeof(szTime), "%R", localtime_r(&tTime, &tm_r)); - - return szTime; -} -/** */ -const char * cEventInfo::GetEndTimeString() const -{ - static char szEndTime[25]; - time_t tEndTime = tTime + lDuration; - - struct tm tm_r; - strftime(szEndTime, sizeof(szEndTime), "%R", localtime_r(&tEndTime, &tm_r)); + cEIT(cSchedules *Schedules, int Source, u_char Tid, const u_char *Data); + }; - return szEndTime; -} -/** */ -time_t cEventInfo::GetTime() const -{ - return tTime; -} -/** */ -long cEventInfo::GetDuration() const -{ - return lDuration; -} -/** */ -unsigned short cEventInfo::GetEventID() const -{ - return uEventID; -} -/** */ -void cEventInfo::SetTitle(const char *string) -{ - pTitle = strcpyrealloc(pTitle, string); -} -/** */ -void cEventInfo::SetSubtitle(const char *string) -{ - pSubtitle = strcpyrealloc(pSubtitle, string); -} -/** */ -void cEventInfo::SetExtendedDescription(const char *string) -{ - pExtendedDescription = strcpyrealloc(pExtendedDescription, string); -} -/** */ -void cEventInfo::SetTime(time_t t) -{ - tTime = t; -} -/** */ -void cEventInfo::SetDuration(long l) -{ - lDuration = l; -} -/** */ -void cEventInfo::SetEventID(unsigned short evid) +cEIT::cEIT(cSchedules *Schedules, int Source, u_char Tid, const u_char *Data) +:SI::EIT(Data, false) { - uEventID = evid; -} -/** */ -void cEventInfo::SetChannelID(tChannelID channelid) -{ - channelID = channelid; -} + if (!CheckCRCAndParse()) + return; -/** */ -tChannelID cEventInfo::GetChannelID() const -{ - return channelID; -} + tChannelID channelID(Source, getOriginalNetworkId(), getTransportStreamId(), getServiceId()); + cChannel *channel = Channels.GetByChannelID(channelID, true); + if (!channel) + return; // only collect data for known channels -/** */ -void cEventInfo::Dump(FILE *f, const char *Prefix) const -{ - if (tTime + lDuration >= time(NULL)) { - fprintf(f, "%sE %u %ld %ld %X\n", Prefix, uEventID, tTime, lDuration, uTableID); - if (!isempty(pTitle)) - fprintf(f, "%sT %s\n", Prefix, pTitle); - if (!isempty(pSubtitle)) - fprintf(f, "%sS %s\n", Prefix, pSubtitle); - if (!isempty(pExtendedDescription)) - fprintf(f, "%sD %s\n", Prefix, pExtendedDescription); - fprintf(f, "%se\n", Prefix); - } -} + cEvent *rEvent = NULL; -bool cEventInfo::Read(FILE *f, cSchedule *Schedule) -{ - if (Schedule) { - cEventInfo *pEvent = NULL; - char *s; - while ((s = readline(f)) != NULL) { - char *t = skipspace(s + 1); - switch (*s) { - case 'E': if (!pEvent) { - unsigned int uEventID; - time_t tTime; - long lDuration; - unsigned int uTableID = 0; - int n = sscanf(t, "%u %ld %ld %X", &uEventID, &tTime, &lDuration, &uTableID); - if (n == 3 || n == 4) { - pEvent = (cEventInfo *)Schedule->GetEvent(uEventID, tTime); - if (!pEvent) - pEvent = Schedule->AddEvent(new cEventInfo(Schedule->GetChannelID(), uEventID)); - if (pEvent) { - pEvent->SetTableID(uTableID); - pEvent->SetTime(tTime); - pEvent->SetDuration(lDuration); - } - } - } - break; - case 'T': if (pEvent) - pEvent->SetTitle(t); - break; - case 'S': if (pEvent) - pEvent->SetSubtitle(t); - break; - case 'D': if (pEvent) - pEvent->SetExtendedDescription(t); - break; - case 'e': pEvent = NULL; - break; - case 'c': // to keep things simple we react on 'c' here - return true; - default: esyslog("ERROR: unexpected tag while reading EPG data: %s", s); - return false; - } - } - esyslog("ERROR: unexpected end of file while reading EPG data"); + cSchedule *pSchedule = (cSchedule *)Schedules->GetSchedule(channelID); + if (!pSchedule) { + pSchedule = new cSchedule(channelID); + Schedules->Add(pSchedule); } - return false; -} - -#define MAXEPGBUGFIXSTATS 7 -#define MAXEPGBUGFIXCHANS 100 -struct tEpgBugFixStats { - int hits; - int n; - tChannelID channelIDs[MAXEPGBUGFIXCHANS]; - tEpgBugFixStats(void) { hits = n = 0; } - }; -tEpgBugFixStats EpgBugFixStats[MAXEPGBUGFIXSTATS]; - -static void EpgBugFixStat(int Number, tChannelID ChannelID) -{ - if (0 <= Number && Number < MAXEPGBUGFIXSTATS) { - tEpgBugFixStats *p = &EpgBugFixStats[Number]; - p->hits++; - int i = 0; - for (; i < p->n; i++) { - if (p->channelIDs[i] == ChannelID) - break; + SI::EIT::Event SiEitEvent; + for (SI::Loop::Iterator it; eventLoop.hasNext(it); ) { + SiEitEvent = eventLoop.getNext(it); + + cEvent *pEvent = (cEvent *)pSchedule->GetEvent(SiEitEvent.getEventId(), SiEitEvent.getStartTime()); + if (!pEvent) { + // If we don't have that event ID yet, we create a new one. + // Otherwise we copy the information into the existing event anyway, because the data might have changed. + pEvent = pSchedule->AddEvent(new cEvent(channelID, SiEitEvent.getEventId())); + if (!pEvent) + continue; + pEvent->SetTableID(Tid); } - if (i == p->n && p->n < MAXEPGBUGFIXCHANS) - p->channelIDs[p->n++] = ChannelID; - } -} - -static void ReportEpgBugFixStats(bool Reset = false) -{ - if (Setup.EPGBugfixLevel > 0) { - bool GotHits = false; - char buffer[1024]; - for (int i = 0; i < MAXEPGBUGFIXSTATS; i++) { - const char *delim = "\t"; - tEpgBugFixStats *p = &EpgBugFixStats[i]; - if (p->hits) { - bool PrintedStats = false; - char *q = buffer; - *buffer = 0; - for (int c = 0; c < p->n; c++) { - cChannel *channel = Channels.GetByChannelID(p->channelIDs[c], true); - if (channel) { - if (!GotHits) { - dsyslog("====================="); - dsyslog("EPG bugfix statistics"); - dsyslog("====================="); - dsyslog("IF SOMEBODY WHO IS IN CHARGE OF THE EPG DATA FOR ONE OF THE LISTED"); - dsyslog("CHANNELS READS THIS: PLEASE TAKE A LOOK AT THE FUNCTION cEventInfo::FixEpgBugs()"); - dsyslog("IN VDR/eit.c TO LEARN WHAT'S WRONG WITH YOUR DATA, AND FIX IT!"); - dsyslog("====================="); - dsyslog("Fix\tHits\tChannels"); - GotHits = true; - } - if (!PrintedStats) { - q += snprintf(q, sizeof(buffer) - (q - buffer), "%d\t%d", i, p->hits); - PrintedStats = true; - } - q += snprintf(q, sizeof(buffer) - (q - buffer), "%s%s", delim, channel->Name()); - delim = ", "; - } - } - if (*buffer) - dsyslog("%s", buffer); - } - if (Reset) - p->hits = p->n = 0; + else { + // We have found an existing event, either through its event ID or its start time. + // If the existing event has a zero table ID it was defined externally and shall + // not be overwritten. + if (pEvent->TableID() == 0x00) + continue; + // If the new event comes from a table that belongs to an "other TS" and the existing + // one comes from an "actual TS" table, let's skip it. + #define ISACTUALTS(tid) (tid == 0x4E || (tid & 0x50) == 0x50) + if (!ISACTUALTS(Tid) && ISACTUALTS(pEvent->TableID())) + continue; + // If the new event comes from a "schedule" table and the existing one comes from + // a "present/following" table, let's skip it (the p/f table usually contains more + // information, like e.g. a description). + if ((Tid & 0x50) == 0x50 && pEvent->TableID() == 0x4E || (Tid & 0x60) == 0x60 && pEvent->TableID() == 0x4F) + continue; + // If both events come from the same "schedule" table and the new event's table id is larger than the + // existing one's, let's skip it (higher tids mean "farther in the future" and usually have less information). + if (((Tid & 0x50) == 0x50 || (Tid & 0x60) == 0x60) && (pEvent->TableID() & 0xF0) == (Tid & 0xF0) && (Tid > pEvent->TableID())) + continue; + // If the new event comes from the same table and has the same version number + // as the existing one, let's skip it to avoid unnecessary work. + // Unfortunately some stations (like, e.g. "Premiere") broadcast their EPG data on several transponders (like + // the actual Premiere transponder and the Sat.1/Pro7 transponder), but use different version numbers on + // each of them :-( So if one DVB card is tuned to the Premiere transponder, while an other one is tuned + // to the Sat.1/Pro7 transponder, events will keep toggling because of the bogus version numbers. + if (Tid == pEvent->TableID() && pEvent->Version() == getVersionNumber()) + continue; } - if (GotHits) - dsyslog("====================="); - } -} - -void cEventInfo::FixEpgBugs(void) -{ - // VDR can't usefully handle newline characters in the EPG data, so let's - // always convert them to blanks (independent of the setting of EPGBugfixLevel): - strreplace(pTitle, '\n', ' '); - strreplace(pSubtitle, '\n', ' '); - strreplace(pExtendedDescription, '\n', ' '); - - if (Setup.EPGBugfixLevel == 0) - return; - - // Some TV stations apparently have their own idea about how to fill in the - // EPG data. Let's fix their bugs as good as we can: - if (pTitle) { - - // VOX puts too much information into the Subtitle and leaves the Extended - // Description empty: - // - // Title - // (NAT, Year Min')[ ["Subtitle". ]Extended Description] - // - if (pSubtitle && !pExtendedDescription) { - if (*pSubtitle == '(') { - char *e = strchr(pSubtitle + 1, ')'); - if (e) { - if (*(e + 1)) { - if (*++e == ' ') - if (*(e + 1) == '"') - e++; + pEvent->SetVersion(getVersionNumber()); + pEvent->SetTableID(Tid); + pEvent->SetEventID(SiEitEvent.getEventId()); // unfortunately some stations use different event ids for the same event in different tables :-( + + SI::Descriptor *d; + SI::ExtendedEventDescriptors exGroup; + char text[256]; + for (SI::Loop::Iterator it2; (d = SiEitEvent.eventDescriptors.getNext(it2)); ) { + switch (d->getDescriptorTag()) { + case SI::ExtendedEventDescriptorTag: + exGroup.Add((SI::ExtendedEventDescriptor *)d); + d = NULL; //so that it is not deleted + break; + case SI::ShortEventDescriptorTag: { + SI::ShortEventDescriptor *sed = (SI::ShortEventDescriptor *)d; + pEvent->SetTitle(sed->name.getText(text)); + pEvent->SetShortText(sed->text.getText(text)); } - else - e = NULL; - char *s = e ? strdup(e) : NULL; - free(pSubtitle); - pSubtitle = s; - EpgBugFixStat(0, GetChannelID()); - // now the fixes #1 and #2 below will handle the rest - } - } - } - - // VOX and VIVA put the Subtitle in quotes and use either the Subtitle - // or the Extended Description field, depending on how long the string is: - // - // Title - // "Subtitle". Extended Description - // - if ((pSubtitle == NULL) != (pExtendedDescription == NULL)) { - char *p = pSubtitle ? pSubtitle : pExtendedDescription; - if (*p == '"') { - const char *delim = "\"."; - char *e = strstr(p + 1, delim); - if (e) { - *e = 0; - char *s = strdup(p + 1); - char *d = strdup(e + strlen(delim)); - free(pSubtitle); - free(pExtendedDescription); - pSubtitle = s; - pExtendedDescription = d; - EpgBugFixStat(1, GetChannelID()); - } - } - } - - // VOX and VIVA put the Extended Description into the Subtitle (preceeded - // by a blank) if there is no actual Subtitle and the Extended Description - // is short enough: - // - // Title - // Extended Description - // - if (pSubtitle && !pExtendedDescription) { - if (*pSubtitle == ' ') { - memmove(pSubtitle, pSubtitle + 1, strlen(pSubtitle)); - pExtendedDescription = pSubtitle; - pSubtitle = NULL; - EpgBugFixStat(2, GetChannelID()); - } - } - - // Pro7 sometimes repeats the Title in the Subtitle: - // - // Title - // Title - // - if (pSubtitle && strcmp(pTitle, pSubtitle) == 0) { - free(pSubtitle); - pSubtitle = NULL; - EpgBugFixStat(3, GetChannelID()); - } - - // ZDF.info puts the Subtitle between double quotes, which is nothing - // but annoying (some even put a '.' after the closing '"'): - // - // Title - // "Subtitle"[.] - // - if (pSubtitle && *pSubtitle == '"') { - int l = strlen(pSubtitle); - if (l > 2 && (pSubtitle[l - 1] == '"' || (pSubtitle[l - 1] == '.' && pSubtitle[l - 2] == '"'))) { - memmove(pSubtitle, pSubtitle + 1, l); - char *p = strrchr(pSubtitle, '"'); - if (p) - *p = 0; - EpgBugFixStat(4, GetChannelID()); - } - } - - if (Setup.EPGBugfixLevel <= 1) - return; - - // Some channels apparently try to do some formatting in the texts, - // which is a bad idea because they have no way of knowing the width - // of the window that will actually display the text. - // Remove excess whitespace: - pTitle = compactspace(pTitle); - pSubtitle = compactspace(pSubtitle); - pExtendedDescription = compactspace(pExtendedDescription); - // Remove superfluous hyphens: - if (pExtendedDescription) { - char *p = pExtendedDescription; - while (*p && *(p + 1) && *(p + 2)) { - if (*p == '-' && *(p + 1) == ' ' && *(p + 2) && islower(*(p - 1)) && islower(*(p + 2))) { - if (!startswith(p + 2, "und ")) { // special case in German, as in "Lach- und Sachgeschichten" - memmove(p, p + 2, strlen(p + 2) + 1); - EpgBugFixStat(5, GetChannelID()); - } + break; + case SI::ContentDescriptorTag: + break; + case SI::ParentalRatingDescriptorTag: + break; + case SI::TimeShiftedEventDescriptorTag: { + SI::TimeShiftedEventDescriptor *tsed = (SI::TimeShiftedEventDescriptor *)d; + cSchedule *rSchedule = (cSchedule *)Schedules->GetSchedule(tChannelID(Source, 0, 0, tsed->getReferenceServiceId())); + if (!rSchedule) + break; + rEvent = (cEvent *)rSchedule->GetEvent(tsed->getReferenceEventId()); + if (!rEvent) + break; + pEvent->SetTitle(rEvent->Title()); + pEvent->SetShortText(rEvent->ShortText()); + pEvent->SetDescription(rEvent->Description()); } - p++; - } - } - -#define MAX_USEFUL_SUBTITLE_LENGTH 40 - // Some channels put a whole lot of information in the Subtitle and leave - // the Extended Description totally empty. So if the Subtitle length exceeds - // MAX_USEFUL_SUBTITLE_LENGTH, let's put this into the Extended Description - // instead: - if (!isempty(pSubtitle) && isempty(pExtendedDescription)) { - if (strlen(pSubtitle) > MAX_USEFUL_SUBTITLE_LENGTH) { - free(pExtendedDescription); - pExtendedDescription = pSubtitle; - pSubtitle = NULL; - EpgBugFixStat(6, GetChannelID()); - } - } - - // Some channels use the ` ("backtick") character, where a ' (single quote) - // would be normally used. Actually, "backticks" in normal text don't make - // much sense, so let's replace them: - strreplace(pTitle, '`', '\''); - strreplace(pSubtitle, '`', '\''); - strreplace(pExtendedDescription, '`', '\''); - } -} - -// --- cSchedule ------------------------------------------------------------- - -cSchedule::cSchedule(tChannelID channelid) -{ - pPresent = pFollowing = NULL; - channelID = channelid; -} - - -cSchedule::~cSchedule() -{ -} - -cEventInfo *cSchedule::AddEvent(cEventInfo *EventInfo) -{ - Events.Add(EventInfo); - return EventInfo; -} - -const cEventInfo *cSchedule::GetPresentEvent(void) const -{ - return GetEventAround(time(NULL)); -} + break; + default: ; + } + delete d; + } -const cEventInfo *cSchedule::GetFollowingEvent(void) const -{ - const cEventInfo *pe = NULL; - time_t now = time(NULL); - time_t delta = INT_MAX; - for (cEventInfo *p = Events.First(); p; p = Events.Next(p)) { - time_t dt = p->GetTime() - now; - if (dt > 0 && dt < delta) { - delta = dt; - pe = p; + if (!rEvent) { + char buffer[exGroup.getMaximumTextLength()]; + pEvent->SetDescription(exGroup.getText(buffer)); } - } - return pe; -} - -void cSchedule::SetChannelID(tChannelID channelid) -{ - channelID = channelid; -} -/** */ -tChannelID cSchedule::GetChannelID() const -{ - return channelID; -} -/** */ -const cEventInfo * cSchedule::GetEvent(unsigned short uEventID, time_t tTime) const -{ - // Returns either the event info with the given uEventID or, if that one can't - // be found, the one with the given tTime (or NULL if neither can be found) - cEventInfo *pe = Events.First(); - cEventInfo *pt = NULL; - while (pe != NULL) - { - if (pe->GetEventID() == uEventID) - return pe; - if (tTime > 0 && pe->GetTime() == tTime) // 'tTime < 0' is apparently used with NVOD channels - pt = pe; - - pe = Events.Next(pe); - } - return pt; -} + pEvent->SetStartTime(SiEitEvent.getStartTime()); + pEvent->SetDuration(SiEitEvent.getDuration()); + pEvent->FixEpgBugs(); -const cEventInfo *cSchedule::GetEventAround(time_t Time) const -{ - const cEventInfo *pe = NULL; - time_t delta = INT_MAX; - for (cEventInfo *p = Events.First(); p; p = Events.Next(p)) { - time_t dt = Time - p->GetTime(); - if (dt >= 0 && dt < delta && p->GetTime() + p->GetDuration() >= Time) { - delta = dt; - pe = p; + if (isPresentFollowing()) { + if (SiEitEvent.getRunningStatus() == SI::RunningStatusPausing || SiEitEvent.getRunningStatus() == SI::RunningStatusRunning) + pSchedule->SetPresentEvent(pEvent); + else if (SiEitEvent.getRunningStatus() == SI::RunningStatusStartsInAFewSeconds) + pSchedule->SetFollowingEvent(pEvent); } } - return pe; -} - -bool cSchedule::SetPresentEvent(cEventInfo *pEvent) -{ - if (pPresent != NULL) - pPresent->SetPresent(false); - pPresent = pEvent; - pPresent->SetPresent(true); - - return true; -} - -/** */ -bool cSchedule::SetFollowingEvent(cEventInfo *pEvent) -{ - if (pFollowing != NULL) - pFollowing->SetFollowing(false); - pFollowing = pEvent; - pFollowing->SetFollowing(true); - - return true; -} - -/** */ -void cSchedule::Cleanup() -{ - Cleanup(time(NULL)); -} - -/** */ -void cSchedule::Cleanup(time_t tTime) -{ - cEventInfo *pEvent; - for (int a = 0; true ; a++) - { - pEvent = Events.Get(a); - if (pEvent == NULL) - break; - if (pEvent->GetTime() + pEvent->GetDuration() + 3600 < tTime) // adding one hour for safety - { - Events.Del(pEvent); - a--; - } - } -} - -/** */ -void cSchedule::Dump(FILE *f, const char *Prefix) const -{ - cChannel *channel = Channels.GetByChannelID(channelID, true); - if (channel) - { - fprintf(f, "%sC %s %s\n", Prefix, channel->GetChannelID().ToString(), channel->Name()); - for (cEventInfo *p = Events.First(); p; p = Events.Next(p)) - p->Dump(f, Prefix); - fprintf(f, "%sc\n", Prefix); - } -} - -bool cSchedule::Read(FILE *f, cSchedules *Schedules) -{ - if (Schedules) { - char *s; - while ((s = readline(f)) != NULL) { - if (*s == 'C') { - s = skipspace(s + 1); - char *p = strchr(s, ' '); - if (p) - *p = 0; // strips optional channel name - if (*s) { - tChannelID channelID = tChannelID::FromString(s); - if (channelID.Valid()) { - cSchedule *p = (cSchedule *)Schedules->AddChannelID(channelID); - if (p) { - if (!cEventInfo::Read(f, p)) - return false; - } - } - else { - esyslog("ERROR: illegal channel ID: %s", s); - return false; - } - } - } - else { - esyslog("ERROR: unexpected tag while reading EPG data: %s", s); - return false; - } - } - return true; - } - return false; -} - -// --- cSchedules ------------------------------------------------------------ - -cSchedules::cSchedules() -{ - pCurrentSchedule = NULL; -} - -cSchedules::~cSchedules() -{ -} -/** */ -const cSchedule *cSchedules::AddChannelID(tChannelID channelid) -{ - channelid.ClrRid(); - const cSchedule *p = GetSchedule(channelid); - if (!p) { - Add(new cSchedule(channelid)); - p = GetSchedule(channelid); - } - return p; -} -/** */ -const cSchedule *cSchedules::SetCurrentChannelID(tChannelID channelid) -{ - channelid.ClrRid(); - pCurrentSchedule = AddChannelID(channelid); - if (pCurrentSchedule) - currentChannelID = channelid; - return pCurrentSchedule; -} -/** */ -const cSchedule * cSchedules::GetSchedule() const -{ - return pCurrentSchedule; -} -/** */ -const cSchedule * cSchedules::GetSchedule(tChannelID channelid) const -{ - cSchedule *p; - - channelid.ClrRid(); - p = First(); - while (p != NULL) - { - if (p->GetChannelID() == channelid) - return p; - p = Next(p); - } - - return NULL; -} - -/** */ -void cSchedules::Cleanup() -{ - cSchedule *p; - - p = First(); - while (p != NULL) - { - p->Cleanup(time(NULL)); - p = Next(p); - } -} - -/** */ -void cSchedules::Dump(FILE *f, const char *Prefix) const -{ - for (cSchedule *p = First(); p; p = Next(p)) - p->Dump(f, Prefix); -} - -/** */ -bool cSchedules::Read(FILE *f) -{ - cMutexLock MutexLock; - return cSchedule::Read(f, (cSchedules *)cSIProcessor::Schedules(MutexLock)); -} - -// --- cEIT ------------------------------------------------------------------ - -class cEIT { -private: - cSchedules *schedules; -public: - cEIT(unsigned char *buf, int length, cSchedules *Schedules); - ~cEIT(); - /** */ - int ProcessEIT(unsigned char *buffer, int CurrentSource); - -protected: // Protected methods - /** returns true if this EIT covers a -present/following information, false if it's -schedule information */ - bool IsPresentFollowing(); -protected: // Protected attributes - /** Table ID of this EIT struct */ - u_char tid; -}; - -cEIT::cEIT(unsigned char * buf, int length, cSchedules *Schedules) -{ - tid = buf[0]; - schedules = Schedules; -} - -cEIT::~cEIT() -{ -} - -/** */ -int cEIT::ProcessEIT(unsigned char *buffer, int CurrentSource) -{ - cEventInfo *pEvent, *rEvent = NULL; - cSchedule *pSchedule, *rSchedule = NULL; - struct LIST *VdrProgramInfos; - struct VdrProgramInfo *VdrProgramInfo; - - if (!buffer) - return -1; - - VdrProgramInfos = createVdrProgramInfos(buffer); - - if (VdrProgramInfos) { - for (VdrProgramInfo = (struct VdrProgramInfo *) VdrProgramInfos->Head; VdrProgramInfo; VdrProgramInfo = (struct VdrProgramInfo *) xSucc (VdrProgramInfo)) { - //XXX TODO use complete channel ID - cChannel *channel = Channels.GetByServiceID(CurrentSource, VdrProgramInfo->ServiceID); - tChannelID channelID = channel ? channel->GetChannelID() : tChannelID(CurrentSource, 0, 0, VdrProgramInfo->ServiceID); - channelID.ClrRid(); - //XXX - pSchedule = (cSchedule *)schedules->GetSchedule(channelID); - if (!pSchedule) { - schedules->Add(new cSchedule(channelID)); - pSchedule = (cSchedule *)schedules->GetSchedule(channelID); - if (!pSchedule) - break; - } - if (VdrProgramInfo->ReferenceServiceID) { - rSchedule = (cSchedule *)schedules->GetSchedule(tChannelID(CurrentSource, 0, 0, VdrProgramInfo->ReferenceServiceID)); - if (!rSchedule) - break; - rEvent = (cEventInfo *)rSchedule->GetEvent((unsigned short)VdrProgramInfo->ReferenceEventID); - if (!rEvent) - break; - } - pEvent = (cEventInfo *)pSchedule->GetEvent((unsigned short)VdrProgramInfo->EventID, VdrProgramInfo->StartTime); - if (!pEvent) { - // If we don't have that event ID yet, we create a new one. - // Otherwise we copy the information into the existing event anyway, because the data might have changed. - pEvent = pSchedule->AddEvent(new cEventInfo(channelID, VdrProgramInfo->EventID)); - if (!pEvent) - break; - pEvent->SetTableID(tid); - } - else { - // We have found an existing event, either through its event ID or its start time. - // If the existing event has a zero table ID it was defined externally and shall - // not be overwritten. - if (pEvent->GetTableID() == 0x00) - continue; - // If the new event comes from a table that belongs to an "other TS" and the existing - // one comes from an "actual TS" table, lets skip it. - if ((tid == 0x4F || tid == 0x60 || tid == 0x61) && (pEvent->GetTableID() == 0x4E || pEvent->GetTableID() == 0x50 || pEvent->GetTableID() == 0x51)) - continue; - } - if (rEvent) { - pEvent->SetTitle(rEvent->GetTitle()); - pEvent->SetSubtitle(rEvent->GetSubtitle()); - pEvent->SetExtendedDescription(rEvent->GetExtendedDescription()); - } - else { - pEvent->SetTableID(tid); - pEvent->SetTitle(VdrProgramInfo->ShortName); - pEvent->SetSubtitle(VdrProgramInfo->ShortText); - pEvent->SetExtendedDescription(VdrProgramInfo->ExtendedName); - //XXX kls 2001-09-22: - //XXX apparently this never occurred, so I have simpified ExtendedDescription handling - //XXX pEvent->AddExtendedDescription(VdrProgramInfo->ExtendedText); - } - pEvent->SetTime(VdrProgramInfo->StartTime); - pEvent->SetDuration(VdrProgramInfo->Duration); - pEvent->FixEpgBugs(); - if (IsPresentFollowing()) { - if ((GetRunningStatus(VdrProgramInfo->Status) == RUNNING_STATUS_PAUSING) || (GetRunningStatus(VdrProgramInfo->Status) == RUNNING_STATUS_RUNNING)) - pSchedule->SetPresentEvent(pEvent); - else if (GetRunningStatus(VdrProgramInfo->Status) == RUNNING_STATUS_AWAITING) - pSchedule->SetFollowingEvent(pEvent); - } - } - } - - xMemFreeAll(NULL); - return 0; -} - -/** returns true if this EIT covers a -present/following information, false if it's -schedule information */ -bool cEIT::IsPresentFollowing() -{ - if (tid == 0x4e || tid == 0x4f) - return true; - - return false; } -// --- cCaDescriptor --------------------------------------------------------- +// --- cTDT ------------------------------------------------------------------ -class cCaDescriptor : public cListObject { - friend class cSIProcessor; +class cTDT : public SI::TDT { private: - int source; - int transponder; - int serviceId; - int caSystem; - unsigned int providerId; - int caPid; - int length; - uchar *data; + static cMutex mutex; public: - cCaDescriptor(int Source, int Transponder, int ServiceId, int CaSystem, unsigned int ProviderId, int CaPid, int Length, uchar *Data); - virtual ~cCaDescriptor(); - int Length(void) const { return length; } - const uchar *Data(void) const { return data; } + cTDT(const u_char *Data); }; -cCaDescriptor::cCaDescriptor(int Source, int Transponder, int ServiceId, int CaSystem, unsigned int ProviderId, int CaPid, int Length, uchar *Data) -{ - source = Source; - transponder = Transponder; - serviceId = ServiceId; - caSystem = CaSystem; - providerId = ProviderId; - caPid = CaPid; - length = Length + 6; - data = MALLOC(uchar, length); - data[0] = DESCR_CA; - data[1] = length - 2; - data[2] = (caSystem >> 8) & 0xFF; - data[3] = caSystem & 0xFF; - data[4] = ((CaPid >> 8) & 0x1F) | 0xE0; - data[5] = CaPid & 0xFF; - if (Length) - memcpy(&data[6], Data, Length); -//#define DEBUG_CA_DESCRIPTORS 1 -#ifdef DEBUG_CA_DESCRIPTORS - char buffer[1024]; - char *q = buffer; - q += sprintf(q, "CAM: %04X %5d %5d %04X %6X %04X -", source, transponder, serviceId, caSystem, providerId, caPid); - for (int i = 0; i < length; i++) - q += sprintf(q, " %02X", data[i]); - dsyslog(buffer); -#endif -} +cMutex cTDT::mutex; -cCaDescriptor::~cCaDescriptor() +cTDT::cTDT(const u_char *Data) +:SI::TDT(Data, false) { - free(data); -} - -// --- cSIProcessor ---------------------------------------------------------- - -#define MAX_FILTERS 20 -#define EPGDATAFILENAME "epg.data" + CheckParse(); -int cSIProcessor::numSIProcessors = 0; -cSchedules *cSIProcessor::schedules = NULL; -cMutex cSIProcessor::schedulesMutex; -cList<cCaDescriptor> cSIProcessor::caDescriptors; -cMutex cSIProcessor::caDescriptorsMutex; -const char *cSIProcessor::epgDataFileName = EPGDATAFILENAME; -time_t cSIProcessor::lastDump = time(NULL); + time_t sattim = getTime(); + time_t loctim = time(NULL); -/** */ -cSIProcessor::cSIProcessor(const char *FileName) -{ - fileName = strdup(FileName); - masterSIProcessor = numSIProcessors == 0; // the first one becomes the 'master' - currentSource = 0; - currentTransponder = 0; - statusCount = 0; - pmtIndex = 0; - pmtPid = 0; - filters = NULL; - if (!numSIProcessors++) { // the first one creates them - schedules = new cSchedules; - } - filters = (SIP_FILTER *)calloc(MAX_FILTERS, sizeof(SIP_FILTER)); - SetStatus(true); - Start(); -} - -cSIProcessor::~cSIProcessor() -{ - if (masterSIProcessor) - ReportEpgBugFixStats(); - active = false; - Cancel(3); - ShutDownFilters(); - free(filters); - if (!--numSIProcessors) { // the last one deletes them - delete schedules; - } - free(fileName); -} - -const cSchedules *cSIProcessor::Schedules(cMutexLock &MutexLock) -{ - if (MutexLock.Lock(&schedulesMutex)) - return schedules; - return NULL; -} - -bool cSIProcessor::Read(FILE *f) -{ - bool OwnFile = f == NULL; - if (OwnFile) { - const char *FileName = GetEpgDataFileName(); - if (access(FileName, R_OK) == 0) { - dsyslog("reading EPG data from %s", FileName); - if ((f = fopen(FileName, "r")) == NULL) { - LOG_ERROR; - return false; - } - } - else - return false; + if (abs(sattim - loctim) > 2) { + mutex.Lock(); + isyslog("System Time = %s (%ld)\n", ctime(&loctim), loctim); + isyslog("Local Time = %s (%ld)\n", ctime(&sattim), sattim); + if (stime(&sattim) < 0) + esyslog("ERROR while setting system time: %m"); + mutex.Unlock(); } - bool result = cSchedules::Read(f); - if (OwnFile) - fclose(f); - return result; -} - -void cSIProcessor::Clear(void) -{ - cMutexLock MutexLock(&schedulesMutex); - delete schedules; - schedules = new cSchedules; -} - -void cSIProcessor::SetEpgDataFileName(const char *FileName) -{ - epgDataFileName = NULL; - if (FileName) - epgDataFileName = strdup(DirectoryOk(FileName) ? AddDirectory(FileName, EPGDATAFILENAME) : FileName); -} - -const char *cSIProcessor::GetEpgDataFileName(void) -{ - if (epgDataFileName) - return *epgDataFileName == '/' ? epgDataFileName : AddDirectory(VideoDirectory, epgDataFileName); - return NULL; -} - -void cSIProcessor::SetStatus(bool On) -{ - LOCK_THREAD; - statusCount++; - ShutDownFilters(); - pmtIndex = 0; - pmtPid = 0; - if (On) - { - AddFilter(0x00, 0x00); // PAT - AddFilter(0x14, 0x70); // TDT - AddFilter(0x12, 0x4e, 0xfe); // event info, actual(0x4e)/other(0x4f) TS, present/following - AddFilter(0x12, 0x50, 0xfe); // event info, actual TS, schedule(0x50)/schedule for another 4 days(0x51) - AddFilter(0x12, 0x60, 0xfe); // event info, other TS, schedule(0x60)/schedule for another 4 days(0x61) - } -} - -#define PMT_SCAN_TIMEOUT 10 // seconds - -/** use the vbi device to parse all relevant SI -information and let the classes corresponding -to the tables write their information to the disk */ -void cSIProcessor::Action() -{ - dsyslog("EIT processing thread started (pid=%d)%s", getpid(), masterSIProcessor ? " - master" : ""); - - time_t lastCleanup = time(NULL); - time_t lastPmtScan = time(NULL); - - int oldStatusCount = 0; - active = true; - - while(active) - { - if (masterSIProcessor) - { - time_t now = time(NULL); - struct tm tm_r; - struct tm *ptm = localtime_r(&now, &tm_r); - if (now - lastCleanup > 3600 && ptm->tm_hour == 5) - { - cMutexLock MutexLock(&schedulesMutex); - isyslog("cleaning up schedules data"); - schedules->Cleanup(); - lastCleanup = now; - ReportEpgBugFixStats(true); - } - if (epgDataFileName && now - lastDump > 600) - { - cMutexLock MutexLock(&schedulesMutex); - cSafeFile f(GetEpgDataFileName()); - if (f.Open()) { - schedules->Dump(f); - f.Close(); - } - else - LOG_ERROR; - lastDump = now; - } - } - - // set up pfd structures for all active filter - Lock(); - pollfd pfd[MAX_FILTERS]; - int NumUsedFilters = 0; - for (int a = 0; a < MAX_FILTERS ; a++) - { - if (filters[a].inuse) - { - pfd[NumUsedFilters].fd = filters[a].handle; - pfd[NumUsedFilters].events = POLLIN; - NumUsedFilters++; - } - } - oldStatusCount = statusCount; - Unlock(); - - // wait until data becomes ready from the bitfilter - if (poll(pfd, NumUsedFilters, 1000) != 0) - { - for (int aa = 0; aa < NumUsedFilters; aa++) - { - if (pfd[aa].revents & POLLIN) - { - int a; - for (a = 0; a < MAX_FILTERS; a++) { - if (pfd[aa].fd == filters[a].handle) - break; - } - if (a >= MAX_FILTERS || !filters[a].inuse) // filter no longer available - continue; - // read section - unsigned char buf[4096]; // max. allowed size for any EIT section - int r = safe_read(filters[a].handle, buf, sizeof(buf)); - if (r > 3) // minimum number of bytes necessary to get section length - { - int seclen = (((buf[1] & 0x0F) << 8) | (buf[2] & 0xFF)) + 3; - int pid = filters[a].pid; - if (seclen == r) - { - //dsyslog("Received pid 0x%04X with table ID 0x%02X and length of %4d\n", pid, buf[0], seclen); - cMutexLock MutexLock(&schedulesMutex); // since the xMem... stuff is not thread safe, we need to use a "global" mutex - LOCK_THREAD; - if (statusCount != oldStatusCount) - break; - switch (pid) - { - case 0x00: - if (buf[0] == 0x00) - { - if (pmtPid && time(NULL) - lastPmtScan > PMT_SCAN_TIMEOUT) { - DelFilter(pmtPid, 0x02); - pmtPid = 0; - pmtIndex++; - lastPmtScan = time(NULL); - } - if (!pmtPid) { - struct LIST *pat = siParsePAT(buf); - if (pat) { - int Index = 0; - for (struct Program *prg = (struct Program *)pat->Head; prg; prg = (struct Program *)xSucc(prg)) { - if (prg->ProgramID) { - if (Index++ == pmtIndex) { - pmtPid = prg->NetworkPID; - AddFilter(pmtPid, 0x02); - break; - } - } - } - if (!pmtPid) - pmtIndex = 0; - } - xMemFreeAll(NULL); - } - } - break; - case 0x14: - if (buf[0] == 0x70) - { - if (Setup.SetSystemTime && Setup.TimeTransponder && ISTRANSPONDER(currentTransponder, Setup.TimeTransponder)) - { - cTDT ctdt((tdt_t *)buf); - ctdt.SetSystemTime(); - } - } - break; - - case 0x12: - if (buf[0] != 0x72) - { - cEIT ceit(buf, seclen, schedules); - ceit.ProcessEIT(buf, currentSource); - } - /*else - dsyslog("Received stuffing section in EIT\n"); - */ - break; - - default: { - if (pid == pmtPid && buf[0] == 0x02 && currentSource && currentTransponder) { - struct Pid *pi = siParsePMT(buf); - if (pi) { - struct Descriptor *d; - for (d = (struct Descriptor *)pi->Descriptors->Head; d; d = (struct Descriptor *)xSucc(d)) - NewCaDescriptor(d, pi->ProgramID); - // Also scan the PidInfo list for descriptors - some broadcasts send them only here. - for (struct PidInfo *p = (struct PidInfo *)pi->InfoList->Head; p; p = (struct PidInfo *)xSucc(p)) { - for (d = (struct Descriptor *)p->Descriptors->Head; d; d = (struct Descriptor *)xSucc(d)) - NewCaDescriptor(d, pi->ProgramID); - } - } - xMemFreeAll(NULL); - lastPmtScan = 0; // this triggers the next scan - } - } - break; - } - } - /* - else - dsyslog("read incomplete section - seclen = %d, r = %d", seclen, r); - */ - } - } - } - } - } - - dsyslog("EIT processing thread ended (pid=%d)%s", getpid(), masterSIProcessor ? " - master" : ""); } -/** Add a filter with packet identifier pid and -table identifer tid */ -bool cSIProcessor::AddFilter(unsigned short pid, u_char tid, u_char mask) -{ - dmx_sct_filter_params sctFilterParams; - memset(&sctFilterParams, 0, sizeof(sctFilterParams)); - sctFilterParams.pid = pid; - sctFilterParams.timeout = 0; - sctFilterParams.flags = DMX_IMMEDIATE_START; - sctFilterParams.filter.filter[0] = tid; - sctFilterParams.filter.mask[0] = mask; +// --- cEitFilter ------------------------------------------------------------ - for (int a = 0; a < MAX_FILTERS; a++) - { - if (!filters[a].inuse) - { - filters[a].pid = pid; - filters[a].tid = tid; - if ((filters[a].handle = open(fileName, O_RDWR | O_NONBLOCK)) >= 0) - { - if (ioctl(filters[a].handle, DMX_SET_FILTER, &sctFilterParams) >= 0) - filters[a].inuse = true; - else - { - esyslog("ERROR: can't set filter (pid=%d, tid=%02X)", pid, tid); - close(filters[a].handle); - return false; - } - // dsyslog("Registered filter handle %04x, pid = %02d, tid = %02d", filters[a].handle, filters[a].pid, filters[a].tid); - } - else - { - esyslog("ERROR: can't open filter handle"); - return false; - } - return true; - } - } - esyslog("ERROR: too many filters"); - - return false; -} - -bool cSIProcessor::DelFilter(unsigned short pid, u_char tid) +cEitFilter::cEitFilter(void) { - for (int a = 0; a < MAX_FILTERS; a++) - { - if (filters[a].inuse && filters[a].pid == pid && filters[a].tid == tid) - { - close(filters[a].handle); - // dsyslog("Deregistered filter handle %04x, pid = %02d, tid = %02d", filters[a].handle, filters[a].pid, filters[a].tid); - filters[a].inuse = false; - return true; - } - } - return false; + Set(0x12, 0x4E, 0xFE); // event info, actual(0x4E)/other(0x4F) TS, present/following + Set(0x12, 0x50, 0xF0); // event info, actual TS, schedule(0x50)/schedule for future days(0x5X) + Set(0x12, 0x60, 0xF0); // event info, other TS, schedule(0x60)/schedule for future days(0x6X) + Set(0x14, 0x70); // TDT } -/** */ -bool cSIProcessor::ShutDownFilters(void) +void cEitFilter::Process(u_short Pid, u_char Tid, const u_char *Data, int Length) { - for (int a = 0; a < MAX_FILTERS; a++) - { - if (filters[a].inuse) - { - close(filters[a].handle); - // dsyslog("Deregistered filter handle %04x, pid = %02d, tid = %02d", filters[a].handle, filters[a].pid, filters[a].tid); - filters[a].inuse = false; - } - } - - return true; // there's no real 'boolean' to return here... -} - -/** */ -void cSIProcessor::SetCurrentTransponder(int CurrentSource, int CurrentTransponder) -{ - currentSource = CurrentSource; - currentTransponder = CurrentTransponder; -} - -/** */ -bool cSIProcessor::SetCurrentChannelID(tChannelID channelid) -{ - cMutexLock MutexLock(&schedulesMutex); - return schedules ? schedules->SetCurrentChannelID(channelid) : false; -} - -void cSIProcessor::TriggerDump(void) -{ - cMutexLock MutexLock(&schedulesMutex); - lastDump = 0; -} - -void cSIProcessor::NewCaDescriptor(struct Descriptor *d, int ServiceId) -{ - if (DescriptorTag(d) == DESCR_CA) { - struct CaDescriptor *cd = (struct CaDescriptor *)d; - cMutexLock MutexLock(&caDescriptorsMutex); - - for (cCaDescriptor *ca = caDescriptors.First(); ca; ca = caDescriptors.Next(ca)) { - if (ca->source == currentSource && ca->transponder == currentTransponder && ca->serviceId == ServiceId && ca->caSystem == cd->CA_type && ca->providerId == cd->ProviderID && ca->caPid == cd->CA_PID) - return; + switch (Pid) { + case 0x12: { + cSchedulesLock SchedulesLock(true, 10); + cSchedules *Schedules = (cSchedules *)cSchedules::Schedules(SchedulesLock); + if (Schedules) + cEIT EIT(Schedules, Source(), Tid, Data); } - caDescriptors.Add(new cCaDescriptor(currentSource, currentTransponder, ServiceId, cd->CA_type, cd->ProviderID, cd->CA_PID, cd->DataLength, cd->Data)); - //XXX update??? - } -} - -int cSIProcessor::GetCaDescriptors(int Source, int Transponder, int ServiceId, const unsigned short *CaSystemIds, int BufSize, uchar *Data) -{ - if (!CaSystemIds || !*CaSystemIds) - return 0; - if (BufSize > 0 && Data) { - cMutexLock MutexLock(&caDescriptorsMutex); - int length = 0; - for (cCaDescriptor *d = caDescriptors.First(); d; d = caDescriptors.Next(d)) { - if (d->source == Source && d->transponder == Transponder && d->serviceId == ServiceId) { - const unsigned short *caids = CaSystemIds; - do { - if (d->caSystem == *caids) { - if (length + d->Length() <= BufSize) { - memcpy(Data + length, d->Data(), d->Length()); - length += d->Length(); - } - else - return -1; - } - } while (*++caids); - } + break; + case 0x14: { + if (Setup.SetSystemTime && Setup.TimeTransponder && ISTRANSPONDER(Transponder(), Setup.TimeTransponder)) + cTDT TDT(Data); } - return length; - } - return -1; + break; + } } @@ -1,186 +1,22 @@ -/*************************************************************************** - eit.h - description - ------------------- - begin : Fri Aug 25 2000 - copyright : (C) 2000 by Robert Schneider - email : Robert.Schneider@web.de - - 2001-08-15: Adapted to 'libdtv' by Rolf Hakenes <hakenes@hippomi.de> - - ***************************************************************************/ - -/*************************************************************************** - * * - * 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. * - * * - * $Id: eit.h 1.29 2003/05/17 09:15:56 kls Exp $ - ***************************************************************************/ +/* + * eit.h: EIT section filter + * + * See the main source file 'vdr.c' for copyright information and + * how to reach the author. + * + * $Id: eit.h 1.30 2003/12/21 14:51:50 kls Exp $ + */ #ifndef __EIT_H #define __EIT_H -#include "channels.h" -#include "thread.h" -#include "tools.h" - -#define MAXEPGBUGFIXLEVEL 2 - -class cEventInfo : public cListObject { - friend class cSchedule; - friend class cEIT; -private: - unsigned char uTableID; // Table ID this event came from - tChannelID channelID; // Channel ID of program for that event - bool bIsFollowing; // true if this is the next event on this channel - bool bIsPresent; // true if this is the present event running - char *pExtendedDescription; // Extended description of this event - char *pSubtitle; // Subtitle of event - char *pTitle; // Title of event - unsigned short uEventID; // Event ID of this event - long lDuration; // duration of event in seconds - time_t tTime; // Start time - int nChannelNumber; // the actual channel number from VDR's channel list (used in cMenuSchedule for sorting by channel number) -protected: - void SetTableID(unsigned char tableid); - void SetFollowing(bool foll); - void SetPresent(bool pres); - void SetTitle(const char *string); - void SetChannelID(tChannelID channelid); - void SetEventID(unsigned short evid); - void SetDuration(long l); - void SetTime(time_t t); - void SetExtendedDescription(const char *string); - void SetSubtitle(const char *string); - cEventInfo(tChannelID channelid, unsigned short eventid); -public: - ~cEventInfo(); - const unsigned char GetTableID(void) const; - const char *GetTimeString(void) const; - const char *GetEndTimeString(void) const; - const char *GetDate(void) const; - bool IsFollowing(void) const; - bool IsPresent(void) const; - const char *GetExtendedDescription(void) const; - const char *GetSubtitle(void) const; - const char *GetTitle(void) const; - unsigned short GetEventID(void) const; - long GetDuration(void) const; - time_t GetTime(void) const; - tChannelID GetChannelID(void) const; - int GetChannelNumber(void) const { return nChannelNumber; } - void SetChannelNumber(int ChannelNumber) const { ((cEventInfo *)this)->nChannelNumber = ChannelNumber; } // doesn't modify the EIT data, so it's ok to make it 'const' - void Dump(FILE *f, const char *Prefix = "") const; - static bool Read(FILE *f, cSchedule *Schedule); - void FixEpgBugs(void); - }; - -class cSchedule : public cListObject { - friend class cSchedules; - friend class cEIT; -private: - cEventInfo *pPresent; - cEventInfo *pFollowing; - tChannelID channelID; - cList<cEventInfo> Events; -protected: - void SetChannelID(tChannelID channelid); - bool SetFollowingEvent(cEventInfo *pEvent); - bool SetPresentEvent(cEventInfo *pEvent); - void Cleanup(time_t tTime); - void Cleanup(void); - cSchedule(tChannelID channelid = tChannelID::InvalidID); -public: - ~cSchedule(); - cEventInfo *AddEvent(cEventInfo *EventInfo); - const cEventInfo *GetPresentEvent(void) const; - const cEventInfo *GetFollowingEvent(void) const; - tChannelID GetChannelID(void) const; - const cEventInfo *GetEvent(unsigned short uEventID, time_t tTime = 0) const; - const cEventInfo *GetEventAround(time_t tTime) const; - const cEventInfo *GetEventNumber(int n) const { return Events.Get(n); } - int NumEvents(void) const { return Events.Count(); } - void Dump(FILE *f, const char *Prefix = "") const; - static bool Read(FILE *f, cSchedules *Schedules); - }; +#include "filter.h" -class cSchedules : public cList<cSchedule> { - friend class cSchedule; - friend class cSIProcessor; -private: - const cSchedule *pCurrentSchedule; - tChannelID currentChannelID; +class cEitFilter : public cFilter { protected: - const cSchedule *AddChannelID(tChannelID channelid); - const cSchedule *SetCurrentChannelID(tChannelID channelid); - void Cleanup(); -public: - cSchedules(void); - ~cSchedules(); - const cSchedule *GetSchedule(tChannelID channelid) const; - const cSchedule *GetSchedule(void) const; - void Dump(FILE *f, const char *Prefix = "") const; - static bool Read(FILE *f); -}; - -typedef struct sip_filter { - - unsigned short pid; - u_char tid; - int handle; - bool inuse; - -}SIP_FILTER; - -class cCaDescriptor; - -class cSIProcessor : public cThread { -private: - static int numSIProcessors; - static cSchedules *schedules; - static cMutex schedulesMutex; - static cList<cCaDescriptor> caDescriptors; - static cMutex caDescriptorsMutex; - static const char *epgDataFileName; - static time_t lastDump; - bool masterSIProcessor; - int currentSource; - int currentTransponder; - int statusCount; - int pmtIndex; - int pmtPid; - SIP_FILTER *filters; - char *fileName; - bool active; - void Action(void); - bool AddFilter(unsigned short pid, u_char tid, u_char mask = 0xFF); - bool DelFilter(unsigned short pid, u_char tid); - bool ShutDownFilters(void); - void NewCaDescriptor(struct Descriptor *d, int ServiceId); + virtual void Process(u_short Pid, u_char Tid, const u_char *Data, int Length); public: - cSIProcessor(const char *FileName); - ~cSIProcessor(); - static void SetEpgDataFileName(const char *FileName); - static const char *GetEpgDataFileName(void); - static const cSchedules *Schedules(cMutexLock &MutexLock); - // Caller must provide a cMutexLock which has to survive the entire - // time the returned cSchedules is accessed. Once the cSchedules is no - // longer used, the cMutexLock must be destroyed. - static int GetCaDescriptors(int Source, int Transponder, int ServiceId, const unsigned short *CaSystemIds, int BufSize, uchar *Data); - ///< Gets all CA descriptors for a given channel. - ///< Copies all available CA descriptors for the given Source, Transponder and ServiceId - ///< into the provided buffer at Data (at most BufSize bytes). Only those CA descriptors - ///< are copied that match one of the given CA system IDs. - ///< \return Returns the number of bytes copied into Data (0 if no CA descriptors are - ///< available), or -1 if BufSize was too small to hold all CA descriptors. - static bool Read(FILE *f = NULL); - static void Clear(void); - void SetStatus(bool On); - void SetCurrentTransponder(int CurrentSource, int CurrentTransponder); - static bool SetCurrentChannelID(tChannelID channelid); - static void TriggerDump(void); + cEitFilter(void); }; -#endif +#endif //__EIT_H @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: eitscan.c 1.14 2003/09/06 13:06:13 kls Exp $ + * $Id: eitscan.c 1.15 2004/01/04 14:54:01 kls Exp $ */ #include "eitscan.h" @@ -12,6 +12,68 @@ #include "channels.h" #include "dvbdevice.h" +// --- cScanData ------------------------------------------------------------- + +class cScanData : public cListObject { +private: + int source; + int transponder; +public: + cScanData(int Source, int Transponder); + virtual bool operator< (const cListObject &ListObject); + int Source(void) { return source; } + int Transponder(void) { return transponder; } + cChannel *GetChannel(void); + }; + +cScanData::cScanData(int Source, int Transponder) +{ + source = Source; + transponder = Transponder; +} + +bool cScanData::operator< (const cListObject &ListObject) +{ + cScanData *sd = (cScanData *)&ListObject; + return source < sd->source || source == sd->source && transponder < sd->transponder; +} + +//XXX this might be done differently later... +cChannel *cScanData::GetChannel(void) +{ + for (cChannel *Channel = Channels.First(); Channel; Channel = Channels.Next(Channel)) { + if (!Channel->GroupSep() && Channel->Source() == source && ISTRANSPONDER(Channel->Transponder(), transponder)) + return Channel; + } + return NULL; +} + +// --- cScanList ------------------------------------------------------------- + +class cScanList : public cList<cScanData> { +public: + cScanList(void); + void AddTransponder(const cChannel *Channel); + }; + +cScanList::cScanList(void) +{ + for (cChannel *ch = Channels.First(); ch; ch = Channels.Next(ch)) + AddTransponder(ch); + Sort(); +} + +void cScanList::AddTransponder(const cChannel *Channel) +{ + for (cScanData *sd = First(); sd; sd = Next(sd)) { + if (sd->Source() == Channel->Source() && sd->Transponder() == Channel->Transponder()) + return; + } + Add(new cScanData(Channel->Source(), Channel->Transponder())); +} + +// --- cEITScanner ----------------------------------------------------------- + cEITScanner EITScanner; cEITScanner::cEITScanner(void) @@ -20,24 +82,12 @@ cEITScanner::cEITScanner(void) currentDevice = NULL; currentChannel = 0; memset(lastChannel, 0, sizeof(lastChannel)); - numTransponders = 0; - transponders = NULL; + scanList = NULL; } cEITScanner::~cEITScanner() { - free(transponders); -} - -bool cEITScanner::TransponderScanned(cChannel *Channel) -{ - for (int i = 0; i < numTransponders; i++) { - if (transponders[i] == Channel->Frequency()) - return true; - } - transponders = (int *)realloc(transponders, ++numTransponders * sizeof(int)); - transponders[numTransponders - 1] = Channel->Frequency(); - return false; + delete scanList; } void cEITScanner::Activity(void) @@ -54,37 +104,51 @@ void cEITScanner::Process(void) if (Setup.EPGScanTimeout && Channels.MaxNumber() > 1) { time_t now = time(NULL); if (now - lastScan > ScanTimeout && now - lastActivity > ActivityTimeout) { - for (int i = 0; i < cDevice::NumDevices(); i++) { - cDevice *Device = cDevice::GetDevice(i); - if (Device && Device->CardIndex() < MAXDVBDEVICES) { - if (Device != cDevice::PrimaryDevice() || (cDevice::NumDevices() == 1 && Setup.EPGScanTimeout && now - lastActivity > Setup.EPGScanTimeout * 3600)) { - if (!(Device->Receiving(true) || Device->Replaying())) { - for (;;) { - cChannel *Channel = Channels.GetByNumber(lastChannel[Device->DeviceNumber()] + 1, 1); - if (Channel) { - lastChannel[Device->DeviceNumber()] = Channel->Number(); - if (Channel->Sid() && Device->ProvidesChannel(Channel) && !TransponderScanned(Channel)) { - if (Device == cDevice::PrimaryDevice() && !currentChannel) { - currentChannel = Device->CurrentChannel(); + if (Channels.Lock(false, 10)) { + if (!scanList) + scanList = new cScanList(); + for (bool AnyDeviceSwitched = false; !AnyDeviceSwitched; ) { + cScanData *ScanData = NULL; + for (int i = 0; i < cDevice::NumDevices(); i++) { + cDevice *Device = cDevice::GetDevice(i); + if (Device) { + if (Device != cDevice::PrimaryDevice() || (cDevice::NumDevices() == 1 && Setup.EPGScanTimeout && now - lastActivity > Setup.EPGScanTimeout * 3600)) { + if (!(Device->Receiving(true) || Device->Replaying())) { + if (!ScanData) + ScanData = scanList->First(); + if (ScanData) { + cChannel *Channel = ScanData->GetChannel(); + //XXX if (Device->ProvidesTransponder(Channel)) { + if ((!Channel->Ca() || Channel->Ca() == Device->DeviceNumber() + 1 || Channel->Ca() >= 0x0100) && Device->ProvidesTransponder(Channel)) { //XXX temporary for the 'sky' plugin + if (Device == cDevice::PrimaryDevice() && !currentChannel) + currentChannel = Device->CurrentChannel(); + currentDevice = Device;//XXX see also dvbdevice.c!!! + Device->SwitchChannel(Channel, false); + currentDevice = NULL; + scanList->Del(ScanData); + ScanData = NULL; + AnyDeviceSwitched = true; } - currentDevice = Device; - Device->SwitchChannel(Channel, false); - currentDevice = NULL; - break; } - } - else { - if (lastChannel[Device->DeviceNumber()]) - numTransponders = 0; - lastChannel[Device->DeviceNumber()] = 0; - break; + else + break; } } - } + } + } + if (ScanData && !AnyDeviceSwitched) { + scanList->Del(ScanData); + ScanData = NULL; + } + if (!scanList->Count()) { + delete scanList; + scanList = NULL; + break; } } - } - lastScan = time(NULL); + Channels.Unlock(); + lastScan = time(NULL); + } } } } @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: eitscan.h 1.4 2003/09/06 13:05:51 kls Exp $ + * $Id: eitscan.h 1.5 2004/01/03 13:08:39 kls Exp $ */ #ifndef __EITSCAN_H @@ -13,6 +13,8 @@ #include <time.h> #include "config.h" +class cScanList; + class cEITScanner { private: enum { ActivityTimeout = 60, @@ -22,8 +24,7 @@ private: cDevice *currentDevice; int currentChannel; int lastChannel[MAXDEVICES]; - int numTransponders, *transponders; - bool TransponderScanned(cChannel *Channel); + cScanList *scanList; public: cEITScanner(void); ~cEITScanner(); @@ -0,0 +1,684 @@ +/* + * epg.c: Electronic Program Guide + * + * See the main source file 'vdr.c' for copyright information and + * how to reach the author. + * + * Original version (as used in VDR before 1.3.0) written by + * Robert Schneider <Robert.Schneider@web.de> and Rolf Hakenes <hakenes@hippomi.de>. + * + * $Id: epg.c 1.3 2004/01/04 14:07:46 kls Exp $ + */ + +#include "epg.h" +#include <ctype.h> +#include <time.h> + +// --- cEvent ---------------------------------------------------------------- + +cEvent::cEvent(tChannelID ChannelID, u_int16_t EventID) +{ + channelID = ChannelID; + eventID = EventID; + tableID = 0; + version = 0xFF; // actual version numbers are 0..31 + isPresent = isFollowing = false; + title = NULL; + shortText = NULL; + description = NULL; + startTime = 0; + duration = 0; + channelNumber = 0; +} + +cEvent::~cEvent() +{ + free(title); + free(shortText); + free(description); +} + +void cEvent::SetEventID(u_int16_t EventID) +{ + eventID = EventID; +} + +void cEvent::SetTableID(uchar TableID) +{ + tableID = TableID; +} + +void cEvent::SetVersion(uchar Version) +{ + version = Version; +} + +void cEvent::SetIsPresent(bool IsPresent) +{ + isPresent = IsPresent; +} + +void cEvent::SetIsFollowing(bool IsFollowing) +{ + isFollowing = IsFollowing; +} + +void cEvent::SetTitle(const char *Title) +{ + title = strcpyrealloc(title, Title); +} + +void cEvent::SetShortText(const char *ShortText) +{ + shortText = strcpyrealloc(shortText, ShortText); +} + +void cEvent::SetDescription(const char *Description) +{ + description = strcpyrealloc(description, Description); +} + +void cEvent::SetStartTime(time_t StartTime) +{ + startTime = StartTime; +} + +void cEvent::SetDuration(int Duration) +{ + duration = Duration; +} + +const char *cEvent::GetDateString(void) const +{ + static char buf[25]; + struct tm tm_r; + strftime(buf, sizeof(buf), "%d.%m.%Y", localtime_r(&startTime, &tm_r)); + return buf; +} + +const char *cEvent::GetTimeString(void) const +{ + static char buf[25]; + struct tm tm_r; + strftime(buf, sizeof(buf), "%R", localtime_r(&startTime, &tm_r)); + return buf; +} + +const char *cEvent::GetEndTimeString(void) const +{ + static char buf[25]; + time_t EndTime = startTime + duration; + struct tm tm_r; + strftime(buf, sizeof(buf), "%R", localtime_r(&EndTime, &tm_r)); + return buf; +} + +void cEvent::Dump(FILE *f, const char *Prefix) const +{ + if (startTime + duration >= time(NULL)) { + fprintf(f, "%sE %u %ld %d %X\n", Prefix, eventID, startTime, duration, tableID); + if (!isempty(title)) + fprintf(f, "%sT %s\n", Prefix, title); + if (!isempty(shortText)) + fprintf(f, "%sS %s\n", Prefix, shortText); + if (!isempty(description)) + fprintf(f, "%sD %s\n", Prefix, description); + fprintf(f, "%se\n", Prefix); + } +} + +bool cEvent::Read(FILE *f, cSchedule *Schedule) +{ + if (Schedule) { + cEvent *Event = NULL; + char *s; + while ((s = readline(f)) != NULL) { + char *t = skipspace(s + 1); + switch (*s) { + case 'E': if (!Event) { + unsigned int EventID; + time_t StartTime; + int Duration; + unsigned int TableID = 0; + int n = sscanf(t, "%u %ld %d %X", &EventID, &StartTime, &Duration, &TableID); + if (n == 3 || n == 4) { + Event = (cEvent *)Schedule->GetEvent(EventID, StartTime); + if (!Event) + Event = Schedule->AddEvent(new cEvent(Schedule->ChannelID(), EventID)); + if (Event) { + Event->SetTableID(TableID); + Event->SetStartTime(StartTime); + Event->SetDuration(Duration); + } + } + } + break; + case 'T': if (Event) + Event->SetTitle(t); + break; + case 'S': if (Event) + Event->SetShortText(t); + break; + case 'D': if (Event) + Event->SetDescription(t); + break; + case 'e': Event = NULL; + break; + case 'c': // to keep things simple we react on 'c' here + return true; + default: esyslog("ERROR: unexpected tag while reading EPG data: %s", s); + return false; + } + } + esyslog("ERROR: unexpected end of file while reading EPG data"); + } + return false; +} + +#define MAXEPGBUGFIXSTATS 7 +#define MAXEPGBUGFIXCHANS 100 +struct tEpgBugFixStats { + int hits; + int n; + tChannelID channelIDs[MAXEPGBUGFIXCHANS]; + tEpgBugFixStats(void) { hits = n = 0; } + }; + +tEpgBugFixStats EpgBugFixStats[MAXEPGBUGFIXSTATS]; + +static void EpgBugFixStat(int Number, tChannelID ChannelID) +{ + if (0 <= Number && Number < MAXEPGBUGFIXSTATS) { + tEpgBugFixStats *p = &EpgBugFixStats[Number]; + p->hits++; + int i = 0; + for (; i < p->n; i++) { + if (p->channelIDs[i] == ChannelID) + break; + } + if (i == p->n && p->n < MAXEPGBUGFIXCHANS) + p->channelIDs[p->n++] = ChannelID; + } +} + +void ReportEpgBugFixStats(bool Reset) +{ + if (Setup.EPGBugfixLevel > 0) { + bool GotHits = false; + char buffer[1024]; + for (int i = 0; i < MAXEPGBUGFIXSTATS; i++) { + const char *delim = "\t"; + tEpgBugFixStats *p = &EpgBugFixStats[i]; + if (p->hits) { + bool PrintedStats = false; + char *q = buffer; + *buffer = 0; + for (int c = 0; c < p->n; c++) { + cChannel *channel = Channels.GetByChannelID(p->channelIDs[c], true); + if (channel) { + if (!GotHits) { + dsyslog("====================="); + dsyslog("EPG bugfix statistics"); + dsyslog("====================="); + dsyslog("IF SOMEBODY WHO IS IN CHARGE OF THE EPG DATA FOR ONE OF THE LISTED"); + dsyslog("CHANNELS READS THIS: PLEASE TAKE A LOOK AT THE FUNCTION cEvent::FixEpgBugs()"); + dsyslog("IN VDR/epg.c TO LEARN WHAT'S WRONG WITH YOUR DATA, AND FIX IT!"); + dsyslog("====================="); + dsyslog("Fix\tHits\tChannels"); + GotHits = true; + } + if (!PrintedStats) { + q += snprintf(q, sizeof(buffer) - (q - buffer), "%d\t%d", i, p->hits); + PrintedStats = true; + } + q += snprintf(q, sizeof(buffer) - (q - buffer), "%s%s", delim, channel->Name()); + delim = ", "; + if (q - buffer > 80) { + q += snprintf(q, sizeof(buffer) - (q - buffer), "%s...", delim); + break; + } + } + } + if (*buffer) + dsyslog("%s", buffer); + } + if (Reset) + p->hits = p->n = 0; + } + if (GotHits) + dsyslog("====================="); + } +} + +void cEvent::FixEpgBugs(void) +{ + // VDR can't usefully handle newline characters in the EPG data, so let's + // always convert them to blanks (independent of the setting of EPGBugfixLevel): + strreplace(title, '\n', ' '); + strreplace(shortText, '\n', ' '); + strreplace(description, '\n', ' '); + + if (Setup.EPGBugfixLevel == 0) + return; + + // Some TV stations apparently have their own idea about how to fill in the + // EPG data. Let's fix their bugs as good as we can: + if (title) { + + // Some channels put too much information into the ShortText and leave the + // Description empty: + // + // Title + // (NAT, Year Min')[ ["ShortText". ]Description] + // + if (shortText && !description) { + if (*shortText == '(') { + char *e = strchr(shortText + 1, ')'); + if (e) { + if (*(e + 1)) { + if (*++e == ' ') + if (*(e + 1) == '"') + e++; + } + else + e = NULL; + char *s = e ? strdup(e) : NULL; + free(shortText); + shortText = s; + EpgBugFixStat(0, ChannelID()); + // now the fixes #1 and #2 below will handle the rest + } + } + } + + // Some channels put the ShortText in quotes and use either the ShortText + // or the Description field, depending on how long the string is: + // + // Title + // "ShortText". Description + // + if ((shortText == NULL) != (description == NULL)) { + char *p = shortText ? shortText : description; + if (*p == '"') { + const char *delim = "\"."; + char *e = strstr(p + 1, delim); + if (e) { + *e = 0; + char *s = strdup(p + 1); + char *d = strdup(e + strlen(delim)); + free(shortText); + free(description); + shortText = s; + description = d; + EpgBugFixStat(1, ChannelID()); + } + } + } + + // Some channels put the Description into the ShortText (preceeded + // by a blank) if there is no actual ShortText and the Description + // is short enough: + // + // Title + // Description + // + if (shortText && !description) { + if (*shortText == ' ') { + memmove(shortText, shortText + 1, strlen(shortText)); + description = shortText; + shortText = NULL; + EpgBugFixStat(2, ChannelID()); + } + } + + // Sometimes they repeat the Title in the ShortText: + // + // Title + // Title + // + if (shortText && strcmp(title, shortText) == 0) { + free(shortText); + shortText = NULL; + EpgBugFixStat(3, ChannelID()); + } + + // Some channels put the ShortText between double quotes, which is nothing + // but annoying (some even put a '.' after the closing '"'): + // + // Title + // "ShortText"[.] + // + if (shortText && *shortText == '"') { + int l = strlen(shortText); + if (l > 2 && (shortText[l - 1] == '"' || (shortText[l - 1] == '.' && shortText[l - 2] == '"'))) { + memmove(shortText, shortText + 1, l); + char *p = strrchr(shortText, '"'); + if (p) + *p = 0; + EpgBugFixStat(4, ChannelID()); + } + } + + if (Setup.EPGBugfixLevel <= 1) + return; + + // Some channels apparently try to do some formatting in the texts, + // which is a bad idea because they have no way of knowing the width + // of the window that will actually display the text. + // Remove excess whitespace: + title = compactspace(title); + shortText = compactspace(shortText); + description = compactspace(description); + // Remove superfluous hyphens: + if (description) { + char *p = description; + while (*p && *(p + 1) && *(p + 2)) { + if (*p == '-' && *(p + 1) == ' ' && *(p + 2) && islower(*(p - 1)) && islower(*(p + 2))) { + if (!startswith(p + 2, "und ")) { // special case in German, as in "Lach- und Sachgeschichten" + memmove(p, p + 2, strlen(p + 2) + 1); + EpgBugFixStat(5, ChannelID()); + } + } + p++; + } + } + +#define MAX_USEFUL_EPISODE_LENGTH 40 + // Some channels put a whole lot of information in the ShortText and leave + // the Description totally empty. So if the ShortText length exceeds + // MAX_USEFUL_EPISODE_LENGTH, let's put this into the Description + // instead: + if (!isempty(shortText) && isempty(description)) { + if (strlen(shortText) > MAX_USEFUL_EPISODE_LENGTH) { + free(description); + description = shortText; + shortText = NULL; + EpgBugFixStat(6, ChannelID()); + } + } + + // Some channels use the ` ("backtick") character, where a ' (single quote) + // would be normally used. Actually, "backticks" in normal text don't make + // much sense, so let's replace them: + strreplace(title, '`', '\''); + strreplace(shortText, '`', '\''); + strreplace(description, '`', '\''); + } +} + +// --- cSchedule ------------------------------------------------------------- + +cSchedule::cSchedule(tChannelID ChannelID) +{ + channelID = ChannelID; + present = following = NULL; +} + +cEvent *cSchedule::AddEvent(cEvent *Event) +{ + events.Add(Event); + return Event; +} + +const cEvent *cSchedule::GetPresentEvent(void) const +{ + return GetEventAround(time(NULL)); +} + +const cEvent *cSchedule::GetFollowingEvent(void) const +{ + const cEvent *pe = NULL; + time_t now = time(NULL); + time_t delta = INT_MAX; + for (cEvent *p = events.First(); p; p = events.Next(p)) { + time_t dt = p->StartTime() - now; + if (dt > 0 && dt < delta) { + delta = dt; + pe = p; + } + } + return pe; +} + +const cEvent *cSchedule::GetEvent(u_int16_t EventID, time_t StartTime) const +{ + // Returns either the event info with the given EventID or, if that one can't + // be found, the one with the given StartTime (or NULL if neither can be found) + cEvent *pt = NULL; + for (cEvent *pe = events.First(); pe; pe = events.Next(pe)) { + if (pe->EventID() == EventID) + return pe; + if (StartTime > 0 && pe->StartTime() == StartTime) // 'StartTime < 0' is apparently used with NVOD channels + pt = pe; + } + return pt; +} + +const cEvent *cSchedule::GetEventAround(time_t Time) const +{ + const cEvent *pe = NULL; + time_t delta = INT_MAX; + for (cEvent *p = events.First(); p; p = events.Next(p)) { + time_t dt = Time - p->StartTime(); + if (dt >= 0 && dt < delta && p->StartTime() + p->Duration() >= Time) { + delta = dt; + pe = p; + } + } + return pe; +} + +bool cSchedule::SetPresentEvent(cEvent *Event) +{ + if (present) + present->SetIsPresent(false); + present = Event; + present->SetIsPresent(true); + return true; +} + +bool cSchedule::SetFollowingEvent(cEvent *Event) +{ + if (following) + following->SetIsFollowing(false); + following = Event; + following->SetIsFollowing(true); + return true; +} + +void cSchedule::Cleanup(void) +{ + Cleanup(time(NULL)); +} + +void cSchedule::Cleanup(time_t Time) +{ + cEvent *Event; + for (int a = 0; true ; a++) { + Event = events.Get(a); + if (!Event) + break; + if (Event->StartTime() + Event->Duration() + 3600 < Time) { // adding one hour for safety + events.Del(Event); + a--; + } + } +} + +void cSchedule::Dump(FILE *f, const char *Prefix) const +{ + cChannel *channel = Channels.GetByChannelID(channelID, true); + if (channel) { + fprintf(f, "%sC %s %s\n", Prefix, channel->GetChannelID().ToString(), channel->Name()); + for (cEvent *p = events.First(); p; p = events.Next(p)) + p->Dump(f, Prefix); + fprintf(f, "%sc\n", Prefix); + } +} + +bool cSchedule::Read(FILE *f, cSchedules *Schedules) +{ + if (Schedules) { + char *s; + while ((s = readline(f)) != NULL) { + if (*s == 'C') { + s = skipspace(s + 1); + char *p = strchr(s, ' '); + if (p) + *p = 0; // strips optional channel name + if (*s) { + tChannelID channelID = tChannelID::FromString(s); + if (channelID.Valid()) { + cSchedule *p = Schedules->AddSchedule(channelID); + if (p) { + if (!cEvent::Read(f, p)) + return false; + } + } + else { + esyslog("ERROR: illegal channel ID: %s", s); + return false; + } + } + } + else { + esyslog("ERROR: unexpected tag while reading EPG data: %s", s); + return false; + } + } + return true; + } + return false; +} + +// --- cSchedulesLock -------------------------------------------------------- + +cSchedulesLock::cSchedulesLock(bool WriteLock, int TimeoutMs) +{ + locked = cSchedules::schedules.rwlock.Lock(WriteLock, TimeoutMs); +} + +cSchedulesLock::~cSchedulesLock() +{ + if (locked) + cSchedules::schedules.rwlock.Unlock(); +} + +// --- cSchedules ------------------------------------------------------------ + +cSchedules cSchedules::schedules; +const char *cSchedules::epgDataFileName = NULL; +time_t cSchedules::lastCleanup = time(NULL); +time_t cSchedules::lastDump = time(NULL); + +const cSchedules *cSchedules::Schedules(cSchedulesLock &SchedulesLock) +{ + return SchedulesLock.Locked() ? &schedules : NULL; +} + +void cSchedules::SetEpgDataFileName(const char *FileName) +{ + delete epgDataFileName; + if (FileName) + epgDataFileName = strdup(FileName); +} + +void cSchedules::Cleanup(bool Force) +{ + if (Force) + lastDump = 0; + time_t now = time(NULL); + struct tm tm_r; + struct tm *ptm = localtime_r(&now, &tm_r); + if (now - lastCleanup > 3600 && ptm->tm_hour == 5) { + isyslog("cleaning up schedules data"); + cSchedulesLock SchedulesLock(true, 1000); + cSchedules *s = (cSchedules *)Schedules(SchedulesLock); + if (s) { + for (cSchedule *p = s->First(); p; p = s->Next(p)) + p->Cleanup(now); + } + lastCleanup = now; + ReportEpgBugFixStats(true); + } + if (epgDataFileName && now - lastDump > 600) { + cSafeFile f(epgDataFileName); + if (f.Open()) { + Dump(f); + f.Close(); + } + else + LOG_ERROR; + lastDump = now; + } +} + +bool cSchedules::ClearAll(void) +{ + cSchedulesLock SchedulesLock(true, 1000); + cSchedules *s = (cSchedules *)Schedules(SchedulesLock); + if (s) { + s->Clear(); + return true; + } + return false; +} + +bool cSchedules::Dump(FILE *f, const char *Prefix) +{ + cSchedulesLock SchedulesLock; + cSchedules *s = (cSchedules *)Schedules(SchedulesLock); + if (s) { + for (cSchedule *p = s->First(); p; p = s->Next(p)) + p->Dump(f, Prefix); + return true; + } + return false; +} + +bool cSchedules::Read(FILE *f) +{ + cSchedulesLock SchedulesLock(true, 1000); + cSchedules *s = (cSchedules *)Schedules(SchedulesLock); + if (s) { + bool OwnFile = f == NULL; + if (OwnFile) { + if (epgDataFileName && access(epgDataFileName, R_OK) == 0) { + dsyslog("reading EPG data from %s", epgDataFileName); + if ((f = fopen(epgDataFileName, "r")) == NULL) { + LOG_ERROR; + return false; + } + } + else + return false; + } + bool result = cSchedule::Read(f, s); + if (OwnFile) + fclose(f); + return result; + } + return false; +} + +cSchedule *cSchedules::AddSchedule(tChannelID ChannelID) +{ + ChannelID.ClrRid(); + cSchedule *p = (cSchedule *)GetSchedule(ChannelID); + if (!p) { + p = new cSchedule(ChannelID); + Add(p); + } + return p; +} + +const cSchedule *cSchedules::GetSchedule(tChannelID ChannelID) const +{ + ChannelID.ClrRid(); + for (cSchedule *p = First(); p; p = Next(p)) { + if (p->ChannelID() == ChannelID) + return p; + } + return NULL; +} + @@ -0,0 +1,134 @@ +/* + * epg.h: Electronic Program Guide + * + * See the main source file 'vdr.c' for copyright information and + * how to reach the author. + * + * Original version (as used in VDR before 1.3.0) written by + * Robert Schneider <Robert.Schneider@web.de> and Rolf Hakenes <hakenes@hippomi.de>. + * + * $Id: epg.h 1.3 2004/01/03 17:00:25 kls Exp $ + */ + +#ifndef __EPG_H +#define __EPG_H + +#include "channels.h" +#include "thread.h" +#include "tools.h" + +#define MAXEPGBUGFIXLEVEL 2 + +class cSchedule; + +class cEvent : public cListObject { +private: + tChannelID channelID; // Channel ID of program for this event + u_int16_t eventID; // Event ID of this event + uchar tableID; // Table ID this event came from + uchar version; // Version number of section this event came from + //XXX present/following obsolete??? + bool isPresent; // true if this is the present event running + bool isFollowing; // true if this is the next event on this channel + char *title; // Title of this event + char *shortText; // Short description of this event (typically the episode name in case of a series) + char *description; // Description of this event + time_t startTime; // Start time of this event + int duration; // Duration of this event in seconds + //XXX find an other solution, avoiding channelNumber??? + int channelNumber; // the actual channel number from VDR's channel list (used in cMenuSchedule for sorting by channel number) +public: + cEvent(tChannelID ChannelID, u_int16_t EventID); + ~cEvent(); + tChannelID ChannelID(void) const { return channelID; } + u_int16_t EventID(void) const { return eventID; } + uchar TableID(void) const { return tableID; } + uchar Version(void) const { return version; } + bool IsPresent(void) const { return isPresent; } + bool IsFollowing(void) const { return isFollowing; } + const char *Title(void) const { return title; } + const char *ShortText(void) const { return shortText; } + const char *Description(void) const { return description; } + time_t StartTime(void) const { return startTime; } + int Duration(void) const { return duration; } + int ChannelNumber(void) const { return channelNumber; } + const char *GetDateString(void) const; + const char *GetTimeString(void) const; + const char *GetEndTimeString(void) const; + void SetEventID(u_int16_t EventID); + void SetTableID(uchar TableID); + void SetVersion(uchar Version); + void SetIsPresent(bool IsPresent); + void SetIsFollowing(bool IsFollowing); + void SetTitle(const char *Title); + void SetShortText(const char *ShortText); + void SetDescription(const char *Description); + void SetStartTime(time_t StartTime); + void SetDuration(int Duration); + void SetChannelNumber(int ChannelNumber) const { ((cEvent *)this)->channelNumber = ChannelNumber; } // doesn't modify the EIT data, so it's ok to make it 'const' //XXX + void Dump(FILE *f, const char *Prefix = "") const; + static bool Read(FILE *f, cSchedule *Schedule); + void FixEpgBugs(void); + }; + +class cSchedules; + +class cSchedule : public cListObject { +private: + tChannelID channelID; + cList<cEvent> events; + cEvent *present; + cEvent *following; +public: + cSchedule(tChannelID ChannelID); + tChannelID ChannelID(void) const { return channelID; } + bool SetPresentEvent(cEvent *Event); + bool SetFollowingEvent(cEvent *Event); + void Cleanup(time_t Time); + void Cleanup(void); + cEvent *AddEvent(cEvent *Event); + const cEvent *GetPresentEvent(void) const; + const cEvent *GetFollowingEvent(void) const; + const cEvent *GetEvent(u_int16_t EventID, time_t StartTime = 0) const; + const cEvent *GetEventAround(time_t Time) const; + const cEvent *GetEventNumber(int n) const { return events.Get(n); } + int NumEvents(void) const { return events.Count(); } + void Dump(FILE *f, const char *Prefix = "") const; + static bool Read(FILE *f, cSchedules *Schedules); + }; + +class cSchedulesLock { +private: + bool locked; +public: + cSchedulesLock(bool WriteLock = false, int TimeoutMs = 0); + ~cSchedulesLock(); + bool Locked(void) { return locked; } + }; + +class cSchedules : public cList<cSchedule> { + friend class cSchedule; + friend class cSchedulesLock; +private: + cRwLock rwlock; + static cSchedules schedules; + static const char *epgDataFileName; + static time_t lastCleanup; + static time_t lastDump; +public: + static void SetEpgDataFileName(const char *FileName); + static const cSchedules *Schedules(cSchedulesLock &SchedulesLock); + ///< Caller must provide a cSchedulesLock which has to survive the entire + ///< time the returned cSchedules is accessed. Once the cSchedules is no + ///< longer used, the cSchedulesLock must be destroyed. + static void Cleanup(bool Force = false); + static bool ClearAll(void); + static bool Dump(FILE *f, const char *Prefix = ""); + static bool Read(FILE *f = NULL); + cSchedule *AddSchedule(tChannelID ChannelID); + const cSchedule *GetSchedule(tChannelID ChannelID) const; + }; + +void ReportEpgBugFixStats(bool Reset = false); + +#endif //__EPG_H diff --git a/filter.c b/filter.c new file mode 100644 index 0000000..668b7d3 --- /dev/null +++ b/filter.c @@ -0,0 +1,126 @@ +/* + * filter.c: Section filter + * + * See the main source file 'vdr.c' for copyright information and + * how to reach the author. + * + * $Id: filter.c 1.1 2003/12/21 15:26:16 kls Exp $ + */ + +#include "filter.h" +#include "sections.h" + +// --- cFilterData ----------------------------------------------------------- + +cFilterData::cFilterData(void) +{ + pid = 0; + tid = 0; + mask = 0; + sticky = false; +} + +cFilterData::cFilterData(u_short Pid, u_char Tid, u_char Mask, bool Sticky) +{ + pid = Pid; + tid = Tid; + mask = Mask; + sticky = Sticky; +} + +bool cFilterData::Is(u_short Pid, u_char Tid, u_char Mask) +{ + return pid == Pid && tid == Tid && mask == Mask; +} + +bool cFilterData::Matches(u_short Pid, u_char Tid) +{ + return pid == Pid && tid == (Tid & mask); +} + +// --- cFilter --------------------------------------------------------------- + +cFilter::cFilter(void) +{ + sectionHandler = NULL; + on = false; +} + +cFilter::cFilter(u_short Pid, u_char Tid, u_char Mask) +{ + sectionHandler = NULL; + on = false; + Set(Pid, Tid, Mask); +} + +cFilter::~cFilter() +{ + if (sectionHandler) + sectionHandler->Detach(this); +} + +int cFilter::Source(void) +{ + return sectionHandler ? sectionHandler->Source() : 0; +} + +int cFilter::Transponder(void) +{ + return sectionHandler ? sectionHandler->Transponder() : 0; +} + +void cFilter::SetStatus(bool On) +{ + if (sectionHandler && on != On) { + cFilterData *fd = data.First(); + while (fd) { + if (On) + sectionHandler->Add(fd); + else { + sectionHandler->Del(fd); + if (!fd->sticky) { + cFilterData *next = data.Next(fd); + data.Del(fd); + fd = next; + continue; + } + } + fd = data.Next(fd); + } + on = On; + } +} + +bool cFilter::Matches(u_short Pid, u_char Tid) +{ + for (cFilterData *fd = data.First(); fd; fd = data.Next(fd)) { + if (fd->Matches(Pid, Tid)) + return true; + } + return false; +} + +void cFilter::Set(u_short Pid, u_char Tid, u_char Mask) +{ + Add(Pid, Tid, Mask, true); +} + +void cFilter::Add(u_short Pid, u_char Tid, u_char Mask, bool Sticky) +{ + cFilterData *fd = new cFilterData(Pid, Tid, Mask, Sticky); + data.Add(fd); + if (sectionHandler && on) + sectionHandler->Add(fd); +} + +void cFilter::Del(u_short Pid, u_char Tid, u_char Mask) +{ + for (cFilterData *fd = data.First(); fd; fd = data.Next(fd)) { + if (fd->Is(Pid, Tid, Mask)) { + if (sectionHandler && on) + sectionHandler->Del(fd); + data.Del(fd); + return; + } + } +} diff --git a/filter.h b/filter.h new file mode 100644 index 0000000..09703e0 --- /dev/null +++ b/filter.h @@ -0,0 +1,74 @@ +/* + * filter.h: Section filter + * + * See the main source file 'vdr.c' for copyright information and + * how to reach the author. + * + * $Id: filter.h 1.1 2003/12/22 11:41:40 kls Exp $ + */ + +#ifndef __FILTER_H +#define __FILTER_H + +#include <sys/types.h> +#include "tools.h" + +class cFilterData : public cListObject { +public: + u_short pid; + u_char tid; + u_char mask; + bool sticky; + cFilterData(void); + cFilterData(u_short Pid, u_char Tid, u_char Mask, bool Sticky); + bool Is(u_short Pid, u_char Tid, u_char Mask); + bool Matches(u_short Pid, u_char Tid); + }; + +class cSectionHandler; + +class cFilter : public cListObject { + friend class cSectionHandler; +private: + cSectionHandler *sectionHandler; + cList<cFilterData> data; + bool on; +protected: + cFilter(void); + cFilter(u_short Pid, u_char Tid, u_char Mask = 0xFF); + virtual ~cFilter(); + virtual void SetStatus(bool On); + ///< Turns this filter on or off, depending on the value of On. + ///< If the filter is turned off, any filter data that has been + ///< added without the Sticky parameter set to 'true' will be + ///< automatically deleted. Those parameters that have been added + ///< with Sticky set to 'true' will be automatically reused when + ///< SetStatus(true) is called. + virtual void Process(u_short Pid, u_char Tid, const u_char *Data, int Length) = 0; + ///< Processes the data delivered to this filter. + ///< Pid and Tid is one of the combinations added to this filter by + ///< a previous call to Add(), Data is a pointer to Length bytes of + ///< data. This function will be called from the section handler's + ///< thread, so it has to use proper locking mechanisms in case it + ///< accesses any global data. It is guaranteed that if several cFilters + ///< are attached to the same cSectionHandler, only _one_ of them has + ///< its Process() function called at any given time. It is allowed + ///< that more than one cFilter are set up to receive the same Pid/Tid. + ///< The Process() function must return as soon as possible. + int Source(void); + ///< Returns the source of the data delivered to this filter. + int Transponder(void); + ///< Returns the transponder of the data delivered to this filter. + bool Matches(u_short Pid, u_char Tid); + ///< Indicates whether this filter wants to receive data from the given Pid/Tid. + void Set(u_short Pid, u_char Tid, u_char Mask = 0xFF); + ///< Sets the given filter data by calling Add() with Sticky = true. + void Add(u_short Pid, u_char Tid, u_char Mask = 0xFF, bool Sticky = false); + ///< Adds the given filter data to this filter. + ///< If Sticky is true, this will survive a status change, otherwise + ///< it will be automatically deleted. + void Del(u_short Pid, u_char Tid, u_char Mask = 0xFF); + ///< Deletes the given filter data from this filter. + }; + +#endif //__FILTER_H @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: font.c 1.2 2000/11/18 15:16:08 kls Exp $ + * $Id: font.c 1.4 2003/10/24 12:59:35 kls Exp $ */ #include "font.h" @@ -12,24 +12,38 @@ #include "fontfix.c" #include "fontosd.c" +#include "fontsml.c" -cFont::cFont(eDvbFont Font) -{ +#include "fontfix-iso8859-7.c" +#include "fontosd-iso8859-7.c" +#include "fontsml-iso8859-7.c" + +static void *FontData[eDvbCodeSize][eDvbFontSize] = { + { FontOsd_iso8859_1, FontFix_iso8859_1, FontSml_iso8859_1 }, + { FontOsd_iso8859_7, FontFix_iso8859_7, FontSml_iso8859_7 } + }; + +static const char *FontCode[eDvbCodeSize] = { + "iso8859-1", + "iso8859-7" + }; -#define FONTINDEX(Name)\ - case font##Name: for (int i = 0; i < NUMCHARS; i++)\ - data[i] = (tCharData *)&Font##Name[i < 32 ? 0 : i - 32];\ - break; +eDvbCode cFont::code = code_iso8859_1; +cFont *cFont::fonts[eDvbFontSize] = { NULL }; - switch (Font) { - default: - FONTINDEX(Osd); - FONTINDEX(Fix); - // TODO others... - } +cFont::cFont(void *Data) +{ + SetData(Data); } -int cFont::Width(const char *s) +void cFont::SetData(void *Data) +{ + int h = ((tCharData *)Data)->height; + for (int i = 0; i < NUMCHARS; i++) + data[i] = (tCharData *)&((tPixelData *)Data)[(i < 32 ? 0 : i - 32) * (h + 2)]; +} + +int cFont::Width(const char *s) const { int w = 0; while (s && *s) @@ -37,7 +51,7 @@ int cFont::Width(const char *s) return w; } -int cFont::Height(const char *s) +int cFont::Height(const char *s) const { int h = 0; if (s && *s) @@ -45,3 +59,37 @@ int cFont::Height(const char *s) return h; } +bool cFont::SetCode(const char *Code) +{ + for (int i = 0; i < eDvbCodeSize; i++) { + if (strcmp(Code, FontCode[i]) == 0) { + SetCode(eDvbCode(i)); + return true; + } + } + return false; +} + +void cFont::SetCode(eDvbCode Code) +{ + if (code != Code) { + code = Code; + for (int i = 0; i < eDvbFontSize; i++) { + if (fonts[i]) + fonts[i]->SetData(FontData[code][i]); + } + } +} + +void cFont::SetFont(eDvbFont Font, void *Data) +{ + delete fonts[Font]; + fonts[Font] = new cFont(Data ? Data : FontData[code][Font]); +} + +const cFont *cFont::GetFont(eDvbFont Font) +{ + if (!fonts[Font]) + SetFont(Font); + return fonts[Font]; +} @@ -4,19 +4,25 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: font.h 1.2 2000/11/18 14:51:45 kls Exp $ + * $Id: font.h 1.4 2003/10/24 12:59:45 kls Exp $ */ #ifndef __FONT_H #define __FONT_H +#include <stdlib.h> + enum eDvbFont { fontOsd, fontFix, -/* TODO as soon as we have the font files... - fontTtxSmall, - fontTtxLarge, -*/ + fontSml +#define eDvbFontSize (fontSml + 1) + }; + +enum eDvbCode { + code_iso8859_1, + code_iso8859_7 +#define eDvbCodeSize (code_iso8859_7 + 1) }; class cFont { @@ -28,14 +34,21 @@ public: tPixelData lines[1]; }; private: + static eDvbCode code; + static cFont *fonts[]; const tCharData *data[NUMCHARS]; public: - cFont(eDvbFont Font); - int Width(unsigned char c) { return data[c]->width; } - int Width(const char *s); - int Height(unsigned char c) { return data[c]->height; } - int Height(const char *s); - const tCharData *CharData(unsigned char c) { return data[c]; } + cFont(void *Data); + void SetData(void *Data); + int Width(unsigned char c) const { return data[c]->width; } + int Width(const char *s) const; + int Height(unsigned char c) const { return data[c]->height; } + int Height(const char *s) const; + const tCharData *CharData(unsigned char c) const { return data[c]; } + static bool SetCode(const char *Code); + static void SetCode(eDvbCode Code); + static void SetFont(eDvbFont Font, void *Data = NULL); + static const cFont *GetFont(eDvbFont Font); }; #endif //__FONT_H diff --git a/fontfix-iso8859-7.c b/fontfix-iso8859-7.c new file mode 100644 index 0000000..35cc96e --- /dev/null +++ b/fontfix-iso8859-7.c @@ -0,0 +1,6498 @@ +cFont::tPixelData FontFix_iso8859_7[][28] = { + { // 32 + 14, 26, + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 33 + 14, 26, + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000180, // ......**...... + 0x000003C0, // .....****..... + 0x000003C0, // .....****..... + 0x000003C0, // .....****..... + 0x000003C0, // .....****..... + 0x000003C0, // .....****..... + 0x000003C0, // .....****..... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000180, // ......**...... + 0x000003C0, // .....****..... + 0x000003C0, // .....****..... + 0x00000180, // ......**...... + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 34 + 14, 26, + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000E70, // ...***..***... + 0x00000E70, // ...***..***... + 0x00000E70, // ...***..***... + 0x00000E70, // ...***..***... + 0x00000420, // ....*....*.... + 0x00000420, // ....*....*.... + 0x00000420, // ....*....*.... + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 35 + 14, 26, + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000660, // ....**..**.... + 0x00000660, // ....**..**.... + 0x00000660, // ....**..**.... + 0x00000660, // ....**..**.... + 0x00000660, // ....**..**.... + 0x00003FFC, // .************. + 0x00003FFC, // .************. + 0x00000660, // ....**..**.... + 0x00000660, // ....**..**.... + 0x00000660, // ....**..**.... + 0x00000660, // ....**..**.... + 0x00003FFC, // .************. + 0x00003FFC, // .************. + 0x00000660, // ....**..**.... + 0x00000660, // ....**..**.... + 0x00000660, // ....**..**.... + 0x00000660, // ....**..**.... + 0x00000660, // ....**..**.... + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 36 + 14, 26, + 0x00000000, // .............. + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x000007E0, // ....******.... + 0x00000C38, // ...**....***.. + 0x00001818, // ..**......**.. + 0x00001808, // ..**.......*.. + 0x00001800, // ..**.......... + 0x00001C00, // ..***......... + 0x00000E00, // ...***........ + 0x00000780, // ....****...... + 0x000001E0, // ......****.... + 0x00000070, // ........***... + 0x00000038, // .........***.. + 0x00000018, // ..........**.. + 0x00001018, // ..*.......**.. + 0x00001818, // ..**......**.. + 0x00001C30, // ..***....**... + 0x000007E0, // ....******.... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 37 + 14, 26, + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00001E18, // ..****....**.. + 0x00003318, // .**..**...**.. + 0x00003330, // .**..**..**... + 0x00003330, // .**..**..**... + 0x00003360, // .**..**.**.... + 0x00001E60, // ..****..**.... + 0x000000C0, // .......**..... + 0x000000C0, // .......**..... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000300, // .....**....... + 0x00000300, // .....**....... + 0x00000678, // ....**..****.. + 0x000006CC, // ....**.**..**. + 0x00000CCC, // ...**..**..**. + 0x00000CCC, // ...**..**..**. + 0x000018CC, // ..**...**..**. + 0x00001878, // ..**....****.. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 38 + 14, 26, + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000780, // ....****...... + 0x00000CC0, // ...**..**..... + 0x00001860, // ..**....**.... + 0x00001860, // ..**....**.... + 0x00001860, // ..**....**.... + 0x00001860, // ..**....**.... + 0x00000CC0, // ...**..**..... + 0x00000780, // ....****...... + 0x00000700, // ....***....... + 0x00000D80, // ...**.**...... + 0x0000198C, // ..**..**...**. + 0x000018CC, // ..**...**..**. + 0x000030D8, // .**....**.**.. + 0x00003070, // .**.....***... + 0x00003030, // .**......**... + 0x00003070, // .**.....***... + 0x000018D8, // ..**...**.**.. + 0x00000F9C, // ...*****..***. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 39 + 14, 26, + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000180, // ......**...... + 0x000003C0, // .....****..... + 0x000003C0, // .....****..... + 0x000001C0, // ......***..... + 0x00000180, // ......**...... + 0x00000300, // .....**....... + 0x00000600, // ....**........ + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 40 + 14, 26, + 0x00000000, // .............. + 0x00000060, // ........**.... + 0x000000C0, // .......**..... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000300, // .....**....... + 0x00000300, // .....**....... + 0x00000600, // ....**........ + 0x00000600, // ....**........ + 0x00000600, // ....**........ + 0x00000600, // ....**........ + 0x00000600, // ....**........ + 0x00000600, // ....**........ + 0x00000600, // ....**........ + 0x00000600, // ....**........ + 0x00000600, // ....**........ + 0x00000600, // ....**........ + 0x00000300, // .....**....... + 0x00000300, // .....**....... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x000000C0, // .......**..... + 0x00000060, // ........**.... + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 41 + 14, 26, + 0x00000000, // .............. + 0x00000600, // ....**........ + 0x00000300, // .....**....... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x000000C0, // .......**..... + 0x000000C0, // .......**..... + 0x00000060, // ........**.... + 0x00000060, // ........**.... + 0x00000060, // ........**.... + 0x00000060, // ........**.... + 0x00000060, // ........**.... + 0x00000060, // ........**.... + 0x00000060, // ........**.... + 0x00000060, // ........**.... + 0x00000060, // ........**.... + 0x00000060, // ........**.... + 0x000000C0, // .......**..... + 0x000000C0, // .......**..... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000300, // .....**....... + 0x00000600, // ....**........ + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 42 + 14, 26, + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00001998, // ..**..**..**.. + 0x00003DBC, // .****.**.****. + 0x00001FF8, // ..**********.. + 0x000003C0, // .....****..... + 0x000003C0, // .....****..... + 0x00001FF8, // ..**********.. + 0x00003DBC, // .****.**.****. + 0x00001998, // ..**..**..**.. + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 43 + 14, 26, + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00003FFC, // .************. + 0x00003FFC, // .************. + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 44 + 14, 26, + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000180, // ......**...... + 0x000003C0, // .....****..... + 0x000003C0, // .....****..... + 0x000001C0, // ......***..... + 0x00000180, // ......**...... + 0x00000300, // .....**....... + 0x00000600, // ....**........ + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 45 + 14, 26, + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00003FFC, // .************. + 0x00003FFC, // .************. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 46 + 14, 26, + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000180, // ......**...... + 0x000003C0, // .....****..... + 0x000003C0, // .....****..... + 0x00000180, // ......**...... + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 47 + 14, 26, + 0x00000000, // .............. + 0x0000000C, // ...........**. + 0x0000000C, // ...........**. + 0x00000018, // ..........**.. + 0x00000018, // ..........**.. + 0x00000030, // .........**... + 0x00000030, // .........**... + 0x00000060, // ........**.... + 0x00000060, // ........**.... + 0x000000C0, // .......**..... + 0x000000C0, // .......**..... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000300, // .....**....... + 0x00000300, // .....**....... + 0x00000600, // ....**........ + 0x00000600, // ....**........ + 0x00000C00, // ...**......... + 0x00000C00, // ...**......... + 0x00001800, // ..**.......... + 0x00001800, // ..**.......... + 0x00003000, // .**........... + 0x00003000, // .**........... + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 48 + 14, 26, + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x000007C0, // ....*****..... + 0x00000C60, // ...**...**.... + 0x00001830, // ..**.....**... + 0x00001830, // ..**.....**... + 0x00003018, // .**.......**.. + 0x00003018, // .**.......**.. + 0x00003018, // .**.......**.. + 0x00003018, // .**.......**.. + 0x00003018, // .**.......**.. + 0x00003018, // .**.......**.. + 0x00003018, // .**.......**.. + 0x00003018, // .**.......**.. + 0x00001830, // ..**.....**... + 0x00001830, // ..**.....**... + 0x00000C60, // ...**...**.... + 0x000007C0, // ....*****..... + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 49 + 14, 26, + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000380, // .....***...... + 0x00000780, // ....****...... + 0x00000D80, // ...**.**...... + 0x00001980, // ..**..**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 50 + 14, 26, + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x000007E0, // ....******.... + 0x00000C30, // ...**....**... + 0x00001818, // ..**......**.. + 0x00001818, // ..**......**.. + 0x00000018, // ..........**.. + 0x00000018, // ..........**.. + 0x00000030, // .........**... + 0x00000060, // ........**.... + 0x000000C0, // .......**..... + 0x00000180, // ......**...... + 0x00000300, // .....**....... + 0x00000600, // ....**........ + 0x00000C00, // ...**......... + 0x00001808, // ..**.......*.. + 0x00001818, // ..**......**.. + 0x00001FF8, // ..**********.. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 51 + 14, 26, + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00003FF8, // .***********.. + 0x00000030, // .........**... + 0x00000060, // ........**.... + 0x000000C0, // .......**..... + 0x00000180, // ......**...... + 0x00000300, // .....**....... + 0x00000600, // ....**........ + 0x000007C0, // ....*****..... + 0x00000070, // ........***... + 0x00000030, // .........**... + 0x00000018, // ..........**.. + 0x00000018, // ..........**.. + 0x00000018, // ..........**.. + 0x00003030, // .**......**... + 0x00003870, // .***....***... + 0x00000FC0, // ...******..... + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 52 + 14, 26, + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x000000C0, // .......**..... + 0x000000C0, // .......**..... + 0x00000180, // ......**...... + 0x00000300, // .....**....... + 0x00000300, // .....**....... + 0x00000600, // ....**........ + 0x00000660, // ....**..**.... + 0x00000C60, // ...**...**.... + 0x00001860, // ..**....**.... + 0x00001860, // ..**....**.... + 0x00003060, // .**.....**.... + 0x00003FF8, // .***********.. + 0x00000060, // ........**.... + 0x00000060, // ........**.... + 0x00000060, // ........**.... + 0x00000060, // ........**.... + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 53 + 14, 26, + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00001FF0, // ..*********... + 0x00001800, // ..**.......... + 0x00001800, // ..**.......... + 0x00001800, // ..**.......... + 0x00001800, // ..**.......... + 0x00001800, // ..**.......... + 0x00001FC0, // ..*******..... + 0x00000070, // ........***... + 0x00000030, // .........**... + 0x00000018, // ..........**.. + 0x00000018, // ..........**.. + 0x00000018, // ..........**.. + 0x00000018, // ..........**.. + 0x00003030, // .**......**... + 0x00003870, // .***....***... + 0x00000FC0, // ...******..... + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 54 + 14, 26, + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x000000E0, // .......***.... + 0x00000380, // .....***...... + 0x00000600, // ....**........ + 0x00000C00, // ...**......... + 0x00001800, // ..**.......... + 0x00001000, // ..*........... + 0x000037C0, // .**.*****..... + 0x00003C70, // .****...***... + 0x00003830, // .***.....**... + 0x00003018, // .**.......**.. + 0x00003018, // .**.......**.. + 0x00003018, // .**.......**.. + 0x00003018, // .**.......**.. + 0x00001830, // ..**.....**... + 0x00001C70, // ..***...***... + 0x000007C0, // ....*****..... + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 55 + 14, 26, + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00001FF8, // ..**********.. + 0x00000018, // ..........**.. + 0x00000018, // ..........**.. + 0x00000030, // .........**... + 0x00000030, // .........**... + 0x00000060, // ........**.... + 0x00000060, // ........**.... + 0x000000C0, // .......**..... + 0x000000C0, // .......**..... + 0x000000C0, // .......**..... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000300, // .....**....... + 0x00000300, // .....**....... + 0x00000600, // ....**........ + 0x00000600, // ....**........ + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 56 + 14, 26, + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x000007C0, // ....*****..... + 0x00000C60, // ...**...**.... + 0x00001830, // ..**.....**... + 0x00001830, // ..**.....**... + 0x00001830, // ..**.....**... + 0x00001830, // ..**.....**... + 0x00000C60, // ...**...**.... + 0x000007C0, // ....*****..... + 0x00001C70, // ..***...***... + 0x00001830, // ..**.....**... + 0x00003018, // .**.......**.. + 0x00003018, // .**.......**.. + 0x00003018, // .**.......**.. + 0x00001830, // ..**.....**... + 0x00001C70, // ..***...***... + 0x000007C0, // ....*****..... + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 57 + 14, 26, + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x000007C0, // ....*****..... + 0x00001C70, // ..***...***... + 0x00001830, // ..**.....**... + 0x00003018, // .**.......**.. + 0x00003018, // .**.......**.. + 0x00003018, // .**.......**.. + 0x00003018, // .**.......**.. + 0x00001838, // ..**.....***.. + 0x00001C78, // ..***...****.. + 0x000007D8, // ....*****.**.. + 0x00000010, // ..........*... + 0x00000030, // .........**... + 0x00000060, // ........**.... + 0x000000C0, // .......**..... + 0x00000380, // .....***...... + 0x00000E00, // ...***........ + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 58 + 14, 26, + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000180, // ......**...... + 0x000003C0, // .....****..... + 0x000003C0, // .....****..... + 0x00000180, // ......**...... + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000180, // ......**...... + 0x000003C0, // .....****..... + 0x000003C0, // .....****..... + 0x00000180, // ......**...... + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 59 + 14, 26, + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000180, // ......**...... + 0x000003C0, // .....****..... + 0x000003C0, // .....****..... + 0x00000180, // ......**...... + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000180, // ......**...... + 0x000003C0, // .....****..... + 0x000003C0, // .....****..... + 0x000001C0, // ......***..... + 0x00000180, // ......**...... + 0x00000300, // .....**....... + 0x00000600, // ....**........ + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 60 + 14, 26, + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x0000000C, // ...........**. + 0x0000003C, // .........****. + 0x000000F0, // .......****... + 0x000003C0, // .....****..... + 0x00000F00, // ...****....... + 0x00003C00, // .****......... + 0x00003C00, // .****......... + 0x00000F00, // ...****....... + 0x000003C0, // .....****..... + 0x000000F0, // .......****... + 0x0000003C, // .........****. + 0x0000000C, // ...........**. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 61 + 14, 26, + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00003FFC, // .************. + 0x00003FFC, // .************. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00003FFC, // .************. + 0x00003FFC, // .************. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 62 + 14, 26, + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00003000, // .**........... + 0x00003C00, // .****......... + 0x00000F00, // ...****....... + 0x000003C0, // .....****..... + 0x000000F0, // .......****... + 0x0000003C, // .........****. + 0x0000003C, // .........****. + 0x000000F0, // .......****... + 0x000003C0, // .....****..... + 0x00000F00, // ...****....... + 0x00003C00, // .****......... + 0x00003000, // .**........... + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 63 + 14, 26, + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x000007E0, // ....******.... + 0x00000E70, // ...***..***... + 0x00001C38, // ..***....***.. + 0x00001C38, // ..***....***.. + 0x00000C38, // ...**....***.. + 0x00000038, // .........***.. + 0x00000070, // ........***... + 0x000000E0, // .......***.... + 0x000001C0, // ......***..... + 0x00000380, // .....***...... + 0x00000300, // .....**....... + 0x00000300, // .....**....... + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000300, // .....**....... + 0x00000780, // ....****...... + 0x00000780, // ....****...... + 0x00000300, // .....**....... + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 64 + 14, 26, + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x000003C0, // .....****..... + 0x00000E70, // ...***..***... + 0x00001818, // ..**......**.. + 0x00001818, // ..**......**.. + 0x00003018, // .**.......**.. + 0x000030F8, // .**....*****.. + 0x00003198, // .**...**..**.. + 0x00003318, // .**..**...**.. + 0x00003318, // .**..**...**.. + 0x00003318, // .**..**...**.. + 0x00003318, // .**..**...**.. + 0x000031B8, // .**...**.***.. + 0x000030EC, // .**....***.**. + 0x00003000, // .**........... + 0x00001800, // ..**.......... + 0x00001808, // ..**.......*.. + 0x00000E38, // ...***...***.. + 0x000003E0, // .....*****.... + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 65 + 14, 26, + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000080, // .......*...... + 0x000001C0, // ......***..... + 0x000001C0, // ......***..... + 0x00000140, // ......*.*..... + 0x00000360, // .....**.**.... + 0x00000360, // .....**.**.... + 0x00000220, // .....*...*.... + 0x00000630, // ....**...**... + 0x00000630, // ....**...**... + 0x00000410, // ....*.....*... + 0x00000FF8, // ...*********.. + 0x00000C18, // ...**.....**.. + 0x00000808, // ...*.......*.. + 0x0000180C, // ..**.......**. + 0x0000180C, // ..**.......**. + 0x00003C1E, // .****.....**** + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 66 + 14, 26, + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00001FE0, // ..********.... + 0x00000C30, // ...**....**... + 0x00000C18, // ...**.....**.. + 0x00000C18, // ...**.....**.. + 0x00000C18, // ...**.....**.. + 0x00000C18, // ...**.....**.. + 0x00000C30, // ...**....**... + 0x00000FE0, // ...*******.... + 0x00000C30, // ...**....**... + 0x00000C18, // ...**.....**.. + 0x00000C0C, // ...**......**. + 0x00000C0C, // ...**......**. + 0x00000C0C, // ...**......**. + 0x00000C0C, // ...**......**. + 0x00000C18, // ...**.....**.. + 0x00001FF0, // ..*********... + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 67 + 14, 26, + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x000003E8, // .....*****.*.. + 0x00000E78, // ...***..****.. + 0x00001818, // ..**......**.. + 0x00001818, // ..**......**.. + 0x00003008, // .**........*.. + 0x00003000, // .**........... + 0x00003000, // .**........... + 0x00003000, // .**........... + 0x00003000, // .**........... + 0x00003000, // .**........... + 0x00003000, // .**........... + 0x00003000, // .**........... + 0x00001808, // ..**.......*.. + 0x00001818, // ..**......**.. + 0x00000E70, // ...***..***... + 0x000003C0, // .....****..... + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 68 + 14, 26, + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00003F80, // .*******...... + 0x000018E0, // ..**...***.... + 0x00001830, // ..**.....**... + 0x00001818, // ..**......**.. + 0x00001818, // ..**......**.. + 0x0000180C, // ..**.......**. + 0x0000180C, // ..**.......**. + 0x0000180C, // ..**.......**. + 0x0000180C, // ..**.......**. + 0x0000180C, // ..**.......**. + 0x0000180C, // ..**.......**. + 0x00001818, // ..**......**.. + 0x00001818, // ..**......**.. + 0x00001830, // ..**.....**... + 0x000018E0, // ..**...***.... + 0x00003F80, // .*******...... + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 69 + 14, 26, + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00003FF8, // .***********.. + 0x00001818, // ..**......**.. + 0x00001808, // ..**.......*.. + 0x00001808, // ..**.......*.. + 0x00001800, // ..**.......... + 0x00001880, // ..**...*...... + 0x00001880, // ..**...*...... + 0x00001F80, // ..******...... + 0x00001880, // ..**...*...... + 0x00001880, // ..**...*...... + 0x00001800, // ..**.......... + 0x00001800, // ..**.......... + 0x00001808, // ..**.......*.. + 0x00001808, // ..**.......*.. + 0x00001818, // ..**......**.. + 0x00003FF8, // .***********.. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 70 + 14, 26, + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00003FF8, // .***********.. + 0x00001818, // ..**......**.. + 0x00001808, // ..**.......*.. + 0x00001808, // ..**.......*.. + 0x00001800, // ..**.......... + 0x00001880, // ..**...*...... + 0x00001880, // ..**...*...... + 0x00001F80, // ..******...... + 0x00001880, // ..**...*...... + 0x00001880, // ..**...*...... + 0x00001800, // ..**.......... + 0x00001800, // ..**.......... + 0x00001800, // ..**.......... + 0x00001800, // ..**.......... + 0x00001800, // ..**.......... + 0x00003E00, // .*****........ + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 71 + 14, 26, + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x000003E8, // .....*****.*.. + 0x00000E78, // ...***..****.. + 0x00001818, // ..**......**.. + 0x00001818, // ..**......**.. + 0x00003008, // .**........*.. + 0x00003000, // .**........... + 0x00003000, // .**........... + 0x00003000, // .**........... + 0x00003000, // .**........... + 0x0000307C, // .**.....*****. + 0x00003018, // .**.......**.. + 0x00003018, // .**.......**.. + 0x00001818, // ..**......**.. + 0x00001818, // ..**......**.. + 0x00000E38, // ...***...***.. + 0x000003E0, // .....*****.... + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 72 + 14, 26, + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00003C3C, // .****....****. + 0x00001818, // ..**......**.. + 0x00001818, // ..**......**.. + 0x00001818, // ..**......**.. + 0x00001818, // ..**......**.. + 0x00001818, // ..**......**.. + 0x00001818, // ..**......**.. + 0x00001FF8, // ..**********.. + 0x00001818, // ..**......**.. + 0x00001818, // ..**......**.. + 0x00001818, // ..**......**.. + 0x00001818, // ..**......**.. + 0x00001818, // ..**......**.. + 0x00001818, // ..**......**.. + 0x00001818, // ..**......**.. + 0x00003C3C, // .****....****. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 73 + 14, 26, + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000FF0, // ...********... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000FF0, // ...********... + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 74 + 14, 26, + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x000003F8, // .....*******.. + 0x00000060, // ........**.... + 0x00000060, // ........**.... + 0x00000060, // ........**.... + 0x00000060, // ........**.... + 0x00000060, // ........**.... + 0x00000060, // ........**.... + 0x00000060, // ........**.... + 0x00000060, // ........**.... + 0x00000060, // ........**.... + 0x00000060, // ........**.... + 0x00000060, // ........**.... + 0x00003060, // .**.....**.... + 0x00003060, // .**.....**.... + 0x000018C0, // ..**...**..... + 0x00000F80, // ...*****...... + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 75 + 14, 26, + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00003C3C, // .****....****. + 0x00001818, // ..**......**.. + 0x00001830, // ..**.....**... + 0x00001860, // ..**....**.... + 0x000018C0, // ..**...**..... + 0x00001980, // ..**..**...... + 0x00001B00, // ..**.**....... + 0x00001F00, // ..*****....... + 0x00001D80, // ..***.**...... + 0x00001980, // ..**..**...... + 0x000018C0, // ..**...**..... + 0x00001860, // ..**....**.... + 0x00001860, // ..**....**.... + 0x00001830, // ..**.....**... + 0x00001818, // ..**......**.. + 0x00003C3C, // .****....****. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 76 + 14, 26, + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00003F00, // .******....... + 0x00000C00, // ...**......... + 0x00000C00, // ...**......... + 0x00000C00, // ...**......... + 0x00000C00, // ...**......... + 0x00000C00, // ...**......... + 0x00000C00, // ...**......... + 0x00000C00, // ...**......... + 0x00000C00, // ...**......... + 0x00000C00, // ...**......... + 0x00000C00, // ...**......... + 0x00000C08, // ...**......*.. + 0x00000C08, // ...**......*.. + 0x00000C08, // ...**......*.. + 0x00000C18, // ...**.....**.. + 0x00003FF8, // .***********.. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 77 + 14, 26, + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x0000381C, // .***......***. + 0x00001818, // ..**......**.. + 0x00001C38, // ..***....***.. + 0x00001C38, // ..***....***.. + 0x00001E78, // ..****..****.. + 0x00001A58, // ..**.*..*.**.. + 0x00001BD8, // ..**.****.**.. + 0x00001998, // ..**..**..**.. + 0x00001998, // ..**..**..**.. + 0x00001818, // ..**......**.. + 0x00001818, // ..**......**.. + 0x00001818, // ..**......**.. + 0x00001818, // ..**......**.. + 0x00001818, // ..**......**.. + 0x00001818, // ..**......**.. + 0x00003C3C, // .****....****. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 78 + 14, 26, + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x0000383C, // .***.....****. + 0x00001C18, // ..***.....**.. + 0x00001C18, // ..***.....**.. + 0x00001E18, // ..****....**.. + 0x00001A18, // ..**.*....**.. + 0x00001B18, // ..**.**...**.. + 0x00001918, // ..**..*...**.. + 0x00001998, // ..**..**..**.. + 0x00001898, // ..**...*..**.. + 0x000018D8, // ..**...**.**.. + 0x00001858, // ..**....*.**.. + 0x00001878, // ..**....****.. + 0x00001838, // ..**.....***.. + 0x00001838, // ..**.....***.. + 0x00001818, // ..**......**.. + 0x00003C18, // .****.....**.. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 79 + 14, 26, + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x000003C0, // .....****..... + 0x00000E70, // ...***..***... + 0x00001818, // ..**......**.. + 0x00001818, // ..**......**.. + 0x0000300C, // .**........**. + 0x0000300C, // .**........**. + 0x0000300C, // .**........**. + 0x0000300C, // .**........**. + 0x0000300C, // .**........**. + 0x0000300C, // .**........**. + 0x0000300C, // .**........**. + 0x0000300C, // .**........**. + 0x00001818, // ..**......**.. + 0x00001818, // ..**......**.. + 0x00000E70, // ...***..***... + 0x000003C0, // .....****..... + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 80 + 14, 26, + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00001FE0, // ..********.... + 0x00000C30, // ...**....**... + 0x00000C18, // ...**.....**.. + 0x00000C18, // ...**.....**.. + 0x00000C18, // ...**.....**.. + 0x00000C18, // ...**.....**.. + 0x00000C18, // ...**.....**.. + 0x00000C30, // ...**....**... + 0x00000FE0, // ...*******.... + 0x00000C00, // ...**......... + 0x00000C00, // ...**......... + 0x00000C00, // ...**......... + 0x00000C00, // ...**......... + 0x00000C00, // ...**......... + 0x00000C00, // ...**......... + 0x00001F00, // ..*****....... + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 81 + 14, 26, + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x000003C0, // .....****..... + 0x00000E70, // ...***..***... + 0x00001818, // ..**......**.. + 0x00001818, // ..**......**.. + 0x0000300C, // .**........**. + 0x0000300C, // .**........**. + 0x0000300C, // .**........**. + 0x0000300C, // .**........**. + 0x0000300C, // .**........**. + 0x0000300C, // .**........**. + 0x0000300C, // .**........**. + 0x0000300C, // .**........**. + 0x00001818, // ..**......**.. + 0x00001818, // ..**......**.. + 0x00000E70, // ...***..***... + 0x000003C0, // .....****..... + 0x000000C0, // .......**..... + 0x00000060, // ........**.... + 0x00000030, // .........**... + 0x0000001C, // ..........***. + 0x00000008, // ...........*.. + 0x00000000, // .............. + }, + { // 82 + 14, 26, + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00001FE0, // ..********.... + 0x00000C30, // ...**....**... + 0x00000C18, // ...**.....**.. + 0x00000C18, // ...**.....**.. + 0x00000C18, // ...**.....**.. + 0x00000C18, // ...**.....**.. + 0x00000C18, // ...**.....**.. + 0x00000C30, // ...**....**... + 0x00000FE0, // ...*******.... + 0x00000CC0, // ...**..**..... + 0x00000C60, // ...**...**.... + 0x00000C60, // ...**...**.... + 0x00000C30, // ...**....**... + 0x00000C30, // ...**....**... + 0x00000C18, // ...**.....**.. + 0x00001F1C, // ..*****...***. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 83 + 14, 26, + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x000007E8, // ....******.*.. + 0x00000C38, // ...**....***.. + 0x00001818, // ..**......**.. + 0x00001808, // ..**.......*.. + 0x00001808, // ..**.......*.. + 0x00000C00, // ...**......... + 0x00000F00, // ...****....... + 0x000003C0, // .....****..... + 0x000000F0, // .......****... + 0x00000030, // .........**... + 0x00000018, // ..........**.. + 0x00001018, // ..*.......**.. + 0x00001018, // ..*.......**.. + 0x00001818, // ..**......**.. + 0x00001C30, // ..***....**... + 0x000017E0, // ..*.******.... + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 84 + 14, 26, + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00003FFC, // .************. + 0x0000318C, // .**...**...**. + 0x00002184, // .*....**....*. + 0x00002184, // .*....**....*. + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x000007E0, // ....******.... + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 85 + 14, 26, + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00003C3C, // .****....****. + 0x00001818, // ..**......**.. + 0x00001818, // ..**......**.. + 0x00001818, // ..**......**.. + 0x00001818, // ..**......**.. + 0x00001818, // ..**......**.. + 0x00001818, // ..**......**.. + 0x00001818, // ..**......**.. + 0x00001818, // ..**......**.. + 0x00001818, // ..**......**.. + 0x00001818, // ..**......**.. + 0x00001818, // ..**......**.. + 0x00001818, // ..**......**.. + 0x00001818, // ..**......**.. + 0x00000C30, // ...**....**... + 0x000007E0, // ....******.... + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 86 + 14, 26, + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00003C1E, // .****.....**** + 0x0000180C, // ..**.......**. + 0x0000180C, // ..**.......**. + 0x00000808, // ...*.......*.. + 0x00000C18, // ...**.....**.. + 0x00000C18, // ...**.....**.. + 0x00000410, // ....*.....*... + 0x00000630, // ....**...**... + 0x00000630, // ....**...**... + 0x00000220, // .....*...*.... + 0x00000360, // .....**.**.... + 0x00000360, // .....**.**.... + 0x00000140, // ......*.*..... + 0x000001C0, // ......***..... + 0x000001C0, // ......***..... + 0x00000080, // .......*...... + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 87 + 14, 26, + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00003E3E, // .*****...***** + 0x0000180C, // ..**.......**. + 0x0000180C, // ..**.......**. + 0x0000180C, // ..**.......**. + 0x0000180C, // ..**.......**. + 0x0000188C, // ..**...*...**. + 0x00000888, // ...*...*...*.. + 0x00000DD8, // ...**.***.**.. + 0x00000DD8, // ...**.***.**.. + 0x00000D58, // ...**.*.*.**.. + 0x00000D58, // ...**.*.*.**.. + 0x00000F78, // ...****.****.. + 0x00000630, // ....**...**... + 0x00000630, // ....**...**... + 0x00000630, // ....**...**... + 0x00000630, // ....**...**... + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 88 + 14, 26, + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00003E3E, // .*****...***** + 0x0000180C, // ..**.......**. + 0x00000C18, // ...**.....**.. + 0x00000630, // ....**...**... + 0x00000630, // ....**...**... + 0x00000360, // .....**.**.... + 0x000001C0, // ......***..... + 0x00000080, // .......*...... + 0x000001C0, // ......***..... + 0x00000360, // .....**.**.... + 0x00000630, // ....**...**... + 0x00000630, // ....**...**... + 0x00000C18, // ...**.....**.. + 0x00000C18, // ...**.....**.. + 0x0000180C, // ..**.......**. + 0x00003E3E, // .*****...***** + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 89 + 14, 26, + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00003C3C, // .****....****. + 0x00001818, // ..**......**.. + 0x00001818, // ..**......**.. + 0x00000C30, // ...**....**... + 0x00000C30, // ...**....**... + 0x00000660, // ....**..**.... + 0x00000660, // ....**..**.... + 0x000003C0, // .....****..... + 0x000003C0, // .....****..... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x000007E0, // ....******.... + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 90 + 14, 26, + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00001FF8, // ..**********.. + 0x00001818, // ..**......**.. + 0x00001030, // ..*......**... + 0x00001030, // ..*......**... + 0x00000060, // ........**.... + 0x000000C0, // .......**..... + 0x000000C0, // .......**..... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000300, // .....**....... + 0x00000300, // .....**....... + 0x00000600, // ....**........ + 0x00000C08, // ...**......*.. + 0x00000C08, // ...**......*.. + 0x00001818, // ..**......**.. + 0x00001FF8, // ..**********.. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 91 + 14, 26, + 0x00000000, // .............. + 0x000003E0, // .....*****.... + 0x00000300, // .....**....... + 0x00000300, // .....**....... + 0x00000300, // .....**....... + 0x00000300, // .....**....... + 0x00000300, // .....**....... + 0x00000300, // .....**....... + 0x00000300, // .....**....... + 0x00000300, // .....**....... + 0x00000300, // .....**....... + 0x00000300, // .....**....... + 0x00000300, // .....**....... + 0x00000300, // .....**....... + 0x00000300, // .....**....... + 0x00000300, // .....**....... + 0x00000300, // .....**....... + 0x00000300, // .....**....... + 0x00000300, // .....**....... + 0x00000300, // .....**....... + 0x00000300, // .....**....... + 0x00000300, // .....**....... + 0x000003E0, // .....*****.... + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 92 + 14, 26, + 0x00000000, // .............. + 0x00003000, // .**........... + 0x00003000, // .**........... + 0x00001800, // ..**.......... + 0x00001800, // ..**.......... + 0x00000C00, // ...**......... + 0x00000C00, // ...**......... + 0x00000600, // ....**........ + 0x00000600, // ....**........ + 0x00000300, // .....**....... + 0x00000300, // .....**....... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x000000C0, // .......**..... + 0x000000C0, // .......**..... + 0x00000060, // ........**.... + 0x00000060, // ........**.... + 0x00000030, // .........**... + 0x00000030, // .........**... + 0x00000018, // ..........**.. + 0x00000018, // ..........**.. + 0x0000000C, // ...........**. + 0x0000000C, // ...........**. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 93 + 14, 26, + 0x00000000, // .............. + 0x000007C0, // ....*****..... + 0x000000C0, // .......**..... + 0x000000C0, // .......**..... + 0x000000C0, // .......**..... + 0x000000C0, // .......**..... + 0x000000C0, // .......**..... + 0x000000C0, // .......**..... + 0x000000C0, // .......**..... + 0x000000C0, // .......**..... + 0x000000C0, // .......**..... + 0x000000C0, // .......**..... + 0x000000C0, // .......**..... + 0x000000C0, // .......**..... + 0x000000C0, // .......**..... + 0x000000C0, // .......**..... + 0x000000C0, // .......**..... + 0x000000C0, // .......**..... + 0x000000C0, // .......**..... + 0x000000C0, // .......**..... + 0x000000C0, // .......**..... + 0x000000C0, // .......**..... + 0x000007C0, // ....*****..... + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 94 + 14, 26, + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000180, // ......**...... + 0x000003C0, // .....****..... + 0x00000660, // ....**..**.... + 0x00000C30, // ...**....**... + 0x00001818, // ..**......**.. + 0x00001008, // ..*........*.. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 95 + 14, 26, + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00007FFE, // ************** + 0x00007FFE, // ************** + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 96 + 14, 26, + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x000000C0, // .......**..... + 0x00000180, // ......**...... + 0x00000300, // .....**....... + 0x00000700, // ....***....... + 0x00000780, // ....****...... + 0x00000780, // ....****...... + 0x00000300, // .....**....... + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 97 + 14, 26, + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x000007E0, // ....******.... + 0x00001C70, // ..***...***... + 0x00001830, // ..**.....**... + 0x00000030, // .........**... + 0x000007F0, // ....*******... + 0x00001C30, // ..***....**... + 0x00003030, // .**......**... + 0x00003070, // .**.....***... + 0x000039BC, // .***..**.****. + 0x00001F18, // ..*****...**.. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 98 + 14, 26, + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00001800, // ..**.......... + 0x00003800, // .***.......... + 0x00001800, // ..**.......... + 0x00001800, // ..**.......... + 0x00001800, // ..**.......... + 0x00001800, // ..**.......... + 0x00001BC0, // ..**.****..... + 0x00001C70, // ..***...***... + 0x00001830, // ..**.....**... + 0x00001818, // ..**......**.. + 0x00001818, // ..**......**.. + 0x00001818, // ..**......**.. + 0x00001818, // ..**......**.. + 0x00001830, // ..**.....**... + 0x00001C70, // ..***...***... + 0x00001BC0, // ..**.****..... + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 99 + 14, 26, + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x000007F0, // ....*******... + 0x00001C70, // ..***...***... + 0x00001830, // ..**.....**... + 0x00003000, // .**........... + 0x00003000, // .**........... + 0x00003000, // .**........... + 0x00003000, // .**........... + 0x00001830, // ..**.....**... + 0x00001C70, // ..***...***... + 0x000007C0, // ....*****..... + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 100 + 14, 26, + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000030, // .........**... + 0x00000070, // ........***... + 0x00000030, // .........**... + 0x00000030, // .........**... + 0x00000030, // .........**... + 0x00000030, // .........**... + 0x000007B0, // ....****.**... + 0x00001C70, // ..***...***... + 0x00001830, // ..**.....**... + 0x00003030, // .**......**... + 0x00003030, // .**......**... + 0x00003030, // .**......**... + 0x00003030, // .**......**... + 0x00001830, // ..**.....**... + 0x00001C7C, // ..***...*****. + 0x00000798, // ....****..**.. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 101 + 14, 26, + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x000007C0, // ....*****..... + 0x00001C70, // ..***...***... + 0x00001830, // ..**.....**... + 0x00003018, // .**.......**.. + 0x00003FF8, // .***********.. + 0x00003000, // .**........... + 0x00003000, // .**........... + 0x00001818, // ..**......**.. + 0x00001C38, // ..***....***.. + 0x000007E0, // ....******.... + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 102 + 14, 26, + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x000000F8, // .......*****.. + 0x00000198, // ......**..**.. + 0x00000300, // .....**....... + 0x00000300, // .....**....... + 0x00000300, // .....**....... + 0x00000300, // .....**....... + 0x00001FF0, // ..*********... + 0x00000300, // .....**....... + 0x00000300, // .....**....... + 0x00000300, // .....**....... + 0x00000300, // .....**....... + 0x00000300, // .....**....... + 0x00000300, // .....**....... + 0x00000300, // .....**....... + 0x00000300, // .....**....... + 0x00001FF0, // ..*********... + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 103 + 14, 26, + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000F80, // ...*****...... + 0x000018F8, // ..**...*****.. + 0x00003060, // .**.....**.... + 0x00003060, // .**.....**.... + 0x00003060, // .**.....**.... + 0x000018C0, // ..**...**..... + 0x00000F80, // ...*****...... + 0x00001800, // ..**.......... + 0x00000FE0, // ...*******.... + 0x00001830, // ..**.....**... + 0x00003018, // .**.......**.. + 0x00003018, // .**.......**.. + 0x00003018, // .**.......**.. + 0x00001C70, // ..***...***... + 0x000007C0, // ....*****..... + 0x00000000, // .............. + }, + { // 104 + 14, 26, + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00001800, // ..**.......... + 0x00003800, // .***.......... + 0x00001800, // ..**.......... + 0x00001800, // ..**.......... + 0x00001800, // ..**.......... + 0x00001800, // ..**.......... + 0x00001BE0, // ..**.*****.... + 0x00001C70, // ..***...***... + 0x00001830, // ..**.....**... + 0x00001830, // ..**.....**... + 0x00001830, // ..**.....**... + 0x00001830, // ..**.....**... + 0x00001830, // ..**.....**... + 0x00001830, // ..**.....**... + 0x00001830, // ..**.....**... + 0x00003C78, // .****...****.. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 105 + 14, 26, + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000180, // ......**...... + 0x000003C0, // .....****..... + 0x00000180, // ......**...... + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000180, // ......**...... + 0x00001F80, // ..******...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00001FF8, // ..**********.. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 106 + 14, 26, + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x000000C0, // .......**..... + 0x000001E0, // ......****.... + 0x000000C0, // .......**..... + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000060, // ........**.... + 0x000007E0, // ....******.... + 0x00000060, // ........**.... + 0x00000060, // ........**.... + 0x00000060, // ........**.... + 0x00000060, // ........**.... + 0x00000060, // ........**.... + 0x00000060, // ........**.... + 0x00000060, // ........**.... + 0x00000060, // ........**.... + 0x00000060, // ........**.... + 0x00000060, // ........**.... + 0x00003060, // .**.....**.... + 0x000038C0, // .***...**..... + 0x00000F80, // ...*****...... + 0x00000000, // .............. + }, + { // 107 + 14, 26, + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00001800, // ..**.......... + 0x00003800, // .***.......... + 0x00001800, // ..**.......... + 0x00001800, // ..**.......... + 0x00001800, // ..**.......... + 0x00001800, // ..**.......... + 0x000018F8, // ..**...*****.. + 0x00001860, // ..**....**.... + 0x000018C0, // ..**...**..... + 0x00001980, // ..**..**...... + 0x00001B00, // ..**.**....... + 0x00001F80, // ..******...... + 0x000018C0, // ..**...**..... + 0x00001860, // ..**....**.... + 0x00001834, // ..**.....**.*. + 0x00003E18, // .*****....**.. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 108 + 14, 26, + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000180, // ......**...... + 0x00000F80, // ...*****...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000FF0, // ...********... + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 109 + 14, 26, + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00003778, // .**.***.****.. + 0x000079CC, // ****..***..**. + 0x0000318C, // .**...**...**. + 0x0000318C, // .**...**...**. + 0x0000318C, // .**...**...**. + 0x0000318C, // .**...**...**. + 0x0000318C, // .**...**...**. + 0x0000318C, // .**...**...**. + 0x0000318C, // .**...**...**. + 0x00007BDE, // ****.****.**** + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 110 + 14, 26, + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00001BE0, // ..**.*****.... + 0x00003C70, // .****...***... + 0x00001830, // ..**.....**... + 0x00001830, // ..**.....**... + 0x00001830, // ..**.....**... + 0x00001830, // ..**.....**... + 0x00001830, // ..**.....**... + 0x00001830, // ..**.....**... + 0x00001830, // ..**.....**... + 0x00003C78, // .****...****.. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 111 + 14, 26, + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x000007C0, // ....*****..... + 0x00001C70, // ..***...***... + 0x00001830, // ..**.....**... + 0x00003018, // .**.......**.. + 0x00003018, // .**.......**.. + 0x00003018, // .**.......**.. + 0x00003018, // .**.......**.. + 0x00001830, // ..**.....**... + 0x00001C70, // ..***...***... + 0x000007C0, // ....*****..... + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 112 + 14, 26, + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00001BC0, // ..**.****..... + 0x00003C70, // .****...***... + 0x00001830, // ..**.....**... + 0x00001818, // ..**......**.. + 0x00001818, // ..**......**.. + 0x00001818, // ..**......**.. + 0x00001818, // ..**......**.. + 0x00001830, // ..**.....**... + 0x00001C70, // ..***...***... + 0x00001BC0, // ..**.****..... + 0x00001800, // ..**.......... + 0x00001800, // ..**.......... + 0x00001800, // ..**.......... + 0x00001800, // ..**.......... + 0x00003E00, // .*****........ + 0x00000000, // .............. + }, + { // 113 + 14, 26, + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000790, // ....****..*... + 0x00001C70, // ..***...***... + 0x00001830, // ..**.....**... + 0x00003030, // .**......**... + 0x00003030, // .**......**... + 0x00003030, // .**......**... + 0x00003030, // .**......**... + 0x00001830, // ..**.....**... + 0x00001C70, // ..***...***... + 0x000007B0, // ....****.**... + 0x00000030, // .........**... + 0x00000030, // .........**... + 0x00000030, // .........**... + 0x00000030, // .........**... + 0x000000F8, // .......*****.. + 0x00000000, // .............. + }, + { // 114 + 14, 26, + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000670, // ....**..***... + 0x00001EB8, // ..****.*.***.. + 0x00000730, // ....***..**... + 0x00000600, // ....**........ + 0x00000600, // ....**........ + 0x00000600, // ....**........ + 0x00000600, // ....**........ + 0x00000600, // ....**........ + 0x00000600, // ....**........ + 0x00001FC0, // ..*******..... + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 115 + 14, 26, + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x000007E0, // ....******.... + 0x00001C78, // ..***...****.. + 0x00001818, // ..**......**.. + 0x00001C00, // ..***......... + 0x00000F80, // ...*****...... + 0x000001F0, // ......*****... + 0x00000038, // .........***.. + 0x00001818, // ..**......**.. + 0x00001E38, // ..****...***.. + 0x000007E0, // ....******.... + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 116 + 14, 26, + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000600, // ....**........ + 0x00000600, // ....**........ + 0x00000600, // ....**........ + 0x00000600, // ....**........ + 0x00003FF0, // .**********... + 0x00000600, // ....**........ + 0x00000600, // ....**........ + 0x00000600, // ....**........ + 0x00000600, // ....**........ + 0x00000600, // ....**........ + 0x00000600, // ....**........ + 0x0000060C, // ....**.....**. + 0x00000738, // ....***..***.. + 0x000003E0, // .....*****.... + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 117 + 14, 26, + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00001830, // ..**.....**... + 0x00003870, // .***....***... + 0x00001830, // ..**.....**... + 0x00001830, // ..**.....**... + 0x00001830, // ..**.....**... + 0x00001830, // ..**.....**... + 0x00001830, // ..**.....**... + 0x00001830, // ..**.....**... + 0x00001C7C, // ..***...*****. + 0x00000F98, // ...*****..**.. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 118 + 14, 26, + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00003C78, // .****...****.. + 0x00001830, // ..**.....**... + 0x00001830, // ..**.....**... + 0x00000C60, // ...**...**.... + 0x00000C60, // ...**...**.... + 0x000006C0, // ....**.**..... + 0x000006C0, // ....**.**..... + 0x00000380, // .....***...... + 0x00000380, // .....***...... + 0x00000100, // ......*....... + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 119 + 14, 26, + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x0000783C, // ****.....****. + 0x00003018, // .**.......**.. + 0x00003018, // .**.......**.. + 0x00001110, // ..*...*...*... + 0x00001BB0, // ..**.***.**... + 0x00001BB0, // ..**.***.**... + 0x00000AA0, // ...*.*.*.*.... + 0x00000EE0, // ...***.***.... + 0x00000EE0, // ...***.***.... + 0x00000440, // ....*...*..... + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 120 + 14, 26, + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00003C78, // .****...****.. + 0x00001830, // ..**.....**... + 0x00000C60, // ...**...**.... + 0x000006C0, // ....**.**..... + 0x00000380, // .....***...... + 0x00000380, // .....***...... + 0x000006C0, // ....**.**..... + 0x00000C60, // ...**...**.... + 0x00001830, // ..**.....**... + 0x00003C78, // .****...****.. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 121 + 14, 26, + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00003C78, // .****...****.. + 0x00001830, // ..**.....**... + 0x00001830, // ..**.....**... + 0x00000C60, // ...**...**.... + 0x00000C60, // ...**...**.... + 0x00000660, // ....**..**.... + 0x000006C0, // ....**.**..... + 0x000002C0, // .....*.**..... + 0x00000380, // .....***...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000300, // .....**....... + 0x00003300, // .**..**....... + 0x00003600, // .**.**........ + 0x00001C00, // ..***......... + 0x00000000, // .............. + }, + { // 122 + 14, 26, + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00001FF0, // ..*********... + 0x00001830, // ..**.....**... + 0x00001060, // ..*.....**.... + 0x000000C0, // .......**..... + 0x00000180, // ......**...... + 0x00000300, // .....**....... + 0x00000600, // ....**........ + 0x00000C10, // ...**.....*... + 0x00001830, // ..**.....**... + 0x00001FF0, // ..*********... + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 123 + 14, 26, + 0x00000000, // .............. + 0x00000070, // ........***... + 0x000000C0, // .......**..... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000300, // .....**....... + 0x00000E00, // ...***........ + 0x00000300, // .....**....... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x000000C0, // .......**..... + 0x00000070, // ........***... + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 124 + 14, 26, + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 125 + 14, 26, + 0x00000000, // .............. + 0x00000E00, // ...***........ + 0x00000300, // .....**....... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x000000C0, // .......**..... + 0x00000070, // ........***... + 0x000000C0, // .......**..... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000300, // .....**....... + 0x00000E00, // ...***........ + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 126 + 14, 26, + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000F0C, // ...****....**. + 0x00001F9C, // ..******..***. + 0x000039F8, // .***..******.. + 0x000030F0, // .**....****... + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 127 + 14, 26, + 0x00005554, // *.*.*.*.*.*.*. + 0x00002AAA, // .*.*.*.*.*.*.* + 0x00005554, // *.*.*.*.*.*.*. + 0x00002AAA, // .*.*.*.*.*.*.* + 0x00005554, // *.*.*.*.*.*.*. + 0x00002AAA, // .*.*.*.*.*.*.* + 0x00005554, // *.*.*.*.*.*.*. + 0x00002AAA, // .*.*.*.*.*.*.* + 0x00005554, // *.*.*.*.*.*.*. + 0x00002AAA, // .*.*.*.*.*.*.* + 0x00005554, // *.*.*.*.*.*.*. + 0x00002AAA, // .*.*.*.*.*.*.* + 0x00005554, // *.*.*.*.*.*.*. + 0x00002AAA, // .*.*.*.*.*.*.* + 0x00005554, // *.*.*.*.*.*.*. + 0x00002AAA, // .*.*.*.*.*.*.* + 0x00005554, // *.*.*.*.*.*.*. + 0x00002AAA, // .*.*.*.*.*.*.* + 0x00005554, // *.*.*.*.*.*.*. + 0x00002AAA, // .*.*.*.*.*.*.* + 0x00005554, // *.*.*.*.*.*.*. + 0x00002AAA, // .*.*.*.*.*.*.* + 0x00005554, // *.*.*.*.*.*.*. + 0x00002AAA, // .*.*.*.*.*.*.* + 0x00005554, // *.*.*.*.*.*.*. + 0x00002AAA, // .*.*.*.*.*.*.* + }, + { // 128 + 0, 26, + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + }, + { // 129 + 0, 26, + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + }, + { // 130 + 0, 26, + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + }, + { // 131 + 0, 26, + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + }, + { // 132 + 0, 26, + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + }, + { // 133 + 0, 26, + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + }, + { // 134 + 0, 26, + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + }, + { // 135 + 0, 26, + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + }, + { // 136 + 0, 26, + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + }, + { // 137 + 0, 26, + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + }, + { // 138 + 0, 26, + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + }, + { // 139 + 0, 26, + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + }, + { // 140 + 0, 26, + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + }, + { // 141 + 0, 26, + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + }, + { // 142 + 0, 26, + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + }, + { // 143 + 0, 26, + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + }, + { // 144 + 0, 26, + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + }, + { // 145 + 0, 26, + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + }, + { // 146 + 0, 26, + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + }, + { // 147 + 0, 26, + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + }, + { // 148 + 0, 26, + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + }, + { // 149 + 0, 26, + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + }, + { // 150 + 0, 26, + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + }, + { // 151 + 0, 26, + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + }, + { // 152 + 0, 26, + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + }, + { // 153 + 0, 26, + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + }, + { // 154 + 0, 26, + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + }, + { // 155 + 0, 26, + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + }, + { // 156 + 0, 26, + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + }, + { // 157 + 0, 26, + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + }, + { // 158 + 0, 26, + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + }, + { // 159 + 0, 26, + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + }, + { // 160 + 14, 26, + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 161 + 14, 26, + 0x00000000, // .............. + 0x000000E0, // .......***.... + 0x000000E0, // .......***.... + 0x000000E0, // .......***.... + 0x00000080, // .......*...... + 0x000000C0, // .......**..... + 0x00000060, // ........**.... + 0x00000030, // .........**... + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 162 + 14, 26, + 0x00000000, // .............. + 0x000001C0, // ......***..... + 0x000001C0, // ......***..... + 0x000001C0, // ......***..... + 0x00000040, // ........*..... + 0x000000C0, // .......**..... + 0x00000180, // ......**...... + 0x00000300, // .....**....... + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 163 + 14, 26, + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x000003E0, // .....*****.... + 0x00000670, // ....**..***... + 0x00000C30, // ...**....**... + 0x00000C00, // ...**......... + 0x00000C00, // ...**......... + 0x00000C00, // ...**......... + 0x00000C00, // ...**......... + 0x00003FC0, // .********..... + 0x00000C00, // ...**......... + 0x00000C00, // ...**......... + 0x00000C00, // ...**......... + 0x00000C00, // ...**......... + 0x00000C00, // ...**......... + 0x00000E00, // ...***........ + 0x00001F98, // ..******..**.. + 0x000030F0, // .**....****... + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 164 + 0, 26, + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + }, + { // 165 + 0, 26, + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + }, + { // 166 + 14, 26, + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 167 + 14, 26, + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x000007E0, // ....******.... + 0x00000E38, // ...***...***.. + 0x00001C18, // ..***.....**.. + 0x00001C18, // ..***.....**.. + 0x00000E00, // ...***........ + 0x00000700, // ....***....... + 0x00000B80, // ...*.***...... + 0x000018E0, // ..**...***.... + 0x00001870, // ..**....***... + 0x00001C38, // ..***....***.. + 0x00000E18, // ...***....**.. + 0x00000718, // ....***...**.. + 0x000001D0, // ......***.*... + 0x000000E0, // .......***.... + 0x00000070, // ........***... + 0x00001838, // ..**.....***.. + 0x00001838, // ..**.....***.. + 0x00001C70, // ..***...***... + 0x000007E0, // ....******.... + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 168 + 14, 26, + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000C30, // ...**....**... + 0x00001E78, // ..****..****.. + 0x00000C30, // ...**....**... + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 169 + 14, 26, + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x000003F0, // .....******... + 0x00000618, // ....**....**.. + 0x00000CEC, // ...**..***.**. + 0x00000D2C, // ...**.*..*.**. + 0x00000D0C, // ...**.*....**. + 0x00000D0C, // ...**.*....**. + 0x00000D2C, // ...**.*..*.**. + 0x00000CCC, // ...**..**..**. + 0x00000618, // ....**....**.. + 0x000003F0, // .....******... + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 170 + 0, 26, + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + }, + { // 171 + 14, 26, + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000084, // .......*....*. + 0x0000018C, // ......**...**. + 0x00000318, // .....**...**.. + 0x00000630, // ....**...**... + 0x00000C60, // ...**...**.... + 0x000018C0, // ..**...**..... + 0x000018C0, // ..**...**..... + 0x00000C60, // ...**...**.... + 0x00000630, // ....**...**... + 0x00000318, // .....**...**.. + 0x0000018C, // ......**...**. + 0x00000084, // .......*....*. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 172 + 14, 26, + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00003FFC, // .************. + 0x00003FFC, // .************. + 0x0000000C, // ...........**. + 0x0000000C, // ...........**. + 0x0000000C, // ...........**. + 0x0000000C, // ...........**. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 173 + 14, 26, + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000FF0, // ...********... + 0x00000FF0, // ...********... + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 174 + 0, 26, + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + }, + { // 175 + 14, 26, + 0x00007FFE, // ************** + 0x00007FFE, // ************** + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 176 + 14, 26, + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x000003C0, // .....****..... + 0x00000660, // ....**..**.... + 0x00000C30, // ...**....**... + 0x00000C30, // ...**....**... + 0x00000C30, // ...**....**... + 0x00000C30, // ...**....**... + 0x00000660, // ....**..**.... + 0x000003C0, // .....****..... + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 177 + 14, 26, + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00003FFC, // .************. + 0x00003FFC, // .************. + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000000, // .............. + 0x00003FFC, // .************. + 0x00003FFC, // .************. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 178 + 14, 26, + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x000007C0, // ....*****..... + 0x00000C60, // ...**...**.... + 0x00000C60, // ...**...**.... + 0x00000060, // ........**.... + 0x000000C0, // .......**..... + 0x00000180, // ......**...... + 0x00000300, // .....**....... + 0x00000600, // ....**........ + 0x00000C20, // ...**....*.... + 0x00000FE0, // ...*******.... + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 179 + 14, 26, + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x000007C0, // ....*****..... + 0x00000C60, // ...**...**.... + 0x00000C60, // ...**...**.... + 0x00000060, // ........**.... + 0x000001C0, // ......***..... + 0x00000060, // ........**.... + 0x00000060, // ........**.... + 0x00000C60, // ...**...**.... + 0x00000C60, // ...**...**.... + 0x000007C0, // ....*****..... + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 180 + 14, 26, + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000100, // ......*....... + 0x00000100, // ......*....... + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 181 + 14, 26, + 0x00000000, // .............. + 0x00000000, // .............. + 0x000000C0, // .......**..... + 0x000000C0, // .......**..... + 0x00000080, // .......*...... + 0x00000C98, // ...**..*..**.. + 0x00001E3C, // ..****...****. + 0x00000C18, // ...**.....**.. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 182 + 14, 26, + 0x00000000, // .............. + 0x00000600, // ....**........ + 0x00000600, // ....**........ + 0x00000400, // ....*......... + 0x00000580, // ....*.**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x000003C0, // .....****..... + 0x000003C0, // .....****..... + 0x000002C0, // .....*.**..... + 0x000006E0, // ....**.***.... + 0x00000660, // ....**..**.... + 0x00000460, // ....*...**.... + 0x00000C30, // ...**....**... + 0x00000FF0, // ...********... + 0x00000830, // ...*.....**... + 0x00000818, // ...*......**.. + 0x00001818, // ..**......**.. + 0x0000181C, // ..**......***. + 0x00003C3E, // .****....***** + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 183 + 14, 26, + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000180, // ......**...... + 0x000003C0, // .....****..... + 0x000003C0, // .....****..... + 0x00000180, // ......**...... + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 184 + 14, 26, + 0x00001800, // ..**.......... + 0x00001800, // ..**.......... + 0x00001000, // ..*........... + 0x00001000, // ..*........... + 0x00000FFE, // ...*********** + 0x00000606, // ....**......** + 0x00000602, // ....**.......* + 0x00000602, // ....**.......* + 0x00000600, // ....**........ + 0x00000620, // ....**...*.... + 0x00000620, // ....**...*.... + 0x000007E0, // ....******.... + 0x00000620, // ....**...*.... + 0x00000620, // ....**...*.... + 0x00000600, // ....**........ + 0x00000600, // ....**........ + 0x00000602, // ....**.......* + 0x00000602, // ....**.......* + 0x00000606, // ....**......** + 0x00000FFE, // ...*********** + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 185 + 14, 26, + 0x00003000, // .**........... + 0x00003000, // .**........... + 0x00002000, // .*............ + 0x00002000, // .*............ + 0x00001E1E, // ..****....**** + 0x00000C0C, // ...**......**. + 0x00000C0C, // ...**......**. + 0x00000C0C, // ...**......**. + 0x00000C0C, // ...**......**. + 0x00000C0C, // ...**......**. + 0x00000C0C, // ...**......**. + 0x00000FFC, // ...**********. + 0x00000C0C, // ...**......**. + 0x00000C0C, // ...**......**. + 0x00000C0C, // ...**......**. + 0x00000C0C, // ...**......**. + 0x00000C0C, // ...**......**. + 0x00000C0C, // ...**......**. + 0x00000C0C, // ...**......**. + 0x00001E1E, // ..****....**** + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 186 + 14, 26, + 0x00000000, // .............. + 0x00003000, // .**........... + 0x00003000, // .**........... + 0x00002000, // .*............ + 0x00002FF0, // .*.********... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000FF0, // ...********... + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 187 + 14, 26, + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00002100, // .*....*....... + 0x00003180, // .**...**...... + 0x000018C0, // ..**...**..... + 0x00000C60, // ...**...**.... + 0x00000630, // ....**...**... + 0x00000318, // .....**...**.. + 0x00000318, // .....**...**.. + 0x00000630, // ....**...**... + 0x00000C60, // ...**...**.... + 0x000018C0, // ..**...**..... + 0x00003180, // .**...**...... + 0x00002100, // .*....*....... + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 188 + 14, 26, + 0x00000000, // .............. + 0x00003000, // .**........... + 0x00003000, // .**........... + 0x00002000, // .*............ + 0x000023C0, // .*...****..... + 0x00000E70, // ...***..***... + 0x00001C18, // ..***.....**.. + 0x00001818, // ..**......**.. + 0x0000300C, // .**........**. + 0x0000300C, // .**........**. + 0x0000300C, // .**........**. + 0x0000300C, // .**........**. + 0x0000300C, // .**........**. + 0x0000300C, // .**........**. + 0x0000300C, // .**........**. + 0x0000300C, // .**........**. + 0x00001818, // ..**......**.. + 0x00001818, // ..**......**.. + 0x00000E70, // ...***..***... + 0x000003C0, // .....****..... + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 189 + 14, 26, + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000C00, // ...**......... + 0x00003C00, // .****......... + 0x00000C00, // ...**......... + 0x00000C00, // ...**......... + 0x00000C00, // ...**......... + 0x00000C00, // ...**......... + 0x00000C00, // ...**......... + 0x00000C00, // ...**......... + 0x00000C1C, // ...**.....***. + 0x00000C70, // ...**...***... + 0x000001C0, // ......***..... + 0x00000700, // ....***....... + 0x00001CF8, // ..***..*****.. + 0x0000718C, // ***...**...**. + 0x0000018C, // ......**...**. + 0x0000000C, // ...........**. + 0x00000018, // ..........**.. + 0x00000030, // .........**... + 0x00000060, // ........**.... + 0x000000C0, // .......**..... + 0x00000184, // ......**....*. + 0x000001FC, // ......*******. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 190 + 14, 26, + 0x00003000, // .**........... + 0x00003000, // .**........... + 0x00002000, // .*............ + 0x00002000, // .*............ + 0x00001818, // ..**......**.. + 0x00003C3C, // .****....****. + 0x00002664, // .*..**..**..*. + 0x00000660, // ....**..**.... + 0x000003C0, // .....****..... + 0x000003C0, // .....****..... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000FF0, // ...********... + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 191 + 14, 26, + 0x00001800, // ..**.......... + 0x00001800, // ..**.......... + 0x00001000, // ..*........... + 0x00001000, // ..*........... + 0x000003C0, // .....****..... + 0x00000E70, // ...***..***... + 0x00001818, // ..**......**.. + 0x00001818, // ..**......**.. + 0x0000300C, // .**........**. + 0x0000300C, // .**........**. + 0x0000300C, // .**........**. + 0x0000300C, // .**........**. + 0x0000300C, // .**........**. + 0x00001818, // ..**......**.. + 0x00001818, // ..**......**.. + 0x00000C30, // ...**....**... + 0x00000660, // ....**..**.... + 0x00002244, // .*...*..*...*. + 0x00001E78, // ..****..****.. + 0x00001E78, // ..****..****.. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 192 + 14, 26, + 0x00000000, // .............. + 0x000000C0, // .......**..... + 0x000000C0, // .......**..... + 0x00000080, // .......*...... + 0x00000080, // .......*...... + 0x00000C30, // ...**....**... + 0x00001E78, // ..****..****.. + 0x00000C30, // ...**....**... + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000700, // ....***....... + 0x00000980, // ...*..**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000190, // ......**..*... + 0x000000E0, // .......***.... + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 193 + 14, 26, + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x000003C0, // .....****..... + 0x000003C0, // .....****..... + 0x000002C0, // .....*.**..... + 0x000006E0, // ....**.***.... + 0x00000660, // ....**..**.... + 0x00000460, // ....*...**.... + 0x00000C30, // ...**....**... + 0x00000FF0, // ...********... + 0x00000830, // ...*.....**... + 0x00000818, // ...*......**.. + 0x00001818, // ..**......**.. + 0x0000181C, // ..**......***. + 0x00003C3E, // .****....***** + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 194 + 14, 26, + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00001FE0, // ..********.... + 0x00000C30, // ...**....**... + 0x00000C18, // ...**.....**.. + 0x00000C18, // ...**.....**.. + 0x00000C18, // ...**.....**.. + 0x00000C18, // ...**.....**.. + 0x00000C30, // ...**....**... + 0x00000FE0, // ...*******.... + 0x00000C30, // ...**....**... + 0x00000C18, // ...**.....**.. + 0x00000C0C, // ...**......**. + 0x00000C0C, // ...**......**. + 0x00000C0C, // ...**......**. + 0x00000C0C, // ...**......**. + 0x00000C18, // ...**.....**.. + 0x00001FF0, // ..*********... + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 195 + 14, 26, + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00001FFC, // ..***********. + 0x00000C0C, // ...**......**. + 0x00000C04, // ...**.......*. + 0x00000C04, // ...**.......*. + 0x00000C00, // ...**......... + 0x00000C00, // ...**......... + 0x00000C00, // ...**......... + 0x00000C00, // ...**......... + 0x00000C00, // ...**......... + 0x00000C00, // ...**......... + 0x00000C00, // ...**......... + 0x00000C00, // ...**......... + 0x00000C00, // ...**......... + 0x00000C00, // ...**......... + 0x00000C00, // ...**......... + 0x00001F80, // ..******...... + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 196 + 14, 26, + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x000003C0, // .....****..... + 0x000003C0, // .....****..... + 0x000002C0, // .....*.**..... + 0x00000660, // ....**..**.... + 0x00000660, // ....**..**.... + 0x00000460, // ....*...**.... + 0x00000430, // ....*....**... + 0x00000C30, // ...**....**... + 0x00000C30, // ...**....**... + 0x00000818, // ...*......**.. + 0x00001818, // ..**......**.. + 0x00001FFC, // ..***********. + 0x00001FFC, // ..***********. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 197 + 14, 26, + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00001FFC, // ..***********. + 0x00000C0C, // ...**......**. + 0x00000C04, // ...**.......*. + 0x00000C04, // ...**.......*. + 0x00000C00, // ...**......... + 0x00000C40, // ...**...*..... + 0x00000C40, // ...**...*..... + 0x00000FC0, // ...******..... + 0x00000C40, // ...**...*..... + 0x00000C40, // ...**...*..... + 0x00000C00, // ...**......... + 0x00000C00, // ...**......... + 0x00000C04, // ...**.......*. + 0x00000C04, // ...**.......*. + 0x00000C0C, // ...**......**. + 0x00001FFC, // ..***********. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 198 + 14, 26, + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00001FF8, // ..**********.. + 0x00001818, // ..**......**.. + 0x00001030, // ..*......**... + 0x00001030, // ..*......**... + 0x00000060, // ........**.... + 0x000000C0, // .......**..... + 0x000000C0, // .......**..... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000300, // .....**....... + 0x00000300, // .....**....... + 0x00000600, // ....**........ + 0x00000C08, // ...**......*.. + 0x00000C08, // ...**......*.. + 0x00001818, // ..**......**.. + 0x00001FF8, // ..**********.. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 199 + 14, 26, + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00003C3C, // .****....****. + 0x00001818, // ..**......**.. + 0x00001818, // ..**......**.. + 0x00001818, // ..**......**.. + 0x00001818, // ..**......**.. + 0x00001818, // ..**......**.. + 0x00001818, // ..**......**.. + 0x00001FF8, // ..**********.. + 0x00001818, // ..**......**.. + 0x00001818, // ..**......**.. + 0x00001818, // ..**......**.. + 0x00001818, // ..**......**.. + 0x00001818, // ..**......**.. + 0x00001818, // ..**......**.. + 0x00001818, // ..**......**.. + 0x00003C3C, // .****....****. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 200 + 14, 26, + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x000003C0, // .....****..... + 0x00000E70, // ...***..***... + 0x00001C18, // ..***.....**.. + 0x00001818, // ..**......**.. + 0x0000300C, // .**........**. + 0x0000300C, // .**........**. + 0x0000342C, // .**.*....*.**. + 0x000037EC, // .**.******.**. + 0x000037EC, // .**.******.**. + 0x0000342C, // .**.*....*.**. + 0x0000300C, // .**........**. + 0x0000300C, // .**........**. + 0x00001818, // ..**......**.. + 0x00001818, // ..**......**.. + 0x00000E70, // ...***..***... + 0x000003C0, // .....****..... + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 201 + 14, 26, + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000FF0, // ...********... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000FF0, // ...********... + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 202 + 14, 26, + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00003C3C, // .****....****. + 0x00001818, // ..**......**.. + 0x00001830, // ..**.....**... + 0x00001860, // ..**....**.... + 0x000018C0, // ..**...**..... + 0x00001980, // ..**..**...... + 0x00001B80, // ..**.***...... + 0x00001FC0, // ..*******..... + 0x00001FC0, // ..*******..... + 0x00001CE0, // ..***..***.... + 0x00001860, // ..**....**.... + 0x00001870, // ..**....***... + 0x00001830, // ..**.....**... + 0x00001838, // ..**.....***.. + 0x0000181C, // ..**......***. + 0x00003C3E, // .****....***** + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 203 + 14, 26, + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x000003C0, // .....****..... + 0x000003C0, // .....****..... + 0x000002C0, // .....*.**..... + 0x000006E0, // ....**.***.... + 0x00000660, // ....**..**.... + 0x00000660, // ....**..**.... + 0x00000C30, // ...**....**... + 0x00000C30, // ...**....**... + 0x00000C30, // ...**....**... + 0x00000818, // ...*......**.. + 0x00001818, // ..**......**.. + 0x0000181C, // ..**......***. + 0x00003C3E, // .****....***** + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 204 + 14, 26, + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x0000380E, // .***.......*** + 0x0000180C, // ..**.......**. + 0x0000180C, // ..**.......**. + 0x00001C1C, // ..***.....***. + 0x00001C1C, // ..***.....***. + 0x00001C1C, // ..***.....***. + 0x00001E3C, // ..****...****. + 0x0000162C, // ..*.**...*.**. + 0x0000162C, // ..*.**...*.**. + 0x0000176C, // ..*.***.**.**. + 0x0000134C, // ..*..**.*..**. + 0x0000134C, // ..*..**.*..**. + 0x000013CC, // ..*..****..**. + 0x0000118C, // ..*...**...**. + 0x0000118C, // ..*...**...**. + 0x0000399E, // .***..**..**** + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 205 + 14, 26, + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x0000383C, // .***.....****. + 0x00001C18, // ..***.....**.. + 0x00001C18, // ..***.....**.. + 0x00001E18, // ..****....**.. + 0x00001A18, // ..**.*....**.. + 0x00001B18, // ..**.**...**.. + 0x00001918, // ..**..*...**.. + 0x00001998, // ..**..**..**.. + 0x00001898, // ..**...*..**.. + 0x000018D8, // ..**...**.**.. + 0x00001858, // ..**....*.**.. + 0x00001878, // ..**....****.. + 0x00001838, // ..**.....***.. + 0x00001838, // ..**.....***.. + 0x00001818, // ..**......**.. + 0x00003C18, // .****.....**.. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 206 + 14, 26, + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00001008, // ..*........*.. + 0x00001FF8, // ..**********.. + 0x00001FF8, // ..**********.. + 0x00001008, // ..*........*.. + 0x00001008, // ..*........*.. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000420, // ....*....*.... + 0x000007E0, // ....******.... + 0x000007E0, // ....******.... + 0x00000420, // ....*....*.... + 0x00000000, // .............. + 0x00000000, // .............. + 0x00002004, // .*..........*. + 0x00002004, // .*..........*. + 0x00003FFC, // .************. + 0x00003FFC, // .************. + 0x00002004, // .*..........*. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 207 + 14, 26, + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x000003C0, // .....****..... + 0x00000E70, // ...***..***... + 0x00001818, // ..**......**.. + 0x00001818, // ..**......**.. + 0x0000300C, // .**........**. + 0x0000300C, // .**........**. + 0x0000300C, // .**........**. + 0x0000300C, // .**........**. + 0x0000300C, // .**........**. + 0x0000300C, // .**........**. + 0x0000300C, // .**........**. + 0x0000300C, // .**........**. + 0x00001818, // ..**......**.. + 0x00001818, // ..**......**.. + 0x00000E70, // ...***..***... + 0x000003C0, // .....****..... + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 208 + 14, 26, + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00003FFC, // .************. + 0x00001818, // ..**......**.. + 0x00001818, // ..**......**.. + 0x00001818, // ..**......**.. + 0x00001818, // ..**......**.. + 0x00001818, // ..**......**.. + 0x00001818, // ..**......**.. + 0x00001818, // ..**......**.. + 0x00001818, // ..**......**.. + 0x00001818, // ..**......**.. + 0x00001818, // ..**......**.. + 0x00001818, // ..**......**.. + 0x00001818, // ..**......**.. + 0x00001818, // ..**......**.. + 0x00001818, // ..**......**.. + 0x00003C3C, // .****....****. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 209 + 14, 26, + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00001FE0, // ..********.... + 0x00000C30, // ...**....**... + 0x00000C18, // ...**.....**.. + 0x00000C18, // ...**.....**.. + 0x00000C18, // ...**.....**.. + 0x00000C18, // ...**.....**.. + 0x00000C18, // ...**.....**.. + 0x00000C18, // ...**.....**.. + 0x00000C30, // ...**....**... + 0x00000FE0, // ...*******.... + 0x00000C00, // ...**......... + 0x00000C00, // ...**......... + 0x00000C00, // ...**......... + 0x00000C00, // ...**......... + 0x00000C00, // ...**......... + 0x00001F00, // ..*****....... + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 210 + 0, 26, + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + }, + { // 211 + 14, 26, + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00001FFC, // ..***********. + 0x0000180C, // ..**.......**. + 0x00001C04, // ..***.......*. + 0x00000C04, // ...**.......*. + 0x00000E00, // ...***........ + 0x00000600, // ....**........ + 0x00000700, // ....***....... + 0x00000380, // .....***...... + 0x00000300, // .....**....... + 0x00000200, // .....*........ + 0x00000600, // ....**........ + 0x00000400, // ....*......... + 0x00000C04, // ...**.......*. + 0x00000804, // ...*........*. + 0x0000180C, // ..**.......**. + 0x00001FFC, // ..***********. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 212 + 14, 26, + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00003FFC, // .************. + 0x0000318C, // .**...**...**. + 0x00002184, // .*....**....*. + 0x00002184, // .*....**....*. + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000FF0, // ...********... + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 213 + 14, 26, + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00001818, // ..**......**.. + 0x00003C3C, // .****....****. + 0x00002664, // .*..**..**..*. + 0x00000660, // ....**..**.... + 0x000003C0, // .....****..... + 0x000003C0, // .....****..... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000FF0, // ...********... + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 214 + 14, 26, + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x000003C0, // .....****..... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x000007E0, // ....******.... + 0x00001DB8, // ..***.**.***.. + 0x00001998, // ..**..**..**.. + 0x0000318C, // .**...**...**. + 0x0000318C, // .**...**...**. + 0x0000318C, // .**...**...**. + 0x0000318C, // .**...**...**. + 0x00001998, // ..**..**..**.. + 0x00001DB8, // ..***.**.***.. + 0x000007E0, // ....******.... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x000003C0, // .....****..... + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 215 + 14, 26, + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00003E3E, // .*****...***** + 0x00001C1C, // ..***.....***. + 0x00000C18, // ...**.....**.. + 0x00000E30, // ...***...**... + 0x00000730, // ....***..**... + 0x00000360, // .....**.**.... + 0x000003E0, // .....*****.... + 0x000001C0, // ......***..... + 0x000001C0, // ......***..... + 0x000003E0, // .....*****.... + 0x00000360, // .....**.**.... + 0x00000670, // ....**..***... + 0x00000638, // ....**...***.. + 0x00000C18, // ...**.....**.. + 0x00001C1C, // ..***.....***. + 0x00003E3E, // .*****...***** + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 216 + 14, 26, + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x000007E0, // ....******.... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x0000318C, // .**...**...**. + 0x00001998, // ..**..**..**.. + 0x00001998, // ..**..**..**.. + 0x00001998, // ..**..**..**.. + 0x00001998, // ..**..**..**.. + 0x00000DB0, // ...**.**.**... + 0x000007E0, // ....******.... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000FF0, // ...********... + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 217 + 14, 26, + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x000003C0, // .....****..... + 0x00000E70, // ...***..***... + 0x00001818, // ..**......**.. + 0x00001818, // ..**......**.. + 0x0000300C, // .**........**. + 0x0000300C, // .**........**. + 0x0000300C, // .**........**. + 0x0000300C, // .**........**. + 0x0000300C, // .**........**. + 0x00001818, // ..**......**.. + 0x00001818, // ..**......**.. + 0x00000C30, // ...**....**... + 0x00000660, // ....**..**.... + 0x00002244, // .*...*..*...*. + 0x00001E78, // ..****..****.. + 0x00001E78, // ..****..****.. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 218 + 14, 26, + 0x00000C30, // ...**....**... + 0x00001E78, // ..****..****.. + 0x00000C30, // ...**....**... + 0x00000000, // .............. + 0x00000FF0, // ...********... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000FF0, // ...********... + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 219 + 14, 26, + 0x00000C30, // ...**....**... + 0x00001E78, // ..****..****.. + 0x00000C30, // ...**....**... + 0x00000000, // .............. + 0x00001818, // ..**......**.. + 0x00003C3C, // .****....****. + 0x00002664, // .*..**..**..*. + 0x00000660, // ....**..**.... + 0x000003C0, // .....****..... + 0x000003C0, // .....****..... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000FF0, // ...********... + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 220 + 14, 26, + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000100, // ......*....... + 0x00000100, // ......*....... + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000704, // ....***.....*. + 0x00001D8C, // ..***.**...**. + 0x000018C8, // ..**...**..*.. + 0x000030D8, // .**....**.**.. + 0x00003070, // .**.....***... + 0x00003070, // .**.....***... + 0x00003060, // .**.....**.... + 0x000018E0, // ..**...***.... + 0x00001DB4, // ..***.**.**.*. + 0x00000718, // ....***...**.. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 221 + 14, 26, + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x000000C0, // .......**..... + 0x000000C0, // .......**..... + 0x00000080, // .......*...... + 0x00000080, // .......*...... + 0x00000000, // .............. + 0x00000000, // .............. + 0x000003E0, // .....*****.... + 0x00000630, // ....**...**... + 0x00000E30, // ...***...**... + 0x00000600, // ....**........ + 0x000003C0, // .....****..... + 0x00000600, // ....**........ + 0x00000C00, // ...**......... + 0x00000C10, // ...**.....*... + 0x00000630, // ....**...**... + 0x000003E0, // .....*****.... + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 222 + 14, 26, + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000060, // ........**.... + 0x00000060, // ........**.... + 0x00000040, // ........*..... + 0x00000040, // ........*..... + 0x00000000, // .............. + 0x00000000, // .............. + 0x00001DE0, // ..***.****.... + 0x00002730, // .*..***..**... + 0x00002618, // .*..**....**.. + 0x00000618, // ....**....**.. + 0x00000618, // ....**....**.. + 0x00000618, // ....**....**.. + 0x00000618, // ....**....**.. + 0x00000618, // ....**....**.. + 0x00000618, // ....**....**.. + 0x00000618, // ....**....**.. + 0x00000218, // .....*....**.. + 0x00000018, // ..........**.. + 0x00000018, // ..........**.. + 0x00000018, // ..........**.. + 0x00000008, // ...........*.. + 0x00000000, // .............. + }, + { // 223 + 14, 26, + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000100, // ......*....... + 0x00000100, // ......*....... + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000700, // ....***....... + 0x00000980, // ...*..**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000190, // ......**..*... + 0x000000E0, // .......***.... + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 224 + 14, 26, + 0x00000000, // .............. + 0x00000000, // .............. + 0x000000C0, // .......**..... + 0x000000C0, // .......**..... + 0x00000080, // .......*...... + 0x00000C98, // ...**..*..**.. + 0x00001E3C, // ..****...****. + 0x00000C18, // ...**.....**.. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000C30, // ...**....**... + 0x00001618, // ..*.**....**.. + 0x0000060C, // ....**.....**. + 0x0000060C, // ....**.....**. + 0x0000060C, // ....**.....**. + 0x0000060C, // ....**.....**. + 0x00000618, // ....**....**.. + 0x00000618, // ....**....**.. + 0x00000730, // ....***..**... + 0x000003E0, // .....*****.... + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 225 + 14, 26, + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000704, // ....***.....*. + 0x00001D8C, // ..***.**...**. + 0x000018C8, // ..**...**..*.. + 0x000030D8, // .**....**.**.. + 0x00003070, // .**.....***... + 0x00003070, // .**.....***... + 0x00003060, // .**.....**.... + 0x000018E0, // ..**...***.... + 0x00001DB4, // ..***.**.**.*. + 0x00000718, // ....***...**.. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 226 + 14, 26, + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x000007C0, // ....*****..... + 0x00000CE0, // ...**..***.... + 0x00001870, // ..**....***... + 0x00001830, // ..**.....**... + 0x00001830, // ..**.....**... + 0x00001830, // ..**.....**... + 0x00001860, // ..**....**.... + 0x00001BE0, // ..**.*****.... + 0x00001830, // ..**.....**... + 0x00001818, // ..**......**.. + 0x00001818, // ..**......**.. + 0x00001818, // ..**......**.. + 0x00001818, // ..**......**.. + 0x00001C18, // ..***.....**.. + 0x00001E30, // ..****...**... + 0x00001BE0, // ..**.*****.... + 0x00001800, // ..**.......... + 0x00001800, // ..**.......... + 0x00001800, // ..**.......... + 0x00001800, // ..**.......... + 0x00001000, // ..*........... + 0x00000000, // .............. + }, + { // 227 + 14, 26, + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000602, // ....**.......* + 0x00000F04, // ...****.....*. + 0x00001F8C, // ..******...**. + 0x00001198, // ..*...**..**.. + 0x00000090, // .......*..*... + 0x000000B0, // .......*.**... + 0x000000A0, // .......*.*.... + 0x000000E0, // .......***.... + 0x000000C0, // .......**..... + 0x000000C0, // .......**..... + 0x000001C0, // ......***..... + 0x00000380, // .....***...... + 0x00000380, // .....***...... + 0x00000380, // .....***...... + 0x00000100, // ......*....... + 0x00000000, // .............. + }, + { // 228 + 14, 26, + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x000003C0, // .....****..... + 0x00000660, // ....**..**.... + 0x00000630, // ....**...**... + 0x00000300, // .....**....... + 0x00000180, // ......**...... + 0x000000C0, // .......**..... + 0x000003E0, // .....*****.... + 0x00000E70, // ...***..***... + 0x00000C30, // ...**....**... + 0x00001818, // ..**......**.. + 0x00001818, // ..**......**.. + 0x00001818, // ..**......**.. + 0x00000C30, // ...**....**... + 0x00000E70, // ...***..***... + 0x000003C0, // .....****..... + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 229 + 14, 26, + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x000003E0, // .....*****.... + 0x00000630, // ....**...**... + 0x00000E30, // ...***...**... + 0x00000600, // ....**........ + 0x000003C0, // .....****..... + 0x00000600, // ....**........ + 0x00000C00, // ...**......... + 0x00000C10, // ...**.....*... + 0x00000630, // ....**...**... + 0x000003E0, // .....*****.... + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 230 + 14, 26, + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000600, // ....**........ + 0x00000600, // ....**........ + 0x00000338, // .....**..***.. + 0x000001F8, // ......******.. + 0x000003F0, // .....******... + 0x00000F00, // ...****....... + 0x00001C00, // ..***......... + 0x00001800, // ..**.......... + 0x00003800, // .***.......... + 0x00003000, // .**........... + 0x00003000, // .**........... + 0x00003000, // .**........... + 0x00003800, // .***.......... + 0x00001800, // ..**.......... + 0x00001C00, // ..***......... + 0x00000F00, // ...****....... + 0x000003C0, // .....****..... + 0x000000E0, // .......***.... + 0x00000030, // .........**... + 0x00000010, // ..........*... + 0x00000190, // ......**..*... + 0x000001B0, // ......**.**... + 0x000000E0, // .......***.... + 0x00000000, // .............. + }, + { // 231 + 14, 26, + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00001DE0, // ..***.****.... + 0x00002730, // .*..***..**... + 0x00002618, // .*..**....**.. + 0x00000618, // ....**....**.. + 0x00000618, // ....**....**.. + 0x00000618, // ....**....**.. + 0x00000618, // ....**....**.. + 0x00000618, // ....**....**.. + 0x00000618, // ....**....**.. + 0x00000618, // ....**....**.. + 0x00000218, // .....*....**.. + 0x00000018, // ..........**.. + 0x00000018, // ..........**.. + 0x00000018, // ..........**.. + 0x00000008, // ...........*.. + 0x00000000, // .............. + }, + { // 232 + 14, 26, + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x000003C0, // .....****..... + 0x00000660, // ....**..**.... + 0x00000C30, // ...**....**... + 0x00000C30, // ...**....**... + 0x00001818, // ..**......**.. + 0x00001818, // ..**......**.. + 0x00001818, // ..**......**.. + 0x00001FF8, // ..**********.. + 0x00001818, // ..**......**.. + 0x00001818, // ..**......**.. + 0x00001818, // ..**......**.. + 0x00001818, // ..**......**.. + 0x00000C30, // ...**....**... + 0x00000C30, // ...**....**... + 0x00000660, // ....**..**.... + 0x000003C0, // .....****..... + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 233 + 14, 26, + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000700, // ....***....... + 0x00000980, // ...*..**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000190, // ......**..*... + 0x000000E0, // .......***.... + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 234 + 14, 26, + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00001830, // ..**.....**... + 0x00003870, // .***....***... + 0x000018C0, // ..**...**..... + 0x00001980, // ..**..**...... + 0x00001B00, // ..**.**....... + 0x00001F80, // ..******...... + 0x000019C0, // ..**..***..... + 0x000018E0, // ..**...***.... + 0x00001874, // ..**....***.*. + 0x00003E38, // .*****...***.. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 235 + 14, 26, + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00001800, // ..**.......... + 0x00003C00, // .****......... + 0x00002C00, // .*.**......... + 0x00000600, // ....**........ + 0x00000600, // ....**........ + 0x00000300, // .....**....... + 0x00000300, // .....**....... + 0x00000380, // .....***...... + 0x00000780, // ....****...... + 0x00000680, // ....**.*...... + 0x00000CC0, // ...**..**..... + 0x00000CC0, // ...**..**..... + 0x00001860, // ..**....**.... + 0x00001864, // ..**....**..*. + 0x0000303C, // .**......****. + 0x00003018, // .**.......**.. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 236 + 14, 26, + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000810, // ...*......*... + 0x00001830, // ..**.....**... + 0x00001830, // ..**.....**... + 0x00001830, // ..**.....**... + 0x00001830, // ..**.....**... + 0x00001830, // ..**.....**... + 0x00001830, // ..**.....**... + 0x00001874, // ..**....***.*. + 0x00001CDC, // ..***..**.***. + 0x00001798, // ..*.****..**.. + 0x00001000, // ..*........... + 0x00001000, // ..*........... + 0x00001000, // ..*........... + 0x00001000, // ..*........... + 0x00001000, // ..*........... + 0x00000000, // .............. + }, + { // 237 + 14, 26, + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00001C18, // ..***.....**.. + 0x00000C18, // ...**.....**.. + 0x00000618, // ....**....**.. + 0x00000610, // ....**....*... + 0x00000330, // .....**..**... + 0x00000320, // .....**..*.... + 0x000001A0, // ......**.*.... + 0x000001E0, // ......****.... + 0x000000C0, // .......**..... + 0x000000C0, // .......**..... + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 238 + 14, 26, + 0x00000000, // .............. + 0x00000300, // .....**....... + 0x00000600, // ....**........ + 0x00000600, // ....**........ + 0x00000370, // .....**.***... + 0x000001F0, // ......*****... + 0x00000300, // .....**....... + 0x00000600, // ....**........ + 0x00000600, // ....**........ + 0x00000600, // ....**........ + 0x000003F0, // .....******... + 0x000007E0, // ....******.... + 0x00000C00, // ...**......... + 0x00001800, // ..**.......... + 0x00001800, // ..**.......... + 0x00001800, // ..**.......... + 0x00001C00, // ..***......... + 0x00000E00, // ...***........ + 0x00000780, // ....****...... + 0x000001E0, // ......****.... + 0x00000030, // .........**... + 0x00000010, // ..........*... + 0x00000310, // .....**...*... + 0x00000330, // .....**..**... + 0x000001E0, // ......****.... + 0x00000000, // .............. + }, + { // 239 + 14, 26, + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x000003E0, // .....*****.... + 0x00000E38, // ...***...***.. + 0x00000C18, // ...**.....**.. + 0x0000180C, // ..**.......**. + 0x0000180C, // ..**.......**. + 0x0000180C, // ..**.......**. + 0x0000180C, // ..**.......**. + 0x00000C18, // ...**.....**.. + 0x00000E38, // ...***...***.. + 0x000003E0, // .....*****.... + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 240 + 14, 26, + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000FFC, // ...**********. + 0x00001FF8, // ..**********.. + 0x00003220, // .**..*...*.... + 0x00002220, // .*...*...*.... + 0x00000220, // .....*...*.... + 0x00000620, // ....**...*.... + 0x00000660, // ....**..**.... + 0x00000E64, // ...***..**..*. + 0x00000C78, // ...**...****.. + 0x00001830, // ..**.....**... + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 241 + 14, 26, + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x000003E0, // .....*****.... + 0x00000E38, // ...***...***.. + 0x00000C18, // ...**.....**.. + 0x0000180C, // ..**.......**. + 0x0000180C, // ..**.......**. + 0x0000180C, // ..**.......**. + 0x0000180C, // ..**.......**. + 0x00001C18, // ..***.....**.. + 0x00001E38, // ..****...***.. + 0x00001BE0, // ..**.*****.... + 0x00001800, // ..**.......... + 0x00001800, // ..**.......... + 0x00001800, // ..**.......... + 0x00001800, // ..**.......... + 0x00001800, // ..**.......... + 0x00000000, // .............. + }, + { // 242 + 14, 26, + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x000001F0, // ......*****... + 0x000003F8, // .....*******.. + 0x00000708, // ....***....*.. + 0x00000600, // ....**........ + 0x00000C00, // ...**......... + 0x00000C00, // ...**......... + 0x00000C00, // ...**......... + 0x00000E00, // ...***........ + 0x000007E0, // ....******.... + 0x000003F0, // .....******... + 0x00000008, // ...........*.. + 0x00000008, // ...........*.. + 0x00000018, // ..........**.. + 0x000001F0, // ......*****... + 0x000001E0, // ......****.... + 0x00000000, // .............. + }, + { // 243 + 14, 26, + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x000003FE, // .....********* + 0x00000E30, // ...***...**... + 0x00000C18, // ...**.....**.. + 0x0000180C, // ..**.......**. + 0x0000180C, // ..**.......**. + 0x0000180C, // ..**.......**. + 0x0000180C, // ..**.......**. + 0x00000C18, // ...**.....**.. + 0x00000E38, // ...***...***.. + 0x000003E0, // .....*****.... + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 244 + 14, 26, + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x000007FC, // ....*********. + 0x00000FF8, // ...*********.. + 0x00001880, // ..**...*...... + 0x00001080, // ..*....*...... + 0x00000080, // .......*...... + 0x00000080, // .......*...... + 0x00000080, // .......*...... + 0x00000084, // .......*....*. + 0x000000F8, // .......*****.. + 0x00000070, // ........***... + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 245 + 14, 26, + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000C30, // ...**....**... + 0x00001618, // ..*.**....**.. + 0x0000060C, // ....**.....**. + 0x0000060C, // ....**.....**. + 0x0000060C, // ....**.....**. + 0x0000060C, // ....**.....**. + 0x00000618, // ....**....**.. + 0x00000618, // ....**....**.. + 0x00000730, // ....***..**... + 0x000003E0, // .....*****.... + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 246 + 14, 26, + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000080, // .......*...... + 0x00000080, // .......*...... + 0x00000080, // .......*...... + 0x00000080, // .......*...... + 0x00000080, // .......*...... + 0x00000080, // .......*...... + 0x000003E0, // .....*****.... + 0x00000EB8, // ...***.*.***.. + 0x00000C98, // ...**..*..**.. + 0x0000188C, // ..**...*...**. + 0x0000188C, // ..**...*...**. + 0x0000188C, // ..**...*...**. + 0x0000188C, // ..**...*...**. + 0x00000C98, // ...**..*..**.. + 0x00000EB8, // ...***.*.***.. + 0x000003E0, // .....*****.... + 0x00000080, // .......*...... + 0x00000080, // .......*...... + 0x00000080, // .......*...... + 0x00000080, // .......*...... + 0x00000080, // .......*...... + 0x00000000, // .............. + }, + { // 247 + 14, 26, + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x0000180C, // ..**.......**. + 0x00003C18, // .****.....**.. + 0x00002630, // .*..**...**... + 0x00000660, // ....**..**.... + 0x00000360, // .....**.**.... + 0x000003C0, // .....****..... + 0x000001C0, // ......***..... + 0x00000380, // .....***...... + 0x00000380, // .....***...... + 0x000007C0, // ....*****..... + 0x000006C0, // ....**.**..... + 0x00000C60, // ...**...**.... + 0x00001C64, // ..***...**..*. + 0x0000183C, // ..**.....****. + 0x00003018, // .**.......**.. + 0x00000000, // .............. + }, + { // 248 + 14, 26, + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000080, // .......*...... + 0x00000080, // .......*...... + 0x00000080, // .......*...... + 0x00000080, // .......*...... + 0x00000080, // .......*...... + 0x00000080, // .......*...... + 0x0000388E, // .***...*...*** + 0x00001C9C, // ..***..*..***. + 0x00000C98, // ...**..*..**.. + 0x00000C98, // ...**..*..**.. + 0x00000C98, // ...**..*..**.. + 0x00000C98, // ...**..*..**.. + 0x00000C98, // ...**..*..**.. + 0x000006B0, // ....**.*.**... + 0x000006B0, // ....**.*.**... + 0x000003E0, // .....*****.... + 0x00000080, // .......*...... + 0x00000080, // .......*...... + 0x00000080, // .......*...... + 0x00000080, // .......*...... + 0x00000080, // .......*...... + 0x00000000, // .............. + }, + { // 249 + 14, 26, + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000C30, // ...**....**... + 0x00001818, // ..**......**.. + 0x0000300C, // .**........**. + 0x0000300C, // .**........**. + 0x0000318C, // .**...**...**. + 0x0000318C, // .**...**...**. + 0x0000318C, // .**...**...**. + 0x0000399C, // .***..**..***. + 0x00001FF8, // ..**********.. + 0x00000E70, // ...***..***... + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 250 + 14, 26, + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000C30, // ...**....**... + 0x00001E78, // ..****..****.. + 0x00000C30, // ...**....**... + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000700, // ....***....... + 0x00000980, // ...*..**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000180, // ......**...... + 0x00000190, // ......**..*... + 0x000000E0, // .......***.... + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 251 + 14, 26, + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000630, // ....**...**... + 0x00000F78, // ...****.****.. + 0x00000630, // ....**...**... + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000C30, // ...**....**... + 0x00001618, // ..*.**....**.. + 0x0000060C, // ....**.....**. + 0x0000060C, // ....**.....**. + 0x0000060C, // ....**.....**. + 0x0000060C, // ....**.....**. + 0x00000618, // ....**....**.. + 0x00000618, // ....**....**.. + 0x00000730, // ....***..**... + 0x000003E0, // .....*****.... + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 252 + 14, 26, + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x000000C0, // .......**..... + 0x000000C0, // .......**..... + 0x00000080, // .......*...... + 0x00000080, // .......*...... + 0x00000000, // .............. + 0x00000000, // .............. + 0x000003E0, // .....*****.... + 0x00000E38, // ...***...***.. + 0x00000C18, // ...**.....**.. + 0x0000180C, // ..**.......**. + 0x0000180C, // ..**.......**. + 0x0000180C, // ..**.......**. + 0x0000180C, // ..**.......**. + 0x00000C18, // ...**.....**.. + 0x00000E38, // ...***...***.. + 0x000003E0, // .....*****.... + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 253 + 14, 26, + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000060, // ........**.... + 0x00000060, // ........**.... + 0x00000040, // ........*..... + 0x00000040, // ........*..... + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000C30, // ...**....**... + 0x00001618, // ..*.**....**.. + 0x0000060C, // ....**.....**. + 0x0000060C, // ....**.....**. + 0x0000060C, // ....**.....**. + 0x0000060C, // ....**.....**. + 0x00000618, // ....**....**.. + 0x00000618, // ....**....**.. + 0x00000730, // ....***..**... + 0x000003E0, // .....*****.... + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 254 + 14, 26, + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x000000C0, // .......**..... + 0x000000C0, // .......**..... + 0x00000080, // .......*...... + 0x00000080, // .......*...... + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000C30, // ...**....**... + 0x00001818, // ..**......**.. + 0x0000300C, // .**........**. + 0x0000300C, // .**........**. + 0x0000318C, // .**...**...**. + 0x0000318C, // .**...**...**. + 0x0000318C, // .**...**...**. + 0x0000399C, // .***..**..***. + 0x00001FF8, // ..**********.. + 0x00000E70, // ...***..***... + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 255 + 14, 26, + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + }; @@ -1,4 +1,4 @@ -cFont::tPixelData FontFix[][28] = { +cFont::tPixelData FontFix_iso8859_1[][28] = { { // 32 15, 26, 0x00000000, // ............... diff --git a/fontosd-iso8859-7.c b/fontosd-iso8859-7.c new file mode 100644 index 0000000..228feed --- /dev/null +++ b/fontosd-iso8859-7.c @@ -0,0 +1,5826 @@ +cFont::tPixelData FontOsd_iso8859_7[][25] = { + { // 32 + 12, 23, + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + }, + { // 33 + 12, 23, + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x000000C0, // .....**..... + 0x000001E0, // ....****.... + 0x000001E0, // ....****.... + 0x000001E0, // ....****.... + 0x000001E0, // ....****.... + 0x000001E0, // ....****.... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x00000000, // ............ + 0x00000000, // ............ + 0x000000C0, // .....**..... + 0x000001E0, // ....****.... + 0x000001E0, // ....****.... + 0x000000C0, // .....**..... + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + }, + { // 34 + 12, 23, + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000738, // ..***..***.. + 0x00000738, // ..***..***.. + 0x00000738, // ..***..***.. + 0x00000738, // ..***..***.. + 0x00000210, // ...*....*... + 0x00000210, // ...*....*... + 0x00000210, // ...*....*... + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + }, + { // 35 + 12, 23, + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000330, // ...**..**... + 0x00000330, // ...**..**... + 0x00000330, // ...**..**... + 0x00000330, // ...**..**... + 0x00000FFC, // .**********. + 0x00000FFC, // .**********. + 0x00000330, // ...**..**... + 0x00000330, // ...**..**... + 0x00000330, // ...**..**... + 0x00000330, // ...**..**... + 0x00000FFC, // .**********. + 0x00000FFC, // .**********. + 0x00000330, // ...**..**... + 0x00000330, // ...**..**... + 0x00000330, // ...**..**... + 0x00000330, // ...**..**... + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + }, + { // 36 + 12, 23, + 0x00000000, // ............ + 0x00000000, // ............ + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000003F0, // ...******... + 0x00000638, // ..**...***.. + 0x00000C18, // .**.....**.. + 0x00000C08, // .**......*.. + 0x00000E00, // .***........ + 0x00000700, // ..***....... + 0x000003C0, // ...****..... + 0x000000F0, // .....****... + 0x00000038, // .......***.. + 0x0000001C, // ........***. + 0x0000080C, // .*.......**. + 0x00000C0C, // .**......**. + 0x00000E18, // .***....**.. + 0x000007F0, // ..*******... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + }, + { // 37 + 12, 23, + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x0000078C, // ..****...**. + 0x00000CCC, // .**..**..**. + 0x00000CD8, // .**..**.**.. + 0x00000CD8, // .**..**.**.. + 0x000007B0, // ..****.**... + 0x00000030, // .......**... + 0x00000060, // ......**.... + 0x00000060, // ......**.... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x00000180, // ....**...... + 0x000001BC, // ....**.****. + 0x00000366, // ...**.**..** + 0x00000366, // ...**.**..** + 0x00000666, // ..**..**..** + 0x0000063C, // ..**...****. + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + }, + { // 38 + 12, 23, + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x000001C0, // ....***..... + 0x00000360, // ...**.**.... + 0x00000630, // ..**...**... + 0x00000630, // ..**...**... + 0x00000630, // ..**...**... + 0x00000630, // ..**...**... + 0x00000360, // ...**.**.... + 0x000001C0, // ....***..... + 0x00000380, // ...***...... + 0x000006C4, // ..**.**...*. + 0x00000C6C, // .**...**.**. + 0x00000C68, // .**...**.*.. + 0x00000C38, // .**....***.. + 0x00000C30, // .**....**... + 0x00000678, // ..**..****.. + 0x000003CC, // ...****..**. + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + }, + { // 39 + 12, 23, + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x000000C0, // .....**..... + 0x000001E0, // ....****.... + 0x000001E0, // ....****.... + 0x000000E0, // .....***.... + 0x000000C0, // .....**..... + 0x00000180, // ....**...... + 0x00000300, // ...**....... + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + }, + { // 40 + 12, 23, + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000018, // ........**.. + 0x00000030, // .......**... + 0x00000060, // ......**.... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x00000180, // ....**...... + 0x00000180, // ....**...... + 0x00000180, // ....**...... + 0x00000180, // ....**...... + 0x00000180, // ....**...... + 0x00000180, // ....**...... + 0x00000180, // ....**...... + 0x00000180, // ....**...... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x00000060, // ......**.... + 0x00000030, // .......**... + 0x00000018, // ........**.. + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + }, + { // 41 + 12, 23, + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000300, // ...**....... + 0x00000180, // ....**...... + 0x000000C0, // .....**..... + 0x00000060, // ......**.... + 0x00000060, // ......**.... + 0x00000030, // .......**... + 0x00000030, // .......**... + 0x00000030, // .......**... + 0x00000030, // .......**... + 0x00000030, // .......**... + 0x00000030, // .......**... + 0x00000030, // .......**... + 0x00000030, // .......**... + 0x00000060, // ......**.... + 0x00000060, // ......**.... + 0x000000C0, // .....**..... + 0x00000180, // ....**...... + 0x00000300, // ...**....... + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + }, + { // 42 + 12, 23, + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x00000CCC, // .**..**..**. + 0x00000EDC, // .***.**.***. + 0x000001E0, // ....****.... + 0x000001E0, // ....****.... + 0x00000EDC, // .***.**.***. + 0x00000CCC, // .**..**..**. + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + }, + { // 43 + 12, 23, + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x00000FFC, // .**********. + 0x00000FFC, // .**********. + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + }, + { // 44 + 12, 23, + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x000000C0, // .....**..... + 0x000001E0, // ....****.... + 0x000001E0, // ....****.... + 0x000000E0, // .....***.... + 0x000000C0, // .....**..... + 0x00000180, // ....**...... + 0x00000300, // ...**....... + 0x00000000, // ............ + 0x00000000, // ............ + }, + { // 45 + 12, 23, + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000FFC, // .**********. + 0x00000FFC, // .**********. + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + }, + { // 46 + 12, 23, + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x000000C0, // .....**..... + 0x000001E0, // ....****.... + 0x000001E0, // ....****.... + 0x000000C0, // .....**..... + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + }, + { // 47 + 12, 23, + 0x00000000, // ............ + 0x00000000, // ............ + 0x0000000C, // .........**. + 0x0000000C, // .........**. + 0x00000018, // ........**.. + 0x00000018, // ........**.. + 0x00000030, // .......**... + 0x00000030, // .......**... + 0x00000060, // ......**.... + 0x00000060, // ......**.... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x00000180, // ....**...... + 0x00000180, // ....**...... + 0x00000300, // ...**....... + 0x00000300, // ...**....... + 0x00000600, // ..**........ + 0x00000600, // ..**........ + 0x00000C00, // .**......... + 0x00000C00, // .**......... + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + }, + { // 48 + 12, 23, + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x000001E0, // ....****.... + 0x00000738, // ..***..***.. + 0x00000618, // ..**....**.. + 0x00000C0C, // .**......**. + 0x00000C0C, // .**......**. + 0x00000C0C, // .**......**. + 0x00000C0C, // .**......**. + 0x00000C0C, // .**......**. + 0x00000C0C, // .**......**. + 0x00000C0C, // .**......**. + 0x00000C0C, // .**......**. + 0x00000618, // ..**....**.. + 0x00000738, // ..***..***.. + 0x000001E0, // ....****.... + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + }, + { // 49 + 12, 23, + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000060, // ......**.... + 0x000001E0, // ....****.... + 0x00000360, // ...**.**.... + 0x00000060, // ......**.... + 0x00000060, // ......**.... + 0x00000060, // ......**.... + 0x00000060, // ......**.... + 0x00000060, // ......**.... + 0x00000060, // ......**.... + 0x00000060, // ......**.... + 0x00000060, // ......**.... + 0x00000060, // ......**.... + 0x00000060, // ......**.... + 0x00000060, // ......**.... + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + }, + { // 50 + 12, 23, + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x000001F0, // ....*****... + 0x00000318, // ...**...**.. + 0x0000060C, // ..**.....**. + 0x0000060C, // ..**.....**. + 0x0000000C, // .........**. + 0x00000018, // ........**.. + 0x00000030, // .......**... + 0x00000060, // ......**.... + 0x000000C0, // .....**..... + 0x00000180, // ....**...... + 0x00000300, // ...**....... + 0x00000604, // ..**......*. + 0x0000060C, // ..**.....**. + 0x000007FC, // ..*********. + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + }, + { // 51 + 12, 23, + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x000007FC, // ..*********. + 0x0000000C, // .........**. + 0x00000018, // ........**.. + 0x00000030, // .......**... + 0x00000060, // ......**.... + 0x000000C0, // .....**..... + 0x000001F0, // ....*****... + 0x00000018, // ........**.. + 0x0000000C, // .........**. + 0x0000000C, // .........**. + 0x0000000C, // .........**. + 0x0000000C, // .........**. + 0x00000618, // ..**....**.. + 0x000003F0, // ...******... + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + }, + { // 52 + 12, 23, + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000060, // ......**.... + 0x00000060, // ......**.... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x00000180, // ....**...... + 0x00000198, // ....**..**.. + 0x00000318, // ...**...**.. + 0x00000318, // ...**...**.. + 0x00000618, // ..**....**.. + 0x00000618, // ..**....**.. + 0x000007FE, // ..********** + 0x00000018, // ........**.. + 0x00000018, // ........**.. + 0x00000018, // ........**.. + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + }, + { // 53 + 12, 23, + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x000003F8, // ...*******.. + 0x00000300, // ...**....... + 0x00000300, // ...**....... + 0x00000300, // ...**....... + 0x00000300, // ...**....... + 0x000003F0, // ...******... + 0x00000018, // ........**.. + 0x0000000C, // .........**. + 0x0000000C, // .........**. + 0x0000000C, // .........**. + 0x0000000C, // .........**. + 0x0000000C, // .........**. + 0x00000618, // ..**....**.. + 0x000003F0, // ...******... + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + }, + { // 54 + 12, 23, + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000038, // .......***.. + 0x000000E0, // .....***.... + 0x00000180, // ....**...... + 0x00000300, // ...**....... + 0x00000300, // ...**....... + 0x00000600, // ..**........ + 0x000006F0, // ..**.****... + 0x00000718, // ..***...**.. + 0x0000060C, // ..**.....**. + 0x0000060C, // ..**.....**. + 0x0000060C, // ..**.....**. + 0x0000060C, // ..**.....**. + 0x00000318, // ...**...**.. + 0x000001F0, // ....*****... + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + }, + { // 55 + 12, 23, + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x000007FC, // ..*********. + 0x0000000C, // .........**. + 0x00000018, // ........**.. + 0x00000018, // ........**.. + 0x00000030, // .......**... + 0x00000030, // .......**... + 0x00000060, // ......**.... + 0x00000060, // ......**.... + 0x00000060, // ......**.... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x00000180, // ....**...... + 0x00000180, // ....**...... + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + }, + { // 56 + 12, 23, + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x000001F0, // ....*****... + 0x00000318, // ...**...**.. + 0x0000060C, // ..**.....**. + 0x0000060C, // ..**.....**. + 0x0000060C, // ..**.....**. + 0x00000318, // ...**...**.. + 0x000001F0, // ....*****... + 0x00000318, // ...**...**.. + 0x0000060C, // ..**.....**. + 0x0000060C, // ..**.....**. + 0x0000060C, // ..**.....**. + 0x0000060C, // ..**.....**. + 0x00000318, // ...**...**.. + 0x000001F0, // ....*****... + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + }, + { // 57 + 12, 23, + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x000001F0, // ....*****... + 0x00000318, // ...**...**.. + 0x0000060C, // ..**.....**. + 0x0000060C, // ..**.....**. + 0x0000060C, // ..**.....**. + 0x0000060C, // ..**.....**. + 0x0000031C, // ...**...***. + 0x000001EC, // ....****.**. + 0x0000000C, // .........**. + 0x00000018, // ........**.. + 0x00000018, // ........**.. + 0x00000030, // .......**... + 0x000000E0, // .....***.... + 0x00000380, // ...***...... + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + }, + { // 58 + 12, 23, + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x000000C0, // .....**..... + 0x000001E0, // ....****.... + 0x000001E0, // ....****.... + 0x000000C0, // .....**..... + 0x00000000, // ............ + 0x00000000, // ............ + 0x000000C0, // .....**..... + 0x000001E0, // ....****.... + 0x000001E0, // ....****.... + 0x000000C0, // .....**..... + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + }, + { // 59 + 12, 23, + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x000000C0, // .....**..... + 0x000001E0, // ....****.... + 0x000001E0, // ....****.... + 0x000000C0, // .....**..... + 0x00000000, // ............ + 0x00000000, // ............ + 0x000000C0, // .....**..... + 0x000001E0, // ....****.... + 0x000001E0, // ....****.... + 0x000000E0, // .....***.... + 0x000000C0, // .....**..... + 0x00000180, // ....**...... + 0x00000300, // ...**....... + 0x00000000, // ............ + 0x00000000, // ............ + }, + { // 60 + 12, 23, + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000004, // ..........*. + 0x0000001C, // ........***. + 0x00000078, // ......****.. + 0x000001E0, // ....****.... + 0x00000780, // ..****...... + 0x00000E00, // .***........ + 0x00000E00, // .***........ + 0x00000780, // ..****...... + 0x000001E0, // ....****.... + 0x00000078, // ......****.. + 0x0000001C, // ........***. + 0x00000004, // ..........*. + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + }, + { // 61 + 12, 23, + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000FFC, // .**********. + 0x00000FFC, // .**********. + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000FFC, // .**********. + 0x00000FFC, // .**********. + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + }, + { // 62 + 12, 23, + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000800, // .*.......... + 0x00000E00, // .***........ + 0x00000780, // ..****...... + 0x000001E0, // ....****.... + 0x00000078, // ......****.. + 0x0000001C, // ........***. + 0x0000001C, // ........***. + 0x00000078, // ......****.. + 0x000001E0, // ....****.... + 0x00000780, // ..****...... + 0x00000E00, // .***........ + 0x00000800, // .*.......... + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + }, + { // 63 + 12, 23, + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x000001F0, // ....*****... + 0x00000738, // ..***..***.. + 0x0000071C, // ..***...***. + 0x0000061C, // ..**....***. + 0x0000001C, // ........***. + 0x00000038, // .......***.. + 0x00000070, // ......***... + 0x000000E0, // .....***.... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x00000000, // ............ + 0x00000000, // ............ + 0x000000C0, // .....**..... + 0x000001E0, // ....****.... + 0x000001E0, // ....****.... + 0x000000C0, // .....**..... + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + }, + { // 64 + 12, 23, + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x000001F0, // ....*****... + 0x00000718, // ..***...**.. + 0x0000060C, // ..**.....**. + 0x00000C0C, // .**......**. + 0x00000C0C, // .**......**. + 0x00000C7C, // .**...*****. + 0x00000CCC, // .**..**..**. + 0x00000CCC, // .**..**..**. + 0x00000CCC, // .**..**..**. + 0x00000CCC, // .**..**..**. + 0x00000CCC, // .**..**..**. + 0x00000C76, // .**...***.** + 0x00000C00, // .**......... + 0x00000600, // ..**........ + 0x0000070C, // ..***....**. + 0x000001F8, // ....******.. + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + }, + { // 65 + 12, 23, + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000001E0, // ....****.... + 0x000001E0, // ....****.... + 0x00000330, // ...**..**... + 0x00000330, // ...**..**... + 0x00000330, // ...**..**... + 0x00000618, // ..**....**.. + 0x00000618, // ..**....**.. + 0x000007F8, // ..********.. + 0x00000C0C, // .**......**. + 0x00000C0C, // .**......**. + 0x00000C0C, // .**......**. + 0x00001E1E, // ****....**** + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + }, + { // 66 + 12, 23, + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000FE0, // .*******.... + 0x00000630, // ..**...**... + 0x00000618, // ..**....**.. + 0x00000618, // ..**....**.. + 0x00000618, // ..**....**.. + 0x00000630, // ..**...**... + 0x000007F0, // ..*******... + 0x00000618, // ..**....**.. + 0x0000060C, // ..**.....**. + 0x0000060C, // ..**.....**. + 0x0000060C, // ..**.....**. + 0x0000060C, // ..**.....**. + 0x00000618, // ..**....**.. + 0x00000FF0, // .********... + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + }, + { // 67 + 12, 23, + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x000001F4, // ....*****.*. + 0x0000031C, // ...**...***. + 0x0000060C, // ..**.....**. + 0x00000604, // ..**......*. + 0x00000C00, // .**......... + 0x00000C00, // .**......... + 0x00000C00, // .**......... + 0x00000C00, // .**......... + 0x00000C00, // .**......... + 0x00000C04, // .**.......*. + 0x0000060C, // ..**.....**. + 0x0000060C, // ..**.....**. + 0x00000318, // ...**...**.. + 0x000001F0, // ....*****... + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + }, + { // 68 + 12, 23, + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000FE0, // .*******.... + 0x00000638, // ..**...***.. + 0x0000060C, // ..**.....**. + 0x0000060C, // ..**.....**. + 0x00000606, // ..**......** + 0x00000606, // ..**......** + 0x00000606, // ..**......** + 0x00000606, // ..**......** + 0x00000606, // ..**......** + 0x00000606, // ..**......** + 0x0000060C, // ..**.....**. + 0x0000060C, // ..**.....**. + 0x00000638, // ..**...***.. + 0x00000FE0, // .*******.... + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + }, + { // 69 + 12, 23, + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000FFC, // .**********. + 0x0000060C, // ..**.....**. + 0x00000604, // ..**......*. + 0x00000604, // ..**......*. + 0x00000620, // ..**...*.... + 0x00000620, // ..**...*.... + 0x000007E0, // ..******.... + 0x00000620, // ..**...*.... + 0x00000620, // ..**...*.... + 0x00000600, // ..**........ + 0x00000604, // ..**......*. + 0x00000604, // ..**......*. + 0x0000060C, // ..**.....**. + 0x00000FFC, // .**********. + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + }, + { // 70 + 12, 23, + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000FFC, // .**********. + 0x0000060C, // ..**.....**. + 0x00000604, // ..**......*. + 0x00000604, // ..**......*. + 0x00000620, // ..**...*.... + 0x00000620, // ..**...*.... + 0x000007E0, // ..******.... + 0x00000620, // ..**...*.... + 0x00000620, // ..**...*.... + 0x00000600, // ..**........ + 0x00000600, // ..**........ + 0x00000600, // ..**........ + 0x00000600, // ..**........ + 0x00000F80, // .*****...... + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + }, + { // 71 + 12, 23, + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x000001F4, // ....*****.*. + 0x0000031C, // ...**...***. + 0x0000060C, // ..**.....**. + 0x00000604, // ..**......*. + 0x00000C00, // .**......... + 0x00000C00, // .**......... + 0x00000C00, // .**......... + 0x00000C3E, // .**....***** + 0x00000C0C, // .**......**. + 0x00000C0C, // .**......**. + 0x0000060C, // ..**.....**. + 0x0000060C, // ..**.....**. + 0x0000031C, // ...**...***. + 0x000001F0, // ....*****... + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + }, + { // 72 + 12, 23, + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000F1E, // .****...**** + 0x0000060C, // ..**.....**. + 0x0000060C, // ..**.....**. + 0x0000060C, // ..**.....**. + 0x0000060C, // ..**.....**. + 0x0000060C, // ..**.....**. + 0x000007FC, // ..*********. + 0x0000060C, // ..**.....**. + 0x0000060C, // ..**.....**. + 0x0000060C, // ..**.....**. + 0x0000060C, // ..**.....**. + 0x0000060C, // ..**.....**. + 0x0000060C, // ..**.....**. + 0x00000F1E, // .****...**** + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + }, + { // 73 + 12, 23, + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x000007F8, // ..********.. + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000007F8, // ..********.. + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + }, + { // 74 + 12, 23, + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x000001FC, // ....*******. + 0x00000030, // .......**... + 0x00000030, // .......**... + 0x00000030, // .......**... + 0x00000030, // .......**... + 0x00000030, // .......**... + 0x00000030, // .......**... + 0x00000030, // .......**... + 0x00000030, // .......**... + 0x00000030, // .......**... + 0x00000C30, // .**....**... + 0x00000C30, // .**....**... + 0x00000660, // ..**..**.... + 0x000003C0, // ...****..... + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + }, + { // 75 + 12, 23, + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000F1E, // .****...**** + 0x0000060C, // ..**.....**. + 0x00000618, // ..**....**.. + 0x00000630, // ..**...**... + 0x00000660, // ..**..**.... + 0x000006C0, // ..**.**..... + 0x000007C0, // ..*****..... + 0x00000760, // ..***.**.... + 0x00000660, // ..**..**.... + 0x00000630, // ..**...**... + 0x00000630, // ..**...**... + 0x00000618, // ..**....**.. + 0x0000061C, // ..**....***. + 0x00000F0E, // .****....*** + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + }, + { // 76 + 12, 23, + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000F00, // .****....... + 0x00000600, // ..**........ + 0x00000600, // ..**........ + 0x00000600, // ..**........ + 0x00000600, // ..**........ + 0x00000600, // ..**........ + 0x00000600, // ..**........ + 0x00000600, // ..**........ + 0x00000600, // ..**........ + 0x00000600, // ..**........ + 0x00000604, // ..**......*. + 0x00000604, // ..**......*. + 0x0000060C, // ..**.....**. + 0x00000FFC, // .**********. + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + }, + { // 77 + 12, 23, + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000E0E, // .***.....*** + 0x0000060C, // ..**.....**. + 0x0000071C, // ..***...***. + 0x0000071C, // ..***...***. + 0x000007BC, // ..****.****. + 0x000006AC, // ..**.*.*.**. + 0x000006EC, // ..**.***.**. + 0x0000064C, // ..**..*..**. + 0x0000064C, // ..**..*..**. + 0x0000060C, // ..**.....**. + 0x0000060C, // ..**.....**. + 0x0000060C, // ..**.....**. + 0x0000060C, // ..**.....**. + 0x00000F1E, // .****...**** + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + }, + { // 78 + 12, 23, + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000E1E, // .***....**** + 0x0000070C, // ..***....**. + 0x0000070C, // ..***....**. + 0x0000078C, // ..****...**. + 0x0000068C, // ..**.*...**. + 0x000006CC, // ..**.**..**. + 0x000006CC, // ..**.**..**. + 0x0000066C, // ..**..**.**. + 0x0000066C, // ..**..**.**. + 0x0000062C, // ..**...*.**. + 0x0000063C, // ..**...****. + 0x0000061C, // ..**....***. + 0x0000061C, // ..**....***. + 0x00000F0C, // .****....**. + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + }, + { // 79 + 12, 23, + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x000001F0, // ....*****... + 0x00000318, // ...**...**.. + 0x0000060C, // ..**.....**. + 0x0000060C, // ..**.....**. + 0x00000C06, // .**.......** + 0x00000C06, // .**.......** + 0x00000C06, // .**.......** + 0x00000C06, // .**.......** + 0x00000C06, // .**.......** + 0x00000C06, // .**.......** + 0x0000060C, // ..**.....**. + 0x0000060C, // ..**.....**. + 0x00000318, // ...**...**.. + 0x000001F0, // ....*****... + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + }, + { // 80 + 12, 23, + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000FF0, // .********... + 0x00000618, // ..**....**.. + 0x0000060C, // ..**.....**. + 0x0000060C, // ..**.....**. + 0x0000060C, // ..**.....**. + 0x0000060C, // ..**.....**. + 0x00000618, // ..**....**.. + 0x000007F0, // ..*******... + 0x00000600, // ..**........ + 0x00000600, // ..**........ + 0x00000600, // ..**........ + 0x00000600, // ..**........ + 0x00000600, // ..**........ + 0x00000F80, // .*****...... + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + }, + { // 81 + 12, 23, + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x000001F0, // ....*****... + 0x00000318, // ...**...**.. + 0x0000060C, // ..**.....**. + 0x0000060C, // ..**.....**. + 0x00000C06, // .**.......** + 0x00000C06, // .**.......** + 0x00000C06, // .**.......** + 0x00000C06, // .**.......** + 0x00000C06, // .**.......** + 0x00000C06, // .**.......** + 0x0000060C, // ..**.....**. + 0x0000060C, // ..**.....**. + 0x00000318, // ...**...**.. + 0x000001F0, // ....*****... + 0x00000030, // .......**... + 0x00000018, // ........**.. + 0x0000000E, // .........*** + 0x00000004, // ..........*. + 0x00000000, // ............ + }, + { // 82 + 12, 23, + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000FF0, // .********... + 0x00000618, // ..**....**.. + 0x0000060C, // ..**.....**. + 0x0000060C, // ..**.....**. + 0x0000060C, // ..**.....**. + 0x0000060C, // ..**.....**. + 0x00000618, // ..**....**.. + 0x000007F0, // ..*******... + 0x00000660, // ..**..**.... + 0x00000630, // ..**...**... + 0x00000630, // ..**...**... + 0x00000618, // ..**....**.. + 0x0000061C, // ..**....***. + 0x00000F0E, // .****....*** + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + }, + { // 83 + 12, 23, + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x000003E8, // ...*****.*.. + 0x00000638, // ..**...***.. + 0x00000C18, // .**.....**.. + 0x00000C08, // .**......*.. + 0x00000C00, // .**......... + 0x00000700, // ..***....... + 0x000003C0, // ...****..... + 0x000000F0, // .....****... + 0x00000038, // .......***.. + 0x0000000C, // .........**. + 0x0000080C, // .*.......**. + 0x00000C0C, // .**......**. + 0x00000E18, // .***....**.. + 0x00000BF0, // .*.******... + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + }, + { // 84 + 12, 23, + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000FFC, // .**********. + 0x00000CCC, // .**..**..**. + 0x000008C4, // .*...**...*. + 0x000008C4, // .*...**...*. + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000003F0, // ...******... + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + }, + { // 85 + 12, 23, + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000F1E, // .****...**** + 0x0000060C, // ..**.....**. + 0x0000060C, // ..**.....**. + 0x0000060C, // ..**.....**. + 0x0000060C, // ..**.....**. + 0x0000060C, // ..**.....**. + 0x0000060C, // ..**.....**. + 0x0000060C, // ..**.....**. + 0x0000060C, // ..**.....**. + 0x0000060C, // ..**.....**. + 0x0000060C, // ..**.....**. + 0x0000060C, // ..**.....**. + 0x00000318, // ...**...**.. + 0x000001F0, // ....*****... + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + }, + { // 86 + 12, 23, + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00001E1E, // ****....**** + 0x00000C0C, // .**......**. + 0x00000C0C, // .**......**. + 0x00000618, // ..**....**.. + 0x00000618, // ..**....**.. + 0x00000618, // ..**....**.. + 0x00000618, // ..**....**.. + 0x00000330, // ...**..**... + 0x00000330, // ...**..**... + 0x00000330, // ...**..**... + 0x000001E0, // ....****.... + 0x000001E0, // ....****.... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + }, + { // 87 + 12, 23, + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000F1E, // .****...**** + 0x0000060C, // ..**.....**. + 0x0000060C, // ..**.....**. + 0x0000060C, // ..**.....**. + 0x0000064C, // ..**..*..**. + 0x0000064C, // ..**..*..**. + 0x000006EC, // ..**.***.**. + 0x000006EC, // ..**.***.**. + 0x000006AC, // ..**.*.*.**. + 0x000003B8, // ...***.***.. + 0x000003B8, // ...***.***.. + 0x00000318, // ...**...**.. + 0x00000318, // ...**...**.. + 0x00000318, // ...**...**.. + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + }, + { // 88 + 12, 23, + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000F1E, // .****...**** + 0x0000060C, // ..**.....**. + 0x00000318, // ...**...**.. + 0x00000318, // ...**...**.. + 0x000001B0, // ....**.**... + 0x000001B0, // ....**.**... + 0x000000E0, // .....***.... + 0x000000E0, // .....***.... + 0x000001B0, // ....**.**... + 0x000001B0, // ....**.**... + 0x00000318, // ...**...**.. + 0x00000318, // ...**...**.. + 0x0000060C, // ..**.....**. + 0x00000F1E, // .****...**** + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + }, + { // 89 + 12, 23, + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00001E1E, // ****....**** + 0x00000C0C, // .**......**. + 0x00000618, // ..**....**.. + 0x00000618, // ..**....**.. + 0x00000330, // ...**..**... + 0x00000330, // ...**..**... + 0x000001E0, // ....****.... + 0x000001E0, // ....****.... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000003F0, // ...******... + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + }, + { // 90 + 12, 23, + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000FFC, // .**********. + 0x00000C0C, // .**......**. + 0x00000818, // .*......**.. + 0x00000830, // .*.....**... + 0x00000030, // .......**... + 0x00000060, // ......**.... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x00000180, // ....**...... + 0x00000300, // ...**....... + 0x00000304, // ...**.....*. + 0x00000604, // ..**......*. + 0x00000C0C, // .**......**. + 0x00000FFC, // .**********. + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + }, + { // 91 + 12, 23, + 0x00000000, // ............ + 0x00000000, // ............ + 0x000000F8, // .....*****.. + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000000F8, // .....*****.. + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + }, + { // 92 + 12, 23, + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000C00, // .**......... + 0x00000C00, // .**......... + 0x00000600, // ..**........ + 0x00000600, // ..**........ + 0x00000300, // ...**....... + 0x00000300, // ...**....... + 0x00000180, // ....**...... + 0x00000180, // ....**...... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x00000060, // ......**.... + 0x00000060, // ......**.... + 0x00000030, // .......**... + 0x00000030, // .......**... + 0x00000018, // ........**.. + 0x00000018, // ........**.. + 0x0000000C, // .........**. + 0x0000000C, // .........**. + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + }, + { // 93 + 12, 23, + 0x00000000, // ............ + 0x00000000, // ............ + 0x000003E0, // ...*****.... + 0x00000060, // ......**.... + 0x00000060, // ......**.... + 0x00000060, // ......**.... + 0x00000060, // ......**.... + 0x00000060, // ......**.... + 0x00000060, // ......**.... + 0x00000060, // ......**.... + 0x00000060, // ......**.... + 0x00000060, // ......**.... + 0x00000060, // ......**.... + 0x00000060, // ......**.... + 0x00000060, // ......**.... + 0x00000060, // ......**.... + 0x00000060, // ......**.... + 0x00000060, // ......**.... + 0x00000060, // ......**.... + 0x000003E0, // ...*****.... + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + }, + { // 94 + 12, 23, + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x000000C0, // .....**..... + 0x000001E0, // ....****.... + 0x00000330, // ...**..**... + 0x00000210, // ...*....*... + 0x00000408, // ..*......*.. + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + }, + { // 95 + 12, 23, + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00001FFE, // ************ + 0x00001FFE, // ************ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + }, + { // 96 + 12, 23, + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000030, // .......**... + 0x00000060, // ......**.... + 0x000000C0, // .....**..... + 0x000001C0, // ....***..... + 0x000001E0, // ....****.... + 0x000001E0, // ....****.... + 0x000000C0, // .....**..... + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + }, + { // 97 + 12, 23, + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x000001F0, // ....*****... + 0x00000738, // ..***..***.. + 0x00000618, // ..**....**.. + 0x00000018, // ........**.. + 0x000003F8, // ...*******.. + 0x00000618, // ..**....**.. + 0x00000C18, // .**.....**.. + 0x00000E7C, // .***..*****. + 0x000007D8, // ..*****.**.. + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + }, + { // 98 + 12, 23, + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000600, // ..**........ + 0x00000E00, // .***........ + 0x00000600, // ..**........ + 0x00000600, // ..**........ + 0x00000600, // ..**........ + 0x000006F0, // ..**.****... + 0x0000079C, // ..****..***. + 0x0000070C, // ..***....**. + 0x00000606, // ..**......** + 0x00000606, // ..**......** + 0x00000606, // ..**......** + 0x0000070C, // ..***....**. + 0x0000079C, // ..****..***. + 0x000006F0, // ..**.****... + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + }, + { // 99 + 12, 23, + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x000000FC, // .....******. + 0x0000038C, // ...***...**. + 0x0000030C, // ...**....**. + 0x00000600, // ..**........ + 0x00000600, // ..**........ + 0x00000600, // ..**........ + 0x0000030C, // ...**....**. + 0x0000039C, // ...***..***. + 0x000000F0, // .....****... + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + }, + { // 100 + 12, 23, + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x0000000C, // .........**. + 0x0000001C, // ........***. + 0x0000000C, // .........**. + 0x0000000C, // .........**. + 0x0000000C, // .........**. + 0x000001EC, // ....****.**. + 0x0000073C, // ..***..****. + 0x0000061C, // ..**....***. + 0x00000C0C, // .**......**. + 0x00000C0C, // .**......**. + 0x00000C0C, // .**......**. + 0x0000061C, // ..**....***. + 0x0000073E, // ..***..***** + 0x000001EC, // ....****.**. + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + }, + { // 101 + 12, 23, + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x000001E0, // ....****.... + 0x00000738, // ..***..***.. + 0x00000618, // ..**....**.. + 0x00000C0C, // .**......**. + 0x00000FFC, // .**********. + 0x00000C00, // .**......... + 0x0000060C, // ..**.....**. + 0x0000071C, // ..***...***. + 0x000001F0, // ....*****... + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + }, + { // 102 + 12, 23, + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000078, // ......****.. + 0x000000CC, // .....**..**. + 0x00000180, // ....**...... + 0x00000180, // ....**...... + 0x00000180, // ....**...... + 0x00000FF8, // .*********.. + 0x00000180, // ....**...... + 0x00000180, // ....**...... + 0x00000180, // ....**...... + 0x00000180, // ....**...... + 0x00000180, // ....**...... + 0x00000180, // ....**...... + 0x00000180, // ....**...... + 0x00000FF8, // .*********.. + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + }, + { // 103 + 12, 23, + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x000003E0, // ...*****.... + 0x0000063C, // ..**...****. + 0x00000C18, // .**.....**.. + 0x00000C18, // .**.....**.. + 0x00000630, // ..**...**... + 0x000003E0, // ...*****.... + 0x00000600, // ..**........ + 0x000003F8, // ...*******.. + 0x0000060C, // ..**.....**. + 0x00000C0C, // .**......**. + 0x00000C0C, // .**......**. + 0x00000618, // ..**....**.. + 0x000003F0, // ...******... + 0x00000000, // ............ + }, + { // 104 + 12, 23, + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000600, // ..**........ + 0x00000E00, // .***........ + 0x00000600, // ..**........ + 0x00000600, // ..**........ + 0x00000600, // ..**........ + 0x000006F0, // ..**.****... + 0x00000738, // ..***..***.. + 0x00000618, // ..**....**.. + 0x00000618, // ..**....**.. + 0x00000618, // ..**....**.. + 0x00000618, // ..**....**.. + 0x00000618, // ..**....**.. + 0x00000618, // ..**....**.. + 0x00000F3C, // .****..****. + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + }, + { // 105 + 12, 23, + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000060, // ......**.... + 0x000000F0, // .....****... + 0x00000060, // ......**.... + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000060, // ......**.... + 0x000003E0, // ...*****.... + 0x00000060, // ......**.... + 0x00000060, // ......**.... + 0x00000060, // ......**.... + 0x00000060, // ......**.... + 0x00000060, // ......**.... + 0x00000060, // ......**.... + 0x000003FC, // ...********. + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + }, + { // 106 + 12, 23, + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000060, // ......**.... + 0x000000F0, // .....****... + 0x00000060, // ......**.... + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000060, // ......**.... + 0x000003E0, // ...*****.... + 0x00000060, // ......**.... + 0x00000060, // ......**.... + 0x00000060, // ......**.... + 0x00000060, // ......**.... + 0x00000060, // ......**.... + 0x00000060, // ......**.... + 0x00000060, // ......**.... + 0x00000060, // ......**.... + 0x00001860, // **....**.... + 0x00001CC0, // ***..**..... + 0x00000780, // ..****...... + 0x00000000, // ............ + }, + { // 107 + 12, 23, + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000600, // ..**........ + 0x00000E00, // .***........ + 0x00000600, // ..**........ + 0x00000600, // ..**........ + 0x00000600, // ..**........ + 0x0000067C, // ..**..*****. + 0x00000630, // ..**...**... + 0x00000660, // ..**..**.... + 0x000006C0, // ..**.**..... + 0x000007C0, // ..*****..... + 0x00000660, // ..**..**.... + 0x00000630, // ..**...**... + 0x0000061A, // ..**....**.* + 0x00000F0C, // .****....**. + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + }, + { // 108 + 12, 23, + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x000000C0, // .....**..... + 0x000003C0, // ...****..... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000007F8, // ..********.. + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + }, + { // 109 + 12, 23, + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000D98, // .**.**..**.. + 0x00001EEC, // ****.***.**. + 0x00000CCC, // .**..**..**. + 0x00000CCC, // .**..**..**. + 0x00000CCC, // .**..**..**. + 0x00000CCC, // .**..**..**. + 0x00000CCC, // .**..**..**. + 0x00000CCC, // .**..**..**. + 0x00001DDE, // ***.***.**** + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + }, + { // 110 + 12, 23, + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x000006F0, // ..**.****... + 0x00000F38, // .****..***.. + 0x00000618, // ..**....**.. + 0x00000618, // ..**....**.. + 0x00000618, // ..**....**.. + 0x00000618, // ..**....**.. + 0x00000618, // ..**....**.. + 0x00000618, // ..**....**.. + 0x00000F3C, // .****..****. + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + }, + { // 111 + 12, 23, + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x000001E0, // ....****.... + 0x00000738, // ..***..***.. + 0x00000618, // ..**....**.. + 0x00000C0C, // .**......**. + 0x00000C0C, // .**......**. + 0x00000C0C, // .**......**. + 0x00000618, // ..**....**.. + 0x00000738, // ..***..***.. + 0x000001E0, // ....****.... + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + }, + { // 112 + 12, 23, + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x000006F0, // ..**.****... + 0x00000F9C, // .*****..***. + 0x0000070C, // ..***....**. + 0x00000606, // ..**......** + 0x00000606, // ..**......** + 0x00000606, // ..**......** + 0x0000070C, // ..***....**. + 0x0000079C, // ..****..***. + 0x000006F0, // ..**.****... + 0x00000600, // ..**........ + 0x00000600, // ..**........ + 0x00000600, // ..**........ + 0x00000F80, // .*****...... + 0x00000000, // ............ + }, + { // 113 + 12, 23, + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x000001E4, // ....****..*. + 0x0000073C, // ..***..****. + 0x0000061C, // ..**....***. + 0x00000C0C, // .**......**. + 0x00000C0C, // .**......**. + 0x00000C0C, // .**......**. + 0x0000061C, // ..**....***. + 0x0000073C, // ..***..****. + 0x000001EC, // ....****.**. + 0x0000000C, // .........**. + 0x0000000C, // .........**. + 0x0000000C, // .........**. + 0x0000003E, // .......***** + 0x00000000, // ............ + }, + { // 114 + 12, 23, + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000338, // ...**..***.. + 0x00000F5C, // .****.*.***. + 0x00000398, // ...***..**.. + 0x00000300, // ...**....... + 0x00000300, // ...**....... + 0x00000300, // ...**....... + 0x00000300, // ...**....... + 0x00000300, // ...**....... + 0x00000FE0, // .*******.... + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + }, + { // 115 + 12, 23, + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x000001F0, // ....*****... + 0x0000071C, // ..***...***. + 0x0000060C, // ..**.....**. + 0x00000380, // ...***...... + 0x000001F0, // ....*****... + 0x00000038, // .......***.. + 0x0000060C, // ..**.....**. + 0x0000071C, // ..***...***. + 0x000001F0, // ....*****... + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + }, + { // 116 + 12, 23, + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000180, // ....**...... + 0x00000180, // ....**...... + 0x00000180, // ....**...... + 0x00000FF8, // .*********.. + 0x00000180, // ....**...... + 0x00000180, // ....**...... + 0x00000180, // ....**...... + 0x00000180, // ....**...... + 0x00000180, // ....**...... + 0x00000180, // ....**...... + 0x0000018C, // ....**...**. + 0x000000F8, // .....*****.. + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + }, + { // 117 + 12, 23, + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000618, // ..**....**.. + 0x00000E38, // .***...***.. + 0x00000618, // ..**....**.. + 0x00000618, // ..**....**.. + 0x00000618, // ..**....**.. + 0x00000618, // ..**....**.. + 0x00000618, // ..**....**.. + 0x0000073C, // ..***..****. + 0x000003D8, // ...****.**.. + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + }, + { // 118 + 12, 23, + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000F1E, // .****...**** + 0x0000060C, // ..**.....**. + 0x00000318, // ...**...**.. + 0x00000318, // ...**...**.. + 0x000001B0, // ....**.**... + 0x000001B0, // ....**.**... + 0x000000E0, // .....***.... + 0x000000E0, // .....***.... + 0x00000040, // ......*..... + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + }, + { // 119 + 12, 23, + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000F1E, // .****...**** + 0x0000060C, // ..**.....**. + 0x0000064C, // ..**..*..**. + 0x0000064C, // ..**..*..**. + 0x000006EC, // ..**.***.**. + 0x000002A8, // ...*.*.*.*.. + 0x000003B8, // ...***.***.. + 0x00000318, // ...**...**.. + 0x00000318, // ...**...**.. + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + }, + { // 120 + 12, 23, + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000F3C, // .****..****. + 0x00000618, // ..**....**.. + 0x00000330, // ...**..**... + 0x000001E0, // ....****.... + 0x000000C0, // .....**..... + 0x000001E0, // ....****.... + 0x00000330, // ...**..**... + 0x00000618, // ..**....**.. + 0x00000F3C, // .****..****. + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + }, + { // 121 + 12, 23, + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000F1E, // .****...**** + 0x0000060C, // ..**.....**. + 0x00000318, // ...**...**.. + 0x00000318, // ...**...**.. + 0x000001B0, // ....**.**... + 0x000001B0, // ....**.**... + 0x000000E0, // .....***.... + 0x000000E0, // .....***.... + 0x00000040, // ......*..... + 0x000000C0, // .....**..... + 0x00000C80, // .**..*...... + 0x00000D80, // .**.**...... + 0x00000700, // ..***....... + 0x00000000, // ............ + }, + { // 122 + 12, 23, + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x000007F8, // ..********.. + 0x00000618, // ..**....**.. + 0x00000430, // ..*....**... + 0x00000060, // ......**.... + 0x000000C0, // .....**..... + 0x00000180, // ....**...... + 0x00000308, // ...**....*.. + 0x00000618, // ..**....**.. + 0x000007F8, // ..********.. + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + }, + { // 123 + 12, 23, + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000038, // .......***.. + 0x00000060, // ......**.... + 0x00000060, // ......**.... + 0x00000060, // ......**.... + 0x00000060, // ......**.... + 0x00000060, // ......**.... + 0x00000060, // ......**.... + 0x000000C0, // .....**..... + 0x00000380, // ...***...... + 0x000000C0, // .....**..... + 0x00000060, // ......**.... + 0x00000060, // ......**.... + 0x00000060, // ......**.... + 0x00000060, // ......**.... + 0x00000060, // ......**.... + 0x00000060, // ......**.... + 0x00000060, // ......**.... + 0x00000038, // .......***.. + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + }, + { // 124 + 12, 23, + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + }, + { // 125 + 12, 23, + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000380, // ...***...... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x00000060, // ......**.... + 0x00000038, // .......***.. + 0x00000060, // ......**.... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x00000380, // ...***...... + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + }, + { // 126 + 12, 23, + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x0000038C, // ...***...**. + 0x000007CC, // ..*****..**. + 0x00000CF8, // .**..*****.. + 0x00000C70, // .**...***... + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + }, + { // 127 + 12, 23, + 0x00001554, // *.*.*.*.*.*. + 0x00000AAA, // .*.*.*.*.*.* + 0x00001554, // *.*.*.*.*.*. + 0x00000AAA, // .*.*.*.*.*.* + 0x00001554, // *.*.*.*.*.*. + 0x00000AAA, // .*.*.*.*.*.* + 0x00001554, // *.*.*.*.*.*. + 0x00000AAA, // .*.*.*.*.*.* + 0x00001554, // *.*.*.*.*.*. + 0x00000AAA, // .*.*.*.*.*.* + 0x00001554, // *.*.*.*.*.*. + 0x00000AAA, // .*.*.*.*.*.* + 0x00001554, // *.*.*.*.*.*. + 0x00000AAA, // .*.*.*.*.*.* + 0x00001554, // *.*.*.*.*.*. + 0x00000AAA, // .*.*.*.*.*.* + 0x00001554, // *.*.*.*.*.*. + 0x00000AAA, // .*.*.*.*.*.* + 0x00001554, // *.*.*.*.*.*. + 0x00000AAA, // .*.*.*.*.*.* + 0x00001554, // *.*.*.*.*.*. + 0x00000AAA, // .*.*.*.*.*.* + 0x00001554, // *.*.*.*.*.*. + }, + { // 128 + 0, 23, + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + }, + { // 129 + 0, 23, + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + }, + { // 130 + 0, 23, + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + }, + { // 131 + 0, 23, + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + }, + { // 132 + 0, 23, + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + }, + { // 133 + 0, 23, + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + }, + { // 134 + 0, 23, + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + }, + { // 135 + 0, 23, + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + }, + { // 136 + 0, 23, + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + }, + { // 137 + 0, 23, + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + }, + { // 138 + 0, 23, + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + }, + { // 139 + 0, 23, + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + }, + { // 140 + 0, 23, + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + }, + { // 141 + 0, 23, + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + }, + { // 142 + 0, 23, + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + }, + { // 143 + 0, 23, + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + }, + { // 144 + 0, 23, + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + }, + { // 145 + 0, 23, + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + }, + { // 146 + 0, 23, + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + }, + { // 147 + 0, 23, + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + }, + { // 148 + 0, 23, + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + }, + { // 149 + 0, 23, + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + }, + { // 150 + 0, 23, + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + }, + { // 151 + 0, 23, + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + }, + { // 152 + 0, 23, + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + }, + { // 153 + 0, 23, + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + }, + { // 154 + 0, 23, + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + }, + { // 155 + 0, 23, + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + }, + { // 156 + 0, 23, + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + }, + { // 157 + 0, 23, + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + }, + { // 158 + 0, 23, + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + }, + { // 159 + 0, 23, + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + }, + { // 160 + 12, 23, + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + }, + { // 161 + 12, 23, + 0x00000000, // ............ + 0x000000E0, // .....***.... + 0x000000E0, // .....***.... + 0x000000E0, // .....***.... + 0x00000080, // .....*...... + 0x000000C0, // .....**..... + 0x00000060, // ......**.... + 0x00000030, // .......**... + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + }, + { // 162 + 12, 23, + 0x00000000, // ............ + 0x000000E0, // .....***.... + 0x000000E0, // .....***.... + 0x000000E0, // .....***.... + 0x00000020, // .......*.... + 0x00000060, // ......**.... + 0x000000C0, // .....**..... + 0x00000180, // ....**...... + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + }, + { // 163 + 12, 23, + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x000001F0, // ....*****... + 0x00000338, // ...**..***.. + 0x00000618, // ..**....**.. + 0x00000600, // ..**........ + 0x00000600, // ..**........ + 0x00000600, // ..**........ + 0x00000FC0, // .******..... + 0x00000600, // ..**........ + 0x00000600, // ..**........ + 0x00000600, // ..**........ + 0x00000600, // ..**........ + 0x00000600, // ..**........ + 0x00000FCC, // .******..**. + 0x00000CF8, // .**..*****.. + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + }, + { // 164 + 0, 23, + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + }, + { // 165 + 0, 23, + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + }, + { // 166 + 12, 23, + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x00000000, // ............ + 0x00000000, // ............ + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + }, + { // 167 + 12, 23, + 0x00000000, // ............ + 0x00000000, // ............ + 0x000003F0, // ...******... + 0x00000618, // ..**....**.. + 0x00000618, // ..**....**.. + 0x00000718, // ..***...**.. + 0x00000380, // ...***...... + 0x000001C0, // ....***..... + 0x000002E0, // ...*.***.... + 0x00000670, // ..**..***... + 0x00000638, // ..**...***.. + 0x00000718, // ..***...**.. + 0x00000398, // ...***..**.. + 0x000001D0, // ....***.*... + 0x000000E0, // .....***.... + 0x00000070, // ......***... + 0x00000638, // ..**...***.. + 0x00000618, // ..**....**.. + 0x00000618, // ..**....**.. + 0x000003F0, // ...******... + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + }, + { // 168 + 12, 23, + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000618, // ..**....**.. + 0x00000F3C, // .****..****. + 0x00000618, // ..**....**.. + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + }, + { // 169 + 12, 23, + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x000003F0, // ...******... + 0x00000618, // ..**....**.. + 0x00000CEC, // .**..***.**. + 0x00000D2C, // .**.*..*.**. + 0x00000D0C, // .**.*....**. + 0x00000D2C, // .**.*..*.**. + 0x00000CCC, // .**..**..**. + 0x00000618, // ..**....**.. + 0x000003F0, // ...******... + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + }, + { // 170 + 0, 23, + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + }, + { // 171 + 12, 23, + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000044, // ......*...*. + 0x000000CC, // .....**..**. + 0x00000198, // ....**..**.. + 0x00000330, // ...**..**... + 0x00000660, // ..**..**.... + 0x00000CC0, // .**..**..... + 0x00000CC0, // .**..**..... + 0x00000660, // ..**..**.... + 0x00000330, // ...**..**... + 0x00000198, // ....**..**.. + 0x000000CC, // .....**..**. + 0x00000044, // ......*...*. + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + }, + { // 172 + 12, 23, + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000FFC, // .**********. + 0x00000FFC, // .**********. + 0x0000000C, // .........**. + 0x0000000C, // .........**. + 0x0000000C, // .........**. + 0x0000000C, // .........**. + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + }, + { // 173 + 12, 23, + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x000003F0, // ...******... + 0x000003F0, // ...******... + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + }, + { // 174 + 0, 23, + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + }, + { // 175 + 12, 23, + 0x00001FFE, // ************ + 0x00001FFE, // ************ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + }, + { // 176 + 12, 23, + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x000000E0, // .....***.... + 0x000001B0, // ....**.**... + 0x00000318, // ...**...**.. + 0x00000318, // ...**...**.. + 0x00000318, // ...**...**.. + 0x000001B0, // ....**.**... + 0x000000E0, // .....***.... + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + }, + { // 177 + 12, 23, + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x00000FFC, // .**********. + 0x00000FFC, // .**********. + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x00000000, // ............ + 0x00000FFC, // .**********. + 0x00000FFC, // .**********. + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + }, + { // 178 + 12, 23, + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x000001E0, // ....****.... + 0x00000330, // ...**..**... + 0x00000330, // ...**..**... + 0x00000030, // .......**... + 0x00000060, // ......**.... + 0x000000C0, // .....**..... + 0x00000180, // ....**...... + 0x00000310, // ...**...*... + 0x000003F0, // ...******... + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + }, + { // 179 + 12, 23, + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x000001E0, // ....****.... + 0x00000330, // ...**..**... + 0x00000330, // ...**..**... + 0x00000030, // .......**... + 0x000000E0, // .....***.... + 0x00000030, // .......**... + 0x00000330, // ...**..**... + 0x00000330, // ...**..**... + 0x000001E0, // ....****.... + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + }, + { // 180 + 12, 23, + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x00000080, // .....*...... + 0x00000080, // .....*...... + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + }, + { // 181 + 12, 23, + 0x00000000, // ............ + 0x00000060, // ......**.... + 0x00000060, // ......**.... + 0x00000040, // ......*..... + 0x0000064C, // ..**..*..**. + 0x00000F1E, // .****...**** + 0x0000060C, // ..**.....**. + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + }, + { // 182 + 12, 23, + 0x00000000, // ............ + 0x00000300, // ...**....... + 0x00000300, // ...**....... + 0x00000200, // ...*........ + 0x000002C0, // ...*.**..... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000001E0, // ....****.... + 0x000001E0, // ....****.... + 0x00000160, // ....*.**.... + 0x00000330, // ...**..**... + 0x00000330, // ...**..**... + 0x00000618, // ..**....**.. + 0x000007F8, // ..********.. + 0x00000618, // ..**....**.. + 0x00000C0C, // .**......**. + 0x00000C0C, // .**......**. + 0x00001E1E, // ****....**** + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + }, + { // 183 + 12, 23, + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x000000C0, // .....**..... + 0x000001E0, // ....****.... + 0x000000C0, // .....**..... + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + }, + { // 184 + 12, 23, + 0x00000C00, // .**......... + 0x00000C00, // .**......... + 0x00000800, // .*.......... + 0x00000800, // .*.......... + 0x00000FFE, // .*********** + 0x00000306, // ...**.....** + 0x00000302, // ...**......* + 0x00000302, // ...**......* + 0x00000310, // ...**...*... + 0x00000310, // ...**...*... + 0x000003F0, // ...******... + 0x00000310, // ...**...*... + 0x00000310, // ...**...*... + 0x00000300, // ...**....... + 0x00000302, // ...**......* + 0x00000302, // ...**......* + 0x00000306, // ...**.....** + 0x000007FE, // ..********** + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + }, + { // 185 + 12, 23, + 0x00000C00, // .**......... + 0x00000C00, // .**......... + 0x00000800, // .*.......... + 0x00000800, // .*.......... + 0x00000F1E, // .****...**** + 0x0000060C, // ..**.....**. + 0x0000060C, // ..**.....**. + 0x0000060C, // ..**.....**. + 0x0000060C, // ..**.....**. + 0x0000060C, // ..**.....**. + 0x000007FC, // ..*********. + 0x0000060C, // ..**.....**. + 0x0000060C, // ..**.....**. + 0x0000060C, // ..**.....**. + 0x0000060C, // ..**.....**. + 0x0000060C, // ..**.....**. + 0x0000060C, // ..**.....**. + 0x00000F1E, // .****...**** + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + }, + { // 186 + 12, 23, + 0x00000000, // ............ + 0x00001800, // **.......... + 0x00001800, // **.......... + 0x00001000, // *........... + 0x000017F8, // *.********.. + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000007F8, // ..********.. + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + }, + { // 187 + 12, 23, + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000880, // .*...*...... + 0x00000CC0, // .**..**..... + 0x00000660, // ..**..**.... + 0x00000330, // ...**..**... + 0x00000198, // ....**..**.. + 0x000000CC, // .....**..**. + 0x000000CC, // .....**..**. + 0x00000198, // ....**..**.. + 0x00000330, // ...**..**... + 0x00000660, // ..**..**.... + 0x00000CC0, // .**..**..... + 0x00000880, // .*...*...... + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + }, + { // 188 + 12, 23, + 0x00000000, // ............ + 0x00000C00, // .**......... + 0x00000C00, // .**......... + 0x00000800, // .*.......... + 0x000009F0, // .*..*****... + 0x00000318, // ...**...**.. + 0x0000060C, // ..**.....**. + 0x0000060C, // ..**.....**. + 0x00000C06, // .**.......** + 0x00000C06, // .**.......** + 0x00000C06, // .**.......** + 0x00000C06, // .**.......** + 0x00000C06, // .**.......** + 0x00000C06, // .**.......** + 0x0000060C, // ..**.....**. + 0x0000060C, // ..**.....**. + 0x00000318, // ...**...**.. + 0x000001F0, // ....*****... + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + }, + { // 189 + 12, 23, + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000300, // ...**....... + 0x00000F00, // .****....... + 0x00000300, // ...**....... + 0x00000300, // ...**....... + 0x00000300, // ...**....... + 0x00000300, // ...**....... + 0x00000306, // ...**.....** + 0x0000030C, // ...**....**. + 0x00000338, // ...**..***.. + 0x00000060, // ......**.... + 0x000001C0, // ....***..... + 0x0000033C, // ...**..****. + 0x00000E66, // .***..**..** + 0x00001866, // **....**..** + 0x00000006, // ..........** + 0x0000000C, // .........**. + 0x00000018, // ........**.. + 0x00000030, // .......**... + 0x00000062, // ......**...* + 0x0000007E, // ......****** + 0x00000000, // ............ + }, + { // 190 + 12, 23, + 0x00000C00, // .**......... + 0x00000C00, // .**......... + 0x00000800, // .*.......... + 0x00000800, // .*.......... + 0x0000060C, // ..**.....**. + 0x00000F1E, // .****...**** + 0x00000932, // .*..*..**..* + 0x000001A0, // ....**.*.... + 0x000000E0, // .....***.... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000003F0, // ...******... + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + }, + { // 191 + 12, 23, + 0x00000600, // ..**........ + 0x00000600, // ..**........ + 0x00000400, // ..*......... + 0x00000400, // ..*......... + 0x000001F0, // ....*****... + 0x0000071C, // ..***...***. + 0x0000060C, // ..**.....**. + 0x00000C06, // .**.......** + 0x00000C06, // .**.......** + 0x00000C06, // .**.......** + 0x00000C06, // .**.......** + 0x00000C06, // .**.......** + 0x0000060C, // ..**.....**. + 0x0000060C, // ..**.....**. + 0x00000318, // ...**...**.. + 0x00000912, // .*..*...*..* + 0x00000F1E, // .****...**** + 0x0000071C, // ..***...***. + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + }, + { // 192 + 12, 23, + 0x00000060, // ......**.... + 0x00000060, // ......**.... + 0x00000040, // ......*..... + 0x00000040, // ......*..... + 0x00000618, // ..**....**.. + 0x00000F3C, // .****..****. + 0x00000618, // ..**....**.. + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000380, // ...***...... + 0x000004C0, // ..*..**..... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000000C8, // .....**..*.. + 0x00000070, // ......***... + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + }, + { // 193 + 12, 23, + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000001E0, // ....****.... + 0x000001E0, // ....****.... + 0x00000160, // ....*.**.... + 0x00000330, // ...**..**... + 0x00000330, // ...**..**... + 0x00000618, // ..**....**.. + 0x000007F8, // ..********.. + 0x00000618, // ..**....**.. + 0x00000C0C, // .**......**. + 0x00000C0C, // .**......**. + 0x00001E1E, // ****....**** + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + }, + { // 194 + 12, 23, + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000FF0, // .********... + 0x00000618, // ..**....**.. + 0x0000060C, // ..**.....**. + 0x0000060C, // ..**.....**. + 0x0000060C, // ..**.....**. + 0x00000618, // ..**....**.. + 0x000007F8, // ..********.. + 0x0000060C, // ..**.....**. + 0x00000606, // ..**......** + 0x00000606, // ..**......** + 0x00000606, // ..**......** + 0x00000606, // ..**......** + 0x0000060C, // ..**.....**. + 0x00000FF8, // .*********.. + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + }, + { // 195 + 12, 23, + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000FFC, // .**********. + 0x0000060C, // ..**.....**. + 0x00000604, // ..**......*. + 0x00000604, // ..**......*. + 0x00000600, // ..**........ + 0x00000600, // ..**........ + 0x00000600, // ..**........ + 0x00000600, // ..**........ + 0x00000600, // ..**........ + 0x00000600, // ..**........ + 0x00000600, // ..**........ + 0x00000600, // ..**........ + 0x00000600, // ..**........ + 0x00000FC0, // .******..... + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + }, + { // 196 + 12, 23, + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000001E0, // ....****.... + 0x000001E0, // ....****.... + 0x00000160, // ....*.**.... + 0x00000330, // ...**..**... + 0x00000230, // ...*...**... + 0x00000618, // ..**....**.. + 0x00000618, // ..**....**.. + 0x00000418, // ..*.....**.. + 0x00000C0C, // .**......**. + 0x00000FFC, // .**********. + 0x00000FFC, // .**********. + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + }, + { // 197 + 12, 23, + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000FFC, // .**********. + 0x0000060C, // ..**.....**. + 0x00000604, // ..**......*. + 0x00000604, // ..**......*. + 0x00000620, // ..**...*.... + 0x00000620, // ..**...*.... + 0x000007E0, // ..******.... + 0x00000620, // ..**...*.... + 0x00000620, // ..**...*.... + 0x00000600, // ..**........ + 0x00000604, // ..**......*. + 0x00000604, // ..**......*. + 0x0000060C, // ..**.....**. + 0x00000FFC, // .**********. + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + }, + { // 198 + 12, 23, + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000FFC, // .**********. + 0x00000C0C, // .**......**. + 0x00000818, // .*......**.. + 0x00000830, // .*.....**... + 0x00000030, // .......**... + 0x00000060, // ......**.... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x00000180, // ....**...... + 0x00000300, // ...**....... + 0x00000304, // ...**.....*. + 0x00000604, // ..**......*. + 0x00000C0C, // .**......**. + 0x00000FFC, // .**********. + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + }, + { // 199 + 12, 23, + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000F1E, // .****...**** + 0x0000060C, // ..**.....**. + 0x0000060C, // ..**.....**. + 0x0000060C, // ..**.....**. + 0x0000060C, // ..**.....**. + 0x0000060C, // ..**.....**. + 0x000007FC, // ..*********. + 0x0000060C, // ..**.....**. + 0x0000060C, // ..**.....**. + 0x0000060C, // ..**.....**. + 0x0000060C, // ..**.....**. + 0x0000060C, // ..**.....**. + 0x0000060C, // ..**.....**. + 0x00000F1E, // .****...**** + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + }, + { // 200 + 12, 23, + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x000001F0, // ....*****... + 0x00000318, // ...**...**.. + 0x0000060C, // ..**.....**. + 0x00000404, // ..*.......*. + 0x00000C06, // .**.......** + 0x00000D16, // .**.*...*.** + 0x00000DF6, // .**.*****.** + 0x00000DF6, // .**.*****.** + 0x00000D16, // .**.*...*.** + 0x00000C06, // .**.......** + 0x00000404, // ..*.......*. + 0x0000060C, // ..**.....**. + 0x00000318, // ...**...**.. + 0x000001F0, // ....*****... + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + }, + { // 201 + 12, 23, + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x000007F8, // ..********.. + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000007F8, // ..********.. + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + }, + { // 202 + 12, 23, + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000F1E, // .****...**** + 0x0000060C, // ..**.....**. + 0x00000618, // ..**....**.. + 0x00000630, // ..**...**... + 0x00000660, // ..**..**.... + 0x000006E0, // ..**.***.... + 0x000007E0, // ..******.... + 0x00000760, // ..***.**.... + 0x00000630, // ..**...**... + 0x00000630, // ..**...**... + 0x00000618, // ..**....**.. + 0x00000618, // ..**....**.. + 0x0000060C, // ..**.....**. + 0x00000F1E, // .****...**** + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + }, + { // 203 + 12, 23, + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000001E0, // ....****.... + 0x000001E0, // ....****.... + 0x00000160, // ....*.**.... + 0x00000330, // ...**..**... + 0x00000330, // ...**..**... + 0x00000618, // ..**....**.. + 0x00000618, // ..**....**.. + 0x00000618, // ..**....**.. + 0x00000C0C, // .**......**. + 0x00000C0C, // .**......**. + 0x00001E1E, // ****....**** + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + }, + { // 204 + 12, 23, + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00001C0E, // ***......*** + 0x00000C0C, // .**......**. + 0x00000C1C, // .**.....***. + 0x00000E1C, // .***....***. + 0x00000E3C, // .***...****. + 0x00000E3C, // .***...****. + 0x00000F2C, // .****..*.**. + 0x00000B6C, // .*.**.**.**. + 0x00000B6C, // .*.**.**.**. + 0x00000BCC, // .*.****..**. + 0x000009CC, // .*..***..**. + 0x000009CC, // .*..***..**. + 0x0000098C, // .*..**...**. + 0x00001C9E, // ***..*..**** + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + }, + { // 205 + 12, 23, + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000E1E, // .***....**** + 0x0000070C, // ..***....**. + 0x0000070C, // ..***....**. + 0x0000078C, // ..****...**. + 0x0000068C, // ..**.*...**. + 0x000006CC, // ..**.**..**. + 0x0000064C, // ..**..*..**. + 0x0000066C, // ..**..**.**. + 0x0000062C, // ..**...*.**. + 0x0000063C, // ..**...****. + 0x0000061C, // ..**....***. + 0x0000061C, // ..**....***. + 0x0000060C, // ..**.....**. + 0x00000F0C, // .****....**. + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + }, + { // 206 + 12, 23, + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000404, // ..*.......*. + 0x000007FC, // ..*********. + 0x000007FC, // ..*********. + 0x00000404, // ..*.......*. + 0x00000404, // ..*.......*. + 0x00000000, // ............ + 0x00000110, // ....*...*... + 0x000001F0, // ....*****... + 0x000001F0, // ....*****... + 0x00000110, // ....*...*... + 0x00000000, // ............ + 0x00000802, // .*.........* + 0x00000802, // .*.........* + 0x00000FFE, // .*********** + 0x00000FFE, // .*********** + 0x00000802, // .*.........* + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + }, + { // 207 + 12, 23, + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x000001F0, // ....*****... + 0x00000318, // ...**...**.. + 0x0000060C, // ..**.....**. + 0x0000060C, // ..**.....**. + 0x00000C06, // .**.......** + 0x00000C06, // .**.......** + 0x00000C06, // .**.......** + 0x00000C06, // .**.......** + 0x00000C06, // .**.......** + 0x00000C06, // .**.......** + 0x0000060C, // ..**.....**. + 0x0000060C, // ..**.....**. + 0x00000318, // ...**...**.. + 0x000001F0, // ....*****... + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + }, + { // 208 + 12, 23, + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000FFE, // .*********** + 0x0000060C, // ..**.....**. + 0x0000060C, // ..**.....**. + 0x0000060C, // ..**.....**. + 0x0000060C, // ..**.....**. + 0x0000060C, // ..**.....**. + 0x0000060C, // ..**.....**. + 0x0000060C, // ..**.....**. + 0x0000060C, // ..**.....**. + 0x0000060C, // ..**.....**. + 0x0000060C, // ..**.....**. + 0x0000060C, // ..**.....**. + 0x0000060C, // ..**.....**. + 0x00000F1E, // .****...**** + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + }, + { // 209 + 12, 23, + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000FF0, // .********... + 0x00000618, // ..**....**.. + 0x0000060C, // ..**.....**. + 0x0000060C, // ..**.....**. + 0x0000060C, // ..**.....**. + 0x0000060C, // ..**.....**. + 0x0000060C, // ..**.....**. + 0x00000618, // ..**....**.. + 0x000007F0, // ..*******... + 0x00000600, // ..**........ + 0x00000600, // ..**........ + 0x00000600, // ..**........ + 0x00000600, // ..**........ + 0x00000F80, // .*****...... + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + }, + { // 210 + 0, 23, + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + }, + { // 211 + 12, 23, + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000FFC, // .**********. + 0x00000C0C, // .**......**. + 0x00000E04, // .***......*. + 0x00000604, // ..**......*. + 0x00000700, // ..***....... + 0x00000300, // ...**....... + 0x00000380, // ...***...... + 0x00000100, // ....*....... + 0x00000300, // ...**....... + 0x00000600, // ..**........ + 0x00000404, // ..*.......*. + 0x00000C04, // .**.......*. + 0x0000080C, // .*.......**. + 0x00000FFC, // .**********. + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + }, + { // 212 + 12, 23, + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000FFC, // .**********. + 0x00000CCC, // .**..**..**. + 0x000008C4, // .*...**...*. + 0x000008C4, // .*...**...*. + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000003F0, // ...******... + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + }, + { // 213 + 12, 23, + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x0000060C, // ..**.....**. + 0x00000F1E, // .****...**** + 0x00000932, // .*..*..**..* + 0x000001A0, // ....**.*.... + 0x000000E0, // .....***.... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000003F0, // ...******... + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + }, + { // 214 + 12, 23, + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x000001E0, // ....****.... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000003F0, // ...******... + 0x000006D8, // ..**.**.**.. + 0x00000CCC, // .**..**..**. + 0x00000CCC, // .**..**..**. + 0x00000CCC, // .**..**..**. + 0x00000CCC, // .**..**..**. + 0x000006D8, // ..**.**.**.. + 0x000003F0, // ...******... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000001E0, // ....****.... + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + }, + { // 215 + 12, 23, + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000F1E, // .****...**** + 0x0000060C, // ..**.....**. + 0x00000318, // ...**...**.. + 0x00000318, // ...**...**.. + 0x000001B0, // ....**.**... + 0x000001B0, // ....**.**... + 0x000000E0, // .....***.... + 0x000000E0, // .....***.... + 0x000001B0, // ....**.**... + 0x000001B0, // ....**.**... + 0x00000318, // ...**...**.. + 0x00000318, // ...**...**.. + 0x0000060C, // ..**.....**. + 0x00000F1E, // .****...**** + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + }, + { // 216 + 12, 23, + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x000001E0, // ....****.... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x00000CCC, // .**..**..**. + 0x000006D8, // ..**.**.**.. + 0x000006D8, // ..**.**.**.. + 0x000006D8, // ..**.**.**.. + 0x000006D8, // ..**.**.**.. + 0x000003F0, // ...******... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000003F0, // ...******... + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + }, + { // 217 + 12, 23, + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x000001F0, // ....*****... + 0x0000071C, // ..***...***. + 0x0000060C, // ..**.....**. + 0x00000C06, // .**.......** + 0x00000C06, // .**.......** + 0x00000C06, // .**.......** + 0x00000C06, // .**.......** + 0x00000C06, // .**.......** + 0x0000060C, // ..**.....**. + 0x0000060C, // ..**.....**. + 0x00000318, // ...**...**.. + 0x00000912, // .*..*...*..* + 0x00000F1E, // .****...**** + 0x0000071C, // ..***...***. + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + }, + { // 218 + 12, 23, + 0x00000618, // ..**....**.. + 0x00000F3C, // .****..****. + 0x00000618, // ..**....**.. + 0x00000000, // ............ + 0x000007F8, // ..********.. + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000007F8, // ..********.. + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + }, + { // 219 + 12, 23, + 0x00000618, // ..**....**.. + 0x00000F3C, // .****..****. + 0x00000618, // ..**....**.. + 0x00000000, // ............ + 0x0000060C, // ..**.....**. + 0x00000F1E, // .****...**** + 0x00000932, // .*..*..**..* + 0x000001A0, // ....**.*.... + 0x000000E0, // .....***.... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000003F0, // ...******... + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + }, + { // 220 + 12, 23, + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000060, // ......**.... + 0x00000060, // ......**.... + 0x00000040, // ......*..... + 0x00000040, // ......*..... + 0x00000000, // ............ + 0x00000000, // ............ + 0x000003C2, // ...****....* + 0x00000666, // ..**..**..** + 0x00000C64, // .**...**..*. + 0x00000C3C, // .**....****. + 0x00000C38, // .**....***.. + 0x00000C30, // .**....**... + 0x00000C38, // .**....***.. + 0x0000067A, // ..**..****.* + 0x000003CC, // ...****..**. + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + }, + { // 221 + 12, 23, + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000060, // ......**.... + 0x00000060, // ......**.... + 0x00000040, // ......*..... + 0x00000040, // ......*..... + 0x00000000, // ............ + 0x00000000, // ............ + 0x000003F0, // ...******... + 0x00000718, // ..***...**.. + 0x00000618, // ..**....**.. + 0x00000700, // ..***....... + 0x000003C0, // ...****..... + 0x00000700, // ..***....... + 0x00000608, // ..**.....*.. + 0x00000718, // ..***...**.. + 0x000003F0, // ...******... + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + }, + { // 222 + 12, 23, + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000060, // ......**.... + 0x00000060, // ......**.... + 0x00000040, // ......*..... + 0x00000040, // ......*..... + 0x00000000, // ............ + 0x00000000, // ............ + 0x000006E0, // ..**.***.... + 0x00000BB0, // .*.***.**... + 0x00000B18, // .*.**...**.. + 0x00000318, // ...**...**.. + 0x00000318, // ...**...**.. + 0x00000318, // ...**...**.. + 0x00000318, // ...**...**.. + 0x00000318, // ...**...**.. + 0x00000318, // ...**...**.. + 0x00000318, // ...**...**.. + 0x00000118, // ....*...**.. + 0x00000018, // ........**.. + 0x00000008, // .........*.. + 0x00000000, // ............ + }, + { // 223 + 12, 23, + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x00000080, // .....*...... + 0x00000080, // .....*...... + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000380, // ...***...... + 0x000004C0, // ..*..**..... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000000C8, // .....**..*.. + 0x00000070, // ......***... + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + }, + { // 224 + 12, 23, + 0x00000000, // ............ + 0x00000060, // ......**.... + 0x00000060, // ......**.... + 0x00000040, // ......*..... + 0x0000064C, // ..**..*..**. + 0x00000F1E, // .****...**** + 0x0000060C, // ..**.....**. + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000618, // ..**....**.. + 0x00000B0C, // .*.**....**. + 0x0000030C, // ...**....**. + 0x0000030C, // ...**....**. + 0x0000030C, // ...**....**. + 0x0000030C, // ...**....**. + 0x00000318, // ...**...**.. + 0x00000398, // ...***..**.. + 0x000001F0, // ....*****... + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + }, + { // 225 + 12, 23, + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x000003C2, // ...****....* + 0x00000666, // ..**..**..** + 0x00000C64, // .**...**..*. + 0x00000C3C, // .**....****. + 0x00000C38, // .**....***.. + 0x00000C30, // .**....**... + 0x00000C38, // .**....***.. + 0x0000067A, // ..**..****.* + 0x000003CC, // ...****..**. + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + }, + { // 226 + 12, 23, + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x000003E0, // ...*****.... + 0x00000670, // ..**..***... + 0x00000C30, // .**....**... + 0x00000C30, // .**....**... + 0x00000C30, // .**....**... + 0x00000C60, // .**...**.... + 0x00000DE0, // .**.****.... + 0x00000C30, // .**....**... + 0x00000C18, // .**.....**.. + 0x00000C18, // .**.....**.. + 0x00000C18, // .**.....**.. + 0x00000E18, // .***....**.. + 0x00000F30, // .****..**... + 0x00000DE0, // .**.****.... + 0x00000C00, // .**......... + 0x00000C00, // .**......... + 0x00000C00, // .**......... + 0x00000800, // .*.......... + 0x00000000, // ............ + }, + { // 227 + 12, 23, + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000302, // ...**......* + 0x00000784, // ..****....*. + 0x00000FCC, // .******..**. + 0x000008C8, // .*...**..*.. + 0x00000058, // ......*.**.. + 0x00000050, // ......*.*... + 0x00000070, // ......***... + 0x00000060, // ......**.... + 0x000000E0, // .....***.... + 0x000001C0, // ....***..... + 0x000001C0, // ....***..... + 0x000001C0, // ....***..... + 0x00000080, // .....*...... + 0x00000000, // ............ + }, + { // 228 + 12, 23, + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x000001E0, // ....****.... + 0x00000330, // ...**..**... + 0x00000318, // ...**...**.. + 0x00000180, // ....**...... + 0x000000C0, // .....**..... + 0x000003E0, // ...*****.... + 0x00000770, // ..***.***... + 0x00000630, // ..**...**... + 0x00000C18, // .**.....**.. + 0x00000C18, // .**.....**.. + 0x00000C18, // .**.....**.. + 0x00000630, // ..**...**... + 0x00000770, // ..***.***... + 0x000001C0, // ....***..... + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + }, + { // 229 + 12, 23, + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x000001F0, // ....*****... + 0x00000718, // ..***...**.. + 0x00000618, // ..**....**.. + 0x00000700, // ..***....... + 0x000003E0, // ...*****.... + 0x00000700, // ..***....... + 0x00000608, // ..**.....*.. + 0x00000718, // ..***...**.. + 0x000001F0, // ....*****... + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + }, + { // 230 + 12, 23, + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000300, // ...**....... + 0x00000300, // ...**....... + 0x0000019C, // ....**..***. + 0x000000FC, // .....******. + 0x000001F8, // ....******.. + 0x00000380, // ...***...... + 0x00000700, // ..***....... + 0x00000E00, // .***........ + 0x00000C00, // .**......... + 0x00000C00, // .**......... + 0x00000C00, // .**......... + 0x00000C00, // .**......... + 0x00000E00, // .***........ + 0x00000700, // ..***....... + 0x000003C0, // ...****..... + 0x000000F0, // .....****... + 0x00000018, // ........**.. + 0x000000C8, // .....**..*.. + 0x000000C8, // .....**..*.. + 0x00000070, // ......***... + 0x00000000, // ............ + }, + { // 231 + 12, 23, + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x000006E0, // ..**.***.... + 0x00000BB0, // .*.***.**... + 0x00000B18, // .*.**...**.. + 0x00000318, // ...**...**.. + 0x00000318, // ...**...**.. + 0x00000318, // ...**...**.. + 0x00000318, // ...**...**.. + 0x00000318, // ...**...**.. + 0x00000318, // ...**...**.. + 0x00000118, // ....*...**.. + 0x00000018, // ........**.. + 0x00000018, // ........**.. + 0x00000008, // .........*.. + 0x00000000, // ............ + }, + { // 232 + 12, 23, + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x000000E0, // .....***.... + 0x000001B0, // ....**.**... + 0x00000318, // ...**...**.. + 0x00000318, // ...**...**.. + 0x0000060C, // ..**.....**. + 0x0000060C, // ..**.....**. + 0x000007FC, // ..*********. + 0x0000060C, // ..**.....**. + 0x0000060C, // ..**.....**. + 0x0000060C, // ..**.....**. + 0x00000318, // ...**...**.. + 0x00000318, // ...**...**.. + 0x000001B0, // ....**.**... + 0x000000E0, // .....***.... + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + }, + { // 233 + 12, 23, + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000380, // ...***...... + 0x000004C0, // ..*..**..... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000000C8, // .....**..*.. + 0x00000070, // ......***... + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + }, + { // 234 + 12, 23, + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000618, // ..**....**.. + 0x00000E38, // .***...***.. + 0x00000660, // ..**..**.... + 0x000006C0, // ..**.**..... + 0x000007C0, // ..*****..... + 0x000006E0, // ..**.***.... + 0x00000670, // ..**..***... + 0x0000063A, // ..**...***.* + 0x00000F1C, // .****...***. + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + }, + { // 235 + 12, 23, + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000600, // ..**........ + 0x00000F00, // .****....... + 0x00000980, // .*..**...... + 0x00000180, // ....**...... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000001C0, // ....***..... + 0x000001E0, // ....****.... + 0x00000360, // ...**.**.... + 0x00000360, // ...**.**.... + 0x00000630, // ..**...**... + 0x00000632, // ..**...**..* + 0x00000C1E, // .**.....**** + 0x00000C0C, // .**......**. + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + }, + { // 236 + 12, 23, + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000410, // ..*.....*... + 0x00000C30, // .**....**... + 0x00000C30, // .**....**... + 0x00000C30, // .**....**... + 0x00000C30, // .**....**... + 0x00000C30, // .**....**... + 0x00000C34, // .**....**.*. + 0x00000E7C, // .***..*****. + 0x00000BC8, // .*.****..*.. + 0x00000800, // .*.......... + 0x00000800, // .*.......... + 0x00000800, // .*.......... + 0x00000800, // .*.......... + 0x00000000, // ............ + }, + { // 237 + 12, 23, + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x0000070C, // ..***....**. + 0x0000030C, // ...**....**. + 0x00000188, // ....**...*.. + 0x00000188, // ....**...*.. + 0x000000D8, // .....**.**.. + 0x000000D0, // .....**.*... + 0x00000070, // ......***... + 0x00000070, // ......***... + 0x00000030, // .......**... + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + }, + { // 238 + 12, 23, + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000180, // ....**...... + 0x00000300, // ...**....... + 0x00000338, // ...**..***.. + 0x000001F8, // ....******.. + 0x00000380, // ...***...... + 0x00000300, // ...**....... + 0x00000300, // ...**....... + 0x000001F8, // ....******.. + 0x000001F0, // ....*****... + 0x00000300, // ...**....... + 0x00000600, // ..**........ + 0x00000600, // ..**........ + 0x00000600, // ..**........ + 0x00000700, // ..***....... + 0x000003C0, // ...****..... + 0x000000F0, // .....****... + 0x00000018, // ........**.. + 0x00000188, // ....**...*.. + 0x00000198, // ....**..**.. + 0x000000F0, // .....****... + 0x00000000, // ............ + }, + { // 239 + 12, 23, + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x000001E0, // ....****.... + 0x00000738, // ..***..***.. + 0x00000618, // ..**....**.. + 0x00000C0C, // .**......**. + 0x00000C0C, // .**......**. + 0x00000C0C, // .**......**. + 0x00000618, // ..**....**.. + 0x00000738, // ..***..***.. + 0x000001E0, // ....****.... + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + }, + { // 240 + 12, 23, + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x000003FC, // ...********. + 0x000007F8, // ..********.. + 0x00000920, // .*..*..*.... + 0x00000120, // ....*..*.... + 0x00000120, // ....*..*.... + 0x00000120, // ....*..*.... + 0x00000324, // ...**..*..*. + 0x0000033C, // ...**..****. + 0x00000618, // ..**....**.. + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + }, + { // 241 + 12, 23, + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x000001E0, // ....****.... + 0x00000330, // ...**..**... + 0x00000618, // ..**....**.. + 0x00000618, // ..**....**.. + 0x00000618, // ..**....**.. + 0x00000618, // ..**....**.. + 0x00000618, // ..**....**.. + 0x00000730, // ..***..**... + 0x000006E0, // ..**.***.... + 0x00000600, // ..**........ + 0x00000600, // ..**........ + 0x00000600, // ..**........ + 0x00000600, // ..**........ + 0x00000000, // ............ + }, + { // 242 + 12, 23, + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000078, // ......****.. + 0x000000FC, // .....******. + 0x00000184, // ....**....*. + 0x00000300, // ...**....... + 0x00000300, // ...**....... + 0x00000300, // ...**....... + 0x00000380, // ...***...... + 0x000001F0, // ....*****... + 0x000000F8, // .....*****.. + 0x00000004, // ..........*. + 0x00000004, // ..........*. + 0x0000007C, // ......*****. + 0x00000078, // ......****.. + 0x00000000, // ............ + }, + { // 243 + 12, 23, + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x000001FC, // ....*******. + 0x000007E0, // ..******.... + 0x00000630, // ..**...**... + 0x00000C18, // .**.....**.. + 0x00000C18, // .**.....**.. + 0x00000C18, // .**.....**.. + 0x00000C18, // .**.....**.. + 0x00000630, // ..**...**... + 0x000003E0, // ...*****.... + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + }, + { // 244 + 12, 23, + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x000001FC, // ....*******. + 0x000003F8, // ...*******.. + 0x00000440, // ..*...*..... + 0x00000040, // ......*..... + 0x00000040, // ......*..... + 0x00000040, // ......*..... + 0x00000044, // ......*...*. + 0x00000078, // ......****.. + 0x00000030, // .......**... + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + }, + { // 245 + 12, 23, + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000618, // ..**....**.. + 0x00000B0C, // .*.**....**. + 0x0000030C, // ...**....**. + 0x0000030C, // ...**....**. + 0x0000030C, // ...**....**. + 0x0000030C, // ...**....**. + 0x00000318, // ...**...**.. + 0x00000398, // ...***..**.. + 0x000001F0, // ....*****... + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + }, + { // 246 + 12, 23, + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000040, // ......*..... + 0x00000040, // ......*..... + 0x00000040, // ......*..... + 0x00000040, // ......*..... + 0x00000040, // ......*..... + 0x000001F0, // ....*****... + 0x0000075C, // ..***.*.***. + 0x0000064C, // ..**..*..**. + 0x00000C46, // .**...*...** + 0x00000C46, // .**...*...** + 0x00000C46, // .**...*...** + 0x0000064C, // ..**..*..**. + 0x0000075C, // ..***.*.***. + 0x000001F0, // ....*****... + 0x00000040, // ......*..... + 0x00000040, // ......*..... + 0x00000040, // ......*..... + 0x00000040, // ......*..... + 0x00000000, // ............ + }, + { // 247 + 12, 23, + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000602, // ..**.......* + 0x00000F06, // .****.....** + 0x0000098C, // .*..**...**. + 0x00000198, // ....**..**.. + 0x000000D0, // .....**.*... + 0x000000F0, // .....****... + 0x00000060, // ......**.... + 0x000000E0, // .....***.... + 0x000000E0, // .....***.... + 0x000001B0, // ....**.**... + 0x00000332, // ...**..**..* + 0x0000061E, // ..**....**** + 0x00000C0C, // .**......**. + 0x00000000, // ............ + }, + { // 248 + 12, 23, + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000040, // ......*..... + 0x00000040, // ......*..... + 0x00000040, // ......*..... + 0x00000040, // ......*..... + 0x00000040, // ......*..... + 0x00000C46, // .**...*...** + 0x0000064C, // ..**..*..**. + 0x0000064C, // ..**..*..**. + 0x0000064C, // ..**..*..**. + 0x0000064C, // ..**..*..**. + 0x0000064C, // ..**..*..**. + 0x00000358, // ...**.*.**.. + 0x00000358, // ...**.*.**.. + 0x000001F0, // ....*****... + 0x00000040, // ......*..... + 0x00000040, // ......*..... + 0x00000040, // ......*..... + 0x00000040, // ......*..... + 0x00000000, // ............ + }, + { // 249 + 12, 23, + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000618, // ..**....**.. + 0x00000C0C, // .**......**. + 0x00000806, // .*........** + 0x00000806, // .*........** + 0x000008C6, // .*...**...** + 0x000008C6, // .*...**...** + 0x00000CC6, // .**..**...** + 0x00000FFC, // .**********. + 0x00000738, // ..***..***.. + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + }, + { // 250 + 12, 23, + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000618, // ..**....**.. + 0x00000F3C, // .****..****. + 0x00000618, // ..**....**.. + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000380, // ...***...... + 0x000004C0, // ..*..**..... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000000C8, // .....**..*.. + 0x00000070, // ......***... + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + }, + { // 251 + 12, 23, + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000318, // ...**...**.. + 0x000007BC, // ..****.****. + 0x00000318, // ...**...**.. + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000618, // ..**....**.. + 0x00000B0C, // .*.**....**. + 0x0000030C, // ...**....**. + 0x0000030C, // ...**....**. + 0x0000030C, // ...**....**. + 0x0000030C, // ...**....**. + 0x00000318, // ...**...**.. + 0x00000398, // ...***..**.. + 0x000001F0, // ....*****... + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + }, + { // 252 + 12, 23, + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000060, // ......**.... + 0x00000060, // ......**.... + 0x00000040, // ......*..... + 0x00000040, // ......*..... + 0x00000000, // ............ + 0x00000000, // ............ + 0x000001E0, // ....****.... + 0x00000738, // ..***..***.. + 0x00000618, // ..**....**.. + 0x00000C0C, // .**......**. + 0x00000C0C, // .**......**. + 0x00000C0C, // .**......**. + 0x00000618, // ..**....**.. + 0x00000738, // ..***..***.. + 0x000001E0, // ....****.... + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + }, + { // 253 + 12, 23, + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000060, // ......**.... + 0x00000060, // ......**.... + 0x00000040, // ......*..... + 0x00000040, // ......*..... + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000618, // ..**....**.. + 0x00000B0C, // .*.**....**. + 0x0000030C, // ...**....**. + 0x0000030C, // ...**....**. + 0x0000030C, // ...**....**. + 0x0000030C, // ...**....**. + 0x00000318, // ...**...**.. + 0x00000398, // ...***..**.. + 0x000001F0, // ....*****... + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + }, + { // 254 + 12, 23, + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000060, // ......**.... + 0x00000060, // ......**.... + 0x00000040, // ......*..... + 0x00000040, // ......*..... + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000618, // ..**....**.. + 0x00000C0C, // .**......**. + 0x00000806, // .*........** + 0x00000806, // .*........** + 0x000008C6, // .*...**...** + 0x000008C6, // .*...**...** + 0x00000CCE, // .**..**..*** + 0x00000FFC, // .**********. + 0x00000738, // ..***..***.. + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + }, + { // 255 + 12, 23, + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + }, + }; @@ -1,4 +1,4 @@ -cFont::tPixelData FontOsd[][29] = { +cFont::tPixelData FontOsd_iso8859_1[][29] = { { // 32 6, 27, 0x00000000, // ...... diff --git a/fontsml-iso8859-7.c b/fontsml-iso8859-7.c new file mode 100644 index 0000000..03943e7 --- /dev/null +++ b/fontsml-iso8859-7.c @@ -0,0 +1,4930 @@ +cFont::tPixelData FontSml_iso8859_7[][24] = { + { // 32 + 11, 19, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 33 + 11, 19, + 0x00000000, // ........... + 0x00000000, // ........... + 0x000000E0, // ....***.... + 0x000000E0, // ....***.... + 0x000000E0, // ....***.... + 0x000000E0, // ....***.... + 0x000000E0, // ....***.... + 0x000000E0, // ....***.... + 0x000000E0, // ....***.... + 0x000000E0, // ....***.... + 0x000000E0, // ....***.... + 0x00000000, // ........... + 0x00000000, // ........... + 0x000000E0, // ....***.... + 0x000000E0, // ....***.... + 0x000000E0, // ....***.... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 34 + 11, 19, + 0x00000000, // ........... + 0x00000000, // ........... + 0x000003B8, // ..***.***.. + 0x000003B8, // ..***.***.. + 0x000003B8, // ..***.***.. + 0x000003B8, // ..***.***.. + 0x00000110, // ...*...*... + 0x00000110, // ...*...*... + 0x00000110, // ...*...*... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 35 + 11, 19, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000198, // ...**..**.. + 0x00000198, // ...**..**.. + 0x00000198, // ...**..**.. + 0x000007FE, // .********** + 0x000007FE, // .********** + 0x00000198, // ...**..**.. + 0x00000198, // ...**..**.. + 0x00000198, // ...**..**.. + 0x000007FE, // .********** + 0x000007FE, // .********** + 0x00000198, // ...**..**.. + 0x00000198, // ...**..**.. + 0x00000198, // ...**..**.. + 0x00000198, // ...**..**.. + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 36 + 11, 19, + 0x00000000, // ........... + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x000000F8, // ....*****.. + 0x00000198, // ...**..**.. + 0x00000308, // ..**....*.. + 0x00000300, // ..**....... + 0x00000380, // ..***...... + 0x000001E0, // ...****.... + 0x00000078, // .....****.. + 0x0000001C, // .......***. + 0x0000000C, // ........**. + 0x0000020C, // ..*.....**. + 0x00000318, // ..**...**.. + 0x000003F0, // ..******... + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 37 + 11, 19, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000780, // .****...... + 0x00000CCC, // **..**..**. + 0x00000CCC, // **..**..**. + 0x00000CD8, // **..**.**.. + 0x000007B0, // .****.**... + 0x00000030, // ......**... + 0x00000060, // .....**.... + 0x000000C0, // ....**..... + 0x000000C0, // ....**..... + 0x000001BC, // ...**.****. + 0x00000366, // ..**.**..** + 0x00000366, // ..**.**..** + 0x00000666, // .**..**..** + 0x0000063C, // .**...****. + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 38 + 11, 19, + 0x00000000, // ........... + 0x00000000, // ........... + 0x000000E0, // ....***.... + 0x000001B0, // ...**.**... + 0x00000110, // ...*...*... + 0x00000110, // ...*...*... + 0x00000110, // ...*...*... + 0x000001B0, // ...**.**... + 0x000000E0, // ....***.... + 0x000001E6, // ...****..** + 0x00000334, // ..**..**.*. + 0x00000334, // ..**..**.*. + 0x0000031C, // ..**...***. + 0x00000308, // ..**....*.. + 0x0000019C, // ...**..***. + 0x000000F6, // ....****.** + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 39 + 11, 19, + 0x00000000, // ........... + 0x00000000, // ........... + 0x000000E0, // ....***.... + 0x000000E0, // ....***.... + 0x000000E0, // ....***.... + 0x00000060, // .....**.... + 0x000000C0, // ....**..... + 0x00000180, // ...**...... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 40 + 11, 19, + 0x00000000, // ........... + 0x00000030, // ......**... + 0x00000060, // .....**.... + 0x000000C0, // ....**..... + 0x000000C0, // ....**..... + 0x00000180, // ...**...... + 0x00000180, // ...**...... + 0x00000180, // ...**...... + 0x00000180, // ...**...... + 0x00000180, // ...**...... + 0x00000180, // ...**...... + 0x00000180, // ...**...... + 0x00000180, // ...**...... + 0x000000C0, // ....**..... + 0x000000C0, // ....**..... + 0x00000060, // .....**.... + 0x00000030, // ......**... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 41 + 11, 19, + 0x00000000, // ........... + 0x00000180, // ...**...... + 0x000000C0, // ....**..... + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x00000030, // ......**... + 0x00000030, // ......**... + 0x00000030, // ......**... + 0x00000030, // ......**... + 0x00000030, // ......**... + 0x00000030, // ......**... + 0x00000030, // ......**... + 0x00000030, // ......**... + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x000000C0, // ....**..... + 0x00000180, // ...**...... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 42 + 11, 19, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000060, // .....**.... + 0x0000036C, // ..**.**.**. + 0x0000036C, // ..**.**.**. + 0x000000F0, // ....****... + 0x000000F0, // ....****... + 0x0000036C, // ..**.**.**. + 0x0000036C, // ..**.**.**. + 0x00000060, // .....**.... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 43 + 11, 19, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x000007FE, // .********** + 0x000007FE, // .********** + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 44 + 11, 19, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x000000E0, // ....***.... + 0x000000E0, // ....***.... + 0x000000E0, // ....***.... + 0x00000060, // .....**.... + 0x000000C0, // ....**..... + 0x00000180, // ...**...... + 0x00000000, // ........... + }, + { // 45 + 11, 19, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x000007FE, // .********** + 0x000007FE, // .********** + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 46 + 11, 19, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x000000E0, // ....***.... + 0x000000E0, // ....***.... + 0x000000E0, // ....***.... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 47 + 11, 19, + 0x00000000, // ........... + 0x0000000C, // ........**. + 0x0000000C, // ........**. + 0x00000018, // .......**.. + 0x00000018, // .......**.. + 0x00000030, // ......**... + 0x00000030, // ......**... + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x000000C0, // ....**..... + 0x000000C0, // ....**..... + 0x00000180, // ...**...... + 0x00000180, // ...**...... + 0x00000300, // ..**....... + 0x00000300, // ..**....... + 0x00000600, // .**........ + 0x00000600, // .**........ + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 48 + 11, 19, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x000000E0, // ....***.... + 0x00000318, // ..**...**.. + 0x00000318, // ..**...**.. + 0x0000060C, // .**.....**. + 0x0000060C, // .**.....**. + 0x0000060C, // .**.....**. + 0x0000060C, // .**.....**. + 0x0000060C, // .**.....**. + 0x0000060C, // .**.....**. + 0x00000318, // ..**...**.. + 0x00000318, // ..**...**.. + 0x000000E0, // ....***.... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 49 + 11, 19, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000060, // .....**.... + 0x000001E0, // ...****.... + 0x00000360, // ..**.**.... + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 50 + 11, 19, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x000000F0, // ....****... + 0x00000198, // ...**..**.. + 0x0000030C, // ..**....**. + 0x0000030C, // ..**....**. + 0x0000000C, // ........**. + 0x00000018, // .......**.. + 0x00000030, // ......**... + 0x00000060, // .....**.... + 0x000000C0, // ....**..... + 0x00000180, // ...**...... + 0x00000304, // ..**.....*. + 0x000003FC, // ..********. + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 51 + 11, 19, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x000003FC, // ..********. + 0x00000018, // .......**.. + 0x00000030, // ......**... + 0x00000060, // .....**.... + 0x000000C0, // ....**..... + 0x000001F0, // ...*****... + 0x00000018, // .......**.. + 0x0000000C, // ........**. + 0x0000000C, // ........**. + 0x0000000C, // ........**. + 0x00000318, // ..**...**.. + 0x000001F0, // ...*****... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 52 + 11, 19, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000020, // ......*.... + 0x00000060, // .....**.... + 0x00000040, // .....*..... + 0x000000C0, // ....**..... + 0x00000098, // ....*..**.. + 0x00000198, // ...**..**.. + 0x00000118, // ...*...**.. + 0x00000318, // ..**...**.. + 0x000003FC, // ..********. + 0x00000018, // .......**.. + 0x00000018, // .......**.. + 0x00000018, // .......**.. + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 53 + 11, 19, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x000001FC, // ...*******. + 0x00000180, // ...**...... + 0x00000180, // ...**...... + 0x00000180, // ...**...... + 0x000001F0, // ...*****... + 0x00000018, // .......**.. + 0x0000000C, // ........**. + 0x0000000C, // ........**. + 0x0000000C, // ........**. + 0x0000000C, // ........**. + 0x00000318, // ..**...**.. + 0x000001F0, // ...*****... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 54 + 11, 19, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000038, // ......***.. + 0x000000C0, // ....**..... + 0x00000180, // ...**...... + 0x00000100, // ...*....... + 0x00000370, // ..**.***... + 0x00000398, // ..***..**.. + 0x0000030C, // ..**....**. + 0x0000030C, // ..**....**. + 0x0000030C, // ..**....**. + 0x0000030C, // ..**....**. + 0x00000198, // ...**..**.. + 0x000000F0, // ....****... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 55 + 11, 19, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x000003FC, // ..********. + 0x0000000C, // ........**. + 0x00000018, // .......**.. + 0x00000018, // .......**.. + 0x00000030, // ......**... + 0x00000030, // ......**... + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x000000C0, // ....**..... + 0x000000C0, // ....**..... + 0x000000C0, // ....**..... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 56 + 11, 19, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x000000F0, // ....****... + 0x00000198, // ...**..**.. + 0x0000030C, // ..**....**. + 0x0000030C, // ..**....**. + 0x00000198, // ...**..**.. + 0x000000F0, // ....****... + 0x00000198, // ...**..**.. + 0x0000030C, // ..**....**. + 0x0000030C, // ..**....**. + 0x0000030C, // ..**....**. + 0x00000198, // ...**..**.. + 0x000000F0, // ....****... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 57 + 11, 19, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x000000F0, // ....****... + 0x00000198, // ...**..**.. + 0x0000030C, // ..**....**. + 0x0000030C, // ..**....**. + 0x0000030C, // ..**....**. + 0x0000030C, // ..**....**. + 0x0000019C, // ...**..***. + 0x000000EC, // ....***.**. + 0x00000008, // ........*.. + 0x00000018, // .......**.. + 0x00000030, // ......**... + 0x000001C0, // ...***..... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 58 + 11, 19, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x000000E0, // ....***.... + 0x000000E0, // ....***.... + 0x000000E0, // ....***.... + 0x00000000, // ........... + 0x00000000, // ........... + 0x000000E0, // ....***.... + 0x000000E0, // ....***.... + 0x000000E0, // ....***.... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 59 + 11, 19, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x000000E0, // ....***.... + 0x000000E0, // ....***.... + 0x000000E0, // ....***.... + 0x00000000, // ........... + 0x00000000, // ........... + 0x000000E0, // ....***.... + 0x000000E0, // ....***.... + 0x000000E0, // ....***.... + 0x00000060, // .....**.... + 0x000000C0, // ....**..... + 0x00000180, // ...**...... + 0x00000000, // ........... + }, + { // 60 + 11, 19, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000018, // .......**.. + 0x00000038, // ......***.. + 0x00000070, // .....***... + 0x000000E0, // ....***.... + 0x000001C0, // ...***..... + 0x00000380, // ..***...... + 0x00000380, // ..***...... + 0x000001C0, // ...***..... + 0x000000E0, // ....***.... + 0x00000070, // .....***... + 0x00000038, // ......***.. + 0x00000018, // .......**.. + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 61 + 11, 19, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x000007FE, // .********** + 0x000007FE, // .********** + 0x00000000, // ........... + 0x00000000, // ........... + 0x000007FE, // .********** + 0x000007FE, // .********** + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 62 + 11, 19, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000300, // ..**....... + 0x00000380, // ..***...... + 0x000001C0, // ...***..... + 0x000000E0, // ....***.... + 0x00000070, // .....***... + 0x00000038, // ......***.. + 0x00000038, // ......***.. + 0x00000070, // .....***... + 0x000000E0, // ....***.... + 0x000001C0, // ...***..... + 0x00000380, // ..***...... + 0x00000300, // ..**....... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 63 + 11, 19, + 0x00000000, // ........... + 0x00000000, // ........... + 0x000000F0, // ....****... + 0x000003B8, // ..***.***.. + 0x0000031C, // ..**...***. + 0x0000031C, // ..**...***. + 0x0000001C, // .......***. + 0x00000038, // ......***.. + 0x00000070, // .....***... + 0x000000E0, // ....***.... + 0x000000E0, // ....***.... + 0x00000000, // ........... + 0x00000000, // ........... + 0x000000E0, // ....***.... + 0x000000E0, // ....***.... + 0x000000E0, // ....***.... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 64 + 11, 19, + 0x00000000, // ........... + 0x00000000, // ........... + 0x000000F0, // ....****... + 0x00000398, // ..***..**.. + 0x00000308, // ..**....*.. + 0x0000060C, // .**.....**. + 0x0000067C, // .**..*****. + 0x000006CC, // .**.**..**. + 0x000006CC, // .**.**..**. + 0x000006CC, // .**.**..**. + 0x000006CC, // .**.**..**. + 0x00000676, // .**..***.** + 0x00000600, // .**........ + 0x00000300, // ..**....... + 0x0000038C, // ..***...**. + 0x000000F8, // ....*****.. + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 65 + 11, 19, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x000000F0, // ....****... + 0x000000F0, // ....****... + 0x00000090, // ....*..*... + 0x00000198, // ...**..**.. + 0x00000198, // ...**..**.. + 0x000001F8, // ...******.. + 0x0000030C, // ..**....**. + 0x0000030C, // ..**....**. + 0x00000204, // ..*......*. + 0x0000070E, // .***....*** + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 66 + 11, 19, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x000007F0, // .*******... + 0x00000318, // ..**...**.. + 0x00000318, // ..**...**.. + 0x00000318, // ..**...**.. + 0x00000330, // ..**..**... + 0x000003F0, // ..******... + 0x00000318, // ..**...**.. + 0x0000030C, // ..**....**. + 0x0000030C, // ..**....**. + 0x0000030C, // ..**....**. + 0x00000318, // ..**...**.. + 0x000007F0, // .*******... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 67 + 11, 19, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x000000FC, // ....******. + 0x0000038C, // ..***...**. + 0x0000030C, // ..**....**. + 0x00000600, // .**........ + 0x00000600, // .**........ + 0x00000600, // .**........ + 0x00000600, // .**........ + 0x00000600, // .**........ + 0x0000060C, // .**.....**. + 0x0000030C, // ..**....**. + 0x0000039C, // ..***..***. + 0x000000F0, // ....****... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 68 + 11, 19, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x000007F0, // .*******... + 0x0000031C, // ..**...***. + 0x0000030C, // ..**....**. + 0x00000306, // ..**.....** + 0x00000306, // ..**.....** + 0x00000306, // ..**.....** + 0x00000306, // ..**.....** + 0x00000306, // ..**.....** + 0x00000306, // ..**.....** + 0x0000030C, // ..**....**. + 0x0000031C, // ..**...***. + 0x000007F0, // .*******... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 69 + 11, 19, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x000003FC, // ..********. + 0x00000184, // ...**....*. + 0x00000184, // ...**....*. + 0x00000180, // ...**...... + 0x00000190, // ...**..*... + 0x000001F0, // ...*****... + 0x00000190, // ...**..*... + 0x00000180, // ...**...... + 0x00000180, // ...**...... + 0x00000184, // ...**....*. + 0x00000184, // ...**....*. + 0x000003FC, // ..********. + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 70 + 11, 19, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x000003FC, // ..********. + 0x00000184, // ...**....*. + 0x00000184, // ...**....*. + 0x00000180, // ...**...... + 0x00000190, // ...**..*... + 0x000001F0, // ...*****... + 0x00000190, // ...**..*... + 0x00000180, // ...**...... + 0x00000180, // ...**...... + 0x00000180, // ...**...... + 0x00000180, // ...**...... + 0x000003E0, // ..*****.... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 71 + 11, 19, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x000000FC, // ....******. + 0x0000038C, // ..***...**. + 0x0000030C, // ..**....**. + 0x00000600, // .**........ + 0x00000600, // .**........ + 0x00000600, // .**........ + 0x00000600, // .**........ + 0x0000061E, // .**....**** + 0x0000060C, // .**.....**. + 0x0000030C, // ..**....**. + 0x0000039C, // ..***..***. + 0x000000F0, // ....****... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 72 + 11, 19, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x0000079E, // .****..**** + 0x0000030C, // ..**....**. + 0x0000030C, // ..**....**. + 0x0000030C, // ..**....**. + 0x0000030C, // ..**....**. + 0x000003FC, // ..********. + 0x0000030C, // ..**....**. + 0x0000030C, // ..**....**. + 0x0000030C, // ..**....**. + 0x0000030C, // ..**....**. + 0x0000030C, // ..**....**. + 0x0000079E, // .****..**** + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 73 + 11, 19, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x000001F8, // ...******.. + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x000001F8, // ...******.. + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 74 + 11, 19, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x0000007C, // .....*****. + 0x00000018, // .......**.. + 0x00000018, // .......**.. + 0x00000018, // .......**.. + 0x00000018, // .......**.. + 0x00000018, // .......**.. + 0x00000018, // .......**.. + 0x00000018, // .......**.. + 0x00000618, // .**....**.. + 0x00000618, // .**....**.. + 0x00000330, // ..**..**... + 0x000001E0, // ...****.... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 75 + 11, 19, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x0000079E, // .****..**** + 0x0000030C, // ..**....**. + 0x00000318, // ..**...**.. + 0x00000330, // ..**..**... + 0x00000360, // ..**.**.... + 0x000003E0, // ..*****.... + 0x000003B0, // ..***.**... + 0x00000330, // ..**..**... + 0x00000318, // ..**...**.. + 0x00000318, // ..**...**.. + 0x0000030C, // ..**....**. + 0x0000078E, // .****...*** + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 76 + 11, 19, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000780, // .****...... + 0x00000300, // ..**....... + 0x00000300, // ..**....... + 0x00000300, // ..**....... + 0x00000300, // ..**....... + 0x00000300, // ..**....... + 0x00000300, // ..**....... + 0x00000300, // ..**....... + 0x00000300, // ..**....... + 0x00000304, // ..**.....*. + 0x00000304, // ..**.....*. + 0x000007FC, // .*********. + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 77 + 11, 19, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000E0E, // ***.....*** + 0x0000071C, // .***...***. + 0x0000071C, // .***...***. + 0x000007BC, // .****.****. + 0x000006AC, // .**.*.*.**. + 0x000006EC, // .**.***.**. + 0x0000064C, // .**..*..**. + 0x0000064C, // .**..*..**. + 0x0000060C, // .**.....**. + 0x0000060C, // .**.....**. + 0x0000060C, // .**.....**. + 0x00000F1E, // ****...**** + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 78 + 11, 19, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x0000071E, // .***...**** + 0x0000038C, // ..***...**. + 0x0000038C, // ..***...**. + 0x000003CC, // ..****..**. + 0x0000034C, // ..**.*..**. + 0x0000036C, // ..**.**.**. + 0x0000036C, // ..**.**.**. + 0x0000032C, // ..**..*.**. + 0x0000033C, // ..**..****. + 0x0000031C, // ..**...***. + 0x0000031C, // ..**...***. + 0x0000078C, // .****...**. + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 79 + 11, 19, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x000000F0, // ....****... + 0x0000039C, // ..***..***. + 0x0000030C, // ..**....**. + 0x00000606, // .**......** + 0x00000606, // .**......** + 0x00000606, // .**......** + 0x00000606, // .**......** + 0x00000606, // .**......** + 0x00000606, // .**......** + 0x0000030C, // ..**....**. + 0x0000039C, // ..***..***. + 0x000000F0, // ....****... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 80 + 11, 19, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x000007F0, // .*******... + 0x00000318, // ..**...**.. + 0x0000030C, // ..**....**. + 0x0000030C, // ..**....**. + 0x0000030C, // ..**....**. + 0x00000318, // ..**...**.. + 0x000003F0, // ..******... + 0x00000300, // ..**....... + 0x00000300, // ..**....... + 0x00000300, // ..**....... + 0x00000300, // ..**....... + 0x000007C0, // .*****..... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 81 + 11, 19, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x000000F0, // ....****... + 0x0000039C, // ..***..***. + 0x0000030C, // ..**....**. + 0x00000606, // .**......** + 0x00000606, // .**......** + 0x00000606, // .**......** + 0x00000606, // .**......** + 0x00000606, // .**......** + 0x00000606, // .**......** + 0x0000030C, // ..**....**. + 0x0000039C, // ..***..***. + 0x000000F0, // ....****... + 0x00000030, // ......**... + 0x00000018, // .......**.. + 0x0000000C, // ........**. + 0x00000000, // ........... + }, + { // 82 + 11, 19, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x000007F0, // .*******... + 0x00000318, // ..**...**.. + 0x00000318, // ..**...**.. + 0x00000318, // ..**...**.. + 0x00000318, // ..**...**.. + 0x000003F0, // ..******... + 0x00000360, // ..**.**.... + 0x00000330, // ..**..**... + 0x00000318, // ..**...**.. + 0x00000318, // ..**...**.. + 0x0000030C, // ..**....**. + 0x0000078E, // .****...*** + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 83 + 11, 19, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x000000FC, // ....******. + 0x0000018C, // ...**...**. + 0x00000304, // ..**.....*. + 0x00000300, // ..**....... + 0x00000380, // ..***...... + 0x000001E0, // ...****.... + 0x00000078, // .....****.. + 0x0000001C, // .......***. + 0x0000000C, // ........**. + 0x0000020C, // ..*.....**. + 0x00000318, // ..**...**.. + 0x000003F0, // ..******... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 84 + 11, 19, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x000007FE, // .********** + 0x00000462, // .*...**...* + 0x00000462, // .*...**...* + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x000001F8, // ...******.. + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 85 + 11, 19, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x0000079E, // .****..**** + 0x0000030C, // ..**....**. + 0x0000030C, // ..**....**. + 0x0000030C, // ..**....**. + 0x0000030C, // ..**....**. + 0x0000030C, // ..**....**. + 0x0000030C, // ..**....**. + 0x0000030C, // ..**....**. + 0x0000030C, // ..**....**. + 0x0000030C, // ..**....**. + 0x00000198, // ...**..**.. + 0x000000F0, // ....****... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 86 + 11, 19, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x0000079E, // .****..**** + 0x00000204, // ..*......*. + 0x0000030C, // ..**....**. + 0x0000030C, // ..**....**. + 0x00000108, // ...*....*.. + 0x00000198, // ...**..**.. + 0x00000198, // ...**..**.. + 0x00000090, // ....*..*... + 0x000000F0, // ....****... + 0x000000F0, // ....****... + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 87 + 11, 19, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000E0E, // ***.....*** + 0x0000060C, // .**.....**. + 0x0000060C, // .**.....**. + 0x0000064C, // .**..*..**. + 0x0000064C, // .**..*..**. + 0x000006EC, // .**.***.**. + 0x000006EC, // .**.***.**. + 0x000003B8, // ..***.***.. + 0x000003B8, // ..***.***.. + 0x00000318, // ..**...**.. + 0x00000318, // ..**...**.. + 0x00000318, // ..**...**.. + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 88 + 11, 19, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x0000079E, // .****..**** + 0x0000030C, // ..**....**. + 0x00000198, // ...**..**.. + 0x00000090, // ....*..*... + 0x000000F0, // ....****... + 0x00000060, // .....**.... + 0x000000F0, // ....****... + 0x000000F0, // ....****... + 0x00000198, // ...**..**.. + 0x00000198, // ...**..**.. + 0x0000030C, // ..**....**. + 0x0000079E, // .****..**** + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 89 + 11, 19, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x0000079E, // .****..**** + 0x0000030C, // ..**....**. + 0x00000108, // ...*....*.. + 0x00000198, // ...**..**.. + 0x00000090, // ....*..*... + 0x000000F0, // ....****... + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x000001F8, // ...******.. + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 90 + 11, 19, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x000003FC, // ..********. + 0x0000020C, // ..*.....**. + 0x00000218, // ..*....**.. + 0x00000030, // ......**... + 0x00000030, // ......**... + 0x00000060, // .....**.... + 0x000000C0, // ....**..... + 0x000000C0, // ....**..... + 0x00000180, // ...**...... + 0x00000304, // ..**.....*. + 0x00000304, // ..**.....*. + 0x000003FC, // ..********. + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 91 + 11, 19, + 0x00000000, // ........... + 0x000000F8, // ....*****.. + 0x000000C0, // ....**..... + 0x000000C0, // ....**..... + 0x000000C0, // ....**..... + 0x000000C0, // ....**..... + 0x000000C0, // ....**..... + 0x000000C0, // ....**..... + 0x000000C0, // ....**..... + 0x000000C0, // ....**..... + 0x000000C0, // ....**..... + 0x000000C0, // ....**..... + 0x000000C0, // ....**..... + 0x000000C0, // ....**..... + 0x000000C0, // ....**..... + 0x000000C0, // ....**..... + 0x000000F8, // ....*****.. + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 92 + 11, 19, + 0x00000000, // ........... + 0x00000600, // .**........ + 0x00000600, // .**........ + 0x00000300, // ..**....... + 0x00000300, // ..**....... + 0x00000180, // ...**...... + 0x00000180, // ...**...... + 0x000000C0, // ....**..... + 0x000000C0, // ....**..... + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x00000030, // ......**... + 0x00000030, // ......**... + 0x00000018, // .......**.. + 0x00000018, // .......**.. + 0x0000000C, // ........**. + 0x0000000C, // ........**. + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 93 + 11, 19, + 0x00000000, // ........... + 0x000001F0, // ...*****... + 0x00000030, // ......**... + 0x00000030, // ......**... + 0x00000030, // ......**... + 0x00000030, // ......**... + 0x00000030, // ......**... + 0x00000030, // ......**... + 0x00000030, // ......**... + 0x00000030, // ......**... + 0x00000030, // ......**... + 0x00000030, // ......**... + 0x00000030, // ......**... + 0x00000030, // ......**... + 0x00000030, // ......**... + 0x00000030, // ......**... + 0x000001F0, // ...*****... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 94 + 11, 19, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000060, // .....**.... + 0x000000F0, // ....****... + 0x00000198, // ...**..**.. + 0x00000204, // ..*......*. + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 95 + 11, 19, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000FFE, // *********** + 0x00000FFE, // *********** + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 96 + 11, 19, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000030, // ......**... + 0x00000060, // .....**.... + 0x000000C0, // ....**..... + 0x000000E0, // ....***.... + 0x000000E0, // ....***.... + 0x000000E0, // ....***.... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 97 + 11, 19, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x000000F8, // ....*****.. + 0x0000018C, // ...**...**. + 0x0000000C, // ........**. + 0x000000FC, // ....******. + 0x0000018C, // ...**...**. + 0x0000030C, // ..**....**. + 0x0000031C, // ..**...***. + 0x000001EE, // ...****.*** + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 98 + 11, 19, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000300, // ..**....... + 0x00000700, // .***....... + 0x00000300, // ..**....... + 0x00000300, // ..**....... + 0x00000370, // ..**.***... + 0x00000398, // ..***..**.. + 0x0000030C, // ..**....**. + 0x0000030C, // ..**....**. + 0x0000030C, // ..**....**. + 0x0000030C, // ..**....**. + 0x00000398, // ..***..**.. + 0x00000370, // ..**.***... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 99 + 11, 19, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x000000FC, // ....******. + 0x0000018C, // ...**...**. + 0x0000030C, // ..**....**. + 0x00000300, // ..**....... + 0x00000300, // ..**....... + 0x00000300, // ..**....... + 0x0000018C, // ...**...**. + 0x000000F8, // ....*****.. + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 100 + 11, 19, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x0000000C, // ........**. + 0x0000001C, // .......***. + 0x0000000C, // ........**. + 0x0000000C, // ........**. + 0x000000EC, // ....***.**. + 0x0000019C, // ...**..***. + 0x0000030C, // ..**....**. + 0x0000030C, // ..**....**. + 0x0000030C, // ..**....**. + 0x0000030C, // ..**....**. + 0x0000019C, // ...**..***. + 0x000000EE, // ....***.*** + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 101 + 11, 19, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x000000F0, // ....****... + 0x00000198, // ...**..**.. + 0x0000030C, // ..**....**. + 0x000003FC, // ..********. + 0x00000300, // ..**....... + 0x00000300, // ..**....... + 0x0000018C, // ...**...**. + 0x000000F8, // ....*****.. + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 102 + 11, 19, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000078, // .....****.. + 0x000000C0, // ....**..... + 0x000000C0, // ....**..... + 0x000000C0, // ....**..... + 0x000003F8, // ..*******.. + 0x000000C0, // ....**..... + 0x000000C0, // ....**..... + 0x000000C0, // ....**..... + 0x000000C0, // ....**..... + 0x000000C0, // ....**..... + 0x000000C0, // ....**..... + 0x000003F8, // ..*******.. + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 103 + 11, 19, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x000001F0, // ...*****... + 0x0000031C, // ..**...***. + 0x00000318, // ..**...**.. + 0x00000318, // ..**...**.. + 0x000001F0, // ...*****... + 0x00000300, // ..**....... + 0x000001FC, // ...*******. + 0x00000306, // ..**.....** + 0x00000306, // ..**.....** + 0x0000030C, // ..**....**. + 0x000001F8, // ...******.. + 0x00000000, // ........... + }, + { // 104 + 11, 19, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000300, // ..**....... + 0x00000700, // .***....... + 0x00000300, // ..**....... + 0x00000300, // ..**....... + 0x00000378, // ..**.****.. + 0x0000038C, // ..***...**. + 0x0000030C, // ..**....**. + 0x0000030C, // ..**....**. + 0x0000030C, // ..**....**. + 0x0000030C, // ..**....**. + 0x0000030C, // ..**....**. + 0x0000079E, // .****..**** + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 105 + 11, 19, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000040, // .....*..... + 0x000000E0, // ....***.... + 0x00000040, // .....*..... + 0x00000000, // ........... + 0x00000060, // .....**.... + 0x000003E0, // ..*****.... + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x000003FC, // ..********. + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 106 + 11, 19, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000020, // ......*.... + 0x00000070, // .....***... + 0x00000020, // ......*.... + 0x00000000, // ........... + 0x00000030, // ......**... + 0x000001F0, // ...*****... + 0x00000030, // ......**... + 0x00000030, // ......**... + 0x00000030, // ......**... + 0x00000030, // ......**... + 0x00000030, // ......**... + 0x00000030, // ......**... + 0x00000030, // ......**... + 0x00000630, // .**...**... + 0x000003E0, // ..*****.... + 0x00000000, // ........... + }, + { // 107 + 11, 19, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000300, // ..**....... + 0x00000700, // .***....... + 0x00000300, // ..**....... + 0x00000300, // ..**....... + 0x0000033C, // ..**..****. + 0x00000310, // ..**...*... + 0x00000320, // ..**..*.... + 0x00000340, // ..**.*..... + 0x000003E0, // ..*****.... + 0x00000330, // ..**..**... + 0x00000318, // ..**...**.. + 0x0000078E, // .****...*** + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 108 + 11, 19, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000060, // .....**.... + 0x000001E0, // ...****.... + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x000001F8, // ...******.. + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 109 + 11, 19, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x000006DC, // .**.**.***. + 0x00000F76, // ****.***.** + 0x00000666, // .**..**..** + 0x00000666, // .**..**..** + 0x00000666, // .**..**..** + 0x00000666, // .**..**..** + 0x00000666, // .**..**..** + 0x00000EEE, // ***.***.*** + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 110 + 11, 19, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000378, // ..**.****.. + 0x0000078C, // .****...**. + 0x0000030C, // ..**....**. + 0x0000030C, // ..**....**. + 0x0000030C, // ..**....**. + 0x0000030C, // ..**....**. + 0x0000030C, // ..**....**. + 0x0000079E, // .****..**** + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 111 + 11, 19, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x000000F0, // ....****... + 0x00000198, // ...**..**.. + 0x0000030C, // ..**....**. + 0x0000030C, // ..**....**. + 0x0000030C, // ..**....**. + 0x0000030C, // ..**....**. + 0x00000198, // ...**..**.. + 0x000000F0, // ....****... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 112 + 11, 19, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000370, // ..**.***... + 0x00000798, // .****..**.. + 0x0000030C, // ..**....**. + 0x0000030C, // ..**....**. + 0x0000030C, // ..**....**. + 0x0000030C, // ..**....**. + 0x00000398, // ..***..**.. + 0x00000370, // ..**.***... + 0x00000300, // ..**....... + 0x00000300, // ..**....... + 0x000007C0, // .*****..... + 0x00000000, // ........... + }, + { // 113 + 11, 19, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x000001E8, // ...****.*.. + 0x00000318, // ..**...**.. + 0x00000618, // .**....**.. + 0x00000618, // .**....**.. + 0x00000618, // .**....**.. + 0x00000618, // .**....**.. + 0x00000338, // ..**..***.. + 0x000001D8, // ...***.**.. + 0x00000018, // .......**.. + 0x00000018, // .......**.. + 0x0000007C, // .....*****. + 0x00000000, // ........... + }, + { // 114 + 11, 19, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x0000019C, // ...**..***. + 0x000003AC, // ..***.*.**. + 0x000001C0, // ...***..... + 0x00000180, // ...**...... + 0x00000180, // ...**...... + 0x00000180, // ...**...... + 0x00000180, // ...**...... + 0x000003E0, // ..*****.... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 115 + 11, 19, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x000001F8, // ...******.. + 0x0000030C, // ..**....**. + 0x00000300, // ..**....... + 0x000001E0, // ...****.... + 0x00000038, // ......***.. + 0x0000020C, // ..*.....**. + 0x0000030C, // ..**....**. + 0x000001F8, // ...******.. + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 116 + 11, 19, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000180, // ...**...... + 0x00000180, // ...**...... + 0x00000180, // ...**...... + 0x000007F8, // .********.. + 0x00000180, // ...**...... + 0x00000180, // ...**...... + 0x00000180, // ...**...... + 0x00000180, // ...**...... + 0x00000180, // ...**...... + 0x0000018C, // ...**...**. + 0x000000F0, // ....****... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 117 + 11, 19, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x0000030C, // ..**....**. + 0x0000071C, // .***...***. + 0x0000030C, // ..**....**. + 0x0000030C, // ..**....**. + 0x0000030C, // ..**....**. + 0x0000030C, // ..**....**. + 0x0000031E, // ..**...**** + 0x000001EC, // ...****.**. + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 118 + 11, 19, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x0000079E, // .****..**** + 0x0000030C, // ..**....**. + 0x00000108, // ...*....*.. + 0x00000198, // ...**..**.. + 0x00000090, // ....*..*... + 0x000000F0, // ....****... + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 119 + 11, 19, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000E0E, // ***.....*** + 0x00000404, // .*.......*. + 0x0000064C, // .**..*..**. + 0x000006EC, // .**.***.**. + 0x000002A8, // ..*.*.*.*.. + 0x000003B8, // ..***.***.. + 0x00000318, // ..**...**.. + 0x00000110, // ...*...*... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 120 + 11, 19, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x000007BC, // .****.****. + 0x00000318, // ..**...**.. + 0x000001B0, // ...**.**... + 0x000000E0, // ....***.... + 0x000000E0, // ....***.... + 0x000001B0, // ...**.**... + 0x00000318, // ..**...**.. + 0x000007BC, // .****.****. + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 121 + 11, 19, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x0000079E, // .****..**** + 0x0000030C, // ..**....**. + 0x00000108, // ...*....*.. + 0x00000198, // ...**..**.. + 0x00000090, // ....*..*... + 0x000000F0, // ....****... + 0x00000060, // .....**.... + 0x00000040, // .....*..... + 0x000000C0, // ....**..... + 0x00000680, // .**.*...... + 0x00000700, // .***....... + 0x00000000, // ........... + }, + { // 122 + 11, 19, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x000003F8, // ..*******.. + 0x00000218, // ..*....**.. + 0x00000030, // ......**... + 0x00000060, // .....**.... + 0x000000C0, // ....**..... + 0x00000180, // ...**...... + 0x00000308, // ..**....*.. + 0x000003F8, // ..*******.. + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 123 + 11, 19, + 0x00000000, // ........... + 0x00000038, // ......***.. + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x000000C0, // ....**..... + 0x00000380, // ..***...... + 0x000000C0, // ....**..... + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x00000038, // ......***.. + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 124 + 11, 19, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 125 + 11, 19, + 0x00000000, // ........... + 0x000001C0, // ...***..... + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x00000030, // ......**... + 0x0000001C, // .......***. + 0x00000030, // ......**... + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x000001C0, // ...***..... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 126 + 11, 19, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000180, // ...**...... + 0x000003C6, // ..****...** + 0x000007FE, // .********** + 0x0000063C, // .**...****. + 0x00000018, // .......**.. + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 127 + 11, 19, + 0x00000CCC, // **..**..**. + 0x00000CCC, // **..**..**. + 0x00000332, // ..**..**..* + 0x00000332, // ..**..**..* + 0x00000CCC, // **..**..**. + 0x00000CCC, // **..**..**. + 0x00000332, // ..**..**..* + 0x00000332, // ..**..**..* + 0x00000CCC, // **..**..**. + 0x00000CCC, // **..**..**. + 0x00000332, // ..**..**..* + 0x00000332, // ..**..**..* + 0x00000CCC, // **..**..**. + 0x00000CCC, // **..**..**. + 0x00000332, // ..**..**..* + 0x00000332, // ..**..**..* + 0x00000CCC, // **..**..**. + 0x00000CCC, // **..**..**. + 0x00000332, // ..**..**..* + }, + { // 128 + 0, 19, + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + }, + { // 129 + 0, 19, + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + }, + { // 130 + 0, 19, + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + }, + { // 131 + 0, 19, + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + }, + { // 132 + 0, 19, + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + }, + { // 133 + 0, 19, + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + }, + { // 134 + 0, 19, + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + }, + { // 135 + 0, 19, + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + }, + { // 136 + 0, 19, + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + }, + { // 137 + 0, 19, + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + }, + { // 138 + 0, 19, + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + }, + { // 139 + 0, 19, + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + }, + { // 140 + 0, 19, + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + }, + { // 141 + 0, 19, + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + }, + { // 142 + 0, 19, + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + }, + { // 143 + 0, 19, + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + }, + { // 144 + 0, 19, + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + }, + { // 145 + 0, 19, + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + }, + { // 146 + 0, 19, + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + }, + { // 147 + 0, 19, + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + }, + { // 148 + 0, 19, + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + }, + { // 149 + 0, 19, + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + }, + { // 150 + 0, 19, + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + }, + { // 151 + 0, 19, + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + }, + { // 152 + 0, 19, + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + }, + { // 153 + 0, 19, + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + }, + { // 154 + 0, 19, + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + }, + { // 155 + 0, 19, + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + }, + { // 156 + 0, 19, + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + }, + { // 157 + 0, 19, + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + }, + { // 158 + 0, 19, + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + }, + { // 159 + 0, 19, + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + }, + { // 160 + 11, 19, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 161 + 11, 19, + 0x000000E0, // ....***.... + 0x000000E0, // ....***.... + 0x000000E0, // ....***.... + 0x00000080, // ....*...... + 0x000000C0, // ....**..... + 0x00000060, // .....**.... + 0x00000030, // ......**... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 162 + 11, 19, + 0x00000070, // .....***... + 0x00000070, // .....***... + 0x00000070, // .....***... + 0x00000010, // .......*... + 0x00000030, // ......**... + 0x00000060, // .....**.... + 0x000000C0, // ....**..... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 163 + 11, 19, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000078, // .....****.. + 0x000000CC, // ....**..**. + 0x00000180, // ...**...... + 0x00000180, // ...**...... + 0x00000180, // ...**...... + 0x000003F0, // ..******... + 0x00000180, // ...**...... + 0x00000180, // ...**...... + 0x00000180, // ...**...... + 0x00000180, // ...**...... + 0x000003EC, // ..*****.**. + 0x00000338, // ..**..***.. + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 164 + 0, 19, + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + }, + { // 165 + 0, 19, + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + }, + { // 166 + 11, 19, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 167 + 11, 19, + 0x00000000, // ........... + 0x00000000, // ........... + 0x000000F0, // ....****... + 0x00000198, // ...**..**.. + 0x00000198, // ...**..**.. + 0x000000C0, // ....**..... + 0x000000E0, // ....***.... + 0x000001B0, // ...**.**... + 0x00000118, // ...*...**.. + 0x00000188, // ...**...*.. + 0x000000D8, // ....**.**.. + 0x00000070, // .....***... + 0x00000030, // ......**... + 0x00000198, // ...**..**.. + 0x00000198, // ...**..**.. + 0x000000F0, // ....****... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 168 + 11, 19, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000198, // ...**..**.. + 0x00000198, // ...**..**.. + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 169 + 11, 19, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x000000F0, // ....****... + 0x00000108, // ...*....*.. + 0x00000264, // ..*..**..*. + 0x00000294, // ..*.*..*.*. + 0x00000284, // ..*.*....*. + 0x00000264, // ..*..**..*. + 0x00000108, // ...*....*.. + 0x000000F0, // ....****... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 170 + 0, 19, + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + }, + { // 171 + 11, 19, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000044, // .....*...*. + 0x000000CC, // ....**..**. + 0x00000198, // ...**..**.. + 0x00000330, // ..**..**... + 0x00000660, // .**..**.... + 0x00000660, // .**..**.... + 0x00000330, // ..**..**... + 0x00000198, // ...**..**.. + 0x000000CC, // ....**..**. + 0x00000044, // .....*...*. + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 172 + 11, 19, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x000007FE, // .********** + 0x000007FE, // .********** + 0x00000006, // .........** + 0x00000006, // .........** + 0x00000006, // .........** + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 173 + 11, 19, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x000001F8, // ...******.. + 0x000001F8, // ...******.. + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 174 + 0, 19, + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + }, + { // 175 + 11, 19, + 0x00000FFE, // *********** + 0x00000FFE, // *********** + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 176 + 11, 19, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x000000F0, // ....****... + 0x00000198, // ...**..**.. + 0x00000198, // ...**..**.. + 0x00000198, // ...**..**.. + 0x000000F0, // ....****... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 177 + 11, 19, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x000007FE, // .********** + 0x000007FE, // .********** + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x00000000, // ........... + 0x000007FE, // .********** + 0x000007FE, // .********** + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 178 + 11, 19, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x000000F0, // ....****... + 0x00000198, // ...**..**.. + 0x00000198, // ...**..**.. + 0x00000030, // ......**... + 0x00000060, // .....**.... + 0x000000C0, // ....**..... + 0x00000188, // ...**...*.. + 0x000001F8, // ...******.. + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 179 + 11, 19, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x000000F0, // ....****... + 0x00000198, // ...**..**.. + 0x00000018, // .......**.. + 0x00000070, // .....***... + 0x00000018, // .......**.. + 0x00000018, // .......**.. + 0x00000198, // ...**..**.. + 0x000000F0, // ....****... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 180 + 11, 19, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x00000040, // .....*..... + 0x00000040, // .....*..... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 181 + 11, 19, + 0x000000C0, // ....**..... + 0x000000C0, // ....**..... + 0x00000080, // ....*...... + 0x000006B0, // .**.*.**... + 0x00000630, // .**...**... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 182 + 11, 19, + 0x00000600, // .**........ + 0x00000600, // .**........ + 0x00000400, // .*......... + 0x000004C0, // .*..**..... + 0x000000C0, // ....**..... + 0x000000E0, // ....***.... + 0x000001E0, // ...****.... + 0x00000130, // ...*..**... + 0x00000330, // ..**..**... + 0x00000318, // ..**...**.. + 0x000003F8, // ..*******.. + 0x00000618, // .**....**.. + 0x0000060C, // .**.....**. + 0x0000040C, // .*......**. + 0x00000F1E, // ****...**** + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 183 + 11, 19, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 184 + 11, 19, + 0x00000600, // .**........ + 0x00000600, // .**........ + 0x00000400, // .*......... + 0x000005FE, // .*.******** + 0x000000C2, // ....**....* + 0x000000C2, // ....**....* + 0x000000C0, // ....**..... + 0x000000C4, // ....**...*. + 0x000000FC, // ....******. + 0x000000C4, // ....**...*. + 0x000000C0, // ....**..... + 0x000000C0, // ....**..... + 0x000000C2, // ....**....* + 0x000000C2, // ....**....* + 0x000001FE, // ...******** + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 185 + 11, 19, + 0x00000600, // .**........ + 0x00000600, // .**........ + 0x00000400, // .*......... + 0x0000079E, // .****..**** + 0x0000030C, // ..**....**. + 0x0000030C, // ..**....**. + 0x0000030C, // ..**....**. + 0x0000030C, // ..**....**. + 0x000003FC, // ..********. + 0x0000030C, // ..**....**. + 0x0000030C, // ..**....**. + 0x0000030C, // ..**....**. + 0x0000030C, // ..**....**. + 0x0000030C, // ..**....**. + 0x0000079E, // .****..**** + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 186 + 11, 19, + 0x00000600, // .**........ + 0x00000600, // .**........ + 0x00000400, // .*......... + 0x000005F8, // .*.******.. + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x000001F8, // ...******.. + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 187 + 11, 19, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000440, // .*...*..... + 0x00000660, // .**..**.... + 0x00000330, // ..**..**... + 0x00000198, // ...**..**.. + 0x000000CC, // ....**..**. + 0x000000CC, // ....**..**. + 0x00000198, // ...**..**.. + 0x00000330, // ..**..**... + 0x00000660, // .**..**.... + 0x00000440, // .*...*..... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 188 + 11, 19, + 0x00000600, // .**........ + 0x00000600, // .**........ + 0x00000400, // .*......... + 0x000004F0, // .*..****... + 0x0000039C, // ..***..***. + 0x0000030C, // ..**....**. + 0x00000606, // .**......** + 0x00000606, // .**......** + 0x00000606, // .**......** + 0x00000606, // .**......** + 0x00000606, // .**......** + 0x00000606, // .**......** + 0x0000030C, // ..**....**. + 0x0000039C, // ..***..***. + 0x000000F0, // ....****... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 189 + 11, 19, + 0x00000300, // ..**....... + 0x00000F00, // ****....... + 0x00000300, // ..**....... + 0x00000300, // ..**....... + 0x00000300, // ..**....... + 0x00000300, // ..**....... + 0x00000306, // ..**.....** + 0x0000031C, // ..**...***. + 0x00000070, // .....***... + 0x000001C0, // ...***..... + 0x0000073C, // .***..****. + 0x00000C66, // **...**..** + 0x00000066, // .....**..** + 0x0000000C, // ........**. + 0x00000018, // .......**.. + 0x00000030, // ......**... + 0x00000062, // .....**...* + 0x0000007E, // .....****** + 0x00000000, // ........... + }, + { // 190 + 11, 19, + 0x00000300, // ..**....... + 0x00000600, // .**........ + 0x00000400, // .*......... + 0x0000030C, // ..**....**. + 0x0000079E, // .****..**** + 0x00000492, // .*..*..*..* + 0x000000F0, // ....****... + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x000001F8, // ...******.. + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 191 + 11, 19, + 0x00000600, // .**........ + 0x00000600, // .**........ + 0x00000400, // .*......... + 0x000004F0, // .*..****... + 0x0000039C, // ..***..***. + 0x0000030C, // ..**....**. + 0x00000606, // .**......** + 0x00000606, // .**......** + 0x00000606, // .**......** + 0x00000606, // .**......** + 0x0000030C, // ..**....**. + 0x00000198, // ...**..**.. + 0x00000492, // .*..*..*..* + 0x0000079E, // .****..**** + 0x0000039C, // ..***..***. + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 192 + 11, 19, + 0x00000030, // ......**... + 0x00000030, // ......**... + 0x00000020, // ......*.... + 0x000001AC, // ...**.*.**. + 0x0000018C, // ...**...**. + 0x00000000, // ........... + 0x00000000, // ........... + 0x000001C0, // ...***..... + 0x00000260, // ..*..**.... + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x00000064, // .....**..*. + 0x00000038, // ......***.. + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 193 + 11, 19, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x000000C0, // ....**..... + 0x000000C0, // ....**..... + 0x000000E0, // ....***.... + 0x000001E0, // ...****.... + 0x00000130, // ...*..**... + 0x00000330, // ..**..**... + 0x00000318, // ..**...**.. + 0x000003F8, // ..*******.. + 0x00000618, // .**....**.. + 0x0000060C, // .**.....**. + 0x0000040C, // .*......**. + 0x00000F1E, // ****...**** + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 194 + 11, 19, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x000007F0, // .*******... + 0x00000338, // ..**..***.. + 0x00000318, // ..**...**.. + 0x00000318, // ..**...**.. + 0x00000330, // ..**..**... + 0x000003F0, // ..******... + 0x00000318, // ..**...**.. + 0x0000030C, // ..**....**. + 0x0000030C, // ..**....**. + 0x0000030C, // ..**....**. + 0x00000318, // ..**...**.. + 0x000007F0, // .*******... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 195 + 11, 19, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x000003FC, // ..********. + 0x00000184, // ...**....*. + 0x00000184, // ...**....*. + 0x00000180, // ...**...... + 0x00000180, // ...**...... + 0x00000180, // ...**...... + 0x00000180, // ...**...... + 0x00000180, // ...**...... + 0x00000180, // ...**...... + 0x00000180, // ...**...... + 0x00000180, // ...**...... + 0x000003E0, // ..*****.... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 196 + 11, 19, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x000000C0, // ....**..... + 0x000000C0, // ....**..... + 0x000000E0, // ....***.... + 0x000001E0, // ...****.... + 0x00000160, // ...*.**.... + 0x00000130, // ...*..**... + 0x00000330, // ..**..**... + 0x00000230, // ..*...**... + 0x00000218, // ..*....**.. + 0x00000618, // .**....**.. + 0x000007FC, // .*********. + 0x000007FC, // .*********. + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 197 + 11, 19, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x000003FC, // ..********. + 0x00000184, // ...**....*. + 0x00000184, // ...**....*. + 0x00000180, // ...**...... + 0x00000188, // ...**...*.. + 0x000001F8, // ...******.. + 0x00000188, // ...**...*.. + 0x00000180, // ...**...... + 0x00000180, // ...**...... + 0x00000184, // ...**....*. + 0x00000184, // ...**....*. + 0x000003FC, // ..********. + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 198 + 11, 19, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x000003FC, // ..********. + 0x0000020C, // ..*.....**. + 0x00000218, // ..*....**.. + 0x00000030, // ......**... + 0x00000030, // ......**... + 0x00000060, // .....**.... + 0x000000C0, // ....**..... + 0x000000C0, // ....**..... + 0x00000180, // ...**...... + 0x00000304, // ..**.....*. + 0x00000304, // ..**.....*. + 0x000003FC, // ..********. + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 199 + 11, 19, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x0000079E, // .****..**** + 0x0000030C, // ..**....**. + 0x0000030C, // ..**....**. + 0x0000030C, // ..**....**. + 0x0000030C, // ..**....**. + 0x000003FC, // ..********. + 0x0000030C, // ..**....**. + 0x0000030C, // ..**....**. + 0x0000030C, // ..**....**. + 0x0000030C, // ..**....**. + 0x0000030C, // ..**....**. + 0x0000079E, // .****..**** + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 200 + 11, 19, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x000000F0, // ....****... + 0x0000039C, // ..***..***. + 0x0000030C, // ..**....**. + 0x00000606, // .**......** + 0x00000696, // .**.*..*.** + 0x000006F6, // .**.****.** + 0x000006F6, // .**.****.** + 0x00000696, // .**.*..*.** + 0x00000606, // .**......** + 0x0000030C, // ..**....**. + 0x0000039C, // ..***..***. + 0x000000F0, // ....****... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 201 + 11, 19, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x000001F8, // ...******.. + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x000001F8, // ...******.. + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 202 + 11, 19, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x0000079E, // .****..**** + 0x0000030C, // ..**....**. + 0x00000318, // ..**...**.. + 0x00000330, // ..**..**... + 0x00000360, // ..**.**.... + 0x000003E0, // ..*****.... + 0x000003B0, // ..***.**... + 0x00000330, // ..**..**... + 0x00000318, // ..**...**.. + 0x00000318, // ..**...**.. + 0x0000030C, // ..**....**. + 0x0000079E, // .****..**** + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 203 + 11, 19, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x000000C0, // ....**..... + 0x000000C0, // ....**..... + 0x000000E0, // ....***.... + 0x000001E0, // ...****.... + 0x00000130, // ...*..**... + 0x00000330, // ..**..**... + 0x00000218, // ..*....**.. + 0x00000218, // ..*....**.. + 0x00000618, // .**....**.. + 0x0000040C, // .*......**. + 0x0000040C, // .*......**. + 0x00000F1E, // ****...**** + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 204 + 11, 19, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000E0E, // ***.....*** + 0x0000060C, // .**.....**. + 0x0000071C, // .***...***. + 0x0000071C, // .***...***. + 0x0000071C, // .***...***. + 0x000005BC, // .*.**.****. + 0x000005AC, // .*.**.*.**. + 0x000005EC, // .*.****.**. + 0x000004CC, // .*..**..**. + 0x000004CC, // .*..**..**. + 0x000004CC, // .*..**..**. + 0x00000E1E, // ***....**** + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 205 + 11, 19, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x0000071E, // .***...**** + 0x0000030C, // ..**....**. + 0x0000038C, // ..***...**. + 0x0000038C, // ..***...**. + 0x0000034C, // ..**.*..**. + 0x0000034C, // ..**.*..**. + 0x0000032C, // ..**..*.**. + 0x0000032C, // ..**..*.**. + 0x0000031C, // ..**...***. + 0x0000031C, // ..**...***. + 0x0000030C, // ..**....**. + 0x0000078C, // .****...**. + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 206 + 11, 19, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000204, // ..*......*. + 0x000003FC, // ..********. + 0x000003FC, // ..********. + 0x00000204, // ..*......*. + 0x00000000, // ........... + 0x00000088, // ....*...*.. + 0x000000F8, // ....*****.. + 0x000000F8, // ....*****.. + 0x00000088, // ....*...*.. + 0x00000000, // ........... + 0x00000402, // .*........* + 0x000007FE, // .********** + 0x000007FE, // .********** + 0x00000402, // .*........* + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 207 + 11, 19, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x000000F0, // ....****... + 0x0000039C, // ..***..***. + 0x0000030C, // ..**....**. + 0x00000606, // .**......** + 0x00000606, // .**......** + 0x00000606, // .**......** + 0x00000606, // .**......** + 0x00000606, // .**......** + 0x00000606, // .**......** + 0x0000030C, // ..**....**. + 0x0000039C, // ..***..***. + 0x000000F0, // ....****... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 208 + 11, 19, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x000007FE, // .********** + 0x0000030C, // ..**....**. + 0x0000030C, // ..**....**. + 0x0000030C, // ..**....**. + 0x0000030C, // ..**....**. + 0x0000030C, // ..**....**. + 0x0000030C, // ..**....**. + 0x0000030C, // ..**....**. + 0x0000030C, // ..**....**. + 0x0000030C, // ..**....**. + 0x0000030C, // ..**....**. + 0x0000079E, // .****..**** + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 209 + 11, 19, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x000007F0, // .*******... + 0x00000318, // ..**...**.. + 0x0000030C, // ..**....**. + 0x0000030C, // ..**....**. + 0x0000030C, // ..**....**. + 0x00000318, // ..**...**.. + 0x000003F0, // ..******... + 0x00000300, // ..**....... + 0x00000300, // ..**....... + 0x00000300, // ..**....... + 0x00000300, // ..**....... + 0x000007C0, // .*****..... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 210 + 0, 19, + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + }, + { // 211 + 11, 19, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x000003FC, // ..********. + 0x00000304, // ..**.....*. + 0x00000384, // ..***....*. + 0x00000180, // ...**...... + 0x000001C0, // ...***..... + 0x000000E0, // ....***.... + 0x000000C0, // ....**..... + 0x00000180, // ...**...... + 0x00000100, // ...*....... + 0x00000304, // ..**.....*. + 0x00000204, // ..*......*. + 0x000003FC, // ..********. + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 212 + 11, 19, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x000007FE, // .********** + 0x00000462, // .*...**...* + 0x00000462, // .*...**...* + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x000001F8, // ...******.. + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 213 + 11, 19, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x0000030C, // ..**....**. + 0x0000079E, // .****..**** + 0x00000492, // .*..*..*..* + 0x000000F0, // ....****... + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x000001F8, // ...******.. + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 214 + 11, 19, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x000000F0, // ....****... + 0x00000060, // .....**.... + 0x000001F8, // ...******.. + 0x0000036C, // ..**.**.**. + 0x00000666, // .**..**..** + 0x00000666, // .**..**..** + 0x00000666, // .**..**..** + 0x00000666, // .**..**..** + 0x0000036C, // ..**.**.**. + 0x000001F8, // ...******.. + 0x00000060, // .....**.... + 0x000000F0, // ....****... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 215 + 11, 19, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x0000079E, // .****..**** + 0x0000030C, // ..**....**. + 0x00000198, // ...**..**.. + 0x00000090, // ....*..*... + 0x000000F0, // ....****... + 0x00000060, // .....**.... + 0x000000F0, // ....****... + 0x000000B0, // ....*.**... + 0x00000198, // ...**..**.. + 0x00000118, // ...*...**.. + 0x0000030C, // ..**....**. + 0x0000079E, // .****..**** + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 216 + 11, 19, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x000000F0, // ....****... + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x00000666, // .**..**..** + 0x0000036C, // ..**.**.**. + 0x0000036C, // ..**.**.**. + 0x0000036C, // ..**.**.**. + 0x000001F8, // ...******.. + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x000001F8, // ...******.. + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 217 + 11, 19, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x000000F0, // ....****... + 0x0000039C, // ..***..***. + 0x0000030C, // ..**....**. + 0x00000606, // .**......** + 0x00000606, // .**......** + 0x00000606, // .**......** + 0x00000606, // .**......** + 0x0000030C, // ..**....**. + 0x00000198, // ...**..**.. + 0x00000492, // .*..*..*..* + 0x0000079E, // .****..**** + 0x0000039C, // ..***..***. + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 218 + 11, 19, + 0x00000198, // ...**..**.. + 0x00000198, // ...**..**.. + 0x00000000, // ........... + 0x000001F8, // ...******.. + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x000001F8, // ...******.. + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 219 + 11, 19, + 0x00000198, // ...**..**.. + 0x00000198, // ...**..**.. + 0x00000000, // ........... + 0x0000030C, // ..**....**. + 0x0000079E, // .****..**** + 0x00000492, // .*..*..*..* + 0x000000F0, // ....****... + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x000001F8, // ...******.. + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 220 + 11, 19, + 0x00000000, // ........... + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x00000040, // .....*..... + 0x00000040, // .....*..... + 0x00000000, // ........... + 0x00000000, // ........... + 0x000001C4, // ...***...*. + 0x0000036C, // ..**.**.**. + 0x00000628, // .**...*.*.. + 0x00000638, // .**...***.. + 0x00000630, // .**...**... + 0x00000630, // .**...**... + 0x0000037A, // ..**.****.* + 0x000001CC, // ...***..**. + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 221 + 11, 19, + 0x00000000, // ........... + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x00000040, // .....*..... + 0x00000040, // .....*..... + 0x00000000, // ........... + 0x00000000, // ........... + 0x000001F0, // ...*****... + 0x00000318, // ..**...**.. + 0x00000300, // ..**....... + 0x000001E0, // ...****.... + 0x00000300, // ..**....... + 0x00000300, // ..**....... + 0x00000388, // ..***...*.. + 0x000000F0, // ....****... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 222 + 11, 19, + 0x00000000, // ........... + 0x00000030, // ......**... + 0x00000030, // ......**... + 0x00000020, // ......*.... + 0x00000020, // ......*.... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000370, // ..**.***... + 0x000005D8, // .*.***.**.. + 0x0000018C, // ...**...**. + 0x0000018C, // ...**...**. + 0x0000018C, // ...**...**. + 0x0000018C, // ...**...**. + 0x0000018C, // ...**...**. + 0x0000018C, // ...**...**. + 0x0000008C, // ....*...**. + 0x0000000C, // ........**. + 0x00000004, // .........*. + 0x00000000, // ........... + }, + { // 223 + 11, 19, + 0x00000000, // ........... + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x00000040, // .....*..... + 0x00000040, // .....*..... + 0x00000000, // ........... + 0x00000000, // ........... + 0x000001C0, // ...***..... + 0x00000260, // ..*..**.... + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x00000064, // .....**..*. + 0x00000038, // ......***.. + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 224 + 11, 19, + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x00000040, // .....*..... + 0x00000358, // ..**.*.**.. + 0x00000318, // ..**...**.. + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000318, // ..**...**.. + 0x0000058C, // .*.**...**. + 0x0000018C, // ...**...**. + 0x0000018C, // ...**...**. + 0x0000018C, // ...**...**. + 0x0000018C, // ...**...**. + 0x00000198, // ...**..**.. + 0x000000F0, // ....****... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 225 + 11, 19, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x000001C4, // ...***...*. + 0x0000036C, // ..**.**.**. + 0x00000628, // .**...*.*.. + 0x00000638, // .**...***.. + 0x00000630, // .**...**... + 0x00000630, // .**...**... + 0x0000037A, // ..**.****.* + 0x000001CC, // ...***..**. + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 226 + 11, 19, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x000000F0, // ....****... + 0x000001B8, // ...**.***.. + 0x00000318, // ..**...**.. + 0x00000318, // ..**...**.. + 0x00000330, // ..**..**... + 0x00000370, // ..**.***... + 0x00000318, // ..**...**.. + 0x0000030C, // ..**....**. + 0x0000030C, // ..**....**. + 0x0000030C, // ..**....**. + 0x00000398, // ..***..**.. + 0x00000370, // ..**.***... + 0x00000300, // ..**....... + 0x00000300, // ..**....... + 0x00000200, // ..*........ + 0x00000000, // ........... + }, + { // 227 + 11, 19, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000182, // ...**.....* + 0x000003C4, // ..****...*. + 0x0000026C, // ..*..**.**. + 0x00000428, // .*....*.*.. + 0x00000438, // .*....***.. + 0x00000030, // ......**... + 0x00000030, // ......**... + 0x00000060, // .....**.... + 0x000000E0, // ....***.... + 0x000000E0, // ....***.... + 0x00000040, // .....*..... + 0x00000000, // ........... + }, + { // 228 + 11, 19, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000070, // .....***... + 0x000000D8, // ....**.**.. + 0x000000C8, // ....**..*.. + 0x00000060, // .....**.... + 0x000000F0, // ....****... + 0x00000198, // ...**..**.. + 0x0000030C, // ..**....**. + 0x0000030C, // ..**....**. + 0x0000030C, // ..**....**. + 0x0000030C, // ..**....**. + 0x00000198, // ...**..**.. + 0x000000F0, // ....****... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 229 + 11, 19, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x000001F0, // ...*****... + 0x00000318, // ..**...**.. + 0x00000300, // ..**....... + 0x000001E0, // ...****.... + 0x00000300, // ..**....... + 0x00000300, // ..**....... + 0x00000388, // ..***...*.. + 0x000000F0, // ....****... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 230 + 11, 19, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000600, // .**........ + 0x00000330, // ..**..**... + 0x000001F0, // ...*****... + 0x000003E0, // ..*****.... + 0x00000700, // .***....... + 0x00000E00, // ***........ + 0x00000C00, // **......... + 0x00000C00, // **......... + 0x00000C00, // **......... + 0x00000E00, // ***........ + 0x00000700, // .***....... + 0x00000380, // ..***...... + 0x000000C0, // ....**..... + 0x00000060, // .....**.... + 0x00000320, // ..**..*.... + 0x000003C0, // ..****..... + 0x00000000, // ........... + }, + { // 231 + 11, 19, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000370, // ..**.***... + 0x000005D8, // .*.***.**.. + 0x0000058C, // .*.**...**. + 0x0000018C, // ...**...**. + 0x0000018C, // ...**...**. + 0x0000018C, // ...**...**. + 0x0000018C, // ...**...**. + 0x0000018C, // ...**...**. + 0x0000008C, // ....*...**. + 0x0000000C, // ........**. + 0x00000004, // .........*. + 0x00000000, // ........... + }, + { // 232 + 11, 19, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x000000F0, // ....****... + 0x00000198, // ...**..**.. + 0x00000198, // ...**..**.. + 0x0000030C, // ..**....**. + 0x0000030C, // ..**....**. + 0x000003FC, // ..********. + 0x0000030C, // ..**....**. + 0x0000030C, // ..**....**. + 0x0000030C, // ..**....**. + 0x00000198, // ...**..**.. + 0x00000198, // ...**..**.. + 0x000000F0, // ....****... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 233 + 11, 19, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x000001C0, // ...***..... + 0x00000260, // ..*..**.... + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x00000064, // .....**..*. + 0x00000038, // ......***.. + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 234 + 11, 19, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000318, // ..**...**.. + 0x00000738, // .***..***.. + 0x00000360, // ..**.**.... + 0x000003C0, // ..****..... + 0x00000360, // ..**.**.... + 0x00000330, // ..**..**... + 0x00000318, // ..**...**.. + 0x0000078C, // .****...**. + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 235 + 11, 19, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000300, // ..**....... + 0x00000580, // .*.**...... + 0x00000180, // ...**...... + 0x000000C0, // ....**..... + 0x000000C0, // ....**..... + 0x000000E0, // ....***.... + 0x000001E0, // ...****.... + 0x00000130, // ...*..**... + 0x00000330, // ..**..**... + 0x00000218, // ..*....**.. + 0x0000061A, // .**....**.* + 0x0000040C, // .*......**. + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 236 + 11, 19, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000210, // ..*....*... + 0x00000630, // .**...**... + 0x00000630, // .**...**... + 0x00000630, // .**...**... + 0x00000630, // .**...**... + 0x00000630, // .**...**... + 0x00000774, // .***.***.*. + 0x000005D8, // .*.***.**.. + 0x00000400, // .*......... + 0x00000400, // .*......... + 0x00000400, // .*......... + 0x00000000, // ........... + }, + { // 237 + 11, 19, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x0000070C, // .***....**. + 0x0000030C, // ..**....**. + 0x00000188, // ...**...*.. + 0x00000188, // ...**...*.. + 0x000000D0, // ....**.*... + 0x000000D0, // ....**.*... + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 238 + 11, 19, + 0x00000000, // ........... + 0x00000000, // ........... + 0x000000C0, // ....**..... + 0x00000080, // ....*...... + 0x00000078, // .....****.. + 0x000000C0, // ....**..... + 0x000000C0, // ....**..... + 0x00000078, // .....****.. + 0x000000C0, // ....**..... + 0x00000180, // ...**...... + 0x00000300, // ..**....... + 0x00000300, // ..**....... + 0x00000300, // ..**....... + 0x000001C0, // ...***..... + 0x00000070, // .....***... + 0x00000008, // ........*.. + 0x00000048, // .....*..*.. + 0x00000070, // .....***... + 0x00000000, // ........... + }, + { // 239 + 11, 19, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x000000F0, // ....****... + 0x00000198, // ...**..**.. + 0x0000030C, // ..**....**. + 0x0000030C, // ..**....**. + 0x0000030C, // ..**....**. + 0x0000030C, // ..**....**. + 0x00000198, // ...**..**.. + 0x000000F0, // ....****... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 240 + 11, 19, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x000001FE, // ...******** + 0x000003FC, // ..********. + 0x00000490, // .*..*..*... + 0x00000090, // ....*..*... + 0x00000090, // ....*..*... + 0x00000192, // ...**..*..* + 0x0000019E, // ...**..**** + 0x0000030C, // ..**....**. + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 241 + 11, 19, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x000000F0, // ....****... + 0x00000198, // ...**..**.. + 0x0000030C, // ..**....**. + 0x0000030C, // ..**....**. + 0x0000030C, // ..**....**. + 0x0000030C, // ..**....**. + 0x00000398, // ..***..**.. + 0x00000370, // ..**.***... + 0x00000300, // ..**....... + 0x00000300, // ..**....... + 0x00000300, // ..**....... + 0x00000000, // ........... + }, + { // 242 + 11, 19, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x000000F0, // ....****... + 0x000001F8, // ...******.. + 0x00000308, // ..**....*.. + 0x00000200, // ..*........ + 0x00000200, // ..*........ + 0x00000200, // ..*........ + 0x000003F0, // ..******... + 0x000001F8, // ...******.. + 0x00000008, // ........*.. + 0x00000008, // ........*.. + 0x00000070, // .....***... + 0x00000000, // ........... + }, + { // 243 + 11, 19, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x000000FE, // ....******* + 0x00000198, // ...**..**.. + 0x0000030C, // ..**....**. + 0x0000030C, // ..**....**. + 0x0000030C, // ..**....**. + 0x0000030C, // ..**....**. + 0x00000198, // ...**..**.. + 0x000000F0, // ....****... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 244 + 11, 19, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x000001FC, // ...*******. + 0x000003F8, // ..*******.. + 0x00000440, // .*...*..... + 0x00000040, // .....*..... + 0x00000040, // .....*..... + 0x00000044, // .....*...*. + 0x00000078, // .....****.. + 0x00000030, // ......**... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 245 + 11, 19, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000318, // ..**...**.. + 0x0000058C, // .*.**...**. + 0x0000018C, // ...**...**. + 0x0000018C, // ...**...**. + 0x0000018C, // ...**...**. + 0x0000018C, // ...**...**. + 0x00000198, // ...**..**.. + 0x000000F0, // ....****... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 246 + 11, 19, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000040, // .....*..... + 0x00000040, // .....*..... + 0x00000040, // .....*..... + 0x00000040, // .....*..... + 0x000001F0, // ...*****... + 0x00000358, // ..**.*.**.. + 0x0000064C, // .**..*..**. + 0x0000064C, // .**..*..**. + 0x0000064C, // .**..*..**. + 0x0000064C, // .**..*..**. + 0x00000358, // ..**.*.**.. + 0x000001F0, // ...*****... + 0x00000040, // .....*..... + 0x00000040, // .....*..... + 0x00000040, // .....*..... + 0x00000000, // ........... + }, + { // 247 + 11, 19, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000602, // .**.......* + 0x00000506, // .*.*.....** + 0x0000018C, // ...**...**. + 0x00000098, // ....*..**.. + 0x000000F0, // ....****... + 0x00000060, // .....**.... + 0x000000F0, // ....****... + 0x00000190, // ...**..*... + 0x00000318, // ..**...**.. + 0x0000060A, // .**.....*.* + 0x00000406, // .*.......** + 0x00000000, // ........... + }, + { // 248 + 11, 19, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000040, // .....*..... + 0x00000040, // .....*..... + 0x00000040, // .....*..... + 0x00000040, // .....*..... + 0x00000C46, // **...*...** + 0x0000064C, // .**..*..**. + 0x0000064C, // .**..*..**. + 0x0000064C, // .**..*..**. + 0x0000064C, // .**..*..**. + 0x00000358, // ..**.*.**.. + 0x00000358, // ..**.*.**.. + 0x000001F0, // ...*****... + 0x00000040, // .....*..... + 0x00000040, // .....*..... + 0x00000040, // .....*..... + 0x00000000, // ........... + }, + { // 249 + 11, 19, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000308, // ..**....*.. + 0x00000604, // .**......*. + 0x00000406, // .*.......** + 0x00000466, // .*...**..** + 0x00000466, // .*...**..** + 0x00000666, // .**..**..** + 0x000007FE, // .********** + 0x0000039C, // ..***..***. + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 250 + 11, 19, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000330, // ..**..**... + 0x00000330, // ..**..**... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000380, // ..***...... + 0x000004C0, // .*..**..... + 0x000000C0, // ....**..... + 0x000000C0, // ....**..... + 0x000000C0, // ....**..... + 0x000000C0, // ....**..... + 0x000000C8, // ....**..*.. + 0x00000070, // .....***... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 251 + 11, 19, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000198, // ...**..**.. + 0x00000198, // ...**..**.. + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000318, // ..**...**.. + 0x0000058C, // .*.**...**. + 0x0000018C, // ...**...**. + 0x0000018C, // ...**...**. + 0x0000018C, // ...**...**. + 0x0000018C, // ...**...**. + 0x00000198, // ...**..**.. + 0x000000F0, // ....****... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 252 + 11, 19, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000030, // ......**... + 0x00000030, // ......**... + 0x00000020, // ......*.... + 0x00000020, // ......*.... + 0x00000000, // ........... + 0x000000F0, // ....****... + 0x00000198, // ...**..**.. + 0x0000030C, // ..**....**. + 0x0000030C, // ..**....**. + 0x0000030C, // ..**....**. + 0x0000030C, // ..**....**. + 0x00000198, // ...**..**.. + 0x000000F0, // ....****... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 253 + 11, 19, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x00000040, // .....*..... + 0x00000040, // .....*..... + 0x00000000, // ........... + 0x00000318, // ..**...**.. + 0x0000058C, // .*.**...**. + 0x0000018C, // ...**...**. + 0x0000018C, // ...**...**. + 0x0000018C, // ...**...**. + 0x0000018C, // ...**...**. + 0x00000198, // ...**..**.. + 0x000000F0, // ....****... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 254 + 11, 19, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000060, // .....**.... + 0x00000060, // .....**.... + 0x00000040, // .....*..... + 0x00000040, // .....*..... + 0x00000000, // ........... + 0x00000308, // ..**....*.. + 0x00000604, // .**......*. + 0x00000406, // .*.......** + 0x00000466, // .*...**..** + 0x00000466, // .*...**..** + 0x00000666, // .**..**..** + 0x000007FE, // .********** + 0x0000039C, // ..***..***. + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 255 + 11, 19, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + }; diff --git a/fontsml.c b/fontsml.c new file mode 100644 index 0000000..fae029d --- /dev/null +++ b/fontsml.c @@ -0,0 +1,5602 @@ +cFont::tPixelData FontSml_iso8859_1[][24] = { + { // 32 + 5, 22, + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000000, // ..... + }, + { // 33 + 6, 22, + 0x00000000, // ...... + 0x00000000, // ...... + 0x00000000, // ...... + 0x00000000, // ...... + 0x00000018, // ..**.. + 0x00000018, // ..**.. + 0x00000018, // ..**.. + 0x00000018, // ..**.. + 0x00000018, // ..**.. + 0x00000018, // ..**.. + 0x00000018, // ..**.. + 0x00000018, // ..**.. + 0x00000010, // ..*... + 0x00000010, // ..*... + 0x00000000, // ...... + 0x00000000, // ...... + 0x00000018, // ..**.. + 0x00000018, // ..**.. + 0x00000000, // ...... + 0x00000000, // ...... + 0x00000000, // ...... + 0x00000000, // ...... + }, + { // 34 + 5, 22, + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000036, // **.** + 0x00000036, // **.** + 0x00000036, // **.** + 0x00000036, // **.** + 0x00000036, // **.** + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000000, // ..... + }, + { // 35 + 10, 22, + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000048, // ....*..*.. + 0x00000048, // ....*..*.. + 0x00000048, // ....*..*.. + 0x000003FE, // .********* + 0x000003FE, // .********* + 0x00000090, // ...*..*... + 0x00000090, // ...*..*... + 0x00000090, // ...*..*... + 0x000007FC, // *********. + 0x000007FC, // *********. + 0x00000120, // ..*..*.... + 0x00000120, // ..*..*.... + 0x00000120, // ..*..*.... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + }, + { // 36 + 10, 22, + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000020, // .....*.... + 0x000000F8, // ...*****.. + 0x000001FC, // ..*******. + 0x0000032C, // .**..*.**. + 0x00000320, // .**..*.... + 0x000003A0, // .***.*.... + 0x000001E0, // ..****.... + 0x000000F8, // ...*****.. + 0x0000003C, // .....****. + 0x00000026, // .....*..** + 0x00000326, // .**..*..** + 0x000003AE, // .***.*.*** + 0x000001FC, // ..*******. + 0x000000F8, // ...*****.. + 0x00000020, // .....*.... + 0x00000020, // .....*.... + 0x00000000, // .......... + 0x00000000, // .......... + }, + { // 37 + 16, 22, + 0x00000000, // ................ + 0x00000000, // ................ + 0x00000000, // ................ + 0x00000000, // ................ + 0x00000000, // ................ + 0x00007860, // ..****....**.... + 0x0000CCC0, // .**..**..**..... + 0x0000CCC0, // .**..**..**..... + 0x0000CD80, // .**..**.**...... + 0x0000CD80, // .**..**.**...... + 0x00007B00, // ..****.**....... + 0x00000300, // .......**....... + 0x00000678, // ......**..****.. + 0x000006CC, // ......**.**..**. + 0x00000CCC, // .....**..**..**. + 0x00000CCC, // .....**..**..**. + 0x000018CC, // ....**...**..**. + 0x00001878, // ....**....****.. + 0x00000000, // ................ + 0x00000000, // ................ + 0x00000000, // ................ + 0x00000000, // ................ + }, + { // 38 + 13, 22, + 0x00000000, // ............. + 0x00000000, // ............. + 0x00000000, // ............. + 0x00000000, // ............. + 0x00000000, // ............. + 0x00000780, // ...****...... + 0x00000FC0, // ..******..... + 0x00000CC0, // ..**..**..... + 0x00000CC0, // ..**..**..... + 0x00000780, // ...****...... + 0x00000F80, // ..*****...... + 0x00001DD8, // .***.***.**.. + 0x000018D8, // .**...**.**.. + 0x00001878, // .**....****.. + 0x00001870, // .**....***... + 0x00001CF8, // .***..*****.. + 0x00000FDC, // ..******.***. + 0x0000078E, // ...****...*** + 0x00000000, // ............. + 0x00000000, // ............. + 0x00000000, // ............. + 0x00000000, // ............. + }, + { // 39 + 3, 22, + 0x00000000, // ... + 0x00000000, // ... + 0x00000000, // ... + 0x00000000, // ... + 0x00000004, // .*. + 0x00000004, // .*. + 0x00000004, // .*. + 0x00000004, // .*. + 0x00000004, // .*. + 0x00000000, // ... + 0x00000000, // ... + 0x00000000, // ... + 0x00000000, // ... + 0x00000000, // ... + 0x00000000, // ... + 0x00000000, // ... + 0x00000000, // ... + 0x00000000, // ... + 0x00000000, // ... + 0x00000000, // ... + 0x00000000, // ... + 0x00000000, // ... + }, + { // 40 + 6, 22, + 0x00000000, // ...... + 0x00000000, // ...... + 0x00000000, // ...... + 0x00000000, // ...... + 0x00000008, // ...*.. + 0x00000018, // ..**.. + 0x00000030, // .**... + 0x00000030, // .**... + 0x00000060, // **.... + 0x00000060, // **.... + 0x00000060, // **.... + 0x00000060, // **.... + 0x00000060, // **.... + 0x00000060, // **.... + 0x00000060, // **.... + 0x00000060, // **.... + 0x00000060, // **.... + 0x00000060, // **.... + 0x00000030, // .**... + 0x00000030, // .**... + 0x00000018, // ..**.. + 0x00000008, // ...*.. + }, + { // 41 + 6, 22, + 0x00000000, // ...... + 0x00000000, // ...... + 0x00000000, // ...... + 0x00000000, // ...... + 0x00000020, // .*.... + 0x00000030, // .**... + 0x00000018, // ..**.. + 0x00000018, // ..**.. + 0x0000000C, // ...**. + 0x0000000C, // ...**. + 0x0000000C, // ...**. + 0x0000000C, // ...**. + 0x0000000C, // ...**. + 0x0000000C, // ...**. + 0x0000000C, // ...**. + 0x0000000C, // ...**. + 0x0000000C, // ...**. + 0x0000000C, // ...**. + 0x00000018, // ..**.. + 0x00000018, // ..**.. + 0x00000030, // .**... + 0x00000020, // .*.... + }, + { // 42 + 7, 22, + 0x00000000, // ....... + 0x00000000, // ....... + 0x00000000, // ....... + 0x00000000, // ....... + 0x00000010, // ...*... + 0x00000054, // .*.*.*. + 0x0000007C, // .*****. + 0x00000010, // ...*... + 0x0000007C, // .*****. + 0x00000054, // .*.*.*. + 0x00000010, // ...*... + 0x00000000, // ....... + 0x00000000, // ....... + 0x00000000, // ....... + 0x00000000, // ....... + 0x00000000, // ....... + 0x00000000, // ....... + 0x00000000, // ....... + 0x00000000, // ....... + 0x00000000, // ....... + 0x00000000, // ....... + 0x00000000, // ....... + }, + { // 43 + 10, 22, + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000060, // ....**.... + 0x00000060, // ....**.... + 0x00000060, // ....**.... + 0x00000060, // ....**.... + 0x000003FC, // .********. + 0x000003FC, // .********. + 0x00000060, // ....**.... + 0x00000060, // ....**.... + 0x00000060, // ....**.... + 0x00000060, // ....**.... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + }, + { // 44 + 5, 22, + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000018, // .**.. + 0x00000018, // .**.. + 0x00000008, // ..*.. + 0x00000008, // ..*.. + 0x00000010, // .*... + 0x00000000, // ..... + }, + { // 45 + 6, 22, + 0x00000000, // ...... + 0x00000000, // ...... + 0x00000000, // ...... + 0x00000000, // ...... + 0x00000000, // ...... + 0x00000000, // ...... + 0x00000000, // ...... + 0x00000000, // ...... + 0x00000000, // ...... + 0x00000000, // ...... + 0x00000000, // ...... + 0x0000007C, // *****. added by hand to avoid flickering!!! + 0x0000007C, // *****. + 0x00000000, // ...... + 0x00000000, // ...... + 0x00000000, // ...... + 0x00000000, // ...... + 0x00000000, // ...... + 0x00000000, // ...... + 0x00000000, // ...... + 0x00000000, // ...... + 0x00000000, // ...... + }, + { // 46 + 5, 22, + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000018, // .**.. + 0x00000018, // .**.. + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000000, // ..... + }, + { // 47 + 5, 22, + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000006, // ...** + 0x00000006, // ...** + 0x00000006, // ...** + 0x00000006, // ...** + 0x0000000C, // ..**. + 0x0000000C, // ..**. + 0x0000000C, // ..**. + 0x00000018, // .**.. + 0x00000018, // .**.. + 0x00000018, // .**.. + 0x00000030, // **... + 0x00000030, // **... + 0x00000030, // **... + 0x00000030, // **... + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000000, // ..... + }, + { // 48 + 10, 22, + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x000000F0, // ...****... + 0x000001F8, // ..******.. + 0x00000198, // ..**..**.. + 0x0000030C, // .**....**. + 0x0000030C, // .**....**. + 0x0000030C, // .**....**. + 0x0000030C, // .**....**. + 0x0000030C, // .**....**. + 0x0000030C, // .**....**. + 0x0000030C, // .**....**. + 0x00000198, // ..**..**.. + 0x000001F8, // ..******.. + 0x000000F0, // ...****... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + }, + { // 49 + 10, 22, + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000030, // .....**... + 0x000001F0, // ..*****... + 0x000001F0, // ..*****... + 0x00000030, // .....**... + 0x00000030, // .....**... + 0x00000030, // .....**... + 0x00000030, // .....**... + 0x00000030, // .....**... + 0x00000030, // .....**... + 0x00000030, // .....**... + 0x00000030, // .....**... + 0x00000030, // .....**... + 0x00000030, // .....**... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + }, + { // 50 + 10, 22, + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x000000F0, // ...****... + 0x000003F8, // .*******.. + 0x0000030C, // .**....**. + 0x0000000C, // .......**. + 0x0000001C, // ......***. + 0x00000038, // .....***.. + 0x00000070, // ....***... + 0x000000E0, // ...***.... + 0x000001C0, // ..***..... + 0x00000380, // .***...... + 0x00000300, // .**....... + 0x000003FC, // .********. + 0x000003FC, // .********. + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + }, + { // 51 + 10, 22, + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x000000F8, // ...*****.. + 0x000001FC, // ..*******. + 0x0000030C, // .**....**. + 0x0000030C, // .**....**. + 0x00000018, // ......**.. + 0x00000070, // ....***... + 0x00000078, // ....****.. + 0x0000001C, // ......***. + 0x0000000C, // .......**. + 0x0000030C, // .**....**. + 0x0000031C, // .**...***. + 0x000001F8, // ..******.. + 0x000000F0, // ...****... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + }, + { // 52 + 10, 22, + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000018, // ......**.. + 0x00000038, // .....***.. + 0x00000078, // ....****.. + 0x000000D8, // ...**.**.. + 0x00000198, // ..**..**.. + 0x00000198, // ..**..**.. + 0x00000318, // .**...**.. + 0x00000618, // **....**.. + 0x000007FC, // *********. + 0x000007FC, // *********. + 0x00000018, // ......**.. + 0x00000018, // ......**.. + 0x00000018, // ......**.. + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + }, + { // 53 + 10, 22, + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x000003F8, // .*******.. + 0x000003F8, // .*******.. + 0x00000300, // .**....... + 0x00000300, // .**....... + 0x000003F0, // .******... + 0x000003F8, // .*******.. + 0x0000031C, // .**...***. + 0x0000000C, // .......**. + 0x0000000C, // .......**. + 0x0000030C, // .**....**. + 0x0000031C, // .**...***. + 0x000003F8, // .*******.. + 0x000001F0, // ..*****... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + }, + { // 54 + 10, 22, + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x000000F0, // ...****... + 0x000001FC, // ..*******. + 0x0000018C, // ..**...**. + 0x00000300, // .**....... + 0x00000300, // .**....... + 0x00000370, // .**.***... + 0x000003F8, // .*******.. + 0x0000030C, // .**....**. + 0x0000030C, // .**....**. + 0x0000030C, // .**....**. + 0x0000038C, // .***...**. + 0x000001F8, // ..******.. + 0x000000F0, // ...****... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + }, + { // 55 + 10, 22, + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x000003FC, // .********. + 0x000003FC, // .********. + 0x0000000C, // .......**. + 0x00000018, // ......**.. + 0x00000030, // .....**... + 0x00000030, // .....**... + 0x00000060, // ....**.... + 0x00000060, // ....**.... + 0x000000C0, // ...**..... + 0x000000C0, // ...**..... + 0x00000180, // ..**...... + 0x00000180, // ..**...... + 0x00000180, // ..**...... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + }, + { // 56 + 10, 22, + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x000000F0, // ...****... + 0x000001F8, // ..******.. + 0x0000039C, // .***..***. + 0x0000030C, // .**....**. + 0x0000030C, // .**....**. + 0x00000198, // ..**..**.. + 0x000001F8, // ..******.. + 0x0000039C, // .***..***. + 0x0000030C, // .**....**. + 0x0000030C, // .**....**. + 0x0000039C, // .***..***. + 0x000001F8, // ..******.. + 0x000000F0, // ...****... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + }, + { // 57 + 10, 22, + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x000000F0, // ...****... + 0x000001F8, // ..******.. + 0x0000031C, // .**...***. + 0x0000030C, // .**....**. + 0x0000030C, // .**....**. + 0x0000030C, // .**....**. + 0x000001FC, // ..*******. + 0x000000EC, // ...***.**. + 0x0000000C, // .......**. + 0x0000000C, // .......**. + 0x00000318, // .**...**.. + 0x000003F8, // .*******.. + 0x000001F0, // ..*****... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + }, + { // 58 + 5, 22, + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000018, // .**.. + 0x00000018, // .**.. + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000018, // .**.. + 0x00000018, // .**.. + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000000, // ..... + }, + { // 59 + 5, 22, + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000018, // .**.. + 0x00000018, // .**.. + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000018, // .**.. + 0x00000018, // .**.. + 0x00000008, // ..*.. + 0x00000008, // ..*.. + 0x00000010, // .*... + 0x00000000, // ..... + }, + { // 60 + 10, 22, + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x0000000C, // .......**. + 0x0000003C, // .....****. + 0x000000F0, // ...****... + 0x000001C0, // ..***..... + 0x00000300, // .**....... + 0x000001C0, // ..***..... + 0x000000F0, // ...****... + 0x0000003C, // .....****. + 0x0000000C, // .......**. + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + }, + { // 61 + 11, 22, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x000003F8, // ..*******.. + 0x000003F8, // ..*******.. + 0x00000000, // ........... + 0x000003F8, // ..*******.. + 0x000003F8, // ..*******.. + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 62 + 10, 22, + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000300, // .**....... + 0x000003C0, // .****..... + 0x000000F0, // ...****... + 0x00000038, // .....***.. + 0x0000000C, // .......**. + 0x00000038, // .....***.. + 0x000000F0, // ...****... + 0x000003C0, // .****..... + 0x00000300, // .**....... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + }, + { // 63 + 10, 22, + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x000001F0, // ..*****... + 0x000003F8, // .*******.. + 0x00000318, // .**...**.. + 0x00000318, // .**...**.. + 0x00000038, // .....***.. + 0x00000070, // ....***... + 0x000000E0, // ...***.... + 0x000000C0, // ...**..... + 0x000000C0, // ...**..... + 0x000000C0, // ...**..... + 0x00000000, // .......... + 0x00000000, // .......... + 0x000000C0, // ...**..... + 0x000000C0, // ...**..... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + }, + { // 64 + 18, 22, + 0x00000000, // .................. + 0x00000000, // .................. + 0x00000000, // .................. + 0x00000000, // .................. + 0x00000FC0, // .......******..... + 0x00003FF0, // .....**********... + 0x00007038, // ....***......***.. + 0x0000C018, // ...**.........**.. + 0x00018F4C, // ..**...****.*..**. + 0x00019DCC, // ..**..***.***..**. + 0x000318CC, // .**...**...**..**. + 0x0003318C, // .**..**...**...**. + 0x00033198, // .**..**...**..**.. + 0x00033198, // .**..**...**..**.. + 0x00033330, // .**..**..**..**... + 0x00033FE0, // .**..*********.... + 0x00019DC0, // ..**..***.***..... + 0x0001C000, // ..***............. + 0x0000E000, // ...***............ + 0x00007FC0, // ....*********..... + 0x00001F80, // ......******...... + 0x00000000, // .................. + }, + { // 65 + 13, 22, + 0x00000000, // ............. + 0x00000000, // ............. + 0x00000000, // ............. + 0x00000000, // ............. + 0x00000180, // .....**...... + 0x00000180, // .....**...... + 0x000003C0, // ....****..... + 0x000003C0, // ....****..... + 0x00000660, // ...**..**.... + 0x00000660, // ...**..**.... + 0x00000C30, // ..**....**... + 0x00000C30, // ..**....**... + 0x00000FF0, // ..********... + 0x00001FF8, // .**********.. + 0x00001818, // .**......**.. + 0x00001818, // .**......**.. + 0x0000300C, // **........**. + 0x0000300C, // **........**. + 0x00000000, // ............. + 0x00000000, // ............. + 0x00000000, // ............. + 0x00000000, // ............. + }, + { // 66 + 13, 22, + 0x00000000, // ............. + 0x00000000, // ............. + 0x00000000, // ............. + 0x00000000, // ............. + 0x00001FE0, // .********.... + 0x00001FF0, // .*********... + 0x00001838, // .**.....***.. + 0x00001818, // .**......**.. + 0x00001818, // .**......**.. + 0x00001830, // .**.....**... + 0x00001FF0, // .*********... + 0x00001FF8, // .**********.. + 0x0000181C, // .**......***. + 0x0000180C, // .**.......**. + 0x0000180C, // .**.......**. + 0x0000181C, // .**......***. + 0x00001FF8, // .**********.. + 0x00001FF0, // .*********... + 0x00000000, // ............. + 0x00000000, // ............. + 0x00000000, // ............. + 0x00000000, // ............. + }, + { // 67 + 14, 22, + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x000003E0, // .....*****.... + 0x00000FF8, // ...*********.. + 0x00001C1C, // ..***.....***. + 0x0000180C, // ..**.......**. + 0x00003800, // .***.......... + 0x00003000, // .**........... + 0x00003000, // .**........... + 0x00003000, // .**........... + 0x00003000, // .**........... + 0x00003800, // .***.......... + 0x0000180C, // ..**.......**. + 0x00001C1C, // ..***.....***. + 0x00000FF8, // ...*********.. + 0x000003E0, // .....*****.... + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 68 + 14, 22, + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00003FE0, // .*********.... + 0x00003FF0, // .**********... + 0x00003038, // .**......***.. + 0x00003018, // .**.......**.. + 0x0000300C, // .**........**. + 0x0000300C, // .**........**. + 0x0000300C, // .**........**. + 0x0000300C, // .**........**. + 0x0000300C, // .**........**. + 0x0000300C, // .**........**. + 0x00003018, // .**.......**.. + 0x00003038, // .**......***.. + 0x00003FF0, // .**********... + 0x00003FE0, // .*********.... + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 69 + 13, 22, + 0x00000000, // ............. + 0x00000000, // ............. + 0x00000000, // ............. + 0x00000000, // ............. + 0x00000FFC, // ..**********. + 0x00000FFC, // ..**********. + 0x00000C00, // ..**......... + 0x00000C00, // ..**......... + 0x00000C00, // ..**......... + 0x00000C00, // ..**......... + 0x00000FF8, // ..*********.. + 0x00000FF8, // ..*********.. + 0x00000C00, // ..**......... + 0x00000C00, // ..**......... + 0x00000C00, // ..**......... + 0x00000C00, // ..**......... + 0x00000FFC, // ..**********. + 0x00000FFC, // ..**********. + 0x00000000, // ............. + 0x00000000, // ............. + 0x00000000, // ............. + 0x00000000, // ............. + }, + { // 70 + 12, 22, + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x000007FC, // ..*********. + 0x000007FC, // ..*********. + 0x00000600, // ..**........ + 0x00000600, // ..**........ + 0x00000600, // ..**........ + 0x00000600, // ..**........ + 0x000007F8, // ..********.. + 0x000007F8, // ..********.. + 0x00000600, // ..**........ + 0x00000600, // ..**........ + 0x00000600, // ..**........ + 0x00000600, // ..**........ + 0x00000600, // ..**........ + 0x00000600, // ..**........ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + }, + { // 71 + 15, 22, + 0x00000000, // ............... + 0x00000000, // ............... + 0x00000000, // ............... + 0x00000000, // ............... + 0x000007E0, // .....******.... + 0x00001FF8, // ...**********.. + 0x0000381C, // ..***......***. + 0x0000300C, // ..**........**. + 0x0000700C, // .***........**. + 0x00006000, // .**............ + 0x00006000, // .**............ + 0x0000607C, // .**......*****. + 0x0000607C, // .**......*****. + 0x0000700C, // .***........**. + 0x0000300C, // ..**........**. + 0x0000381C, // ..***......***. + 0x00001FFC, // ...***********. + 0x000007EC, // .....******.**. + 0x00000000, // ............... + 0x00000000, // ............... + 0x00000000, // ............... + 0x00000000, // ............... + }, + { // 72 + 14, 22, + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00003018, // .**.......**.. + 0x00003018, // .**.......**.. + 0x00003018, // .**.......**.. + 0x00003018, // .**.......**.. + 0x00003018, // .**.......**.. + 0x00003018, // .**.......**.. + 0x00003FF8, // .***********.. + 0x00003FF8, // .***********.. + 0x00003018, // .**.......**.. + 0x00003018, // .**.......**.. + 0x00003018, // .**.......**.. + 0x00003018, // .**.......**.. + 0x00003018, // .**.......**.. + 0x00003018, // .**.......**.. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 73 + 6, 22, + 0x00000000, // ...... + 0x00000000, // ...... + 0x00000000, // ...... + 0x00000000, // ...... + 0x00000018, // ..**.. + 0x00000018, // ..**.. + 0x00000018, // ..**.. + 0x00000018, // ..**.. + 0x00000018, // ..**.. + 0x00000018, // ..**.. + 0x00000018, // ..**.. + 0x00000018, // ..**.. + 0x00000018, // ..**.. + 0x00000018, // ..**.. + 0x00000018, // ..**.. + 0x00000018, // ..**.. + 0x00000018, // ..**.. + 0x00000018, // ..**.. + 0x00000000, // ...... + 0x00000000, // ...... + 0x00000000, // ...... + 0x00000000, // ...... + }, + { // 74 + 10, 22, + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000018, // ......**.. + 0x00000018, // ......**.. + 0x00000018, // ......**.. + 0x00000018, // ......**.. + 0x00000018, // ......**.. + 0x00000018, // ......**.. + 0x00000018, // ......**.. + 0x00000018, // ......**.. + 0x00000018, // ......**.. + 0x00000618, // **....**.. + 0x00000618, // **....**.. + 0x00000738, // ***..***.. + 0x000003F0, // .******... + 0x000001E0, // ..****.... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + }, + { // 75 + 13, 22, + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x0000181C, // ..**......***. + 0x00001838, // ..**.....***.. + 0x00001870, // ..**....***... + 0x000018E0, // ..**...***.... + 0x000019C0, // ..**..***..... + 0x00001B80, // ..**.***...... + 0x00001F00, // ..*****....... + 0x00001F80, // ..******...... + 0x000019C0, // ..**..***..... + 0x000018E0, // ..**...***.... + 0x00001870, // ..**....***... + 0x00001838, // ..**.....***.. + 0x0000181C, // ..**......***. + 0x0000180E, // ..**.......*** + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 76 + 11, 22, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000600, // .**........ + 0x00000600, // .**........ + 0x00000600, // .**........ + 0x00000600, // .**........ + 0x00000600, // .**........ + 0x00000600, // .**........ + 0x00000600, // .**........ + 0x00000600, // .**........ + 0x00000600, // .**........ + 0x00000600, // .**........ + 0x00000600, // .**........ + 0x00000600, // .**........ + 0x000007FC, // .*********. + 0x000007FC, // .*********. + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 77 + 16, 22, + 0x00000000, // ................ + 0x00000000, // ................ + 0x00000000, // ................ + 0x00000000, // ................ + 0x0000C00C, // .**..........**. + 0x0000C00C, // .**..........**. + 0x0000E01C, // .***........***. + 0x0000E01C, // .***........***. + 0x0000F03C, // .****......****. + 0x0000F03C, // .****......****. + 0x0000D86C, // .**.**....**.**. + 0x0000D86C, // .**.**....**.**. + 0x0000CCCC, // .**..**..**..**. + 0x0000CCCC, // .**..**..**..**. + 0x0000C48C, // .**...*..*...**. + 0x0000C78C, // .**...****...**. + 0x0000C30C, // .**....**....**. + 0x0000C30C, // .**....**....**. + 0x00000000, // ................ + 0x00000000, // ................ + 0x00000000, // ................ + 0x00000000, // ................ + }, + { // 78 + 14, 22, + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00003018, // .**.......**.. + 0x00003818, // .***......**.. + 0x00003C18, // .****.....**.. + 0x00003C18, // .****.....**.. + 0x00003618, // .**.**....**.. + 0x00003318, // .**..**...**.. + 0x00003318, // .**..**...**.. + 0x00003198, // .**...**..**.. + 0x00003198, // .**...**..**.. + 0x000030D8, // .**....**.**.. + 0x00003078, // .**.....****.. + 0x00003078, // .**.....****.. + 0x00003038, // .**......***.. + 0x00003018, // .**.......**.. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 79 + 15, 22, + 0x00000000, // ............... + 0x00000000, // ............... + 0x00000000, // ............... + 0x00000000, // ............... + 0x000007C0, // .....*****..... + 0x00001FF0, // ...*********... + 0x00003838, // ..***.....***.. + 0x00003018, // ..**.......**.. + 0x0000701C, // .***.......***. + 0x0000600C, // .**.........**. + 0x0000600C, // .**.........**. + 0x0000600C, // .**.........**. + 0x0000600C, // .**.........**. + 0x0000701C, // .***.......***. + 0x00003018, // ..**.......**.. + 0x00003838, // ..***.....***.. + 0x00001FF0, // ...*********... + 0x000007C0, // .....*****..... + 0x00000000, // ............... + 0x00000000, // ............... + 0x00000000, // ............... + 0x00000000, // ............... + }, + { // 80 + 13, 22, + 0x00000000, // ............. + 0x00000000, // ............. + 0x00000000, // ............. + 0x00000000, // ............. + 0x00000FF0, // ..********... + 0x00000FF8, // ..*********.. + 0x00000C1C, // ..**.....***. + 0x00000C0C, // ..**......**. + 0x00000C0C, // ..**......**. + 0x00000C1C, // ..**.....***. + 0x00000FF8, // ..*********.. + 0x00000FF0, // ..********... + 0x00000C00, // ..**......... + 0x00000C00, // ..**......... + 0x00000C00, // ..**......... + 0x00000C00, // ..**......... + 0x00000C00, // ..**......... + 0x00000C00, // ..**......... + 0x00000000, // ............. + 0x00000000, // ............. + 0x00000000, // ............. + 0x00000000, // ............. + }, + { // 81 + 15, 22, + 0x00000000, // ............... + 0x00000000, // ............... + 0x00000000, // ............... + 0x00000000, // ............... + 0x000007C0, // .....*****..... + 0x00001FF0, // ...*********... + 0x00003838, // ..***.....***.. + 0x00003018, // ..**.......**.. + 0x0000701C, // .***.......***. + 0x0000600C, // .**.........**. + 0x0000600C, // .**.........**. + 0x0000600C, // .**.........**. + 0x0000600C, // .**.........**. + 0x000070DC, // .***....**.***. + 0x000030D8, // ..**....**.**.. + 0x00003878, // ..***....****.. + 0x00001FF0, // ...*********... + 0x000007D8, // .....*****.**.. + 0x00000018, // ...........**.. + 0x00000000, // ............... + 0x00000000, // ............... + 0x00000000, // ............... + }, + { // 82 + 14, 22, + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00003FE0, // .*********.... + 0x00003FF0, // .**********... + 0x00003038, // .**......***.. + 0x00003018, // .**.......**.. + 0x00003018, // .**.......**.. + 0x00003038, // .**......***.. + 0x00003FF0, // .**********... + 0x00003FE0, // .*********.... + 0x00003030, // .**......**... + 0x00003030, // .**......**... + 0x00003018, // .**.......**.. + 0x00003018, // .**.......**.. + 0x00003018, // .**.......**.. + 0x00003018, // .**.......**.. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 83 + 13, 22, + 0x00000000, // ............. + 0x00000000, // ............. + 0x00000000, // ............. + 0x00000000, // ............. + 0x000003C0, // ....****..... + 0x00000FF0, // ..********... + 0x00001C38, // .***....***.. + 0x00001818, // .**......**.. + 0x00001C00, // .***......... + 0x00000F80, // ..*****...... + 0x000003E0, // ....*****.... + 0x00000070, // .......***... + 0x00000038, // ........***.. + 0x00000018, // .........**.. + 0x00001818, // .**......**.. + 0x00001C38, // .***....***.. + 0x00000FF0, // ..********... + 0x000007E0, // ...******.... + 0x00000000, // ............. + 0x00000000, // ............. + 0x00000000, // ............. + 0x00000000, // ............. + }, + { // 84 + 12, 22, + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000FFC, // .**********. + 0x00000FFC, // .**********. + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x000000C0, // .....**..... + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + }, + { // 85 + 14, 22, + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00003018, // .**.......**.. + 0x00003018, // .**.......**.. + 0x00003018, // .**.......**.. + 0x00003018, // .**.......**.. + 0x00003018, // .**.......**.. + 0x00003018, // .**.......**.. + 0x00003018, // .**.......**.. + 0x00003018, // .**.......**.. + 0x00003018, // .**.......**.. + 0x00003018, // .**.......**.. + 0x00003018, // .**.......**.. + 0x00001830, // ..**.....**... + 0x00001FF0, // ..*********... + 0x000007C0, // ....*****..... + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 86 + 13, 22, + 0x00000000, // ............. + 0x00000000, // ............. + 0x00000000, // ............. + 0x00000000, // ............. + 0x0000300C, // **........**. + 0x0000300C, // **........**. + 0x00001818, // .**......**.. + 0x00001818, // .**......**.. + 0x00001818, // .**......**.. + 0x00000C30, // ..**....**... + 0x00000C30, // ..**....**... + 0x00000C30, // ..**....**... + 0x00000660, // ...**..**.... + 0x00000660, // ...**..**.... + 0x00000660, // ...**..**.... + 0x000003C0, // ....****..... + 0x000003C0, // ....****..... + 0x00000180, // .....**...... + 0x00000000, // ............. + 0x00000000, // ............. + 0x00000000, // ............. + 0x00000000, // ............. + }, + { // 87 + 18, 22, + 0x00000000, // .................. + 0x00000000, // .................. + 0x00000000, // .................. + 0x00000000, // .................. + 0x0003060C, // .**.....**.....**. + 0x0003060C, // .**.....**.....**. + 0x0003060C, // .**.....**.....**. + 0x00030F0C, // .**....****....**. + 0x00018F18, // ..**...****...**.. + 0x00018918, // ..**...*..*...**.. + 0x00019998, // ..**..**..**..**.. + 0x00019998, // ..**..**..**..**.. + 0x0000D9B0, // ...**.**..**.**... + 0x0000D9B0, // ...**.**..**.**... + 0x0000D0B0, // ...**.*....*.**... + 0x000070E0, // ....***....***.... + 0x00006060, // ....**......**.... + 0x00006060, // ....**......**.... + 0x00000000, // .................. + 0x00000000, // .................. + 0x00000000, // .................. + 0x00000000, // .................. + }, + { // 88 + 13, 22, + 0x00000000, // ............. + 0x00000000, // ............. + 0x00000000, // ............. + 0x00000000, // ............. + 0x0000180C, // .**.......**. + 0x0000180C, // .**.......**. + 0x00000C18, // ..**.....**.. + 0x00000E38, // ..***...***.. + 0x00000630, // ...**...**... + 0x00000360, // ....**.**.... + 0x000001C0, // .....***..... + 0x000001C0, // .....***..... + 0x00000360, // ....**.**.... + 0x00000630, // ...**...**... + 0x00000E38, // ..***...***.. + 0x00000C18, // ..**.....**.. + 0x0000180C, // .**.......**. + 0x0000180C, // .**.......**. + 0x00000000, // ............. + 0x00000000, // ............. + 0x00000000, // ............. + 0x00000000, // ............. + }, + { // 89 + 13, 22, + 0x00000000, // ............. + 0x00000000, // ............. + 0x00000000, // ............. + 0x00000000, // ............. + 0x0000300C, // **........**. + 0x0000300C, // **........**. + 0x00001818, // .**......**.. + 0x00001818, // .**......**.. + 0x00000C30, // ..**....**... + 0x00000E70, // ..***..***... + 0x00000660, // ...**..**.... + 0x000003C0, // ....****..... + 0x00000180, // .....**...... + 0x00000180, // .....**...... + 0x00000180, // .....**...... + 0x00000180, // .....**...... + 0x00000180, // .....**...... + 0x00000180, // .....**...... + 0x00000000, // ............. + 0x00000000, // ............. + 0x00000000, // ............. + 0x00000000, // ............. + }, + { // 90 + 12, 22, + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000FFC, // .**********. + 0x00000FFC, // .**********. + 0x0000000C, // .........**. + 0x00000018, // ........**.. + 0x00000030, // .......**... + 0x00000060, // ......**.... + 0x000000C0, // .....**..... + 0x000001C0, // ....***..... + 0x00000180, // ....**...... + 0x00000300, // ...**....... + 0x00000600, // ..**........ + 0x00000C00, // .**......... + 0x00000FFC, // .**********. + 0x00000FFC, // .**********. + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + }, + { // 91 + 5, 22, + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000000, // ..... + 0x0000003C, // ****. + 0x0000003C, // ****. + 0x00000030, // **... + 0x00000030, // **... + 0x00000030, // **... + 0x00000030, // **... + 0x00000030, // **... + 0x00000030, // **... + 0x00000030, // **... + 0x00000030, // **... + 0x00000030, // **... + 0x00000030, // **... + 0x00000030, // **... + 0x00000030, // **... + 0x00000030, // **... + 0x00000030, // **... + 0x0000003C, // ****. + 0x0000003C, // ****. + }, + { // 92 + 5, 22, + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000030, // **... + 0x00000030, // **... + 0x00000030, // **... + 0x00000018, // .**.. + 0x00000018, // .**.. + 0x00000018, // .**.. + 0x0000000C, // ..**. + 0x0000000C, // ..**. + 0x0000000C, // ..**. + 0x0000000C, // ..**. + 0x00000006, // ...** + 0x00000006, // ...** + 0x00000006, // ...** + 0x00000006, // ...** + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000000, // ..... + }, + { // 93 + 5, 22, + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000000, // ..... + 0x0000003C, // ****. + 0x0000003C, // ****. + 0x0000000C, // ..**. + 0x0000000C, // ..**. + 0x0000000C, // ..**. + 0x0000000C, // ..**. + 0x0000000C, // ..**. + 0x0000000C, // ..**. + 0x0000000C, // ..**. + 0x0000000C, // ..**. + 0x0000000C, // ..**. + 0x0000000C, // ..**. + 0x0000000C, // ..**. + 0x0000000C, // ..**. + 0x0000000C, // ..**. + 0x0000000C, // ..**. + 0x0000003C, // ****. + 0x0000003C, // ****. + }, + { // 94 + 9, 22, + 0x00000000, // ......... + 0x00000000, // ......... + 0x00000000, // ......... + 0x00000000, // ......... + 0x00000000, // ......... + 0x00000020, // ....*.... + 0x00000070, // ...***... + 0x000000D8, // ..**.**.. + 0x000000D8, // ..**.**.. + 0x0000018C, // .**...**. + 0x0000018C, // .**...**. + 0x00000000, // ......... + 0x00000000, // ......... + 0x00000000, // ......... + 0x00000000, // ......... + 0x00000000, // ......... + 0x00000000, // ......... + 0x00000000, // ......... + 0x00000000, // ......... + 0x00000000, // ......... + 0x00000000, // ......... + 0x00000000, // ......... + }, + { // 95 + 11, 22, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000FFE, // *********** + 0x00000FFE, // *********** + }, + { // 96 + 4, 22, + 0x00000000, // .... + 0x00000000, // .... + 0x00000000, // .... + 0x00000000, // .... + 0x00000018, // **.. + 0x0000000C, // .**. + 0x00000006, // ..** + 0x00000000, // .... + 0x00000000, // .... + 0x00000000, // .... + 0x00000000, // .... + 0x00000000, // .... + 0x00000000, // .... + 0x00000000, // .... + 0x00000000, // .... + 0x00000000, // .... + 0x00000000, // .... + 0x00000000, // .... + 0x00000000, // .... + 0x00000000, // .... + 0x00000000, // .... + 0x00000000, // .... + }, + { // 97 + 11, 22, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x000003F0, // ..******... + 0x00000738, // .***..***.. + 0x00000618, // .**....**.. + 0x00000038, // ......***.. + 0x000003F8, // ..*******.. + 0x00000718, // .***...**.. + 0x00000618, // .**....**.. + 0x00000618, // .**....**.. + 0x0000073C, // .***..****. + 0x000003CC, // ..****..**. + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 98 + 11, 22, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000600, // .**........ + 0x00000600, // .**........ + 0x00000600, // .**........ + 0x00000600, // .**........ + 0x000006F0, // .**.****... + 0x000007F8, // .********.. + 0x00000718, // .***...**.. + 0x0000060C, // .**.....**. + 0x0000060C, // .**.....**. + 0x0000060C, // .**.....**. + 0x0000060C, // .**.....**. + 0x00000718, // .***...**.. + 0x000007F8, // .********.. + 0x000006F0, // .**.****... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 99 + 10, 22, + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x000000F8, // ...*****.. + 0x000001FC, // ..*******. + 0x0000018C, // ..**...**. + 0x00000300, // .**....... + 0x00000300, // .**....... + 0x00000300, // .**....... + 0x00000300, // .**....... + 0x0000018C, // ..**...**. + 0x000001FC, // ..*******. + 0x000000F8, // ...*****.. + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + }, + { // 100 + 11, 22, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x0000000C, // ........**. + 0x0000000C, // ........**. + 0x0000000C, // ........**. + 0x0000000C, // ........**. + 0x000001EC, // ...****.**. + 0x000003FC, // ..********. + 0x0000031C, // ..**...***. + 0x0000060C, // .**.....**. + 0x0000060C, // .**.....**. + 0x0000060C, // .**.....**. + 0x0000060C, // .**.....**. + 0x0000031C, // ..**...***. + 0x000003FC, // ..********. + 0x000001EC, // ...****.**. + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 101 + 10, 22, + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x000000F0, // ...****... + 0x000001F8, // ..******.. + 0x0000030C, // .**....**. + 0x0000030C, // .**....**. + 0x000003FC, // .********. + 0x00000300, // .**....... + 0x00000300, // .**....... + 0x0000038C, // .***...**. + 0x000001FC, // ..*******. + 0x000000F0, // ...****... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + }, + { // 102 + 6, 22, + 0x00000000, // ...... + 0x00000000, // ...... + 0x00000000, // ...... + 0x00000000, // ...... + 0x0000000E, // ...*** + 0x0000001E, // ..**** + 0x00000018, // ..**.. + 0x00000018, // ..**.. + 0x0000007E, // ****** + 0x0000007E, // ****** + 0x00000018, // ..**.. + 0x00000018, // ..**.. + 0x00000018, // ..**.. + 0x00000018, // ..**.. + 0x00000018, // ..**.. + 0x00000018, // ..**.. + 0x00000018, // ..**.. + 0x00000018, // ..**.. + 0x00000000, // ...... + 0x00000000, // ...... + 0x00000000, // ...... + 0x00000000, // ...... + }, + { // 103 + 11, 22, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x000001EC, // ...****.**. + 0x000003FC, // ..********. + 0x0000030C, // ..**....**. + 0x0000060C, // .**.....**. + 0x0000060C, // .**.....**. + 0x0000060C, // .**.....**. + 0x0000060C, // .**.....**. + 0x0000031C, // ..**...***. + 0x000003FC, // ..********. + 0x000001EC, // ...****.**. + 0x0000000C, // ........**. + 0x00000318, // ..**...**.. + 0x000003F8, // ..*******.. + 0x000000E0, // ....***.... + }, + { // 104 + 10, 22, + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000300, // .**....... + 0x00000300, // .**....... + 0x00000300, // .**....... + 0x00000300, // .**....... + 0x00000378, // .**.****.. + 0x000003FC, // .********. + 0x0000038C, // .***...**. + 0x0000030C, // .**....**. + 0x0000030C, // .**....**. + 0x0000030C, // .**....**. + 0x0000030C, // .**....**. + 0x0000030C, // .**....**. + 0x0000030C, // .**....**. + 0x0000030C, // .**....**. + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + }, + { // 105 + 4, 22, + 0x00000000, // .... + 0x00000000, // .... + 0x00000000, // .... + 0x00000000, // .... + 0x0000000C, // .**. + 0x0000000C, // .**. + 0x00000000, // .... + 0x00000000, // .... + 0x0000000C, // .**. + 0x0000000C, // .**. + 0x0000000C, // .**. + 0x0000000C, // .**. + 0x0000000C, // .**. + 0x0000000C, // .**. + 0x0000000C, // .**. + 0x0000000C, // .**. + 0x0000000C, // .**. + 0x0000000C, // .**. + 0x00000000, // .... + 0x00000000, // .... + 0x00000000, // .... + 0x00000000, // .... + }, + { // 106 + 4, 22, + 0x00000000, // .... + 0x00000000, // .... + 0x00000000, // .... + 0x00000000, // .... + 0x0000000C, // ..**. + 0x0000000C, // ..**. + 0x00000000, // ..... + 0x00000000, // ..... + 0x0000000C, // ..**. + 0x0000000C, // ..**. + 0x0000000C, // ..**. + 0x0000000C, // ..**. + 0x0000000C, // ..**. + 0x0000000C, // ..**. + 0x0000000C, // ..**. + 0x0000000C, // ..**. + 0x0000000C, // ..**. + 0x0000000C, // ..**. + 0x0000000C, // ..**. + 0x0000000C, // ..**. + 0x0000003C, // ****. + 0x00000038, // ***.. + }, + { // 107 + 9, 22, + 0x00000000, // ......... + 0x00000000, // ......... + 0x00000000, // ......... + 0x00000000, // ......... + 0x00000180, // .**...... + 0x00000180, // .**...... + 0x00000180, // .**...... + 0x00000180, // .**...... + 0x0000018C, // .**...**. + 0x00000198, // .**..**.. + 0x000001B0, // .**.**... + 0x000001E0, // .****.... + 0x000001F0, // .*****... + 0x000001B0, // .**.**... + 0x00000198, // .**..**.. + 0x0000019C, // .**..***. + 0x0000018C, // .**...**. + 0x0000018E, // .**...*** + 0x00000000, // ......... + 0x00000000, // ......... + 0x00000000, // ......... + 0x00000000, // ......... + }, + { // 108 + 4, 22, + 0x00000000, // .... + 0x00000000, // .... + 0x00000000, // .... + 0x00000000, // .... + 0x0000000C, // .**. + 0x0000000C, // .**. + 0x0000000C, // .**. + 0x0000000C, // .**. + 0x0000000C, // .**. + 0x0000000C, // .**. + 0x0000000C, // .**. + 0x0000000C, // .**. + 0x0000000C, // .**. + 0x0000000C, // .**. + 0x0000000C, // .**. + 0x0000000C, // .**. + 0x0000000C, // .**. + 0x0000000C, // .**. + 0x00000000, // .... + 0x00000000, // .... + 0x00000000, // .... + 0x00000000, // .... + }, + { // 109 + 16, 22, + 0x00000000, // ................ + 0x00000000, // ................ + 0x00000000, // ................ + 0x00000000, // ................ + 0x00000000, // ................ + 0x00000000, // ................ + 0x00000000, // ................ + 0x00000000, // ................ + 0x0000DE78, // .**.****..****.. + 0x0000FFFC, // .**************. + 0x0000E38C, // .***...***...**. + 0x0000C30C, // .**....**....**. + 0x0000C30C, // .**....**....**. + 0x0000C30C, // .**....**....**. + 0x0000C30C, // .**....**....**. + 0x0000C30C, // .**....**....**. + 0x0000C30C, // .**....**....**. + 0x0000C30C, // .**....**....**. + 0x00000000, // ................ + 0x00000000, // ................ + 0x00000000, // ................ + 0x00000000, // ................ + }, + { // 110 + 10, 22, + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000378, // .**.****.. + 0x000003FC, // .********. + 0x0000038C, // .***...**. + 0x0000030C, // .**....**. + 0x0000030C, // .**....**. + 0x0000030C, // .**....**. + 0x0000030C, // .**....**. + 0x0000030C, // .**....**. + 0x0000030C, // .**....**. + 0x0000030C, // .**....**. + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + }, + { // 111 + 11, 22, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x000001F0, // ...*****... + 0x000003F8, // ..*******.. + 0x00000318, // ..**...**.. + 0x0000060C, // .**.....**. + 0x0000060C, // .**.....**. + 0x0000060C, // .**.....**. + 0x0000060C, // .**.....**. + 0x00000318, // ..**...**.. + 0x000003F8, // ..*******.. + 0x000001F0, // ...*****... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 112 + 11, 22, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x000006F0, // .**.****... + 0x000007F8, // .********.. + 0x00000718, // .***...**.. + 0x0000060C, // .**.....**. + 0x0000060C, // .**.....**. + 0x0000060C, // .**.....**. + 0x0000060C, // .**.....**. + 0x00000718, // .***...**.. + 0x000007F8, // .********.. + 0x000006F0, // .**.****... + 0x00000600, // .**........ + 0x00000600, // .**........ + 0x00000600, // .**........ + 0x00000600, // .**........ + }, + { // 113 + 11, 22, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x000001EC, // ...****.**. + 0x000003FC, // ..********. + 0x0000031C, // ..**...***. + 0x0000060C, // .**.....**. + 0x0000060C, // .**.....**. + 0x0000060C, // .**.....**. + 0x0000060C, // .**.....**. + 0x0000031C, // ..**...***. + 0x000003FC, // ..********. + 0x000001EC, // ...****.**. + 0x0000000C, // ........**. + 0x0000000C, // ........**. + 0x0000000C, // ........**. + 0x0000000C, // ........**. + }, + { // 114 + 6, 22, + 0x00000000, // ...... + 0x00000000, // ...... + 0x00000000, // ...... + 0x00000000, // ...... + 0x00000000, // ...... + 0x00000000, // ...... + 0x00000000, // ...... + 0x00000000, // ...... + 0x00000036, // .**.** + 0x00000036, // .**.** + 0x00000038, // .***.. + 0x00000030, // .**... + 0x00000030, // .**... + 0x00000030, // .**... + 0x00000030, // .**... + 0x00000030, // .**... + 0x00000030, // .**... + 0x00000030, // .**... + 0x00000000, // ...... + 0x00000000, // ...... + 0x00000000, // ...... + 0x00000000, // ...... + }, + { // 115 + 9, 22, + 0x00000000, // ......... + 0x00000000, // ......... + 0x00000000, // ......... + 0x00000000, // ......... + 0x00000000, // ......... + 0x00000000, // ......... + 0x00000000, // ......... + 0x00000000, // ......... + 0x00000078, // ...****.. + 0x000000FC, // ..******. + 0x0000018C, // .**...**. + 0x00000180, // .**...... + 0x000001F8, // .******.. + 0x0000007C, // ...*****. + 0x0000000C, // ......**. + 0x0000018C, // .**...**. + 0x000001F8, // .******.. + 0x000000F0, // ..****... + 0x00000000, // ......... + 0x00000000, // ......... + 0x00000000, // ......... + 0x00000000, // ......... + }, + { // 116 + 6, 22, + 0x00000000, // ...... + 0x00000000, // ...... + 0x00000000, // ...... + 0x00000000, // ...... + 0x00000000, // ...... + 0x00000018, // ..**.. + 0x00000018, // ..**.. + 0x00000018, // ..**.. + 0x0000007E, // ****** + 0x0000007E, // ****** + 0x00000018, // ..**.. + 0x00000018, // ..**.. + 0x00000018, // ..**.. + 0x00000018, // ..**.. + 0x00000018, // ..**.. + 0x00000018, // ..**.. + 0x0000001E, // ..**** + 0x0000000E, // ...*** + 0x00000000, // ...... + 0x00000000, // ...... + 0x00000000, // ...... + 0x00000000, // ...... + }, + { // 117 + 10, 22, + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x0000030C, // .**....**. + 0x0000030C, // .**....**. + 0x0000030C, // .**....**. + 0x0000030C, // .**....**. + 0x0000030C, // .**....**. + 0x0000030C, // .**....**. + 0x0000030C, // .**....**. + 0x0000031C, // .**...***. + 0x000003FC, // .********. + 0x000001EC, // ..****.**. + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + }, + { // 118 + 10, 22, + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x0000030C, // .**....**. + 0x0000030C, // .**....**. + 0x0000030C, // .**....**. + 0x00000198, // ..**..**.. + 0x00000198, // ..**..**.. + 0x00000198, // ..**..**.. + 0x00000090, // ...*..*... + 0x000000F0, // ...****... + 0x00000060, // ....**.... + 0x00000060, // ....**.... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + }, + { // 119 + 14, 22, + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x0000318C, // .**...**...**. + 0x0000318C, // .**...**...**. + 0x0000318C, // .**...**...**. + 0x00001998, // ..**..**..**.. + 0x00001998, // ..**..**..**.. + 0x00001A58, // ..**.*..*.**.. + 0x00000A50, // ...*.*..*.*... + 0x00000E70, // ...***..***... + 0x00000660, // ....**..**.... + 0x00000660, // ....**..**.... + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 120 + 10, 22, + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x0000030C, // .**....**. + 0x0000039C, // .***..***. + 0x00000198, // ..**..**.. + 0x000000F0, // ...****... + 0x00000060, // ....**.... + 0x00000060, // ....**.... + 0x000000F0, // ...****... + 0x00000198, // ..**..**.. + 0x0000039C, // .***..***. + 0x0000030C, // .**....**. + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + }, + { // 121 + 10, 22, + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x0000030C, // .**....**. + 0x0000030C, // .**....**. + 0x0000030C, // .**....**. + 0x00000198, // ..**..**.. + 0x00000198, // ..**..**.. + 0x00000198, // ..**..**.. + 0x00000090, // ...*..*... + 0x000000F0, // ...****... + 0x00000060, // ....**.... + 0x00000060, // ....**.... + 0x00000060, // ....**.... + 0x00000060, // ....**.... + 0x000001C0, // ..***..... + 0x000001C0, // ..***..... + }, + { // 122 + 9, 22, + 0x00000000, // ......... + 0x00000000, // ......... + 0x00000000, // ......... + 0x00000000, // ......... + 0x00000000, // ......... + 0x00000000, // ......... + 0x00000000, // ......... + 0x00000000, // ......... + 0x000001FC, // .*******. + 0x000001FC, // .*******. + 0x0000000C, // ......**. + 0x00000018, // .....**.. + 0x00000030, // ....**... + 0x00000060, // ...**.... + 0x000000C0, // ..**..... + 0x00000180, // .**...... + 0x000001FC, // .*******. + 0x000001FC, // .*******. + 0x00000000, // ......... + 0x00000000, // ......... + 0x00000000, // ......... + 0x00000000, // ......... + }, + { // 123 + 6, 22, + 0x00000000, // ...... + 0x00000000, // ...... + 0x00000000, // ...... + 0x00000000, // ...... + 0x0000000C, // ....**. + 0x00000018, // ...**.. + 0x00000030, // ..**... + 0x00000030, // ..**... + 0x00000030, // ..**... + 0x00000030, // ..**... + 0x00000030, // ..**... + 0x00000060, // .**.... + 0x000000C0, // **..... + 0x00000060, // .**.... + 0x00000030, // ..**... + 0x00000030, // ..**... + 0x00000030, // ..**... + 0x00000030, // ..**... + 0x00000030, // ..**... + 0x00000030, // ..**... + 0x00000018, // ...**.. + 0x0000000C, // ....**. + }, + { // 124 + 5, 22, + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000018, // .**.. + 0x00000018, // .**.. + 0x00000018, // .**.. + 0x00000018, // .**.. + 0x00000018, // .**.. + 0x00000018, // .**.. + 0x00000018, // .**.. + 0x00000018, // .**.. + 0x00000018, // .**.. + 0x00000018, // .**.. + 0x00000018, // .**.. + 0x00000018, // .**.. + 0x00000018, // .**.. + 0x00000018, // .**.. + 0x00000018, // .**.. + 0x00000018, // .**.. + 0x00000018, // .**.. + 0x00000018, // .**.. + }, + { // 125 + 6, 22, + 0x00000000, // ...... + 0x00000000, // ...... + 0x00000000, // ...... + 0x00000000, // ...... + 0x00000060, // **.... + 0x00000030, // .**... + 0x00000018, // ..**.. + 0x00000018, // ..**.. + 0x00000018, // ..**.. + 0x00000018, // ..**.. + 0x00000018, // ..**.. + 0x0000000C, // ...**. + 0x00000006, // ....** + 0x0000000C, // ...**. + 0x00000018, // ..**.. + 0x00000018, // ..**.. + 0x00000018, // ..**.. + 0x00000018, // ..**.. + 0x00000018, // ..**.. + 0x00000018, // ..**.. + 0x00000030, // .**... + 0x00000060, // **.... + }, + { // 126 + 10, 22, + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x000001CC, // ..***..**. + 0x000003FC, // .********. + 0x00000338, // .**..***.. + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + }, + { // 127 + 0, 22, + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + }, + { // 128 + 0, 22, + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + }, + { // 129 + 0, 22, + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + }, + { // 130 + 0, 22, + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + }, + { // 131 + 0, 22, + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + }, + { // 132 + 0, 22, + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + }, + { // 133 + 0, 22, + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + }, + { // 134 + 0, 22, + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + }, + { // 135 + 0, 22, + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + }, + { // 136 + 0, 22, + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + }, + { // 137 + 0, 22, + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + }, + { // 138 + 0, 22, + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + }, + { // 139 + 0, 22, + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + }, + { // 140 + 0, 22, + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + }, + { // 141 + 0, 22, + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + }, + { // 142 + 0, 22, + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + }, + { // 143 + 0, 22, + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + }, + { // 144 + 0, 22, + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + }, + { // 145 + 0, 22, + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + }, + { // 146 + 0, 22, + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + }, + { // 147 + 0, 22, + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + }, + { // 148 + 0, 22, + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + }, + { // 149 + 0, 22, + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + }, + { // 150 + 0, 22, + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + }, + { // 151 + 0, 22, + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + }, + { // 152 + 0, 22, + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + }, + { // 153 + 0, 22, + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + }, + { // 154 + 0, 22, + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + }, + { // 155 + 0, 22, + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + }, + { // 156 + 0, 22, + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + }, + { // 157 + 0, 22, + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + }, + { // 158 + 0, 22, + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + }, + { // 159 + 0, 22, + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + 0x00000000, // + }, + { // 160 + 5, 22, + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000000, // ..... + }, + { // 161 + 6, 22, + 0x00000000, // ...... + 0x00000000, // ...... + 0x00000000, // ...... + 0x00000000, // ...... + 0x00000000, // ...... + 0x00000000, // ...... + 0x00000000, // ...... + 0x00000000, // ...... + 0x00000018, // ..**.. + 0x00000018, // ..**.. + 0x00000000, // ...... + 0x00000000, // ...... + 0x00000008, // ...*.. + 0x00000008, // ...*.. + 0x00000018, // ..**.. + 0x00000018, // ..**.. + 0x00000018, // ..**.. + 0x00000018, // ..**.. + 0x00000018, // ..**.. + 0x00000018, // ..**.. + 0x00000018, // ..**.. + 0x00000018, // ..**.. + }, + { // 162 + 10, 22, + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000010, // ......*... + 0x00000010, // ......*... + 0x000000F8, // ...*****.. + 0x000001FC, // ..*******. + 0x000001AC, // ..**.*.**. + 0x00000320, // .**..*.... + 0x00000320, // .**..*.... + 0x00000320, // .**..*.... + 0x00000320, // .**..*.... + 0x000001AC, // ..**.*.**. + 0x000001FC, // ..*******. + 0x000000F8, // ...*****.. + 0x00000040, // ....*..... + 0x00000040, // ....*..... + 0x00000000, // .......... + 0x00000000, // .......... + }, + { // 163 + 10, 22, + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x000000F0, // ...****... + 0x000001F8, // ..******.. + 0x0000030C, // .**....**. + 0x0000030C, // .**....**. + 0x00000300, // .**....... + 0x00000180, // ..**...... + 0x000003F0, // .******... + 0x000000C0, // ...**..... + 0x000000C0, // ...**..... + 0x00000180, // ..**...... + 0x00000304, // .**.....*. + 0x000007FC, // *********. + 0x000006F8, // **.*****.. + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + }, + { // 164 + 10, 22, + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x0000030C, // .**....**. + 0x000003FC, // .********. + 0x00000198, // ..**..**.. + 0x00000198, // ..**..**.. + 0x00000198, // ..**..**.. + 0x000003FC, // .********. + 0x0000030C, // .**....**. + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + }, + { // 165 + 10, 22, + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x0000030C, // .**....**. + 0x0000030C, // .**....**. + 0x00000198, // ..**..**.. + 0x00000198, // ..**..**.. + 0x00000198, // ..**..**.. + 0x000000F0, // ...****... + 0x000003FC, // .********. + 0x00000060, // ....**.... + 0x000003FC, // .********. + 0x00000060, // ....**.... + 0x00000060, // ....**.... + 0x00000060, // ....**.... + 0x00000060, // ....**.... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + }, + { // 166 + 5, 22, + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000018, // .**.. + 0x00000018, // .**.. + 0x00000018, // .**.. + 0x00000018, // .**.. + 0x00000018, // .**.. + 0x00000018, // .**.. + 0x00000018, // .**.. + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000018, // .**.. + 0x00000018, // .**.. + 0x00000018, // .**.. + 0x00000018, // .**.. + 0x00000018, // .**.. + 0x00000018, // .**.. + 0x00000018, // .**.. + }, + { // 167 + 10, 22, + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x000000F0, // ...****... + 0x000001F8, // ..******.. + 0x0000030C, // .**....**. + 0x0000030C, // .**....**. + 0x000003C0, // .****..... + 0x000001F0, // ..*****... + 0x000001B8, // ..**.***.. + 0x0000031C, // .**...***. + 0x0000030C, // .**....**. + 0x0000038C, // .***...**. + 0x000001CC, // ..***..**. + 0x000000F8, // ...*****.. + 0x00000038, // .....***.. + 0x0000001C, // ......***. + 0x0000030C, // .**....**. + 0x0000030C, // .**....**. + 0x000001F8, // ..******.. + 0x000000F0, // ...****... + }, + { // 168 + 6, 22, + 0x00000000, // ...... + 0x00000000, // ...... + 0x00000000, // ...... + 0x00000000, // ...... + 0x0000006C, // **.**. + 0x0000006C, // **.**. + 0x00000000, // ...... + 0x00000000, // ...... + 0x00000000, // ...... + 0x00000000, // ...... + 0x00000000, // ...... + 0x00000000, // ...... + 0x00000000, // ...... + 0x00000000, // ...... + 0x00000000, // ...... + 0x00000000, // ...... + 0x00000000, // ...... + 0x00000000, // ...... + 0x00000000, // ...... + 0x00000000, // ...... + 0x00000000, // ...... + 0x00000000, // ...... + }, + { // 169 + 15, 22, + 0x00000000, // ............... + 0x00000000, // ............... + 0x00000000, // ............... + 0x00000000, // ............... + 0x000007C0, // .....*****..... + 0x00001830, // ...**.....**... + 0x00002008, // ..*.........*.. + 0x00002388, // ..*...***...*.. + 0x00004444, // .*...*...*...*. + 0x00004844, // .*..*....*...*. + 0x00004804, // .*..*........*. + 0x00004804, // .*..*........*. + 0x00004804, // .*..*........*. + 0x00004444, // .*...*...*...*. + 0x00002388, // ..*...***...*.. + 0x00002008, // ..*.........*.. + 0x00001830, // ...**.....**... + 0x000007C0, // .....*****..... + 0x00000000, // ............... + 0x00000000, // ............... + 0x00000000, // ............... + 0x00000000, // ............... + }, + { // 170 + 7, 22, + 0x00000000, // ....... + 0x00000000, // ....... + 0x00000000, // ....... + 0x00000000, // ....... + 0x00000038, // ..***.. + 0x0000004C, // .*..**. + 0x0000001C, // ...***. + 0x00000024, // ..*..*. + 0x0000006C, // .**.**. + 0x00000034, // ..**.*. + 0x00000000, // ....... + 0x0000007C, // .*****. + 0x00000000, // ....... + 0x00000000, // ....... + 0x00000000, // ....... + 0x00000000, // ....... + 0x00000000, // ....... + 0x00000000, // ....... + 0x00000000, // ....... + 0x00000000, // ....... + 0x00000000, // ....... + 0x00000000, // ....... + }, + { // 171 + 9, 22, + 0x00000000, // ......... + 0x00000000, // ......... + 0x00000000, // ......... + 0x00000000, // ......... + 0x00000000, // ......... + 0x00000000, // ......... + 0x00000000, // ......... + 0x00000000, // ......... + 0x00000000, // ......... + 0x00000000, // ......... + 0x0000006C, // ...**.**. + 0x000000D8, // ..**.**.. + 0x000001B0, // .**.**... + 0x000001B0, // .**.**... + 0x000000D8, // ..**.**.. + 0x0000006C, // ...**.**. + 0x00000000, // ......... + 0x00000000, // ......... + 0x00000000, // ......... + 0x00000000, // ......... + 0x00000000, // ......... + 0x00000000, // ......... + }, + { // 172 + 11, 22, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x000007FC, // .*********. + 0x000007FC, // .*********. + 0x0000000C, // ........**. + 0x0000000C, // ........**. + 0x0000000C, // ........**. + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 173 + 6, 22, + 0x00000000, // ...... + 0x00000000, // ...... + 0x00000000, // ...... + 0x00000000, // ...... + 0x00000000, // ...... + 0x00000000, // ...... + 0x00000000, // ...... + 0x00000000, // ...... + 0x00000000, // ...... + 0x00000000, // ...... + 0x00000000, // ...... + 0x00000000, // ...... + 0x0000007C, // *****. + 0x00000000, // ...... + 0x00000000, // ...... + 0x00000000, // ...... + 0x00000000, // ...... + 0x00000000, // ...... + 0x00000000, // ...... + 0x00000000, // ...... + 0x00000000, // ...... + 0x00000000, // ...... + }, + { // 174 + 14, 22, + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x000007C0, // ....*****..... + 0x00001830, // ..**.....**... + 0x00002008, // .*.........*.. + 0x000027C8, // .*..*****..*.. + 0x00004424, // *...*....*..*. + 0x00004424, // *...*....*..*. + 0x00004424, // *...*....*..*. + 0x000047C4, // *...*****...*. + 0x00004484, // *...*..*....*. + 0x00004444, // *...*...*...*. + 0x00002428, // .*..*....*.*.. + 0x00002008, // .*.........*.. + 0x00001830, // ..**.....**... + 0x000007C0, // ....*****..... + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 175 + 5, 22, + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000000, // ..... + 0x0000003E, // ***** + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000000, // ..... + }, + { // 176 + 7, 22, + 0x00000000, // ....... + 0x00000000, // ....... + 0x00000000, // ....... + 0x00000000, // ....... + 0x00000000, // ....... + 0x00000038, // ..***.. + 0x0000006C, // .**.**. + 0x00000044, // .*...*. + 0x0000006C, // .**.**. + 0x00000038, // ..***.. + 0x00000000, // ....... + 0x00000000, // ....... + 0x00000000, // ....... + 0x00000000, // ....... + 0x00000000, // ....... + 0x00000000, // ....... + 0x00000000, // ....... + 0x00000000, // ....... + 0x00000000, // ....... + 0x00000000, // ....... + 0x00000000, // ....... + 0x00000000, // ....... + }, + { // 177 + 10, 22, + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000060, // ....**.... + 0x00000060, // ....**.... + 0x00000060, // ....**.... + 0x000003FC, // .********. + 0x000003FC, // .********. + 0x00000060, // ....**.... + 0x00000060, // ....**.... + 0x00000060, // ....**.... + 0x00000000, // .......... + 0x000003FC, // .********. + 0x000003FC, // .********. + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + }, + { // 178 + 6, 22, + 0x00000000, // ...... + 0x00000000, // ...... + 0x00000000, // ...... + 0x00000000, // ...... + 0x00000000, // ...... + 0x00000038, // .***.. + 0x0000007C, // *****. + 0x0000004C, // *..**. + 0x0000000C, // ...**. + 0x00000018, // ..**.. + 0x00000030, // .**... + 0x0000007C, // *****. + 0x0000007C, // *****. + 0x00000000, // ...... + 0x00000000, // ...... + 0x00000000, // ...... + 0x00000000, // ...... + 0x00000000, // ...... + 0x00000000, // ...... + 0x00000000, // ...... + 0x00000000, // ...... + 0x00000000, // ...... + }, + { // 179 + 6, 22, + 0x00000000, // ...... + 0x00000000, // ...... + 0x00000000, // ...... + 0x00000000, // ...... + 0x00000000, // ...... + 0x00000038, // .***.. + 0x0000007C, // *****. + 0x0000004C, // *..**. + 0x00000018, // ..**.. + 0x00000018, // ..**.. + 0x0000004C, // *..**. + 0x0000007C, // *****. + 0x00000038, // .***.. + 0x00000000, // ...... + 0x00000000, // ...... + 0x00000000, // ...... + 0x00000000, // ...... + 0x00000000, // ...... + 0x00000000, // ...... + 0x00000000, // ...... + 0x00000000, // ...... + 0x00000000, // ...... + }, + { // 180 + 4, 22, + 0x00000000, // .... + 0x00000000, // .... + 0x00000000, // .... + 0x00000000, // .... + 0x00000006, // ..** + 0x0000000C, // .**. + 0x00000018, // **.. + 0x00000000, // .... + 0x00000000, // .... + 0x00000000, // .... + 0x00000000, // .... + 0x00000000, // .... + 0x00000000, // .... + 0x00000000, // .... + 0x00000000, // .... + 0x00000000, // .... + 0x00000000, // .... + 0x00000000, // .... + 0x00000000, // .... + 0x00000000, // .... + 0x00000000, // .... + 0x00000000, // .... + }, + { // 181 + 10, 22, + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x0000030C, // .**....**. + 0x0000030C, // .**....**. + 0x0000030C, // .**....**. + 0x0000030C, // .**....**. + 0x0000030C, // .**....**. + 0x0000030C, // .**....**. + 0x0000030C, // .**....**. + 0x0000039C, // .***..***. + 0x000003FC, // .********. + 0x0000036C, // .**.**.**. + 0x00000300, // .**....... + 0x00000300, // .**....... + 0x00000300, // .**....... + 0x00000300, // .**....... + }, + { // 182 + 10, 22, + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x000000FC, // ...******. + 0x000001C8, // ..***..*.. + 0x000003C8, // .****..*.. + 0x000003C8, // .****..*.. + 0x000003C8, // .****..*.. + 0x000003C8, // .****..*.. + 0x000003C8, // .****..*.. + 0x000001C8, // ..***..*.. + 0x000000C8, // ...**..*.. + 0x00000048, // ....*..*.. + 0x00000048, // ....*..*.. + 0x00000048, // ....*..*.. + 0x00000048, // ....*..*.. + 0x00000048, // ....*..*.. + 0x00000048, // ....*..*.. + 0x00000048, // ....*..*.. + 0x00000048, // ....*..*.. + 0x00000048, // ....*..*.. + }, + { // 183 + 4, 22, + 0x00000000, // .... + 0x00000000, // .... + 0x00000000, // .... + 0x00000000, // .... + 0x00000000, // .... + 0x00000000, // .... + 0x00000000, // .... + 0x00000000, // .... + 0x00000000, // .... + 0x00000000, // .... + 0x00000000, // .... + 0x00000000, // .... + 0x0000000C, // .**. + 0x0000000C, // .**. + 0x00000000, // .... + 0x00000000, // .... + 0x00000000, // .... + 0x00000000, // .... + 0x00000000, // .... + 0x00000000, // .... + 0x00000000, // .... + 0x00000000, // .... + }, + { // 184 + 5, 22, + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000018, // .**.. + 0x0000001C, // .***. + 0x00000006, // ...** + 0x00000036, // **.** + 0x0000003C, // ****. + }, + { // 185 + 6, 22, + 0x00000000, // ...... + 0x00000000, // ...... + 0x00000000, // ...... + 0x00000000, // ...... + 0x00000000, // ...... + 0x00000018, // ..**.. + 0x00000078, // ****.. + 0x00000078, // ****.. + 0x00000018, // ..**.. + 0x00000018, // ..**.. + 0x00000018, // ..**.. + 0x00000018, // ..**.. + 0x00000018, // ..**.. + 0x00000000, // ...... + 0x00000000, // ...... + 0x00000000, // ...... + 0x00000000, // ...... + 0x00000000, // ...... + 0x00000000, // ...... + 0x00000000, // ...... + 0x00000000, // ...... + 0x00000000, // ...... + }, + { // 186 + 7, 22, + 0x00000000, // ....... + 0x00000000, // ....... + 0x00000000, // ....... + 0x00000000, // ....... + 0x00000038, // ..***.. + 0x0000006C, // .**.**. + 0x00000044, // .*...*. + 0x00000044, // .*...*. + 0x0000006C, // .**.**. + 0x00000038, // ..***.. + 0x00000000, // ....... + 0x0000007C, // .*****. + 0x00000000, // ....... + 0x00000000, // ....... + 0x00000000, // ....... + 0x00000000, // ....... + 0x00000000, // ....... + 0x00000000, // ....... + 0x00000000, // ....... + 0x00000000, // ....... + 0x00000000, // ....... + 0x00000000, // ....... + }, + { // 187 + 9, 22, + 0x00000000, // ......... + 0x00000000, // ......... + 0x00000000, // ......... + 0x00000000, // ......... + 0x00000000, // ......... + 0x00000000, // ......... + 0x00000000, // ......... + 0x00000000, // ......... + 0x00000000, // ......... + 0x00000000, // ......... + 0x000001B0, // .**.**... + 0x000000D8, // ..**.**.. + 0x0000006C, // ...**.**. + 0x0000006C, // ...**.**. + 0x000000D8, // ..**.**.. + 0x000001B0, // .**.**... + 0x00000000, // ......... + 0x00000000, // ......... + 0x00000000, // ......... + 0x00000000, // ......... + 0x00000000, // ......... + 0x00000000, // ......... + }, + { // 188 + 15, 22, + 0x00000000, // ............... + 0x00000000, // ............... + 0x00000000, // ............... + 0x00000000, // ............... + 0x00000000, // ............... + 0x00003030, // ..**......**... + 0x0000F030, // ****......**... + 0x0000F060, // ****.....**.... + 0x000030C0, // ..**....**..... + 0x000030C0, // ..**....**..... + 0x00003188, // ..**...**...*.. + 0x00003118, // ..**...*...**.. + 0x00003338, // ..**..**..***.. + 0x00000678, // .....**..****.. + 0x000006D8, // .....**.**.**.. + 0x00000CFC, // ....**..******. + 0x00001818, // ...**......**.. + 0x00001818, // ...**......**.. + 0x00000000, // ............... + 0x00000000, // ............... + 0x00000000, // ............... + 0x00000000, // ............... + }, + { // 189 + 15, 22, + 0x00000000, // ............... + 0x00000000, // ............... + 0x00000000, // ............... + 0x00000000, // ............... + 0x00000000, // ............... + 0x00003030, // ..**......**... + 0x0000F030, // ****......**... + 0x0000F060, // ****.....**.... + 0x000030C0, // ..**....**..... + 0x000030C0, // ..**....**..... + 0x000031B8, // ..**...**.***.. + 0x0000317C, // ..**...*.*****. + 0x0000334C, // ..**..**.*..**. + 0x0000060C, // .....**.....**. + 0x00000618, // .....**....**.. + 0x00000C30, // ....**....**... + 0x0000187C, // ...**....*****. + 0x0000187C, // ...**....*****. + 0x00000000, // ............... + 0x00000000, // ............... + 0x00000000, // ............... + 0x00000000, // ............... + }, + { // 190 + 15, 22, + 0x00000000, // ............... + 0x00000000, // ............... + 0x00000000, // ............... + 0x00000000, // ............... + 0x00000000, // ............... + 0x00007030, // .***......**... + 0x0000F830, // *****.....**... + 0x00009860, // *..**....**.... + 0x000030C0, // ..**....**..... + 0x000030C0, // ..**....**..... + 0x00009988, // *..**..**...*.. + 0x0000F918, // *****..*...**.. + 0x00007338, // .***..**..***.. + 0x00000678, // .....**..****.. + 0x000006D8, // .....**.**.**.. + 0x00000CFC, // ....**..******. + 0x00001818, // ...**......**.. + 0x00001818, // ...**......**.. + 0x00000000, // ............... + 0x00000000, // ............... + 0x00000000, // ............... + 0x00000000, // ............... + }, + { // 191 + 10, 22, + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000060, // ....**.... + 0x00000060, // ....**.... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000060, // ....**.... + 0x00000060, // ....**.... + 0x00000060, // ....**.... + 0x000000E0, // ...***.... + 0x000001C0, // ..***..... + 0x00000380, // .***...... + 0x00000318, // .**...**.. + 0x00000318, // .**...**.. + 0x000003F8, // .*******.. + 0x000001F0, // ..*****... + }, + { // 192 + 13, 22, + 0x00000600, // ...**........ + 0x00000300, // ....**....... + 0x00000180, // .....**...... + 0x00000000, // ............. + 0x00000180, // .....**...... + 0x00000180, // .....**...... + 0x000003C0, // ....****..... + 0x000003C0, // ....****..... + 0x00000660, // ...**..**.... + 0x00000660, // ...**..**.... + 0x00000C30, // ..**....**... + 0x00000C30, // ..**....**... + 0x00000FF0, // ..********... + 0x00001FF8, // .**********.. + 0x00001818, // .**......**.. + 0x00001818, // .**......**.. + 0x0000300C, // **........**. + 0x0000300C, // **........**. + 0x00000000, // ............. + 0x00000000, // ............. + 0x00000000, // ............. + 0x00000000, // ............. + }, + { // 193 + 13, 22, + 0x00000060, // .......**.... + 0x000000C0, // ......**..... + 0x00000180, // .....**...... + 0x00000000, // ............. + 0x00000180, // .....**...... + 0x00000180, // .....**...... + 0x000003C0, // ....****..... + 0x000003C0, // ....****..... + 0x00000660, // ...**..**.... + 0x00000660, // ...**..**.... + 0x00000C30, // ..**....**... + 0x00000C30, // ..**....**... + 0x00000FF0, // ..********... + 0x00001FF8, // .**********.. + 0x00001818, // .**......**.. + 0x00001818, // .**......**.. + 0x0000300C, // **........**. + 0x0000300C, // **........**. + 0x00000000, // ............. + 0x00000000, // ............. + 0x00000000, // ............. + 0x00000000, // ............. + }, + { // 194 + 13, 22, + 0x00000180, // .....**...... + 0x000003C0, // ....****..... + 0x00000660, // ...**..**.... + 0x00000000, // ............. + 0x00000180, // .....**...... + 0x00000180, // .....**...... + 0x000003C0, // ....****..... + 0x000003C0, // ....****..... + 0x00000660, // ...**..**.... + 0x00000660, // ...**..**.... + 0x00000C30, // ..**....**... + 0x00000C30, // ..**....**... + 0x00000FF0, // ..********... + 0x00001FF8, // .**********.. + 0x00001818, // .**......**.. + 0x00001818, // .**......**.. + 0x0000300C, // **........**. + 0x0000300C, // **........**. + 0x00000000, // ............. + 0x00000000, // ............. + 0x00000000, // ............. + 0x00000000, // ............. + }, + { // 195 + 13, 22, + 0x00000320, // ....**..*.... + 0x000005A0, // ...*.**.*.... + 0x000004C0, // ...*..**..... + 0x00000000, // ............. + 0x00000180, // .....**...... + 0x00000180, // .....**...... + 0x000003C0, // ....****..... + 0x000003C0, // ....****..... + 0x00000660, // ...**..**.... + 0x00000660, // ...**..**.... + 0x00000C30, // ..**....**... + 0x00000C30, // ..**....**... + 0x00000FF0, // ..********... + 0x00001FF8, // .**********.. + 0x00001818, // .**......**.. + 0x00001818, // .**......**.. + 0x0000300C, // **........**. + 0x0000300C, // **........**. + 0x00000000, // ............. + 0x00000000, // ............. + 0x00000000, // ............. + 0x00000000, // ............. + }, + { // 196 + 13, 22, + 0x00000000, // ............. + 0x00000660, // ...**..**.... + 0x00000660, // ...**..**.... + 0x00000000, // ............. + 0x00000180, // .....**...... + 0x00000180, // .....**...... + 0x000003C0, // ....****..... + 0x000003C0, // ....****..... + 0x00000660, // ...**..**.... + 0x00000660, // ...**..**.... + 0x00000C30, // ..**....**... + 0x00000C30, // ..**....**... + 0x00000FF0, // ..********... + 0x00001FF8, // .**********.. + 0x00001818, // .**......**.. + 0x00001818, // .**......**.. + 0x0000300C, // **........**. + 0x0000300C, // **........**. + 0x00000000, // ............. + 0x00000000, // ............. + 0x00000000, // ............. + 0x00000000, // ............. + }, + { // 197 + 13, 22, + 0x00000000, // ............. + 0x00000180, // .....**...... + 0x00000240, // ....*..*..... + 0x00000240, // ....*..*..... + 0x00000180, // .....**...... + 0x00000180, // .....**...... + 0x000003C0, // ....****..... + 0x000003C0, // ....****..... + 0x00000660, // ...**..**.... + 0x00000660, // ...**..**.... + 0x00000C30, // ..**....**... + 0x00000C30, // ..**....**... + 0x00000FF0, // ..********... + 0x00001FF8, // .**********.. + 0x00001818, // .**......**.. + 0x00001818, // .**......**.. + 0x0000300C, // **........**. + 0x0000300C, // **........**. + 0x00000000, // ............. + 0x00000000, // ............. + 0x00000000, // ............. + 0x00000000, // ............. + }, + { // 198 + 18, 22, + 0x00000000, // .................. + 0x00000000, // .................. + 0x00000000, // .................. + 0x00000000, // .................. + 0x00001FFC, // ......***********. + 0x00001FFC, // ......***********. + 0x00003600, // .....**.**........ + 0x00003600, // .....**.**........ + 0x00006600, // ....**..**........ + 0x00006600, // ....**..**........ + 0x0000C7F8, // ...**...********.. + 0x0000C7F8, // ...**...********.. + 0x0000FE00, // ...*******........ + 0x0001FE00, // ..********........ + 0x00018600, // ..**....**........ + 0x00018600, // ..**....**........ + 0x000307FC, // .**.....*********. + 0x000307FC, // .**.....*********. + 0x00000000, // .................. + 0x00000000, // .................. + 0x00000000, // .................. + 0x00000000, // .................. + }, + { // 199 + 14, 22, + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x000003E0, // .....*****.... + 0x00000FF8, // ...*********.. + 0x00001C1C, // ..***.....***. + 0x0000180C, // ..**.......**. + 0x00003800, // .***.......... + 0x00003000, // .**........... + 0x00003000, // .**........... + 0x00003000, // .**........... + 0x00003000, // .**........... + 0x00003800, // .***.......... + 0x0000180C, // ..**.......**. + 0x00001C1C, // ..***.....***. + 0x00000FF8, // ...*********.. + 0x000003E0, // .....*****.... + 0x00000180, // ......**...... + 0x000000C0, // .......**..... + 0x000006C0, // ....**.**..... + 0x00000780, // ....****...... + }, + { // 200 + 13, 22, + 0x00000300, // ....**....... + 0x00000180, // .....**...... + 0x000000C0, // ......**..... + 0x00000000, // ............. + 0x00000FFC, // ..**********. + 0x00000FFC, // ..**********. + 0x00000C00, // ..**......... + 0x00000C00, // ..**......... + 0x00000C00, // ..**......... + 0x00000C00, // ..**......... + 0x00000FF8, // ..*********.. + 0x00000FF8, // ..*********.. + 0x00000C00, // ..**......... + 0x00000C00, // ..**......... + 0x00000C00, // ..**......... + 0x00000C00, // ..**......... + 0x00000FFC, // ..**********. + 0x00000FFC, // ..**********. + 0x00000000, // ............. + 0x00000000, // ............. + 0x00000000, // ............. + 0x00000000, // ............. + }, + { // 201 + 13, 22, + 0x00000030, // ........**... + 0x00000060, // .......**.... + 0x000000C0, // ......**..... + 0x00000000, // ............. + 0x00000FFC, // ..**********. + 0x00000FFC, // ..**********. + 0x00000C00, // ..**......... + 0x00000C00, // ..**......... + 0x00000C00, // ..**......... + 0x00000C00, // ..**......... + 0x00000FF8, // ..*********.. + 0x00000FF8, // ..*********.. + 0x00000C00, // ..**......... + 0x00000C00, // ..**......... + 0x00000C00, // ..**......... + 0x00000C00, // ..**......... + 0x00000FFC, // ..**********. + 0x00000FFC, // ..**********. + 0x00000000, // ............. + 0x00000000, // ............. + 0x00000000, // ............. + 0x00000000, // ............. + }, + { // 202 + 13, 22, + 0x000000C0, // ......**..... + 0x000001E0, // .....****.... + 0x00000330, // ....**..**... + 0x00000000, // ............. + 0x00000FFC, // ..**********. + 0x00000FFC, // ..**********. + 0x00000C00, // ..**......... + 0x00000C00, // ..**......... + 0x00000C00, // ..**......... + 0x00000C00, // ..**......... + 0x00000FF8, // ..*********.. + 0x00000FF8, // ..*********.. + 0x00000C00, // ..**......... + 0x00000C00, // ..**......... + 0x00000C00, // ..**......... + 0x00000C00, // ..**......... + 0x00000FFC, // ..**********. + 0x00000FFC, // ..**********. + 0x00000000, // ............. + 0x00000000, // ............. + 0x00000000, // ............. + 0x00000000, // ............. + }, + { // 203 + 13, 22, + 0x00000000, // ............. + 0x00000330, // ....**..**... + 0x00000330, // ....**..**... + 0x00000000, // ............. + 0x00000FFC, // ..**********. + 0x00000FFC, // ..**********. + 0x00000C00, // ..**......... + 0x00000C00, // ..**......... + 0x00000C00, // ..**......... + 0x00000C00, // ..**......... + 0x00000FF8, // ..*********.. + 0x00000FF8, // ..*********.. + 0x00000C00, // ..**......... + 0x00000C00, // ..**......... + 0x00000C00, // ..**......... + 0x00000C00, // ..**......... + 0x00000FFC, // ..**********. + 0x00000FFC, // ..**********. + 0x00000000, // ............. + 0x00000000, // ............. + 0x00000000, // ............. + 0x00000000, // ............. + }, + { // 204 + 6, 22, + 0x00000060, // **.... + 0x00000030, // .**... + 0x00000018, // ..**.. + 0x00000000, // ...... + 0x00000018, // ..**.. + 0x00000018, // ..**.. + 0x00000018, // ..**.. + 0x00000018, // ..**.. + 0x00000018, // ..**.. + 0x00000018, // ..**.. + 0x00000018, // ..**.. + 0x00000018, // ..**.. + 0x00000018, // ..**.. + 0x00000018, // ..**.. + 0x00000018, // ..**.. + 0x00000018, // ..**.. + 0x00000018, // ..**.. + 0x00000018, // ..**.. + 0x00000000, // ...... + 0x00000000, // ...... + 0x00000000, // ...... + 0x00000000, // ...... + }, + { // 205 + 6, 22, + 0x00000006, // ....** + 0x0000000C, // ...**. + 0x00000018, // ..**.. + 0x00000000, // ...... + 0x00000018, // ..**.. + 0x00000018, // ..**.. + 0x00000018, // ..**.. + 0x00000018, // ..**.. + 0x00000018, // ..**.. + 0x00000018, // ..**.. + 0x00000018, // ..**.. + 0x00000018, // ..**.. + 0x00000018, // ..**.. + 0x00000018, // ..**.. + 0x00000018, // ..**.. + 0x00000018, // ..**.. + 0x00000018, // ..**.. + 0x00000018, // ..**.. + 0x00000000, // ...... + 0x00000000, // ...... + 0x00000000, // ...... + 0x00000000, // ...... + }, + { // 206 + 6, 22, + 0x00000018, // ..**.. + 0x0000003C, // .****. + 0x00000042, // *....* + 0x00000000, // ...... + 0x00000018, // ..**.. + 0x00000018, // ..**.. + 0x00000018, // ..**.. + 0x00000018, // ..**.. + 0x00000018, // ..**.. + 0x00000018, // ..**.. + 0x00000018, // ..**.. + 0x00000018, // ..**.. + 0x00000018, // ..**.. + 0x00000018, // ..**.. + 0x00000018, // ..**.. + 0x00000018, // ..**.. + 0x00000018, // ..**.. + 0x00000018, // ..**.. + 0x00000000, // ...... + 0x00000000, // ...... + 0x00000000, // ...... + 0x00000000, // ...... + }, + { // 207 + 6, 22, + 0x00000000, // ...... + 0x00000066, // **..** + 0x00000066, // **..** + 0x00000000, // ...... + 0x00000018, // ..**.. + 0x00000018, // ..**.. + 0x00000018, // ..**.. + 0x00000018, // ..**.. + 0x00000018, // ..**.. + 0x00000018, // ..**.. + 0x00000018, // ..**.. + 0x00000018, // ..**.. + 0x00000018, // ..**.. + 0x00000018, // ..**.. + 0x00000018, // ..**.. + 0x00000018, // ..**.. + 0x00000018, // ..**.. + 0x00000018, // ..**.. + 0x00000000, // ...... + 0x00000000, // ...... + 0x00000000, // ...... + 0x00000000, // ...... + }, + { // 208 + 14, 22, + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00003FE0, // ..*********.... + 0x00003FF0, // ..**********... + 0x00003038, // ..**......***.. + 0x00003018, // ..**.......**.. + 0x0000300C, // ..**........**. + 0x0000300C, // ..**........**. + 0x0000FE0C, // *******.....**. + 0x0000FE0C, // *******.....**. + 0x0000300C, // ..**........**. + 0x0000300C, // ..**........**. + 0x00003018, // ..**.......**.. + 0x00003038, // ..**......***.. + 0x00003FF0, // ..**********... + 0x00003FE0, // ..*********.... + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 209 + 14, 22, + 0x00000320, // .....**..*.... + 0x000005A0, // ....*.**.*.... + 0x000004C0, // ....*..**..... + 0x00000000, // .............. + 0x00003018, // .**.......**.. + 0x00003818, // .***......**.. + 0x00003C18, // .****.....**.. + 0x00003C18, // .****.....**.. + 0x00003618, // .**.**....**.. + 0x00003318, // .**..**...**.. + 0x00003318, // .**..**...**.. + 0x00003198, // .**...**..**.. + 0x00003198, // .**...**..**.. + 0x000030D8, // .**....**.**.. + 0x00003078, // .**.....****.. + 0x00003078, // .**.....****.. + 0x00003038, // .**......***.. + 0x00003018, // .**.......**.. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 210 + 15, 22, + 0x00000C00, // ....**......... + 0x00000600, // .....**........ + 0x00000300, // ......**....... + 0x00000000, // ............... + 0x000007C0, // .....*****..... + 0x00001FF0, // ...*********... + 0x00003838, // ..***.....***.. + 0x00003018, // ..**.......**.. + 0x0000701C, // .***.......***. + 0x0000600C, // .**.........**. + 0x0000600C, // .**.........**. + 0x0000600C, // .**.........**. + 0x0000600C, // .**.........**. + 0x0000701C, // .***.......***. + 0x00003018, // ..**.......**.. + 0x00003838, // ..***.....***.. + 0x00001FF0, // ...*********... + 0x000007C0, // .....*****..... + 0x00000000, // ............... + 0x00000000, // ............... + 0x00000000, // ............... + 0x00000000, // ............... + }, + { // 211 + 15, 22, + 0x000000C0, // ........**..... + 0x00000180, // .......**...... + 0x00000300, // ......**....... + 0x00000000, // ............... + 0x000007C0, // .....*****..... + 0x00001FF0, // ...*********... + 0x00003838, // ..***.....***.. + 0x00003018, // ..**.......**.. + 0x0000701C, // .***.......***. + 0x0000600C, // .**.........**. + 0x0000600C, // .**.........**. + 0x0000600C, // .**.........**. + 0x0000600C, // .**.........**. + 0x0000701C, // .***.......***. + 0x00003018, // ..**.......**.. + 0x00003838, // ..***.....***.. + 0x00001FF0, // ...*********... + 0x000007C0, // .....*****..... + 0x00000000, // ............... + 0x00000000, // ............... + 0x00000000, // ............... + 0x00000000, // ............... + }, + { // 212 + 15, 22, + 0x00000180, // .......**...... + 0x000003C0, // ......****..... + 0x00000660, // .....**..**.... + 0x00000000, // ............... + 0x000007C0, // .....*****..... + 0x00001FF0, // ...*********... + 0x00003838, // ..***.....***.. + 0x00003018, // ..**.......**.. + 0x0000701C, // .***.......***. + 0x0000600C, // .**.........**. + 0x0000600C, // .**.........**. + 0x0000600C, // .**.........**. + 0x0000600C, // .**.........**. + 0x0000701C, // .***.......***. + 0x00003018, // ..**.......**.. + 0x00003838, // ..***.....***.. + 0x00001FF0, // ...*********... + 0x000007C0, // .....*****..... + 0x00000000, // ............... + 0x00000000, // ............... + 0x00000000, // ............... + 0x00000000, // ............... + }, + { // 213 + 15, 22, + 0x00000320, // ......**..*.... + 0x000005A0, // .....*.**.*.... + 0x000004C0, // .....*..**..... + 0x00000000, // ............... + 0x000007C0, // .....*****..... + 0x00001FF0, // ...*********... + 0x00003838, // ..***.....***.. + 0x00003018, // ..**.......**.. + 0x0000701C, // .***.......***. + 0x0000600C, // .**.........**. + 0x0000600C, // .**.........**. + 0x0000600C, // .**.........**. + 0x0000600C, // .**.........**. + 0x0000701C, // .***.......***. + 0x00003018, // ..**.......**.. + 0x00003838, // ..***.....***.. + 0x00001FF0, // ...*********... + 0x000007C0, // .....*****..... + 0x00000000, // ............... + 0x00000000, // ............... + 0x00000000, // ............... + 0x00000000, // ............... + }, + { // 214 + 15, 22, + 0x00000000, // ............... + 0x00000660, // .....**..**.... + 0x00000660, // .....**..**.... + 0x00000000, // ............... + 0x000007C0, // .....*****..... + 0x00001FF0, // ...*********... + 0x00003838, // ..***.....***.. + 0x00003018, // ..**.......**.. + 0x0000701C, // .***.......***. + 0x0000600C, // .**.........**. + 0x0000600C, // .**.........**. + 0x0000600C, // .**.........**. + 0x0000600C, // .**.........**. + 0x0000701C, // .***.......***. + 0x00003018, // ..**.......**.. + 0x00003838, // ..***.....***.. + 0x00001FF0, // ...*********... + 0x000007C0, // .....*****..... + 0x00000000, // ............... + 0x00000000, // ............... + 0x00000000, // ............... + 0x00000000, // ............... + }, + { // 215 + 10, 22, + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000606, // **......** + 0x0000030C, // .**....**. + 0x00000198, // ..**..**.. + 0x000000F0, // ...****... + 0x00000060, // ....**.... + 0x000000F0, // ...****... + 0x00000198, // ..**..**.. + 0x0000030C, // .**....**. + 0x00000606, // **......** + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + }, + { // 216 + 15, 22, + 0x00000000, // ............... + 0x00000000, // ............... + 0x00000000, // ............... + 0x00000000, // ............... + 0x000007CC, // .....*****..**. + 0x00001FF8, // ...**********.. + 0x00003830, // ..***.....**... + 0x00003078, // ..**.....****.. + 0x000070DC, // .***....**.***. + 0x0000618C, // .**....**...**. + 0x0000630C, // .**...**....**. + 0x0000620C, // .**...*.....**. + 0x0000660C, // .**..**.....**. + 0x00006C1C, // .**.**.....***. + 0x00003818, // ..***......**.. + 0x00003838, // ..***.....***.. + 0x00006FF0, // .**.********... + 0x0000C7C0, // **...*****..... + 0x00000000, // ............... + 0x00000000, // ............... + 0x00000000, // ............... + 0x00000000, // ............... + }, + { // 217 + 14, 22, + 0x00000600, // ....**........ + 0x00000300, // .....**....... + 0x00000180, // ......**...... + 0x00000000, // .............. + 0x00003018, // .**.......**.. + 0x00003018, // .**.......**.. + 0x00003018, // .**.......**.. + 0x00003018, // .**.......**.. + 0x00003018, // .**.......**.. + 0x00003018, // .**.......**.. + 0x00003018, // .**.......**.. + 0x00003018, // .**.......**.. + 0x00003018, // .**.......**.. + 0x00003018, // .**.......**.. + 0x00003018, // .**.......**.. + 0x00001830, // ..**.....**... + 0x00001FF0, // ..*********... + 0x000007C0, // ....*****..... + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 218 + 14, 22, + 0x000000C0, // .......**..... + 0x00000180, // ......**...... + 0x00000300, // .....**....... + 0x00000000, // .............. + 0x00003018, // .**.......**.. + 0x00003018, // .**.......**.. + 0x00003018, // .**.......**.. + 0x00003018, // .**.......**.. + 0x00003018, // .**.......**.. + 0x00003018, // .**.......**.. + 0x00003018, // .**.......**.. + 0x00003018, // .**.......**.. + 0x00003018, // .**.......**.. + 0x00003018, // .**.......**.. + 0x00003018, // .**.......**.. + 0x00001830, // ..**.....**... + 0x00001FF0, // ..*********... + 0x000007C0, // ....*****..... + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 219 + 14, 22, + 0x00000180, // ......**...... + 0x000003C0, // .....****..... + 0x00000660, // ....**..**.... + 0x00000000, // .............. + 0x00003018, // .**.......**.. + 0x00003018, // .**.......**.. + 0x00003018, // .**.......**.. + 0x00003018, // .**.......**.. + 0x00003018, // .**.......**.. + 0x00003018, // .**.......**.. + 0x00003018, // .**.......**.. + 0x00003018, // .**.......**.. + 0x00003018, // .**.......**.. + 0x00003018, // .**.......**.. + 0x00003018, // .**.......**.. + 0x00001830, // ..**.....**... + 0x00001FF0, // ..*********... + 0x000007C0, // ....*****..... + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 220 + 14, 22, + 0x00000000, // .............. + 0x00000C60, // ...**...**.... + 0x00000C60, // ...**...**.... + 0x00000000, // .............. + 0x00003018, // .**.......**.. + 0x00003018, // .**.......**.. + 0x00003018, // .**.......**.. + 0x00003018, // .**.......**.. + 0x00003018, // .**.......**.. + 0x00003018, // .**.......**.. + 0x00003018, // .**.......**.. + 0x00003018, // .**.......**.. + 0x00003018, // .**.......**.. + 0x00003018, // .**.......**.. + 0x00003018, // .**.......**.. + 0x00001830, // ..**.....**... + 0x00001FF0, // ..*********... + 0x000007C0, // ....*****..... + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + 0x00000000, // .............. + }, + { // 221 + 13, 22, + 0x00000060, // .......**.... + 0x000000C0, // ......**..... + 0x00000180, // .....**...... + 0x00000000, // ............. + 0x0000300C, // **........**. + 0x0000300C, // **........**. + 0x00001818, // .**......**.. + 0x00001818, // .**......**.. + 0x00000C30, // ..**....**... + 0x00000E70, // ..***..***... + 0x00000660, // ...**..**.... + 0x000003C0, // ....****..... + 0x00000180, // .....**...... + 0x00000180, // .....**...... + 0x00000180, // .....**...... + 0x00000180, // .....**...... + 0x00000180, // .....**...... + 0x00000180, // .....**...... + 0x00000000, // ............. + 0x00000000, // ............. + 0x00000000, // ............. + 0x00000000, // ............. + }, + { // 222 + 12, 22, + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000C00, // .**......... + 0x00000C00, // .**......... + 0x00000C00, // .**......... + 0x00000FF0, // .********... + 0x00000FF8, // .*********.. + 0x00000C1C, // .**.....***. + 0x00000C0C, // .**......**. + 0x00000C0C, // .**......**. + 0x00000C1C, // .**.....***. + 0x00000FF8, // .*********.. + 0x00000FF0, // .********... + 0x00000C00, // .**......... + 0x00000C00, // .**......... + 0x00000C00, // .**......... + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + 0x00000000, // ............ + }, + { // 223 + 9, 22, + 0x00000000, // ......... + 0x00000000, // ......... + 0x00000000, // ......... + 0x00000000, // ......... + 0x00000070, // ...***... + 0x000000F8, // ..*****.. + 0x0000018C, // .**...**. + 0x0000018C, // .**...**. + 0x0000018C, // .**...**. + 0x0000018C, // .**...**. + 0x000001B8, // .**.***.. + 0x000001B8, // .**.***.. + 0x0000018C, // .**...**. + 0x0000018C, // .**...**. + 0x0000018C, // .**...**. + 0x0000018C, // .**...**. + 0x000001BC, // .**.****. + 0x000001B8, // .**.***.. + 0x00000000, // ......... + 0x00000000, // ......... + 0x00000000, // ......... + 0x00000000, // ......... + }, + { // 224 + 11, 22, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000180, // ...**...... + 0x000000C0, // ....**..... + 0x00000060, // .....**.... + 0x00000000, // ........... + 0x000003F0, // ..******... + 0x00000738, // .***..***.. + 0x00000618, // .**....**.. + 0x00000038, // ......***.. + 0x000003F8, // ..*******.. + 0x00000718, // .***...**.. + 0x00000618, // .**....**.. + 0x00000618, // .**....**.. + 0x0000073C, // .***..****. + 0x000003CC, // ..****..**. + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 225 + 11, 22, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000060, // .....**.... + 0x000000C0, // ....**..... + 0x00000180, // ...**...... + 0x00000000, // ........... + 0x000003F0, // ..******... + 0x00000738, // .***..***.. + 0x00000618, // .**....**.. + 0x00000038, // ......***.. + 0x000003F8, // ..*******.. + 0x00000718, // .***...**.. + 0x00000618, // .**....**.. + 0x00000618, // .**....**.. + 0x0000073C, // .***..****. + 0x000003CC, // ..****..**. + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 226 + 11, 22, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x000000C0, // ....**..... + 0x000001E0, // ...****.... + 0x00000330, // ..**..**... + 0x00000000, // ........... + 0x000003F0, // ..******... + 0x00000738, // .***..***.. + 0x00000618, // .**....**.. + 0x00000038, // ......***.. + 0x000003F8, // ..*******.. + 0x00000718, // .***...**.. + 0x00000618, // .**....**.. + 0x00000618, // .**....**.. + 0x0000073C, // .***..****. + 0x000003CC, // ..****..**. + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 227 + 11, 22, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000190, // ...**..*... + 0x000002D0, // ..*.**.*... + 0x00000260, // ..*..**.... + 0x00000000, // ........... + 0x000003F0, // ..******... + 0x00000738, // .***..***.. + 0x00000618, // .**....**.. + 0x00000038, // ......***.. + 0x000003F8, // ..*******.. + 0x00000718, // .***...**.. + 0x00000618, // .**....**.. + 0x00000618, // .**....**.. + 0x0000073C, // .***..****. + 0x000003CC, // ..****..**. + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 228 + 11, 22, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000330, // ..**..**... + 0x00000330, // ..**..**... + 0x00000000, // ........... + 0x00000000, // ........... + 0x000003F0, // ..******... + 0x00000738, // .***..***.. + 0x00000618, // .**....**.. + 0x00000038, // ......***.. + 0x000003F8, // ..*******.. + 0x00000718, // .***...**.. + 0x00000618, // .**....**.. + 0x00000618, // .**....**.. + 0x0000073C, // .***..****. + 0x000003CC, // ..****..**. + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 229 + 11, 22, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x000000C0, // ....**..... + 0x00000120, // ...*..*.... + 0x00000120, // ...*..*.... + 0x000000C0, // ....**..... + 0x000003F0, // ..******... + 0x00000738, // .***..***.. + 0x00000618, // .**....**.. + 0x00000038, // ......***.. + 0x000003F8, // ..*******.. + 0x00000718, // .***...**.. + 0x00000618, // .**....**.. + 0x00000618, // .**....**.. + 0x0000073C, // .***..****. + 0x000003CC, // ..****..**. + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 230 + 17, 22, + 0x00000000, // ................. + 0x00000000, // ................. + 0x00000000, // ................. + 0x00000000, // ................. + 0x00000000, // ................. + 0x00000000, // ................. + 0x00000000, // ................. + 0x00000000, // ................. + 0x00007EF0, // ...******.****... + 0x0000E7F8, // ..***..********.. + 0x0000C30C, // ..**....**....**. + 0x0000070C, // .......***....**. + 0x00007FFC, // ...*************. + 0x0000E300, // ..***...**....... + 0x0000C300, // ..**....**....... + 0x0000C38C, // ..**....***...**. + 0x0000E7FC, // ..***..*********. + 0x00007AF0, // ...****.*.****... + 0x00000000, // ................. + 0x00000000, // ................. + 0x00000000, // ................. + 0x00000000, // ................. + }, + { // 231 + 10, 22, + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x000000F8, // ...*****.. + 0x000001FC, // ..*******. + 0x0000018C, // ..**...**. + 0x00000300, // .**....... + 0x00000300, // .**....... + 0x00000300, // .**....... + 0x00000300, // .**....... + 0x0000018C, // ..**...**. + 0x000001FC, // ..*******. + 0x000000F8, // ...*****.. + 0x00000060, // ....**.... + 0x00000030, // .....**... + 0x000001B0, // ..**.**... + 0x000001E0, // ..****.... + }, + { // 232 + 10, 22, + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x000000C0, // ...**..... + 0x00000060, // ....**.... + 0x00000030, // .....**... + 0x00000000, // .......... + 0x000000F0, // ...****... + 0x000001F8, // ..******.. + 0x0000030C, // .**....**. + 0x0000030C, // .**....**. + 0x000003FC, // .********. + 0x00000300, // .**....... + 0x00000300, // .**....... + 0x0000038C, // .***...**. + 0x000001FC, // ..*******. + 0x000000F0, // ...****... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + }, + { // 233 + 10, 22, + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000030, // .....**... + 0x00000060, // ....**.... + 0x000000C0, // ...**..... + 0x00000000, // .......... + 0x000000F0, // ...****... + 0x000001F8, // ..******.. + 0x0000030C, // .**....**. + 0x0000030C, // .**....**. + 0x000003FC, // .********. + 0x00000300, // .**....... + 0x00000300, // .**....... + 0x0000038C, // .***...**. + 0x000001FC, // ..*******. + 0x000000F0, // ...****... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + }, + { // 234 + 10, 22, + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000060, // ....**.... + 0x000000F0, // ...****... + 0x00000198, // ..**..**.. + 0x00000000, // .......... + 0x000000F0, // ...****... + 0x000001F8, // ..******.. + 0x0000030C, // .**....**. + 0x0000030C, // .**....**. + 0x000003FC, // .********. + 0x00000300, // .**....... + 0x00000300, // .**....... + 0x0000038C, // .***...**. + 0x000001FC, // ..*******. + 0x000000F0, // ...****... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + }, + { // 235 + 10, 22, + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000198, // ..**..**.. + 0x00000198, // ..**..**.. + 0x00000000, // .......... + 0x00000000, // .......... + 0x000000F0, // ...****... + 0x000001F8, // ..******.. + 0x0000030C, // .**....**. + 0x0000030C, // .**....**. + 0x000003FC, // .********. + 0x00000300, // .**....... + 0x00000300, // .**....... + 0x0000038C, // .***...**. + 0x000001FC, // ..*******. + 0x000000F0, // ...****... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + }, + { // 236 + 4, 22, + 0x00000000, // .... + 0x00000000, // .... + 0x00000000, // .... + 0x00000000, // .... + 0x00000018, // **.. + 0x0000000C, // .**. + 0x00000006, // ..** + 0x00000000, // .... + 0x0000000C, // .**. + 0x0000000C, // .**. + 0x0000000C, // .**. + 0x0000000C, // .**. + 0x0000000C, // .**. + 0x0000000C, // .**. + 0x0000000C, // .**. + 0x0000000C, // .**. + 0x0000000C, // .**. + 0x0000000C, // .**. + 0x00000000, // .... + 0x00000000, // .... + 0x00000000, // .... + 0x00000000, // .... + }, + { // 237 + 4, 22, + 0x00000000, // .... + 0x00000000, // .... + 0x00000000, // .... + 0x00000000, // .... + 0x00000006, // ..** + 0x0000000C, // .**. + 0x00000018, // **.. + 0x00000000, // .... + 0x0000000C, // .**. + 0x0000000C, // .**. + 0x0000000C, // .**. + 0x0000000C, // .**. + 0x0000000C, // .**. + 0x0000000C, // .**. + 0x0000000C, // .**. + 0x0000000C, // .**. + 0x0000000C, // .**. + 0x0000000C, // .**. + 0x00000000, // .... + 0x00000000, // .... + 0x00000000, // .... + 0x00000000, // .... + }, + { // 238 + 4, 22, + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000018, // ..**.. + 0x0000003C, // .****. + 0x00000066, // **..** + 0x00000000, // ...... + 0x00000018, // ..**.. + 0x00000018, // ..**.. + 0x00000018, // ..**.. + 0x00000018, // ..**.. + 0x00000018, // ..**.. + 0x00000018, // ..**.. + 0x00000018, // ..**.. + 0x00000018, // ..**.. + 0x00000018, // ..**.. + 0x00000018, // ..**.. + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000000, // ..... + }, + { // 239 + 4, 22, + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000036, // **.** + 0x00000036, // **.** + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000018, // .**.. + 0x00000018, // .**.. + 0x00000018, // .**.. + 0x00000018, // .**.. + 0x00000018, // .**.. + 0x00000018, // .**.. + 0x00000018, // .**.. + 0x00000018, // .**.. + 0x00000018, // .**.. + 0x00000018, // .**.. + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000000, // ..... + 0x00000000, // ..... + }, + { // 240 + 11, 22, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000300, // ..**....... + 0x000001B0, // ...**.**... + 0x000001C0, // ...***..... + 0x00000260, // ..*..**.... + 0x000001F0, // ...*****... + 0x000003F8, // ..*******.. + 0x00000318, // ..**...**.. + 0x0000060C, // .**.....**. + 0x0000060C, // .**.....**. + 0x0000060C, // .**.....**. + 0x0000060C, // .**.....**. + 0x00000318, // ..**...**.. + 0x000003F8, // ..*******.. + 0x000001F0, // ...*****... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 241 + 10, 22, + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x000000C8, // ...**..*.. + 0x00000168, // ..*.**.*.. + 0x00000130, // ..*..**... + 0x00000000, // .......... + 0x00000378, // .**.****.. + 0x000003FC, // .********. + 0x0000038C, // .***...**. + 0x0000030C, // .**....**. + 0x0000030C, // .**....**. + 0x0000030C, // .**....**. + 0x0000030C, // .**....**. + 0x0000030C, // .**....**. + 0x0000030C, // .**....**. + 0x0000030C, // .**....**. + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + }, + { // 242 + 11, 22, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000180, // ...**...... + 0x000000C0, // ....**..... + 0x00000060, // .....**.... + 0x00000000, // ........... + 0x000001F0, // ...*****... + 0x000003F8, // ..*******.. + 0x00000318, // ..**...**.. + 0x0000060C, // .**.....**. + 0x0000060C, // .**.....**. + 0x0000060C, // .**.....**. + 0x0000060C, // .**.....**. + 0x00000318, // ..**...**.. + 0x000003F8, // ..*******.. + 0x000001F0, // ...*****... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 243 + 11, 22, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000030, // ......**... + 0x00000060, // .....**.... + 0x000000C0, // ....**..... + 0x00000000, // ........... + 0x000001F0, // ...*****... + 0x000003F8, // ..*******.. + 0x00000318, // ..**...**.. + 0x0000060C, // .**.....**. + 0x0000060C, // .**.....**. + 0x0000060C, // .**.....**. + 0x0000060C, // .**.....**. + 0x00000318, // ..**...**.. + 0x000003F8, // ..*******.. + 0x000001F0, // ...*****... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 244 + 11, 22, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x000000C0, // ....**..... + 0x000001E0, // ...****.... + 0x00000330, // ..**..**... + 0x00000000, // ........... + 0x000001F0, // ...*****... + 0x000003F8, // ..*******.. + 0x00000318, // ..**...**.. + 0x0000060C, // .**.....**. + 0x0000060C, // .**.....**. + 0x0000060C, // .**.....**. + 0x0000060C, // .**.....**. + 0x00000318, // ..**...**.. + 0x000003F8, // ..*******.. + 0x000001F0, // ...*****... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 245 + 11, 22, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000190, // ...**..*... + 0x000002D0, // ..*.**.*... + 0x00000260, // ..*..**.... + 0x00000000, // ........... + 0x000001F0, // ...*****... + 0x000003F8, // ..*******.. + 0x00000318, // ..**...**.. + 0x0000060C, // .**.....**. + 0x0000060C, // .**.....**. + 0x0000060C, // .**.....**. + 0x0000060C, // .**.....**. + 0x00000318, // ..**...**.. + 0x000003F8, // ..*******.. + 0x000001F0, // ...*****... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 246 + 11, 22, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000198, // ...**..**.. + 0x00000198, // ...**..**.. + 0x00000000, // ........... + 0x00000000, // ........... + 0x000001F0, // ...*****... + 0x000003F8, // ..*******.. + 0x00000318, // ..**...**.. + 0x0000060C, // .**.....**. + 0x0000060C, // .**.....**. + 0x0000060C, // .**.....**. + 0x0000060C, // .**.....**. + 0x00000318, // ..**...**.. + 0x000003F8, // ..*******.. + 0x000001F0, // ...*****... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 247 + 10, 22, + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000060, // ....**.... + 0x00000060, // ....**.... + 0x00000000, // .......... + 0x000003FC, // .********. + 0x000003FC, // .********. + 0x00000000, // .......... + 0x00000060, // ....**.... + 0x00000060, // ....**.... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + }, + { // 248 + 11, 22, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x000000E6, // ....***..** + 0x000003FC, // ..********. + 0x00000318, // ..**...**.. + 0x0000063C, // .**...****. + 0x0000066C, // .**..**.**. + 0x000006CC, // .**.**..**. + 0x0000078C, // .****...**. + 0x00000318, // ..**...**.. + 0x000007F8, // .********.. + 0x00000CE0, // **..***.... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + }, + { // 249 + 10, 22, + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x000000C0, // ...**..... + 0x00000060, // ....**.... + 0x00000030, // .....**... + 0x00000000, // .......... + 0x0000030C, // .**....**. + 0x0000030C, // .**....**. + 0x0000030C, // .**....**. + 0x0000030C, // .**....**. + 0x0000030C, // .**....**. + 0x0000030C, // .**....**. + 0x0000030C, // .**....**. + 0x0000031C, // .**...***. + 0x000003FC, // .********. + 0x000001EC, // ..****.**. + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + }, + { // 250 + 10, 22, + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000018, // ......**.. + 0x00000030, // .....**... + 0x00000060, // ....**.... + 0x00000000, // .......... + 0x0000030C, // .**....**. + 0x0000030C, // .**....**. + 0x0000030C, // .**....**. + 0x0000030C, // .**....**. + 0x0000030C, // .**....**. + 0x0000030C, // .**....**. + 0x0000030C, // .**....**. + 0x0000031C, // .**...***. + 0x000003FC, // .********. + 0x000001EC, // ..****.**. + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + }, + { // 251 + 10, 22, + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000060, // ....**.... + 0x000000F0, // ...****... + 0x00000198, // ..**..**.. + 0x00000000, // .......... + 0x0000030C, // .**....**. + 0x0000030C, // .**....**. + 0x0000030C, // .**....**. + 0x0000030C, // .**....**. + 0x0000030C, // .**....**. + 0x0000030C, // .**....**. + 0x0000030C, // .**....**. + 0x0000031C, // .**...***. + 0x000003FC, // .********. + 0x000001EC, // ..****.**. + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + }, + { // 252 + 10, 22, + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000198, // ..**..**.. + 0x00000198, // ..**..**.. + 0x00000000, // .......... + 0x00000000, // .......... + 0x0000030C, // .**....**. + 0x0000030C, // .**....**. + 0x0000030C, // .**....**. + 0x0000030C, // .**....**. + 0x0000030C, // .**....**. + 0x0000030C, // .**....**. + 0x0000030C, // .**....**. + 0x0000031C, // .**...***. + 0x000003FC, // .********. + 0x000001EC, // ..****.**. + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + }, + { // 253 + 10, 22, + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000018, // ......**.. + 0x00000030, // .....**... + 0x00000060, // ....**.... + 0x00000000, // .......... + 0x0000030C, // .**....**. + 0x0000030C, // .**....**. + 0x0000030C, // .**....**. + 0x00000198, // ..**..**.. + 0x00000198, // ..**..**.. + 0x00000198, // ..**..**.. + 0x00000090, // ...*..*... + 0x000000F0, // ...****... + 0x00000060, // ....**.... + 0x00000060, // ....**.... + 0x00000060, // ....**.... + 0x00000060, // ....**.... + 0x000001C0, // ..***..... + 0x000001C0, // ..***..... + }, + { // 254 + 11, 22, + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000000, // ........... + 0x00000600, // .**........ + 0x00000600, // .**........ + 0x00000600, // .**........ + 0x00000600, // .**........ + 0x000006F0, // .**.****... + 0x000007F8, // .********.. + 0x00000718, // .***...**.. + 0x0000060C, // .**.....**. + 0x0000060C, // .**.....**. + 0x0000060C, // .**.....**. + 0x0000060C, // .**.....**. + 0x00000718, // .***...**.. + 0x000007F8, // .********.. + 0x000006F0, // .**.****... + 0x00000600, // .**........ + 0x00000600, // .**........ + 0x00000600, // .**........ + 0x00000600, // .**........ + }, + { // 255 + 10, 22, + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000000, // .......... + 0x00000198, // ..**..**.. + 0x00000198, // ..**..**.. + 0x00000000, // .......... + 0x00000000, // .......... + 0x0000030C, // .**....**. + 0x0000030C, // .**....**. + 0x0000030C, // .**....**. + 0x00000198, // ..**..**.. + 0x00000198, // ..**..**.. + 0x00000198, // ..**..**.. + 0x00000090, // ...*..*... + 0x000000F0, // ...****... + 0x00000060, // ....**.... + 0x00000060, // ....**.... + 0x00000060, // ....**.... + 0x00000060, // ....**.... + 0x000001C0, // ..***..... + 0x000001C0, // ..***..... + }, + }; @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: i18n.c 1.134 2003/09/11 13:51:56 kls Exp $ + * $Id: i18n.c 1.137 2003/12/19 13:32:10 kls Exp $ * * Translations provided by: * @@ -51,9 +51,14 @@ * which means that it should be 'Italiano', not 'Italian'). * Note that only the characters defined in 'fontosd.c' will * be available! - * 4. Compile VDR and test the new language by switching to it + * 4. If your language requires a character set other than the default iso8859-1 + * you need to make the appropriate entry in the second phrase below, and + * also create the necessary font files in case they are not yet part of + * the VDR source (see how this is done for iso8859-7, for instance). Don't + * forget to adjust the files font.h and font.c accordingly. + * 5. Compile VDR and test the new language by switching to it * in the "Setup/OSD" menu. - * 5. Send the modified 'i18n.c' file to <kls@cadsoft.de> to have + * 6. Send the modified files to <kls@cadsoft.de> to have * it included in the next version of VDR. * * In case an English phrase is used in more than one context (and might need @@ -82,12 +87,30 @@ const tI18nPhrase Phrases[] = { "suomi", // this is not a typo - it's really lowercase! "Polski", "Espańol", - "Ellinika", + "ĹëëçíéęÜ", // Greek "Svenska", "Romaneste", "Magyar", "Catalŕ", }, + // The character set needed for this language (this MUST be the second phrase!): + { "iso8859-1", + "iso8859-1", + "iso8859-1", + "iso8859-1", + "iso8859-1", + "iso8859-1", + "iso8859-1", + "iso8859-1", + "iso8859-1", + "iso8859-1", + "iso8859-1", + "iso8859-7", + "iso8859-1", + "iso8859-1", + "iso8859-1", + "iso8859-1", + }, // Menu titles: { "VDR", "VDR", @@ -117,7 +140,7 @@ const tI18nPhrase Phrases[] = { "Ohjelmisto", "Program", "Guía de Programación", - "Programma", + "Đńüăńáěěá", "Program", "Program", "Program", @@ -134,7 +157,7 @@ const tI18nPhrase Phrases[] = { "Kanavat", "Kanaly", "Canales", - "Kanalia", + "ĘáíÜëéá", "Kanaler", "Canale", "Csatornák", @@ -151,7 +174,7 @@ const tI18nPhrase Phrases[] = { "Ajastin", "Timery", "Timer", - "Programmatismos", + "×ńďíďäéáęüđôçň", "Timers", "Timere", "Felvétel beprogramozása", @@ -168,7 +191,7 @@ const tI18nPhrase Phrases[] = { "Tallenteet", "Nagrania", "Grabaciones", - "Egrafes", + "ĹăăńáöÝň", "Inspelningar", "Inregistrari", "Felvett adások", @@ -185,7 +208,7 @@ const tI18nPhrase Phrases[] = { "Asetukset", "Nastawy", "Configuración", - "Rithmisis", + "Ńőčěéóĺéň", "Inställningar", "Setari", "Beállítások", @@ -202,7 +225,7 @@ const tI18nPhrase Phrases[] = { "Komennot", "Rozkazy", "Órdenes", - "Entoles", + "ĹíôďëÝň", "Kommandon", "Comenzi", "Parancsok", @@ -219,7 +242,7 @@ const tI18nPhrase Phrases[] = { "Tallennuskomennot", "Rozkazy Nagran", "Órdenes de grabación", - "Entoles gia egrafes", + "ĹíôďëÝň ăéÜ ĺăăńáöÝň", "Inspelningskommandon", "",// TODO "Parancsok a felvett filmekhez", @@ -236,7 +259,7 @@ const tI18nPhrase Phrases[] = { "Muokkaa kanavaa", "Ustawienie kanalu", "Modificar canal", - "Prosarmogi kanaliou", + "ĐńďóáńěďăÝň Ęáíáëéďý", "Ändra kanal", "Editare canale", "Csatornák beállítása", @@ -253,7 +276,7 @@ const tI18nPhrase Phrases[] = { "Muokkaa ajastinta", "Ustawienie timerow", "Modificar timer", - "Prosarmogi Programmatismou", + "ĐńďóáńěďăŢ ÷ńďíďäéáęüđôç", "Ändra timer", "Editare timere", "Felvétel beprogramozásának megváltoztatása", @@ -270,7 +293,7 @@ const tI18nPhrase Phrases[] = { "Tapahtuma", "Audycja", "Evento", - "Ekpompi", + "ĹęđďěđŢ", "Sändning", "Evenimente", "Adás", @@ -287,7 +310,7 @@ const tI18nPhrase Phrases[] = { "Tiedot", "Zawartosc", "Resúmen", - "Periexomeno", + "Đĺńéĺ÷üěĺíď", "Sammanfattning", "Cuprins", "Tartalom", @@ -304,7 +327,7 @@ const tI18nPhrase Phrases[] = { "Ohjelmisto - %s", "Program - %s", "Programa - %s", - "Programma - %s", + "Đńüăńáěěá - %s", "Program - %s", "Program - %s", "Program - %s", @@ -321,7 +344,7 @@ const tI18nPhrase Phrases[] = { "Menossa nyt", "Program biezacy", "żQué hay ahora?", - "Trexon Programma", + "ÔńÝ÷ďí đńüăńáěěá", "Vilket program sänds nu?", "Programul actual?", "Mi megy most?", @@ -338,7 +361,7 @@ const tI18nPhrase Phrases[] = { "Tulossa seuraavaksi", "Program nastepny", "żQué hay proximo?", - "Epomeno Programma", + "Ĺđüěĺíď đńüăńáěěá", "Vilket är nästa program?", "Programul urmator?", "Mi következik?", @@ -356,7 +379,7 @@ const tI18nPhrase Phrases[] = { "Muokkaa", "Edycja", "Modificar", - "Prosarmogi", + "ĐńďóáńěďăŢ", "Ändra", "Modificare", "Beállítani", @@ -373,7 +396,7 @@ const tI18nPhrase Phrases[] = { "Uusi", "Nowy", "Nuevo", - "Neo", + "ÍÝď", "Ny", "Nou", "Új", @@ -390,7 +413,7 @@ const tI18nPhrase Phrases[] = { "Poista", "Usunac", "Borrar", - "Diagrafi", + "ÄéáăńáöŢ", "Ta bort", "Sterge", "Törölni", @@ -407,7 +430,7 @@ const tI18nPhrase Phrases[] = { "Siirrä", "Zaznaczyc", "Marcar", - "Epilogi", + "ĹđéëďăŢ", "Märk", "Marcheaza", "Megjelölni", @@ -424,7 +447,7 @@ const tI18nPhrase Phrases[] = { "Päällä/Pois", "Zal./ Wyl.", "On/Off", - "Anoixto/Kleisto", + "Aíďé÷/Këĺéóôü", "Pĺ/Av", "Pornit/Oprit", "Be/Ki", @@ -441,7 +464,7 @@ const tI18nPhrase Phrases[] = { "Tallenna", "Nagrywac", "Grabar", - "Egrafi", + "ĹăăńáöŢ", "Inspelning", "Inregistrare", "Felvenni", @@ -458,7 +481,7 @@ const tI18nPhrase Phrases[] = { "Toista", "Odtwarzac", "Play", - "Anaparagogi", + "ÁíáěĺôÜäďóç", "Spela upp", "Redare", "Lejátszani", @@ -475,7 +498,7 @@ const tI18nPhrase Phrases[] = { "Alkuun", "Poczatek", "Rebobinar", - "Arxi", + "Áń÷Ţ", "Ĺterspolning", "Inapoi", "Vissza az elejére", @@ -492,7 +515,7 @@ const tI18nPhrase Phrases[] = { "Lopeta", "Zakonczyc", "Parar", - "Terma", + "ÔÝńěá", "Stopp", "Stop", "Stop", @@ -509,7 +532,7 @@ const tI18nPhrase Phrases[] = { "Jatka", "Dalej", "Continuar", - "Sinexia", + "ÓőíÝ÷ĺéá", "Fortsätt", "Reia", "Tovább", @@ -526,7 +549,7 @@ const tI18nPhrase Phrases[] = { "Yhteenveto", "Zawartosc", "Resumen", - "Periexomeno", + "Đĺńéĺ÷üěĺíď", "Sammanfattning", "Cuprins", "Tartalom", @@ -543,7 +566,7 @@ const tI18nPhrase Phrases[] = { "Avaa", "Otworzyc", "Abrir", - "Anigma", + "˘íďéăěá", "Öppna", "Deschide", "Kinyitni", @@ -560,7 +583,7 @@ const tI18nPhrase Phrases[] = { "Valitse", "Przelaczyc", "Cambiar", - "Alagi", + "AëëáăŢ", "Byt", "Schimba", "Átkapcsolni", @@ -577,7 +600,7 @@ const tI18nPhrase Phrases[] = { "Nyt", "Teraz", "Ahora", - "Tora", + "Ôţńá", "Nu", "Acum", "Most", @@ -594,7 +617,7 @@ const tI18nPhrase Phrases[] = { "Seuraavaksi", "Nastepny", "Siguiente", - "Epomeno", + "Ĺđüěĺíď", "Nästa", "Urmator", "Következö", @@ -611,7 +634,7 @@ const tI18nPhrase Phrases[] = { "Ohjelmisto", "Program", "Programa", - "Programma", + "Đńüăńáěěá", "Program", "Program", "Program", @@ -628,7 +651,7 @@ const tI18nPhrase Phrases[] = { "Kieli", "Jezyk", "Idioma", - "Glosa", + "Ăëţóóá", "Sprĺk", "Limba", "Nyelv", @@ -645,7 +668,7 @@ const tI18nPhrase Phrases[] = { "Avaa", "Wyrzucenie", "Expulsar", - "Exsagogi", + "ĹîáăůăŢ", "Mata ut", "Ejecteaza", "Kidobni", @@ -662,7 +685,7 @@ const tI18nPhrase Phrases[] = { "ABC/abc", "ABC/abc", "ABC/abc", - "ABC/abc", + "ABĂ/áâă", "ABC/abc", "ABC/abc", "ABC/abc", @@ -679,7 +702,7 @@ const tI18nPhrase Phrases[] = { "Lisää", "Wstawiac", "Insertar", - "Isodos", + "ĹéóáăůăŢ", "Infoga", "Insereaza", "Beilleszteni", @@ -696,7 +719,7 @@ const tI18nPhrase Phrases[] = { "Korvaa", "Przepisac", "Sobreescribir", - "Epanagrafi", + "ÁíôéęáôÜóôáóç", "Skriv över", "Suprascrie", "Átírni", @@ -713,7 +736,7 @@ const tI18nPhrase Phrases[] = { "Valikko", "Menu", "Menú", - "Menou", + "Mĺíďý", "Meny", "Meniu", "Menü", @@ -730,7 +753,7 @@ const tI18nPhrase Phrases[] = { "Alusta", "Reset", "Reiniciar", - "Epanafora", + "ĹđáíáöďńÜ", "Ĺterställ", "",//TODO "Reset", @@ -748,7 +771,7 @@ const tI18nPhrase Phrases[] = { "Poistetaanko kanava?", "Usunac kanal?", "żEliminar canal?", - "Diagrafi Kanaliou?", + "ÄéáăńáöŢ ęáíáëéďý?", "Ta bort kanalen?", "Sterg canalul?", "Csatorna törlése?", @@ -765,7 +788,7 @@ const tI18nPhrase Phrases[] = { "Poistetaanko ajastin?", "Usunac timer?", "żEliminar timer?", - "Diagrafi programmatismou?", + "ÄéáăńáöŢ ÷ńďíďäéáęüđôç?", "Ta bort timern?", "Sterg timer-ul?", "Felvétel beprogramozásának törlése?", @@ -782,7 +805,7 @@ const tI18nPhrase Phrases[] = { "Poistetaanko tallenne?", "Usunac nagranie?", "żEliminar grabacion?", - "Svisimo egrafis?", + "ÄéáăńáöŢ áń÷ĺßďő?", "Ta bort inspelningen?", "Sterg inregistrarea?", "Felvétel törlése?", @@ -799,7 +822,7 @@ const tI18nPhrase Phrases[] = { "Ajastettu tallennus käynnissä - keskeytetäänkö?", "Nagrywanie w trakcie - napewno usunac?", "żTimer activo - de verdad eliminarlo?", - "Programmatismos se exselixsi - Diagrafi sigoura?", + "×ńďíďäéáęüđôçň óÝ ĺîÝëéîç - ÄéáăńáöŢ óßăďőńá?", "Timerstyrd inspelning pĺgĺr - Avbryta ändĺ?", "Timer-ul in inregistrare - sterg?", "Felvétel folyamatban van - mégis törölni?", @@ -816,7 +839,7 @@ const tI18nPhrase Phrases[] = { "Lopetetaanko tallennus?", "Zakonczyc nagranie?", "żParar grabación?", - "Akirosi egrafis?", + "Áęýńůóç ĺăăńáöŢň?", "Stanna inspelning?", "Opresc inregistrarea?", "Felvétel befejezni?", @@ -833,7 +856,7 @@ const tI18nPhrase Phrases[] = { "päävastaanottimella", "na pierwszym interfejsie", "en interface primario", - "stin protevon karta", + "óôŢí ęýńéá ęÜńôá", "frĺn den första enheten?", "pe prima interfata", "az elsö kártyán", @@ -850,7 +873,7 @@ const tI18nPhrase Phrases[] = { "Perutaanko muokkaus?", "Zakonczyc montaz?", "żCancelar modificación?", - "Akirosi epexsergasias?", + "Aęýńůóç ĺđĺîĺńăáóßáň?", "Avbryta redigeringen?", "Opresc editarea?", "Vágást befejezni?", @@ -867,7 +890,7 @@ const tI18nPhrase Phrases[] = { "Käynnistetäänkö uudelleen?", "Rzeczywiscie nowy start?", "żDe verdad reiniciar?", - "Na gini sigoura epanekinisi?", + "Ná ăßíĺé óßăďőńá ĺđáíĺęęßíçóç?", "Vill du verkligen starta om?", "Esti sigur de repornire?", "Tényleg újraindítani?", @@ -884,7 +907,7 @@ const tI18nPhrase Phrases[] = { "Tallennus kesken - käynnistetäänkö uudelleen?", "Nagrywanie w trakcie - rzeczywiscie nowy start?", "Grabando - żreiniciar?", - "Ginete egrafi - Telika na ginei epanekinisi?", + "Ăßíĺôáé ĺăăńáöŢ - ÔĺëéęÜ íá ăßíĺé ĺđáíĺęęßíçóç?", "Inspelning pĺgĺr, vill du ändĺ starta om?", "In inregistrare - repornesc?", "Felvétel folyamatban van - mégis újraindítani?", @@ -901,7 +924,7 @@ const tI18nPhrase Phrases[] = { "Tallennus kesken - sammutetaanko?", "Nagrywanie w trakcie - mimo to wylaczyc?", "Grabando - żapagar?", - "Ginete egrafi - Telika na ginei termatismos?", + "Ăßíĺôáé ĺăăńáöŢ - ÔĺëéęÜ íá ăßíĺé ôĺńěáôéóěüň?", "Inspelning pĺgĺr, vill du ändĺ avbryta?", "In inregistrare - opresc?", "Felvétel folyamatban van - mégis kikapcsolni?", @@ -918,7 +941,7 @@ const tI18nPhrase Phrases[] = { "Tallennus alkaa %d min kuluttua - sammutetaanko?", "Nagrywanie za %d minut - mimo to wylaczyc?", "Grabando en %d minutos, żde verdad apagar?", - "Anamenete egrafi se %d lepta - Telika na termatistei?", + "ÁíáěÝíĺôáé ĺăăńáöŢ óÝ %d ëĺđôÜ - ÔĺëéęÜ íá ôĺńěáôéóôĺé?", "Inspelning startar om %d minuter, vill du avsluta?", "Inregistrez in %d minute, opresc?", "Felvétel %d perc mulva kezdödik - mégis kikapcsolni?", @@ -935,7 +958,7 @@ const tI18nPhrase Phrases[] = { "Peru sammutus painamalla mitä tahansa näppäintä", "Dowolny przycisk zatrzyma wylaczanie", "Pulse una tecla para interrumpir apagar", - "Piese ena pliktro na akirothei o termatismos", + "Đßĺóĺ Ýíá đëŢęôńď ăéÜ áęýńůäç ôĺńěáôéóěďý", "Tryck valfri knapp för att ĺterkalla avstängningen", "Apasa orice tasta pentru a anula inchiderea", "Nyomj egy gombot a leállás megállításához", @@ -953,7 +976,7 @@ const tI18nPhrase Phrases[] = { "Nimi", "Nazwa", "Nombre", - "Onoma", + "źíďěá", "Namn", "Nume", "Név", @@ -970,7 +993,7 @@ const tI18nPhrase Phrases[] = { "Taajuus", "Czestotliwosc", "Frecuencia", - "Sixnotita", + "Óő÷íüôçôá", "Frekvens", "Frecventa", "Frekvencia", @@ -987,7 +1010,7 @@ const tI18nPhrase Phrases[] = { "Polarisaatio", "Polaryzacja", "Polarización", - "Polosi", + "Đüëůóç", "Polarisation", "Polarizare", "Polarizáció", @@ -1004,7 +1027,7 @@ const tI18nPhrase Phrases[] = { "Lähde", "Zrodlo", "",//TODO - "Pigi", + "Äéĺńĺýíçóç", "Källa", "",//TODO "Forrás", @@ -1038,7 +1061,7 @@ const tI18nPhrase Phrases[] = { "Kuva PID", "Vpid", "Vpid", - "Vpid", + "Bßíôĺď PID", "Video PID", "PID Video", "Vpid", @@ -1328,7 +1351,7 @@ const tI18nPhrase Phrases[] = { "Aktiivinen", "Aktywny", "Activo", - "Energo", + "Ĺíĺńăü", "Aktiv", "Activ", "Aktiv", @@ -1345,7 +1368,7 @@ const tI18nPhrase Phrases[] = { "Kanava", "Kanal", "Canal", - "Kanali", + "ĘáíÜëé", "Kanal", "Canal", "Csatorna", @@ -1362,7 +1385,7 @@ const tI18nPhrase Phrases[] = { "Päivä", "Dzien", "Día", - "Imera", + "ÇěÝńá", "Dag", "Ziua", "Nap", @@ -1379,7 +1402,7 @@ const tI18nPhrase Phrases[] = { "Aloitus", "Poczatek", "Comienzo", - "Arxi", + "Áń÷Ţ", "Börjar", "Start", "Kezdet", @@ -1396,7 +1419,7 @@ const tI18nPhrase Phrases[] = { "Lopetus", "Koniec", "Fin", - "Telos", + "ÔÝëďň", "Slutar", "Stop", "Vége", @@ -1413,7 +1436,7 @@ const tI18nPhrase Phrases[] = { "Prioriteetti", "Priorytet", "Prioridad", - "Protereotita", + "Đńďôĺńáéüôçôá", "Prioritet", "Prioritate", "Prioritás", @@ -1430,7 +1453,7 @@ const tI18nPhrase Phrases[] = { "Elinikä", "Trwalosc dni", "Durabilidad", - "Xronos Zois", + "ÄéÝńęĺéá ĐáńáěďíŢň", "Livstid", "Durata", "Élettartam", @@ -1447,7 +1470,7 @@ const tI18nPhrase Phrases[] = { "Tiedosto", "Plik", "Fichero", - "Arxeio", + "Áń÷ĺßď", "Filnamn", "Fisier", "File", @@ -1464,7 +1487,7 @@ const tI18nPhrase Phrases[] = { "1. päivä", "Pierwszy dzien", "Primer día", - "Proti mera", + "Đńţôç ěÝńá", "Första dag", "Prima zi", "Elsö nap", @@ -1482,7 +1505,7 @@ const tI18nPhrase Phrases[] = { "Kanava on ajastimen käytössä!", "Kanal jest zajety przez timer nagran", "ĄCanal está ocupado por un timer!", - "To kanali xrisimopiite apo kapoion programmatismo!", + "Ôď ęáíÜëç ÷ńéóéěďđďéĺßôáé áđü ÷ńďíďäéáęüđôç!", "Kanalen används av en timer!", "Canalul este utilizat de un timer!", "Csatornát más használja!", @@ -1499,7 +1522,7 @@ const tI18nPhrase Phrases[] = { "Kanavan vaihtaminen ei mahdollista!", "Kanal nie moze byc teraz przelaczony!", "ĄNo puedo cambiar canal!", - "Adinati i allagi kanaliou!", + "ÁëëáăŢ ęáíáëéďý áäýíáôç!", "Omöjligt att byta kanal!", "Nu pot comuta canalul!", "Csatornát nem lehet átkapcsolni!", @@ -1516,7 +1539,7 @@ const tI18nPhrase Phrases[] = { "Ajastintallennus käynnissä!", "Timer nagrywa!", "ĄTimer esta grabando!", - "Ginete progrmamatismeni egrafi!", + "Ăßíĺôáé đńďăńáěáôéóěÝíç ĺăăńáöŢ!", "Timerstyrd inspelning pĺgĺr!", "Timer-ul este in inregistrare!", "Felvétel folyamatban van!", @@ -1533,7 +1556,7 @@ const tI18nPhrase Phrases[] = { "Tallenteen toistaminen epäonnistui!", "Blad - brak dostepu do nagrania!", "ĄError al acceder a la grabación!", - "Provlima stin prospelasi egrafis!", + "Đńüâëçěá óôŢí đńďóđÝëáóç ĺăăńáöŢň!", "Inspelningen gĺr inte att läsa!", "Eroare in timpul accesarii inregistrarii", "Hiba a felvétel hozzáférésénél", @@ -1550,7 +1573,7 @@ const tI18nPhrase Phrases[] = { "Tallenteen poistaminen epäonnistui!", "Blad przy usuwaniu nagrania!", "ĄError al borrar la grabación!", - "Provlima sto svisimo egrafis !", + "ËÜčďň ęáôÜ ôŢí äéáăńáöŢ ôďő áń÷ĺßďő!", "Inspelningen gĺr inte att ta bort!", "Eroare in timpul stergerii inregistrarii!", "Hiba a felvétel törlésénél!", @@ -1567,7 +1590,7 @@ const tI18nPhrase Phrases[] = { "*** Virheellinen kanavavalinta! ***", "*** Niewazny kanal ***", "*** Canal inválido ***", - "*** Akiro Kanali ***", + "*** ˘ęőńď ęáíÜëç ***", "*** Felaktig kanal ***", "*** Canal invalid ***", "*** Érvénytelen csatorna ***", @@ -1584,7 +1607,7 @@ const tI18nPhrase Phrases[] = { "Ei vapaata vastaanotinta tallennukselle!", "Brak wolnej karty DVB do nagrywania!", "ĄNo hay dispositivo DVB disponible para grabar!", - "Den periseuei DVB Karta gia egrafi!", + "ÁíĺđÜńęĺéá DVB ĘÜńôáň ăéÜ ĺăăńáöŢ!", "Det finns ingen ledig DVB enhet för inspelning!", "Nu mai sunt dispozitive DVB pentru inregistrare!", "Nincs szabad DVB kártya a felvételhez!", @@ -1601,7 +1624,7 @@ const tI18nPhrase Phrases[] = { "Kanava ei ole käytettävissä!", "Kanal jest niedostepny!", "!Canal no disponible!", - "To kanali den ine diathesimo", + "Ôď ęáíÜëç äÝí ĺßíáé äéáčÝóéěď!", "Kanalen ej tillgänglig!", "",//TODO "A csatorna nem elérhetö", @@ -1618,7 +1641,7 @@ const tI18nPhrase Phrases[] = { "Kanava-asetukset eivät ole yksilölliset!", "Nastawy kanalu sa niejednoznaczne!", "!Propiedades de canal duplicadas!", - "Oi rithmiseis tou kanaliou simpiptoun me allo!", + "Ďé ńéčěýóĺéň ôďí ęáíáëéţí áëëőëďóőěđßđôďőí!", "Kanalinställningarna är ej unika!", "",//TODO "A csatornabeállítások nem egyértelmüek", @@ -1635,7 +1658,7 @@ const tI18nPhrase Phrases[] = { "Kanava lukittu (tallennus käynnissä)!", "Kanal zablokowany (nagrywanie w toku)!", "ĄCanal bloqueado (grabando)!", - "To kanali ine apasxolimeno (Ginete egrafi)!", + "Ôď ęáíÜëé ĺßíáé áđďó÷ďëéěÝíď (Ăßíĺôĺ ĺăăńáöŢ)!", "Kanalen är lĺst (inspelning pĺgĺr)!", "Canal blocat (inregistrare)!", "Csatorna hozzáférhetetlen (felvétel)!", @@ -1652,7 +1675,7 @@ const tI18nPhrase Phrases[] = { "Siirtotilan aloitus epäonnistui!", "Tryb transferowy jest niemozliwy!", "ĄNo puedo iniciar modo de transferencia!", - "Adinamia ekinisis katastasis metaforas!", + "Áäőíáěßá ĺęęßíçóçň ęáôÜóôáóçň ěĺôáöďńÜň!", "Kan inte starta Transfer Mode!", "Nu pot porni Modul de Transfer!", "Transfer-Mode nem indítható!", @@ -1669,7 +1692,7 @@ const tI18nPhrase Phrases[] = { "",//TODO "Brak znakow montazowych!", "Muokkausmerkinnät puuttuvat", - "Den exoun oristei simeia gia epexsergasia", + "ÄÝí Ý÷ďőí ďńéóôĺß óçěĺßá ĺđĺîĺńăáóßáň", "Det finns inga redigeringsmärken",//TODO "",//TODO "A vágópont nincs kijelölve",//TODO @@ -1686,7 +1709,7 @@ const tI18nPhrase Phrases[] = { "Muokkauksen aloitus epäonnistui!", "Uruchamianie montazu jest niemozliwe!", "ĄNo puedo iniciar proceso de modificación!", - "Adinamia ekinisis tis epexsergasias!", + "Áäőíáěßá ĺęęßíçóçň ôçň ĺđĺîĺńăáóßáň!", "Kan inte starta redigering!", "Nu pot porni procesul de editare!", "A vágás nem indítható!", @@ -1703,7 +1726,7 @@ const tI18nPhrase Phrases[] = { "Muokkaus on jo käynnissä!", "Montaz w toku!", "ĄProceso de modificación ya fue iniciado!", - "Epexsergasia vriskete se exselixsi!", + "Ĺđĺîĺńăáóßá âńßóęĺôáé óÝ ĺîÝëéîç!", "Redigeringen är redan aktiv!", "Procesul de editare este activ!", "A vágás már aktivált!", @@ -1720,7 +1743,7 @@ const tI18nPhrase Phrases[] = { "Sammutus ei onnistu - '-s' parametri puuttuu!", "Wylaczenie niemozliwe - brak opcji '-s'!", "ĄNo puedo apagar - opción '-s' ausente!", - "Adinaton na ginei termatismos. Aniparkti i parametros '-s'!", + "Áäýíáôďí íá ăßíĺé ôĺńěáôéóěüň. Áíýđáńęôç ç đáńÜěĺôńďň '-s'!", "Kan inte avsluta, mĺste använda parameter '-s'", "Nu pot opri calculatorul - vezi optiunea '-s'", "A leállítás nem lehetséges - Opció '-s' hiányzik!", @@ -1737,7 +1760,7 @@ const tI18nPhrase Phrases[] = { "Kovalevy lähes täynnä!", "Dysk wkrotce pelny!", "ĄDisco casi lleno", - "O Skliros kontevi na gemisi!", + "Ď óęëçńüň ęďíôĺýĺé íÜ ăĺěßóĺé!", "Lĺgt diskutrymme!", "Spatiu scazut pe disc!", "A merev lemez majdnem tele!", @@ -1754,7 +1777,7 @@ const tI18nPhrase Phrases[] = { "Salausmoduulin valikko ei saatavilla", "CAM-Menu niedostepne!", "ĄNo pudeo acceder al menú de la CAM!", - "Den mpori na aniksi to CAM menou!", + "Áäýíáôç ç đńüóâáóç óôü CAM ěĺíďý!", "Det gĺr inte att öppna CAM menyn!", "",//TODO "A CAM-Menü nem nyitható", @@ -1771,7 +1794,7 @@ const tI18nPhrase Phrases[] = { "Salausmoduulin alustus epäonnistui!", "Nieudany CAM-Reset!", "ĄNo puedo reiniciar la CAM!", - "Adinato na gini epanafora sto CAM", + "Áäýíáôď íá ăßíĺé ĺđáíáöďńÜ óôü CAM", "Kan inte ĺterställa CAM!", "",//TODO "A CAM-Reset nem sikerült", @@ -1788,7 +1811,7 @@ const tI18nPhrase Phrases[] = { "Salausmoduuli alustettu", "CAM-Reset wykonany!", "CAM reiniciada", - "Sto CAM egine apanafora", + "Óôď CAM Ýăéíĺ ĺđáíáöďńÜ", "CA modulen har ĺterställts", "",//TODO "A CAM vissza lett állítva", @@ -1823,7 +1846,7 @@ const tI18nPhrase Phrases[] = { "Ohjelmaopas", "EPG", "Guía de Programación", - "EPG", + "Ďäçăüň đńďăńÜěěáôďň", "Elektronisk programguide", "EPG", "EPG", @@ -1891,7 +1914,7 @@ const tI18nPhrase Phrases[] = { "Tallennus", "Nagranie", "Opciones de Grabación", - "Egrafi", + "ĹăăńáöŢ", "Inspelning", "Inregistrare", "Felvétel", @@ -1908,7 +1931,7 @@ const tI18nPhrase Phrases[] = { "Toisto", "Odtwarzanie", "Opciones de Reproducción", - "Anametadosi", + "ÁíáěĺôÜäďóç", "Uppspelning", "Redare", "Lejátszás", @@ -1925,7 +1948,7 @@ const tI18nPhrase Phrases[] = { "Sekalaiset", "Pozostale", "Varios", - "Diafora", + "ÄéÜöďńá", "Diverse", "Diverse", "Egyéb", @@ -1942,7 +1965,7 @@ const tI18nPhrase Phrases[] = { "Laajennokset", "Plugins", "Plugins", - "Plugins", + "Âßóěáôá", "Moduler", "Plugins", "Plugins", @@ -1959,7 +1982,7 @@ const tI18nPhrase Phrases[] = { "Laajennos", "Plugin", "Plugin", - "Plugin", + "Âßóěá", "Modul", "Plugin", "Plugin", @@ -1976,7 +1999,7 @@ const tI18nPhrase Phrases[] = { "Käynnistä uudelleen", "Zastartowac", "Reiniciar", - "Epanekinisi", + "Ĺđáíĺęęßíçóç", "Omstart", "Restart", "Ůjraindítás", @@ -1994,7 +2017,7 @@ const tI18nPhrase Phrases[] = { "Kieli", "Jezyk", "Idioma", - "Glosa", + "Ăëţóóá", "Sprĺk", "Limba OSD", "Nyelv", @@ -2011,7 +2034,7 @@ const tI18nPhrase Phrases[] = { "Leveys", "Szerokosc", "Anchura", - "Makros", + "ĚÜęńďň", "Bredd", "Latime OSD", "Szélesség", @@ -2028,7 +2051,7 @@ const tI18nPhrase Phrases[] = { "Korkeus", "Wysokosc", "Altura", - "Ipsos", + "žřďň", "Höjd", "Inaltime OSD", "Magasság", @@ -2045,7 +2068,7 @@ const tI18nPhrase Phrases[] = { "Viestien esitysaika (s)", "Czas wyswietlania wiadomosci (s)", "Duración muestra mensajes (s)", - "Xronos endiksis minimaton (d)", + "×ńüíďň Ýíäĺéîçň ěőíçěÜôůí (ä)", "Tid för meddelanden (sek)", "Timp afisare mesaj (sec)", "Információ feltüntetésének idötartama", @@ -2062,7 +2085,7 @@ const tI18nPhrase Phrases[] = { "Kanavatiedon sijainti", "Lokalizacja informacji o kanale", "Posición para información canal", - "Thesi Pliroforias kanalion", + "ČÝóç đëçńďöďńßáň ęáíáëéţí", "Placering av kanalinformation", "Pozitie info canal", "Csatorna-Infó poziciója", @@ -2079,7 +2102,7 @@ const tI18nPhrase Phrases[] = { "Näytä kanavatieto", "Informacja przy zmianie kanalu", "Información para cambio de canal", - "Plirofories stin alagi kanaliou", + "Đëçńďöďńßĺň óôŢí áëëáăŢ ęáíáëéďý", "Information vid kanalbyte", "Info despre comutare canal", "Infó a csatorna váltásánál", @@ -2096,7 +2119,7 @@ const tI18nPhrase Phrases[] = { "Valikkojen sivutus", "Przesuwac stronami", "Desplazar página entera", - "Kilisi selidas", + "Ęßëéóç óĺëßäáň", "Bläddra sidor", "Deruleaza pagini", "Oldalanként léptetmi", @@ -2113,7 +2136,7 @@ const tI18nPhrase Phrases[] = { "Järjestä ajastimet", "Sortowanie timerow", "Ordenar timers", - "Organosi programmatismenon", + "ĎńăÜíůóç đńďăńáěáôéóěÝíůí", "Sortera timers", "Sortare timere", "A beprogramozott felvételek elrendezése", @@ -2130,7 +2153,7 @@ const tI18nPhrase Phrases[] = { "Tallennehakemistot", "Wykaz nagran", "Gracaciones en directorios", - "Fakeloi egrafon", + "ÖÜęĺëďé ĺăăńáöţí", "Kataloger för inspelningar", "Directoare inregistrari", "Felvételek listája", @@ -2147,7 +2170,7 @@ const tI18nPhrase Phrases[] = { "Ohjelmaoppaan taustapäivitys (h)", "Czas do skanu EPG (h)", "Tiempo hasta exploración EPG (h)", - "Xronos mexri eksetasi EPG se Ores", + "×ńüíďň ěÝ÷ńé ĺîÝôáóç EPG óĺ ţńĺň", "EPG sökning timeout", "Timeout EPG", "Fennmaradt idö az EPG-g (h)", @@ -2164,7 +2187,7 @@ const tI18nPhrase Phrases[] = { "Ohjelmaoppaan korjaustaso", "Poziom bledow EPG", "Nivel para arreglar EPG", - "EPG Bugfix Vathmos", + "Âáčěüň äéüńčďóçň ďäçăďý EPG", "Nivĺ för EPG bugfix", "Nivel corectie EPG", "EPG hibaelhárítás", @@ -2181,7 +2204,7 @@ const tI18nPhrase Phrases[] = { "Aseta kellonaika", "Ustawianie czasu", "Ajustar reloj de sistema", - "Sintonismos Oras ipologosti", + "Óőíôďíéóěüň ţńáň őđďëďăéóôŢ", "Ställ in systemtid", "Seteaza ceasul sistem", "Az idö beállítása", @@ -2198,7 +2221,7 @@ const tI18nPhrase Phrases[] = { "Vastaanota kellonaika lähettimeltä", "Transponder do ustawiania czasu", "Transponder para reloj de sistema", - "Anametadotis gia sintonismo tis oras", + "Áíáěĺôáäüôçň óőíôďíéóěďý ţńáň", "Använd klockan frĺn transponder", "Preia ceasul din transponder", "Idöhöz tartozó Transponder", @@ -2215,7 +2238,7 @@ const tI18nPhrase Phrases[] = { "Päävastaanotin", "Pierwotny interfejs DVB", "Primer interface DVB", - "Protevon DVB karta", + "Ęýńéá DVB ęÜńôá", "Primär DVB enhet", "Placa DVB primara", "Elsö DVB interface", @@ -2232,7 +2255,7 @@ const tI18nPhrase Phrases[] = { "Kuvasuhde", "Format telewizyjny", "Formato Vídeo", - "Video Format", + "Ó÷Ţěá ďčüíçň", "Video format", "Format Video", "Video formátum", @@ -2266,7 +2289,7 @@ const tI18nPhrase Phrases[] = { "LNB alempi taajuus (MHz)", "Dolna czestotliwosc LNB (MHz)", "Frecuencia baja LNB (MHz)", - "Kato LNB-Sixnotita (MHz)", + "ĘÜôů LNB-Óő÷íüôçôá (MHz)", "Undre LNB frekvens (MHz)", "Frecvnta LO LNB (Mhz)", "Alsó LNB-frekvencia (MHZ)", @@ -2283,7 +2306,7 @@ const tI18nPhrase Phrases[] = { "LNB ylempi taajuus (MHz)", "Gorna czestotliwosc LNB (MHz)", "Frecuencia alta LNB (MHz)", - "Ano LNB-Sixnotita (MHz)", + "˘íů LNB-Óő÷íüôçôá (MHz)", "Övre LNB frekvens (MHz)", "Feecventa HI LNB (MHz)", "Felsö LNB-frekvencia (MHZ)", @@ -2300,7 +2323,7 @@ const tI18nPhrase Phrases[] = { "DiSEqC käytössä", "Uzywac DiSEqC", "Utilizar DiSEqC", - "Energopiisi DiSEqC", + "Ĺíĺńăďđďßçóç DiSEqC", "Använd DiSEqC", "Utilizez DiSEqC", "DiSEqC használata", @@ -2334,7 +2357,7 @@ const tI18nPhrase Phrases[] = { "Aloitusmarginaali (min)", "Poczatkowy czas buforowy (min)", "Comenzar grabación antes (min)", - "Prosthetos xronos prin arxi (lepta)", + "Đńüóčĺôďň ÷ńüíďň đńßí áń÷Ţ (ëĺđôÜ)", "Marginal för start (min)", "Margine la pornire (min)", "Idöeltolódás a kezdésnél (min)", @@ -2351,7 +2374,7 @@ const tI18nPhrase Phrases[] = { "Lopetusmarginaali (min)", "Koncowy czas buforowy (min)", "Cortar grabación después (min)", - "Prosthetos xronos sto telos (lepta)", + "Đńüóčĺôďň ÷ńüíďň óôü ôÝëďň (ëĺđôÜ)", "Marginal för stopp (min)", "Margine la oprire (min)", "Idöeltolódás a befejezésnél", @@ -2368,7 +2391,7 @@ const tI18nPhrase Phrases[] = { "Päävastaanottimen prioriteetti", "Pierwotny limit", "Límite primario", - "Protevon orio", + "Đńďôĺýďí üńéď", "Primär gräns", "Limita Primara", "Primér-határ", @@ -2385,7 +2408,7 @@ const tI18nPhrase Phrases[] = { "Tallenteen oletusprioriteetti", "Priorytet pierwotny", "Prioridad predefinida", - "Protereotita", + "Đńďôĺńáéüôçôá", "Normal prioritet", "Prioritate implicita", "Default priority", @@ -2402,7 +2425,7 @@ const tI18nPhrase Phrases[] = { "Tallenteen oletuselinikä (d)", "Pierwotna trwalosc (d)", "Duración predefinida", - "Xronos zois", + "ĐńďęáčďńéóěÝíç äéÜńęĺéá đáńáěďíŢň (ÇěÝńĺň)", "Normal livstid (dagar)", "Durata predefinita", "Default élettartam", @@ -2419,7 +2442,7 @@ const tI18nPhrase Phrases[] = { "Keskeytyksen prioriteetti", "Priorytet przerwy", "",// TODO - "",// TODO + "Đńďôĺńáéüôçôá äéáëĺßěěáôďň", "Prioritet för direktinspelning", "",// TODO "Szünet prioritás", @@ -2436,7 +2459,7 @@ const tI18nPhrase Phrases[] = { "Keskeytyksen elinikä (d)", "Okres trwania przerwy (d)", "",// TODO - "",// TODO + "ÄéÜńęĺéá äéáëĺßěáôďň", "Livstid för direktinspelning (dagar)", "",// TODO "Szünet élettartama", @@ -2453,7 +2476,7 @@ const tI18nPhrase Phrases[] = { "Käytä jakson nimeä", "Czy uzywac nazwe epizodu", "Utilizar nombre de episodo", - "Xrisimopiisi onomatos episodiou", + "×ńŢóç ďíüěáôďň ĺđĺéóďäßďő", "Använd episodnamn", "Utilizeaza numele episodului", "Epizódnév felhasználása", @@ -2470,7 +2493,7 @@ const tI18nPhrase Phrases[] = { "Merkitse pikatallenne", "Zaznaczyc natychm. nagranie", "Marcar grabaciones instantáneas", - "Epilogi trexon egrafis", + "ĹđéëďăŢ ôńÝ÷ďőóáň ĺăăńáöŢň", "Märk direktinspelning", "Inregistrare imediata", "Direktfelvétel megjelölése", @@ -2487,7 +2510,7 @@ const tI18nPhrase Phrases[] = { "Nimeä pikatallenne", "Nazwac natychm. nagranie", "Nombrar grabaciones instantáneas", - "eponomasi trexon egrafis", + "Ďíďěáóßá ôńÝ÷ďőóáň ĺăăńáöŢň", "Namnge direktinspelning", "Nume inregistrare imediata", "Direktfelvétel megnevezése", @@ -2504,7 +2527,7 @@ const tI18nPhrase Phrases[] = { "Pikatallennuksen kesto (min)", "Dlugosc bezposredniego nagrania (min)", "Tiempo de grabación instantánea (min)", - "Stigmiees egrafes xronos (lepta)", + "ÄéÜńęĺéá óôăěéáßáň ĺăăńáöŢň (ëĺđôÜ)", "Direktinspelning längd (min)", "Timpul de inregistarea imediata (min)", "Felvétel idötartama", @@ -2521,7 +2544,7 @@ const tI18nPhrase Phrases[] = { "Dolby Digital tallennus", "Nagrywac Dolby Digital", "Grabar sonido Dolby Digital", - "Egrafi tou Dolby Digital ixou", + "ĹăăńáöŢ ôďő Dolby Digital Ţ÷ďő", "Spela in ljudet med Dolby Digital", "Inregistreaza Dolby Digital", "Dolby Digitál felvétel", @@ -2538,7 +2561,7 @@ const tI18nPhrase Phrases[] = { "Suurin tiedostokoko (Mt)", "Maks. wielkosc pliku (MB)", "Tamańo máx. de fichero (MB)", - "Megisto megethos arxeiou (MB)", + "ĚÝăéóôď ěÝăĺčďň áń÷ĺßďő (MB)", "Maximal filstorlek för inspelning (MB)", "Dimensiune maxima a fisierului video (MB)", "Max. video File-terjedelem (MB)", @@ -2555,7 +2578,7 @@ const tI18nPhrase Phrases[] = { "Jaottele muokatut tallenteet", "Dzielic montowane pliki", "Quebrar ficheros", - "Diamelisma epeksergasmenon arxeion", + "ÄéáěÝëéóěüň ĺđĺîĺńăáóěÝíůí áń÷ĺßůí", "Dela upp redigerade filer", "Separare fisiere editate", "Feldolgozott File-k felosztása", @@ -2572,7 +2595,7 @@ const tI18nPhrase Phrases[] = { "Moninopeustila", "Tryb wielopredkosciowy", "Modo multi-velocidad", - "Multispeed mode", + "Ěĺčďäďň đďëëáđëŢň ôá÷ýôçôáň", "Multispeed mode", "Mod multi-rata", "MultiSpeed funkció", @@ -2589,7 +2612,7 @@ const tI18nPhrase Phrases[] = { "Näytä toiston tila", "Wyswietlac status odtwarzania", "Mostrar modo de replay", - "Endiksi katastasis anametadosis", + "¸íäĺéîç ęáôÜóôáóçň áíáěĺôÜäďóçň", "Visa uppspelnings läge", "Afiseaza modul de redare", "Lejátszás feltüntetése", @@ -2606,7 +2629,7 @@ const tI18nPhrase Phrases[] = { "Tallenteen paluutunniste", "ID odtwarzania", "Continuar ID", - "Resume ID",// TODO + "ID áíáěĺôÜäďóçň", "Ĺteruppta ID", "Resume ID",// TODO "Lejátszás ID", @@ -2623,7 +2646,7 @@ const tI18nPhrase Phrases[] = { "Tapahtuman odotusaika (min)", "Min. czas do nast. akcji (Event) (min)", "Tiempo mínimo pausa (min)", - "Elaxistos Xronos paremvolis (lepta)", + "ĹëÜ÷éóôďň ÷ńÜíďň đáńĺěâďëŢň (ëĺđôÜ)", "Minsta händelse-pause (min)", "MinEventTimeout (min)", "Min. esemény szünet (min)", @@ -2640,7 +2663,7 @@ const tI18nPhrase Phrases[] = { "Käyttäjätoiminnon odotusaika (min)", "Min. brak aktywnosci uzytkownika (min)", "Tiempo mínimo inactividad (min)", - "Elaxistos xronos mi xrisis (lepta)", + "ĹëÜ÷éóôďň ÷ńüíďň áíáěďíŢň (ëĺđôÜ)", "Minsta anändar-inaktivitet (min)", "Durata minima de inactivitate (min)", "Min. kezelési aktivitás (min)", @@ -2657,7 +2680,7 @@ const tI18nPhrase Phrases[] = { "SVDRP odotusaika (s)", "Min. brak aktywnosci SVDRP (s)", "SVDRP Timeout (s)", - "SVDRP Timeout (d)", + "SVDRP äéáęďđŢ (ä)", "SVDRP Timeout (d)", "Timeout SVDRP (sec)", "SVDRP Timeout (s)", @@ -2674,7 +2697,7 @@ const tI18nPhrase Phrases[] = { "Kanavavalinnan odotusaika (s)", "",// TODO "",// TODO - "",// TODO + "ĆÜđéíăę äéáęďđŢ (ä)", "",// TODO "",// TODO "",// TODO @@ -2692,7 +2715,7 @@ const tI18nPhrase Phrases[] = { "MTKTPLS", "PWSCPSN", "LMMJVSD", - "DTTPPSK", + "ÄÔÔĐĐÓĘ", "MTOTFLS", "LMMJVSD", "HKSCPSV", @@ -2709,7 +2732,7 @@ const tI18nPhrase Phrases[] = { "Ma Ti Ke To Pe La Su ", "PonWtoSroCzwPiaSobNie", "LunMarMieJueVieSabDom", - "DevTriTetPemParSavKir", + "ÄĺőÔńßÔĺôĐÝěĐáńÓÜâKőń", "MĺnTisOnsTorFreLörSön", "LunMarMieJoiVinSimDum", "HétKedSzeCsüPénSzoVas", @@ -2727,7 +2750,7 @@ const tI18nPhrase Phrases[] = { " abcdefghijklmnopqrstuvwxyzĺäö0123456789-.#~", " abcdefghijklmnopqrstuvwxyz0123456789-.#~", " aábcdeéfghiíjklmnńoópqrstuúvwxyz0123456789-.#~", - "",// TODO + " áÜâăäĺÝćçŢčéßęëěíîďüđńóňôőýö÷řůţ0123456789-.#~abcdefghijklmnopqrstuvwxyz", " abcdefghijklmnopqrstuvwxyzĺäö0123456789-.#~", " abcdefghijklmnopqrstuvwxyz0123456789-.#~", " aábcdeéfghiíjklmnoóöpqrstuúüvwxyz0123456789-.,#~", @@ -2745,7 +2768,7 @@ const tI18nPhrase Phrases[] = { "Kaukosäätimen opettaminen (%s)", "Nauka kodu pilota (%s)", "Aprendiendo teclas del telemando (%s)", - "Ekmathisi pliktron tilexirismou (%s)", + "ĹęěÜčçóç đëŢęôńůí ôçëĺ÷ĺéńéóěďý (%s)", "Inlärning av fjärrkontrollsknappar (%s)", "Invatare taste telecomanda (%s)", "Távirányító betanítása (%s)", @@ -2762,7 +2785,7 @@ const tI18nPhrase Phrases[] = { "Vaihe 1: Koodauksen tunnistaminen", "Faza 1: Detekcja typu kodu", "Fase 1: Detectando tipo de receptor", - "Phasi 1: Anixneusi kodika RC", + "ÖÜóç 1: Áíß÷íĺőóç ęţäéęá RC", "Steg1: identifiering av RC kod", "Faza 1: Detectie tip telecomanda", "Elsö lépés: távirányító kódjának meghatározása", @@ -2779,7 +2802,7 @@ const tI18nPhrase Phrases[] = { "Paina mitä tahansa kaukosäätimen näppäintä", "Nacisnac klawisz pilota", "Pulse una tecla en el telemando", - "Piese ena pliktro sto tilexiristirio", + "Đßĺóĺ Ýíá đëŢęôńď óôď ôçëĺ÷ĺéńéóôŢńéď", "Tryck valfri tangent pĺ fjärrkontrollen", "Apasati o tasta pe telecomanda", "Nyomjon meg egy gombot a távirányítón", @@ -2796,7 +2819,7 @@ const tI18nPhrase Phrases[] = { "Näppäinpainallus vastaanotettu!", "Kod pilota zostal poznany!", "ĄCódigo detectado!", - "Evrethike kodikas RC!", + "ÂńÝčçęĺ ęţäéęáň RC!", "RC koden detekterad!", "S-a detectat tipul telecomenzii!", "Távirányító kódja felismerve!", @@ -2813,7 +2836,7 @@ const tI18nPhrase Phrases[] = { "Älä paina kaukosäätimen näppäimiä...", "Nie naciskac klawiszy...", "No pulse ninguna tecla...", - "Min piezeis pliktra...", + "ĚŢí đéÝćĺéň đëŢęôńá...", "Tryck inte pĺ nĺgon knapp...", "Nu apasati nicio tasta...", "Ne nyomjon meg gombot...", @@ -2830,7 +2853,7 @@ const tI18nPhrase Phrases[] = { "Vaihe 2: Näppäinkoodien opettelu", "Faza 2: Nauka pojedynczych klawiszy", "Fase 2: Aprendiendo códigos específicos", - "Fasi 2: Ekmathisi memonomenon kodikon pliktron", + "Öáóç 2: ĹęěÜčçóç ěĺěďíďěÝíůí đëŢęôńůí", "Fas 2: Inlärning av specifika knapp koder", "Faza 2: Invatarea codurilor specifice tastelor", "Második lépés: az egyes gombok betanítása", @@ -2847,7 +2870,7 @@ const tI18nPhrase Phrases[] = { "Paina näppäintä toiminnolle '%s'", "Nacisnac klawisz dla '%s'", "Pulsar tecla para '%s'", - "Piese to pliktro gia '%s'", + "Đßĺóĺ ôď đëŢęôńď ăéÜ '%s'", "Tryck pĺ knappen för '%s'", "Apasati tasta pentru '%s'", "'%s' gomb megnyomása", @@ -2864,7 +2887,7 @@ const tI18nPhrase Phrases[] = { "Hyväksy painamalla 'Ylös'", "Nacisnac 'Gora' do potwierdzenia", "Pulse 'Arriba' para confirmar", - "Piese 'pano' gia apodoxi", + "Đßĺóĺ 'đÜíů' ăéÜ áđďäď÷Ţ", "Tryck 'Upp' för att bekräfta", "Apsati 'Sus' pentru confirmare", "'Fel' megnyomása az elfogadáshoz", @@ -2881,7 +2904,7 @@ const tI18nPhrase Phrases[] = { "Jatka painamalla 'Alas'", "Nacisnac 'Dol' zeby kontynuowac", "Pulse 'Abajo' para confirmar", - "Piese 'kato' gia sinexia", + "Đßĺóĺ 'ęÜôů' ăéÜ óőíÝ÷ĺéá", "Tryck 'Ner' för att bekräfta", "Apasati jos pentru continuare", "'Le' megnyomása a folytatáshoz", @@ -2898,7 +2921,7 @@ const tI18nPhrase Phrases[] = { "(palaa takaisin painamalla 'Ylös')", "(Nacisnac 'Gora' cofa)", "(Pulse 'Arriba' para retornar)", - "(Piese 'pano' gia epistrofi", + "(Đßĺóĺ 'đÜíů' ăéÜ ĺđéóôńďöŢ", "(Tryck 'Upp' för att backa)", "(Apsati 'Sus' pentru revenire)", "(´Fel' megnyomása a visszatéréshez)", @@ -2915,7 +2938,7 @@ const tI18nPhrase Phrases[] = { "(lopeta opettaminen painamalla 'Alas')", "(Nacisnac 'Dol' by zakonczyc)", "(Pulse 'Abajo' para terminar programación teclas)", - "(Piese 'Kato' gia termatismo diloseon plktron)", + "(Đßĺóĺ 'ęÜôů' ăéÜ ôĺńěáôéóěü äçëţóĺůí đëŢęôńůí)", "(Tryck 'Ner' för att avsluta knapp definition)", "(Apasati 'Jos' pentru terminare)", "('Le' megnyomása a befejezéshez)", @@ -2932,7 +2955,7 @@ const tI18nPhrase Phrases[] = { "näppäimen puuttuessa paina 'Valikko'", "(Nacisnac 'Menu' by ominac klawisz)", "Pulse 'Menu' para saltarse esta tecla", - "Pata 'Menou' gia prosperasi aftou tou pliktrou", + "ĐÜôá 'ěĺíďý' ăéá đńďóđÝńáóç áőôďý ôďý đëŢęôńďő", "Tryck 'Meny' för att hoppa över denna knapp.", "",// TODO "A Menü gombot nyomni ennek a gombnak a kihagyásához", @@ -2949,7 +2972,7 @@ const tI18nPhrase Phrases[] = { "Vaihe 3: Näppäinkoodien tallentaminen", "Faza 3: Zapamietac Kod", "Fase 3: Guardar códigos de teclas", - "Fasi 3: Apothikevsi kodikon", + "Öáóç 3: Áđďčßęĺőóç ęůäéęţí", "Fas 3: Spara knappkoder", "Faza 3: Salvarea codurilor de taste", "Harmadik lépés: kód mentése", @@ -2966,7 +2989,7 @@ const tI18nPhrase Phrases[] = { "Paina 'Ylös' tallentaaksesi ja 'Alas' peruuttaaksesi", "'Gora' zapamietuje, 'Dol' przerywa", "Pulse 'Arriba' para guardar, 'Abajo' para anular", - "'Pano' apothikevsi, 'Kato' akirosi", + "'ĐÜíů' áđďčßęĺőóç, 'ĘÜôů' áęýńůóç", "Tryck 'Upp' för att spara, 'Ner' för att avsluta", "Apsati 'Sus' pentru salvare, 'Jos' pentru anulare", "'Fel' mentés, 'Le´ mégse", @@ -2984,7 +3007,7 @@ const tI18nPhrase Phrases[] = { "Ylös", "Gora", "Arriba", - "Pano", + "ĐÜíů", "Upp", "Sus", "Fel", @@ -3001,7 +3024,7 @@ const tI18nPhrase Phrases[] = { "Alas", "Dol", "Abajo", - "Kato", + "ĘÜôů", "Ner", "Jos", "Le", @@ -3018,7 +3041,7 @@ const tI18nPhrase Phrases[] = { "Valikko", "Menu", "Menu", - "Menou", + "Ěĺíďý", "Meny", "Meniu", "Menü", @@ -3035,7 +3058,7 @@ const tI18nPhrase Phrases[] = { "Ok", "Ok", "Ok", - "Ok", + "Ďę", "Ok", "Ok", "Ok", @@ -3052,7 +3075,7 @@ const tI18nPhrase Phrases[] = { "Takaisin", "Wstecz", "Retornar", - "Piso", + "Đßóů", "Tillbaka", "Inapoi", "Vissza", @@ -3069,7 +3092,7 @@ const tI18nPhrase Phrases[] = { "Vasemmalle", "Lewo", "Izquierda", - "Aristera", + "ÁńéóôĺńÜ", "Vänster", "Stinga", "Balra", @@ -3086,7 +3109,7 @@ const tI18nPhrase Phrases[] = { "Oikealle", "Prawo", "Derecha", - "Deksia", + "ÄĺîéÜ", "Höger", "Dreapta", "Jobbra", @@ -3103,7 +3126,7 @@ const tI18nPhrase Phrases[] = { "Punainen", "Czerwony", "Rojo", - "Kokino", + "Ęüęęéíď", "Röd", "Rosu", "Piros", @@ -3120,7 +3143,7 @@ const tI18nPhrase Phrases[] = { "Vihreä", "Zielony", "Verde", - "Prasino", + "ĐńÜóéíď", "Grön", "Verde", "Zöld", @@ -3137,7 +3160,7 @@ const tI18nPhrase Phrases[] = { "Keltainen", "Zolty", "Amarillo", - "Kitrino", + "Ęßôńéíď", "Gul", "Galben", "Sárga", @@ -3154,7 +3177,7 @@ const tI18nPhrase Phrases[] = { "Sininen", "Niebieski", "Azul", - "Mple", + "ĚđëÝ", "Blĺ", "Albastru", "Kék", @@ -3171,7 +3194,7 @@ const tI18nPhrase Phrases[] = { "Toista", "Odtworzenie", "Reproducir", - "Anametadosi", + "AíáěĺôÜäďóç", "Spela upp", "",// TODO "Lejátszás", @@ -3188,7 +3211,7 @@ const tI18nPhrase Phrases[] = { "Keskeytä", "Przerwa", "Pausa", - "Dialima", + "ÄéÜëĺéěěá", "Pausa", "",// TODO "Szünet", @@ -3205,7 +3228,7 @@ const tI18nPhrase Phrases[] = { "Lopeta", "Stop", "Parar", - "Terma", + "TÝńěá", "Stoppa", "",// TODO "Stop", @@ -3222,7 +3245,7 @@ const tI18nPhrase Phrases[] = { "Tallenna", "Nagrywac", "Grabar", - "Egrafi", + "EăăńáöŢ", "Spela in", "",// TODO "Felvenni", @@ -3239,7 +3262,7 @@ const tI18nPhrase Phrases[] = { "Pikakelaus >>", "Naprzod", "Adelante rápido", - "Girisma mprosta", + "Đńďüčéóç ĺěđńüň", "Snabbspolning framĺt", "",// TODO "Elöre pörgetni", @@ -3256,7 +3279,7 @@ const tI18nPhrase Phrases[] = { "Pikakelaus <<", "Wstecz", "Atrás rápido", - "Girisma piso", + "Đńďüčéóç đßóů", "Snabbspolning bakĺt", "",// TODO "Vissza pörgetni", @@ -3273,7 +3296,7 @@ const tI18nPhrase Phrases[] = { "Virtakytkin", "Wylaczyc", "Corriente", - "Klisimo", + "Këĺßóéěď", "Pĺ/Av", "Pornit", "Kikapcsolni", @@ -3290,7 +3313,7 @@ const tI18nPhrase Phrases[] = { "Kanava +", "Kanal+", "Canal +", - "Kanali+", + "ĘáíÜëé+", "Kanal+", "",// TODO "Csatorna+", @@ -3307,7 +3330,7 @@ const tI18nPhrase Phrases[] = { "Kanava -", "Kanal-", "Canal -", - "Kanali-", + "ĘáíÜëç-", "Kanal-", "",// TODO "Csatorna-", @@ -3316,7 +3339,7 @@ const tI18nPhrase Phrases[] = { { "Volume+", "Lautstärke+", "Glasnost+", - "Volume +", + "Volume +", "Volume+", "Volume+", "Volume+", @@ -3324,7 +3347,7 @@ const tI18nPhrase Phrases[] = { "Äänenvoimakkuus +", "Glosnej", "Volumen+", - "Entasi+", + "¸íôáóç+", "Volym+", "Volum+", "Hangerö+", @@ -3341,7 +3364,7 @@ const tI18nPhrase Phrases[] = { "Äänenvoimakkuus -", "Ciszej", "Volumen-", - "Entasi-", + "¸íôáóç-", "Volym-", "Volum-", "Hangerö-", @@ -3358,7 +3381,7 @@ const tI18nPhrase Phrases[] = { "Äänetön", "Cisza", "Mudo", - "Siopilo", + "Óéůđçëü", "Ljud Av", "Mut(e)", "Csend", @@ -3376,7 +3399,7 @@ const tI18nPhrase Phrases[] = { "kyllä", "tak", "sí", - "nai", + "íáß", "ja", "da", "igen", @@ -3393,7 +3416,7 @@ const tI18nPhrase Phrases[] = { "ei", "nie", "no", - "oxi", + "ü÷é", "nej", "nu", "nem", @@ -3410,7 +3433,7 @@ const tI18nPhrase Phrases[] = { "pois", "wyl.", "off", - "klisto", + "ęëĺéóôü", "av", "",// TODO "ki", @@ -3427,7 +3450,7 @@ const tI18nPhrase Phrases[] = { "tyhjä", "zaden", "ninguno", - "kanena", + "ęáíÝíá", "ingen", "",// TODO "semmi", @@ -3444,7 +3467,7 @@ const tI18nPhrase Phrases[] = { "auto", "auto", "auto", - "aftomato", + "áőôüěáôď", "automatisk", "",// TODO "auto", @@ -3461,7 +3484,7 @@ const tI18nPhrase Phrases[] = { "yläreuna", "gora", "parte superior", - "pano", + "đÜíů", "övre", "sus", "Fent", @@ -3478,7 +3501,7 @@ const tI18nPhrase Phrases[] = { "alareuna", "dol", "parte inferior", - "kato", + "ęÜôů", "undre", "jos", "lent", @@ -3495,7 +3518,7 @@ const tI18nPhrase Phrases[] = { "Levy", "Disk", "Disco", - "Disk", + "Äßóęďň", "Disk", "Disc", "Lemez", @@ -3512,7 +3535,7 @@ const tI18nPhrase Phrases[] = { "vapaana", "pozostalo", "libre", - "akoma", + "Ęĺíü", "ledigt", "liber", "szabad", @@ -3529,7 +3552,7 @@ const tI18nPhrase Phrases[] = { "Siirry: ", "Skok: ", "Salta a: ", - "Pidima: ", + "ÔďđďčÝôçóç: ", "Hopp: ", "Salt: ", "Ugrás: ", @@ -3546,7 +3569,7 @@ const tI18nPhrase Phrases[] = { "Äänenvoimakkuus ", "Glosnosc ", "Volumen ", - "Entasi ", + "¸íôáóç ", "Volym ", "Volum ", "Hangerö ", @@ -3563,7 +3586,7 @@ const tI18nPhrase Phrases[] = { " Lopeta toisto", " Zatrzymac odtwarzanie", " Parar reprodución", - " Telos anametadosis", + " ÔÝëďň áíáěĺôÜäďóçň", " Avsluta uppspelning", " Opreste redare", " Lejátszást befejzni", @@ -3580,7 +3603,7 @@ const tI18nPhrase Phrases[] = { " Lopeta tallennus ", " Zatrzymac nagrywanie ", " Parar grabación ", - " Telos egrafis ", + " ÔÝëďň ĺăăáöŢň ", " Avsluta inspelning ", " Opreste inregistrarea ", " Felvételt befejezni ", @@ -3597,7 +3620,7 @@ const tI18nPhrase Phrases[] = { " Peru muokkaus", " Przerwac montaz", " Anular modificación ", - " Akirosi epexsergasias", + " Áęýńůóç ĺđĺîĺńăáóßáň", " Avbryt redigering", " Opreste editare", " Vágást megszakítani", @@ -3614,7 +3637,7 @@ const tI18nPhrase Phrases[] = { "Vaihdetaan päävastaanottimelle...", "Pierwszy interfejs DVB przelacza...", "Cambio al interface DVB primario...", - "I protevon DVB Karta alazi...", + "Ç ęýńéá DVB ęÜńôá áëëÜćĺé...", "Byter primär DVB enhet...", "Comuta interfata primara DVB...", "Primér Interface átkapcsolva...", @@ -3631,7 +3654,7 @@ const tI18nPhrase Phrases[] = { "'Ylös/Alas' uusi paikka - 'OK' hyväksy", "Gora/Dol na nowa pozycje - Ok zmienia", "Arriba/Abajo para el nuevo lugar - OK para mover", - "Pano/Kato gia nea thesi. meta OK", + "ĐÜíů/ĘÜôů ăéÜ íÝá čÝóç. ĚĺôÜ ĎĘ", "Upp/Ner för ny plats - OK för att flytta", "Sus/Jos pentru noua locatie - OK pentru a muta", "Fel/Le egy uj opcióért - aztán OK", @@ -3648,7 +3671,7 @@ const tI18nPhrase Phrases[] = { "Muokkaus aloitettu", "Uruchomiony proces montazu", "Proceso modificación iniciado", - "Arxi epexsergasias", + "Áń÷Ţ ĺđĺîĺńăáóßáň", "Redigering startad", "Procesul de editare a inceput", "Vágás elindítva", @@ -3665,7 +3688,7 @@ const tI18nPhrase Phrases[] = { "Muokkaus lopetettu", "Proces montazu zakonczony", "Proceso de modificación terminado", - "I epexsergasia teliose", + "Ç ĺđĺîĺńăáóßá ôĺëĺßůóĺ", "Redigering avslutad", "Procesul de editare s-a terminat", "Vágás befejezve", @@ -3682,7 +3705,7 @@ const tI18nPhrase Phrases[] = { "Muokkaus epäonnistui!", "Bledny proces montazu!", "Modificación ha fallado!", - "I epexsergasia apetixe!", + "Ç ĺđĺîĺńăáóßá áđÝôő÷ĺ!", "Redigeringsprocessen misslyckades", "Proces de editare nereusit", "Vágás sikertelen!", @@ -3699,7 +3722,7 @@ const tI18nPhrase Phrases[] = { "haetaan tallenteita...", "Skan nagran...", "buscando grabaciones...", - "Eksetasi egrafon...", + "ĹîÝôáóç ĺăăńáöţí...", "Söker igenom inspelningarna...", "Caut inregistrari...", "Felvett adások böngészése...", @@ -3716,7 +3739,7 @@ const tI18nPhrase Phrases[] = { "Keskeytetään lähetys...", "Zatrzymany program biezacy...", "Emisión en directo parada...", - "",// TODO + "ÄéÜëĺéěěá ćůíôáíďý óŢěáôďň", "Pausar direktinspelningen", "",// TODO "Az élö adás megállítva...", @@ -3733,7 +3756,7 @@ const tI18nPhrase Phrases[] = { "Tällä laajennoksella ei ole asetuksia!", "Ten plugin niema parametrow!", "Este plugin no admite configuración", - "Afto to plugin den exi parametrous", + "Áőôü ôď âßóěá äĺí Ý÷ĺé đáńÜěĺôńďőň", "Den här modulen har inga parametrar", "",// TODO "Ennek a plugin-nak nincs setup-parametere!", @@ -3824,3 +3847,8 @@ const char * const * I18nLanguages(void) { return &Phrases[0][0]; } + +const char * const * I18nCharSets(void) +{ + return &Phrases[1][0]; +} @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: i18n.h 1.6 2003/05/16 12:48:52 kls Exp $ + * $Id: i18n.h 1.7 2003/10/19 15:02:05 kls Exp $ */ #ifndef __I18N_H @@ -21,6 +21,7 @@ void I18nRegister(const tI18nPhrase * const Phrases, const char *Plugin); const char *I18nTranslate(const char *s, const char *Plugin = NULL); const char * const * I18nLanguages(void); +const char * const * I18nCharSets(void); #ifdef PLUGIN_NAME_I18N #define tr(s) I18nTranslate(s, PLUGIN_NAME_I18N) diff --git a/libdtv/COPYING b/libdtv/COPYING deleted file mode 100644 index a43ea21..0000000 --- a/libdtv/COPYING +++ /dev/null @@ -1,339 +0,0 @@ - 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 - - Appendix: How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - <one line to give the program's name and a brief idea of what it does.> - Copyright (C) 19yy <name of author> - - 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. - -Also add information on how to contact you by electronic and paper mail. - -If the program is interactive, make it output a short notice like this -when it starts in an interactive mode: - - Gnomovision version 69, Copyright (C) 19yy name of author - Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, the commands you use may -be called something other than `show w' and `show c'; they could even be -mouse-clicks or menu items--whatever suits your program. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the program, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the program - `Gnomovision' (which makes passes at compilers) written by James Hacker. - - <signature of Ty Coon>, 1 April 1989 - Ty Coon, President of Vice - -This General Public License does not permit incorporating your program into -proprietary programs. If your program is a subroutine library, you may -consider it more useful to permit linking proprietary applications with the -library. If this is what you want to do, use the GNU Library General -Public License instead of this License. diff --git a/libdtv/Makefile b/libdtv/Makefile deleted file mode 100644 index 56cb533..0000000 --- a/libdtv/Makefile +++ /dev/null @@ -1,73 +0,0 @@ -############################################################## -### ### -### Makefile: global makefile for libdtv ### -### ### -############################################################## - -## $Revision: 1.3 $ -## $Date: 2001/06/25 12:51:41 $ -## $Author: hakenes $ -## -## (C) 2001 Rolf Hakenes <hakenes@hippomi.de>, under the GNU GPL. -## -## libdtv 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, or (at your option) -## any later version. -## -## libdtv 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 may have received a copy of the GNU General Public License -## along with libdtv; see the file COPYING. If not, write to the -## Free Software Foundation, Inc., 59 Temple Place - Suite 330, -## Boston, MA 02111-1307, USA. -# -# -# - -# -# adapt this to your GNU make executable -# -MAKE = make - -AR = ar -ARFLAGS = ru -RANLIB = ranlib - -SUBDIRS = liblx libsi libvdr - -all: newdist - -new: clean newdist - -clean: - @echo "making all clean..." - @for i in $(SUBDIRS);\ - do \ - ( echo $$i; cd $$i ;\ - $(MAKE) clean ) ;\ - done - @rm -rf lib include libdtv.* - -newdist: - @mkdir -p include lib - @echo "making all distributions..." - @for i in $(SUBDIRS) ;\ - do \ - ( cd $$i ;\ - $(MAKE) new dist ) ;\ - done - @echo "making libdtv.a/libdtv.h..." - @cat include/* > libdtv.h - @mkdir -p tmp - @for i in $(SUBDIRS) ;\ - do \ - ( cd tmp;\ - $(AR) x ../lib/$$i.a;\ - $(AR) $(ARFLAGS) ../libdtv.a *;\ - rm -f *) ;\ - done - @rm -rf lib include tmp diff --git a/libdtv/README b/libdtv/README deleted file mode 100644 index 88ee049..0000000 --- a/libdtv/README +++ /dev/null @@ -1,27 +0,0 @@ -DTV System Information Library -============================== - -This is intended to support the VDR application of Klaus Schmidinger with -extended EIT support, mainly on NVOD channels. -Bug reports and suggestions are very appreciated and should be sent to -hakenes@hippomi.de - -Have fun, - - (C) 2001 Rolf Hakenes <hakenes@hippomi.de>, under the GNU GPL. - -libdtv 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, or (at your option) -any later version. - -libdtv 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 may have received a copy of the GNU General Public License -along with libdtv; see the file COPYING. If not, write to the -Free Software Foundation, Inc., 59 Temple Place - Suite 330, -Boston, MA 02111-1307, USA. - diff --git a/libdtv/liblx/COPYING b/libdtv/liblx/COPYING deleted file mode 100644 index a43ea21..0000000 --- a/libdtv/liblx/COPYING +++ /dev/null @@ -1,339 +0,0 @@ - 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 - - Appendix: How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - <one line to give the program's name and a brief idea of what it does.> - Copyright (C) 19yy <name of author> - - 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. - -Also add information on how to contact you by electronic and paper mail. - -If the program is interactive, make it output a short notice like this -when it starts in an interactive mode: - - Gnomovision version 69, Copyright (C) 19yy name of author - Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, the commands you use may -be called something other than `show w' and `show c'; they could even be -mouse-clicks or menu items--whatever suits your program. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the program, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the program - `Gnomovision' (which makes passes at compilers) written by James Hacker. - - <signature of Ty Coon>, 1 April 1989 - Ty Coon, President of Vice - -This General Public License does not permit incorporating your program into -proprietary programs. If your program is a subroutine library, you may -consider it more useful to permit linking proprietary applications with the -library. If this is what you want to do, use the GNU Library General -Public License instead of this License. diff --git a/libdtv/liblx/Makefile b/libdtv/liblx/Makefile deleted file mode 100644 index d06ee09..0000000 --- a/libdtv/liblx/Makefile +++ /dev/null @@ -1,62 +0,0 @@ -############################################################## -### ### -### Makefile: local makefile for liblx ### -### ### -############################################################## - -## $Revision: 1.2 $ -## $Date: 2001/06/25 19:39:00 $ -## $Author: hakenes $ -## -## (C) 2001 Rolf Hakenes <hakenes@hippomi.de>, under the GNU GPL. -## -## dtv_scan 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, or (at your option) -## any later version. -## -## dtv_scan 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 may have received a copy of the GNU General Public License -## along with dtv_scan; see the file COPYING. If not, write to the -## Free Software Foundation, Inc., 59 Temple Place - Suite 330, -## Boston, MA 02111-1307, USA. -# -# -# -CC ?= gcc -CFLAGS ?= -O2 -g -pedantic -Wmissing-prototypes -Wstrict-prototypes \ - -Wimplicit -D__USE_FIXED_PROTOTYPES__ # -DDEBUG - - -AR = ar -ARFLAGS = r -RANLIB = ranlib -RM = rm -f -CP = cp - -LXINCLUDE = liblx.h -LXLIB = liblx.a -LXOBJS = xMemMgt.o xListFuncs.o - -all : $(LXLIB) - -clean : - @echo "cleaning workspace..." - @$(RM) $(LXOBJS) $(LXLIB) - -new : clean all - -$(LXLIB) : $(LXOBJS) - @echo "updating library..." - @$(AR) $(ARFLAGS) $(LXLIB) $(LXOBJS) - @$(RANLIB) $(LXLIB) - -dist: all - @echo "distributing liblx.a and liblx.h..." - @$(CP) $(LXLIB) ../lib - @$(CP) $(LXINCLUDE) ../include - diff --git a/libdtv/liblx/liblx.h b/libdtv/liblx/liblx.h deleted file mode 100644 index 2e12295..0000000 --- a/libdtv/liblx/liblx.h +++ /dev/null @@ -1,449 +0,0 @@ -/* - * - * liblx.h: definitions necessary for the liblx package - * - * - * $Revision: 1.2 $ - * $Date: 2001/06/25 19:39:00 $ - * $Author: hakenes $ - * - * (C) 1992-2001 Rolf Hakenes <hakenes@hippomi.de>, under the GNU GPL. - * - * liblx 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, or (at your option) - * any later version. - * - * liblx 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 may have received a copy of the GNU General Public License - * along with liblx; see the file COPYING. If not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - * - */ - -#ifndef LIBLX_H -#define LIBLX_H - -#ifndef NULL -#define NULL 0 -#endif - - -/* - * - * list support structures - * - */ -struct NODE -{ - struct NODE *Succ; - struct NODE *Pred; - char *Name; - unsigned short HashKey; -}; - -struct LIST -{ - struct NODE *Head; - struct NODE *Tail; - char *Name; - unsigned long Size; -}; - - -/* - * - * memory managment structures - * - */ -struct MEM_ENTRY -{ - struct MEM_ENTRY *Succ; - struct MEM_ENTRY *Pred; - unsigned long Size; -}; - -struct MEM_CHUNK -{ - struct MEM_CHUNK *Succ; - struct MEM_CHUNK *Pred; - unsigned long Size; - struct MEM_ENTRY *FirstFreeMemEntry; - struct MEM_ENTRY *FirstUsedMemEntry; -}; - -#ifdef __cplusplus -extern "C" { -#endif - -/* - * - * list functions (package xList) - * - */ - unsigned short xHashKey (char *); - struct LIST *xNewList (char *); - struct NODE *xNewNode (char *, unsigned long); - struct NODE *xFindName (struct LIST *, char *); -/* - * - * memory management - * - */ - void xMemAllo (unsigned long, unsigned char **); - void xMemFre (unsigned char *); - void xMemFreeAll (struct MEM_CHUNK **); - void xMemMerge (struct MEM_CHUNK **); - struct MEM_CHUNK **xGetRemember (void); - void xSetRemember (struct MEM_CHUNK **); - void xPrintMemList (struct MEM_CHUNK **); - unsigned long xGetMemSize (struct MEM_CHUNK **); -extern unsigned long xAllocatedMemory; - char *xSetText (char *); - -#ifdef __cplusplus -} -#endif - - -#define MEM_CHUNK_SIZE 65536 - -#define xMemAlloc(size, ptr) \ - xMemAllo (((unsigned long)((size))), ((unsigned char **)((ptr)))) -#define xMemFree(ptr) xMemFre (((unsigned char *)((ptr)))) -/* - * - * list support macros - * - */ -/*---------------------------------------------------------------------* - | | - | xCreateNode (NodeStruct,Name) allocates a correctly sized and | - | typed node struct. | - | | - *---------------------------------------------------------------------*/ -#define xCreateNode(NodeStruct,Name) \ - (NodeStruct) = (void *) xNewNode(Name, sizeof(*(NodeStruct))) - - -/*---------------------------------------------------------------------* - | | - | xSize (List) scans for the ->Size field of a list struct | - | | - *---------------------------------------------------------------------*/ -#define xSize(List) ((List) ? ((struct LIST *)(List))->Size : 0) - - -/*---------------------------------------------------------------------* - | | - | xName (NodeStruct) scans for the ->Node.Name of a node struct | - | | - *---------------------------------------------------------------------*/ -#define xName(NodeStruct) (((struct NODE *)(NodeStruct))->Name) - - -/*---------------------------------------------------------------------* - | | - | xSucc (NodeStruct) scans for the ->Node.Succ of a node struct | - | | - *---------------------------------------------------------------------*/ -#define xSucc(NodeStruct) (((struct NODE *)(NodeStruct))->Succ) - - -/*---------------------------------------------------------------------* - | | - | xPred (NodeStruct) scans for the ->Node.Pred of a node struct | - | | - *---------------------------------------------------------------------*/ -#define xPred(NodeStruct) (((struct NODE *)(NodeStruct))->Pred) - - -/*---------------------------------------------------------------------* - | | - | xForeach(List,NodeStruct) builds a loop to process each list | - | element. | - | | - *---------------------------------------------------------------------*/ -#define xForeach(List,NodeStruct) \ - if (List) for ((NodeStruct) = (void *) ((struct LIST *)(List))->Head; \ - (NodeStruct); (NodeStruct) = (void *) xSucc (NodeStruct)) - - -/*---------------------------------------------------------------------* - | | - | xForeachReverse(List,NodeStruct) builds a loop to process each | - | element in reverse order. | - | | - *---------------------------------------------------------------------*/ -#define xForeachReverse(List,NodeStruct) \ - if (List) for ((NodeStruct) = (void *) ((struct LIST *)(List))->Tail; \ - NodeStruct; (NodeStruct) = (void *) xPred (NodeStruct)) - - -/*---------------------------------------------------------------------* - | | - | xRemove(List,NodeStruct) unchains a node struct out of a list. | - | | - *---------------------------------------------------------------------*/ -#define xRemove(List,NodeStruct) \ - do \ - { \ - struct NODE *TmpNode; \ - struct LIST *TmpList; \ - \ - TmpNode = ((struct NODE *)(NodeStruct)); \ - TmpList = ((struct LIST *)(List)); \ - \ - if (TmpNode->Pred) \ - (TmpNode->Pred)->Succ = TmpNode->Succ; \ - else TmpList->Head = TmpNode->Succ; \ - if (TmpNode->Succ) \ - (TmpNode->Succ)->Pred = TmpNode->Pred; \ - else TmpList->Tail = TmpNode->Pred; \ - TmpList->Size --; \ - } while (0) - - -/************************************************************************* - * * - * function : xAddHead * - * * - * arguments : List - pointer to a LIST structure * - * * - * Node - pointer to a NODE structure * - * * - *-----------------------------------------------------------------------* - * * - * xAddHead() inserts 'Node' at the head of 'List'. * - * * - *************************************************************************/ -#define xAddHead(List, NodeStruct) \ - do { \ - struct NODE *TmpNode; \ - struct LIST *TmpList; \ - \ - TmpNode = ((struct NODE *)(NodeStruct)); \ - TmpList = ((struct LIST *)(List)); \ - \ - if (TmpList->Head) { \ - TmpNode->Pred = NULL; \ - TmpNode->Succ = TmpList->Head; \ - (TmpList->Head)->Pred = TmpNode; \ - TmpList->Head = TmpNode; } \ - else { \ - TmpList->Head = TmpNode; \ - TmpList->Tail = TmpNode; \ - TmpNode->Pred = NULL; \ - TmpNode->Succ = NULL; } \ - TmpList->Size++; \ - } while (0) - - -/************************************************************************* - * * - * function : xAddTail * - * * - * arguments : List - pointer to a LIST structure * - * * - * Node - pointer to a NODE structure * - * * - *-----------------------------------------------------------------------* - * * - * xAddTail() inserts 'Node' at the tail of 'List'. * - * * - *************************************************************************/ -#define xAddTail(List, NodeStruct) \ - do { \ - struct NODE *TmpNode; \ - struct LIST *TmpList; \ - \ - TmpNode = ((struct NODE *)(NodeStruct)); \ - TmpList = ((struct LIST *)(List)); \ - \ - if (TmpList->Head) { \ - TmpNode->Succ = NULL; \ - TmpNode->Pred = TmpList->Tail; \ - (TmpList->Tail)->Succ = TmpNode; \ - TmpList->Tail = TmpNode; } \ - else { \ - TmpList->Head = TmpNode; \ - TmpList->Tail = TmpNode; \ - TmpNode->Pred = NULL; \ - TmpNode->Succ = NULL; } \ - TmpList->Size++; \ - } while (0) - - -/************************************************************************* - * * - * function : xRemHead * - * * - * arguments : List - pointer to a LIST structure * - * * - *-----------------------------------------------------------------------* - * * - * xRemHead() removes a Node from head of 'List'. * - * * - *************************************************************************/ -#define xRemHead(List) \ - do { \ - struct LIST *TmpList; \ - \ - TmpList = ((struct LIST *)(List)); \ - \ - if (TmpList->Head) \ - { \ - TmpList->Head = (TmpList->Head)->Succ; \ - if (TmpList->Head) (TmpList->Head)->Pred = NULL; \ - else TmpList->Tail = NULL; \ - TmpList->Size--; \ - } \ - } while (0) - - -/************************************************************************* - * * - * function : xRemTail * - * * - * arguments : List - pointer to a LIST structure * - * * - *-----------------------------------------------------------------------* - * * - * xRemTail() removes a Node from the tail of 'List'. * - * * - *************************************************************************/ -#define xRemTail(List) \ - do { \ - struct LIST *TmpList; \ - \ - TmpList = ((struct LIST *)(List)); \ - \ - if (TmpList->Tail) \ - { \ - TmpList->Tail = (TmpList->Tail)->Pred; \ - if (TmpList->Tail) (TmpList->Tail)->Succ = NULL; \ - else TmpList->Head = NULL; \ - TmpList->Size--; \ - } \ - } while (0) - - -/************************************************************************* - * * - * function : xConCat * - * * - * arguments : DestinationList - pointer to the destination * - * LIST structure * - * * - * SourceList - pointer to the source LIST structure * - * * - *-----------------------------------------------------------------------* - * * - * xConCat() concats 'SourceList' with 'DestinationList' and clears * - * 'SourceList'. * - * * - *************************************************************************/ -#define xConCat(DestinationList, SourceList) \ - do { \ - struct LIST *SrcList; \ - struct LIST *DstList; \ - \ - SrcList = ((struct LIST *)(SourceList)); \ - DstList = ((struct LIST *)(DestinationList)); \ - \ - if (DstList && SrcList) \ - { \ - if (DstList->Head) { \ - if (SrcList->Head) { \ - (DstList->Tail)->Succ = SrcList->Head; \ - (SrcList->Head)->Pred = DstList->Tail; \ - DstList->Tail = SrcList->Tail; \ - DstList->Size += SrcList->Size; \ - SrcList->Size = 0; \ - SrcList->Head = NULL; \ - SrcList->Tail = NULL; } } \ - else { \ - DstList->Head = SrcList->Head; \ - DstList->Tail = SrcList->Tail; \ - DstList->Size += SrcList->Size; \ - SrcList->Size = 0; \ - SrcList->Head = NULL; \ - SrcList->Tail = NULL; } \ - } \ - else if (SrcList) ((struct LIST *)(DestinationList)) = SrcList; \ - } while (0) - - - -#define xJoinList(SourceList, DestinationList, NodeStruct) \ - do { \ - struct NODE *KeyNode; \ - struct NODE *TmpNode; \ - struct LIST *SrcList; \ - struct LIST *DstList; \ - \ - KeyNode = ((struct NODE *)(NodeStruct)); \ - SrcList = ((struct LIST *)(SourceList)); \ - DstList = ((struct LIST *)(DestinationList)); \ - \ - if (SrcList->Head) \ - { \ - TmpNode = KeyNode->Succ; \ - KeyNode->Succ = SrcList->Head; \ - SrcList->Tail->Succ = TmpNode; \ - SrcList->Head->Pred = KeyNode; \ - if (!TmpNode) DstList->Tail = SrcList->Tail; \ - else TmpNode->Pred = SrcList->Tail; \ - DstList->Size += SrcList->Size; \ - SrcList->Size = 0; \ - SrcList->Head = NULL; \ - SrcList->Tail = NULL; \ - } \ - } while (0) - -#define xJoin(SourceNode, DestinationList, NodeStruct) \ - do { \ - struct NODE *KeyNode; \ - struct NODE *TmpNode; \ - struct NODE *SrcNode; \ - struct LIST *DstList; \ - \ - KeyNode = ((struct NODE *)(NodeStruct)); \ - SrcNode = ((struct NODE *)(SourceNode)); \ - DstList = ((struct LIST *)(DestinationList)); \ - \ - if (SrcNode) \ - { \ - TmpNode = KeyNode->Succ; \ - KeyNode->Succ = SrcNode; \ - SrcNode->Succ = TmpNode; \ - SrcNode->Pred = KeyNode; \ - if (!TmpNode) DstList->Tail = SrcNode; \ - else TmpNode->Pred = SrcNode; \ - DstList->Size += 1; \ - } \ - } while (0) - -#define xClearList(SrcList) \ - do { \ - (SrcList)->Size = 0; \ - (SrcList)->Head = NULL; \ - (SrcList)->Tail = NULL; \ - } while (0) - -#define xSetName(nodestruct, name) \ - do { \ - struct NODE *TmpNode; \ - \ - TmpNode = (struct NODE *) (nodestruct); \ - \ - TmpNode->Name = xSetText (name); \ - TmpNode->HashKey = xHashKey (name); \ - } while (0) - -#endif diff --git a/libdtv/liblx/xListFuncs.c b/libdtv/liblx/xListFuncs.c deleted file mode 100644 index 88a908b..0000000 --- a/libdtv/liblx/xListFuncs.c +++ /dev/null @@ -1,189 +0,0 @@ -/* - * - * xListFuncs.c: list handling functions of liblx - * - * - * $Revision: 1.1 $ - * $Date: 2001/06/25 12:29:47 $ - * $Author: hakenes $ - * - * (C) 1992-2001 Rolf Hakenes <hakenes@hippomi.de>, under the GNU GPL. - * - * liblx 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, or (at your option) - * any later version. - * - * liblx 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 may have received a copy of the GNU General Public License - * along with liblx; see the file COPYING. If not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - * - */ - -#include <string.h> -#include "liblx.h" - - -/************************************************************************* - * * - * function : xHashKey * - * * - * arguments : Name - character pointer * - * * - * return : 16 Bit CRC checksum as hashkey * - * * - *************************************************************************/ -unsigned short xHashKey (Name) - -char *Name; -{ - unsigned short Key = 0; - unsigned long Value; - char *Ptr; - - if (!Name) return (0); - - for (Ptr = Name; *Ptr; Ptr++) { - Value = ((Key >> 8) ^ (*Ptr)) & 0xFF; - Value = Value ^ (Value >> 4); - Key = 0xFFFF & ((Key << 8) ^ Value ^ (Value << 5) ^ (Value << 12)); - } - return (Key); -} - - -/************************************************************************* - * * - * function : xNewNode * - * * - * arguments : Name - character pointer to the node's name * - * * - * Size - size of the surrounding structure in bytes * - * * - * return : pointer to a correct initialized NODE structure * - * * - *-----------------------------------------------------------------------* - * * - * xNewNode() allocates memory for a NODE structure and initializes * - * it properly. If argument Name points to a string, it copies that * - * into a new allocated memory area and assigns Node->Name to it. * - * Because NODE's are often part of bigger structures, the size of * - * the surrounding structure could be specified to allocate it. * - * * - *************************************************************************/ - -struct NODE *xNewNode (Name, Size) - -char *Name; -unsigned long Size; -{ - struct NODE *Node; - - if (Size < sizeof(struct NODE)) Size = sizeof(struct NODE); - - xMemAlloc (Size, &Node); - - Node->Succ = NULL; - Node->Pred = NULL; - - if (Name == NULL) - { - Node->Name = NULL; - Node->HashKey = 0; - } - else - { - xMemAlloc (strlen (Name) + 1, &(Node->Name)); - strcpy (Node->Name, Name); - Node->HashKey = xHashKey (Name); - } - - return (Node); -} - - -/************************************************************************* - * * - * function : xNewList * - * * - * arguments : Name - character pointer to the list's name * - * * - * return : pointer to a correct initialized LIST structure * - * * - *-----------------------------------------------------------------------* - * * - * xNewList() allocates memory for a LIST structure and initializes * - * it properly. If argument Name points to a string, it copies that * - * into a new allocated memory area and assigns List->Name to it. * - * * - *************************************************************************/ - -struct LIST *xNewList (Name) - -char *Name; -{ - struct LIST *List; - - xMemAlloc (sizeof(struct LIST), &List); - - List->Head = NULL; - List->Tail = NULL; - List->Size = 0; - - if (Name == NULL) - { - List->Name = NULL; - } - else - { - xMemAlloc (strlen (Name) + 1, &(List->Name)); - strcpy (List->Name, Name); - } - - return (List); -} - - - -/************************************************************************* - * * - * function : xFindName * - * * - * arguments : List - pointer to a LIST structure * - * * - * Name - pointer to a name string * - * * - * return : pointer to a NODE structure * - * * - *-----------------------------------------------------------------------* - * * - * xFindName() looks for element with name 'Name' in list 'List' and * - * returns its NODE structure. * - * * - *************************************************************************/ - -struct NODE *xFindName (List, Name) - -struct LIST *List; -char *Name; -{ - struct NODE *Node; - unsigned short HashKey; - - if (!Name || !List) return (NULL); - - HashKey = xHashKey (Name); - - for (Node = List->Head; Node; Node = Node->Succ) - if (HashKey == Node->HashKey) - if (Node->Name) - if (strcmp (Node->Name, Name) == 0) return (Node); - - return (NULL); -} diff --git a/libdtv/liblx/xMemMgt.c b/libdtv/liblx/xMemMgt.c deleted file mode 100644 index b1b07de..0000000 --- a/libdtv/liblx/xMemMgt.c +++ /dev/null @@ -1,624 +0,0 @@ -/* - * - * xMemMgt.c: memory management functions of liblx - * - * - * $Revision: 1.1 $ - * $Date: 2001/06/25 12:29:47 $ - * $Author: hakenes $ - * - * (C) 1992-2001 Rolf Hakenes <hakenes@hippomi.de>, under the GNU GPL. - * - * liblx 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, or (at your option) - * any later version. - * - * liblx 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 may have received a copy of the GNU General Public License - * along with liblx; see the file COPYING. If not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - * - */ - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <malloc.h> - -#include "liblx.h" - -#ifdef DEBUG -void logPrintf(int, char *, ...); -#endif - -static struct MEM_CHUNK *xRememberKey = NULL; - -static struct MEM_CHUNK **xRememberPtr = &xRememberKey; - -unsigned long xAllocatedMemory = 0; - -/************************************************************************* - * * - * function : xMemAlloc * - * * - * parameter : Size - size of the requested memory area * - * * - * DataPointer - pointer to data pointer * - * * - * return : none * - * * - *-----------------------------------------------------------------------* - * * - * xMemAlloc() is a clustered, remembering memory management routine. * - * It uses its own tables for free and used memory blocks on private * - * memory area. With xMemFree(), you can free this memory likewise * - * the C free() routine, with xMemFreeAll() all memory at once. * - * By changing the current remember key with xSetRemember() you can * - * define a local memory area, which can be freed by only one call of * - * xMemFreeAll() (see xSetRemember() / xGetRemember()). * - * * - *************************************************************************/ - -void xMemAllo (Size, DataPointer) - -unsigned long Size; -unsigned char **DataPointer; -{ - struct MEM_CHUNK *MemChunk, *MemChunkPred; - struct MEM_ENTRY *MemEntry, *MemEntryPred; - long int NewSize; - unsigned short FoundFlag; -#ifdef DEBUG - unsigned char *ptr; -#endif - - while (Size % 4) Size++; - - if (Size > (MEM_CHUNK_SIZE - sizeof(struct MEM_CHUNK) - - sizeof(struct MEM_ENTRY))) - { - NewSize = Size + sizeof(struct MEM_CHUNK) + sizeof(struct MEM_ENTRY); - - if (MemChunk = (*xRememberPtr)) - { - do - { - MemChunkPred = MemChunk; - } while (MemChunk = MemChunk->Succ); - } - else MemChunkPred = (struct MEM_CHUNK *) &(*xRememberPtr); - - MemChunk = MemChunkPred->Succ = (struct MEM_CHUNK *) malloc (NewSize); - xAllocatedMemory += NewSize; - -#ifdef DEBUG - for (ptr = (unsigned char *) MemChunk; ptr < (unsigned char *) - (MemChunk) + NewSize; ptr++) - *ptr = (((unsigned long)ptr)&1) ? 0x55 : 0xAA; -#endif - - if (!MemChunk) - { -#ifdef DEBUG - logPrintf (0, "Not enough memory...\r\n"); -#endif - exit (1); - } - - MemChunk->Size = NewSize; - MemChunk->Pred = MemChunkPred; - MemChunk->Succ = NULL; - MemChunk->FirstFreeMemEntry = NULL; - MemChunk->FirstUsedMemEntry = - MemEntry = (struct MEM_ENTRY *) ((unsigned char *)MemChunk + - sizeof(struct MEM_CHUNK)); - - MemEntry->Size = Size; - MemEntry->Pred = (struct MEM_ENTRY *) &MemChunk->FirstUsedMemEntry; - MemEntry->Succ = NULL; - - *DataPointer = (unsigned char *) ((unsigned char *)MemEntry + - sizeof(struct MEM_ENTRY)); -#ifdef DEBUG_CALLS - logPrintf (0, "xMemAlloc: %x, %d bytes\r\n", *DataPointer, Size); -#endif - return; - } - - MemEntry = NULL; - FoundFlag = 0; - - if (MemChunk = (*xRememberPtr)) - { - do - { - if (MemEntry = MemChunk->FirstFreeMemEntry) - do - { - if (Size <= MemEntry->Size) FoundFlag = 1; - } while ((FoundFlag == 0) && (MemEntry = MemEntry->Succ)); - MemChunkPred = MemChunk; - } while ((FoundFlag == 0) && (MemChunk = MemChunk->Succ)); - } - else MemChunkPred = (struct MEM_CHUNK *) &(*xRememberPtr); - - if (!MemEntry) - { - MemChunk = MemChunkPred->Succ = - (struct MEM_CHUNK *) malloc (MEM_CHUNK_SIZE); - xAllocatedMemory += MEM_CHUNK_SIZE; - -#ifdef DEBUG - for (ptr = (unsigned char *) MemChunk; ptr < (unsigned char *) - (MemChunk) + MEM_CHUNK_SIZE; ptr++) - *ptr = (((unsigned long)ptr)&1) ? 0x55 : 0xAA; -#endif - - if (!MemChunk) - { -#ifdef DEBUG - logPrintf (0, "Not enough memory...\r\n"); -#endif - exit (1); - } - - MemChunk->Size = MEM_CHUNK_SIZE; - MemChunk->Pred = MemChunkPred; - MemChunk->Succ = NULL; - MemChunk->FirstUsedMemEntry = NULL; - MemChunk->FirstFreeMemEntry = - MemEntry = (struct MEM_ENTRY *) - ((unsigned char *)MemChunk + sizeof(struct MEM_CHUNK)); - - MemEntry->Size = MEM_CHUNK_SIZE - sizeof(struct MEM_CHUNK) - - sizeof(struct MEM_ENTRY); - MemEntry->Pred = (struct MEM_ENTRY *) &MemChunk->FirstFreeMemEntry; - MemEntry->Succ = NULL; - } - - NewSize = MemEntry->Size - sizeof(struct MEM_ENTRY) - Size; - - MemEntry->Size = Size; - *DataPointer = (unsigned char *) - ((unsigned char *)MemEntry + sizeof(struct MEM_ENTRY)); - -#ifdef DEBUG - for (ptr = *DataPointer; ptr < (unsigned char *) - (*DataPointer) + Size; ptr++) - { - if (((unsigned long )ptr)&1) - { if (*ptr != 0x55) - logPrintf (0, "freed memory was used\r\n"); } - else { if (*ptr != 0xAA) - logPrintf (0, "freed memory was used\r\n"); } - } -#endif - - if (MemEntry->Succ) - ((struct MEM_ENTRY *)MemEntry->Succ)->Pred = MemEntry->Pred; - ((struct MEM_ENTRY *)MemEntry->Pred)->Succ = MemEntry->Succ; - - if (MemChunk->FirstUsedMemEntry) - MemChunk->FirstUsedMemEntry->Pred = MemEntry; - MemEntry->Succ = MemChunk->FirstUsedMemEntry; - MemChunk->FirstUsedMemEntry = MemEntry; - MemEntry->Pred = (struct MEM_ENTRY *) &MemChunk->FirstUsedMemEntry; - - if (NewSize > 0) - { - MemEntry = (struct MEM_ENTRY *) - ((unsigned char *)MemEntry + sizeof(struct MEM_ENTRY) + Size); - MemEntry->Size = NewSize; - - if (MemChunk->FirstFreeMemEntry) - MemChunk->FirstFreeMemEntry->Pred = MemEntry; - MemEntry->Succ = MemChunk->FirstFreeMemEntry; - MemChunk->FirstFreeMemEntry = MemEntry; - MemEntry->Pred = (struct MEM_ENTRY *) &MemChunk->FirstFreeMemEntry; - } -#ifdef DEBUG_CALLS - logPrintf (0, "xMemAlloc: %x, %d bytes\r\n", *DataPointer, Size); -#endif - return; -} - - - -/************************************************************************* - * * - * function : xMemFree * - * * - * parameter : DataPointer - data pointer * - * * - * return : none * - * * - *-----------------------------------------------------------------------* - * * - * xMemFree() frees with xMemAlloc() allocated memory. * - * * - *************************************************************************/ - -void xMemFre (DataPointer) - -unsigned char *DataPointer; -{ - struct MEM_CHUNK *MemChunk, *MemChunkPred; - struct MEM_ENTRY *MemEntry, *TempEntry, *PredEntry, *SuccEntry; - unsigned short FoundFlag; -#ifdef DEBUG - unsigned char *ptr; -#endif - - if (!DataPointer) - { - return; - } - else - { - MemEntry = NULL; - FoundFlag = 0; - - if (MemChunk = (*xRememberPtr)) - do - { - if (MemEntry = MemChunk->FirstUsedMemEntry) - do - { - if (DataPointer == (unsigned char *) ((unsigned char *) MemEntry + - sizeof(struct MEM_ENTRY))) FoundFlag = 1; - } while ((FoundFlag == 0) && (MemEntry = MemEntry->Succ)); - } while ((FoundFlag == 0) && (MemChunk = MemChunk->Succ)); - - if (FoundFlag == 1) - { -#ifdef DEBUG_CALLS - logPrintf (0, "xMemFree: %x, %d bytes\r\n", DataPointer, MemEntry->Size); -#endif - if (MemEntry->Succ) - ((struct MEM_ENTRY *)MemEntry->Succ)->Pred = MemEntry->Pred; - ((struct MEM_ENTRY *)MemEntry->Pred)->Succ = MemEntry->Succ; - - if (!MemChunk->FirstUsedMemEntry) - { - if (MemChunk->Succ) - ((struct MEM_CHUNK *)MemChunk->Succ)->Pred = MemChunk->Pred; - ((struct MEM_CHUNK *)MemChunk->Pred)->Succ = MemChunk->Succ; - if (xAllocatedMemory > 0) xAllocatedMemory -= MemChunk->Size; - free (MemChunk); - return; - } - - FoundFlag = 0; - PredEntry = NULL; - SuccEntry = NULL; - if (TempEntry = MemChunk->FirstFreeMemEntry) - do - { - if ((struct MEM_ENTRY *)((unsigned char *)TempEntry + - TempEntry->Size + sizeof(struct MEM_ENTRY)) == MemEntry) - { - FoundFlag ++; - PredEntry = TempEntry; - } - if ((struct MEM_ENTRY *)((unsigned char *)MemEntry + - MemEntry->Size + sizeof(struct MEM_ENTRY)) == TempEntry) - { - FoundFlag ++; - SuccEntry = TempEntry; - } - } while ((FoundFlag != 2) && (TempEntry = TempEntry->Succ)); - - if (PredEntry) - { - if (SuccEntry) - { - /* Vorgdnger + Nachfolger */ - - if (SuccEntry->Succ) - ((struct MEM_ENTRY *)SuccEntry->Succ)->Pred = SuccEntry->Pred; - ((struct MEM_ENTRY *)SuccEntry->Pred)->Succ = SuccEntry->Succ; - - PredEntry->Size += MemEntry->Size + sizeof(struct MEM_ENTRY) + - SuccEntry->Size + sizeof(struct MEM_ENTRY); - } - else - { - /* nur Vorgaenger */ - - PredEntry->Size += MemEntry->Size + sizeof(struct MEM_ENTRY); - } -#ifdef DEBUG - for (ptr = (unsigned char *) (PredEntry) + sizeof(struct MEM_ENTRY); - ptr < (unsigned char *) (PredEntry) + sizeof(struct MEM_ENTRY) + - PredEntry->Size; ptr++) - *ptr = (((unsigned long)ptr)&1) ? 0x55 : 0xAA; -#endif - } - else - { - if (SuccEntry) - { - /* nur Nachfolger */ - - if (SuccEntry->Succ) - ((struct MEM_ENTRY *)SuccEntry->Succ)->Pred = SuccEntry->Pred; - ((struct MEM_ENTRY *)SuccEntry->Pred)->Succ = SuccEntry->Succ; - - MemEntry->Size += SuccEntry->Size + sizeof(struct MEM_ENTRY); - } - - if (MemChunk->FirstFreeMemEntry) - MemChunk->FirstFreeMemEntry->Pred = MemEntry; - MemEntry->Succ = MemChunk->FirstFreeMemEntry; - MemChunk->FirstFreeMemEntry = MemEntry; - MemEntry->Pred = (struct MEM_ENTRY *) &MemChunk->FirstFreeMemEntry; -#ifdef DEBUG - for (ptr = (unsigned char *) (MemEntry) + sizeof(struct MEM_ENTRY); - ptr < (unsigned char *) (MemEntry) + sizeof(struct MEM_ENTRY) + - MemEntry->Size; ptr++) - *ptr = (((unsigned long)ptr)&1) ? 0x55 : 0xAA; -#endif - } - } -#ifdef DEBUG_CALLS - else - logPrintf (0, "xMemFree: tried to free unallocated data %x\r\n", DataPointer); -#endif - } - return; -} - - - -/************************************************************************* - * * - * function : xMemFreeAll * - * * - * parameter : RememberPtr * - * * - * return : none * - * * - *-----------------------------------------------------------------------* - * * - * xMemFreeAll() frees all with xMemAlloc() allocated memory. If Re- * - * memberPtr is not NULL, the MEM_CHUNK structure from the specified * - * Address is freed, otherwise the natural MEM_CHUNK will be done. * - * * - *************************************************************************/ - - -void xMemFreeAll (RememberPtr) - -struct MEM_CHUNK **RememberPtr; -{ - struct MEM_CHUNK *MemChunk, *MemChunkPred; - - if (RememberPtr) - { - if (MemChunkPred = (*RememberPtr)) - do - { - MemChunk = MemChunkPred->Succ; - if (xAllocatedMemory > 0) xAllocatedMemory -= MemChunkPred->Size; - free (MemChunkPred); - } while (MemChunkPred = MemChunk); - *RememberPtr = NULL; - } - else - { - if (MemChunkPred = (*xRememberPtr)) - do - { - MemChunk = MemChunkPred->Succ; - if (xAllocatedMemory > 0) xAllocatedMemory -= MemChunkPred->Size; - free (MemChunkPred); - } while (MemChunkPred = MemChunk); - *xRememberPtr = NULL; - } -} - - -/************************************************************************* - * * - * function : xMemMerge * - * * - * parameter : RememberPtr * - * * - * return : none * - * * - *-----------------------------------------------------------------------* - * * - * xMemMerge() merges the memory area pointed to by RememberKey with * - * the currently used in xRememberPtr. * - * * - *************************************************************************/ - -void xMemMerge (RememberPtr) - -struct MEM_CHUNK **RememberPtr; -{ - struct MEM_CHUNK *MemChunk, *MemChunkPred; - - if (RememberPtr) - { - if (MemChunk = (*xRememberPtr)) - { - while (MemChunk->Succ) MemChunk = MemChunk->Succ; - MemChunk->Succ = (*RememberPtr); - *RememberPtr = NULL; - } - else (*xRememberPtr = *RememberPtr); - } - return; -} - -/************************************************************************* - * * - * function : xGetRemember * - * * - * parameter : none * - * * - * return : pointer to a MEM_CHUNK tree * - * * - *-----------------------------------------------------------------------* - * * - * xGetRemember() returns the currently used MEM_CHUNK tree. * - * * - *************************************************************************/ - - -struct MEM_CHUNK **xGetRemember () -{ - return (xRememberPtr); -} - - -/************************************************************************* - * * - * function : xSetRemember * - * * - * parameter : pointer to a MEM_CHUNK tree * - * * - * return : none * - * * - *-----------------------------------------------------------------------* - * * - * xSetRemember() redefines the currently used MEM_CHUNK pointer. If * - * RememberPtr is NULL, the natural MEM_CHUNK is reloaded. * - * * - *************************************************************************/ - - -void xSetRemember (RememberPtr) - -struct MEM_CHUNK **RememberPtr; -{ - if (RememberPtr) - xRememberPtr = RememberPtr; - else - xRememberPtr = &xRememberKey; -} - -/************************************************************************* - * * - * function : xPrintMemList * - * * - * parameter : pointer to a MEM_CHUNK tree * - * * - * return : none * - * * - *-----------------------------------------------------------------------* - * * - * xPrintMemList() prints the currently allocated memory blocks of * - * the specified RememberPtr. * - * * - *************************************************************************/ - - -void xPrintMemList (Remember) - -struct MEM_CHUNK **Remember; -{ - struct MEM_CHUNK *MemChunk; - struct MEM_ENTRY *MemEntry; - - fprintf (stderr, "MemChunkPtr = %x\n", (int) Remember); - - if (MemChunk = *Remember) - do - { - fprintf (stderr, "\tMemChunk at %x with Size %d\n", (int) MemChunk, - (int) MemChunk->Size); - - if (MemEntry = MemChunk->FirstFreeMemEntry) - do - { - fprintf (stderr, "\t\tFree MemEntry at %x (%x) with Size %d\n", - (int) MemEntry, (int)((unsigned char *)MemEntry + - sizeof(struct MEM_ENTRY)), (int) MemEntry->Size); - - } while (MemEntry = MemEntry->Succ); - - if (MemEntry = MemChunk->FirstUsedMemEntry) - do - { - fprintf (stderr, "\t\tUsed MemEntry at %x (%x) with Size %d\n", - (int) MemEntry, (int)((unsigned char *)MemEntry + - sizeof(struct MEM_ENTRY)), (int) MemEntry->Size); - - } while (MemEntry = MemEntry->Succ); - - } while (MemChunk = MemChunk->Succ); - else fprintf (stderr, "\tNo current MemChunk\n"); -} - - -/************************************************************************* - * * - * function : xGetMemSize * - * * - * parameter : pointer to a MEM_CHUNK tree * - * * - * return : none * - * * - *-----------------------------------------------------------------------* - * * - * xGetMemSize() gets the size of the currently allocated memory * - * blocks of the specified (or natural if NULL) RememberPtr * - * * - *************************************************************************/ - - -unsigned long xGetMemSize (RememberPtr) - -struct MEM_CHUNK **RememberPtr; -{ - struct MEM_CHUNK *MemChunk; - struct MEM_ENTRY *MemEntry; - unsigned long Result = 0; - - if (RememberPtr) MemChunk = *RememberPtr; - else MemChunk = xRememberKey; - - if (MemChunk) - do { Result += (unsigned long) MemChunk->Size; } - while (MemChunk = MemChunk->Succ); - - return (Result); -} - - -/************************************************************************* - * * - * function : xSetText * - * * - * arguments : xText - pointer to a string * - * * - * return : pointer to an new allocated string * - * * - *-----------------------------------------------------------------------* - * * - * xSetText() allocates memory for the string pointed to by 'xText' * - * and duplicates it. * - * * - *************************************************************************/ - -char *xSetText (xText) - -char *xText; -{ - char *NewText; - - if (!xText) return (NULL); - - xMemAlloc (strlen(xText) + 1, &NewText); - strcpy (NewText, xText); - - return (NewText); -} diff --git a/libdtv/libsi/COPYING b/libdtv/libsi/COPYING deleted file mode 100644 index a43ea21..0000000 --- a/libdtv/libsi/COPYING +++ /dev/null @@ -1,339 +0,0 @@ - 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 - - Appendix: How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - <one line to give the program's name and a brief idea of what it does.> - Copyright (C) 19yy <name of author> - - 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. - -Also add information on how to contact you by electronic and paper mail. - -If the program is interactive, make it output a short notice like this -when it starts in an interactive mode: - - Gnomovision version 69, Copyright (C) 19yy name of author - Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, the commands you use may -be called something other than `show w' and `show c'; they could even be -mouse-clicks or menu items--whatever suits your program. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the program, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the program - `Gnomovision' (which makes passes at compilers) written by James Hacker. - - <signature of Ty Coon>, 1 April 1989 - Ty Coon, President of Vice - -This General Public License does not permit incorporating your program into -proprietary programs. If your program is a subroutine library, you may -consider it more useful to permit linking proprietary applications with the -library. If this is what you want to do, use the GNU Library General -Public License instead of this License. diff --git a/libdtv/libsi/Makefile b/libdtv/libsi/Makefile deleted file mode 100644 index 4f278a0..0000000 --- a/libdtv/libsi/Makefile +++ /dev/null @@ -1,83 +0,0 @@ -############################################################## -### ### -### Makefile: local makefile for libsi ### -### ### -############################################################## - -## $Revision: 1.4 $ -## $Date: 2001/10/07 10:24:46 $ -## $Author: hakenes $ -## -## (C) 2001 Rolf Hakenes <hakenes@hippomi.de>, under the GNU GPL. -## -## dtv_scan 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, or (at your option) -## any later version. -## -## dtv_scan 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 may have received a copy of the GNU General Public License -## along with dtv_scan; see the file COPYING. If not, write to the -## Free Software Foundation, Inc., 59 Temple Place - Suite 330, -## Boston, MA 02111-1307, USA. -# -# -# - -.DELETE_ON_ERROR: - -CC ?= gcc -CFLAGS ?= -O2 -g -Wmissing-prototypes -Wstrict-prototypes \ - -DNAPI -Wimplicit -D__USE_FIXED_PROTOTYPES__ # -ansi -pedantic - -INCDIRS = -Iinclude -I../include -DISTDIR = ../lib -DISTINCDIR = ../include -INCLUDES = include/libsi.h include/si_tables.h -MAKEDEPEND = gcc -M - -LIBDIRS = -L. -L../lib -LIBS = -lsi -llx - -AR = ar -ARFLAGS = ru -RANLIB = ranlib - -SILIB = libsi.a -OBJS = si_parser.o si_debug_services.o - -all : $(SILIB) - -clean : - @echo cleaning workspace... - @rm -f $(OBJS) $(SILIB) *~ - @rm -f Makefile.dep - -depend : Makefile.dep -Makefile.dep : - @echo "updating dependencies..." - @$(MAKEDEPEND) $(INCDIRS) $(OBJS:%.o=%.c) $(SITEST_OBJS:%.o=%.c) \ - $(SISCAN_OBJS:%.o=%.c) > Makefile.dep - -new : clean depend all - -dist: all - @echo "distributing $(SILIB) to $(DISTDIR)..." - @cp $(SILIB) $(DISTDIR) - @cp $(INCLUDES) $(DISTINCDIR) - @$(RANLIB) $(DISTDIR)/$(SILIB) - -$(SILIB) : $(OBJS) - @echo updating library... - @$(AR) $(ARFLAGS) $(SILIB) $(OBJS) - @$(RANLIB) $(SILIB) - -.c.o : - @echo compiling $<... - @$(CC) $(DEFINES) $(CFLAGS) $(INCDIRS) -c $< - --include Makefile.dep diff --git a/libdtv/libsi/README b/libdtv/libsi/README deleted file mode 100644 index 4f1be1a..0000000 --- a/libdtv/libsi/README +++ /dev/null @@ -1,2 +0,0 @@ -DVB - System Information Library -================================ diff --git a/libdtv/libsi/include/libsi.h b/libdtv/libsi/include/libsi.h deleted file mode 100644 index ad7a164..0000000 --- a/libdtv/libsi/include/libsi.h +++ /dev/null @@ -1,1248 +0,0 @@ -////////////////////////////////////////////////////////////// -/// /// -/// libsi.h: definitions for data structures of libsi /// -/// /// -////////////////////////////////////////////////////////////// - -// $Revision: 1.7 $ -// $Date: 2003/02/04 18:45:36 $ -// $Author: hakenes $ -// -// (C) 2001-03 Rolf Hakenes <hakenes@hippomi.de>, under the -// GNU GPL with contribution of Oleg Assovski, -// www.satmania.com -// -// libsi 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, or (at your option) -// any later version. -// -// libsi 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 may have received a copy of the GNU General Public License -// along with libsi; see the file COPYING. If not, write to the -// Free Software Foundation, Inc., 59 Temple Place - Suite 330, -// Boston, MA 02111-1307, USA. - -#ifndef LIBSI_H -#define LIBSI_H - -#include <time.h> -#include <sys/types.h> -#include <asm/types.h> - -#define dvb_pid_t int - - - /* Program Identifier */ - -#define PID_PAT 0x00 /* Program Association Table */ -#define PID_CAT 0x01 /* Conditional Access Table */ -#define PID_NIT 0x10 /* Network Information Table */ -#define PID_BAT 0x11 /* Bouquet Association Table */ -#define PID_SDT 0x11 /* Service Description Table */ -#define PID_EIT 0x12 /* Event Information Table */ -#define PID_RST 0x13 /* Running Status Table */ -#define PID_TDT 0x14 /* Time Date Table */ -#define PID_TOT 0x14 /* Time Offset Table */ -#define PID_ST 0x14 /* Stuffing Table */ - /* 0x15 - 0x1F */ /* Reserved for future use */ - - /* Table Identifier */ - -#define TID_PAT 0x00 /* Program Association Section */ -#define TID_CAT 0x01 /* Conditional Access Section */ -#define TID_PMT 0x02 /* Conditional Access Section */ - /* 0x03 - 0x3F */ /* Reserved for future use */ -#define TID_NIT_ACT 0x40 /* Network Information Section - - actual */ -#define TID_NIT_OTH 0x41 /* Network Information Section - - other */ -#define TID_SDT_ACT 0x42 /* Service Description Section - - actual */ -#define TID_SDT_OTH 0x46 /* Service Description Section - - other */ -#define TID_EIT_ACT 0x4E /* Event Information Section - - actual */ -#define TID_EIT_OTH 0x4F /* Event Information Section - - other */ -#define TID_EIT_ACT_SCH 0x50 /* Event Information Section - - actual, schedule */ -#define TID_EIT_OTH_SCH 0x60 /* Event Information Section - - other, schedule */ -#define TID_TDT 0x70 /* Time Date Section */ -#define TID_TOT 0x73 /* Time Offset Section */ -#define TID_CA_ECM_0 0x80 -#define TID_CA_ECM_1 0x81 -#define TID_CA_EMM 0x82 - -#define TID_BAT 0x4A /* Bouquet Association Section */ - -#define TID_EIT 0x12 /* Event Information Section */ -#define TID_RST 0x71 /* Running Status Section */ -#define TID_ST 0x72 /* Stuffing Section */ - /* 0xFF */ /* Reserved for future use */ - - /* Descriptor Identifier */ - - /* defined by ISO/IEC 13818-1 */ - -#define DESCR_VIDEO_STREAM 0x02 -#define DESCR_AUDIO_STREAM 0x03 -#define DESCR_HIERARCHY 0x04 -#define DESCR_REGISTRATION 0x05 -#define DESCR_DATA_STREAM_ALIGN 0x06 -#define DESCR_TARGET_BACKGRID 0x07 -#define DESCR_VIDEO_WINDOW 0x08 -#define DESCR_CA 0x09 -#define DESCR_ISO_639_LANGUAGE 0x0A -#define DESCR_SYSTEM_CLOCK 0x0B -#define DESCR_MULTIPLEX_BUFFER_UTIL 0x0C -#define DESCR_COPYRIGHT 0x0D -#define DESCR_MAXIMUM_BITRATE 0x0E -#define DESCR_PRIVATE_DATA_IND 0x0F -#define DESCR_SMOOTHING_BUFFER 0x10 -#define DESCR_STD 0x11 -#define DESCR_IBP 0x12 - /* 0x13 - 0x3F */ /* Reserved */ - - /* defined by ETSI */ - -#define DESCR_NW_NAME 0x40 -#define DESCR_SERVICE_LIST 0x41 -#define DESCR_STUFFING 0x42 -#define DESCR_SAT_DEL_SYS 0x43 -#define DESCR_CABLE_DEL_SYS 0x44 -#define DESCR_VBI_DATA 0x45 -#define DESCR_VBI_TELETEXT 0x46 -#define DESCR_BOUQUET_NAME 0x47 -#define DESCR_SERVICE 0x48 -#define DESCR_COUNTRY_AVAIL 0x49 -#define DESCR_LINKAGE 0x4A -#define DESCR_NVOD_REF 0x4B -#define DESCR_TIME_SHIFTED_SERVICE 0x4C -#define DESCR_SHORT_EVENT 0x4D -#define DESCR_EXTENDED_EVENT 0x4E -#define DESCR_TIME_SHIFTED_EVENT 0x4F -#define DESCR_COMPONENT 0x50 -#define DESCR_MOSAIC 0x51 -#define DESCR_STREAM_ID 0x52 -#define DESCR_CA_IDENT 0x53 -#define DESCR_CONTENT 0x54 -#define DESCR_PARENTAL_RATING 0x55 -#define DESCR_TELETEXT 0x56 -#define DESCR_TELEPHONE 0x57 -#define DESCR_LOCAL_TIME_OFF 0x58 -#define DESCR_SUBTITLING 0x59 -#define DESCR_TERR_DEL_SYS 0x5A -#define DESCR_ML_NW_NAME 0x5B -#define DESCR_ML_BQ_NAME 0x5C -#define DESCR_ML_SERVICE_NAME 0x5D -#define DESCR_ML_COMPONENT 0x5E -#define DESCR_PRIV_DATA_SPEC 0x5F -#define DESCR_SERVICE_MOVE 0x60 -#define DESCR_SHORT_SMOOTH_BUF 0x61 -#define DESCR_FREQUENCY_LIST 0x62 -#define DESCR_PARTIAL_TP_STREAM 0x63 -#define DESCR_DATA_BROADCAST 0x64 -#define DESCR_CA_SYSTEM 0x65 -#define DESCR_DATA_BROADCAST_ID 0x66 -#define DESCR_TRANSPORT_STREAM 0x67 -#define DESCR_DSNG 0x68 -#define DESCR_PDC 0x69 -#define DESCR_AC3 0x6A -#define DESCR_ANCILLARY_DATA 0x6B -#define DESCR_CELL_LIST 0x6C -#define DESCR_CELL_FREQ_LINK 0x6D -#define DESCR_ANNOUNCEMENT_SUPPORT 0x6E - - -#define MAX_SECTION_BUFFER 4096 - - -/* NetworkInfo structure (used to store NIT/BAT information) */ - -struct NetworkInfo { - struct NODE Node; - unsigned short ID; // NetworkID / BouquetID - struct LIST *Descriptors; - struct LIST *TransportStreams; -}; - -#define CreateNetworkInfo(ni, id) \ - do { \ - xCreateNode (ni, NULL); \ - (ni)->ID = id; \ - (ni)->Descriptors = xNewList(NULL); \ - (ni)->TransportStreams = NULL; \ - } while(0) - -/* TransportStream structure (NIT/BAT TS loop member) */ - -struct TransportStream { - struct NODE Node; - int TransportStreamID; - unsigned short OriginalNetworkID; - struct LIST *Descriptors; -}; - -#define CreateTransportStream(ts, tsid, onid) \ - do { \ - xCreateNode (ts, NULL); \ - (ts)->TransportStreamID = tsid; \ - (ts)->OriginalNetworkID = onid; \ - (ts)->Descriptors = xNewList(NULL); \ - } while(0) - -/* Strukturen zur Aufnahme der SDT und EIT Informationen */ - -struct Service { - struct NODE Node; - int ServiceID; - int TransportStreamID; - int OriginalNetworkID; - int SdtVersion; - unsigned short Status; - struct LIST *Descriptors; - struct LIST *Events; -}; - -#define EIT_SCHEDULE_FLAG 0x0001 -#define GetScheduleFlag(x) ((x)&EIT_SCHEDULE_FLAG) -#define SetScheduleFlag(x) ((x)|=EIT_SCHEDULE_FLAG) -#define EIT_PRESENT_FOLLOWING_FLAG 0x0002 -#define GetPresentFollowing(x) ((x)&EIT_PRESENT_FOLLOWING_FLAG) -#define SetPresentFollowing(x) ((x)|=EIT_PRESENT_FOLLOWING_FLAG) -#define RUNNING_STATUS_NOT_RUNNING 0x0000 -#define RUNNING_STATUS_AWAITING 0x0004 -#define RUNNING_STATUS_PAUSING 0x0008 -#define RUNNING_STATUS_RUNNING 0x000C -#define GetRunningStatus(x) ((x)&RUNNING_STATUS_RUNNING) -#define SetRunningStatus(x,s) ((x)|=((s)&RUNNING_STATUS_RUNNING)) -#define FREE_TO_AIR 0x0000 -#define CONDITIONAL_ACCESS 0x0010 -#define GetConditionalAccess(x) ((x)&CONDITIONAL_ACCESS) -#define SetConditionalAccess(x) ((x)|=CONDITIONAL_ACCESS) - -#define CreateService(service, svid, tsid, onid, vers, sta) \ - do \ - { \ - xCreateNode (service, NULL); \ - service->ServiceID = svid; \ - service->TransportStreamID = tsid; \ - service->OriginalNetworkID = onid; \ - service->SdtVersion = vers; \ - service->Status = sta; \ - service->Descriptors = xNewList (NULL); \ - service->Events = xNewList (NULL); \ - } while (0) - - -struct Event { - struct NODE Node; - int EventID; - int ServiceID; - int EitVersion; - int TransportStreamID; - int OriginalNetworkID; - time_t StartTime; - time_t Duration; - unsigned short Status; - struct LIST *Descriptors; -}; - -#define CreateEvent(event, evid, svid, tsid, onid, vers, sta) \ - do \ - { \ - xCreateNode (event, NULL); \ - event->EventID = evid; \ - event->ServiceID = svid; \ - event->TransportStreamID = tsid; \ - event->OriginalNetworkID = onid; \ - event->EitVersion = vers; \ - event->Status = sta; \ - event->Descriptors = xNewList (NULL); \ - } while (0) - - -/* Strukturen zur Aufnahme der PAT und PMT Informationen */ - -struct Program { - struct NODE Node; - int ProgramID; - int TransportStreamID; - int NetworkPID; - int PatVersion; - struct LIST *Pids; -}; - -#define CreateProgram(program, pgid, tsid, npid, vers) \ - do \ - { \ - xCreateNode (program, NULL); \ - program->ProgramID = pgid; \ - program->TransportStreamID = tsid; \ - program->NetworkPID = npid; \ - program->PatVersion = vers; \ - program->Pids = xNewList (NULL); \ - } while (0) - -struct Pid { - struct NODE Node; - int ProgramID; - int PcrPID; - int PmtVersion; - struct LIST *Descriptors; - struct LIST *InfoList; -}; - -#define CreatePid(pid, pgid, pcid, vers) \ - do \ - { \ - xCreateNode (pid, NULL); \ - pid->ProgramID = pgid; \ - pid->PcrPID = pcid; \ - pid->PmtVersion = vers; \ - pid->Descriptors = xNewList (NULL); \ - pid->InfoList = xNewList (NULL); \ - } while (0) - -struct PidInfo { - struct NODE Node; - int StreamType; - dvb_pid_t ElementaryPid; - struct LIST *Descriptors; -}; - -#define CreatePidInfo(pidinfo, styp, epid) \ - do \ - { \ - xCreateNode (pidinfo, NULL); \ - pidinfo->StreamType = styp; \ - pidinfo->ElementaryPid = (dvb_pid_t) epid; \ - pidinfo->Descriptors = xNewList (NULL); \ - } while (0) - - -#define STREAMTYPE_11172_VIDEO 1 -#define STREAMTYPE_13818_VIDEO 2 -#define STREAMTYPE_11172_AUDIO 3 -#define STREAMTYPE_13818_AUDIO 4 -#define STREAMTYPE_13818_PRIVATE 5 -#define STREAMTYPE_13818_PES_PRIVATE 6 -#define STREAMTYPE_13522_MHPEG 7 -#define STREAMTYPE_13818_DSMCC 8 -#define STREAMTYPE_ITU_222_1 9 -#define STREAMTYPE_13818_A 10 -#define STREAMTYPE_13818_B 11 -#define STREAMTYPE_13818_C 12 -#define STREAMTYPE_13818_D 13 -#define STREAMTYPE_13818_AUX 14 - - -struct Tot { - time_t UTC; - time_t Bias; - struct LIST *Descriptors; -}; - -#define CreateTot(tot, utc) \ - do \ - { \ - xMemAlloc(sizeof(struct Tot), &tot); \ - tot->UTC = utc; \ - tot->Bias = ((utc - time(NULL) + 1800)/3600)*3600; \ - tot->Descriptors = xNewList(NULL); \ - } while (0) - - -/* Descriptors */ - -#define DescriptorTag(x) ((struct Descriptor *)(x))->Tag - -struct Descriptor { - struct NODE Node; - unsigned short Tag; -}; - - -/* Iso639LanguageDescriptor */ - -struct Iso639LanguageDescriptor { - struct NODE Node; - unsigned short Tag; - char LanguageCode[4]; -}; - -#define CreateIso639LanguageDescriptor(descr, lc1, lc2, lc3) \ - do \ - { \ - xCreateNode (((struct Iso639LanguageDescriptor *)descr), NULL); \ - ((struct Iso639LanguageDescriptor *)descr)->Tag = DESCR_ISO_639_LANGUAGE; \ - ((struct Iso639LanguageDescriptor *)descr)->LanguageCode[0] = lc1; \ - ((struct Iso639LanguageDescriptor *)descr)->LanguageCode[1] = lc2; \ - ((struct Iso639LanguageDescriptor *)descr)->LanguageCode[2] = lc3; \ - ((struct Iso639LanguageDescriptor *)descr)->LanguageCode[3] = '\0'; \ - } while (0) - - -/* Ac3Descriptor */ - -#define AC3_TYPE_FLAG 0x0001 -#define BS_ID_FLAG 0x0002 -#define MAIN_ID_FLAG 0x0004 -#define ASVC_FLAG 0x0008 - -struct Ac3Descriptor { - struct NODE Node; - unsigned short Tag; - unsigned short PresentFlags; - unsigned short Ac3Type; - unsigned short BsId; - unsigned short MainId; - unsigned short Asvc; - unsigned short Amount; /* AdditionalData */ - unsigned char *AdditionalData; -}; - -#define CreateAc3Descriptor(descr) \ - do \ - { \ - xCreateNode (((struct Ac3Descriptor *)descr), NULL); \ - ((struct Ac3Descriptor *)descr)->Tag = DESCR_AC3; \ - } while (0) - -#define AddAc3FlagAndValue(descr, flg, val) \ - do \ - { \ - if ((flg) & AC3_TYPE_FLAG) { \ - ((struct Ac3Descriptor *)descr)->PresentFlags |= AC3_TYPE_FLAG; \ - ((struct Ac3Descriptor *)descr)->Ac3Type = (val); } \ - else if ((flg) & BS_ID_FLAG) { \ - ((struct Ac3Descriptor *)descr)->PresentFlags |= BS_ID_FLAG; \ - ((struct Ac3Descriptor *)descr)->BsId = (val); } \ - else if ((flg) & MAIN_ID_FLAG) { \ - ((struct Ac3Descriptor *)descr)->PresentFlags |= MAIN_ID_FLAG; \ - ((struct Ac3Descriptor *)descr)->MainId = (val); } \ - else if ((flg) & ASVC_FLAG) { \ - ((struct Ac3Descriptor *)descr)->PresentFlags |= ASVC_FLAG; \ - ((struct Ac3Descriptor *)descr)->Asvc = (val); } \ - } while (0) - -#define AddAc3AdditionalData(descr, ptr, len) \ - do \ - { \ - xMemAlloc ((len)+1, &(((struct Ac3Descriptor *) \ - descr)->AdditionalData)); \ - memcpy ((((struct Ac3Descriptor *)descr)->AdditionalData),(ptr),(len)); \ - } while (0) - - -/* AncillaryDataDescriptor */ - -struct AncillaryDataDescriptor { - struct NODE Node; - unsigned short Tag; - unsigned short Identifier; -}; - -#define ANCILLARY_DATA_DVD_VIDEO 0x0001 -#define ANCILLARY_DATA_EXTENDED 0x0002 -#define ANCILLARY_DATA_SWITCHING 0x0004 -#define ANCILLARY_DATA_DAB 0x0008 -#define ANCILLARY_DATA_SCALE_FACTOR 0x0010 - -#define CreateAncillaryDataDescriptor(descr, id) \ - do \ - { \ - xCreateNode (((struct AncillaryDataDescriptor *)descr), NULL); \ - ((struct AncillaryDataDescriptor *)descr)->Tag = DESCR_ANCILLARY_DATA; \ - ((struct AncillaryDataDescriptor *)descr)->Identifier = id; \ - } while (0) - - -/* BouquetNameDescriptor */ -/* - the same used instead of NetworkNameDescriptor because their structures - are identical. We pass 'tag' parameter to distinguish between them later -*/ - -struct BouquetNameDescriptor { - struct NODE Node; /* Node enthält Namen */ - unsigned short Tag; -}; - -#define CreateBouquetNameDescriptor(descr, text, tag) \ - do \ - { \ - xCreateNode (((struct BouquetNameDescriptor *)descr), NULL); \ - ((struct NODE *)descr)->Name = text; \ - ((struct NODE *)descr)->HashKey = xHashKey (text); \ - ((struct BouquetNameDescriptor *)descr)->Tag = tag; \ - } while (0) - - -/* CountryAvailabilityDescriptor */ - -struct CountryAvailabilityDescriptor { - struct NODE Node; - unsigned short Tag; - unsigned short AvailibilityFlag; - unsigned short Amount; /* CountryCodes */ - char *CountryCodes; -}; - -#define COUNTRIES_ARE_AVAILABLE 0x0001 -#define COUNTRIES_ARE_UNAVAILABLE 0x0000 - -#define CreateCountryAvailabilityDescriptor(descr, ava) \ - do \ - { \ - xCreateNode (((struct CountryAvailabilityDescriptor *)descr), NULL); \ - ((struct CountryAvailabilityDescriptor *)descr)->Tag = DESCR_COUNTRY_AVAIL; \ - ((struct CountryAvailabilityDescriptor *)descr)->AvailibilityFlag = ava; \ - ((struct CountryAvailabilityDescriptor *)descr)->Amount = 0; \ - ((struct CountryAvailabilityDescriptor *)descr)->CountryCodes = NULL; \ - } while (0) - -#define AddCountryAvailabilityCode(descr, lc1, lc2, lc3) \ - do \ - { \ - char tmpbuf[4], *tmpptr, *ttptr; \ - \ - tmpbuf[0] = lc1; tmpbuf[1] = lc2; \ - tmpbuf[2] = lc3; tmpbuf[3] = '\0'; \ - xMemAlloc (((struct CountryAvailabilityDescriptor *)descr)->Amount*4 + 8, &tmpptr); \ - ttptr = tmpptr; \ - if (((struct CountryAvailabilityDescriptor *)descr)->CountryCodes) { \ - memcpy (ttptr, ((struct CountryAvailabilityDescriptor *)descr)->CountryCodes, \ - ((struct CountryAvailabilityDescriptor *)descr)->Amount*4); \ - ttptr += ((struct CountryAvailabilityDescriptor *)descr)->Amount*4; \ - } \ - memcpy (ttptr, tmpbuf, 4); \ - ((struct CountryAvailabilityDescriptor *)descr)->CountryCodes = tmpptr; \ - } while (0) - - -/* CaIdentifierDescriptor */ - -struct CaIdentifierDescriptor { - struct NODE Node; - unsigned short Tag; - unsigned short Amount; /* SystemIDs */ - unsigned short *SystemID; -}; - -#define CreateCaIdentifierDescriptor(descr, amo) \ - do \ - { \ - xCreateNode (((struct CaIdentifierDescriptor *)descr), NULL); \ - ((struct CaIdentifierDescriptor *)descr)->Tag = DESCR_CA_IDENT; \ - ((struct CaIdentifierDescriptor *)descr)->Amount = amo; \ - xMemAlloc (amo*2+2, &((struct CaIdentifierDescriptor *)descr)->SystemID); \ - } while (0) - -#define SetCaIdentifierID(descr, num, id) \ - ((struct CaIdentifierDescriptor *)descr)->SystemID[num] = id -#define GetCaIdentifierID(descr, num) (((struct CaIdentifierDescriptor *)descr)->SystemID[num]) - -/* CaDescriptor */ - -struct CaDescriptor { - struct NODE Node; - unsigned short Tag; - unsigned short CA_type; - unsigned short CA_PID; - unsigned int ProviderID; - unsigned short DataLength; - unsigned char *Data; -}; - -#define CreateCaDescriptor(descr, typ, capid, len) \ - do \ - { \ - xCreateNode (((struct CaDescriptor *)descr), NULL); \ - ((struct CaDescriptor *)descr)->Tag = DESCR_CA; \ - ((struct CaDescriptor *)descr)->CA_type = typ; \ - ((struct CaDescriptor *)descr)->CA_PID = capid; \ - ((struct CaDescriptor *)descr)->ProviderID = 0; \ - ((struct CaDescriptor *)descr)->DataLength = len; \ - xMemAlloc (len+1, &((struct CaDescriptor *)descr)->Data); \ - } while (0) - -#define SetCaData(descr, num, id) \ - ((struct CaDescriptor *)descr)->Data[num] = id -#define GetCaData(descr, num) (((struct CaDescriptor *)descr)->Data[num]) - -/* StreamIdentifierDescriptor */ - -struct StreamIdentifierDescriptor { - struct NODE Node; - unsigned short Tag; - unsigned short ComponentTag; -}; - -#define CreateStreamIdentifierDescriptor(descr, ctag) \ - do \ - { \ - xCreateNode (((struct StreamIdentifierDescriptor *)descr), NULL); \ - ((struct StreamIdentifierDescriptor *)descr)->Tag = DESCR_STREAM_ID; \ - ((struct StreamIdentifierDescriptor *)descr)->ComponentTag = (ctag); \ - } while (0) - - -/* DataBroadcastDescriptor */ - -struct DataBroadcastDescriptor { - struct NODE Node; /* Node enthält DescriptorText */ - unsigned short Tag; - unsigned short DataBroadcastID; - unsigned short ComponentTag; - unsigned short SelectorLength; - unsigned char *SelectorBytes; - char LanguageCode[4]; -}; - -struct MosaicDescriptor { - struct NODE Node; - unsigned short Tag; - /* to be defined */ -}; - -struct MultiLingualServiceDescriptor { - struct NODE Node; - unsigned short Tag; - /* to be defined */ -}; - - -/* NvodReferenceDescriptor */ - -struct NvodReferenceDescriptor { - struct NODE Node; - unsigned short Tag; - struct LIST *Items; -}; - -#define CreateNvodReferenceDescriptor(descr) \ - do \ - { \ - xCreateNode (((struct NvodReferenceDescriptor *)descr), NULL); \ - ((struct NvodReferenceDescriptor *)descr)->Tag = DESCR_NVOD_REF; \ - ((struct NvodReferenceDescriptor *)descr)->Items = xNewList (NULL); \ - } while (0) - -struct NvodReferenceItem { - struct NODE Node; - int TransportStreamID; - int OriginalNetworkID; - int ServiceID; -}; - -#define CreateNvodReferenceItem(itm, tpid, onid, svid) \ - do \ - { \ - xCreateNode (itm, NULL); \ - itm->TransportStreamID = tpid; \ - itm->OriginalNetworkID = onid; \ - itm->ServiceID = svid; \ - } while (0) - -#define AddNvodReferenceItem(desc, tpid, onid, svid) \ - do \ - { \ - struct NvodReferenceItem *item; \ - \ - CreateNvodReferenceItem(item, tpid, onid, svid); \ - xAddTail (((struct NvodReferenceDescriptor *)desc)->Items, item); \ - } while (0) - - -/* LinkageDescriptor */ - -struct LinkageDescriptor { - struct NODE Node; - unsigned short Tag; - int TransportStreamID; - int OriginalNetworkID; - int ServiceID; - int LinkageType; - int PrivateDataLength; - unsigned char *PrivateData; -}; - -#define CreateLinkageDescriptor(descr, tpid, onid, svid, ltyp, pdl, pdp) \ - do \ - { \ - xCreateNode (((struct LinkageDescriptor *)descr), NULL); \ - ((struct LinkageDescriptor *)descr)->Tag = DESCR_LINKAGE; \ - ((struct LinkageDescriptor *)descr)->TransportStreamID = tpid; \ - ((struct LinkageDescriptor *)descr)->OriginalNetworkID = onid; \ - ((struct LinkageDescriptor *)descr)->ServiceID = svid; \ - ((struct LinkageDescriptor *)descr)->LinkageType = ltyp; \ - ((struct LinkageDescriptor *)descr)->PrivateDataLength = pdl; \ - xMemAlloc ((pdl)+1, &(((struct LinkageDescriptor *) \ - descr)->PrivateData)); \ - memcpy ((((struct LinkageDescriptor *)descr)->PrivateData),(pdp),(pdl));\ - } while (0) - - -/* ServiceDescriptor */ - -struct ServiceDescriptor { - struct NODE Node; /* Node enthält ServiceName */ - unsigned short Tag; - unsigned short ServiceType; - char *ServiceProvider; -}; - -#define CreateServiceDescriptor(descr, styp, prov, name) \ - do \ - { \ - xCreateNode (((struct ServiceDescriptor *)descr), NULL); \ - ((struct NODE *)descr)->Name = name; \ - ((struct NODE *)descr)->HashKey = xHashKey (name); \ - ((struct ServiceDescriptor *)descr)->Tag = DESCR_SERVICE; \ - ((struct ServiceDescriptor *)descr)->ServiceType = styp; \ - ((struct ServiceDescriptor *)descr)->ServiceProvider = prov; \ - } while (0) - - - -struct TelephoneDescriptor { - struct NODE Node; - unsigned short Tag; - /* to be defined */ -}; - - -/* TimeShiftedServiceDescriptor */ - -struct TimeShiftedServiceDescriptor { - struct NODE Node; - unsigned short Tag; - int ReferenceServiceID; -}; - -#define CreateTimeShiftedServiceDescriptor(descr, svid) \ - do \ - { \ - xCreateNode (((struct TimeShiftedServiceDescriptor *)descr), NULL); \ - ((struct TimeShiftedServiceDescriptor *)descr)->Tag = DESCR_TIME_SHIFTED_SERVICE; \ - ((struct TimeShiftedServiceDescriptor *)descr)->ReferenceServiceID = svid; \ - } while (0) - - -/* TimeShiftedEventDescriptor */ - -struct TimeShiftedEventDescriptor { - struct NODE Node; - unsigned short Tag; - int ReferenceServiceID; - int ReferenceEventID; -}; - -#define CreateTimeShiftedEventDescriptor(descr, svid, evid) \ - do \ - { \ - xCreateNode (((struct TimeShiftedEventDescriptor *)descr), NULL); \ - ((struct TimeShiftedEventDescriptor *)descr)->Tag = DESCR_TIME_SHIFTED_EVENT; \ - ((struct TimeShiftedEventDescriptor *)descr)->ReferenceServiceID = svid; \ - ((struct TimeShiftedEventDescriptor *)descr)->ReferenceEventID = evid; \ - } while (0) - - -/* ComponentDescriptor */ - -struct ComponentDescriptor { - struct NODE Node; /* Node enthält ComponentText */ - unsigned short Tag; - unsigned short StreamContent; - unsigned short ComponentType; - unsigned short ComponentTag; - char LanguageCode[4]; -}; - -#define CreateComponentDescriptor(descr, scnt, ctyp, tag, lc1, lc2, lc3, txt) \ - do \ - { \ - xCreateNode (((struct ComponentDescriptor *)descr), NULL); \ - ((struct NODE *)descr)->Name = txt; \ - ((struct NODE *)descr)->HashKey = xHashKey (txt); \ - ((struct ComponentDescriptor *)descr)->Tag = DESCR_COMPONENT; \ - ((struct ComponentDescriptor *)descr)->StreamContent = scnt; \ - ((struct ComponentDescriptor *)descr)->ComponentType = ctyp; \ - ((struct ComponentDescriptor *)descr)->ComponentTag = tag; \ - ((struct ComponentDescriptor *)descr)->LanguageCode[0] = lc1; \ - ((struct ComponentDescriptor *)descr)->LanguageCode[1] = lc2; \ - ((struct ComponentDescriptor *)descr)->LanguageCode[2] = lc3; \ - ((struct ComponentDescriptor *)descr)->LanguageCode[3] = '\0'; \ - } while (0) - - -/* ContentDescriptor */ - -struct ContentDescriptor { - struct NODE Node; - unsigned short Tag; - unsigned short Amount; /* ContentIDs */ - unsigned short *ContentID; -}; - -#define CreateContentDescriptor(descr, amo) \ - do \ - { \ - xCreateNode (((struct ContentDescriptor *)descr), NULL); \ - ((struct ContentDescriptor *)descr)->Tag = DESCR_CONTENT; \ - ((struct ContentDescriptor *)descr)->Amount = amo; \ - xMemAlloc (amo*2+2, &((struct ContentDescriptor *)descr)->ContentID); \ - } while (0) - -#define SetContentID(descr, num, cnib1, cnib2, unib1, unib2) \ - do \ - { \ - ((struct ContentDescriptor *)descr)->ContentID[num] = \ - ((cnib1&0xF) << 12) | ((cnib2&0xF) << 8) | \ - ((unib1&0xF) << 4) | (unib2&0xF); \ - } while (0) -#define GetContentContentNibble1(descr, num) ((((struct ContentDescriptor *)descr)->ContentID[num]&0xF000) >> 12) -#define GetContentContentNibble2(descr, num) ((((struct ContentDescriptor *)descr)->ContentID[num]&0x0F00) >> 8) -#define GetContentUserNibble1(descr, num) ((((struct ContentDescriptor *)descr)->ContentID[num]&0x00F0) >> 4) -#define GetContentUserNibble2(descr, num) (((struct ContentDescriptor *)descr)->ContentID[num]&0x000F) - - -/* ExtendedEventDescriptor */ - -struct ExtendedEventDescriptor { - struct NODE Node; /* Node enthält EventText */ - unsigned short Tag; - unsigned short DescriptorNumber; - unsigned short LastDescriptorNumber; - char LanguageCode[4]; - struct LIST *Items; -}; - -#define CreateExtendedEventDescriptor(descr, dnum, ldnb, lc1, lc2, lc3, text) \ - do \ - { \ - xCreateNode (((struct ExtendedEventDescriptor *)descr), NULL); \ - ((struct NODE *)descr)->Name = text; \ - ((struct NODE *)descr)->HashKey = xHashKey (text); \ - ((struct ExtendedEventDescriptor *)descr)->Tag = DESCR_EXTENDED_EVENT; \ - ((struct ExtendedEventDescriptor *)descr)->DescriptorNumber = dnum; \ - ((struct ExtendedEventDescriptor *)descr)->LastDescriptorNumber = ldnb; \ - ((struct ExtendedEventDescriptor *)descr)->LanguageCode[0] = lc1; \ - ((struct ExtendedEventDescriptor *)descr)->LanguageCode[1] = lc2; \ - ((struct ExtendedEventDescriptor *)descr)->LanguageCode[2] = lc3; \ - ((struct ExtendedEventDescriptor *)descr)->LanguageCode[3] = '\0'; \ - ((struct ExtendedEventDescriptor *)descr)->Items = xNewList (NULL); \ - } while (0) - -struct ExtendedEventItem { - struct NODE Node; /* Node enthält ItemDescription Text */ - char *Text; -}; - -#define CreateExtendedEventItem(itm, dtxt, text) \ - do \ - { \ - xCreateNode (itm, NULL); \ - ((struct NODE *)itm)->Name = dtxt; \ - ((struct NODE *)itm)->HashKey = xHashKey (dtxt); \ - itm->Text = text; \ - } while (0) - -#define AddExtendedEventItem(desc, dtxt, text) \ - do \ - { \ - struct ExtendedEventItem *item; \ - \ - CreateExtendedEventItem(item, dtxt, text); \ - xAddTail (((struct ExtendedEventDescriptor *)desc)->Items, item); \ - } while (0) - - -/* ParentalRatingDescriptor */ - -struct ParentalRatingDescriptor { - struct NODE Node; - unsigned short Tag; - struct LIST *Ratings; -}; - -#define CreateParentalRatingDescriptor(descr) \ - do \ - { \ - xCreateNode (((struct ParentalRatingDescriptor *)descr), NULL); \ - ((struct ParentalRatingDescriptor *)descr)->Tag = DESCR_PARENTAL_RATING; \ - ((struct ParentalRatingDescriptor *)descr)->Ratings = xNewList (NULL); \ - } while (0) - -struct ParentalRating { - struct NODE Node; /* Node enthält ItemDescription Text */ - char LanguageCode[4]; - char Rating; -}; - -#define CreateParentalRating(rat, lc1, lc2, lc3, val) \ - do \ - { \ - xCreateNode (rat, NULL); \ - rat->LanguageCode[0] = lc1; \ - rat->LanguageCode[1] = lc2; \ - rat->LanguageCode[2] = lc3; \ - rat->LanguageCode[3] = '\0'; \ - rat->Rating = val; \ - } while (0) - -#define AddParentalRating(desc, lc1, lc2, lc3, val) \ - do \ - { \ - struct ParentalRating *item; \ - \ - CreateParentalRating(item, lc1, lc2, lc3, val); \ - xAddTail (((struct ParentalRatingDescriptor *)desc)->Ratings, item); \ - } while (0) - -/* ShortEventDescriptor */ - -struct ShortEventDescriptor { - struct NODE Node; /* Node enthält EventName */ - unsigned short Tag; - char LanguageCode[4]; - char *Text; -}; - -#define CreateShortEventDescriptor(descr, name, lc1, lc2, lc3, text) \ - do \ - { \ - xCreateNode (((struct ShortEventDescriptor *)descr), NULL); \ - ((struct NODE *)descr)->Name = name; \ - ((struct NODE *)descr)->HashKey = xHashKey (name); \ - ((struct ShortEventDescriptor *)descr)->Tag = DESCR_SHORT_EVENT; \ - ((struct ShortEventDescriptor *)descr)->LanguageCode[0] = lc1; \ - ((struct ShortEventDescriptor *)descr)->LanguageCode[1] = lc2; \ - ((struct ShortEventDescriptor *)descr)->LanguageCode[2] = lc3; \ - ((struct ShortEventDescriptor *)descr)->LanguageCode[3] = '\0'; \ - ((struct ShortEventDescriptor *)descr)->Text = text; \ - } while (0) - - -/* TeletextDescriptor */ - -struct TeletextDescriptor { - struct NODE Node; - unsigned short Tag; - struct LIST *Items; -}; - -#define CreateTeletextDescriptor(descr) \ - do \ - { \ - xCreateNode (((struct TeletextDescriptor *)descr), NULL); \ - ((struct TeletextDescriptor *)descr)->Tag = DESCR_TELETEXT; \ - ((struct TeletextDescriptor *)descr)->Items = xNewList (NULL); \ - } while (0) - -#define TELETEXT_TYPE_INITIAL_PAGE 0x0001 -#define TELETEXT_TYPE_SUBTITLE_PAGE 0x0002 -#define TELETEXT_TYPE_ADDITIONAL_INFO 0x0003 -#define TELETEXT_TYPE_PROGRAM_SCHEDULE 0x0004 -#define TELETEXT_TYPE_HEARING_IMPAIRED 0x0005 - -struct TeletextItem { - struct NODE Node; - char LanguageCode[4]; - unsigned short Type; - unsigned short MagazineNumber; - unsigned short PageNumber; -}; - -#define CreateTeletextItem(itm, tp, mg, pg, lc1, lc2, lc3) \ - do \ - { \ - xCreateNode (itm, NULL); \ - ((struct TeletextItem *)itm)->Type = (tp); \ - ((struct TeletextItem *)itm)->MagazineNumber = (mg); \ - ((struct TeletextItem *)itm)->PageNumber = (mg); \ - ((struct TeletextItem *)itm)->LanguageCode[0] = (lc1); \ - ((struct TeletextItem *)itm)->LanguageCode[1] = (lc2); \ - ((struct TeletextItem *)itm)->LanguageCode[2] = (lc3); \ - ((struct TeletextItem *)itm)->LanguageCode[3] = '\0'; \ - } while (0) - -#define AddTeletextItem(desc, tp, mg, pg, lc1, lc2, lc3) \ - do \ - { \ - struct TeletextItem *item; \ - \ - CreateTeletextItem(item, tp, mg, pg, lc1, lc2, lc3); \ - xAddTail (((struct TeletextDescriptor *)desc)->Items, item); \ - } while (0) - - -/* SubtitlingDescriptor */ - -struct SubtitlingDescriptor { - struct NODE Node; - unsigned short Tag; - struct LIST *Items; -}; - -#define CreateSubtitlingDescriptor(descr) \ - do \ - { \ - xCreateNode (((struct SubtitlingDescriptor *)descr), NULL); \ - ((struct SubtitlingDescriptor *)descr)->Tag = DESCR_SUBTITLING; \ - ((struct SubtitlingDescriptor *)descr)->Items = xNewList (NULL); \ - } while (0) - -struct SubtitlingItem { - struct NODE Node; - char LanguageCode[4]; - unsigned char Type; - unsigned short CompositionPageId; - unsigned short AncillaryPageId; -}; - -#define CreateSubtitlingItem(itm, tp, cp, ap, lc1, lc2, lc3) \ - do \ - { \ - xCreateNode (itm, NULL); \ - ((struct SubtitlingItem *)itm)->Type = (tp); \ - ((struct SubtitlingItem *)itm)->CompositionPageId = (cp); \ - ((struct SubtitlingItem *)itm)->AncillaryPageId = (ap); \ - ((struct SubtitlingItem *)itm)->LanguageCode[0] = (lc1); \ - ((struct SubtitlingItem *)itm)->LanguageCode[1] = (lc2); \ - ((struct SubtitlingItem *)itm)->LanguageCode[2] = (lc3); \ - ((struct SubtitlingItem *)itm)->LanguageCode[3] = '\0'; \ - } while (0) - -#define AddSubtitlingItem(desc, tp, cp, ap, lc1, lc2, lc3) \ - do \ - { \ - struct SubtitlingItem *item; \ - \ - CreateSubtitlingItem(item, tp, cp, ap, lc1, lc2, lc3); \ - xAddTail (((struct SubtitlingDescriptor *)desc)->Items, item); \ - } while (0) - -/* SatelliteDeliverySystemDescriptor */ - -struct SatelliteDeliverySystemDescriptor { - struct NODE Node; - unsigned short Tag; - long Frequency; - short OrbitalPosition; - short Modulation; - char Polarization; - long SymbolRate; - char FEC; -}; - -#define CreateSatelliteDeliverySystemDescriptor(descr, freq, orb, mod, polar, sr, fec) \ - do \ - { \ - xCreateNode (((struct SatelliteDeliverySystemDescriptor *)descr), NULL); \ - ((struct SatelliteDeliverySystemDescriptor *)descr)->Tag = DESCR_SAT_DEL_SYS; \ - ((struct SatelliteDeliverySystemDescriptor *)descr)->Frequency = freq; \ - ((struct SatelliteDeliverySystemDescriptor *)descr)->OrbitalPosition = orb; \ - ((struct SatelliteDeliverySystemDescriptor *)descr)->Modulation = mod; \ - ((struct SatelliteDeliverySystemDescriptor *)descr)->Polarization = polar; \ - ((struct SatelliteDeliverySystemDescriptor *)descr)->SymbolRate = sr; \ - ((struct SatelliteDeliverySystemDescriptor *)descr)->FEC = fec; \ - } while (0) - -/* CableDeliverySystemDescriptor */ - -struct CableDeliverySystemDescriptor { - struct NODE Node; - unsigned short Tag; - long Frequency; - long SymbolRate; - char FECouter; - char FECinner; - char Modulation; -}; - -#define CreateCableDeliverySystemDescriptor(descr, freq, sr, fec_o, fec_i, mod) \ - do \ - { \ - xCreateNode (((struct CableDeliverySystemDescriptor *)descr), NULL); \ - ((struct CableDeliverySystemDescriptor *)descr)->Tag = DESCR_CABLE_DEL_SYS; \ - ((struct CableDeliverySystemDescriptor *)descr)->Frequency = freq; \ - ((struct CableDeliverySystemDescriptor *)descr)->SymbolRate = sr; \ - ((struct CableDeliverySystemDescriptor *)descr)->FECouter = fec_o; \ - ((struct CableDeliverySystemDescriptor *)descr)->FECinner = fec_i; \ - ((struct CableDeliverySystemDescriptor *)descr)->Modulation = mod; \ - } while (0) - -/* TerrestrialDeliverySystemDescriptor */ - -struct TerrestrialDeliverySystemDescriptor { - struct NODE Node; - unsigned short Tag; - long Frequency; - char Bandwidth; - char Constellation; - char Hierarchy; - char CodeRateHP; - char CodeRateLP; - char GuardInterval; - char TransmissionMode; - char OtherFrequencyFlag; -}; - -#define CreateTerrestrialDeliverySystemDescriptor(descr, freq, bw, cst, hr, crh, crl, gi, tm, ofm) \ - do \ - { \ - xCreateNode (((struct CableDeliverySystemDescriptor *)descr), NULL); \ - ((struct TerrestrialDeliverySystemDescriptor *)descr)->Tag = DESCR_TERR_DEL_SYS; \ - ((struct TerrestrialDeliverySystemDescriptor *)descr)->Frequency = freq; \ - ((struct TerrestrialDeliverySystemDescriptor *)descr)->Bandwidth = bw; \ - ((struct TerrestrialDeliverySystemDescriptor *)descr)->Constellation = cst; \ - ((struct TerrestrialDeliverySystemDescriptor *)descr)->Hierarchy = hr; \ - ((struct TerrestrialDeliverySystemDescriptor *)descr)->CodeRateHP = crh; \ - ((struct TerrestrialDeliverySystemDescriptor *)descr)->CodeRateLP = crl; \ - ((struct TerrestrialDeliverySystemDescriptor *)descr)->GuardInterval = gi; \ - ((struct TerrestrialDeliverySystemDescriptor *)descr)->TransmissionMode = tm; \ - ((struct TerrestrialDeliverySystemDescriptor *)descr)->OtherFrequencyFlag = ofm; \ - } while (0) - -/* ServiceListDescriptor */ - -struct ServiceListDescriptor { - struct NODE Node; - unsigned short Tag; - struct LIST *ServiceList; -}; - -#define CreateServiceListDescriptor(descr) \ - do \ - { \ - xCreateNode (((struct ServiceListDescriptor *)descr), NULL); \ - ((struct ServiceListDescriptor *)descr)->Tag = DESCR_SERVICE_LIST; \ - ((struct ServiceListDescriptor *)descr)->ServiceList = xNewList(NULL); \ - } while (0) - -struct ServiceListEntry { - struct NODE Node; - int ServiceID; - unsigned short ServiceType; -}; - -#define AddServiceListEntry(descr, id, typ) \ - do \ - { \ - struct ServiceListEntry *newent; \ - \ - xCreateNode (newent, NULL); \ - newent->ServiceID = id; \ - newent->ServiceType = typ; \ - xAddTail (((struct ServiceListDescriptor *)descr)->ServiceList, newent); \ - } while (0) - -/* LocalTimeOffsetDescriptor */ - -struct LocalTimeOffsetDescriptor { - struct NODE Node; - unsigned short Tag; - struct LIST *LocalTimeOffsets; -}; - -#define CreateLocalTimeOffsetDescriptor(descr) \ - do \ - { \ - xCreateNode (((struct LocalTimeOffsetDescriptor *)descr), NULL); \ - ((struct LocalTimeOffsetDescriptor *)descr)->Tag = DESCR_LOCAL_TIME_OFF; \ - ((struct LocalTimeOffsetDescriptor *)descr)->LocalTimeOffsets = xNewList(NULL); \ - } while (0) - -struct LocalTimeOffsetEntry { - struct NODE Node; - char CountryCode[4]; - char RegionID; - time_t CurrentOffset; - time_t ChangeTime; - time_t NextOffset; -}; - -#define CreateLocalTimeOffsetEntry(newent, code1, code2, code3, reg, co, ct, no) \ - do \ - { \ - xCreateNode (newent, NULL); \ - newent->CountryCode[0] = code1; \ - newent->CountryCode[1] = code2; \ - newent->CountryCode[2] = code3; \ - newent->CountryCode[3] = '\0'; \ - newent->RegionID = reg; \ - newent->CurrentOffset = co; \ - newent->ChangeTime = ct; \ - newent->NextOffset = no; \ - } while (0) - -#define AddLocalTimeOffsetEntry(descr, code1, code2, code3, reg, co, ct, no) \ - do \ - { \ - struct LocalTimeOffsetEntry *newent; \ - \ - xCreateNode (newent, NULL); \ - newent->CountryCode[0] = code1; \ - newent->CountryCode[1] = code2; \ - newent->CountryCode[2] = code3; \ - newent->CountryCode[3] = '\0'; \ - newent->RegionID = reg; \ - newent->CurrentOffset = co; \ - newent->ChangeTime = ct; \ - newent->NextOffset = no; \ - xAddTail (((struct LocalTimeOffsetDescriptor *)descr)->LocalTimeOffsets, newent); \ - } while (0) - -#define timezonecmp(ptoe,cod,reg) \ - (strncmp(ptoe->CountryCode, cod, 3) || (ptoe->RegionID != reg)) - - - -/* Prototypes */ - -#ifdef __cplusplus -extern "C" { -#endif - -/* si_parser.c */ - -struct LIST *siParsePAT (u_char *); -struct LIST *siParseCAT (u_char *); -struct Pid *siParsePMT (u_char *); -struct LIST *siParseSDT (u_char *); -struct LIST *siParseNIT (u_char *); -struct LIST *siParseEIT (u_char *); -time_t siParseTDT (u_char *); -struct Tot *siParseTOT (u_char *); -void siParseDescriptors (struct LIST *, u_char *, int, u_char); -void siParseDescriptor (struct LIST *, u_char *); -char *siGetDescriptorText (u_char *, int); -char *siGetDescriptorName (u_char *, int); - -/* si_debug_services.c */ - -void siDebugServices (struct LIST *); -void siDebugService (struct Service *); -void siDebugEvents (char *, struct LIST *); -void siDebugPrograms (char *, struct LIST *); -void siDebugProgram (struct Program *); -void siDebugPids (char *, struct LIST *); -void siDebugDescriptors (char *, struct LIST *); -void siDebugEitServices (struct LIST *); -void siDebugEitEvents (char *, struct LIST *); -void siDumpDescriptor (void *); -void siDumpSection (void *); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/libdtv/libsi/si_debug_services.c b/libdtv/libsi/si_debug_services.c deleted file mode 100644 index 1ff7400..0000000 --- a/libdtv/libsi/si_debug_services.c +++ /dev/null @@ -1,674 +0,0 @@ -////////////////////////////////////////////////////////////// -/// /// -/// si_debug_services.c: debugging functions for libsi /// -/// /// -////////////////////////////////////////////////////////////// - -// $Revision: 1.5 $ -// $Date: 2003/02/04 18:45:35 $ -// $Author: hakenes $ -// -// (C) 2001-03 Rolf Hakenes <hakenes@hippomi.de>, under the -// GNU GPL with contribution of Oleg Assovski, -// www.satmania.com -// -// libsi 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, or (at your option) -// any later version. -// -// libsi 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 may have received a copy of the GNU General Public License -// along with libsi; see the file COPYING. If not, write to the -// Free Software Foundation, Inc., 59 Temple Place - Suite 330, -// Boston, MA 02111-1307, USA. - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <time.h> - -#include "../liblx/liblx.h" -#include "libsi.h" -#include "si_tables.h" -#include "si_debug_services.h" - - -void siDebugServices (struct LIST *Services) -{ - struct Service *Service; - - if (!Services) return; - - xForeach (Services, Service) - { - printf ("Service\n=======\n"); - printf (" ServiceID: %d\n", Service->ServiceID); - printf (" TransportStreamID: %d\n", Service->TransportStreamID); - printf (" OriginalNetworkID: %d\n", Service->OriginalNetworkID); - printf (" SdtVersion: %d\n", Service->SdtVersion); - printf (" Status: "); - if (GetScheduleFlag (Service->Status)) - printf ("SCHEDULE_INFO "); - if (GetPresentFollowing(Service->Status)) - printf ("PRESENT_FOLLOWING "); - switch (GetRunningStatus (Service->Status)) - { - case RUNNING_STATUS_NOT_RUNNING: - printf ("RUNNING_STATUS_NOT_RUNNING\n"); - break; - - case RUNNING_STATUS_AWAITING: - printf ("RUNNING_STATUS_AWAITING\n"); - break; - - case RUNNING_STATUS_PAUSING: - printf ("RUNNING_STATUS_PAUSING\n"); - break; - - case RUNNING_STATUS_RUNNING: - printf ("RUNNING_STATUS_RUNNING\n"); - break; - } - siDebugDescriptors (" ", Service->Descriptors); - siDebugEvents (" ", Service->Events); - } - return; -} - -void siDebugService (struct Service *Service) -{ - if (!Service) return; - - printf ("Service\r\n=======\r\n"); - printf (" ServiceID: %d\r\n", Service->ServiceID); - printf (" TransportStreamID: %d\r\n", Service->TransportStreamID); - printf (" OriginalNetworkID: %d\r\n", Service->OriginalNetworkID); - printf (" SdtVersion: %d\r\n", Service->SdtVersion); - printf (" Status: "); - if (GetScheduleFlag (Service->Status)) - printf ("SCHEDULE_INFO "); - if (GetPresentFollowing(Service->Status)) - printf ("PRESENT_FOLLOWING "); - switch (GetRunningStatus (Service->Status)) - { - case RUNNING_STATUS_NOT_RUNNING: - printf ("RUNNING_STATUS_NOT_RUNNING\r\n"); - break; - - case RUNNING_STATUS_AWAITING: - printf ("RUNNING_STATUS_AWAITING\r\n"); - break; - - case RUNNING_STATUS_PAUSING: - printf ("RUNNING_STATUS_PAUSING\r\n"); - break; - - case RUNNING_STATUS_RUNNING: - printf ("RUNNING_STATUS_RUNNING\r\n"); - break; - } - siDebugDescriptors ("\r ", Service->Descriptors); - siDebugEvents ("\r ", Service->Events); - - return; -} - -void siDebugEvents (char *Prepend, struct LIST *EventList) -{ - struct Event *Event; - char NewPrepend[32]; - - if (!EventList) return; - - xForeach (EventList, Event) - { - printf ("%sEvent\n%s=====\n", Prepend, Prepend); - printf ("%s EventID: %d\n", Prepend, Event->EventID); - printf ("%s ServiceID: %d\n", Prepend, Event->ServiceID); - printf ("%s TransportStreamID: %d\n", Prepend, Event->TransportStreamID); - printf ("%s OriginalNetworkID: %d\n", Prepend, Event->OriginalNetworkID); - printf ("%s EitVersion: %d\n", Prepend, Event->EitVersion); - printf ("%s StartTime: %s", Prepend, ctime (&Event->StartTime)); - printf ("%s Duration: %d Minuten\n", Prepend, Event->Duration/60); - printf ("%s Status: "); - switch (GetRunningStatus (Event->Status)) - { - case RUNNING_STATUS_NOT_RUNNING: - printf ("RUNNING_STATUS_NOT_RUNNING\n"); - break; - - case RUNNING_STATUS_AWAITING: - printf ("RUNNING_STATUS_AWAITING\n"); - break; - - case RUNNING_STATUS_PAUSING: - printf ("RUNNING_STATUS_PAUSING\n"); - break; - - case RUNNING_STATUS_RUNNING: - printf ("RUNNING_STATUS_RUNNING\n"); - break; - } - sprintf (NewPrepend, "%s ", Prepend); - siDebugDescriptors (NewPrepend, Event->Descriptors); - } - return; -} - - -void siDebugPrograms (char *Prepend, struct LIST *ProgramList) -{ - struct Program *Program; - char NewPrepend[32]; - - if (!ProgramList) return; - - xForeach (ProgramList, Program) - { - printf ("%sProgram\n%s=======\n", Prepend, Prepend); - printf ("%s ProgramID: %d\n", Prepend, Program->ProgramID); - printf ("%s TransportStreamID: %d\n", Prepend, Program->TransportStreamID); - printf ("%s NetworkPID: %d\n", Prepend, Program->NetworkPID); - printf ("%s PatVersion: %d\n", Prepend, Program->PatVersion); - - sprintf (NewPrepend, "%s ", Prepend); - siDebugPids (NewPrepend, Program->Pids); - } - return; -} - -void siDebugProgram (struct Program *Program) -{ - if (!Program) return; - - printf ("Program\r\n=======\r\n"); - printf (" ProgramID: %d\r\n", Program->ProgramID); - printf (" TransportStreamID: %d\r\n", Program->TransportStreamID); - printf (" NetworkPID: %d\r\n", Program->NetworkPID); - printf (" PatVersion: %d\r\n", Program->PatVersion); - - siDebugPids ("\r ", Program->Pids); - - return; -} - -void siDebugPids (char *Prepend, struct LIST *PidList) -{ - struct Pid *Pid; - struct PidInfo *PidInfo; - char NewPrepend[32]; - int index; - - if (!PidList) return; - - xForeach (PidList, Pid) - { - printf ("%sPid\n%s===\n", Prepend, Prepend); - printf ("%s ProgramID: %d\n", Prepend, Pid->ProgramID); - printf ("%s PcrPid: %d\n", Prepend, Pid->PcrPID); - printf ("%s PmtVersion: %d\n", Prepend, Pid->PmtVersion); - sprintf (NewPrepend, "%s ", Prepend); - siDebugDescriptors (NewPrepend, Pid->Descriptors); - - xForeach (Pid->InfoList, PidInfo) - { - printf ("%s PidInfo\n%s =======\n", Prepend, Prepend); - index = PidInfo->StreamType; - if (index > 0x0F && index <= 0x7F) index = 0x0E; - if (index >= 0x80) index = 0x0F; - printf ("%s StreamType: %s\n", Prepend, StreamTypes[index]); - printf ("%s ElementaryPid: %d\n", Prepend, PidInfo->ElementaryPid); - - sprintf (NewPrepend, "%s ", Prepend); - siDebugDescriptors (NewPrepend, PidInfo->Descriptors); - } - } - return; -} - - -void siDebugDescriptors (char *Prepend, struct LIST *Descriptors) -{ - struct Descriptor *Descriptor; - int i; - - xForeach (Descriptors, Descriptor) - { - switch (DescriptorTag (Descriptor)) - { - case DESCR_ANCILLARY_DATA: - printf ("%sDescriptor: Ancillary Data\n", Prepend); - printf ("%s Identifier: ", Prepend); - if (((struct AncillaryDataDescriptor *)Descriptor)-> - Identifier & ANCILLARY_DATA_DVD_VIDEO) - printf ("DVD-Video Ancillary Data "); - if (((struct AncillaryDataDescriptor *)Descriptor)-> - Identifier & ANCILLARY_DATA_EXTENDED) - printf ("Extended Ancillary Data "); - if (((struct AncillaryDataDescriptor *)Descriptor)-> - Identifier & ANCILLARY_DATA_SWITCHING) - printf ("Announcement Switching Data "); - if (((struct AncillaryDataDescriptor *)Descriptor)-> - Identifier & ANCILLARY_DATA_DAB) - printf ("DAB Ancillary Data "); - if (((struct AncillaryDataDescriptor *)Descriptor)-> - Identifier & ANCILLARY_DATA_SCALE_FACTOR) - printf ("Scale Factor Error Check (ScF-CRC) "); - printf ("\n"); - break; - - case DESCR_NW_NAME: - printf ("%sDescriptor: Network Name\n", Prepend); - printf ("%s Name: %s\n", Prepend, xName (Descriptor)); - break; - - case DESCR_BOUQUET_NAME: - printf ("%sDescriptor: Bouquet Name\n", Prepend); - printf ("%s Name: %s\n", Prepend, xName (Descriptor)); - break; - - case DESCR_COMPONENT: - printf ("%sDescriptor: Component\n", Prepend); - printf ("%s Text: %s\n", Prepend, xName (Descriptor)); - printf ("%s Content/Type: ", Prepend); - for (i = 0; i < COMPONENT_TYPE_NUMBER; i++) - if ((((struct ComponentDescriptor *)Descriptor)-> - StreamContent == ComponentTypes[i].Content) && - (((struct ComponentDescriptor *)Descriptor)-> - ComponentType == ComponentTypes[i].Type)) - { printf ("%s\n", ComponentTypes[i].Description); break; } - if (i == COMPONENT_TYPE_NUMBER) { printf ("unbekannt\n"); } - printf ("%s ComponentTag: 0x%02x\n", Prepend, - ((struct ComponentDescriptor *)Descriptor)->ComponentTag); - printf ("%s LanguageCode: %s\n", Prepend, - ((struct ComponentDescriptor *)Descriptor)->LanguageCode); - break; - - case DESCR_SERVICE: - printf ("%sDescriptor: Service\n", Prepend); - printf ("%s Name: %s\n", Prepend, xName (Descriptor)); - printf ("%s ServiceType: ", Prepend); - for (i = 0; i < SERVICE_TYPE_NUMBER; i++) - if ((((struct ServiceDescriptor *)Descriptor)-> - ServiceType == ServiceTypes[i].Type)) - { printf ("%s\n", ServiceTypes[i].Description); break; } - if (i == SERVICE_TYPE_NUMBER) { printf ("unbekannt\n"); } - printf ("%s ServiceProvider: %s\n", Prepend, - ((struct ServiceDescriptor *)Descriptor)->ServiceProvider); - break; - - case DESCR_COUNTRY_AVAIL: - printf ("%sDescriptor: Country Availability\n", Prepend); - printf ("%s Type: %s\n", Prepend, (((struct CountryAvailabilityDescriptor *)Descriptor)-> - AvailibilityFlag == COUNTRIES_ARE_AVAILABLE) ? "countries are available" : - "countries are unavailable"); - { - char *cptr = ((struct CountryAvailabilityDescriptor *)Descriptor)->CountryCodes; int j; - for (j = 0; j < ((struct CountryAvailabilityDescriptor *)Descriptor)->Amount; j++) - { printf ("%s Country: %s\n", Prepend, cptr); cptr += 4; } - } - break; - - case DESCR_SHORT_EVENT: - printf ("%sDescriptor: Short Event\n", Prepend); - printf ("%s Name: %s\n", Prepend, xName (Descriptor)); - printf ("%s LanguageCode: %s\n", Prepend, - ((struct ShortEventDescriptor *)Descriptor)->LanguageCode); - printf ("%s Text: %s\n", Prepend, - ((struct ShortEventDescriptor *)Descriptor)->Text); - break; - - case DESCR_EXTENDED_EVENT: - { - struct ExtendedEventItem *Item; - - printf ("%sDescriptor: Extended Event\n", Prepend); - printf ("%s Text: %s\n", Prepend, xName (Descriptor)); - printf ("%s DescriptorNumber: %d\n", Prepend, - ((struct ExtendedEventDescriptor *)Descriptor)->DescriptorNumber); - printf ("%s LastDescriptorNumber: %d\n", Prepend, - ((struct ExtendedEventDescriptor *)Descriptor)->LastDescriptorNumber); - printf ("%s LanguageCode: %s\n", Prepend, - ((struct ExtendedEventDescriptor *)Descriptor)->LanguageCode); - xForeach (((struct ExtendedEventDescriptor *)Descriptor)->Items, Item) - { - printf ("%s Item:\n", Prepend); - printf ("%s Description: %s\n", Prepend, xName(Item)); - printf ("%s Text: %s\n", Prepend, Item->Text); - } - } - break; - - case DESCR_CA_IDENT: - printf ("%sDescriptor: Conditional Access Identity\n", Prepend); - { - int j,k; - for (j = 0; j < ((struct CaIdentifierDescriptor *)Descriptor)->Amount; j++) - { - printf ("%s SystemID: 0x%04x", Prepend, GetCaIdentifierID (Descriptor, j)); - k = GetCaIdentifierID (Descriptor, j) >> 8; - if (k < 0 || k > MAX_CA_IDENT) printf (" (unknown)\n"); - else printf (" (%s)\n", CaIdents[k]); - } - } - break; - - case DESCR_CA: - { - int j,k; - - printf ("%sDescriptor: Conditional Access\n", Prepend); - printf ("%s CA type: 0x%04x", Prepend, (((struct CaDescriptor *)Descriptor)->CA_type)); - k = (((struct CaDescriptor *)Descriptor)->CA_type) >> 8; - if (k < 0 || k > MAX_CA_IDENT) printf (" (unknown)\n"); - else printf (" (%s)\n", CaIdents[k]); - printf ("%s CA PID: %d\n", Prepend, (((struct CaDescriptor *)Descriptor)->CA_PID)); - printf ("%s ProviderID: 0x%04X\n", Prepend, (((struct CaDescriptor *)Descriptor)->ProviderID)); - if (((struct CaDescriptor *)Descriptor)->DataLength > 0) - { - printf ("%s CA data:", Prepend); - for (j = 0; j < ((struct CaDescriptor *)Descriptor)->DataLength; j++) - printf (" 0x%02x", GetCaData (Descriptor, j)); - printf ("\n"); - } - } - break; - - case DESCR_CONTENT: - printf ("%sDescriptor: Content\n", Prepend); - { - int j; - for (j = 0; j < ((struct ContentDescriptor *)Descriptor)->Amount; j++) - { - printf ("%s Content: ", Prepend); - for (i = 0; i < CONTENT_TYPE_NUMBER; i++) - if ((GetContentContentNibble1(Descriptor, j) == ContentTypes[i].Nibble1) && - (GetContentContentNibble2(Descriptor, j) == ContentTypes[i].Nibble2)) - { printf ("%s\n", ContentTypes[i].Description); break; } - if (i == CONTENT_TYPE_NUMBER) { printf ("unbekannt\n"); } - printf ("%s User-Nibble 1: 0x%1x\n", Prepend, GetContentUserNibble1(Descriptor, j)); - printf ("%s User-Nibble 2: 0x%1x\n", Prepend, GetContentUserNibble2(Descriptor, j)); - } - } - break; - - case DESCR_PARENTAL_RATING: - { - struct ParentalRating *Rating; - - printf ("%sDescriptor: Parental Rating\n", Prepend); - xForeach (((struct ParentalRatingDescriptor *)Descriptor)->Ratings, Rating) - { - printf ("%s Rating:\n"); - printf ("%s LanguageCode: %s\n", Rating->LanguageCode); - printf ("%s Rating: "); - if (Rating->Rating == 0) printf ("(undefined)\n"); - else { if (Rating->Rating <= 0x10) printf ("minimum age is %d\n", Rating->Rating + 3); - else printf ("(rating is provider defined)\n"); } - } - } - break; - - case DESCR_NVOD_REF: - { - struct NvodReferenceItem *Item; - - printf ("%sDescriptor: NVOD Reference\n", Prepend); - xForeach (((struct NvodReferenceDescriptor *)Descriptor)->Items, Item) - { - printf ("%s Item:\n", Prepend); - printf ("%s ServiceID: %d\n", Prepend, Item->ServiceID); - printf ("%s TransportStreamID: %d\n", Prepend, Item->TransportStreamID); - printf ("%s OriginalNetworkID: %d\n", Prepend, Item->OriginalNetworkID); - } - } - break; - - case DESCR_TIME_SHIFTED_SERVICE: - printf ("%sDescriptor: Time Shifted Service\n", Prepend); - printf ("%s ReferenceServiceID: %d\n", Prepend, - ((struct TimeShiftedServiceDescriptor *) - Descriptor)->ReferenceServiceID); - break; - - case DESCR_TIME_SHIFTED_EVENT: - printf ("%sDescriptor: Time Shifted Event\n", Prepend); - printf ("%s ReferenceServiceID: %d\n", Prepend, - ((struct TimeShiftedEventDescriptor *) - Descriptor)->ReferenceServiceID); - printf ("%s ReferenceEventID: %d\n", Prepend, - ((struct TimeShiftedEventDescriptor *) - Descriptor)->ReferenceEventID); - break; - - case DESCR_ISO_639_LANGUAGE: - printf ("%sDescriptor: ISO 639 Language\n", Prepend); - printf ("%s LanguageCode: %s\n", Prepend, - ((struct Iso639LanguageDescriptor *)Descriptor)->LanguageCode); - break; - - case DESCR_STREAM_ID: - printf ("%sDescriptor: Stream Identifier\n", Prepend); - printf ("%s ComponentTag: %d\n", Prepend, - ((struct StreamIdentifierDescriptor *)Descriptor)->ComponentTag); - break; - - case DESCR_LINKAGE: - printf ("%sDescriptor: Linkage\n", Prepend); - printf ("%s TransportStreamID: %d\n", Prepend, - ((struct LinkageDescriptor *)Descriptor)->TransportStreamID); - printf ("%s OriginalNetworkID: %d\n", Prepend, - ((struct LinkageDescriptor *)Descriptor)->OriginalNetworkID); - printf ("%s ServiceID: %d\n", Prepend, - ((struct LinkageDescriptor *)Descriptor)->ServiceID); - printf ("%s LinkageType: %d\n", Prepend, - ((struct LinkageDescriptor *)Descriptor)->LinkageType); - if (((struct LinkageDescriptor *)Descriptor)->PrivateDataLength) - { - int j; - printf ("%s PrivateData: ", Prepend); - for (j = 0; j < ((struct LinkageDescriptor *) - Descriptor)->PrivateDataLength; j++) - printf ("0x%02X ", ((struct LinkageDescriptor *) - Descriptor)->PrivateData[j]); - printf ("\n"); - } - break; - - case DESCR_TELETEXT: - { - struct TeletextItem *Item; - - printf ("%sDescriptor: Teletext\n", Prepend); - xForeach (((struct TeletextDescriptor *)Descriptor)->Items, Item) - { - printf ("%s Item:\n"); - printf ("%s LanguageCode: %s\n", Prepend, Item->LanguageCode); - printf ("%s Type: ", Prepend); - switch (Item->Type) - { - case 0x01: printf ("initial Teletext page\n"); break; - case 0x02: printf ("Teletext subtitle page\n"); break; - case 0x03: printf ("additional information page\n"); break; - case 0x04: printf ("programme schedule page\n"); break; - case 0x05: printf ("Teletext subtitle page "); - printf ("for hearing impaired people\n"); break; - default: printf ("reserved for future use\n"); break; - } - printf ("%s MagazineNumber: %x\n", Prepend, Item->MagazineNumber); - printf ("%s PageNumber: %x\n", Prepend, Item->PageNumber); - } - } - break; - - case DESCR_SUBTITLING: - { - struct SubtitlingItem *Item; - - printf ("%sDescriptor: Subtitling\n", Prepend); - xForeach (((struct SubtitlingDescriptor *)Descriptor)->Items, Item) - { - printf ("%s Item:\n"); - printf ("%s LanguageCode: %s\n", Prepend, Item->LanguageCode); - printf ("%s Type: ", Prepend); - for (i = 0; i < COMPONENT_TYPE_NUMBER; i++) - if ((0x03 == ComponentTypes[i].Content) && - (Item->Type == ComponentTypes[i].Type)) - { printf ("%s\n", ComponentTypes[i].Description); break; } - printf ("%s CompositionPageId: %x\n", Prepend, Item->CompositionPageId); - printf ("%s AncillaryPageId: %x\n", Prepend, Item->AncillaryPageId); - } - } - break; - - case DESCR_SAT_DEL_SYS: - { - struct SatelliteDeliverySystemDescriptor *sds = - (struct SatelliteDeliverySystemDescriptor *)Descriptor; - - printf ("%sDescriptor: Satellite Delivery System\n", Prepend); - printf ("%s Frequency: %ld\n", Prepend, sds->Frequency); - printf ("%s OrbitalPosition: %d\n", Prepend, sds->OrbitalPosition); - printf ("%s Polarization: %c\n", Prepend, sds->Polarization); - printf ("%s Modulation: %c\n", Prepend, sds->Modulation); - printf ("%s SymbolRate: %ld\n", Prepend, sds->SymbolRate); - printf ("%s FEC: %c\n", Prepend, sds->FEC); - } - break; - - case DESCR_CABLE_DEL_SYS: - { - struct CableDeliverySystemDescriptor *cds = - (struct CableDeliverySystemDescriptor *)Descriptor; - - printf ("%sDescriptor: Cable Delivery System\n", Prepend); - printf ("%s Frequency: %ld\n", Prepend, cds->Frequency); - printf ("%s SymbolRate: %ld\n", Prepend, cds->SymbolRate); - printf ("%s FEC outer: %d\n", Prepend, cds->FECouter); - printf ("%s FEC inner: %d\n", Prepend, cds->FECinner); - printf ("%s Modulation: %d\n", Prepend, cds->Modulation); - } - break; - - case DESCR_TERR_DEL_SYS: - { - struct TerrestrialDeliverySystemDescriptor *tds = - (struct TerrestrialDeliverySystemDescriptor *)Descriptor; - - printf ("%sDescriptor: Terrestrial Delivery System\n", Prepend); - printf ("%s Frequency: %ld\n", Prepend, tds->Frequency); - printf ("%s Bandwidth: %d\n", Prepend, tds->Bandwidth); - printf ("%s Constellation: %d\n", Prepend, tds->Constellation); - printf ("%s Hierarchy: %d\n", Prepend, tds->Hierarchy); - printf ("%s CodeRateHP: %d\n", Prepend, tds->CodeRateHP); - printf ("%s CodeRateLP: %d\n", Prepend, tds->CodeRateLP); - printf ("%s GuardInterval: %d\n", Prepend, tds->GuardInterval); - printf ("%s TransmissionMode: %d\n", Prepend, tds->TransmissionMode); - printf ("%s OtherFrequencyFlag: %d\n", Prepend, tds->OtherFrequencyFlag); - } - break; - - case DESCR_SERVICE_LIST: - { - struct ServiceListEntry *Entry; - - printf ("%sDescriptor: Service List\n", Prepend); - xForeach (((struct ServiceListDescriptor *)Descriptor)->ServiceList, Entry) - { - printf ("%s Entry:\n"); - printf ("%s ServiceID: %d\n", Prepend, Entry->ServiceID); - printf ("%s ServiceType: %04x\n", Prepend, Entry->ServiceType); - } - } - break; - - case DESCR_LOCAL_TIME_OFF: - { - struct LocalTimeOffsetEntry *Offset; - - printf ("%sDescriptor: Local Time Offset\n", Prepend); - xForeach (((struct LocalTimeOffsetDescriptor *)Descriptor)->LocalTimeOffsets, Offset) - { - printf ("%s Offset:\n"); - printf ("%s CountryCode: %s\n", Offset->CountryCode); - printf ("%s RegionID: %c\n", Offset->RegionID); - printf ("%s CurrentOffset: %ld\n", Offset->CurrentOffset); - printf ("%s ChangeTime: %ld\n", Offset->ChangeTime); - printf ("%s NextOffset: %ld\n", Offset->NextOffset); - } - } - break; - - case DESCR_STUFFING: - case DESCR_VBI_DATA: - case DESCR_VBI_TELETEXT: - case DESCR_MOSAIC: - case DESCR_TELEPHONE: - case DESCR_ML_NW_NAME: - case DESCR_ML_BQ_NAME: - case DESCR_ML_SERVICE_NAME: - case DESCR_ML_COMPONENT: - case DESCR_PRIV_DATA_SPEC: - case DESCR_SERVICE_MOVE: - case DESCR_SHORT_SMOOTH_BUF: - case DESCR_FREQUENCY_LIST: - case DESCR_PARTIAL_TP_STREAM: - case DESCR_DATA_BROADCAST: - case DESCR_CA_SYSTEM: - case DESCR_DATA_BROADCAST_ID: - case DESCR_TRANSPORT_STREAM: - case DESCR_DSNG: - case DESCR_PDC: - case DESCR_AC3: - case DESCR_CELL_LIST: - case DESCR_CELL_FREQ_LINK: - case DESCR_ANNOUNCEMENT_SUPPORT: - default: - printf ("%sDescriptor: %02x (noch nicht unterstützt)\n", Prepend, DescriptorTag (Descriptor)); - break; - } - } - return; -} - -void siDumpDescriptor (void * Descriptor) -{ - int Length, i; - unsigned char *ptr; - - Length = GetDescriptorLength (Descriptor); - for (i = 0, ptr = (char*) Descriptor; i < Length; i++) { - if ((i % 8) == 0) - printf ("\n"); - printf ("0x%02X ", (unsigned int) ptr[i]); - } - printf ( "\n"); -} - -void siDumpSection (void *Section) -{ - int Length, i; - unsigned char *ptr; - char str[9]; - - Length = GetSectionLength (Section) + 3; - for (i = 0, ptr = (unsigned char*) Section, memset (str, 0, 9); i < Length; i++) { - if ((i % 8) == 0) - { - printf (" %s\n", str); - memset (str, 0, 8); - } - printf ("0x%02X ", (unsigned int) ptr[i]); - if (ptr[i] < 0x20 || (ptr[i] > 'z' && ptr[i] < ((unsigned char )'Ŕ')) ) - str[i % 8] = '.'; - else - str[i % 8] = ptr[i]; - } - printf (" %*s\n", (8 - ((abs(i - 1) % 8) ? (abs(i - 1) % 8) : 8)) * 5, str); -} - diff --git a/libdtv/libsi/si_debug_services.h b/libdtv/libsi/si_debug_services.h deleted file mode 100644 index 404f3c7..0000000 --- a/libdtv/libsi/si_debug_services.h +++ /dev/null @@ -1,245 +0,0 @@ -////////////////////////////////////////////////////////////// -/// /// -/// si_debug_services.h: local debugging definitions /// -/// /// -////////////////////////////////////////////////////////////// - -// $Revision: 1.2 $ -// $Date: 2003/02/04 18:45:35 $ -// $Author: hakenes $ -// -// (C) 2001 Rolf Hakenes <hakenes@hippomi.de>, under the GNU GPL. -// -// libsi 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, or (at your option) -// any later version. -// -// libsi 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 may have received a copy of the GNU General Public License -// along with libsi; see the file COPYING. If not, write to the -// Free Software Foundation, Inc., 59 Temple Place - Suite 330, -// Boston, MA 02111-1307, USA. - - -struct component_type { - u_char Content; - u_char Type; - char *Description; -}; - -static struct component_type ComponentTypes[] = { - { 0x01, 0x01, "video, 4:3 aspect ratio, 25 Hz" }, - { 0x01, 0x02, "video, 16:9 aspect ratio with pan vectors, 25 Hz" }, - { 0x01, 0x03, "video, 16:9 aspect ratio without pan vectors, 25 Hz" }, - { 0x01, 0x04, "video, > 16:9 aspect ratio, 25 Hz" }, - { 0x01, 0x05, "video, 4:3 aspect ratio, 30 Hz" }, - { 0x01, 0x06, "video, 16:9 aspect ratio with pan vectors, 30 Hz" }, - { 0x01, 0x07, "video, 16:9 aspect ratio without pan vectors, 30 Hz" }, - { 0x01, 0x08, "video, > 16:9 aspect ratio, 30 Hz" }, - { 0x01, 0x09, "HD video, 4:3 aspect ratio, 25 Hz" }, - { 0x01, 0x0A, "HD video, 16:9 aspect ratio with pan vectors, 25 Hz" }, - { 0x01, 0x0B, "HD video, 16:9 aspect ratio without pan vectors, 25 Hz" }, - { 0x01, 0x0C, "HD video, > 16:9 aspect ratio, 25 Hz" }, - { 0x01, 0x0D, "HD video, 4:3 aspect ratio, 30 Hz" }, - { 0x01, 0x0E, "HD video, 16:9 aspect ratio with pan vectors, 30 Hz" }, - { 0x01, 0x0F, "HD video, 16:9 aspect ratio without pan vectors, 30 Hz" }, - { 0x01, 0x10, "HD video, > 16:9 aspect ratio, 30 Hz" }, - { 0x02, 0x01, "audio, single mono channel" }, - { 0x02, 0x02, "audio, dual mono channel" }, - { 0x02, 0x03, "audio, stereo (2 channel)" }, - { 0x02, 0x04, "audio, multi lingual, multi channel" }, - { 0x02, 0x05, "audio, surround sound" }, - { 0x02, 0x40, "audio description for the visually impaired" }, - { 0x02, 0x41, "audio for the hard of hearing" }, - { 0x03, 0x01, "EBU Teletext subtitles" }, - { 0x03, 0x02, "associated EBU Teletext" }, - { 0x03, 0x03, "VBI data" }, - { 0x03, 0x10, "DVB subtitles (normal), no aspect criticality" }, - { 0x03, 0x11, "DVB subtitles (normal), aspect 4:3 only" }, - { 0x03, 0x12, "DVB subtitles (normal), aspect 16:9 only" }, - { 0x03, 0x13, "DVB subtitles (normal), aspect 2.21:1 only" }, - { 0x03, 0x20, "DVB subtitles (hard of hearing), no aspect criticality" }, - { 0x03, 0x21, "DVB subtitles (hard of hearing), aspect 4:3 only" }, - { 0x03, 0x22, "DVB subtitles (hard of hearing), aspect 16:9 only" }, - { 0x03, 0x23, "DVB subtitles (hard of hearing), aspect 2.21:1 only" } -}; -#define COMPONENT_TYPE_NUMBER 35 - - -struct service_type { - u_char Type; - char *Description; -}; - -static struct service_type ServiceTypes[] = { - { 0x01, "digital television service" }, - { 0x02, "digital radio sound service" }, - { 0x03, "Teletext service" }, - { 0x04, "NVOD reference service" }, - { 0x05, "NVOD time-shifted service" }, - { 0x06, "mosaic service" }, - { 0x07, "PAL coded signal" }, - { 0x08, "SECAM coded signal" }, - { 0x09, "D/D2-MAC" }, - { 0x0A, "FM Radio" }, - { 0x0B, "NTSC coded signal" }, - { 0x0C, "data broadcast service" }, - { 0x0D, "common interface data" }, - { 0x0E, "RCS Map" }, - { 0x0F, "RCS FLS" }, - { 0x10, "DVB MHP service" } -}; -#define SERVICE_TYPE_NUMBER 16 - - -struct content_type { - u_char Nibble1; - u_char Nibble2; - char *Description; -}; - -static struct content_type ContentTypes[] = { - /* Movie/Drama: */ - { 0x01, 0x00, "movie/drama (general)" }, - { 0x01, 0x01, "detective/thriller" }, - { 0x01, 0x02, "adventure/western/war" }, - { 0x01, 0x03, "science fiction/fantasy/horror" }, - { 0x01, 0x04, "comedy" }, - { 0x01, 0x05, "soap/melodrama/folkloric" }, - { 0x01, 0x06, "romance" }, - { 0x01, 0x07, "serious/classical/religious/historical movie/drama" }, - { 0x01, 0x08, "adult movie/drama" }, - /* News/Current affairs: */ - { 0x02, 0x00, "news/current affairs (general)" }, - { 0x02, 0x01, "news/weather report" }, - { 0x02, 0x02, "news magazine" }, - { 0x02, 0x03, "documentary" }, - { 0x02, 0x04, "discussion/interview/debate" }, - /* Show/Game show: */ - { 0x03, 0x00, "show/game show (general)" }, - { 0x03, 0x01, "game show/quiz/contest" }, - { 0x03, 0x02, "variety show" }, - { 0x03, 0x03, "talk show" }, - /* Sports: */ - { 0x04, 0x00, "sports (general)" }, - { 0x04, 0x01, "special events (Olympic Games, World Cup etc.)" }, - { 0x04, 0x02, "sports magazines" }, - { 0x04, 0x03, "football/soccer" }, - { 0x04, 0x04, "tennis/squash" }, - { 0x04, 0x05, "team sports (excluding football)" }, - { 0x04, 0x06, "athletics" }, - { 0x04, 0x07, "motor sport" }, - { 0x04, 0x08, "water sport" }, - { 0x04, 0x09, "winter sports" }, - { 0x04, 0x0A, "equestrian" }, - { 0x04, 0x0B, "martial sports" }, - /* Children's/Youth programmes: */ - { 0x05, 0x00, "children's/youth programmes (general)" }, - { 0x05, 0x01, "pre-school children's programmes" }, - { 0x05, 0x02, "entertainment programmes for 6 to14" }, - { 0x05, 0x03, "entertainment programmes for 10 to 16" }, - { 0x05, 0x04, "informational/educational/school programmes" }, - { 0x05, 0x05, "cartoons/puppets" }, - /* Music/Ballet/Dance: */ - { 0x06, 0x00, "music/ballet/dance (general)" }, - { 0x06, 0x01, "rock/pop" }, - { 0x06, 0x02, "serious music/classical music" }, - { 0x06, 0x03, "folk/traditional music" }, - { 0x06, 0x04, "jazz" }, - { 0x06, 0x05, "musical/opera" }, - { 0x06, 0x06, "ballet" }, - /* Arts/Culture (without music): */ - { 0x07, 0x00, "arts/culture (without music, general)" }, - { 0x07, 0x01, "performing arts" }, - { 0x07, 0x02, "fine arts" }, - { 0x07, 0x03, "religion" }, - { 0x07, 0x04, "popular culture/traditional arts" }, - { 0x07, 0x05, "literature" }, - { 0x07, 0x06, "film/cinema" }, - { 0x07, 0x07, "experimental film/video" }, - { 0x07, 0x08, "broadcasting/press" }, - { 0x07, 0x09, "new media" }, - { 0x07, 0x0A, "arts/culture magazines" }, - { 0x07, 0x0B, "fashion" }, - /* Social/Political issues/Economics: */ - { 0x08, 0x00, "social/political issues/economics (general)" }, - { 0x08, 0x01, "magazines/reports/documentary" }, - { 0x08, 0x02, "economics/social advisory" }, - { 0x08, 0x03, "remarkable people" }, - /* Children's/Youth programmes: */ - /* Education/ Science/Factual topics: */ - { 0x09, 0x00, "education/science/factual topics (general)" }, - { 0x09, 0x01, "nature/animals/environment" }, - { 0x09, 0x02, "technology/natural sciences" }, - { 0x09, 0x03, "medicine/physiology/psychology" }, - { 0x09, 0x04, "foreign countries/expeditions" }, - { 0x09, 0x05, "social/spiritual sciences" }, - { 0x09, 0x06, "further education" }, - { 0x09, 0x07, "languages" }, - /* Leisure hobbies: */ - { 0x0A, 0x00, "leisure hobbies (general)" }, - { 0x0A, 0x01, "tourism/travel" }, - { 0x0A, 0x02, "handicraft" }, - { 0x0A, 0x03, "motoring" }, - { 0x0A, 0x04, "fitness & health" }, - { 0x0A, 0x05, "cooking" }, - { 0x0A, 0x06, "advertisement/shopping" }, - { 0x0A, 0x07, "gardening" }, - { 0x0B, 0x00, "original language" }, - { 0x0B, 0x01, "black & white" }, - { 0x0B, 0x02, "unpublished" }, - { 0x0B, 0x03, "live broadcast" } -}; -#define CONTENT_TYPE_NUMBER 79 - -static char *StreamTypes[] = { - "ITU-T|ISO/IEC Reserved", - "ISO/IEC Video", - "13818-2 Video or 11172-2 constrained parameter video stream", - "ISO/IEC 11172 Audio", - "ISO/IEC 13818-3 Audio", - "private_sections", - "packets containing private data / Videotext", - "ISO/IEC 13522 MPEG", - "ITU-T Rec. H.222.1", - "ISO/IEC 13818-6 type A", - "ISO/IEC 13818-6 type B", - "ISO/IEC 13818-6 type C", - "ISO/IEC 13818-6 type D", - "ISO/IEC 13818-1 auxiliary", - "ITU-T Rec. H.222.0 | ISO 13818-1 Reserved", - "User private" -}; - -static char *CaIdents[] = { - "Standardized systems", - "Canal Plus", - "CCETT", - "Deutsche Telecom", - "Eurodec", - "France Telecom", - "Irdeto", - "Jerrold/GI", - "Matra Communication", - "News Datacom", - "Nokia", - "Norwegian Telekom", - "NTL", - "Philips", - "Scientific Atlanta", - "Sony", - "Tandberg Television", - "Thomson", - "TV/Com", - "HPT - Croatian Post and Telecommunications", - "HRT - Croatian Radio and Television", - "IBM", - "Nera", - "BetaTechnik" -}; -#define MAX_CA_IDENT 24 diff --git a/libdtv/libsi/si_parser.c b/libdtv/libsi/si_parser.c deleted file mode 100644 index 896c5ab..0000000 --- a/libdtv/libsi/si_parser.c +++ /dev/null @@ -1,1335 +0,0 @@ -////////////////////////////////////////////////////////////// -/// /// -/// si_parser.c: main parsing functions of libsi /// -/// /// -////////////////////////////////////////////////////////////// - -// $Revision: 1.8 $ -// $Date: 2003/02/04 18:45:35 $ -// $Author: hakenes $ -// -// (C) 2001-03 Rolf Hakenes <hakenes@hippomi.de>, under the -// GNU GPL with contribution of Oleg Assovski, -// www.satmania.com -// -// libsi 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, or (at your option) -// any later version. -// -// libsi 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 may have received a copy of the GNU General Public License -// along with libsi; see the file COPYING. If not, write to the -// Free Software Foundation, Inc., 59 Temple Place - Suite 330, -// Boston, MA 02111-1307, USA. - -#include <stdio.h> -#include <string.h> -#include <math.h> -#include <time.h> - -#include "../liblx/liblx.h" -#include "libsi.h" -#include "si_tables.h" - -static u_long crc32 (char *data, int len); - -struct LIST *siParsePAT (u_char *Buffer) -{ - pat_t *Pat; - pat_prog_t *PatProgram; - u_char *Ptr; - int SectionLength; - int TransportStreamID; - int PatVersion; - struct Program *Program; - struct LIST *ProgramList = NULL; - - if (!Buffer) return NULL; - - Pat = (pat_t *) Buffer; Ptr = Buffer; - - if (Pat->table_id != TID_PAT) { - // fprintf (stderr, "PAT: wrong TID %d\n", Pat->table_id); - return NULL; - } - - SectionLength = HILO (Pat->section_length) + 3 - PAT_LEN - 4; - - if (crc32 (Ptr, HILO (Pat->section_length) + 3)) return (NULL); - - TransportStreamID = HILO (Pat->transport_stream_id); - PatVersion = Pat->version_number; - - Ptr += PAT_LEN; - - while (SectionLength > 0) - { - PatProgram = (pat_prog_t *) Ptr; - - CreateProgram (Program, HILO (PatProgram->program_number), - TransportStreamID, HILO (PatProgram->network_pid), PatVersion); - - if (!ProgramList) ProgramList = xNewList (NULL); - xAddTail (ProgramList, Program); - - SectionLength -= PAT_PROG_LEN; - Ptr += PAT_PROG_LEN; - } - - return (ProgramList); -} - - -struct LIST *siParseCAT (u_char *Buffer) -{ - cat_t *Cat; - u_char *Ptr; - int SectionLength; - int TransportStreamID; - int CatVersion; - struct Descriptor *Descriptor; - struct LIST *DescriptorList = NULL; - - if (!Buffer) return NULL; - - Cat = (cat_t *) Buffer; Ptr = Buffer; - - if (Cat->table_id != TID_CAT) { - // fprintf (stderr, "CAT: wrong TID %d\n", Cat->table_id); - return NULL; - } - - SectionLength = HILO (Cat->section_length) + 3 - CAT_LEN - 4; - - if (crc32 (Ptr, HILO (Cat->section_length) + 3)) return (NULL); - - CatVersion = Cat->version_number; - - Ptr += CAT_LEN; - - if (SectionLength >= 0) - { - DescriptorList = xNewList (NULL); - siParseDescriptors (DescriptorList, Ptr, SectionLength, Cat->table_id); - } - - return (DescriptorList); -} - - -struct Pid *siParsePMT (u_char *Buffer) -{ - pmt_t *Pmt; - pmt_info_t *PmtInfo; - u_char *Ptr; - int SectionLength, ProgramInfoLength, - StreamLength, LoopLength; - int ProgramID; - int PcrID; - int PmtVersion; - struct Pid *Pid; - struct PidInfo *PidInfo; - - if (!Buffer) return NULL; - - Pmt = (pmt_t *) Buffer; Ptr = Buffer; - - if (Pmt->table_id != TID_PMT) { - // fprintf (stderr, "PMT: wrong TID %d\n", Pmt->table_id); - return NULL; - } - - SectionLength = HILO (Pmt->section_length) + 3 - 4; - - if (crc32 (Ptr, HILO (Pmt->section_length) + 3)) return (NULL); - - ProgramInfoLength = HILO (Pmt->program_info_length); - StreamLength = SectionLength - ProgramInfoLength - PMT_LEN; - - ProgramID = HILO (Pmt->program_number); - PmtVersion = Pmt->version_number; - PcrID = HILO (Pmt->PCR_PID); - - Ptr += PMT_LEN; - - CreatePid (Pid, ProgramID, PcrID, PmtVersion); - - if (StreamLength >= 0) siParseDescriptors (Pid->Descriptors, Ptr, - ProgramInfoLength, Pmt->table_id); - - Ptr += ProgramInfoLength; - - while (StreamLength > 0) - { - PmtInfo = (pmt_info_t *) Ptr; - - CreatePidInfo (PidInfo, PmtInfo->stream_type, - HILO (PmtInfo->elementary_PID)); - - LoopLength = HILO (PmtInfo->ES_info_length); - Ptr += PMT_INFO_LEN; - - siParseDescriptors (PidInfo->Descriptors, Ptr, LoopLength, Pmt->table_id); - - xAddTail (Pid->InfoList, PidInfo); - - StreamLength -= LoopLength + PMT_INFO_LEN; - Ptr += LoopLength; - } - - return (Pid); -} - - -struct LIST *siParseNIT (u_char *Buffer) -{ - nit_t *Nit; - nit_mid_t *NitMid; - nit_ts_t *TSDesc; - u_char *Ptr; - int SectionLength, LoopLength, Loop2Length; - int TransportStreamID; - int NitVersion; - int NetworkID; - struct TransportStream *TransportStream; - struct LIST *TSList = NULL; - struct LIST *Networks; - struct NetworkInfo *Network; - - if (!Buffer) return NULL; - - Nit = (nit_t *) Buffer; - Ptr = Buffer; - - if (Nit->table_id != TID_NIT_ACT && Nit->table_id != TID_NIT_OTH && Nit->table_id != TID_BAT) { - return NULL; - } - - SectionLength = HILO (Nit->section_length) + 3 - NIT_LEN - 4; - - if (crc32 (Ptr, HILO (Nit->section_length) + 3)) return (NULL); - - NitVersion = Nit->version_number; - NetworkID = HILO (Nit->network_id); - if (NetworkID == 65535) - NetworkID = 0; - CreateNetworkInfo (Network, NetworkID); - Networks = xNewList (NULL); - xAddTail (Networks, Network); - - Ptr += NIT_LEN; - - LoopLength = HILO (Nit->network_descriptor_length); -// fprintf (stderr, "table 0x%X, SectionLen = %d, LoopLen = %d\n", -// Nit->table_id, SectionLength, LoopLength); - if (LoopLength > SectionLength - SDT_DESCR_LEN) - return (Networks); - - if (LoopLength <= SectionLength) { - if (SectionLength >= 0) siParseDescriptors (Network->Descriptors, Ptr, LoopLength, Nit->table_id); - SectionLength -= LoopLength; - Ptr += LoopLength; - NitMid = (nit_mid_t *) Ptr; - LoopLength = HILO (NitMid->transport_stream_loop_length); -// fprintf (stderr, "table 0x%X, TS LoopLen = %d\n", -// Nit->table_id, LoopLength); - if ((SectionLength > 0) && (LoopLength <= SectionLength)) { - SectionLength -= SIZE_NIT_MID; - Ptr += SIZE_NIT_MID; - while (LoopLength > 0) { - TSDesc = (nit_ts_t *) Ptr; - CreateTransportStream (TransportStream, HILO(TSDesc->transport_stream_id), HILO(TSDesc->original_network_id)); - if (TransportStream->TransportStreamID == 65535) - TransportStream->TransportStreamID = 0; - if (TransportStream->OriginalNetworkID == 65535) - TransportStream->OriginalNetworkID = 0; - Loop2Length = HILO (TSDesc->transport_descriptors_length); -// fprintf (stderr, "table 0x%X, TSdesc LoopLen = %d\n", -// Nit->table_id, Loop2Length); - Ptr += NIT_TS_LEN; - if (Loop2Length <= LoopLength) { - if (LoopLength >= 0) siParseDescriptors (TransportStream->Descriptors, Ptr, Loop2Length, Nit->table_id); - } - if (!Network->TransportStreams) - Network->TransportStreams = xNewList (NULL); - xAddTail (Network->TransportStreams, TransportStream); - LoopLength -= Loop2Length + NIT_TS_LEN; - SectionLength -= Loop2Length + NIT_TS_LEN; - Ptr += Loop2Length; - } - } - } - - return (Networks); -} - - -struct LIST *siParseSDT (u_char *Buffer) -{ - sdt_t *Sdt; - sdt_descr_t *SdtDescriptor; - u_char *Ptr; - int SectionLength, LoopLength; - int TransportStreamID; - int SdtVersion; - int OriginalNetworkID; - struct Service *Service; - struct LIST *ServiceList = NULL; - - if (!Buffer) return NULL; - - Sdt = (sdt_t *) Buffer; Ptr = Buffer; - - if (Sdt->table_id != TID_SDT_ACT && Sdt->table_id != TID_SDT_OTH) { - // fprintf (stderr, "SDT: wrong TID %d\n", Sdt->table_id); - return NULL; - } - - SectionLength = HILO (Sdt->section_length) + 3 - SDT_LEN - 4; - - if (crc32 (Ptr, HILO (Sdt->section_length) + 3)) return (NULL); - - TransportStreamID = HILO (Sdt->transport_stream_id); - SdtVersion = Sdt->version_number; - OriginalNetworkID = HILO (Sdt->original_network_id); - - Ptr += SDT_LEN; - - while (SectionLength > 0) - { - SdtDescriptor = (sdt_descr_t *) Ptr; - - CreateService (Service, HILO (SdtDescriptor->service_id), - TransportStreamID, OriginalNetworkID, SdtVersion, - SdtDescriptor->free_ca_mode ? CONDITIONAL_ACCESS : FREE_TO_AIR); - - switch (SdtDescriptor->running_status) - { - case 0x01: - SetRunningStatus (Service->Status, RUNNING_STATUS_NOT_RUNNING); - break; - - case 0x02: - SetRunningStatus (Service->Status, RUNNING_STATUS_AWAITING); - break; - - case 0x03: - SetRunningStatus (Service->Status, RUNNING_STATUS_PAUSING); - break; - - case 0x04: - default: - SetRunningStatus (Service->Status, RUNNING_STATUS_RUNNING); - break; - } - if (SdtDescriptor->eit_schedule_flag) - SetScheduleFlag (Service->Status); - if (SdtDescriptor->eit_present_following_flag) - SetPresentFollowing (Service->Status); - - LoopLength = HILO (SdtDescriptor->descriptors_loop_length); - if (LoopLength > SectionLength - SDT_DESCR_LEN) - return (ServiceList); - Ptr += SDT_DESCR_LEN; - - siParseDescriptors (Service->Descriptors, Ptr, LoopLength, Sdt->table_id); - - if (!ServiceList) ServiceList = xNewList (NULL); - xAddTail (ServiceList, Service); - - SectionLength -= LoopLength + SDT_DESCR_LEN; - Ptr += LoopLength; - } - - return (ServiceList); -} - - -struct LIST *siParseEIT (u_char *Buffer) -{ - eit_t *Eit; - eit_event_t *EitEvent; - u_char *Ptr; - int SectionLength, LoopLength; - int ServiceID; - int EitVersion; - int TransportStreamID; - int OriginalNetworkID; - struct Event *Event; - struct LIST *EventList = NULL; - - if (!Buffer) return NULL; - - Eit = (eit_t *) Buffer; Ptr = Buffer; - - if (Eit->table_id != TID_EIT_ACT && Eit->table_id != TID_EIT_OTH && - !(Eit->table_id >= TID_EIT_ACT_SCH && - Eit->table_id <= TID_EIT_ACT_SCH + 0x0F) && - !(Eit->table_id >= TID_EIT_OTH_SCH && - Eit->table_id <= TID_EIT_OTH_SCH + 0x0F)) { - // fprintf (stderr, "EIT: wrong TID %d\n", Eit->table_id); - return NULL; - } - - SectionLength = HILO (Eit->section_length) + 3 - EIT_LEN - 4; - - if (crc32 (Ptr, HILO (Eit->section_length) + 3)) return (NULL); - - ServiceID = HILO (Eit->service_id); - TransportStreamID = HILO (Eit->transport_stream_id); - EitVersion = Eit->version_number; - OriginalNetworkID = HILO (Eit->original_network_id); - - Ptr += EIT_LEN; - - while (SectionLength > 0) - { - struct tm thisTime; - int year, month, day; - double mjd; - - EitEvent = (eit_event_t *) Ptr; - - CreateEvent (Event, HILO (EitEvent->event_id), ServiceID, - TransportStreamID, OriginalNetworkID, EitVersion, - EitEvent->free_ca_mode ? CONDITIONAL_ACCESS : FREE_TO_AIR); - - switch (EitEvent->running_status) - { - case 0x01: - SetRunningStatus (Event->Status, RUNNING_STATUS_NOT_RUNNING); - break; - - case 0x02: - SetRunningStatus (Event->Status, RUNNING_STATUS_AWAITING); - break; - - case 0x03: - SetRunningStatus (Event->Status, RUNNING_STATUS_PAUSING); - break; - - case 0x04: - default: - SetRunningStatus (Event->Status, RUNNING_STATUS_RUNNING); - break; - } - Event->StartTime = MjdToEpochTime (EitEvent->mjd) + - BcdTimeToSeconds (EitEvent->start_time); - Event->Duration = BcdTimeToSeconds (EitEvent->duration); - - LoopLength = HILO (EitEvent->descriptors_loop_length); - if (LoopLength > SectionLength - EIT_EVENT_LEN) - return (EventList); - Ptr += EIT_EVENT_LEN; - - siParseDescriptors (Event->Descriptors, Ptr, LoopLength, Eit->table_id); - - if (!EventList) EventList = xNewList (NULL); - xAddTail (EventList, Event); - - SectionLength -= LoopLength + EIT_EVENT_LEN; - Ptr += LoopLength; - } - - return (EventList); -} - - -time_t siParseTDT (u_char *Buffer) -{ - tdt_t *Tdt; - u_char *Ptr; - int SectionLength; - int TdtVersion; - time_t CurrentTime; - - if (!Buffer) return 0; - - Tdt = (tdt_t *) Buffer; Ptr = Buffer; - - if (Tdt->table_id != TID_TDT) { - // fprintf (stderr, "TDT: wrong TID %d\n", Tdt->table_id); - return 0; - } - - SectionLength = HILO (Tdt->section_length) + 3; /* no CRC ?! */ - - CurrentTime = MjdToEpochTime (Tdt->utc_mjd) + - BcdTimeToSeconds (Tdt->utc_time); - - return (CurrentTime); -} - - -struct Tot *siParseTOT (u_char *Buffer) -{ - tot_t *Tot; - u_char *Ptr; - int SectionLength, LoopLength; - struct Tot *table; - time_t CurrentTime; - - if (!Buffer) return NULL; - - Tot = (tot_t *) Buffer; - Ptr = Buffer; - - if (Tot->table_id != TID_TOT) { - return NULL; - } - - if (crc32 (Ptr, HILO (Tot->section_length) + 3)) return (NULL); -// SectionLength = HILO (Tot->section_length) + 3 - TOT_LEN - 4; - - CurrentTime = MjdToEpochTime (Tot->utc_mjd) + - BcdTimeToSeconds (Tot->utc_time); - LoopLength = HILO (Tot->descriptors_loop_length); - if (!LoopLength) - return NULL; - - CreateTot (table, CurrentTime); - - Ptr += TOT_LEN; - - siParseDescriptors (table->Descriptors, Ptr, LoopLength, Tot->table_id); - - // fprintf (stderr, "TOT Bias: %d\n", table->Bias); - return (table); -} - -static u_char TempTableID = 0; - -void siParseDescriptors (struct LIST *Descriptors, u_char *Buffer, - int Length, u_char TableID) -{ - int DescriptorLength; - u_char *Ptr; - - DescriptorLength = 0; - Ptr = Buffer; - TempTableID = TableID; - - while (DescriptorLength < Length) - { - if ((GetDescriptorLength (Ptr) > Length - DescriptorLength) || - (GetDescriptorLength (Ptr) <= 0)) return; - switch (TableID) - { - case TID_NIT_ACT: case TID_NIT_OTH: - switch (GetDescriptorTag(Ptr)) - { - case DESCR_SAT_DEL_SYS: - case DESCR_CABLE_DEL_SYS: - case DESCR_SERVICE_LIST: - case DESCR_PRIV_DATA_SPEC: -// fprintf (stderr, "Got descriptor with tag = 0x%X\n", GetDescriptorTag(Ptr)); -// siDumpDescriptor (Ptr); - case DESCR_NW_NAME: - case DESCR_STUFFING: - case DESCR_LINKAGE: - case DESCR_TERR_DEL_SYS: - case DESCR_ML_NW_NAME: - case DESCR_CELL_LIST: - case DESCR_CELL_FREQ_LINK: - case DESCR_ANNOUNCEMENT_SUPPORT: - siParseDescriptor (Descriptors, Ptr); - break; - - default: - // fprintf (stderr, "forbidden descriptor 0x%x in NIT\n", GetDescriptorTag(Ptr)); - break; - } - break; - - case TID_BAT: - switch (GetDescriptorTag(Ptr)) - { - case DESCR_SERVICE_LIST: - case DESCR_STUFFING: - case DESCR_BOUQUET_NAME: - case DESCR_SERVICE: - case DESCR_COUNTRY_AVAIL: - case DESCR_LINKAGE: - case DESCR_CA_IDENT: - case DESCR_ML_BQ_NAME: - case DESCR_PRIV_DATA_SPEC: - // fprintf (stderr, "Got descriptor with tag = 0x%X\n", GetDescriptorTag(Ptr)); - siParseDescriptor (Descriptors, Ptr); - break; - - default: - // fprintf (stderr, "forbidden descriptor 0x%x in BAT\n", GetDescriptorTag(Ptr)); - break; - } - break; - - case TID_SDT_ACT: case TID_SDT_OTH: - switch (GetDescriptorTag(Ptr)) - { - case DESCR_STUFFING: - case DESCR_BOUQUET_NAME: - case DESCR_SERVICE: - case DESCR_COUNTRY_AVAIL: - case DESCR_LINKAGE: - case DESCR_NVOD_REF: - case DESCR_TIME_SHIFTED_SERVICE: - case DESCR_MOSAIC: - case DESCR_CA_IDENT: - case DESCR_TELEPHONE: - case DESCR_ML_SERVICE_NAME: - case DESCR_PRIV_DATA_SPEC: - case DESCR_DATA_BROADCAST: - siParseDescriptor (Descriptors, Ptr); - break; - - default: - // fprintf (stderr, "forbidden descriptor 0x%x in SDT\n", GetDescriptorTag(Ptr)); - break; - } - break; - - case TID_EIT_ACT: case TID_EIT_OTH: - case TID_EIT_ACT_SCH: case TID_EIT_OTH_SCH: - case TID_EIT_ACT_SCH+1: case TID_EIT_OTH_SCH+1: - case TID_EIT_ACT_SCH+2: case TID_EIT_OTH_SCH+2: - case TID_EIT_ACT_SCH+3: case TID_EIT_OTH_SCH+3: - case TID_EIT_ACT_SCH+4: case TID_EIT_OTH_SCH+4: - case TID_EIT_ACT_SCH+5: case TID_EIT_OTH_SCH+5: - case TID_EIT_ACT_SCH+6: case TID_EIT_OTH_SCH+6: - case TID_EIT_ACT_SCH+7: case TID_EIT_OTH_SCH+7: - case TID_EIT_ACT_SCH+8: case TID_EIT_OTH_SCH+8: - case TID_EIT_ACT_SCH+9: case TID_EIT_OTH_SCH+9: - case TID_EIT_ACT_SCH+10: case TID_EIT_OTH_SCH+10: - case TID_EIT_ACT_SCH+11: case TID_EIT_OTH_SCH+11: - case TID_EIT_ACT_SCH+12: case TID_EIT_OTH_SCH+12: - case TID_EIT_ACT_SCH+13: case TID_EIT_OTH_SCH+13: - case TID_EIT_ACT_SCH+14: case TID_EIT_OTH_SCH+14: - case TID_EIT_ACT_SCH+15: case TID_EIT_OTH_SCH+15: - switch (GetDescriptorTag(Ptr)) - { - case DESCR_STUFFING: - case DESCR_LINKAGE: - case DESCR_SHORT_EVENT: - case DESCR_EXTENDED_EVENT: - case DESCR_TIME_SHIFTED_EVENT: - case DESCR_COMPONENT: - case DESCR_CA_IDENT: - case DESCR_CONTENT: - case DESCR_PARENTAL_RATING: - case DESCR_TELEPHONE: - case DESCR_ML_COMPONENT: - case DESCR_PRIV_DATA_SPEC: - case DESCR_SHORT_SMOOTH_BUF: - case DESCR_DATA_BROADCAST: - case DESCR_PDC: - siParseDescriptor (Descriptors, Ptr); - break; - - default: - // fprintf (stderr, "forbidden descriptor 0x%x in EIT\n", GetDescriptorTag(Ptr)); - break; - } - break; - - case TID_TOT: - switch (GetDescriptorTag(Ptr)) - { - case DESCR_LOCAL_TIME_OFF: - siParseDescriptor (Descriptors, Ptr); - break; - - default: - // fprintf (stderr, "forbidden descriptor 0x%x in TOT\n", GetDescriptorTag(Ptr)); - break; - } - break; - - case TID_PMT: - switch (GetDescriptorTag(Ptr)) - { - case DESCR_VBI_DATA: - case DESCR_VBI_TELETEXT: - case DESCR_MOSAIC: - case DESCR_STREAM_ID: - case DESCR_TELETEXT: - case DESCR_SUBTITLING: - case DESCR_PRIV_DATA_SPEC: - case DESCR_SERVICE_MOVE: - case DESCR_CA_SYSTEM: - case DESCR_DATA_BROADCAST_ID: - case DESCR_AC3: - case DESCR_ANCILLARY_DATA: - case DESCR_VIDEO_STREAM: - case DESCR_AUDIO_STREAM: - case DESCR_HIERARCHY: - case DESCR_REGISTRATION: - case DESCR_DATA_STREAM_ALIGN: - case DESCR_TARGET_BACKGRID: - case DESCR_VIDEO_WINDOW: - case DESCR_CA: - case DESCR_ISO_639_LANGUAGE: - case DESCR_SYSTEM_CLOCK: - case DESCR_MULTIPLEX_BUFFER_UTIL: - case DESCR_COPYRIGHT: - case DESCR_MAXIMUM_BITRATE: - siParseDescriptor (Descriptors, Ptr); - break; - - default: - // fprintf (stderr, "forbidden descriptor 0x%x in PMT\n", GetDescriptorTag(Ptr)); - break; - } - break; - - case TID_CAT: - switch (GetDescriptorTag(Ptr)) - { - case DESCR_CA_SYSTEM: - case DESCR_CA: - case DESCR_CA_IDENT: - siParseDescriptor (Descriptors, Ptr); - break; - - default: - // fprintf (stderr, "forbidden descriptor 0x%x in CAT\n", GetDescriptorTag(Ptr)); - break; - } - break; - - default: - // fprintf (stderr, "descriptor 0x%x in unsupported table 0x%x\n", GetDescriptorTag(Ptr), TableID); - break; - } - DescriptorLength += GetDescriptorLength (Ptr); - Ptr += GetDescriptorLength (Ptr); - } - return; -} - - -void siParseDescriptor (struct LIST *Descriptors, u_char *Buffer) -{ - struct NODE *Descriptor = NULL; - char *Text , *Text2; - u_char *Ptr; - int Length, i; - - if (!Descriptors || !Buffer) return; - - Ptr = Buffer; -// fprintf (stderr, "Got descriptor with tag = 0x%X\n", GetDescriptorTag(Buffer)); - - switch (GetDescriptorTag(Buffer)) - { - case DESCR_ANCILLARY_DATA: - CreateAncillaryDataDescriptor (Descriptor, - CastAncillaryDataDescriptor(Buffer)->ancillary_data_identifier); - break; - - case DESCR_NW_NAME: - case DESCR_BOUQUET_NAME: - Text = siGetDescriptorName (Buffer + DESCR_BOUQUET_NAME_LEN, - GetDescriptorLength (Buffer) - DESCR_BOUQUET_NAME_LEN); -// fprintf (stderr, "Got descriptor with tag = 0x%X, text = '%s'\n", GetDescriptorTag(Buffer), Text); - CreateBouquetNameDescriptor (Descriptor, Text, GetDescriptorTag(Buffer)); - break; - - case DESCR_COMPONENT: - Text = siGetDescriptorText (Buffer + DESCR_COMPONENT_LEN, - GetDescriptorLength (Buffer) - DESCR_COMPONENT_LEN); - CreateComponentDescriptor (Descriptor, - CastComponentDescriptor(Buffer)->stream_content, - CastComponentDescriptor(Buffer)->component_type, - CastComponentDescriptor(Buffer)->component_tag, - CastComponentDescriptor(Buffer)->lang_code1, - CastComponentDescriptor(Buffer)->lang_code2, - CastComponentDescriptor(Buffer)->lang_code3, Text); - break; - - case DESCR_SERVICE: - Text = siGetDescriptorName (Buffer + DESCR_SERVICE_LEN, - CastServiceDescriptor(Buffer)->provider_name_length); - Text2 = siGetDescriptorName (Buffer + DESCR_SERVICE_LEN + - CastServiceDescriptor(Buffer)->provider_name_length + 1, - *((u_char *)(Buffer + DESCR_SERVICE_LEN + - CastServiceDescriptor(Buffer)->provider_name_length))); - CreateServiceDescriptor (Descriptor, - CastServiceDescriptor(Buffer)->service_type, Text, Text2); - break; - - case DESCR_COUNTRY_AVAIL: - CreateCountryAvailabilityDescriptor (Descriptor, - CastCountryAvailabilityDescriptor(Buffer)->country_availability_flag); - Length = GetDescriptorLength (Buffer) - DESCR_COUNTRY_AVAILABILITY_LEN; - Ptr += DESCR_COUNTRY_AVAILABILITY_LEN; - while (Length > 0) - { AddCountryAvailabilityCode(Descriptor, - Ptr[0], Ptr[1], Ptr[2]); Ptr += 3; Length -= 3; } - break; - - case DESCR_SHORT_EVENT: - Text = siGetDescriptorName (Buffer + DESCR_SHORT_EVENT_LEN, - CastShortEventDescriptor(Buffer)->event_name_length); - Text2 = siGetDescriptorText (Buffer + DESCR_SHORT_EVENT_LEN + - CastShortEventDescriptor(Buffer)->event_name_length + 1, - *((u_char *)(Buffer + DESCR_SHORT_EVENT_LEN + - CastShortEventDescriptor(Buffer)->event_name_length))); - CreateShortEventDescriptor (Descriptor, Text, - CastShortEventDescriptor(Buffer)->lang_code1, - CastShortEventDescriptor(Buffer)->lang_code2, - CastShortEventDescriptor(Buffer)->lang_code3, Text2); - break; - - case DESCR_EXTENDED_EVENT: - Text = siGetDescriptorText (Buffer + DESCR_EXTENDED_EVENT_LEN + - CastExtendedEventDescriptor(Buffer)->length_of_items + 1, - *((u_char *)(Buffer + DESCR_EXTENDED_EVENT_LEN + - CastExtendedEventDescriptor(Buffer)->length_of_items))); - CreateExtendedEventDescriptor (Descriptor, - CastExtendedEventDescriptor(Buffer)->descriptor_number, - CastExtendedEventDescriptor(Buffer)->last_descriptor_number, - CastExtendedEventDescriptor(Buffer)->lang_code1, - CastExtendedEventDescriptor(Buffer)->lang_code2, - CastExtendedEventDescriptor(Buffer)->lang_code3, Text); - Length = CastExtendedEventDescriptor(Buffer)->length_of_items; - Ptr += DESCR_EXTENDED_EVENT_LEN; -// printf ("EEDesc #%d, %s\n", CastExtendedEventDescriptor(Buffer)->descriptor_number, Text); - while ((Length > 0) && (Length < GetDescriptorLength (Buffer))) - { - Text = siGetDescriptorText (Ptr + ITEM_EXTENDED_EVENT_LEN, - CastExtendedEventItem(Ptr)->item_description_length); - Text2 = siGetDescriptorText (Ptr + ITEM_EXTENDED_EVENT_LEN + - CastExtendedEventItem(Ptr)->item_description_length + 1, - *((u_char *)(Ptr + ITEM_EXTENDED_EVENT_LEN + - CastExtendedEventItem(Ptr)->item_description_length))); -// printf ("EEItem #%d, %s, %s\n", CastExtendedEventDescriptor(Buffer)->descriptor_number, Text, Text2); - AddExtendedEventItem (Descriptor, Text2, Text); - Length -= ITEM_EXTENDED_EVENT_LEN + CastExtendedEventItem(Ptr)->item_description_length + - *((u_char *)(Ptr + ITEM_EXTENDED_EVENT_LEN + - CastExtendedEventItem(Ptr)->item_description_length)) + 1; - Ptr += ITEM_EXTENDED_EVENT_LEN + CastExtendedEventItem(Ptr)->item_description_length + - *((u_char *)(Ptr + ITEM_EXTENDED_EVENT_LEN + - CastExtendedEventItem(Ptr)->item_description_length)) + 1; - } - break; - - case DESCR_CA_IDENT: - Length = GetDescriptorLength (Buffer) - DESCR_CA_IDENTIFIER_LEN; - CreateCaIdentifierDescriptor (Descriptor, Length / 2); - Ptr += DESCR_CA_IDENTIFIER_LEN; i = 0; - while (Length > 0) - { SetCaIdentifierID(Descriptor, i, ((*((u_char *) Ptr)<<8) + *((u_char *) (Ptr+1)))); - Length -= 2; Ptr += 2; i++; } - break; - - case DESCR_CA: - { - struct CaDescriptor *CD; - - Length = GetDescriptorLength (Buffer) - DESCR_CA_LEN; - CreateCaDescriptor (Descriptor, - HILO(CastCaDescriptor(Buffer)->CA_type), - HILO(CastCaDescriptor(Buffer)->CA_PID), Length); - Ptr += DESCR_CA_LEN; i = 0; - while (Length > 0) - { SetCaData(Descriptor, i, *Ptr); - Length --; Ptr ++; i++; } - - /* - * The following analyses are more or less directly copied from - * MultiDec 8.4b Sources. Thanx to Espresso for his great work !! - */ - CD = (struct CaDescriptor *) Descriptor; - - // fprintf (stderr, "TableID: %02x - CA - Type: 0x%04x, PID: %d\n", TempTableID, CD->CA_type, CD->CA_PID); - - if ((CD->CA_type >> 8) == 0x01) /* SECA */ - { - CD->ProviderID = (GetCaData (CD, 0) << 8) | GetCaData (CD, 1); - } - else if ((CD->CA_type >> 8) == 0x05) /* Viaccess ? (France Telecom) */ - { - i=0; - while (i < CD->DataLength) - { - if ((GetCaData (CD, i) == 0x14) && (GetCaData (CD, i+1) == 0x03)) - { - CD->ProviderID = (GetCaData (CD, i+2) << 16) | - (GetCaData (CD, i+3) << 8) | - (GetCaData (CD, i+4) & 0xf0); - i = CD->DataLength; - } - i++; - } - } - if (CD->CA_type==0x0100) /* SECA 1 */ - { - /* bptr=MyPtr+19; - - i=19; - while ( i+4 < ca_info->len ) { - if ( (*bptr&0xE0) == 0xE0 ) { - CA_ECM=(( *bptr&0x1f)<<8)+*(bptr+1); - Prov_Ident = ( *(bptr+2)<<8) | *(bptr+3); - j=0; - while ( j < ProgrammNeu[ProgrammNummer].CA_Anzahl ) { - if (( ProgrammNeu[ProgrammNummer].CA_System[j].CA_Typ == CA_Typ ) - && ( ProgrammNeu[ProgrammNummer].CA_System[j].ECM == CA_ECM )) break; - j++; - }; - - if ( j < MAX_CA_SYSTEMS ) { - if ( j >= ProgrammNeu[ProgrammNummer].CA_Anzahl ) - ProgrammNeu[ProgrammNummer].CA_Anzahl++; - ProgrammNeu[ProgrammNummer].CA_System[j].CA_Typ =CA_Typ; - ProgrammNeu[ProgrammNummer].CA_System[j].ECM =CA_ECM ; - ProgrammNeu[ProgrammNummer].CA_System[j].Provider_Id = Prov_Ident; - }; - } - i+=0x0f; - bptr+=0x0f; - }; */ - } - } - break; - - case DESCR_CONTENT: - CreateContentDescriptor (Descriptor, - (GetDescriptorLength(Buffer) - DESCR_CONTENT_LEN) / 2); - Length = GetDescriptorLength (Buffer) - DESCR_CONTENT_LEN; - Ptr += DESCR_CONTENT_LEN; i = 0; - while (Length > 0) - { SetContentID(Descriptor, i, CastContentNibble(Ptr)->content_nibble_level_1, - CastContentNibble(Ptr)->content_nibble_level_2, - CastContentNibble(Ptr)->user_nibble_1, - CastContentNibble(Ptr)->user_nibble_2); - Length -= 2; Ptr += 2; i++; } - break; - - case DESCR_STUFFING: - /* intentionally ignored */ - break; - - case DESCR_PARENTAL_RATING: - CreateParentalRatingDescriptor (Descriptor); - Length = GetDescriptorLength (Buffer) - DESCR_PARENTAL_RATING_LEN; - Ptr += DESCR_PARENTAL_RATING_LEN; i = 0; - while (Length > 0) - { AddParentalRating (Descriptor, CastParentalRating(Ptr)->lang_code1, - CastParentalRating(Ptr)->lang_code2, CastParentalRating(Ptr)->lang_code3, - CastParentalRating(Ptr)->rating); - Length -= PARENTAL_RATING_LEN; Ptr += PARENTAL_RATING_LEN; i++; } - break; - - case DESCR_NVOD_REF: - CreateNvodReferenceDescriptor (Descriptor); - Length = GetDescriptorLength (Buffer) - DESCR_NVOD_REFERENCE_LEN; - Ptr += DESCR_NVOD_REFERENCE_LEN; - while (Length > 0) - { - AddNvodReferenceItem (Descriptor, - HILO (CastNvodReferenceItem(Ptr)->transport_stream_id), - HILO (CastNvodReferenceItem(Ptr)->original_network_id), - HILO (CastNvodReferenceItem(Ptr)->service_id)); - Length -= ITEM_NVOD_REFERENCE_LEN; - Ptr += ITEM_NVOD_REFERENCE_LEN; - } - break; - - case DESCR_TIME_SHIFTED_SERVICE: - CreateTimeShiftedServiceDescriptor (Descriptor, - HILO (CastTimeShiftedServiceDescriptor(Ptr)->reference_service_id)); - break; - - case DESCR_TIME_SHIFTED_EVENT: - CreateTimeShiftedEventDescriptor (Descriptor, - HILO (CastTimeShiftedEventDescriptor(Ptr)->reference_service_id), - HILO (CastTimeShiftedEventDescriptor(Ptr)->reference_event_id)); - break; - - case DESCR_ISO_639_LANGUAGE: - CreateIso639LanguageDescriptor (Descriptor, - CastIso639LanguageDescriptor(Buffer)->lang_code1, - CastIso639LanguageDescriptor(Buffer)->lang_code2, - CastIso639LanguageDescriptor(Buffer)->lang_code3); - break; - - case DESCR_STREAM_ID: - CreateStreamIdentifierDescriptor (Descriptor, - CastStreamIdentifierDescriptor(Ptr)->component_tag); - break; - - case DESCR_LINKAGE: - CreateLinkageDescriptor (Descriptor, - HILO (CastLinkageDescriptor(Ptr)->transport_stream_id), - HILO (CastLinkageDescriptor(Ptr)->original_network_id), - HILO (CastLinkageDescriptor(Ptr)->service_id), - CastLinkageDescriptor(Ptr)->linkage_type, - GetDescriptorLength (Ptr) - DESCR_LINKAGE_LEN, - Ptr + DESCR_LINKAGE_LEN); - break; - - case DESCR_TELETEXT: - CreateTeletextDescriptor (Descriptor); - Length = GetDescriptorLength (Buffer) - DESCR_TELETEXT_LEN; - Ptr += DESCR_TELETEXT_LEN; - while (Length > 0) - { - AddTeletextItem (Descriptor, - CastTeletextItem(Ptr)->type, - CastTeletextItem(Ptr)->magazine_number, - CastTeletextItem(Ptr)->page_number, - CastTeletextItem(Ptr)->lang_code1, - CastTeletextItem(Ptr)->lang_code2, - CastTeletextItem(Ptr)->lang_code3); - Length -= ITEM_TELETEXT_LEN; - Ptr += ITEM_TELETEXT_LEN; - } - break; - - case DESCR_AC3: - CreateAc3Descriptor (Descriptor); - Length = GetDescriptorLength (Buffer); - if (CastAc3Descriptor(Buffer)->ac3_type_flag) - { Length -= 1; Ptr += 1; AddAc3FlagAndValue (Descriptor, - AC3_TYPE_FLAG, CastAc3Descriptor(Buffer)->ac3_type); } - if (CastAc3Descriptor(Buffer)->bsid_flag) - { Length -= 1; Ptr += 1; AddAc3FlagAndValue (Descriptor, - BS_ID_FLAG, CastAc3Descriptor(Buffer)->bsid); } - if (CastAc3Descriptor(Buffer)->mainid_flag) - { Length -= 1; Ptr += 1; AddAc3FlagAndValue (Descriptor, - MAIN_ID_FLAG, CastAc3Descriptor(Buffer)->mainid); } - if (CastAc3Descriptor(Buffer)->asvc_flag) - { Length -= 1; Ptr += 1; AddAc3FlagAndValue (Descriptor, - ASVC_FLAG, CastAc3Descriptor(Buffer)->asvc); } - Length -= DESCR_AC3_LEN; - Ptr += DESCR_AC3_LEN; - if (Length > 0) AddAc3AdditionalData (Descriptor, Ptr, Length); - break; - - case DESCR_SUBTITLING: - CreateSubtitlingDescriptor (Descriptor); - Length = GetDescriptorLength (Buffer) - DESCR_SUBTITLING_LEN; - Ptr += DESCR_SUBTITLING_LEN; - while (Length > 0) - { - AddSubtitlingItem (Descriptor, - CastSubtitlingItem(Ptr)->subtitling_type, - HILO (CastSubtitlingItem(Ptr)->composition_page_id), - HILO (CastSubtitlingItem(Ptr)->ancillary_page_id), - CastSubtitlingItem(Ptr)->lang_code1, - CastSubtitlingItem(Ptr)->lang_code2, - CastSubtitlingItem(Ptr)->lang_code3); - Length -= ITEM_SUBTITLING_LEN; - Ptr += ITEM_SUBTITLING_LEN; - } - break; - - case DESCR_SAT_DEL_SYS: -// fprintf (stderr, "got descriptor 0x%x\n", GetDescriptorTag(Buffer)); - { - descr_satellite_delivery_system_t *sds; - sds = (descr_satellite_delivery_system_t *) Ptr; - if (CheckBcdChar (sds->frequency1) && CheckBcdChar (sds->frequency2) && - CheckBcdChar (sds->frequency3) && CheckBcdChar (sds->frequency4) && - CheckBcdChar (sds->orbital_position1) && - CheckBcdChar (sds->orbital_position2) && - CheckBcdChar (sds->symbol_rate1) && CheckBcdChar (sds->symbol_rate1) && - CheckBcdChar (sds->symbol_rate3) && (sds->fec_inner != 0) && (sds->modulation == 1)) - { - CreateSatelliteDeliverySystemDescriptor (Descriptor, - BcdCharToInt (sds->frequency1) * 10 * 1000 * 1000 + - BcdCharToInt (sds->frequency2) * 100 * 1000 + - BcdCharToInt (sds->frequency3) * 1000 + - BcdCharToInt (sds->frequency4) * 10, - (sds->west_east_flag ? 1 : -1) * - (BcdCharToInt (sds->orbital_position1) * 100 + - BcdCharToInt (sds->orbital_position2)), - sds->modulation, - sds->polarization, - BcdCharToInt (sds->symbol_rate1) * 10 * 1000 + - BcdCharToInt (sds->symbol_rate2) * 100 + - BcdCharToInt (sds->symbol_rate3), - sds->fec_inner); - } - /* else - { - fprintf (stderr, "Illegal sds descriptor\n"); - siDumpDescriptor (Buffer); - } */ - } - break; - - case DESCR_CABLE_DEL_SYS: -// fprintf (stderr, "got descriptor 0x%x\n", GetDescriptorTag(Buffer)); - { - descr_cable_delivery_system_t *cds; - cds = (descr_cable_delivery_system_t *) Ptr; - if (CheckBcdChar (cds->frequency1) && CheckBcdChar (cds->frequency2) && - CheckBcdChar (cds->frequency3) && CheckBcdChar (cds->frequency4) && - CheckBcdChar (cds->symbol_rate1) && CheckBcdChar (cds->symbol_rate1) && - CheckBcdChar (cds->symbol_rate3) && (cds->fec_inner != 0)) - { - CreateCableDeliverySystemDescriptor (Descriptor, - BcdCharToInt (cds->frequency1) * 100 * 1000 * 1000 + - BcdCharToInt (cds->frequency2) * 1000 * 1000 + - BcdCharToInt (cds->frequency3) * 10 * 1000 + - BcdCharToInt (cds->frequency4) * 100, - BcdCharToInt (cds->symbol_rate1) * 10 * 1000 + - BcdCharToInt (cds->symbol_rate2) * 100 + - BcdCharToInt (cds->symbol_rate3), - cds->fec_outer, - cds->fec_inner, - cds->modulation - ); - } - /* else - { - fprintf (stderr, "Illegal cds descriptor\n"); - siDumpDescriptor (Buffer); - } */ - } - break; - - case DESCR_TERR_DEL_SYS: -// fprintf (stderr, "got descriptor 0x%x\n", GetDescriptorTag(Buffer)); - { - descr_terrestrial_delivery_system_t *tds; - tds = (descr_terrestrial_delivery_system_t *) Ptr; - if (CheckBcdChar (tds->frequency1) && CheckBcdChar (tds->frequency2) && - CheckBcdChar (tds->frequency3) && CheckBcdChar (tds->frequency4)) - { - CreateTerrestrialDeliverySystemDescriptor (Descriptor, - BcdCharToInt (tds->frequency1) * 100 * 1000 * 1000 + - BcdCharToInt (tds->frequency2) * 1000 * 1000 + - BcdCharToInt (tds->frequency3) * 10 * 1000 + - BcdCharToInt (tds->frequency4) * 100, - tds->bandwidth, - tds->constellation, - tds->hierarchy, - tds->code_rate_HP, - tds->code_rate_LP, - tds->guard_interval, - tds->transmission_mode, - tds->other_frequency_flag - ); - } - /* else - { - fprintf (stderr, "Illegal cds descriptor\n"); - siDumpDescriptor (Buffer); - } */ - } - break; - - case DESCR_SERVICE_LIST: -// fprintf (stderr, "got descriptor 0x%x\n", GetDescriptorTag(Buffer)); - CreateServiceListDescriptor (Descriptor); - Length = GetDescriptorLength (Buffer) - DESCR_SERVICE_LIST_LEN; - Ptr += DESCR_SERVICE_LIST_LEN; - while (Length > 0) - { - AddServiceListEntry (Descriptor, - HILO (CastServiceListDescriptorLoop(Ptr)->service_id), - CastServiceListDescriptorLoop(Ptr)->service_type); - Length -= DESCR_SERVICE_LIST_LEN; - Ptr += DESCR_SERVICE_LIST_LEN; - } - break; - - case DESCR_LOCAL_TIME_OFF: - CreateLocalTimeOffsetDescriptor (Descriptor); - Length = GetDescriptorLength (Buffer) - DESCR_LOCAL_TIME_OFFSET_LEN; - Ptr += DESCR_LOCAL_TIME_OFFSET_LEN; - while (Length > 0) - { - time_t ct, co, no; - ct = MjdToEpochTime (CastLocalTimeOffsetEntry(Ptr)->time_of_change_mjd) + - BcdTimeToSeconds (CastLocalTimeOffsetEntry(Ptr)->time_of_change_time); - co = (BcdCharToInt(CastLocalTimeOffsetEntry(Ptr)->local_time_offset_h) * 3600 + - BcdCharToInt(CastLocalTimeOffsetEntry(Ptr)->local_time_offset_m) * 60) * - ((CastLocalTimeOffsetEntry(Ptr)->local_time_offset_polarity) ? -1 : 1); - no = (BcdCharToInt(CastLocalTimeOffsetEntry(Ptr)->next_time_offset_h) * 3600 + - BcdCharToInt(CastLocalTimeOffsetEntry(Ptr)->next_time_offset_m) * 60) * - ((CastLocalTimeOffsetEntry(Ptr)->local_time_offset_polarity) ? -1 : 1); - AddLocalTimeOffsetEntry (Descriptor, - CastLocalTimeOffsetEntry(Ptr)->country_code1, - CastLocalTimeOffsetEntry(Ptr)->country_code2, - CastLocalTimeOffsetEntry(Ptr)->country_code3, - CastLocalTimeOffsetEntry(Ptr)->country_region_id, co, ct, no); - Length -= LOCAL_TIME_OFFSET_ENTRY_LEN; - Ptr += LOCAL_TIME_OFFSET_ENTRY_LEN; - } - break; - - case DESCR_VIDEO_STREAM: - case DESCR_AUDIO_STREAM: - case DESCR_HIERARCHY: - case DESCR_REGISTRATION: - case DESCR_DATA_STREAM_ALIGN: - case DESCR_TARGET_BACKGRID: - case DESCR_VIDEO_WINDOW: - case DESCR_SYSTEM_CLOCK: - case DESCR_MULTIPLEX_BUFFER_UTIL: - case DESCR_COPYRIGHT: - case DESCR_MAXIMUM_BITRATE: - case DESCR_PRIVATE_DATA_IND: - case DESCR_SMOOTHING_BUFFER: - case DESCR_STD: - case DESCR_IBP: - case DESCR_VBI_DATA: - case DESCR_VBI_TELETEXT: - case DESCR_MOSAIC: - case DESCR_TELEPHONE: - case DESCR_ML_NW_NAME: - case DESCR_ML_BQ_NAME: - case DESCR_ML_SERVICE_NAME: - case DESCR_ML_COMPONENT: - case DESCR_PRIV_DATA_SPEC: - case DESCR_SERVICE_MOVE: - case DESCR_SHORT_SMOOTH_BUF: - case DESCR_FREQUENCY_LIST: - case DESCR_PARTIAL_TP_STREAM: - case DESCR_DATA_BROADCAST: - case DESCR_CA_SYSTEM: - case DESCR_DATA_BROADCAST_ID: - case DESCR_TRANSPORT_STREAM: - case DESCR_DSNG: - case DESCR_PDC: - case DESCR_CELL_LIST: - case DESCR_CELL_FREQ_LINK: - case DESCR_ANNOUNCEMENT_SUPPORT: - default: -// fprintf (stderr, "Unsupported descriptor with tag = 0x%02X\n", GetDescriptorTag(Ptr)); -// siDumpDescriptor (Buffer); - /* fprintf (stderr, "unsupported descriptor 0x%x\n", - GetDescriptorTag(Buffer)); */ - break; - } - if (Descriptor) xAddTail (Descriptors, Descriptor); - return; -} - - -/* - * ToDo: ETSI conformal text definition - */ -#define GDT_TEXT_DESCRIPTOR 0 -#define GDT_NAME_DESCRIPTOR 1 -char *siGetDescriptorTextHandler (u_char *, int , int ); - -char *siGetDescriptorTextHandler (u_char *Buffer, int Length, int type) -{ - char *tmp, *result; - int i; - - if ((Length < 0) || (Length > 4095)) - return (xSetText ("text error")); -/* ASSENIZATION: removing coding detection - suppose they are all ANSI */ - // if (*Buffer == 0x05 || (*Buffer >= 0x20 && *Buffer <= 0xff)) - { - xMemAlloc (Length+1, &result); - tmp = result; - for (i = 0; i < Length; i++) - { - if (*Buffer == 0) break; - - if ((*Buffer >= ' ' && *Buffer <= '~') || (*Buffer == '\n') || - (*Buffer >= 0xa0)) *tmp++ = *Buffer; - if (*Buffer == 0x8A) *tmp++ = '\n'; - if ((*Buffer == 0x86 || *Buffer == 0x87) && !(GDT_NAME_DESCRIPTOR & type)) *tmp++ = ' '; - Buffer++; - } - *tmp = '\0'; - } - /* else - { - switch (*Buffer) - { - case 0x01: result = xSetText ("Coding according to character table 1"); break; - case 0x02: result = xSetText ("Coding according to character table 2"); break; - case 0x03: result = xSetText ("Coding according to character table 3"); break; - case 0x04: result = xSetText ("Coding according to character table 4"); break; - case 0x10: result = xSetText ("Coding according to ISO/IEC 8859"); break; - case 0x11: result = xSetText ("Coding according to ISO/IEC 10646"); break; - case 0x12: result = xSetText ("Coding according to KSC 5601"); break; - default: result = xSetText ("Unknown coding"); break; - } - } */ - - return (result); -} - -char *siGetDescriptorText (u_char *Buffer, int Length) -{ - return siGetDescriptorTextHandler (Buffer, Length, GDT_TEXT_DESCRIPTOR); -} - -char *siGetDescriptorName (u_char *Buffer, int Length) -{ - return siGetDescriptorTextHandler (Buffer, Length, GDT_NAME_DESCRIPTOR); -} - - -// CRC32 lookup table for polynomial 0x04c11db7 - -static u_long crc_table[256] = { - 0x00000000, 0x04c11db7, 0x09823b6e, 0x0d4326d9, 0x130476dc, 0x17c56b6b, - 0x1a864db2, 0x1e475005, 0x2608edb8, 0x22c9f00f, 0x2f8ad6d6, 0x2b4bcb61, - 0x350c9b64, 0x31cd86d3, 0x3c8ea00a, 0x384fbdbd, 0x4c11db70, 0x48d0c6c7, - 0x4593e01e, 0x4152fda9, 0x5f15adac, 0x5bd4b01b, 0x569796c2, 0x52568b75, - 0x6a1936c8, 0x6ed82b7f, 0x639b0da6, 0x675a1011, 0x791d4014, 0x7ddc5da3, - 0x709f7b7a, 0x745e66cd, 0x9823b6e0, 0x9ce2ab57, 0x91a18d8e, 0x95609039, - 0x8b27c03c, 0x8fe6dd8b, 0x82a5fb52, 0x8664e6e5, 0xbe2b5b58, 0xbaea46ef, - 0xb7a96036, 0xb3687d81, 0xad2f2d84, 0xa9ee3033, 0xa4ad16ea, 0xa06c0b5d, - 0xd4326d90, 0xd0f37027, 0xddb056fe, 0xd9714b49, 0xc7361b4c, 0xc3f706fb, - 0xceb42022, 0xca753d95, 0xf23a8028, 0xf6fb9d9f, 0xfbb8bb46, 0xff79a6f1, - 0xe13ef6f4, 0xe5ffeb43, 0xe8bccd9a, 0xec7dd02d, 0x34867077, 0x30476dc0, - 0x3d044b19, 0x39c556ae, 0x278206ab, 0x23431b1c, 0x2e003dc5, 0x2ac12072, - 0x128e9dcf, 0x164f8078, 0x1b0ca6a1, 0x1fcdbb16, 0x018aeb13, 0x054bf6a4, - 0x0808d07d, 0x0cc9cdca, 0x7897ab07, 0x7c56b6b0, 0x71159069, 0x75d48dde, - 0x6b93dddb, 0x6f52c06c, 0x6211e6b5, 0x66d0fb02, 0x5e9f46bf, 0x5a5e5b08, - 0x571d7dd1, 0x53dc6066, 0x4d9b3063, 0x495a2dd4, 0x44190b0d, 0x40d816ba, - 0xaca5c697, 0xa864db20, 0xa527fdf9, 0xa1e6e04e, 0xbfa1b04b, 0xbb60adfc, - 0xb6238b25, 0xb2e29692, 0x8aad2b2f, 0x8e6c3698, 0x832f1041, 0x87ee0df6, - 0x99a95df3, 0x9d684044, 0x902b669d, 0x94ea7b2a, 0xe0b41de7, 0xe4750050, - 0xe9362689, 0xedf73b3e, 0xf3b06b3b, 0xf771768c, 0xfa325055, 0xfef34de2, - 0xc6bcf05f, 0xc27dede8, 0xcf3ecb31, 0xcbffd686, 0xd5b88683, 0xd1799b34, - 0xdc3abded, 0xd8fba05a, 0x690ce0ee, 0x6dcdfd59, 0x608edb80, 0x644fc637, - 0x7a089632, 0x7ec98b85, 0x738aad5c, 0x774bb0eb, 0x4f040d56, 0x4bc510e1, - 0x46863638, 0x42472b8f, 0x5c007b8a, 0x58c1663d, 0x558240e4, 0x51435d53, - 0x251d3b9e, 0x21dc2629, 0x2c9f00f0, 0x285e1d47, 0x36194d42, 0x32d850f5, - 0x3f9b762c, 0x3b5a6b9b, 0x0315d626, 0x07d4cb91, 0x0a97ed48, 0x0e56f0ff, - 0x1011a0fa, 0x14d0bd4d, 0x19939b94, 0x1d528623, 0xf12f560e, 0xf5ee4bb9, - 0xf8ad6d60, 0xfc6c70d7, 0xe22b20d2, 0xe6ea3d65, 0xeba91bbc, 0xef68060b, - 0xd727bbb6, 0xd3e6a601, 0xdea580d8, 0xda649d6f, 0xc423cd6a, 0xc0e2d0dd, - 0xcda1f604, 0xc960ebb3, 0xbd3e8d7e, 0xb9ff90c9, 0xb4bcb610, 0xb07daba7, - 0xae3afba2, 0xaafbe615, 0xa7b8c0cc, 0xa379dd7b, 0x9b3660c6, 0x9ff77d71, - 0x92b45ba8, 0x9675461f, 0x8832161a, 0x8cf30bad, 0x81b02d74, 0x857130c3, - 0x5d8a9099, 0x594b8d2e, 0x5408abf7, 0x50c9b640, 0x4e8ee645, 0x4a4ffbf2, - 0x470cdd2b, 0x43cdc09c, 0x7b827d21, 0x7f436096, 0x7200464f, 0x76c15bf8, - 0x68860bfd, 0x6c47164a, 0x61043093, 0x65c52d24, 0x119b4be9, 0x155a565e, - 0x18197087, 0x1cd86d30, 0x029f3d35, 0x065e2082, 0x0b1d065b, 0x0fdc1bec, - 0x3793a651, 0x3352bbe6, 0x3e119d3f, 0x3ad08088, 0x2497d08d, 0x2056cd3a, - 0x2d15ebe3, 0x29d4f654, 0xc5a92679, 0xc1683bce, 0xcc2b1d17, 0xc8ea00a0, - 0xd6ad50a5, 0xd26c4d12, 0xdf2f6bcb, 0xdbee767c, 0xe3a1cbc1, 0xe760d676, - 0xea23f0af, 0xeee2ed18, 0xf0a5bd1d, 0xf464a0aa, 0xf9278673, 0xfde69bc4, - 0x89b8fd09, 0x8d79e0be, 0x803ac667, 0x84fbdbd0, 0x9abc8bd5, 0x9e7d9662, - 0x933eb0bb, 0x97ffad0c, 0xafb010b1, 0xab710d06, 0xa6322bdf, 0xa2f33668, - 0xbcb4666d, 0xb8757bda, 0xb5365d03, 0xb1f740b4}; - -static u_long crc32 (char *data, int len) -{ - register int i; - u_long crc = 0xffffffff; - - for (i=0; i<len; i++) - crc = (crc << 8) ^ crc_table[((crc >> 24) ^ *data++) & 0xff]; - - return crc; -} diff --git a/libdtv/libvdr/COPYING b/libdtv/libvdr/COPYING deleted file mode 100644 index a43ea21..0000000 --- a/libdtv/libvdr/COPYING +++ /dev/null @@ -1,339 +0,0 @@ - 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 - - Appendix: How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - <one line to give the program's name and a brief idea of what it does.> - Copyright (C) 19yy <name of author> - - 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. - -Also add information on how to contact you by electronic and paper mail. - -If the program is interactive, make it output a short notice like this -when it starts in an interactive mode: - - Gnomovision version 69, Copyright (C) 19yy name of author - Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, the commands you use may -be called something other than `show w' and `show c'; they could even be -mouse-clicks or menu items--whatever suits your program. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the program, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the program - `Gnomovision' (which makes passes at compilers) written by James Hacker. - - <signature of Ty Coon>, 1 April 1989 - Ty Coon, President of Vice - -This General Public License does not permit incorporating your program into -proprietary programs. If your program is a subroutine library, you may -consider it more useful to permit linking proprietary applications with the -library. If this is what you want to do, use the GNU Library General -Public License instead of this License. diff --git a/libdtv/libvdr/Makefile b/libdtv/libvdr/Makefile deleted file mode 100644 index 6eebedd..0000000 --- a/libdtv/libvdr/Makefile +++ /dev/null @@ -1,63 +0,0 @@ -############################################################## -### ### -### Makefile: local makefile for libvdr ### -### ### -############################################################## - -## $Revision: 1.3 $ -## $Date: 2001/10/06 15:33:46 $ -## $Author: hakenes $ -## -## (C) 2001 Rolf Hakenes <hakenes@hippomi.de>, under the GNU GPL. -## -## libdtv 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, or (at your option) -## any later version. -## -## libdtv 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 may have received a copy of the GNU General Public License -## along with libdtv; see the file COPYING. If not, write to the -## Free Software Foundation, Inc., 59 Temple Place - Suite 330, -## Boston, MA 02111-1307, USA. -# -# -# -CC ?= gcc -CFLAGS ?= -O2 -g -Wmissing-prototypes -Wstrict-prototypes \ - -Wimplicit -D__USE_FIXED_PROTOTYPES__ # -DDEBUG - -CFLAGS += -I../include - -AR = ar -ARFLAGS = r -RANLIB = ranlib -RM = rm -f -CP = cp - -VDRINCLUDE = libvdr.h -VDRLIB = libvdr.a -VDROBJS = libvdr.o - -all : $(VDRLIB) - -clean : - @echo "cleaning workspace..." - @$(RM) $(VDROBJS) $(VDRLIB) - -new : clean all - -$(VDRLIB) : $(VDROBJS) - @echo "updating library..." - @$(AR) $(ARFLAGS) $(VDRLIB) $(VDROBJS) - @$(RANLIB) $(VDRLIB) - -dist: all - @echo "distributing libvdr.a and libvdr.h..." - @$(CP) $(VDRLIB) ../lib - @$(CP) $(VDRINCLUDE) ../include - diff --git a/libdtv/libvdr/libvdr.c b/libdtv/libvdr/libvdr.c deleted file mode 100644 index 5f90125..0000000 --- a/libdtv/libvdr/libvdr.c +++ /dev/null @@ -1,157 +0,0 @@ -////////////////////////////////////////////////////////////// -/// /// -/// libvdr.c: routines to parse the DVB-SI stream /// -/// /// -////////////////////////////////////////////////////////////// - -// $Revision: 1.1 $ -// $Date: 2001/10/07 10:25:33 $ -// $Author: hakenes $ -// -// (C) 2001 Rolf Hakenes <hakenes@hippomi.de>, under the GNU GPL. -// -// libvdr 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, or (at your option) -// any later version. -// -// libvdr 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 may have received a copy of the GNU General Public License -// along with libvdr; see the file COPYING. If not, write to the -// Free Software Foundation, Inc., 59 Temple Place - Suite 330, -// Boston, MA 02111-1307, USA. - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <unistd.h> -#include <sys/types.h> -#include <sys/stat.h> -#include <sys/ioctl.h> -#include <fcntl.h> - -#include <liblx.h> -#include <libsi.h> -#include <si_tables.h> -#include "libvdr.h" - - - -struct LIST *createVdrProgramInfos (unsigned char *siBuffer) -{ - struct VdrProgramInfo *VdrProgramInfo; - struct LIST *Result, *EventList; - struct Event *Event; - struct Descriptor *Descriptor; - int GotVdrProgramInfo; - - if (!siBuffer) return (NULL); - - if (!(EventList = siParseEIT (siBuffer))) return (NULL); - - Result = xNewList (NULL); - - xForeach (EventList, Event) - { - VdrProgramInfo = NULL; - GotVdrProgramInfo = 0; - - xForeach (Event->Descriptors, Descriptor) - { - if (!VdrProgramInfo) - { - CreateVdrProgramInfo(VdrProgramInfo, - Event->EventID, Event->TransportStreamID, - Event->ServiceID, Event->StartTime, - Event->Duration, Event->Status); - } - - switch (Descriptor->Tag) - { - case DESCR_SHORT_EVENT: - { - if (!xName(Descriptor) || !xName(Descriptor)[0]) - break; - - VdrProgramInfo->ShortName = - xSetText (xName (Descriptor)); - VdrProgramInfo->ShortText = - xSetText (((struct ShortEventDescriptor - *)Descriptor)->Text); - memcpy (VdrProgramInfo->LanguageCode, ((struct - ShortEventDescriptor *)Descriptor)-> - LanguageCode, 4); - GotVdrProgramInfo = 1; - } - break; - - case DESCR_TIME_SHIFTED_EVENT: - { - struct tm *StartTime; - - VdrProgramInfo->ReferenceServiceID = - ((struct TimeShiftedEventDescriptor - *)Descriptor)->ReferenceServiceID; - VdrProgramInfo->ReferenceEventID = - ((struct TimeShiftedEventDescriptor - *)Descriptor)->ReferenceEventID; - GotVdrProgramInfo = 1; - } - break; - - case DESCR_EXTENDED_EVENT: - { - struct ExtendedEventItem *Item; - - if (xName (Descriptor)) - AddToText (xName (Descriptor), - VdrProgramInfo->ExtendedName); - xForeach (((struct ExtendedEventDescriptor*) - Descriptor)->Items, Item) - { - AddItemToText (xName (Item), - VdrProgramInfo->ExtendedText); - AddItemToText (Item->Text, - VdrProgramInfo->ExtendedText); - } - } - break; - - case DESCR_CONTENT: - { - int i, j; - - for (j = 0; j < ((struct ContentDescriptor*) - Descriptor)->Amount; j++) - { - VdrProgramInfo->ContentNibble1 = - GetContentContentNibble1(Descriptor, j); - VdrProgramInfo->ContentNibble2 = - GetContentContentNibble2(Descriptor, j); - } - } - break; - - case DESCR_PARENTAL_RATING: - { - struct ParentalRating *Rating; - - xForeach (((struct ParentalRatingDescriptor *) - Descriptor)->Ratings, Rating) - if (!strncmp (VdrProgramInfo->LanguageCode, - Rating->LanguageCode, 3)) - VdrProgramInfo->Rating = Rating->Rating; - } - break; - } - } - if (GotVdrProgramInfo) xAddTail (Result, VdrProgramInfo); - else xMemFree (VdrProgramInfo); - } - - return (Result); -} diff --git a/libdtv/libvdr/libvdr.h b/libdtv/libvdr/libvdr.h deleted file mode 100644 index 421b2e7..0000000 --- a/libdtv/libvdr/libvdr.h +++ /dev/null @@ -1,111 +0,0 @@ -////////////////////////////////////////////////////////////// -/// /// -/// libvdr.h: definitions necessary for the libvdr package /// -/// /// -////////////////////////////////////////////////////////////// - -// $Revision: 1.4 $ -// $Date: 2001/10/06 15:33:46 $ -// $Author: hakenes $ -// -// (C) 1992-2001 Rolf Hakenes <hakenes@hippomi.de>, under the GNU GPL. -// -// libvdr 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, or (at your option) -// any later version. -// -// libvdr 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 may have received a copy of the GNU General Public License -// along with libvdr; see the file COPYING. If not, write to the -// Free Software Foundation, Inc., 59 Temple Place - Suite 330, -// Boston, MA 02111-1307, USA. - -#ifndef LIBVDR_H -#define LIBVDR_H - -#ifdef __cplusplus -extern "C" { -#endif - -struct LIST *createVdrProgramInfos (unsigned char *); - -#ifdef __cplusplus -} -#endif - -struct VdrProgramInfo { - struct NODE Node; - int EventID; - int TransportStreamID; - int ServiceID; - time_t StartTime; - time_t Duration; - unsigned short Status; - char LanguageCode[4]; - unsigned short Rating; - unsigned short ContentNibble1; - unsigned short ContentNibble2; - char *ShortName; - char *ShortText; - char *ExtendedName; - char *ExtendedText; - int ReferenceServiceID; - int ReferenceEventID; -}; - - -#define CreateVdrProgramInfo(cinf, evid, tpid, svid, stst, dura, sta) \ - do \ - { \ - xCreateNode (cinf, NULL); \ - cinf->EventID = evid; \ - cinf->TransportStreamID = tpid; \ - cinf->ServiceID = svid; \ - cinf->StartTime = stst; \ - cinf->Duration = dura; \ - cinf->Status = sta; \ - cinf->LanguageCode[0] = 0; \ - cinf->Rating = 0; \ - cinf->ContentNibble1 = 0; \ - cinf->ContentNibble2 = 0; \ - cinf->ShortName = NULL; \ - cinf->ShortText = NULL; \ - cinf->ExtendedName = NULL; \ - cinf->ExtendedText = NULL; \ - cinf->ReferenceServiceID = 0; \ - cinf->ReferenceEventID = 0; \ - } while (0) - -#define AddToText(src, dest) \ - do { \ - if (dest) \ - { \ - char *tmbuf; \ - xMemAlloc (strlen (src) + strlen (dest) + 4, &tmbuf); \ - sprintf (tmbuf, "%s%s", (dest), (src)); \ - xMemFree (dest); (dest) = tmbuf; \ - } else { \ - (dest) = xSetText (src); \ - } \ - } while (0) - - -#define AddItemToText(src, dest) \ - do { \ - if (dest) \ - { \ - char *tmbuf; \ - xMemAlloc (strlen (src) + strlen (dest) + 4, &tmbuf); \ - sprintf (tmbuf, "%s|%s", (dest), (src)); \ - xMemFree (dest); (dest) = tmbuf; \ - } else { \ - (dest) = xSetText (src); \ - } \ - } while (0) - -#endif diff --git a/libsi/Makefile b/libsi/Makefile new file mode 100644 index 0000000..613fbee --- /dev/null +++ b/libsi/Makefile @@ -0,0 +1,52 @@ +# +# Makefile for a libsi +# +# $Id: Makefile 1.2 2003/12/13 10:41:39 kls Exp $ + +### The C++ compiler and options: + +CXX ?= g++ +CXXFLAGS ?= -O2 -g -Wall -Woverloaded-virtual +AR = ar +ARFLAGS = ru +RANLIB = ranlib + +### The directory environment: + +INCLUDES += + +DEFINES += + +LIBS += + +### The object files (add further files here): + +OBJS = util.o si.o section.o descriptor.o + +### Implicit rules: + +%.o: %.c + $(CXX) $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) $< + +# Dependencies: + +MAKEDEP = g++ -MM -MG +DEPFILE = .dependencies +$(DEPFILE): Makefile + @$(MAKEDEP) $(DEFINES) $(INCLUDES) $(OBJS:%.o=%.c) > $@ + +-include $(DEPFILE) + +### Targets: + +all: libsi.a + +libsi.a : $(OBJS) + $(AR) $(ARFLAGS) $@ $(OBJS) + +clean: + @-rm -f $(OBJS) $(DEPFILE) *.a *.so *.tgz core* *~ + +dist: + tar cvzf libsi.tar.gz -C .. libsi/util.c libsi/si.c libsi/section.c libsi/descriptor.c \ + libsi/util.h libsi/si.h libsi/section.h libsi/descriptor.h libsi/headers.h libsi/Makefile libsi/gendescr.pl diff --git a/libsi/descriptor.c b/libsi/descriptor.c new file mode 100644 index 0000000..433d680 --- /dev/null +++ b/libsi/descriptor.c @@ -0,0 +1,635 @@ +/*************************************************************************** + * Copyright (c) 2003 by Marcel Wiesweg * + * * + * 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. * + * * + * $Id: descriptor.c 1.2 2003/12/13 10:42:05 kls Exp $ + * * + ***************************************************************************/ + +#include <string.h> +#include "descriptor.h" + +namespace SI { + +void ShortEventDescriptor::Parse() { + unsigned int offset=0; + const descr_short_event *s; + data.setPointerAndOffset<const descr_short_event>(s, offset); + languageCode[0]=s->lang_code1; + languageCode[1]=s->lang_code2; + languageCode[2]=s->lang_code3; + name.setDataAndOffset(data+offset, s->event_name_length, offset); + const descr_short_event_mid *mid; + data.setPointerAndOffset<const descr_short_event_mid>(mid, offset); + text.setData(data+offset, mid->text_length); +} + +int ExtendedEventDescriptor::getDescriptorNumber() { + return s->descriptor_number; +} + +int ExtendedEventDescriptor::getLastDescriptorNumber() { + return s->last_descriptor_number; +} + +void ExtendedEventDescriptor::Parse() { + unsigned int offset=0; + data.setPointerAndOffset<const descr_extended_event>(s, offset); + languageCode[0]=s->lang_code1; + languageCode[1]=s->lang_code2; + languageCode[2]=s->lang_code3; + itemLoop.setDataAndOffset(data+offset, s->length_of_items, offset); + const descr_extended_event_mid *mid; + data.setPointerAndOffset<const descr_extended_event_mid>(mid, offset); + text.setData(data+offset, mid->text_length); +} + +void ExtendedEventDescriptor::Item::Parse() { + unsigned int offset=0; + const item_extended_event *first; + data.setPointerAndOffset<const item_extended_event>(first, offset); + itemDescription.setDataAndOffset(data+offset, first->item_description_length, offset); + const item_extended_event_mid *mid; + data.setPointerAndOffset<const item_extended_event_mid>(mid, offset); + item.setData(data+offset, mid->item_length); +} + +int ExtendedEventDescriptors::getTextLength() { + int ret=0; + for (int i=0;i<length;i++) { + ExtendedEventDescriptor *d=(ExtendedEventDescriptor *)array[i]; + if (!d) + continue; + ret+=d->text.getLength()+1; //plus a blank + ExtendedEventDescriptor::Item item; + for (Loop::Iterator it; d->itemLoop.hasNext(it); ) { + item=d->itemLoop.getNext(it); + ret+=item.item.getLength(); + ret+=item.itemDescription.getLength(); + ret+=2; //the blanks + } + } + return ret; +} + +//is there a case where this function does not return the same as getTextLength? +int ExtendedEventDescriptors::getMaximumTextLength() { + int ret=0; + for (int i=0;i<length;i++) { + ExtendedEventDescriptor *d=(ExtendedEventDescriptor *)array[i]; + if (!d) + continue; + ret+=d->text.getLength()+1; //plus a blank + ret+=d->itemLoop.getLength(); + } + return ret; +} + +char *ExtendedEventDescriptors::getText() { + char *text=new char[getMaximumTextLength()]; + return getText(text); +} + +//appends the Strings of every Descriptor in the group +char *ExtendedEventDescriptors::getText(char *buffer) { + int index=0, len; + char tempbuf[256]; + for (int i=0;i<length;i++) { + ExtendedEventDescriptor *d=(ExtendedEventDescriptor *)array[i]; + if (!d) + continue; + d->text.getText(tempbuf); + len=strlen(tempbuf); + if (len) { + memcpy(buffer+index, tempbuf, len); + index+=len; + } + + ExtendedEventDescriptor::Item item; + for (Loop::Iterator it; d->itemLoop.hasNext(it); ) { + item=d->itemLoop.getNext(it); + + item.item.getText(tempbuf); + len=strlen(tempbuf); + if (len) { + memcpy(buffer+index, tempbuf, len); + index+=len; + } + + item.itemDescription.getText(tempbuf); + len=strlen(tempbuf); + if (len) { + memcpy(buffer+index, tempbuf, len); + index+=len; + } + } + } + buffer[index]='\0'; + return buffer; +} + +int TimeShiftedEventDescriptor::getReferenceServiceId() const { + return HILO(s->reference_service_id); +} + +int TimeShiftedEventDescriptor::getReferenceEventId() const { + return HILO(s->reference_event_id); +} + +void TimeShiftedEventDescriptor::Parse() { + s=data.getData<const descr_time_shifted_event>(); +} + +void ContentDescriptor::Parse() { + //this descriptor is only a header and a loop + nibbleLoop.setData(data+sizeof(SectionHeader), getLength()-sizeof(SectionHeader)); +} + +int ContentDescriptor::Nibble::getContentNibbleLevel1() const { + return s->content_nibble_level_1; +} + +int ContentDescriptor::Nibble::getContentNibbleLevel2() const { + return s->content_nibble_level_2; +} + +int ContentDescriptor::Nibble::getUserNibble1() const { + return s->user_nibble_1; +} + +int ContentDescriptor::Nibble::getUserNibble2() const { + return s->user_nibble_2; +} + +void ContentDescriptor::Nibble::Parse() { + s=data.getData<const nibble_content>(); +} + +void ParentalRatingDescriptor::Parse() { + //this descriptor is only a header and a loop + ratingLoop.setData(data+sizeof(SectionHeader), getLength()-sizeof(SectionHeader)); +} + +int ParentalRatingDescriptor::Rating::getRating() const { + return s->rating; +} + +void ParentalRatingDescriptor::Rating::Parse() { + s=data.getData<const parental_rating>(); + languageCode[0]=s->lang_code1; + languageCode[1]=s->lang_code2; + languageCode[2]=s->lang_code3; +} + +int CaDescriptor::getCaType() const { + return HILO(s->CA_type); +} + +int CaDescriptor::getCaPid() const { + return HILO(s->CA_PID); +} + +void CaDescriptor::Parse() { + unsigned int offset=0; + data.setPointerAndOffset<const descr_ca>(s, offset); + privateData.assign(data.getData(offset), getLength()-offset); +} + +int StreamIdentifierDescriptor::getComponentTag() const { + return s->component_tag; +} + +void StreamIdentifierDescriptor::Parse() { + s=data.getData<const descr_stream_identifier>(); +} + +void NetworkNameDescriptor::Parse() { + name.setData(data+sizeof(descr_network_name), getLength()-sizeof(descr_network_name)); +} + +void CaIdentifierDescriptor::Parse() { + identifiers.setData(data+sizeof(descr_ca_identifier), getLength()-sizeof(descr_ca_identifier)); +} + +int CarouselIdentifierDescriptor::getCarouselId() const { + return (HILO(s->carousel_id_hi) << 16) | HILO(s->carousel_id_lo); +} + +int CarouselIdentifierDescriptor::getFormatId() const { + return s->FormatId; +} + +void CarouselIdentifierDescriptor::Parse() { + s=data.getData<const descr_carousel_identifier>(); +} + +void ServiceListDescriptor::Parse() { + serviceLoop.setData(data+sizeof(descr_service_list), getLength()-sizeof(descr_service_list)); +} + +int ServiceListDescriptor::Service::getServiceId() const { + return HILO(s->service_id); +} + +int ServiceListDescriptor::Service::getServiceType() const { + return s->service_type; +} + +void ServiceListDescriptor::Service::Parse() { + s=data.getData<const descr_service_list_loop>(); +} + +int SatelliteDeliverySystemDescriptor::getFrequency() const { + return (HILO(s->frequency_hi) << 16) | HILO(s->frequency_lo); +} + +int SatelliteDeliverySystemDescriptor::getOrbitalPosition() const { + return HILO(s->orbital_position); +} + +int SatelliteDeliverySystemDescriptor::getWestEastFlag() const { + return s->west_east_flag; +} + +int SatelliteDeliverySystemDescriptor::getPolarization() const { + return s->polarization; +} + +int SatelliteDeliverySystemDescriptor::getModulation() const { + return s->modulation; +} + +int SatelliteDeliverySystemDescriptor::getSymbolRate() const { + return (HILO(s->symbol_rate_hi) << 12) | (s->symbol_rate_lo_1 << 4) | s->symbol_rate_lo_2; +} + +int SatelliteDeliverySystemDescriptor::getFecInner() const { + return s->fec_inner; +} + +void SatelliteDeliverySystemDescriptor::Parse() { + s=data.getData<const descr_satellite_delivery_system>(); +} + +int CableDeliverySystemDescriptor::getFrequency() const { + return (HILO(s->frequency_hi) << 16) | HILO(s->frequency_lo); +} + +int CableDeliverySystemDescriptor::getFecOuter() const { + return s->fec_outer; +} + +int CableDeliverySystemDescriptor::getModulation() const { + return s->modulation; +} + +int CableDeliverySystemDescriptor::getSymbolRate() const { + return (HILO(s->symbol_rate_hi) << 12) | (s->symbol_rate_lo_1 << 4) | s->symbol_rate_lo_2; +} + +int CableDeliverySystemDescriptor::getFecInner() const { + return s->fec_inner; +} + +void CableDeliverySystemDescriptor::Parse() { + s=data.getData<const descr_cable_delivery_system>(); +} + +int TerrestrialDeliverySystemDescriptor::getFrequency() const { + return (HILO(s->frequency_hi) << 16) | HILO(s->frequency_lo); +} + +int TerrestrialDeliverySystemDescriptor::getBandwidth() const { + return s->bandwidth; +} + +int TerrestrialDeliverySystemDescriptor::getConstellation() const { + return s->constellation; +} + +int TerrestrialDeliverySystemDescriptor::getHierarchy() const { + return s->hierarchy; +} + +int TerrestrialDeliverySystemDescriptor::getCodeRateHP() const { + return s->code_rate_HP; +} + +int TerrestrialDeliverySystemDescriptor::getCodeRateLP() const { + return s->code_rate_LP; +} + +int TerrestrialDeliverySystemDescriptor::getGuardInterval() const { + return s->guard_interval; +} + +int TerrestrialDeliverySystemDescriptor::getTransmissionMode() const { + return s->transmission_mode; +} + +bool TerrestrialDeliverySystemDescriptor::getOtherFrequency() const { + return s->other_frequency_flag; +} + +void TerrestrialDeliverySystemDescriptor::Parse() { + s=data.getData<const descr_terrestrial_delivery>(); +} + +int ServiceDescriptor::getServiceType() const { + return s->service_type; +} + +void ServiceDescriptor::Parse() { + unsigned int offset=0; + data.setPointerAndOffset<const descr_service>(s, offset); + providerName.setDataAndOffset(data+offset, s->provider_name_length, offset); + const descr_service_mid *mid; + data.setPointerAndOffset<const descr_service_mid>(mid, offset); + serviceName.setData(data+offset, mid->service_name_length); +} + +void NVODReferenceDescriptor::Parse() { + serviceLoop.setData(data+sizeof(descr_nvod_reference), getLength()-sizeof(descr_nvod_reference)); +} + +int NVODReferenceDescriptor::Service::getTransportStream() const { + return HILO(s->transport_stream_id); +} + +int NVODReferenceDescriptor::Service::getOriginalNetworkId() const { + return HILO(s->original_network_id); +} + +int NVODReferenceDescriptor::Service::getServiceId() const { + return HILO(s->service_id); +} + +void NVODReferenceDescriptor::Service::Parse() { + s=data.getData<const item_nvod_reference>(); +} + +int TimeShiftedServiceDescriptor::getReferenceServiceId() const { + return HILO(s->reference_service_id); +} + +void TimeShiftedServiceDescriptor::Parse() { + s=data.getData<const descr_time_shifted_service>(); +} + +int ComponentDescriptor::getStreamContent() const { + return s->stream_content; +} + +int ComponentDescriptor::getComponentType() const { + return s->component_type; +} + +int ComponentDescriptor::getComponentTag() const { + return s->component_tag; +} + +void ComponentDescriptor::Parse() { + unsigned int offset=0; + data.setPointerAndOffset<const descr_component>(s, offset); + languageCode[0]=s->lang_code1; + languageCode[1]=s->lang_code2; + languageCode[2]=s->lang_code3; + description.setData(data+offset, getLength()-offset); +} + +void SubtitlingDescriptor::Parse() { + subtitlingLoop.setData(data+sizeof(descr_subtitling), getLength()-sizeof(descr_subtitling)); +} + +int SubtitlingDescriptor::Subtitling::getSubtitlingType() const { + return s->subtitling_type; +} + +int SubtitlingDescriptor::Subtitling::getCompositionPageId() const { + return HILO(s->composition_page_id); +} + +int SubtitlingDescriptor::Subtitling::getAncillaryPageId() const { + return HILO(s->ancillary_page_id); +} + +void SubtitlingDescriptor::Subtitling::Parse() { + s=data.getData<const item_subtitling>(); +} + +int ServiceMoveDescriptor::getNewOriginalNetworkId() const { + return HILO(s->new_original_network_id); +} + +int ServiceMoveDescriptor::getNewTransportStreamId() const { + return HILO(s->new_transport_stream_id); +} + +int ServiceMoveDescriptor::getNewServiceId() const { + return HILO(s->new_service_id); +} + +void ServiceMoveDescriptor::Parse() { + s=data.getData<const descr_service_move>(); +} + +int FrequencyListDescriptor::getCodingType() const { + return s->coding_type; +} + +void FrequencyListDescriptor::Parse() { + unsigned int offset=0; + data.setPointerAndOffset<const descr_frequency_list>(s, offset); + frequencies.setData(data+offset, getLength()-offset); +} + +void ServiceIdentifierDescriptor::Parse() { + textualServiceIdentifier.setData(data+sizeof(descr_service_identifier), getLength()-sizeof(descr_service_identifier)); +} + +void MultilingualNameDescriptor::Parse() { + nameLoop.setData(data+sizeof(descr_multilingual_network_name), getLength()-sizeof(descr_multilingual_network_name)); +} + +void MultilingualNameDescriptor::Name::Parse() { + unsigned int offset=0; + const entry_multilingual_name *s; + data.setPointerAndOffset<const entry_multilingual_name>(s, offset); + languageCode[0]=s->lang_code1; + languageCode[1]=s->lang_code2; + languageCode[2]=s->lang_code3; + name.setData(data+offset, s->text_length); +} + +int MultilingualComponentDescriptor::getComponentTag() const { + return s->component_tag; +} + +void MultilingualComponentDescriptor::Parse() { + unsigned int offset=0; + data.setPointerAndOffset<const descr_multilingual_component>(s, offset); + nameLoop.setData(data+sizeof(descr_multilingual_component), getLength()-sizeof(descr_multilingual_component)); +} + +void MultilingualServiceNameDescriptor::Parse() { + nameLoop.setData(data+sizeof(descr_multilingual_network_name), getLength()-sizeof(descr_multilingual_network_name)); +} + +void MultilingualServiceNameDescriptor::Name::Parse() { + unsigned int offset=0; + const entry_multilingual_name *s; + data.setPointerAndOffset<const entry_multilingual_name>(s, offset); + languageCode[0]=s->lang_code1; + languageCode[1]=s->lang_code2; + languageCode[2]=s->lang_code3; + providerName.setDataAndOffset(data+offset, s->text_length, offset); + const entry_multilingual_service_name_mid *mid; + data.setPointerAndOffset<const entry_multilingual_service_name_mid>(mid, offset); + name.setData(data+offset, mid->service_name_length); +} + +void ApplicationSignallingDescriptor::Parse() { + entryLoop.setData(data+sizeof(descr_application_signalling), getLength()-sizeof(descr_application_signalling)); +} + +int ApplicationSignallingDescriptor::ApplicationEntryDescriptor::getApplicationType() const { + return HILO(s->application_type); +} + +int ApplicationSignallingDescriptor::ApplicationEntryDescriptor::getAITVersionNumber() const { + return s->AIT_version_number; +} + +void ApplicationSignallingDescriptor::ApplicationEntryDescriptor::Parse() { + s=data.getData<const application_signalling_entry>(); +} + +bool MHP_ApplicationDescriptor::isServiceBound() const { + return s->service_bound_flag; +} + +int MHP_ApplicationDescriptor::getVisibility() const { + return s->visibility; +} + +int MHP_ApplicationDescriptor::getApplicationPriority() const { + return s->application_priority; +} + +void MHP_ApplicationDescriptor::Parse() { + unsigned int offset=0; + const descr_application *dapp; + data.setPointerAndOffset<const descr_application>(dapp, offset); + profileLoop.setDataAndOffset(data+offset, dapp->application_profiles_length, offset); + data.setPointerAndOffset<const descr_application_end>(s, offset); + transportProtocolLabels.setData(data+offset, getLength()-offset); +} + +int MHP_ApplicationDescriptor::Profile::getApplicationProfile() const { + return HILO(s->application_profile); +} + +int MHP_ApplicationDescriptor::Profile::getVersionMajor() const { + return s->version_major; +} + +int MHP_ApplicationDescriptor::Profile::getVersionMinor() const { + return s->version_minor; +} + +int MHP_ApplicationDescriptor::Profile::getVersionMicro() const { + return s->version_micro; +} + +void MHP_ApplicationDescriptor::Profile::Parse() { + s=data.getData<application_profile_entry>(); +} + +void MHP_ApplicationNameDescriptor::Parse() { + nameLoop.setData(data+sizeof(descr_application_name), getLength()-sizeof(descr_application_name)); +} + +void MHP_ApplicationNameDescriptor::NameEntry::Parse() { + const descr_application_name_entry *s; + s=data.getData<const descr_application_name_entry>(); + name.setData(data+sizeof(descr_application_name_entry), s->application_name_length); + languageCode[0]=s->lang_code1; + languageCode[1]=s->lang_code2; + languageCode[2]=s->lang_code3; +} + +int MHP_TransportProtocolDescriptor::getProtocolId() const { + return HILO(s->protocol_id); +} + +int MHP_TransportProtocolDescriptor::getProtocolLabel() const { + return s->transport_protocol_label; +} + +bool MHP_TransportProtocolDescriptor::isRemote() const { + return remote; +} + +int MHP_TransportProtocolDescriptor::getComponentTag() const { + return componentTag; +} + +void MHP_TransportProtocolDescriptor::Parse() { + unsigned int offset=0; + data.setPointerAndOffset<const descr_transport_protocol>(s, offset); + if (getProtocolId() == ObjectCarousel) { + const transport_via_oc *oc; + data.setPointerAndOffset<const transport_via_oc>(oc, offset); + remote=oc->remote; + if (remote) { + const transport_via_oc_remote_end *rem; + data.setPointerAndOffset<const transport_via_oc_remote_end>(rem, offset); + componentTag=rem->component_tag; + } else { + const transport_via_oc_end *rem; + data.setPointerAndOffset<const transport_via_oc_end>(rem, offset); + componentTag=rem->component_tag; + } + } else { //unimplemented + remote=false; + componentTag=-1; + } +} + +void MHP_DVBJApplicationDescriptor::Parse() { + applicationLoop.setData(data+sizeof(descr_dvbj_application), getLength()-sizeof(descr_dvbj_application)); +} + +void MHP_DVBJApplicationDescriptor::ApplicationEntry::Parse() { + const descr_dvbj_application_entry *entry=data.getData<const descr_dvbj_application_entry>(); + parameter.setData(data+sizeof(descr_dvbj_application_entry), entry->parameter_length); +} + +void MHP_DVBJApplicationLocationDescriptor::Parse() { + unsigned int offset=0; + const descr_dvbj_application_location *first; + data.setPointerAndOffset<const descr_dvbj_application_location>(first, offset); + baseDirectory.setDataAndOffset(data+offset, first->base_directory_length, offset); + const descr_dvbj_application_location_mid *mid; + data.setPointerAndOffset<const descr_dvbj_application_location_mid>(mid, offset); + classPath.setDataAndOffset(data+offset, mid->classpath_extension_length, offset); + initialClass.setData(data+offset, getLength()-offset); +} + +int MHP_ApplicationIconsDescriptor::getIconFlags() const { + return HILO(s->icon_flags); +} + +void MHP_ApplicationIconsDescriptor::Parse() { + unsigned int offset=0; + const descr_application_icons_descriptor *first; + data.setPointerAndOffset<const descr_application_icons_descriptor>(first, offset); + iconLocator.setDataAndOffset(data+offset, first->icon_locator_length, offset); + data.setPointerAndOffset<const descr_application_icons_descriptor_end>(s, offset); +} + +} //end of namespace diff --git a/libsi/descriptor.h b/libsi/descriptor.h new file mode 100644 index 0000000..9abe1f0 --- /dev/null +++ b/libsi/descriptor.h @@ -0,0 +1,477 @@ +/*************************************************************************** + * Copyright (c) 2003 by Marcel Wiesweg * + * * + * 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. * + * * + * $Id: descriptor.h 1.2 2003/12/13 10:42:08 kls Exp $ + * * + ***************************************************************************/ + +#ifndef LIBSI_DESCRIPTOR_H +#define LIBSI_DESCRIPTOR_H + +#include "si.h" +#include "headers.h" + +namespace SI { + +class ShortEventDescriptor : public Descriptor { +public: + char languageCode[3]; + String name; //name of the event + String text; //short description +protected: + virtual void Parse(); +}; + +class ExtendedEventDescriptor : public GroupDescriptor { +public: + class Item : public LoopElement { + public: + virtual int getLength() { return sizeof(item_extended_event)+sizeof(item_extended_event_mid)+item.getLength()+itemDescription.getLength(); } + String item; + String itemDescription; + protected: + virtual void Parse(); + }; + char languageCode[3]; + int getDescriptorNumber(); + int getLastDescriptorNumber(); + StructureLoop<Item> itemLoop; + String text; +protected: + virtual void Parse(); +private: + const descr_extended_event *s; +}; + +class ExtendedEventDescriptors : public DescriptorGroup { +public: + //don't use + int getTextLength(); + //really fast + int getMaximumTextLength(); + //same semantics as with SI::String + char *getText(); + //buffer must at least be getTextLength(), getMaximumTextLength() is a good choice + char *getText(char *buffer); +}; + +class TimeShiftedEventDescriptor : public Descriptor { +public: + int getReferenceServiceId() const; + int getReferenceEventId() const; +protected: + virtual void Parse(); +private: + const descr_time_shifted_event *s; +}; + +class ContentDescriptor : public Descriptor { +public: + class Nibble : public LoopElement { + public: + virtual int getLength() { return sizeof(nibble_content); } + int getContentNibbleLevel1() const; + int getContentNibbleLevel2() const; + int getUserNibble1() const; + int getUserNibble2() const; + protected: + virtual void Parse(); + private: + const nibble_content *s; + }; + StructureLoop<Nibble> nibbleLoop; +protected: + virtual void Parse(); +}; + +class ParentalRatingDescriptor : public Descriptor { +public: + class Rating : public LoopElement { + public: + char languageCode[3]; + int getRating() const; + virtual int getLength() { return sizeof(parental_rating); } + protected: + virtual void Parse(); + private: + const parental_rating *s; + }; + StructureLoop<Rating> ratingLoop; +protected: + virtual void Parse(); +}; + +class CaDescriptor : public Descriptor { +public: + int getCaType() const; + int getCaPid() const; + CharArray privateData; +protected: + virtual void Parse(); +private: + const descr_ca *s; +}; + +class StreamIdentifierDescriptor : public Descriptor { +public: + int getComponentTag() const; +protected: + virtual void Parse(); +private: + const descr_stream_identifier *s; +}; + +class NetworkNameDescriptor : public Descriptor { +public: + String name; +protected: + virtual void Parse(); +}; + +class CaIdentifierDescriptor : public Descriptor { +public: + TypeLoop<SixteenBit> identifiers; +protected: + virtual void Parse(); +}; + +class CarouselIdentifierDescriptor : public Descriptor { +public: + int getCarouselId() const; + int getFormatId() const; +protected: + virtual void Parse(); +private: + const descr_carousel_identifier *s; +}; + +class BouquetNameDescriptor : public NetworkNameDescriptor { +}; + +class ServiceListDescriptor : public Descriptor { +public: + class Service : public LoopElement { + public: + int getServiceId() const; + int getServiceType() const; + virtual int getLength() { return sizeof(descr_service_list_loop); } + protected: + virtual void Parse(); + private: + const descr_service_list_loop *s; + }; + StructureLoop<Service> serviceLoop; +protected: + virtual void Parse(); +}; + +class SatelliteDeliverySystemDescriptor : public Descriptor { +public: + int getFrequency() const; + int getOrbitalPosition() const; + int getWestEastFlag() const; + int getPolarization() const; + int getModulation() const; + int getSymbolRate() const; + int getFecInner() const; +protected: + virtual void Parse(); +private: + const descr_satellite_delivery_system *s; +}; + +class CableDeliverySystemDescriptor : public Descriptor { +public: + int getFrequency() const; + int getFecOuter() const; + int getModulation() const; + int getSymbolRate() const; + int getFecInner() const; +protected: + virtual void Parse(); +private: + const descr_cable_delivery_system *s; +}; + +class TerrestrialDeliverySystemDescriptor : public Descriptor { +public: + int getFrequency() const; + int getBandwidth() const; + int getConstellation() const; + int getHierarchy() const; + int getCodeRateHP() const; + int getCodeRateLP() const; + int getGuardInterval() const; + int getTransmissionMode() const; + bool getOtherFrequency() const; +protected: + virtual void Parse(); +private: + const descr_terrestrial_delivery *s; +}; + +class ServiceDescriptor : public Descriptor { +public: + int getServiceType() const; + String serviceName; + String providerName; +protected: + virtual void Parse(); +private: + const descr_service *s; +}; + +class NVODReferenceDescriptor : public Descriptor { +public: + class Service : public LoopElement { + public: + int getTransportStream() const; + int getOriginalNetworkId() const; + int getServiceId() const; + virtual int getLength() { return sizeof(item_nvod_reference); } + protected: + virtual void Parse(); + private: + const item_nvod_reference *s; + }; + StructureLoop<Service> serviceLoop; +protected: + virtual void Parse(); +}; + +class TimeShiftedServiceDescriptor : public Descriptor { +public: + int getReferenceServiceId() const; +protected: + virtual void Parse(); +private: + const descr_time_shifted_service *s; +}; + +class ComponentDescriptor : public Descriptor { +public: + int getStreamContent() const; + int getComponentType() const; + int getComponentTag() const; + char languageCode[3]; + String description; +protected: + virtual void Parse(); +private: + const descr_component *s; +}; + +class SubtitlingDescriptor : public Descriptor { +public: + class Subtitling : public Descriptor { + public: + int getSubtitlingType() const; + int getCompositionPageId() const; + int getAncillaryPageId() const; + virtual int getLength() { return sizeof(item_nvod_reference); } + protected: + virtual void Parse(); + private: + const item_subtitling *s; + }; + StructureLoop<Subtitling> subtitlingLoop; +protected: + virtual void Parse(); +}; + +class ServiceMoveDescriptor : public Descriptor { +public: + int getNewOriginalNetworkId() const; + int getNewTransportStreamId() const; + int getNewServiceId() const; +protected: + virtual void Parse(); +private: + const descr_service_move *s; +}; + +class FrequencyListDescriptor : public Descriptor { +public: + int getCodingType() const; + TypeLoop<ThirtyTwoBit> frequencies; +protected: + virtual void Parse(); +private: + const descr_frequency_list *s; +}; + +class ServiceIdentifierDescriptor : public Descriptor { +public: + String textualServiceIdentifier; +protected: + virtual void Parse(); +}; + +//abstract base class +class MultilingualNameDescriptor : public Descriptor { +public: + class Name : public LoopElement { + public: + char languageCode[3]; + String name; + virtual int getLength() { return sizeof(entry_multilingual_name)+name.getLength(); } + protected: + virtual void Parse(); + }; + StructureLoop<Name> nameLoop; +protected: + virtual void Parse(); +}; + +class MultilingualNetworkNameDescriptor : public MultilingualNameDescriptor { + //inherits nameLoop from MultilingualNameDescriptor +}; + +class MultilingualBouquetNameDescriptor : public MultilingualNameDescriptor { + //inherits nameLoop from MultilingualNameDescriptor +}; + +class MultilingualComponentDescriptor : public MultilingualNameDescriptor { +public: + int getComponentTag() const; + //inherits nameLoop from MultilingualNameDescriptor +protected: + virtual void Parse(); +private: + const descr_multilingual_component *s; +}; + +class MultilingualServiceNameDescriptor : public Descriptor { +public: + class Name : public MultilingualNameDescriptor::Name { + public: + virtual int getLength() { return sizeof(entry_multilingual_name)+providerName.getLength()+sizeof(entry_multilingual_service_name_mid)+name.getLength(); } + String providerName; + //inherits name, meaning: service name; + protected: + virtual void Parse(); + }; + StructureLoop<Name> nameLoop; +protected: + virtual void Parse(); +}; + +//a descriptor currently unimplemented in this library +class UnimplementedDescriptor : public Descriptor { +protected: + virtual void Parse() {} +}; + +class ApplicationSignallingDescriptor : public Descriptor { +public: + class ApplicationEntryDescriptor : public LoopElement { + public: + virtual int getLength() { return sizeof(application_signalling_entry); } + int getApplicationType() const; + int getAITVersionNumber() const; + protected: + virtual void Parse(); + private: + const application_signalling_entry *s; + }; + StructureLoop<ApplicationEntryDescriptor> entryLoop; +protected: + virtual void Parse(); +}; + +class MHP_ApplicationDescriptor : public Descriptor { +public: + class Profile : public LoopElement { + public: + virtual int getLength() { return sizeof(application_profile_entry); } + int getApplicationProfile() const; + int getVersionMajor() const; + int getVersionMinor() const; + int getVersionMicro() const; + private: + const application_profile_entry *s; + protected: + virtual void Parse(); + }; + StructureLoop<Profile> profileLoop; + bool isServiceBound() const; + int getVisibility() const; + int getApplicationPriority() const; + TypeLoop<EightBit> transportProtocolLabels; +private: + const descr_application_end *s; +protected: + virtual void Parse(); +}; + +class MHP_ApplicationNameDescriptor : public Descriptor { +public: + class NameEntry : public LoopElement { + public: + virtual int getLength() { return sizeof(descr_application_name_entry)+name.getLength(); } + char languageCode[3]; + String name; + protected: + virtual void Parse(); + }; + StructureLoop<NameEntry> nameLoop; +protected: + virtual void Parse(); +}; + +class MHP_TransportProtocolDescriptor : public Descriptor { +public: + enum Protocol { ObjectCarousel = 0x01, IPviaDVB = 0x02, HTTPoverInteractionChannel = 0x03 }; + int getProtocolId() const; + int getProtocolLabel() const; + bool isRemote() const; + int getComponentTag() const; +protected: + virtual void Parse(); +private: + const descr_transport_protocol *s; + bool remote; + int componentTag; +}; + +class MHP_DVBJApplicationDescriptor : public Descriptor { +public: + class ApplicationEntry : public LoopElement { + public: + virtual int getLength() { return sizeof(descr_dvbj_application_entry)+parameter.getLength(); } + String parameter; + protected: + virtual void Parse(); + }; + StructureLoop<ApplicationEntry> applicationLoop; +protected: + virtual void Parse(); +}; + +class MHP_DVBJApplicationLocationDescriptor : public Descriptor { +public: + String baseDirectory; + String classPath; + String initialClass; +protected: + virtual void Parse(); +}; + +class MHP_ApplicationIconsDescriptor : public Descriptor { +public: + String iconLocator; + int getIconFlags() const; +protected: + virtual void Parse(); +private: + const descr_application_icons_descriptor_end *s; +}; + +} //end of namespace + +#endif //LIBSI_TABLE_H diff --git a/libsi/gendescr.pl b/libsi/gendescr.pl new file mode 100755 index 0000000..e2b206f --- /dev/null +++ b/libsi/gendescr.pl @@ -0,0 +1,83 @@ +#!/usr/bin/perl + +# $Id: gendescr.pl 1.2 2003/12/13 10:40:53 kls Exp $ + +print "Name (ohne ...Descriptor):"; +$name=<STDIN>; +$name =~ s/\n$//; +$inner = ($name =~ s/ä$//); +$name .= "Descriptor" unless ($inner); + +print "Struct:"; +$struct=<STDIN>; +$struct =~ s/\n$//; + +mm: +$index=0; +$which=1; +print "Variablen:"; +while ( <STDIN> ) { + if (/ä/) { + goto vv; + } elsif (/ü/) { + $which=1; + next; + } + $eingabe=$_; + $eingabe =~ s/(.{75,120} )/\1\n/g; + $eingabe =~ s/\n$//; + if ($which) { + $members[$index]=$eingabe; + } else { + $members_comments[$index]=$eingabe; + $index++; + print "Jep!\n"; + } + $which= (! $which); +} + +vv: +$filename_h="tempdescr.h"; +$filename_c="tempdescr.c"; +schreib(); + +sub schreib { + print "Danke.\n"; + open(OUTPUT_H, ">>".$filename_h) or die "Could not open file!!"; + open(OUTPUT_C, ">>".$filename_c) or die "Could not open file!!"; + + if ($inner) { + $offset=" "; + } else { + $offset=""; + } + print(OUTPUT_H $offset."class ".$name); + if ($inner) { + print(OUTPUT_H " : public LoopElement {\n".$offset."public:"); + } else { + print(OUTPUT_H " : public Descriptor {\n".$offset."public:"); + } + #for ($i=0; $i<=$#vars;$i++) { + # print (OUTPUT "/*\n".$vars_comments[$i]." */\n".$vars[$i].";\n\n\n"); + #} + for ($i=0; $i<=$#members;$i++) { + print (OUTPUT_H "\n".$offset." int get".$members[$i]."() const;"); + } + print(OUTPUT_H "\n".$offset."virtual int getLength() { return sizeof(".$struct."); }") if ($inner); + + print(OUTPUT_H "\n".$offset."protected:\n".$offset." virtual void Parse();"); + print(OUTPUT_H "\n".$offset."private:\n".$offset." const ".$struct." *s;") if ($struct ne ""); + print(OUTPUT_H "\n".$offset."};\n\n"); + for ($i=0; $i<=$#members_comments;$i++) { + print (OUTPUT_C "int ".$name."::get".$members[$i]."() const {\n"); + if ($members_comments[$i] =~ /^(.+)_hi$/) { + $varbase=$1; + print (OUTPUT_C " return HILO(s->".$varbase.");\n}\n\n"); + } else { + print (OUTPUT_C " return s->".$members_comments[$i].";\n}\n\n"); + } + } + print (OUTPUT_C "void ".$name."::Parse() {\n}\n\n"); + print (OUTPUT_C "\n\n\n"); + exit; +} diff --git a/libdtv/libsi/include/si_tables.h b/libsi/headers.h index 24c316d..d5c1199 100644 --- a/libdtv/libsi/include/si_tables.h +++ b/libsi/headers.h @@ -1,55 +1,73 @@ -////////////////////////////////////////////////////////////// -/// /// -/// si_tables.h: definitions for data structures of the /// -/// incoming SI data stream /// -/// /// -////////////////////////////////////////////////////////////// - -// $Revision: 1.4 $ -// $Date: 2003/02/04 18:45:36 $ -// $Author: hakenes $ -// -// (C) 2001-03 Rolf Hakenes <hakenes@hippomi.de>, under the -// GNU GPL with contribution of Oleg Assovski, -// www.satmania.com -// -// libsi 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, or (at your option) -// any later version. -// -// libsi 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 may have received a copy of the GNU General Public License -// along with libsi; see the file COPYING. If not, write to the -// Free Software Foundation, Inc., 59 Temple Place - Suite 330, -// Boston, MA 02111-1307, USA. - -#define HILO(x) (x##_hi << 8 | x##_lo) - -#define MjdToEpochTime(x) (((x##_hi << 8 | x##_lo)-40587)*86400) -#define BcdTimeToSeconds(x) ((3600 * ((10*((x##_h & 0xF0)>>4)) + (x##_h & 0xF))) + \ - (60 * ((10*((x##_m & 0xF0)>>4)) + (x##_m & 0xF))) + \ - ((10*((x##_s & 0xF0)>>4)) + (x##_s & 0xF))) -#define BcdTimeToMinutes(x) ((60 * ((10*((x##_h & 0xF0)>>4)) + (x##_h & 0xF))) + \ - (((10*((x##_m & 0xF0)>>4)) + (x##_m & 0xF)))) -#define BcdCharToInt(x) (10*((x & 0xF0)>>4) + (x & 0xF)) -#define CheckBcdChar(x) ((((x & 0xF0)>>4) <= 9) && \ - ((x & 0x0F) <= 9)) -#define CheckBcdSignedChar(x) ((((x & 0xF0)>>4) >= 0) && (((x & 0xF0)>>4) <= 9) && \ - ((x & 0x0F) >= 0) && ((x & 0x0F) <= 9)) - -#define TableHasMoreSections(x) (((pat_t *)(x))->last_section_number > ((pat_t *)(x))->section_number) -#define GetTableId(x) ((pat_t *)(x))->table_id -#define GetSectionNumber(x) ((pat_t *)(x))->section_number -#define GetLastSectionNumber(x) ((pat_t *)(x))->last_section_number -#define GetServiceId(x) (((eit_t *)(x))->service_id_hi << 8) | ((eit_t *)(x))->service_id_lo -#define GetSegmentLastSectionNumber(x) ((eit_t *)(x))->segment_last_section_number -#define GetLastTableId(x) ((eit_t *)(x))->segment_last_table_id -#define GetSectionLength(x) HILO(((pat_t *)(x))->section_length) +/*************************************************************************** + * * + * (C) 2001-03 Rolf Hakenes <hakenes@hippomi.de>, under the * + * GNU GPL with contribution of Oleg Assovski, * + * www.satmania.com * + * Adapted and extended by Marcel Wiesweg * + * * + * 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. * + * * + * $Id: headers.h 1.2 2003/12/13 10:43:26 kls Exp $ + * * + ***************************************************************************/ + +#ifndef LIBSI_HEADERS_H +#define LIBSI_HEADERS_H + +#include <endian.h> + +namespace SI { + +typedef unsigned char u_char; + +struct SectionHeader { + u_char table_id :8; +#if BYTE_ORDER == BIG_ENDIAN + u_char section_syntax_indicator :1; + u_char :3; + u_char section_length_hi :4; +#else + u_char section_length_hi :4; + u_char :3; + u_char section_syntax_indicator :1; +#endif + u_char section_length_lo :8; +}; + +struct ExtendedSectionHeader { + u_char table_id :8; +#if BYTE_ORDER == BIG_ENDIAN + u_char section_syntax_indicator :1; + u_char :3; + u_char section_length_hi :4; +#else + u_char section_length_hi :4; + u_char :3; + u_char section_syntax_indicator :1; +#endif + u_char section_length_lo :8; + u_char table_id_extension_hi :8; + u_char table_id_extension_lo :8; +#if BYTE_ORDER == BIG_ENDIAN + u_char :2; + u_char version_number :5; + u_char current_next_indicator :1; +#else + u_char current_next_indicator :1; + u_char version_number :5; + u_char :2; +#endif + u_char section_number :8; + u_char last_section_number :8; +}; + +struct DescriptorHeader { + u_char descriptor_tag :8; + u_char descriptor_length :8; +}; /* * @@ -70,7 +88,7 @@ #define PAT_LEN 8 -typedef struct { +struct pat { u_char table_id :8; #if BYTE_ORDER == BIG_ENDIAN u_char section_syntax_indicator :1; @@ -97,11 +115,11 @@ typedef struct { #endif u_char section_number :8; u_char last_section_number :8; -} pat_t; +}; #define PAT_PROG_LEN 4 -typedef struct { +struct pat_prog { u_char program_number_hi :8; u_char program_number_lo :8; #if BYTE_ORDER == BIG_ENDIAN @@ -111,9 +129,9 @@ typedef struct { u_char network_pid_hi :5; u_char :3; #endif - u_char network_pid_lo :8; + u_char network_pid_lo :8; /* or program_map_pid (if prog_num=0)*/ -} pat_prog_t; +}; /* * @@ -127,7 +145,7 @@ typedef struct { */ #define CAT_LEN 8 -typedef struct { +struct cat { u_char table_id :8; #if BYTE_ORDER == BIG_ENDIAN u_char section_syntax_indicator :1; @@ -154,7 +172,7 @@ typedef struct { #endif u_char section_number :8; u_char last_section_number :8; -} cat_t; +}; /* * @@ -168,7 +186,7 @@ typedef struct { #define PMT_LEN 12 -typedef struct { +struct pmt { u_char table_id :8; #if BYTE_ORDER == BIG_ENDIAN u_char section_syntax_indicator :1; @@ -212,11 +230,11 @@ typedef struct { #endif u_char program_info_length_lo :8; //descriptors -} pmt_t; +}; #define PMT_INFO_LEN 5 -typedef struct { +struct pmt_info { u_char stream_type :8; #if BYTE_ORDER == BIG_ENDIAN u_char :3; @@ -235,7 +253,7 @@ typedef struct { #endif u_char ES_info_length_lo :8; // descriptors -} pmt_info_t; +}; /* * @@ -247,80 +265,80 @@ typedef struct { * */ -#define NIT_LEN 10 +#define NIT_LEN 10 -typedef struct { - u_char table_id :8; +struct nit { + u_char table_id :8; #if BYTE_ORDER == BIG_ENDIAN - u_char section_syntax_indicator :1; - u_char :3; - u_char section_length_hi :4; -#else - u_char section_length_hi :4; - u_char :3; - u_char section_syntax_indicator :1; + u_char section_syntax_indicator :1; + u_char :3; + u_char section_length_hi :4; +#else + u_char section_length_hi :4; + u_char :3; + u_char section_syntax_indicator :1; #endif - u_char section_length_lo :8; - u_char network_id_hi :8; - u_char network_id_lo :8; + u_char section_length_lo :8; + u_char network_id_hi :8; + u_char network_id_lo :8; #if BYTE_ORDER == BIG_ENDIAN - u_char :2; - u_char version_number :5; - u_char current_next_indicator :1; + u_char :2; + u_char version_number :5; + u_char current_next_indicator :1; #else - u_char current_next_indicator :1; - u_char version_number :5; - u_char :2; + u_char current_next_indicator :1; + u_char version_number :5; + u_char :2; #endif - u_char section_number :8; - u_char last_section_number :8; -#if BYTE_ORDER == BIG_ENDIAN - u_char :4; - u_char network_descriptor_length_hi :4; + u_char section_number :8; + u_char last_section_number :8; +#if BYTE_ORDER == BIG_ENDIAN + u_char :4; + u_char network_descriptor_length_hi :4; #else - u_char network_descriptor_length_hi :4; - u_char :4; + u_char network_descriptor_length_hi :4; + u_char :4; #endif - u_char network_descriptor_length_lo :8; + u_char network_descriptor_length_lo :8; /* descriptors */ -} nit_t; - -#define SIZE_NIT_MID 2 +}; + +#define SIZE_NIT_MID 2 -typedef struct { // after descriptors +struct nit_mid { // after descriptors #if BYTE_ORDER == BIG_ENDIAN - u_char :4; - u_char transport_stream_loop_length_hi :4; + u_char :4; + u_char transport_stream_loop_length_hi :4; #else - u_char transport_stream_loop_length_hi :4; - u_char :4; + u_char transport_stream_loop_length_hi :4; + u_char :4; #endif - u_char transport_stream_loop_length_lo :8; -} nit_mid_t; - -#define SIZE_NIT_END 4 - -struct nit_end_struct { - long CRC; -}; - -#define NIT_TS_LEN 6 - -typedef struct { - u_char transport_stream_id_hi :8; - u_char transport_stream_id_lo :8; - u_char original_network_id_hi :8; - u_char original_network_id_lo :8; + u_char transport_stream_loop_length_lo :8; +}; + +#define SIZE_NIT_END 4 + +struct nit_end { + long CRC; +}; + +#define NIT_TS_LEN 6 + +struct ni_ts { + u_char transport_stream_id_hi :8; + u_char transport_stream_id_lo :8; + u_char original_network_id_hi :8; + u_char original_network_id_lo :8; #if BYTE_ORDER == BIG_ENDIAN - u_char :4; - u_char transport_descriptors_length_hi :4; -#else - u_char transport_descriptors_length_hi :4; - u_char :4; + u_char :4; + u_char transport_descriptors_length_hi :4; +#else + u_char transport_descriptors_length_hi :4; + u_char :4; #endif - u_char transport_descriptors_length_lo :8; + u_char transport_descriptors_length_lo :8; /* descriptors */ -} nit_ts_t; +}; /* * @@ -351,7 +369,7 @@ typedef struct { #define SDT_LEN 11 -typedef struct { +struct sdt { u_char table_id :8; #if BYTE_ORDER == BIG_ENDIAN u_char section_syntax_indicator :1; @@ -379,14 +397,14 @@ typedef struct { u_char original_network_id_hi :8; u_char original_network_id_lo :8; u_char :8; -} sdt_t; +}; #define GetSDTTransportStreamId(x) (HILO(((sdt_t *) x)->transport_stream_id)) #define GetSDTOriginalNetworkId(x) (HILO(((sdt_t *) x)->original_network_id)) #define SDT_DESCR_LEN 5 -typedef struct { +struct sdt_descr { u_char service_id_hi :8; u_char service_id_lo :8; #if BYTE_ORDER == BIG_ENDIAN @@ -405,12 +423,12 @@ typedef struct { u_char running_status :3; #endif u_char descriptors_loop_length_lo :8; -} sdt_descr_t; +}; /* * * 3) Event Information Table (EIT): - * + * * - the EIT contains data concerning events or programmes such as event * name, start time, duration, etc.; - the use of different descriptors * allows the transmission of different kinds of event information e.g. @@ -420,7 +438,7 @@ typedef struct { #define EIT_LEN 14 -typedef struct { +struct eit { u_char table_id :8; #if BYTE_ORDER == BIG_ENDIAN u_char section_syntax_indicator :1; @@ -451,11 +469,11 @@ typedef struct { u_char original_network_id_lo :8; u_char segment_last_section_number :8; u_char segment_last_table_id :8; -} eit_t; +}; #define EIT_EVENT_LEN 12 -typedef struct { +struct eit_event { u_char event_id_hi :8; u_char event_id_lo :8; u_char mjd_hi :8; @@ -476,7 +494,7 @@ typedef struct { u_char running_status :3; #endif u_char descriptors_loop_length_lo :8; -} eit_event_t; +}; /* * @@ -487,7 +505,39 @@ typedef struct { * events. * */ - /* TO BE DONE */ + +struct rst { + u_char table_id :8; +#if BYTE_ORDER == BIG_ENDIAN + u_char section_syntax_indicator :1; + u_char :3; + u_char section_length_hi :4; +#else + u_char section_length_hi :4; + u_char :3; + u_char section_syntax_indicator :1; +#endif + u_char section_length_lo :8; +}; + +struct rst_info { + u_char transport_stream_id_hi :8; + u_char transport_stream_id_lo :8; + u_char original_network_id_hi :8; + u_char original_network_id_lo :8; + u_char service_id_hi :8; + u_char service_id_lo :8; + u_char event_id_hi :8; + u_char event_id_lo :8; +#if BYTE_ORDER == BIG_ENDIAN + u_char :5; + u_char running_status :3; +#else + u_char running_status :3; + u_char :5; +#endif +}; + /* * * 5) Time and Date Table (TDT): @@ -500,8 +550,8 @@ typedef struct { #define TDT_LEN 8 -typedef struct { - u_char table_id :8; +struct tdt { + u_char table_id :8; #if BYTE_ORDER == BIG_ENDIAN u_char section_syntax_indicator :1; u_char :3; @@ -517,7 +567,7 @@ typedef struct { u_char utc_time_h :8; u_char utc_time_m :8; u_char utc_time_s :8; -} tdt_t; +}; /* * @@ -530,8 +580,8 @@ typedef struct { */ #define TOT_LEN 10 -typedef struct { - u_char table_id :8; +struct tot { + u_char table_id :8; #if BYTE_ORDER == BIG_ENDIAN u_char section_syntax_indicator :1; u_char :3; @@ -555,8 +605,7 @@ typedef struct { u_char :4; #endif u_char descriptors_loop_length_lo :8; -} tot_t; - +}; /* * @@ -589,6 +638,96 @@ typedef struct { * */ /* TO BE DONE */ + +/* + * + * 3) Application Information Table (AIT): + * + * - the AIT contains data concerning MHP application broadcast by a service. + * + */ + +#define AIT_LEN 10 + +struct ait { + u_char table_id :8; +#if BYTE_ORDER == BIG_ENDIAN + u_char section_syntax_indicator :1; + u_char :3; + u_char section_length_hi :4; +#else + u_char section_length_hi :4; + u_char :3; + u_char section_syntax_indicator :1; +#endif + u_char section_length_lo :8; + u_char application_type_hi :8; + u_char application_type_lo :8; +#if BYTE_ORDER == BIG_ENDIAN + u_char :2; + u_char version_number :5; + u_char current_next_indicator :1; +#else + u_char current_next_indicator :1; + u_char version_number :5; + u_char :2; +#endif + u_char section_number :8; + u_char last_section_number :8; +#if BYTE_ORDER == BIG_ENDIAN + u_char :4; + u_char common_descriptors_length_hi :4; +#else + u_char common_descriptors_length_hi :4; + u_char :4; +#endif + u_char common_descriptors_length_lo :8; +}; + +#define SIZE_AIT_MID 2 + +struct ait_mid { // after descriptors +#if BYTE_ORDER == BIG_ENDIAN + u_char :4; + u_char application_loop_length_hi :4; +#else + u_char application_loop_length_hi :4; + u_char :4; +#endif + u_char application_loop_length_lo :8; +}; + +#define SIZE_AIT_END 4 + +struct ait_end { + long CRC; +}; + +#define AIT_APP_LEN 9 + +struct ait_app { + //how to deal with 32 bit fields? + + u_char organisation_id_hi_hi :8; + u_char organisation_id_hi_lo :8; + u_char organisation_id_lo_hi :8; + u_char organisation_id_lo_lo :8; + + //long organisation_id :32; + u_char application_id_hi :8; + u_char application_id_lo :8; + u_char application_control_code :8; +#if BYTE_ORDER == BIG_ENDIAN + u_char :4; + u_char application_descriptors_length_hi :4; +#else + u_char application_descriptors_length_hi :4; + u_char :4; +#endif + u_char application_descriptors_length_lo :8; + /* descriptors */ +}; + /* * * The following describes the different descriptors that can be used within @@ -609,20 +748,18 @@ typedef struct { */ #define DESCR_GEN_LEN 2 -typedef struct descr_gen_struct { +struct descr_gen { u_char descriptor_tag :8; u_char descriptor_length :8; -} descr_gen_t; -#define CastGenericDescriptor(x) ((descr_gen_t *)(x)) +}; #define GetDescriptorTag(x) (((descr_gen_t *) x)->descriptor_tag) #define GetDescriptorLength(x) (((descr_gen_t *) x)->descriptor_length+DESCR_GEN_LEN) - /* 0x09 ca_descriptor */ #define DESCR_CA_LEN 6 -typedef struct descr_ca_struct { +struct descr_ca { u_char descriptor_tag :8; u_char descriptor_length :8; u_char CA_type_hi :8; @@ -635,73 +772,77 @@ typedef struct descr_ca_struct { u_char reserved :3; #endif u_char CA_PID_lo :8; -} descr_ca_t; -#define CastCaDescriptor(x) ((descr_ca_t *)(x)) +}; /* 0x0A iso_639_language_descriptor */ #define DESCR_ISO_639_LANGUAGE_LEN 5 -typedef struct descr_iso_639_language_struct { +struct descr_iso_639_language { u_char descriptor_tag :8; u_char descriptor_length :8; u_char lang_code1 :8; u_char lang_code2 :8; u_char lang_code3 :8; -} descr_iso_639_language_t; -#define CastIso639LanguageDescriptor(x) ((descr_iso_639_language_t *)(x)) +}; + +/* 0x13 carousel_identifier_descriptor */ +#define DESCR_CAROUSEL_IDENTIFIER_LEN 7 +struct descr_carousel_identifier { + u_char descriptor_tag :8; + u_char descriptor_length :8; + u_char carousel_id_hi_hi :8; + u_char carousel_id_hi_lo :8; + u_char carousel_id_lo_hi :8; + u_char carousel_id_lo_lo :8; + u_char FormatId :8; + /* FormatSpecifier follows */ +}; /* 0x40 network_name_descriptor */ #define DESCR_NETWORK_NAME_LEN 2 -typedef struct descr_network_name_struct { +struct descr_network_name { u_char descriptor_tag :8; u_char descriptor_length :8; -} descr_network_name_t; -#define CastNetworkNameDescriptor(x) ((descr_network_name_t *)(x)) - +}; /* 0x41 service_list_descriptor */ #define DESCR_SERVICE_LIST_LEN 2 -typedef struct descr_service_list_struct { +struct descr_service_list { u_char descriptor_tag :8; u_char descriptor_length :8; -} descr_service_list_t; -#define CastServiceListDescriptor(x) ((descr_service_list_t *)(x)) +}; #define DESCR_SERVICE_LIST_LOOP_LEN 3 -typedef struct descr_service_list_loop_struct { +struct descr_service_list_loop { u_char service_id_hi :8; u_char service_id_lo :8; u_char service_type :8; -} descr_service_list_loop_t; -#define CastServiceListDescriptorLoop(x) ((descr_service_list_loop_t *)(x)) - +}; /* 0x42 stuffing_descriptor */ #define DESCR_STUFFING_LEN XX -typedef struct descr_stuffing_struct { +struct descr_stuffing { u_char descriptor_tag :8; u_char descriptor_length :8; /* TBD */ -} descr_stuffing_t; -#define CastStuffingDescriptor(x) ((descr_stuffing_t *)(x)) - +}; /* 0x43 satellite_delivery_system_descriptor */ #define DESCR_SATELLITE_DELIVERY_SYSTEM_LEN 13 -typedef struct descr_satellite_delivery_system_struct { +struct descr_satellite_delivery_system { u_char descriptor_tag :8; u_char descriptor_length :8; - u_char frequency1 :8; - u_char frequency2 :8; - u_char frequency3 :8; - u_char frequency4 :8; - u_char orbital_position1 :8; - u_char orbital_position2 :8; + u_char frequency_hi_hi :8; + u_char frequency_hi_lo :8; + u_char frequency_lo_hi :8; + u_char frequency_lo_lo :8; + u_char orbital_position_hi :8; + u_char orbital_position_lo :8; #if BYTE_ORDER == BIG_ENDIAN u_char west_east_flag :1; u_char polarization :2; @@ -711,30 +852,28 @@ typedef struct descr_satellite_delivery_system_struct { u_char polarization :2; u_char west_east_flag :1; #endif - u_char symbol_rate1 :8; - u_char symbol_rate2 :8; - u_char symbol_rate3 :8; + u_char symbol_rate_hi_hi :8; + u_char symbol_rate_hi_lo :8; + u_char symbol_rate_lo_1 :8; #if BYTE_ORDER == BIG_ENDIAN - u_char symbol_rate4 :4; + u_char symbol_rate_lo_2 :4; u_char fec_inner :4; #else u_char fec_inner :4; - u_char symbol_rate4 :4; + u_char symbol_rate_lo_2 :4; #endif -} descr_satellite_delivery_system_t; -#define CastSatelliteDeliverySystemDescriptor(x) ((descr_satellite_delivery_system_t *)(x)) - +}; /* 0x44 cable_delivery_system_descriptor */ #define DESCR_CABLE_DELIVERY_SYSTEM_LEN 13 -typedef struct descr_cable_delivery_system_struct { +struct descr_cable_delivery_system { u_char descriptor_tag :8; u_char descriptor_length :8; - u_char frequency1 :8; - u_char frequency2 :8; - u_char frequency3 :8; - u_char frequency4 :8; + u_char frequency_hi_hi :8; + u_char frequency_hi_lo :8; + u_char frequency_lo_hi :8; + u_char frequency_lo_lo :8; u_char reserved1 :8; #if BYTE_ORDER == BIG_ENDIAN u_char reserved2 :4; @@ -744,68 +883,62 @@ typedef struct descr_cable_delivery_system_struct { u_char reserved2 :4; #endif u_char modulation :8; - u_char symbol_rate1 :8; - u_char symbol_rate2 :8; - u_char symbol_rate3 :8; + u_char symbol_rate_hi_hi :8; + u_char symbol_rate_hi_lo :8; + u_char symbol_rate_lo_1 :8; #if BYTE_ORDER == BIG_ENDIAN - u_char symbol_rate4 :4; + u_char symbol_rate_lo_2 :4; u_char fec_inner :4; #else u_char fec_inner :4; - u_char symbol_rate4 :4; + u_char symbol_rate_lo_2 :4; #endif -} descr_cable_delivery_system_t; -#define CastCableDeliverySystemDescriptor(x) ((descr_cable_delivery_system_t *)(x)) - +}; /* 0x45 vbi_data_descriptor */ #define DESCR_VBI_DATA_LEN XX -typedef struct descr_vbi_data_struct { +struct descr_vbi_data { u_char descriptor_tag :8; u_char descriptor_length :8; /* TBD */ -} descr_vbi_data_t; -#define CastVbiDataDescriptor(x) ((descr_vbi_data_t *)(x)) - +}; /* 0x46 vbi_teletext_descriptor */ #define DESCR_VBI_TELETEXT_LEN XX -typedef struct descr_vbi_teletext_struct { +struct descr_vbi_teletext { u_char descriptor_tag :8; u_char descriptor_length :8; /* TBD */ -} descr_vbi_teletext_t; -#define CastVbiDescriptor(x) ((descr_vbi_teletext_t *)(x)) - +}; /* 0x47 bouquet_name_descriptor */ #define DESCR_BOUQUET_NAME_LEN 2 -typedef struct descr_bouquet_name_struct { +struct descr_bouquet_name { u_char descriptor_tag :8; u_char descriptor_length :8; -} descr_bouquet_name_t; -#define CastBouquetNameDescriptor(x) ((descr_bouquet_name_t *)(x)) - +}; /* 0x48 service_descriptor */ #define DESCR_SERVICE_LEN 4 -typedef struct descr_service_struct { +struct descr_service { u_char descriptor_tag :8; u_char descriptor_length :8; u_char service_type :8; u_char provider_name_length :8; -} descr_service_t; -#define CastServiceDescriptor(x) ((descr_service_t *)(x)) +}; +struct descr_service_mid { + u_char service_name_length :8; +}; /* 0x49 country_availability_descriptor */ #define DESCR_COUNTRY_AVAILABILITY_LEN 3 -typedef struct descr_country_availability_struct { +struct descr_country_availability { u_char descriptor_tag :8; u_char descriptor_length :8; #if BYTE_ORDER == BIG_ENDIAN @@ -815,79 +948,71 @@ typedef struct descr_country_availability_struct { u_char reserved :7; u_char country_availability_flag :1; #endif -} descr_country_availability_t; -#define CastCountryAvailabilityDescriptor(x) ((descr_country_availability_t *)(x)) - +}; /* 0x4A linkage_descriptor */ #define DESCR_LINKAGE_LEN 9 -typedef struct descr_linkage_struct { +struct descr_linkage { u_char descriptor_tag :8; u_char descriptor_length :8; u_char transport_stream_id_hi :8; u_char transport_stream_id_lo :8; - u_char original_network_id_hi :8; - u_char original_network_id_lo :8; + u_char original_network_id_hi :8; + u_char original_network_id_lo :8; u_char service_id_hi :8; u_char service_id_lo :8; u_char linkage_type :8; -} descr_linkage_t; -#define CastLinkageDescriptor(x) ((descr_linkage_t *)(x)) - +}; /* 0x4B nvod_reference_descriptor */ #define DESCR_NVOD_REFERENCE_LEN 2 -typedef struct descr_nvod_reference_struct { +struct descr_nvod_reference { u_char descriptor_tag :8; u_char descriptor_length :8; -} descr_nvod_reference_t; -#define CastNvodReferenceDescriptor(x) ((descr_nvod_reference_t *)(x)) +}; #define ITEM_NVOD_REFERENCE_LEN 6 -typedef struct item_nvod_reference_struct { +struct item_nvod_reference { u_char transport_stream_id_hi :8; u_char transport_stream_id_lo :8; - u_char original_network_id_hi :8; - u_char original_network_id_lo :8; + u_char original_network_id_hi :8; + u_char original_network_id_lo :8; u_char service_id_hi :8; u_char service_id_lo :8; -} item_nvod_reference_t; -#define CastNvodReferenceItem(x) ((item_nvod_reference_t *)(x)) - - +}; /* 0x4C time_shifted_service_descriptor */ #define DESCR_TIME_SHIFTED_SERVICE_LEN 4 -typedef struct descr_time_shifted_service_struct { +struct descr_time_shifted_service { u_char descriptor_tag :8; u_char descriptor_length :8; u_char reference_service_id_hi :8; u_char reference_service_id_lo :8; -} descr_time_shifted_service_t; -#define CastTimeShiftedServiceDescriptor(x) ((descr_time_shifted_service_t *)(x)) - +}; /* 0x4D short_event_descriptor */ #define DESCR_SHORT_EVENT_LEN 6 -typedef struct descr_short_event_struct { +struct descr_short_event { u_char descriptor_tag :8; u_char descriptor_length :8; u_char lang_code1 :8; u_char lang_code2 :8; u_char lang_code3 :8; u_char event_name_length :8; -} descr_short_event_t; -#define CastShortEventDescriptor(x) ((descr_short_event_t *)(x)) +}; +struct descr_short_event_mid { + u_char text_length :8; +}; /* 0x4E extended_event_descriptor */ #define DESCR_EXTENDED_EVENT_LEN 7 -typedef struct descr_extended_event_struct { +struct descr_extended_event { u_char descriptor_tag :8; u_char descriptor_length :8; /* TBD */ @@ -902,34 +1027,37 @@ typedef struct descr_extended_event_struct { u_char lang_code2 :8; u_char lang_code3 :8; u_char length_of_items :8; -} descr_extended_event_t; -#define CastExtendedEventDescriptor(x) ((descr_extended_event_t *)(x)) +}; + +struct descr_extended_event_mid { + u_char text_length :8; +}; #define ITEM_EXTENDED_EVENT_LEN 1 -typedef struct item_extended_event_struct { - u_char item_description_length :8; -} item_extended_event_t; -#define CastExtendedEventItem(x) ((item_extended_event_t *)(x)) +struct item_extended_event { + u_char item_description_length :8; +}; +struct item_extended_event_mid { + u_char item_length :8; +}; /* 0x4F time_shifted_event_descriptor */ #define DESCR_TIME_SHIFTED_EVENT_LEN 6 -typedef struct descr_time_shifted_event_struct { +struct descr_time_shifted_event { u_char descriptor_tag :8; u_char descriptor_length :8; u_char reference_service_id_hi :8; u_char reference_service_id_lo :8; u_char reference_event_id_hi :8; u_char reference_event_id_lo :8; -} descr_time_shifted_event_t; -#define CastTimeShiftedEventDescriptor(x) ((descr_time_shifted_event_t *)(x)) - +}; /* 0x50 component_descriptor */ #define DESCR_COMPONENT_LEN 8 -typedef struct descr_component_struct { +struct descr_component { u_char descriptor_tag :8; u_char descriptor_length :8; #if BYTE_ORDER == BIG_ENDIAN @@ -944,134 +1072,117 @@ typedef struct descr_component_struct { u_char lang_code1 :8; u_char lang_code2 :8; u_char lang_code3 :8; -} descr_component_t; -#define CastComponentDescriptor(x) ((descr_component_t *)(x)) - +}; /* 0x51 mosaic_descriptor */ #define DESCR_MOSAIC_LEN XX -typedef struct descr_mosaic_struct { +struct descr_mosaic { u_char descriptor_tag :8; u_char descriptor_length :8; /* TBD */ -} descr_mosaic_t; -#define CastMosaicDescriptor(x) ((descr_mosaic_t *)(x)) - +}; /* 0x52 stream_identifier_descriptor */ #define DESCR_STREAM_IDENTIFIER_LEN 3 -typedef struct descr_stream_identifier_struct { +struct descr_stream_identifier { u_char descriptor_tag :8; u_char descriptor_length :8; u_char component_tag :8; -} descr_stream_identifier_t; -#define CastStreamIdentifierDescriptor(x) ((descr_stream_identifier_t *)(x)) - +}; /* 0x53 ca_identifier_descriptor */ #define DESCR_CA_IDENTIFIER_LEN 2 -typedef struct descr_ca_identifier_struct { +struct descr_ca_identifier { u_char descriptor_tag :8; u_char descriptor_length :8; -} descr_ca_identifier_t; -#define CastCaIdentifierDescriptor(x) ((descr_ca_identifier_t *)(x)) - +}; /* 0x54 content_descriptor */ #define DESCR_CONTENT_LEN 2 -typedef struct descr_content_struct { +struct descr_content { u_char descriptor_tag :8; u_char descriptor_length :8; -} descr_content_t; -#define CastContentDescriptor(x) ((descr_content_t *)(x)) +}; -typedef struct nibble_content_struct { +struct nibble_content { #if BYTE_ORDER == BIG_ENDIAN u_char content_nibble_level_1 :4; u_char content_nibble_level_2 :4; +#else + u_char content_nibble_level_2 :4; + u_char content_nibble_level_1 :4; +#endif +#if BYTE_ORDER == BIG_ENDIAN u_char user_nibble_1 :4; u_char user_nibble_2 :4; #else u_char user_nibble_2 :4; u_char user_nibble_1 :4; - u_char content_nibble_level_2 :4; - u_char content_nibble_level_1 :4; #endif -} nibble_content_t; -#define CastContentNibble(x) ((nibble_content_t *)(x)) - +}; /* 0x55 parental_rating_descriptor */ #define DESCR_PARENTAL_RATING_LEN 2 -typedef struct descr_parental_rating_struct { +struct descr_parental_rating { u_char descriptor_tag :8; u_char descriptor_length :8; -} descr_parental_rating_t; -#define CastParentalRatingDescriptor(x) ((descr_parental_rating_t *)(x)) +}; #define PARENTAL_RATING_LEN 4 -typedef struct parental_rating_struct { +struct parental_rating { u_char lang_code1 :8; u_char lang_code2 :8; u_char lang_code3 :8; u_char rating :8; -} parental_rating_t; -#define CastParentalRating(x) ((parental_rating_t *)(x)) - +}; /* 0x56 teletext_descriptor */ #define DESCR_TELETEXT_LEN 2 -typedef struct descr_teletext_struct { +struct descr_teletext { u_char descriptor_tag :8; u_char descriptor_length :8; -} descr_teletext_t; -#define CastTeletextDescriptor(x) ((descr_teletext_t *)(x)) +}; #define ITEM_TELETEXT_LEN 5 -typedef struct item_teletext_struct { +struct item_teletext { u_char lang_code1 :8; u_char lang_code2 :8; u_char lang_code3 :8; #if BYTE_ORDER == BIG_ENDIAN - u_char type :5; - u_char magazine_number :3; -#else - u_char magazine_number :3; - u_char type :5; -#endif - u_char page_number :8; -} item_teletext_t; -#define CastTeletextItem(x) ((item_teletext_t *)(x)) - + u_char type :5; + u_char magazine_number :3; +#else + u_char magazine_number :3; + u_char type :5; +#endif + u_char page_number :8; +}; /* 0x57 telephone_descriptor */ #define DESCR_TELEPHONE_LEN XX -typedef struct descr_telephone_struct { +struct descr_telephone { u_char descriptor_tag :8; u_char descriptor_length :8; /* TBD */ -} descr_telephone_t; -#define CastTelephoneDescriptor(x) ((descr_telephone_t *)(x)) - +}; /* 0x58 local_time_offset_descriptor */ #define DESCR_LOCAL_TIME_OFFSET_LEN 2 -typedef struct descr_local_time_offset_struct { +struct descr_local_time_offset { u_char descriptor_tag :8; u_char descriptor_length :8; -} descr_local_time_offset_t; -#define CastLocalTimeOffsetDescriptor(x) ((descr_local_time_offset_t *)(x)) +}; #define LOCAL_TIME_OFFSET_ENTRY_LEN 15 -typedef struct local_time_offset_entry_struct { +struct local_time_offset_entry { u_char country_code1 :8; u_char country_code2 :8; u_char country_code3 :8; @@ -1093,43 +1204,38 @@ typedef struct local_time_offset_entry_struct { u_char time_of_change_time_s :8; u_char next_time_offset_h :8; u_char next_time_offset_m :8; -} local_time_offset_entry_t ; -#define CastLocalTimeOffsetEntry(x) ((local_time_offset_entry_t *)(x)) - +}; /* 0x59 subtitling_descriptor */ #define DESCR_SUBTITLING_LEN 2 -typedef struct descr_subtitling_struct { +struct descr_subtitling { u_char descriptor_tag :8; u_char descriptor_length :8; -} descr_subtitling_t; -#define CastSubtitlingDescriptor(x) ((descr_subtitling_t *)(x)) +}; #define ITEM_SUBTITLING_LEN 8 -typedef struct item_subtitling_struct { +struct item_subtitling { u_char lang_code1 :8; u_char lang_code2 :8; u_char lang_code3 :8; - u_char subtitling_type :8; - u_char composition_page_id_hi :8; - u_char composition_page_id_lo :8; - u_char ancillary_page_id_hi :8; - u_char ancillary_page_id_lo :8; -} item_subtitling_t; -#define CastSubtitlingItem(x) ((item_subtitling_t *)(x)) - + u_char subtitling_type :8; + u_char composition_page_id_hi :8; + u_char composition_page_id_lo :8; + u_char ancillary_page_id_hi :8; + u_char ancillary_page_id_lo :8; +}; /* 0x5A terrestrial_delivery_system_descriptor */ #define DESCR_TERRESTRIAL_DELIVERY_SYSTEM_LEN XX -typedef struct descr_terrestrial_delivery_struct { +struct descr_terrestrial_delivery { u_char descriptor_tag :8; u_char descriptor_length :8; - u_char frequency1 :8; - u_char frequency2 :8; - u_char frequency3 :8; - u_char frequency4 :8; + u_char frequency_hi_hi :8; + u_char frequency_hi_lo :8; + u_char frequency_lo_hi :8; + u_char frequency_lo_lo :8; #if BYTE_ORDER == BIG_ENDIAN u_char bandwidth :3; u_char reserved1 :5; @@ -1161,179 +1267,166 @@ typedef struct descr_terrestrial_delivery_struct { u_char reserver3 :8; u_char reserver4 :8; u_char reserver5 :8; -} descr_terrestrial_delivery_system_t; -#define CastTerrestrialDeliverySystemDescriptor(x) ((descr_terrestrial_delivery_system_t *)(x)) - +}; /* 0x5B multilingual_network_name_descriptor */ #define DESCR_MULTILINGUAL_NETWORK_NAME_LEN XX -typedef struct descr_multilingual_network_name_struct { +struct descr_multilingual_network_name { u_char descriptor_tag :8; u_char descriptor_length :8; - /* TBD */ -} descr_multilingual_network_name_t; -#define CastMultilingualNetworkNameDescriptor(x) ((descr_multilingual_network_name_t *)(x)) +}; +struct entry_multilingual_name { + u_char lang_code1 :8; + u_char lang_code2 :8; + u_char lang_code3 :8; + u_char text_length :8; +}; /* 0x5C multilingual_bouquet_name_descriptor */ #define DESCR_MULTILINGUAL_BOUQUET_NAME_LEN XX -typedef struct descr_multilingual_bouquet_name_struct { +struct descr_multilingual_bouquet_name { u_char descriptor_tag :8; u_char descriptor_length :8; - /* TBD */ -} descr_multilingual_bouquet_name_t; -#define CastMultilingualBouquetNameDescriptor(x) ((descr_multilingual_bouquet_name_t *)(x)) - +}; /* 0x5D multilingual_service_name_descriptor */ #define DESCR_MULTILINGUAL_SERVICE_NAME_LEN XX -typedef struct descr_multilingual_service_name_struct { +struct descr_multilingual_service_name { u_char descriptor_tag :8; u_char descriptor_length :8; - /* TBD */ -} descr_multilingual_service_name_t; -#define CastMultilingualServiceNameDescriptor(x) ((descr_multilingual_service_name_t *)(x)) +}; +struct entry_multilingual_service_name_mid { + u_char service_name_length :8; +}; /* 0x5E multilingual_component_descriptor */ #define DESCR_MULTILINGUAL_COMPONENT_LEN XX -typedef struct descr_multilingual_component_struct { +struct descr_multilingual_component { u_char descriptor_tag :8; u_char descriptor_length :8; - /* TBD */ -} descr_multilingual_component_t; -#define CastMultilingualComponentDescriptor(x) ((descr_multilingual_component_t *)(x)) - + u_char component_tag :8; +}; /* 0x5F private_data_specifier_descriptor */ #define DESCR_PRIVATE_DATA_SPECIFIER_LEN XX -typedef struct descr_private_data_specifier_struct { +struct descr_private_data_specifier { u_char descriptor_tag :8; u_char descriptor_length :8; /* TBD */ -} descr_private_data_specifier_t; -#define CastPrivateDataSpecifierDescriptor(x) ((descr_private_data_specifier_t *)(x)) - +}; /* 0x60 service_move_descriptor */ #define DESCR_SERVICE_MOVE_LEN XX -typedef struct descr_service_move_struct { +struct descr_service_move { u_char descriptor_tag :8; u_char descriptor_length :8; - /* TBD */ -} descr_service_move_t; -#define CastServiceMoveDescriptor(x) ((descr_service_move_t *)(x)) - + u_char new_original_network_id_hi :8; + u_char new_original_network_id_lo :8; + u_char new_transport_stream_id_hi :8; + u_char new_transport_stream_id_lo :8; + u_char new_service_id_hi :8; + u_char new_service_id_lo :8; +}; /* 0x61 short_smoothing_buffer_descriptor */ #define DESCR_SHORT_SMOOTHING_BUFFER_LEN XX -typedef struct descr_short_smoothing_buffer_struct { +struct descr_short_smoothing_buffer { u_char descriptor_tag :8; u_char descriptor_length :8; /* TBD */ -} descr_short_smoothing_buffer_t; -#define CastShortSmoothingBufferDescriptor(x) ((descr_short_smoothing_buffer_t *)(x)) - +}; /* 0x62 frequency_list_descriptor */ #define DESCR_FREQUENCY_LIST_LEN XX -typedef struct descr_frequency_list_struct { +struct descr_frequency_list { u_char descriptor_tag :8; u_char descriptor_length :8; - /* TBD */ -} descr_frequency_list_t; -#define CastFrequencyListDescriptor(x) ((descr_frequency_list_t *)(x)) - +#if BYTE_ORDER == BIG_ENDIAN + u_char :6; + u_char coding_type :2; +#else + u_char coding_type :2; + u_char :6; +#endif +}; /* 0x63 partial_transport_stream_descriptor */ #define DESCR_PARTIAL_TRANSPORT_STREAM_LEN XX -typedef struct descr_partial_transport_stream_struct { +struct descr_partial_transport_stream { u_char descriptor_tag :8; u_char descriptor_length :8; /* TBD */ -} descr_partial_transport_stream_t; -#define CastPartialDescriptor(x) ((descr_partial_transport_stream_t *)(x)) - +}; /* 0x64 data_broadcast_descriptor */ #define DESCR_DATA_BROADCAST_LEN XX -typedef struct descr_data_broadcast_struct { +struct descr_data_broadcast { u_char descriptor_tag :8; u_char descriptor_length :8; /* TBD */ -} descr_data_broadcast_t; -#define CastDataBroadcastDescriptor(x) ((descr_data_broadcast_t *)(x)) - +}; /* 0x65 ca_system_descriptor */ #define DESCR_CA_SYSTEM_LEN XX -typedef struct descr_ca_system_struct { +struct descr_ca_system { u_char descriptor_tag :8; u_char descriptor_length :8; /* TBD */ -} descr_ca_system_t; -#define CastCaSystemDescriptor(x) ((descr_ca_system_t *)(x)) - +}; /* 0x66 data_broadcast_id_descriptor */ #define DESCR_DATA_BROADCAST_ID_LEN XX -typedef struct descr_data_broadcast_id_struct { +struct descr_data_broadcast_id { u_char descriptor_tag :8; u_char descriptor_length :8; /* TBD */ -} descr_data_broadcast_id_t; -#define CastDataBroadcastIdDescriptor(x) ((descr_data_broadcast_id_t *)(x)) - +}; /* 0x67 transport_stream_descriptor */ #define DESCR_TRANSPORT_STREAM_LEN XX -typedef struct descr_transport_stream_struct { +struct descr_transport_stream { u_char descriptor_tag :8; u_char descriptor_length :8; /* TBD */ -} descr_transport_stream_t; -#define CastTransportStreamDescriptor(x) ((descr_transport_stream_t *)(x)) - +}; /* 0x68 dsng_descriptor */ #define DESCR_DSNG_LEN XX -typedef struct descr_dsng_struct { +struct descr_dsng { u_char descriptor_tag :8; u_char descriptor_length :8; /* TBD */ -} descr_dsng_t; -#define CastDsngDescriptor(x) ((descr_dsng_t *)(x)) - +}; /* 0x69 pdc_descriptor */ #define DESCR_PDC_LEN XX -typedef struct descr_pdc_struct { +struct descr_pdc { u_char descriptor_tag :8; u_char descriptor_length :8; /* TBD */ -} descr_pdc_t; -#define CastPdcDescriptor(x) ((descr_pdc_t *)(x)) - +}; /* 0x6A ac3_descriptor */ #define DESCR_AC3_LEN 3 -typedef struct descr_ac3_struct { +struct descr_ac3 { u_char descriptor_tag :8; u_char descriptor_length :8; #if BYTE_ORDER == BIG_ENDIAN @@ -1353,51 +1446,224 @@ typedef struct descr_ac3_struct { u_char bsid :8; u_char mainid :8; u_char asvc :8; -} descr_ac3_t; -#define CastAc3Descriptor(x) ((descr_ac3_t *)(x)) - +}; /* 0x6B ancillary_data_descriptor */ #define DESCR_ANCILLARY_DATA_LEN 3 -typedef struct descr_ancillary_data_struct { +struct descr_ancillary_data { u_char descriptor_tag :8; u_char descriptor_length :8; u_char ancillary_data_identifier :8; -} descr_ancillary_data_t; -#define CastAncillaryDataDescriptor(x) ((descr_ancillary_data_t *)(x)) - +}; /* 0x6C cell_list_descriptor */ #define DESCR_CELL_LIST_LEN XX -typedef struct descr_cell_list_struct { +struct descr_cell_list { u_char descriptor_tag :8; u_char descriptor_length :8; /* TBD */ -} descr_cell_list_t; -#define CastCellListDescriptor(x) ((descr_cell_list_t *)(x)) - +}; /* 0x6D cell_frequency_link_descriptor */ #define DESCR_CELL_FREQUENCY_LINK_LEN XX -typedef struct descr_cell_frequency_link_struct { +struct descr_cell_frequency_link { u_char descriptor_tag :8; u_char descriptor_length :8; /* TBD */ -} descr_cell_frequency_link_t; -#define CastCellFrequencyLinkDescriptor(x) ((descr_cell_frequency_link_t *)(x)) - +}; /* 0x6E announcement_support_descriptor */ #define DESCR_ANNOUNCEMENT_SUPPORT_LEN XX -typedef struct descr_announcement_support_struct { +struct descr_announcement_support { u_char descriptor_tag :8; u_char descriptor_length :8; /* TBD */ -} descr_announcement_support_t; -#define CastAnnouncementSupportDescriptor(x) ((descr_announcement_support_t *)(x)) +}; + +/* 0x6F application_signalling_descriptor */ + +#define DESCR_APPLICATION_SIGNALLING_LEN 2 +struct descr_application_signalling { + u_char descriptor_tag :8; + u_char descriptor_length :8; +}; + +#define APPLICATION_SIGNALLING_ENTRY_LEN 3 +struct application_signalling_entry { + u_char application_type_hi :8; + u_char application_type_lo :8; +#if BYTE_ORDER == BIG_ENDIAN + u_char :3; + u_char AIT_version_number :5; +#else + u_char AIT_version_number :5; + u_char :3; +#endif +}; + +/* 0x71 service_identifier_descriptor (ETSI TS 102 812, MHP) */ + +struct descr_service_identifier { + u_char descriptor_tag :8; + u_char descriptor_length :8; +}; + +/* MHP 0x00 application_descriptor */ + +#define DESCR_APPLICATION_LEN 3 + +struct descr_application { + u_char descriptor_tag :8; + u_char descriptor_length :8; + u_char application_profiles_length :8; +}; + +#define DESCR_APPLICATION_END_LEN 2 + +struct descr_application_end { +#if BYTE_ORDER == BIG_ENDIAN + u_char service_bound_flag :1; + u_char visibility :2; + u_char :5; +#else + u_char :5; + u_char visibility :2; + u_char service_bound_flag :1; +#endif + u_char application_priority :8; +/*now follow 8bit transport_protocol_label fields to the end */ +}; + +#define APPLICATION_PROFILE_ENTRY_LEN 5 + +struct application_profile_entry { + u_char application_profile_hi :8; + u_char application_profile_lo :8; + u_char version_major :8; + u_char version_minor :8; + u_char version_micro :8; +}; + +/* MHP 0x01 application_name_desriptor */ + +#define DESCR_APPLICATION_NAME_LEN 2 + +struct descr_application_name { + u_char descriptor_tag :8; + u_char descriptor_length :8; +}; + +#define APPLICATION_NAME_ENTRY_LEN 4 + +struct descr_application_name_entry { + u_char lang_code1 :8; + u_char lang_code2 :8; + u_char lang_code3 :8; + u_char application_name_length :8; + /* application name string */ +}; + +/* MHP 0x02 transport_protocol_descriptor */ + +#define DESCR_TRANSPORT_PROTOCOL_LEN 5 + +struct descr_transport_protocol { + u_char descriptor_tag :8; + u_char descriptor_length :8; + u_char protocol_id_hi :8; + u_char protocol_id_lo :8; + u_char transport_protocol_label :8; + /* protocol_id-specific selector bytes follow */ +}; + +#define TRANSPORT_VIA_OC_LEN 1 + +struct transport_via_oc { +#if BYTE_ORDER == BIG_ENDIAN + u_char remote :1; + u_char :7; +#else + u_char :7; + u_char remote :1; +#endif +}; + +//if remote is true, transport_via_oc_remote_end_t follows, +// else transport_via_oc_end_t. + +#define TRANSPORT_VIA_OC_REMOTE_END_LEN 7 + +struct transport_via_oc_remote_end { + u_char original_network_id_hi :8; + u_char original_network_id_lo :8; + u_char transport_stream_id_hi :8; + u_char transport_stream_id_lo :8; + u_char service_id_hi :8; + u_char service_id_lo :8; + u_char component_tag :8; +}; + +#define TRANSPORT_VIA_OC_END_LEN 1 + +struct transport_via_oc_end { + u_char component_tag :8; +}; + +/* 0x03 dvb_j_application_descriptor() */ + +#define DESCR_DVBJ_APPLICATION_LEN 2 + +struct descr_dvbj_application { + u_char descriptor_tag :8; + u_char descriptor_length :8; +}; + +#define DESCR_DVBJ_APPLICATION_ENTRY_LEN 1 + +struct descr_dvbj_application_entry { + u_char parameter_length :8; + /* parameter string */ +}; + +/* 0x04 dvb_j_application_location_descriptor */ + +#define DESCR_DVBJ_APPLICATION_LOCATION_LEN 3 + +struct descr_dvbj_application_location { + u_char descriptor_tag :8; + u_char descriptor_length :8; + u_char base_directory_length :8; + /* base directory string */ +}; + +#define DESCR_DVBJ_APPLICATION_LOCATION_MID_LEN 1 + +struct descr_dvbj_application_location_mid { + u_char classpath_extension_length :8; +}; + +/* 0x0B application_icons_descriptor */ + +#define DESCR_APPLICATION_ICONS_LEN 3 + +struct descr_application_icons_descriptor { + u_char descriptor_tag :8; + u_char descriptor_length :8; + u_char icon_locator_length :8; + /* icon locator */ +}; + +#define DESCR_APPLICATION_ICONS_END_LEN 2 + +struct descr_application_icons_descriptor_end { + u_char icon_flags_hi :8; + u_char icon_flags_lo :8; +}; +} //end of namespace +#endif //LIBSI_HEADERS_H diff --git a/libsi/section.c b/libsi/section.c new file mode 100644 index 0000000..0de2a57 --- /dev/null +++ b/libsi/section.c @@ -0,0 +1,328 @@ +/*************************************************************************** + * Copyright (c) 2003 by Marcel Wiesweg * + * * + * 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. * + * * + * $Id: section.c 1.2 2003/12/13 10:42:14 kls Exp $ + * * + ***************************************************************************/ + +#include "section.h" +#include <stdio.h> + +namespace SI { + +/*********************** PAT ***********************/ + +void PAT::Parse() { + unsigned int offset=0; + data.setPointerAndOffset<const pat>(s, offset); + associationLoop.setData(data+offset, getLength()-offset-4); +} + +int PAT::getTransportStreamId() const { + return HILO(s->transport_stream_id); +} + +int PAT::Association::getServiceId() const { + return HILO(s->program_number); +} + +int PAT::Association::getPid() const { + return HILO(s->network_pid); +} + +void PAT::Association::Parse() { + s=data.getData<pat_prog>(); +} + +/*********************** CAT ***********************/ + +void CAT::Parse() { + loop.setData(data+sizeof(cat), getLength()-sizeof(cat)-4); +} + +/*********************** PMT ***********************/ + +void PMT::Parse() { + unsigned int offset=0; + data.setPointerAndOffset<const pmt>(s, offset); + commonDescriptors.setDataAndOffset(data+offset, HILO(s->program_info_length), offset); + streamLoop.setData(data+offset, getLength()-offset-4); +} + +int PMT::getServiceId() const { + return HILO(s->program_number); +} + +int PMT::getPCRPid() const { + return HILO(s->PCR_PID); +} + +int PMT::Stream::getPid() const { + return HILO(s->elementary_PID); +} + +int PMT::Stream::getStreamType() const { + return s->stream_type; +} + +void PMT::Stream::Parse() { + unsigned int offset=0; + data.setPointerAndOffset<const pmt_info>(s, offset); + streamDescriptors.setData(data+offset, HILO(s->ES_info_length)); +} + +/*********************** NIT ***********************/ + +int NIT::getNetworkId() const { + return HILO(s->network_id); +} + +void NIT::Parse() { + unsigned int offset=0; + data.setPointerAndOffset<const nit>(s, offset); + commonDescriptors.setDataAndOffset(data+offset, HILO(s->network_descriptor_length), offset); + const nit_mid *mid; + data.setPointerAndOffset<const nit_mid>(mid, offset); + transportStreamLoop.setData(data+offset, HILO(mid->transport_stream_loop_length)); +} + +int NIT::TransportStream::getTransportStreamId() const { + return HILO(s->transport_stream_id); +} + +int NIT::TransportStream::getOriginalNetworkId() const { + return HILO(s->original_network_id); +} + +void NIT::TransportStream::Parse() { + unsigned int offset=0; + data.setPointerAndOffset<const ni_ts>(s, offset); + transportStreamDescriptors.setData(data+offset, HILO(s->transport_descriptors_length)); +} + +/*********************** SDT ***********************/ + +void SDT::Parse() { + unsigned int offset=0; + data.setPointerAndOffset<const sdt>(s, offset); + serviceLoop.setData(data+offset, getLength()-offset-4); //4 is for CRC +} + +int SDT::getTransportStreamId() const { + return HILO(s->transport_stream_id); +} + +int SDT::getOriginalNetworkId() const { + return HILO(s->original_network_id); +} + +int SDT::Service::getServiceId() const { + return HILO(s->service_id); +} + +int SDT::Service::getEITscheduleFlag() const { + return s->eit_schedule_flag; +} + +int SDT::Service::getEITpresentFollowingFlag() const { + return s->eit_present_following_flag; +} + +RunningStatus SDT::Service::getRunningStatus() const { + return (RunningStatus)s->running_status; +} + +int SDT::Service::getFreeCaMode() const { + return s->free_ca_mode; +} + +void SDT::Service::Parse() { + unsigned int offset=0; + data.setPointerAndOffset<const sdt_descr>(s, offset); + serviceDescriptors.setData(data+offset, HILO(s->descriptors_loop_length)); +} + +/*********************** EIT ***********************/ + +int EIT::getServiceId() const { + return HILO(s->service_id); +} + +int EIT::getTransportStreamId() const { + return HILO(s->transport_stream_id); +} + +int EIT::getOriginalNetworkId() const { + return HILO(s->original_network_id); +} + +bool EIT::isPresentFollowing() const { + return getTableId() == TableIdEIT_presentFollowing || getTableId() == TableIdEIT_presentFollowing_other; +} + +bool EIT::isActualTS() const { + return + (getTableId() ==TableIdEIT_presentFollowing) + || (TableIdEIT_schedule_first <= getTableId() && getTableId() <= TableIdEIT_schedule_last); +} + +void EIT::Parse() { + unsigned int offset=0; + data.setPointerAndOffset<const eit>(s, offset); + //printf("%d %d %d %d %d\n", getServiceId(), getTransportStreamId(), getOriginalNetworkId(), isPresentFollowing(), isActualTS()); + eventLoop.setData(data+offset, getLength()-offset-4); //4 is for CRC +} + +time_t EIT::Event::getStartTime() const { + return DVBTime::getTime(s->mjd_hi, s->mjd_lo, s->start_time_h, s->start_time_m, s->start_time_s); +} + +time_t EIT::Event::getDuration() const { + return DVBTime::getDuration(s->duration_h, s->duration_m, s->duration_s); +} + +int EIT::Event::getEventId() const { + return HILO(s->event_id); +} + +int EIT::Event::getMJD() const { + return HILO(s->mjd); +} + +int EIT::Event::getStartTimeHour() const { + return DVBTime::bcdToDec(s->start_time_h); +} + +int EIT::Event::getStartTimeMinute() const { + return DVBTime::bcdToDec(s->start_time_m); +} + +int EIT::Event::getStartTimeSecond() const { + return DVBTime::bcdToDec(s->start_time_s); +} + +int EIT::Event::getDurationHour() const { + return DVBTime::bcdToDec(s->duration_h); +} + +int EIT::Event::getDurationMinute() const { + return DVBTime::bcdToDec(s->duration_m); +} + +int EIT::Event::getDurationSecond() const { + return DVBTime::bcdToDec(s->duration_s); +} + +RunningStatus EIT::Event::getRunningStatus() const { + return (RunningStatus)s->running_status; +} + +int EIT::Event::getFreeCaMode() const { + return s->free_ca_mode; +} + +void EIT::Event::Parse() { + unsigned int offset=0; + data.setPointerAndOffset<const eit_event>(s, offset); + //printf("%d %d %d\n", getStartTime(), getDuration(), getRunningStatus()); + eventDescriptors.setData(data+offset, HILO(s->descriptors_loop_length)); +} + +/*********************** TDT ***********************/ + +time_t TDT::getTime() const { + return DVBTime::getTime(s->utc_mjd_hi, s->utc_mjd_lo, s->utc_time_h, s->utc_time_m, s->utc_time_s); +} + +void TDT::Parse() { + s=data.getData<const tdt>(); +} + +/*********************** TOT ***********************/ + +time_t TOT::getTime() const { + return DVBTime::getTime(s->utc_mjd_hi, s->utc_mjd_lo, s->utc_time_h, s->utc_time_m, s->utc_time_s); +} + +void TOT::Parse() { + unsigned int offset=0; + data.setPointerAndOffset<const tot>(s, offset); + descriptorLoop.setData(data+offset, getLength()-offset-4); +} + +/*********************** RST ***********************/ + +void RST::Parse() { + unsigned int offset=0; + const rst *s; + data.setPointerAndOffset<const rst>(s, offset); + infoLoop.setData(data+offset, getLength()-offset); +} + +int RST::RunningInfo::getTransportStreamId() const { + return HILO(s->transport_stream_id); +} + +int RST::RunningInfo::getOriginalNetworkId() const { + return HILO(s->original_network_id); +} + +int RST::RunningInfo::getServiceId() const { + return HILO(s->service_id); +} + +int RST::RunningInfo::getEventId() const { + return HILO(s->event_id); +} + +RunningStatus RST::RunningInfo::getRunningStatus() const { + return (RunningStatus)s->running_status; +} + +void RST::RunningInfo::Parse() { + s=data.getData<const rst_info>(); +} + +/*********************** AIT ***********************/ + +int AIT::getApplicationType() const { + return HILO(first->application_type); +} + +int AIT::getAITVersion() const { + return first->version_number; +} + +void AIT::Parse() { + unsigned int offset=0; + data.setPointerAndOffset<const ait>(first, offset); + commonDescriptors.setDataAndOffset(data+offset, HILO(first->common_descriptors_length), offset); + const ait_mid *mid; + data.setPointerAndOffset<const ait_mid>(mid, offset); + applicationLoop.setData(data+offset, HILO(mid->application_loop_length)); +} + +long AIT::Application::getOrganisationId() const { + return data.FourBytes(0); +} + +int AIT::Application::getApplicationId() const { + return HILO(s->application_id); +} + +int AIT::Application::getControlCode() const { + return s->application_control_code; +} + +void AIT::Application::Parse() { + unsigned int offset=0; + data.setPointerAndOffset<const ait_app>(s, offset); + applicationDescriptors.setData(data+offset, HILO(s->application_descriptors_length)); +} + +} //end of namespace diff --git a/libsi/section.h b/libsi/section.h new file mode 100644 index 0000000..efca9bb --- /dev/null +++ b/libsi/section.h @@ -0,0 +1,252 @@ +/*************************************************************************** + * Copyright (c) 2003 by Marcel Wiesweg * + * * + * 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. * + * * + * $Id: section.h 1.2 2003/12/13 10:42:15 kls Exp $ + * * + ***************************************************************************/ + +#ifndef LIBSI_SECTION_H +#define LIBSI_SECTION_H + +#include <time.h> + +#include "si.h" +#include "headers.h" + +namespace SI { + +class PAT : public NumberedSection { +public: + PAT(const unsigned char *data, bool doCopy=true) : NumberedSection(data, doCopy) {} + PAT() {} + class Association : public LoopElement { + public: + int getServiceId() const; + int getPid() const; + bool isNITPid() const { return getServiceId()==0; } + virtual int getLength() { return sizeof(pat_prog); } + protected: + virtual void Parse(); + private: + const pat_prog *s; + }; + int getTransportStreamId() const; + StructureLoop<Association> associationLoop; +protected: + virtual void Parse(); +private: + const pat *s; +}; + +class CAT : public NumberedSection { +public: + CAT(const unsigned char *data, bool doCopy=true) : NumberedSection(data, doCopy) {} + CAT() {} + DescriptorLoop loop; +protected: + virtual void Parse(); +}; + +class PMT : public NumberedSection { +public: + PMT(const unsigned char *data, bool doCopy=true) : NumberedSection(data, doCopy) {} + PMT() {} + class Stream : public LoopElement { + public: + int getPid() const; + int getStreamType() const; + DescriptorLoop streamDescriptors; + virtual int getLength() { return sizeof(pmt_info)+streamDescriptors.getLength(); } + protected: + virtual void Parse(); + private: + const pmt_info *s; + }; + DescriptorLoop commonDescriptors; + StructureLoop<Stream> streamLoop; + int getServiceId() const; + int getPCRPid() const; +protected: + virtual void Parse(); +private: + const pmt *s; +}; + +class NIT : public NumberedSection { +public: + NIT(const unsigned char *data, bool doCopy=true) : NumberedSection(data, doCopy) {} + NIT() {} + class TransportStream : public LoopElement { + public: + int getTransportStreamId() const; + int getOriginalNetworkId() const; + virtual int getLength() { return sizeof(ni_ts)+transportStreamDescriptors.getLength(); } + DescriptorLoop transportStreamDescriptors; + protected: + virtual void Parse(); + private: + const ni_ts *s; + }; + DescriptorLoop commonDescriptors; + StructureLoop<TransportStream> transportStreamLoop; + int getNetworkId() const; +protected: + virtual void Parse(); +private: + const nit *s; +}; + +//BAT has the same structure as NIT but different allowed descriptors +class BAT : public NIT { +public: + BAT(const unsigned char *data, bool doCopy=true) : NIT(data, doCopy) {} + BAT() {} + int getBouquetId() const { return getNetworkId(); } +}; + +class SDT : public NumberedSection { +public: + SDT(const unsigned char *data, bool doCopy=true) : NumberedSection(data, doCopy) {} + SDT() {} + class Service : public LoopElement { + public: + int getServiceId() const; + int getEITscheduleFlag() const; + int getEITpresentFollowingFlag() const; + RunningStatus getRunningStatus() const; + int getFreeCaMode() const; + virtual int getLength() { return sizeof(sdt_descr)+serviceDescriptors.getLength(); } + DescriptorLoop serviceDescriptors; + protected: + virtual void Parse(); + private: + const sdt_descr *s; + }; + int getTransportStreamId() const; + int getOriginalNetworkId() const; + StructureLoop<Service> serviceLoop; +protected: + virtual void Parse(); +private: + const sdt *s; +}; + +class EIT : public NumberedSection { +public: + EIT(const unsigned char *data, bool doCopy=true) : NumberedSection(data, doCopy) {} + EIT() {} + class Event : public LoopElement { + public: + int getEventId() const; + time_t getStartTime() const; //UTC + time_t getDuration() const; + + int getMJD() const; + int getStartTimeHour() const; //UTC + int getStartTimeMinute() const; //UTC + int getStartTimeSecond() const; //UTC + int getDurationHour() const; + int getDurationMinute() const; + int getDurationSecond() const; + RunningStatus getRunningStatus() const; + int getFreeCaMode() const; + + DescriptorLoop eventDescriptors; + virtual int getLength() { return sizeof(eit_event)+eventDescriptors.getLength(); } + protected: + virtual void Parse(); + private: + const eit_event *s; + }; + int getServiceId() const; + int getTransportStreamId() const; + int getOriginalNetworkId() const; + StructureLoop<Event> eventLoop; + + //true if table conveys present/following information, false if it conveys schedule information + bool isPresentFollowing() const; + //true if table describes TS on which it is broadcast, false if it describes other TS + bool isActualTS() const; +protected: + virtual void Parse(); +private: + const eit *s; +}; + +class TDT : public Section { +public: + TDT(const unsigned char *data, bool doCopy=true) : Section(data, doCopy) {} + TDT() {} + time_t getTime() const; //UTC +protected: + virtual void Parse(); +private: + const tdt *s; +}; + +class TOT : public CRCSection { +public: + TOT(const unsigned char *data, bool doCopy=true) : CRCSection(data, doCopy) {} + TOT() {} + time_t getTime() const; + DescriptorLoop descriptorLoop; +protected: + virtual void Parse(); +private: + const tot *s; +}; + +class RST : public Section { +public: + RST(const unsigned char *data, bool doCopy=true) : Section(data, doCopy) {} + RST() {} + class RunningInfo : public LoopElement { + public: + int getTransportStreamId() const; + int getOriginalNetworkId() const; + int getServiceId() const; + int getEventId() const; + RunningStatus getRunningStatus() const; + virtual int getLength() { return sizeof(rst_info); } + protected: + virtual void Parse(); + private: + const rst_info *s; + }; + StructureLoop<RunningInfo> infoLoop; +protected: + virtual void Parse(); +}; + +class AIT : public NumberedSection { +public: + AIT(const unsigned char *data, bool doCopy=true) : NumberedSection(data, doCopy) {} + AIT() {} + class Application : public LoopElement { + public: + virtual int getLength() { return sizeof(ait_app)+applicationDescriptors.getLength(); } + long getOrganisationId() const; + int getApplicationId() const; + int getControlCode() const; + MHP_DescriptorLoop applicationDescriptors; + protected: + virtual void Parse(); + const ait_app *s; + }; + MHP_DescriptorLoop commonDescriptors; + StructureLoop<Application> applicationLoop; + int getApplicationType() const; + int getAITVersion() const; +protected: + const ait *first; + virtual void Parse(); +}; + +} //end of namespace + +#endif //LIBSI_TABLE_H diff --git a/libsi/si.c b/libsi/si.c new file mode 100644 index 0000000..bcf519a --- /dev/null +++ b/libsi/si.c @@ -0,0 +1,415 @@ +/*************************************************************************** + * Copyright (c) 2003 by Marcel Wiesweg * + * * + * 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. * + * * + * $Id: si.c 1.3 2004/01/04 14:26:53 kls Exp $ + * * + ***************************************************************************/ + +#include <string.h> +#include "si.h" +#include "descriptor.h" + +namespace SI { + +Object::Object() { +} + +Object::Object(CharArray &d) : data(d) { +} + +void Object::setData(const unsigned char*d, unsigned int size, bool doCopy) { + data.assign(d, size, doCopy); +} + +void Object::setData(CharArray &d) { + data=d; +} + +Section::Section(const unsigned char *data, bool doCopy) { + setData(data, getLength(data), doCopy); +} + +TableId Section::getTableId() const { + return getTableId(data.getData()); +} + +int Section::getLength() { + return getLength(data.getData()); +} + +TableId Section::getTableId(const unsigned char *d) { + return (TableId)((const SectionHeader *)d)->table_id; +} + +int Section::getLength(const unsigned char *d) { + return HILO(((const SectionHeader *)d)->section_length)+sizeof(SectionHeader); +} + +bool CRCSection::isValid() { + return CRC32::isValid((const char *)data.getData(), getLength()/*, data.FourBytes(getLength()-4)*/); +} + +bool CRCSection::CheckCRCAndParse() { + if (!isValid()) + return false; + CheckParse(); + return true; +} + +bool NumberedSection::getCurrentNextIndicator() const { + return data.getData<ExtendedSectionHeader>()->current_next_indicator; +} + +int NumberedSection::getVersionNumber() const { + return data.getData<ExtendedSectionHeader>()->version_number; +} + +int NumberedSection::getSectionNumber() const { + return data.getData<ExtendedSectionHeader>()->section_number; +} + +int NumberedSection::getLastSectionNumber() const { + return data.getData<ExtendedSectionHeader>()->last_section_number; +} + +int Descriptor::getLength() { + return getLength(data.getData()); +} + +DescriptorTag Descriptor::getDescriptorTag() const { + return getDescriptorTag(data.getData()); +} + +int Descriptor::getLength(const unsigned char *d) { + return ((const DescriptorHeader*)d)->descriptor_length+sizeof(DescriptorHeader); +} + +DescriptorTag Descriptor::getDescriptorTag(const unsigned char *d) { + return (DescriptorTag)((const DescriptorHeader*)d)->descriptor_tag; +} + +Descriptor *DescriptorLoop::getNext(Iterator &it) { + if (it.i<getLength()) { + return createDescriptor(it.i); + } + return 0; +} + +Descriptor *DescriptorLoop::getNext(Iterator &it, DescriptorTag tag, bool returnUnimplemetedDescriptor) { + Descriptor *d=0; + if (it.i<getLength()) { + const unsigned char *p=data.getData(it.i); + const unsigned char *end=p+getLength(); + while (p < end) { + if (Descriptor::getDescriptorTag(p) == tag) { + d=createDescriptor(it.i); + break; + } + it.i+=Descriptor::getLength(p); + p+=Descriptor::getLength(p); + } + } + if (d && d->getDescriptorTag()==UnimplementedDescriptorTag) + return returnUnimplemetedDescriptor ? d : 0; + return d; +} + +Descriptor *DescriptorLoop::getNext(Iterator &it, DescriptorTag *tags, int arrayLength, bool returnUnimplemetedDescriptor) { + Descriptor *d=0; + if (it.i<getLength()) { + const unsigned char *p=data.getData(it.i); + const unsigned char *end=p+getLength(); + while (p < end) { + for (int u=0; u<arrayLength;u++) + if (Descriptor::getDescriptorTag(p) == tags[u]) { + d=createDescriptor(it.i); + break; + } + if (d) + break; + it.i+=Descriptor::getLength(p); + p+=Descriptor::getLength(p); + } + } + if (d && d->getDescriptorTag()==UnimplementedDescriptorTag) + return returnUnimplemetedDescriptor ? d : 0; + return d; +} + +Descriptor *DescriptorLoop::createDescriptor(int &i) { + Descriptor *d=Descriptor::getDescriptor(data+i, domain); + i+=d->getLength(); + d->CheckParse(); + return d; +} + +DescriptorGroup::DescriptorGroup(bool del) { + array=0; + length=0; + deleteOnDesctruction=del; +} + +DescriptorGroup::~DescriptorGroup() { + if (deleteOnDesctruction) + Delete(); + delete[] array; +} + +void DescriptorGroup::Delete() { + for (int i=0;i<length;i++) + if (array[i]!=0) { + delete array[i]; + array[i]=0; + } +} + +void DescriptorGroup::Add(GroupDescriptor *d) { + if (!array) { + length=d->getLastDescriptorNumber()+1; + array=new GroupDescriptor*[length]; //numbering is zero-based + for (int i=0;i<length;i++) + array[i]=0; + } else if (length != d->getLastDescriptorNumber()+1) + return; //avoid crash in case of misuse + array[d->getDescriptorNumber()]=d; +} + +bool DescriptorGroup::isComplete() { + for (int i=0;i<length;i++) + if (array[i]==0) + return false; + return true; +} + +char *String::getText() { + if (getLength() < 0 || getLength() >4095) + return "text error"; + char *data=new char(getLength()+1); + decodeText(data); + return data; +} + +char *String::getText(char *buffer) { + if (getLength() < 0 || getLength() >4095) { + strncpy(buffer, "text error", getLength()+1); + return buffer; + } + decodeText(buffer); + return buffer; +} + +//taken from libdtv, Copyright Rolf Hakenes <hakenes@hippomi.de> +void String::decodeText(char *buffer) { + const unsigned char *from=data.getData(0); + char *to=buffer; + + /* Disable detection of coding tables - libdtv doesn't do it either + if ( (0x01 <= *from) && (*from <= 0x1f) ) { + codeTable=*from + } + */ + + for (int i = 0; i < getLength(); i++) { + if (*from == 0) + break; + if ( ((' ' <= *from) && (*from <= '~')) + || (*from == '\n') + || ((0xA0 <= *from) && (*from <= 0xFF)) + ) + *to++ = *from; + else if (*from == 0x8A) + *to++ = '\n'; + else if (*from == 0x86 || *from == 0x87) //&& !(GDT_NAME_DESCRIPTOR & type)) + *to++ = *from; + from++; + } + *to = '\0'; +} + +Descriptor *Descriptor::getDescriptor(CharArray da, DescriptorTagDomain domain) { + Descriptor *d=0; + switch (domain) { + case SI: + switch ((DescriptorTag)da.getData<DescriptorHeader>()->descriptor_tag) { + case CaDescriptorTag: + d=new CaDescriptor(); + break; + case CarouselIdentifierDescriptorTag: + d=new CarouselIdentifierDescriptor(); + break; + case NetworkNameDescriptorTag: + d=new NetworkNameDescriptor(); + break; + case ServiceListDescriptorTag: + d=new ServiceListDescriptor(); + break; + case SatelliteDeliverySystemDescriptorTag: + d=new SatelliteDeliverySystemDescriptor(); + break; + case CableDeliverySystemDescriptorTag: + d=new CableDeliverySystemDescriptor(); + break; + case TerrestrialDeliverySystemDescriptorTag: + d=new TerrestrialDeliverySystemDescriptor(); + break; + case BouquetNameDescriptorTag: + d=new BouquetNameDescriptor(); + break; + case ServiceDescriptorTag: + d=new ServiceDescriptor(); + break; + case NVODReferenceDescriptorTag: + d=new NVODReferenceDescriptor(); + break; + case TimeShiftedServiceDescriptorTag: + d=new TimeShiftedServiceDescriptor(); + break; + case ComponentDescriptorTag: + d=new ComponentDescriptor(); + break; + case StreamIdentifierDescriptorTag: + d=new StreamIdentifierDescriptor(); + break; + case SubtitlingDescriptorTag: + d=new SubtitlingDescriptor(); + break; + case MultilingualNetworkNameDescriptorTag: + d=new MultilingualNetworkNameDescriptor(); + break; + case MultilingualBouquetNameDescriptorTag: + d=new MultilingualBouquetNameDescriptor(); + break; + case MultilingualServiceNameDescriptorTag: + d=new MultilingualServiceNameDescriptor(); + break; + case MultilingualComponentDescriptorTag: + d=new MultilingualComponentDescriptor(); + break; + case ServiceMoveDescriptorTag: + d=new ServiceMoveDescriptor(); + break; + case FrequencyListDescriptorTag: + d=new FrequencyListDescriptor(); + break; + case ServiceIdentifierDescriptorTag: + d=new ServiceIdentifierDescriptor(); + break; + case CaIdentifierDescriptorTag: + d=new CaIdentifierDescriptor(); + break; + case ShortEventDescriptorTag: + d=new ShortEventDescriptor(); + break; + case ExtendedEventDescriptorTag: + d=new ExtendedEventDescriptor(); + break; + case TimeShiftedEventDescriptorTag: + d=new TimeShiftedEventDescriptor(); + break; + case ContentDescriptorTag: + d=new ContentDescriptor(); + break; + case ParentalRatingDescriptorTag: + d=new ParentalRatingDescriptor(); + break; + case ApplicationSignallingDescriptorTag: + d=new ApplicationSignallingDescriptor(); + break; + + //note that it is no problem to implement one + //of the unimplemented descriptors. + + //defined in ISO-13818-1 + case VideoStreamDescriptorTag: + case AudioStreamDescriptorTag: + case HierarchyDescriptorTag: + case RegistrationDescriptorTag: + case DataStreamAlignmentDescriptorTag: + case TargetBackgroundGridDescriptorTag: + case VideoWindowDescriptorTag: + case ISO639LanguageDescriptorTag: + case SystemClockDescriptorTag: + case MultiplexBufferUtilizationDescriptorTag: + case CopyrightDescriptorTag: + case MaximumBitrateDescriptorTag: + case PrivateDataIndicatorDescriptorTag: + case SmoothingBufferDescriptorTag: + case STDDescriptorTag: + case IBPDescriptorTag: + + //defined in ETSI EN 300 468 + case StuffingDescriptorTag: + case VBIDataDescriptorTag: + case VBITeletextDescriptorTag: + case CountryAvailabilityDescriptorTag: + case MocaicDescriptorTag: + case LinkageDescriptorTag: + case TeletextDescriptorTag: + case TelephoneDescriptorTag: + case LocalTimeOffsetDescriptorTag: + case PrivateDataSpecifierDescriptorTag: + case CellListDescriptorTag: + case CellFrequencyLinkDescriptorTag: + case ServiceAvailabilityDescriptorTag: + case ShortSmoothingBufferDescriptorTag: + case PartialTransportStreamDescriptorTag: + case DataBroadcastDescriptorTag: + case DataBroadcastIdDescriptorTag: + case CaSystemDescriptorTag: + case AC3DescriptorTag: + case DSNGDescriptorTag: + case PDCDescriptorTag: + case AncillaryDataDescriptorTag: + case AnnouncementSupportDescriptorTag: + case AdaptationFieldDataDescriptorTag: + case TransportStreamDescriptorTag: + default: + d=new UnimplementedDescriptor(); + break; + } + break; + case MHP: + switch ((DescriptorTag)da.getData<DescriptorHeader>()->descriptor_tag) { + // They once again start with 0x00 (see page 234, MHP specification) + case MHP_ApplicationDescriptorTag: + d=new MHP_ApplicationDescriptor(); + break; + case MHP_ApplicationNameDescriptorTag: + d=new MHP_ApplicationNameDescriptor(); + break; + case MHP_TransportProtocolDescriptorTag: + d=new MHP_TransportProtocolDescriptor(); + break; + case MHP_DVBJApplicationDescriptorTag: + d=new MHP_DVBJApplicationDescriptor(); + break; + case MHP_DVBJApplicationLocationDescriptorTag: + d=new MHP_DVBJApplicationLocationDescriptor(); + break; + // 0x05 - 0x0A is unimplemented this library + case MHP_ExternalApplicationAuthorisationDescriptorTag: + case MHP_IPv4RoutingDescriptorTag: + case MHP_IPv6RoutingDescriptorTag: + case MHP_DVBHTMLApplicationDescriptorTag: + case MHP_DVBHTMLApplicationLocationDescriptorTag: + case MHP_DVBHTMLApplicationBoundaryDescriptorTag: + case MHP_ApplicationIconsDescriptorTag: + case MHP_PrefetchDescriptorTag: + case MHP_DelegatedApplicationDescriptorTag: + case MHP_ApplicationStorageDescriptorTag: + default: + d=new UnimplementedDescriptor(); + break; + } + break; + } + d->setData(da); + return d; +} + +} //end of namespace diff --git a/libsi/si.h b/libsi/si.h new file mode 100644 index 0000000..31d17cb --- /dev/null +++ b/libsi/si.h @@ -0,0 +1,392 @@ +/*************************************************************************** + * Copyright (c) 2003 by Marcel Wiesweg * + * * + * 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. * + * * + * $Id: si.h 1.3 2003/12/26 14:09:30 kls Exp $ + * * + ***************************************************************************/ + +#ifndef LIBSI_SI_H +#define LIBSI_SI_H + +#include <stdint.h> + +#include "util.h" +#include "headers.h" + +namespace SI { + +enum TableId { TableIdPAT = 0x00, //program association section + TableIdCAT = 0x01, //conditional access section + TableIdPMT = 0x02, //program map section + TableIdTSDT = 0x03,//transport stream description section + TableIdNIT = 0x40, //network information, actual network section + TableIdNIT_other = 0x41, //network information section, other network + TableIdSDT = 0x42, //service description section + TableIdSDT_other = 0x46, + TableIdBAT = 0x46, //bouquet association section + TableIdEIT_presentFollowing = 0x4E, //event information section + TableIdEIT_presentFollowing_other = 0x4F, + //range from 0x50 to 0x5F + TableIdEIT_schedule_first = 0x50, + TableIdEIT_schedule_last = 0x5F, + //range from 0x60 to 0x6F + TableIdEIT_schedule_Other_first = 0x60, + TableIdEIT_schedule_Other_fast = 0x6F, + TableIdTDT = 0x70, //time date section + TableIdRST = 0x71, //running status section + TableIdST = 0x72, //stuffing section + TableIdTOT = 0x73, //time offset section + TableIdDIT = 0x7E, //discontinuity information section + TableIdSIT = 0x7F, //service information section + TableIdAIT = 0x74 //application information section + }; + + +enum DescriptorTag { + // defined by ISO/IEC 13818-1 + VideoStreamDescriptorTag = 0x02, + AudioStreamDescriptorTag = 0x03, + HierarchyDescriptorTag = 0x04, + RegistrationDescriptorTag = 0x05, + DataStreamAlignmentDescriptorTag = 0x06, + TargetBackgroundGridDescriptorTag = 0x07, + VideoWindowDescriptorTag = 0x08, + CaDescriptorTag = 0x09, + ISO639LanguageDescriptorTag = 0x0A, + SystemClockDescriptorTag = 0x0B, + MultiplexBufferUtilizationDescriptorTag = 0x0C, + CopyrightDescriptorTag = 0x0D, + MaximumBitrateDescriptorTag = 0x0E, + PrivateDataIndicatorDescriptorTag = 0x0F, + SmoothingBufferDescriptorTag = 0x10, + STDDescriptorTag = 0x11, + IBPDescriptorTag = 0x12, + // defined by ISO-13818-6 (DSM-CC) + CarouselIdentifierDescriptorTag = 0x13, + // 0x14 - 0x3F Reserved + // defined by ETSI (EN 300 468) + NetworkNameDescriptorTag = 0x40, + ServiceListDescriptorTag = 0x41, + StuffingDescriptorTag = 0x42, + SatelliteDeliverySystemDescriptorTag = 0x43, + CableDeliverySystemDescriptorTag = 0x44, + VBIDataDescriptorTag = 0x45, + VBITeletextDescriptorTag = 0x46, + BouquetNameDescriptorTag = 0x47, + ServiceDescriptorTag = 0x48, + CountryAvailabilityDescriptorTag = 0x49, + LinkageDescriptorTag = 0x4A, + NVODReferenceDescriptorTag = 0x4B, + TimeShiftedServiceDescriptorTag = 0x4C, + ShortEventDescriptorTag = 0x4D, + ExtendedEventDescriptorTag = 0x4E, + TimeShiftedEventDescriptorTag = 0x4F, + ComponentDescriptorTag = 0x50, + MocaicDescriptorTag = 0x51, + StreamIdentifierDescriptorTag = 0x52, + CaIdentifierDescriptorTag = 0x53, + ContentDescriptorTag = 0x54, + ParentalRatingDescriptorTag = 0x55, + TeletextDescriptorTag = 0x56, + TelephoneDescriptorTag = 0x57, + LocalTimeOffsetDescriptorTag = 0x58, + SubtitlingDescriptorTag = 0x59, + TerrestrialDeliverySystemDescriptorTag = 0x5A, + MultilingualNetworkNameDescriptorTag = 0x5B, + MultilingualBouquetNameDescriptorTag = 0x5C, + MultilingualServiceNameDescriptorTag = 0x5D, + MultilingualComponentDescriptorTag = 0x5E, + PrivateDataSpecifierDescriptorTag = 0x5F, + ServiceMoveDescriptorTag = 0x60, + ShortSmoothingBufferDescriptorTag = 0x61, + FrequencyListDescriptorTag = 0x62, + PartialTransportStreamDescriptorTag = 0x63, + DataBroadcastDescriptorTag = 0x64, + CaSystemDescriptorTag = 0x65, + DataBroadcastIdDescriptorTag = 0x66, + TransportStreamDescriptorTag = 0x67, + DSNGDescriptorTag = 0x68, + PDCDescriptorTag = 0x69, + AC3DescriptorTag = 0x6A, + AncillaryDataDescriptorTag = 0x6B, + CellListDescriptorTag = 0x6C, + CellFrequencyLinkDescriptorTag = 0x6D, + AnnouncementSupportDescriptorTag = 0x6E, + ApplicationSignallingDescriptorTag = 0x6F, + AdaptationFieldDataDescriptorTag = 0x70, + ServiceIdentifierDescriptorTag = 0x71, + ServiceAvailabilityDescriptorTag = 0x72, + // Defined by ETSI TS 102 812 (MHP) + // They once again start with 0x00 (see page 234, MHP specification) + MHP_ApplicationDescriptorTag = 0x00, + MHP_ApplicationNameDescriptorTag = 0x01, + MHP_TransportProtocolDescriptorTag = 0x02, + MHP_DVBJApplicationDescriptorTag = 0x03, + MHP_DVBJApplicationLocationDescriptorTag = 0x04, + // 0x05 - 0x0A is unimplemented this library + MHP_ExternalApplicationAuthorisationDescriptorTag = 0x05, + MHP_IPv4RoutingDescriptorTag = 0x06, + MHP_IPv6RoutingDescriptorTag = 0x07, + MHP_DVBHTMLApplicationDescriptorTag = 0x08, + MHP_DVBHTMLApplicationLocationDescriptorTag = 0x09, + MHP_DVBHTMLApplicationBoundaryDescriptorTag = 0x0A, + MHP_ApplicationIconsDescriptorTag = 0x0B, + MHP_PrefetchDescriptorTag = 0x0C, + MHP_DelegatedApplicationDescriptorTag = 0x0E, + MHP_ApplicationStorageDescriptorTag = 0x10, + + //a descriptor currently unimplemented in this library + //the actual value 0xFF is "forbidden" according to the spec. + UnimplementedDescriptorTag = 0xFF +}; + +enum DescriptorTagDomain { SI, MHP }; + +enum RunningStatus { RunningStatusUndefined = 0, + RunningStatusNotRunning = 1, + RunningStatusStartsInAFewSeconds = 2, + RunningStatusPausing = 3, + RunningStatusRunning = 4 + }; + +/* Some principles: + - Objects that return references to other objects contained in their data must make sure + that the returned objects have been parsed. + (the Loop subclasses take care of that.) + Note that this does not apply to Loops and Strings (their are never returned by reference, BTW). +*/ + +class Object : public Parsable { +public: + Object(); + Object(CharArray &d); + //can only be called once since data is immutable + void setData(const unsigned char*data, unsigned int size, bool doCopy=true); + virtual int getLength() = 0; +protected: + CharArray data; + //is protected - not used for sections + template <class T> friend class StructureLoop; + void setData(CharArray &d); +}; + +class Section : public Object { +public: + //convenience: sets data and parses if doParse + Section(const unsigned char *data, bool doCopy=true); + Section() {} + TableId getTableId() const; + virtual int getLength(); + + static int getLength(const unsigned char *d); + static TableId getTableId(const unsigned char *d); +}; + +class CRCSection : public Section { +public: + //convenience: sets data and parses if doParse + CRCSection(const unsigned char *data, bool doCopy=true) : Section(data, doCopy) {} + CRCSection() {} + bool isValid(); + //convenience: isValid+CheckParse + bool CheckCRCAndParse(); +}; + +/* A section which has the ExtendedSectionHeader + (section_syntax_indicator==1) */ +class NumberedSection : public CRCSection { +public: + NumberedSection(const unsigned char *data, bool doCopy=true) : CRCSection(data, doCopy) {} + NumberedSection() {} + bool getCurrentNextIndicator() const; + int getVersionNumber() const; + int getSectionNumber() const; + int getLastSectionNumber() const; + bool moreThanOneSection() const { return getLastSectionNumber()>1; } +}; + +class VariableLengthPart : public Object { +public: + //never forget to call this + void setData(CharArray d, int l) { Object::setData(d); length=l; } + //convenience method + void setDataAndOffset(CharArray d, int l, unsigned int &offset) { Object::setData(d); length=l; offset+=l; } + virtual int getLength() { return length; } +private: + int length; +}; + +class LoopElement : public Object { +}; + +class SubStructure : public LoopElement { +}; + +class Descriptor : public LoopElement { +public: + virtual int getLength(); + DescriptorTag getDescriptorTag() const; + + static int getLength(const unsigned char *d); + static DescriptorTag getDescriptorTag(const unsigned char *d); +protected: + friend class DescriptorLoop; + //returns a subclass of descriptor according to the data given. + //The object is allocated with new and must be delete'd. + //setData() will have been called, CheckParse() not. + //Never returns null - maybe the UnimplementedDescriptor. + static Descriptor *getDescriptor(CharArray d, DescriptorTagDomain domain); +}; + +class Loop : public VariableLengthPart { +public: + class Iterator { + public: + Iterator() { i=0; } + void reset() { i=0; } + private: + template <class T> friend class StructureLoop; + friend class DescriptorLoop; + template <class T> friend class TypeLoop; + int i; + }; +protected: + virtual void Parse() {} +}; + +//contains LoopElements of one type only +template <class T> class StructureLoop : public Loop { +public: + //currently you must use a while-loop testing for hasNext() + //i must be 0 to get the first descriptor (with the first call) + T getNext(Iterator &it) + { + CharArray d=data; + d.addOffset(it.i); + T ret; + ret.setData(d); + ret.CheckParse(); + it.i+=ret.getLength(); + return ret; + } + T* getNextAsPointer(Iterator &it) + { + if (getLength() <= it.i) + return 0; + CharArray d=data; + d.addOffset(it.i); + T *ret=new T(); + ret->setData(d); + ret->CheckParse(); + it.i+=ret->getLength(); + return ret; + } + bool hasNext(Iterator &it) { return getLength() > it.i; } +}; + +//contains descriptors of different types +class DescriptorLoop : public Loop { +public: + DescriptorLoop() { domain=SI; } + //i must be 0 to get the first descriptor (with the first call) + //All returned descriptors must be delete'd. + //returns null if no more descriptors available + Descriptor *getNext(Iterator &it); + //return the next descriptor with given tag, or 0 if not available. + //if the descriptor found is not implemented, + // an UnimplementedDescriptor will be returned if returnUnimplemetedDescriptor==true, + // 0 will be returned if returnUnimplemetedDescriptor==false + Descriptor *getNext(Iterator &it, DescriptorTag tag, bool returnUnimplemetedDescriptor=false); + //return the next descriptor with one of the given tags, or 0 if not available. + Descriptor *getNext(Iterator &it, DescriptorTag *tags, int arrayLength, bool returnUnimplemetedDescriptor=false); +protected: + Descriptor *createDescriptor(int &i); + DescriptorTagDomain domain; +}; + +typedef uint8_t EightBit; +typedef uint16_t SixteenBit; +typedef uint32_t ThirtyTwoBit; +typedef uint64_t SixtyFourBit; + +template <typename T> class TypeLoop : public Loop { +public: + int getCount() const { return getLength()/sizeof(T); } + T operator[](const unsigned int index) const + { + switch (sizeof(T)) { + case 1: + return data[index]; + case 2: + return data.TwoBytes(index); + case 4: + return data.FourBytes(index); + case 8: + return (SixtyFourBit(data.FourBytes(index)) << 32) | data.FourBytes(index+4); + } + } + T getNext(Iterator &it) const + { + T ret=operator[](it.i); + it.i+=sizeof(T); + return ret; + } + bool hasNext(Iterator &it) { return getLength() > it.i; } +}; + +class MHP_DescriptorLoop : public DescriptorLoop { +public: + MHP_DescriptorLoop() { domain=MHP; } +}; + +//The content of the ExtendedEventDescriptor may be split over several +//descriptors if the text is longer than 256 bytes. +//The following classes provide base functionality to handle this case. +class GroupDescriptor : public Descriptor { +public: + virtual int getDescriptorNumber() = 0; + virtual int getLastDescriptorNumber() = 0; +}; + +class DescriptorGroup { +public: + DescriptorGroup(bool deleteOnDesctruction=true); + ~DescriptorGroup(); + void Add(GroupDescriptor *d); + void Delete(); + int getLength() { return length; } + GroupDescriptor **getDescriptors() { return array; } + bool isComplete(); //if all descriptors have been added +protected: + int length; + GroupDescriptor **array; + bool deleteOnDesctruction; +}; + +class String : public VariableLengthPart { +public: + //A note to the length: getLength() returns the length of the raw data. + //The text may be shorter. Its length can be obtained with one of the + //above functions and strlen. + + //returns text. Data is allocated with new and must be delete'd by the user. + char *getText(); + //copies text into given buffer. + //a buffer of size getLength()+1 is guaranteed to be sufficiently large. + //In most descriptors the string length is an 8-bit field, + //so the maximum there is 256. + //returns the given buffer for convenience. + char * getText(char *buffer); +protected: + virtual void Parse() {} + void decodeText(char *buffer); +}; + +} //end of namespace + +#endif //LIBSI_SI_H diff --git a/libsi/util.c b/libsi/util.c new file mode 100644 index 0000000..a2a6f0d --- /dev/null +++ b/libsi/util.c @@ -0,0 +1,281 @@ +/*************************************************************************** + * Copyright (c) 2003 by Marcel Wiesweg, Rolf Hakenes * + * * + * 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. * + * * + * $Id: util.c 1.3 2003/12/22 14:03:03 kls Exp $ + * * + ***************************************************************************/ + +#include <string.h> +#include "util.h" + +namespace SI { + +/*---------------------------- CharArray ----------------------------*/ + +CharArray::CharArray() : data_(0), off(0) { +} + +CharArray::~CharArray() { + if (!data_) + return; + if (--data_->count_ == 0) + delete data_; +} + +CharArray::CharArray(const CharArray &f) : data_(f.data_), off(f.off) { + if (data_) + ++ data_->count_; +} + +CharArray& CharArray::operator=(const CharArray &f) { + // DO NOT CHANGE THE ORDER OF THESE STATEMENTS! + // (This order properly handles self-assignment) + if (f.data_) { + ++ f.data_->count_; + } + if (data_) { + if (--data_->count_ == 0) + delete data_; + } + data_ = f.data_; + off = f.off; + return *this; +} + +void CharArray::assign(const unsigned char*data, unsigned int size, bool doCopy) { + //immutable + if (!data_) + data_= doCopy ? (Data*)new DataOwnData() : (Data*)new DataForeignData(); + // This method might need to change things in *data_ + // Thus it first checks if this is the only pointer to *data_ + if (data_->count_ > 1) { + Data* d = doCopy ? (Data*)new DataOwnData() : (Data*)new DataForeignData(); + -- data_->count_; + data_ = d; + } + data_->assign(data, size); +} + +bool CharArray::operator==(const char *string) const { + //here we can use strcmp, string is null-terminated. + if (!data_) + return false; + return data_->size ? (!strcmp((const char*)data_->data, string)) : string[0]==0; +} + +bool CharArray::operator==(const CharArray &other) const { + if (!data_ || !other.data_) + return !(data_ || other.data_); //true if both empty + + if (data_->size != other.data_->size) + return false; + + //do _not_ use strcmp! Data is not necessarily null-terminated. + for (unsigned int i=0;i<data_->size;i++) + if (data_->data[i] != other.data_->data[i]) + return false; + return true; +} + +CharArray CharArray::operator+(const unsigned int offset) const { + CharArray f(*this); + f.off+=offset; + return f; +} + +CharArray::Data::Data() : count_(1) { + size=0; + data=0; + /* + lockingPid = 0; + locked = 0; + pthread_mutex_init(&mutex, NULL); + */ +} + +CharArray::Data::~Data() { + /* + if (locked) + pthread_mutex_unlock(&mutex); + pthread_mutex_destroy(&mutex); + */ +} + +/*CharArray::Data::Data(const Data& d) : count_(1) { + size=0; + data=0; + + lockingPid = 0; + locked = 0; + pthread_mutex_init(&mutex, NULL); +}*/ + +CharArray::DataOwnData::~DataOwnData() { + Delete(); +} + +void CharArray::DataOwnData::assign(const unsigned char*d, unsigned int s) { + Delete(); + size=s; + unsigned char *newdata=new unsigned char[size]; + memcpy(newdata, d, size); + data=newdata; +} + +void CharArray::DataOwnData::Delete() { + delete[] data; +} + +CharArray::DataForeignData::~DataForeignData() { + Delete(); +} + +void CharArray::DataForeignData::assign(const unsigned char*d, unsigned int s) { + size=s; + data=d; +} + +void CharArray::DataForeignData::Delete() { + //do not delete! +} + +/* +void CharArray::Data::assign(unsigned int s) { + if (data) + delete[] data; + size=s; + if (size) { //new assignment may be zero length + data=new unsigned char[size]; + memset(data, 0, size); + } +} + +void CharArray::Data::Lock(void) +{ + if ( !pthread_equal(pthread_self(), lockingPid) || !locked) { + pthread_mutex_lock(&mutex); + lockingPid = pthread_self(); + } + locked++; +} + +void CharArray::Data::Unlock(void) +{ + if (!--locked) { + lockingPid = 0; + pthread_mutex_unlock(&mutex); + } +} +*/ + +Parsable::Parsable() { + parsed=false; +} + +void Parsable::CheckParse() { + if (!parsed) { + parsed=true; + Parse(); + } +} + +//taken and adapted from libdtv, (c) Rolf Hakenes and VDR, (c) Klaus Schmidinger +time_t DVBTime::getTime(unsigned char date_hi, unsigned char date_lo, unsigned char time_hour, unsigned char time_minute, unsigned char time_second) { + u_int16_t mjd = date_hi << 8 | date_lo; + struct tm t; + + t.tm_sec = bcdToDec(time_second); + t.tm_min = bcdToDec(time_minute); + t.tm_hour = bcdToDec(time_hour); + + int k; + t.tm_year = (int) ((mjd - 15078.2) / 365.25); + t.tm_mon = (int) ((mjd - 14956.1 - (int)(t.tm_year * 365.25)) / 30.6001); + t.tm_mday = (int) (mjd - 14956 - (int)(t.tm_year * 365.25) - (int)(t.tm_mon * 30.6001)); + k = (t.tm_mon == 14 || t.tm_mon == 15) ? 1 : 0; + t.tm_year = t.tm_year + k; + t.tm_mon = t.tm_mon - 1 - k * 12; + t.tm_mon--; + + t.tm_isdst = -1; + t.tm_gmtoff = 0; + + return timegm(&t); +} + +time_t DVBTime::getDuration(unsigned char time_hour, unsigned char time_minute, unsigned char time_second) { + return + bcdToDec(time_second) + + bcdToDec(time_minute) * 60 + + bcdToDec(time_hour) *3600; +} + +//taken and adapted from libdtv, (c) Rolf Hakenes +// CRC32 lookup table for polynomial 0x04c11db7 +u_int32_t CRC32::crc_table[256] = { + 0x00000000, 0x04c11db7, 0x09823b6e, 0x0d4326d9, 0x130476dc, 0x17c56b6b, + 0x1a864db2, 0x1e475005, 0x2608edb8, 0x22c9f00f, 0x2f8ad6d6, 0x2b4bcb61, + 0x350c9b64, 0x31cd86d3, 0x3c8ea00a, 0x384fbdbd, 0x4c11db70, 0x48d0c6c7, + 0x4593e01e, 0x4152fda9, 0x5f15adac, 0x5bd4b01b, 0x569796c2, 0x52568b75, + 0x6a1936c8, 0x6ed82b7f, 0x639b0da6, 0x675a1011, 0x791d4014, 0x7ddc5da3, + 0x709f7b7a, 0x745e66cd, 0x9823b6e0, 0x9ce2ab57, 0x91a18d8e, 0x95609039, + 0x8b27c03c, 0x8fe6dd8b, 0x82a5fb52, 0x8664e6e5, 0xbe2b5b58, 0xbaea46ef, + 0xb7a96036, 0xb3687d81, 0xad2f2d84, 0xa9ee3033, 0xa4ad16ea, 0xa06c0b5d, + 0xd4326d90, 0xd0f37027, 0xddb056fe, 0xd9714b49, 0xc7361b4c, 0xc3f706fb, + 0xceb42022, 0xca753d95, 0xf23a8028, 0xf6fb9d9f, 0xfbb8bb46, 0xff79a6f1, + 0xe13ef6f4, 0xe5ffeb43, 0xe8bccd9a, 0xec7dd02d, 0x34867077, 0x30476dc0, + 0x3d044b19, 0x39c556ae, 0x278206ab, 0x23431b1c, 0x2e003dc5, 0x2ac12072, + 0x128e9dcf, 0x164f8078, 0x1b0ca6a1, 0x1fcdbb16, 0x018aeb13, 0x054bf6a4, + 0x0808d07d, 0x0cc9cdca, 0x7897ab07, 0x7c56b6b0, 0x71159069, 0x75d48dde, + 0x6b93dddb, 0x6f52c06c, 0x6211e6b5, 0x66d0fb02, 0x5e9f46bf, 0x5a5e5b08, + 0x571d7dd1, 0x53dc6066, 0x4d9b3063, 0x495a2dd4, 0x44190b0d, 0x40d816ba, + 0xaca5c697, 0xa864db20, 0xa527fdf9, 0xa1e6e04e, 0xbfa1b04b, 0xbb60adfc, + 0xb6238b25, 0xb2e29692, 0x8aad2b2f, 0x8e6c3698, 0x832f1041, 0x87ee0df6, + 0x99a95df3, 0x9d684044, 0x902b669d, 0x94ea7b2a, 0xe0b41de7, 0xe4750050, + 0xe9362689, 0xedf73b3e, 0xf3b06b3b, 0xf771768c, 0xfa325055, 0xfef34de2, + 0xc6bcf05f, 0xc27dede8, 0xcf3ecb31, 0xcbffd686, 0xd5b88683, 0xd1799b34, + 0xdc3abded, 0xd8fba05a, 0x690ce0ee, 0x6dcdfd59, 0x608edb80, 0x644fc637, + 0x7a089632, 0x7ec98b85, 0x738aad5c, 0x774bb0eb, 0x4f040d56, 0x4bc510e1, + 0x46863638, 0x42472b8f, 0x5c007b8a, 0x58c1663d, 0x558240e4, 0x51435d53, + 0x251d3b9e, 0x21dc2629, 0x2c9f00f0, 0x285e1d47, 0x36194d42, 0x32d850f5, + 0x3f9b762c, 0x3b5a6b9b, 0x0315d626, 0x07d4cb91, 0x0a97ed48, 0x0e56f0ff, + 0x1011a0fa, 0x14d0bd4d, 0x19939b94, 0x1d528623, 0xf12f560e, 0xf5ee4bb9, + 0xf8ad6d60, 0xfc6c70d7, 0xe22b20d2, 0xe6ea3d65, 0xeba91bbc, 0xef68060b, + 0xd727bbb6, 0xd3e6a601, 0xdea580d8, 0xda649d6f, 0xc423cd6a, 0xc0e2d0dd, + 0xcda1f604, 0xc960ebb3, 0xbd3e8d7e, 0xb9ff90c9, 0xb4bcb610, 0xb07daba7, + 0xae3afba2, 0xaafbe615, 0xa7b8c0cc, 0xa379dd7b, 0x9b3660c6, 0x9ff77d71, + 0x92b45ba8, 0x9675461f, 0x8832161a, 0x8cf30bad, 0x81b02d74, 0x857130c3, + 0x5d8a9099, 0x594b8d2e, 0x5408abf7, 0x50c9b640, 0x4e8ee645, 0x4a4ffbf2, + 0x470cdd2b, 0x43cdc09c, 0x7b827d21, 0x7f436096, 0x7200464f, 0x76c15bf8, + 0x68860bfd, 0x6c47164a, 0x61043093, 0x65c52d24, 0x119b4be9, 0x155a565e, + 0x18197087, 0x1cd86d30, 0x029f3d35, 0x065e2082, 0x0b1d065b, 0x0fdc1bec, + 0x3793a651, 0x3352bbe6, 0x3e119d3f, 0x3ad08088, 0x2497d08d, 0x2056cd3a, + 0x2d15ebe3, 0x29d4f654, 0xc5a92679, 0xc1683bce, 0xcc2b1d17, 0xc8ea00a0, + 0xd6ad50a5, 0xd26c4d12, 0xdf2f6bcb, 0xdbee767c, 0xe3a1cbc1, 0xe760d676, + 0xea23f0af, 0xeee2ed18, 0xf0a5bd1d, 0xf464a0aa, 0xf9278673, 0xfde69bc4, + 0x89b8fd09, 0x8d79e0be, 0x803ac667, 0x84fbdbd0, 0x9abc8bd5, 0x9e7d9662, + 0x933eb0bb, 0x97ffad0c, 0xafb010b1, 0xab710d06, 0xa6322bdf, 0xa2f33668, + 0xbcb4666d, 0xb8757bda, 0xb5365d03, 0xb1f740b4}; + +u_int32_t CRC32::crc32 (const char *d, int len, u_int32_t crc) +{ + register int i; + + for (i=0; i<len; i++) + crc = (crc << 8) ^ crc_table[((crc >> 24) ^ *d++) & 0xff]; + + return crc; +} + +CRC32::CRC32(const char *d, int len, u_int32_t CRCvalue) { + data=d; + length=len; + value=CRCvalue; +} + +} //end of namespace diff --git a/libsi/util.h b/libsi/util.h new file mode 100644 index 0000000..db01923 --- /dev/null +++ b/libsi/util.h @@ -0,0 +1,157 @@ +/*************************************************************************** + * Copyright (c) 2003 by Marcel Wiesweg * + * * + * 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. * + * * + * $Id: util.h 1.3 2003/12/22 14:07:41 kls Exp $ + * * + ***************************************************************************/ + +#ifndef LIBSI_UTIL_H +#define LIBSI_UTIL_H + +#include <stdint.h> +#include <sys/types.h> +#include <pthread.h> +#include <time.h> + +#define HILO(x) (x##_hi << 8 | x##_lo) +#define BCD_TIME_TO_SECONDS(x) ((3600 * ((10*((x##_h & 0xF0)>>4)) + (x##_h & 0xF))) + \ + (60 * ((10*((x##_m & 0xF0)>>4)) + (x##_m & 0xF))) + \ + ((10*((x##_s & 0xF0)>>4)) + (x##_s & 0xF))) + +namespace SI { + +//Holds an array of unsigned char which is deleted +//when the last object pointing to it is deleted. +//Optimized for use in libsi. +class CharArray { +public: + CharArray(); + + CharArray(const CharArray &source); + CharArray& operator=(const CharArray &source); + ~CharArray(); + + //can be called exactly once + void assign(const unsigned char*data, unsigned int size, bool doCopy=true); + //compares to a null-terminated string + bool operator==(const char *string) const; + //compares to another CharArray (data not necessarily null-terminated) + bool operator==(const CharArray &other) const; + + //returns another CharArray with its offset incremented by offset + CharArray operator+(const unsigned int offset) const; + + //access and convenience methods + const unsigned char* getData() const { return data_->data+off; } + const unsigned char* getData(int offset) const { return data_->data+offset+off; } + template <typename T> const T* getData() const { return (T*)(data_->data+off); } + template <typename T> const T* getData(int offset) const { return (T*)(data_->data+offset+off); } + //sets p to point to data+offset, increments offset + template <typename T> void setPointerAndOffset(const T* &p, unsigned int &offset) const { p=(T*)getData(offset); offset+=sizeof(T); } + unsigned char operator[](const unsigned int index) const { return data_->data ? data_->data[off+index] : 0; } + int getLength() const { return data_->size; } + u_int16_t TwoBytes(const unsigned int index) const { return data_->data ? data_->TwoBytes(off+index) : 0; } + u_int32_t FourBytes(const unsigned int index) const { return data_->data ? data_->FourBytes(off+index) : 0; } + + void addOffset(unsigned int offset) { off+=offset; } +private: + class Data { + public: + Data(); + virtual ~Data(); + + virtual void assign(const unsigned char*data, unsigned int size) = 0; + virtual void Delete() = 0; + + u_int16_t TwoBytes(const unsigned int index) const + { return (data[index] << 8) | data[index+1]; } + u_int32_t FourBytes(const unsigned int index) const + { return (data[index] << 24) | (data[index+1] << 16) | (data[index+2] << 8) | data[index+3]; } + /*#ifdef CHARARRAY_THREADSAFE + void Lock(); + void Unlock(); + #else + void Lock() {} + void Unlock() {} + #endif + Data(const Data& d); + void assign(unsigned int size); + */ + + const unsigned char*data; + unsigned int size; + + unsigned count_; + // count_ is the number of CharArray objects that point at this + // count_ must be initialized to 1 by all constructors + // (it starts as 1 since it is pointed to by the CharArray object that created it) + + /* + pthread_mutex_t mutex; + pid_t lockingPid; + pthread_t locked; + */ + }; + class DataOwnData : public Data { + public: + DataOwnData() {} + virtual ~DataOwnData(); + virtual void assign(const unsigned char*data, unsigned int size); + virtual void Delete(); + }; + class DataForeignData : public Data { + public: + DataForeignData() {} + virtual ~DataForeignData(); + virtual void assign(const unsigned char*data, unsigned int size); + virtual void Delete(); + }; + Data* data_; + unsigned int off; +}; + + + +//abstract base class +class Parsable { +public: + void CheckParse(); +protected: + Parsable(); + virtual ~Parsable() {} + //actually parses given data. + virtual void Parse() = 0; +private: + bool parsed; +}; + +//taken and adapted from libdtv, (c) Rolf Hakenes and VDR, (c) Klaus Schmidinger +namespace DVBTime { +time_t getTime(unsigned char date_hi, unsigned char date_lo, unsigned char timehr, unsigned char timemi, unsigned char timese); +time_t getDuration(unsigned char timehr, unsigned char timemi, unsigned char timese); +inline unsigned char bcdToDec(unsigned char b) { return ((b >> 4) & 0x0F) * 10 + (b & 0x0F); } +}; + +//taken and adapted from libdtv, (c) Rolf Hakenes +class CRC32 { +public: + CRC32(const char *d, int len, u_int32_t CRCvalue=0xFFFFFFFF); + bool isValid() { return crc32(data, length, value) == 0; } + static bool isValid(const char *d, int len, u_int32_t CRCvalue=0xFFFFFFFF) { return crc32(d, len, CRCvalue) == 0; } +protected: + static u_int32_t crc_table[256]; + static u_int32_t crc32 (const char *d, int len, u_int32_t CRCvalue); + + const char *data; + int length; + u_int32_t value; +}; + +} //end of namespace + +#endif @@ -6,7 +6,7 @@ * * LIRC support added by Carsten Koch <Carsten.Koch@icem.de> 2000-06-16. * - * $Id: lirc.c 1.6 2003/04/27 11:39:47 kls Exp $ + * $Id: lirc.c 1.7 2003/10/18 11:34:02 kls Exp $ */ #include "lirc.h" @@ -20,6 +20,7 @@ cLircRemote::cLircRemote(char *DeviceName) :cRemote("LIRC") +,cThread("LIRC remote control") { struct sockaddr_un addr; addr.sun_family = AF_UNIX; @@ -49,8 +50,6 @@ bool cLircRemote::Ready(void) void cLircRemote::Action(void) { - dsyslog("LIRC remote control thread started (pid=%d)", getpid()); - int FirstTime = 0; int LastTime = 0; char buf[LIRC_BUFFER_SIZE]; @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: menu.c 1.273 2003/10/03 14:36:20 kls Exp $ + * $Id: menu.c 1.276 2004/01/04 11:12:43 kls Exp $ */ #include "menu.h" @@ -16,7 +16,6 @@ #include "channels.h" #include "config.h" #include "cutter.h" -#include "eit.h" #include "i18n.h" #include "menuitems.h" #include "plugin.h" @@ -69,7 +68,7 @@ eOSState cMenuEditChanItem::ProcessKey(eKeys Key) case kLeft|k_Repeat: case kLeft: delta = -1; case kRight|k_Repeat: - case kRight: + case kRight: { cChannel *channel = Channels.GetByNumber(*value + delta, delta); if (channel) { @@ -458,7 +457,7 @@ eOSState cMenuEditSrcItem::ProcessKey(eKeys Key) } } else if (NORMALKEY(Key) == kRight) { - if (source) { + if (source) { if (source->Next()) source = (cSource *)source->Next(); } @@ -582,7 +581,7 @@ void cMenuEditChannel::Setup(void) Add(new cMenuEditIntItem( tr("Dpid1"), &data.dpid1, 0, 0x1FFF)); Add(new cMenuEditIntItem( tr("Dpid2"), &data.dpid2, 0, 0x1FFF)); Add(new cMenuEditIntItem( tr("Tpid"), &data.tpid, 0, 0x1FFF)); - Add(new cMenuEditCaItem( tr("CA"), &data.ca, true)); + Add(new cMenuEditCaItem( tr("CA"), &data.caids[0], true));//XXX Add(new cMenuEditIntItem( tr("Sid"), &data.sid, 0)); /* XXX not yet used Add(new cMenuEditIntItem( tr("Nid"), &data.nid, 0)); @@ -616,7 +615,6 @@ eOSState cMenuEditChannel::ProcessKey(eKeys Key) if (channel) { *channel = data; isyslog("edited channel %d %s", channel->Number(), data.ToText()); - Timers.Save(); state = osBack; } else { @@ -627,7 +625,7 @@ eOSState cMenuEditChannel::ProcessKey(eKeys Key) isyslog("added channel %d %s", channel->Number(), data.ToText()); state = osUser1; } - Channels.Save(); + Channels.SetModified(); } else { Interface->Error(tr("Channel settings are not unique!")); @@ -683,6 +681,7 @@ protected: virtual void Move(int From, int To); public: cMenuChannels(void); + ~cMenuChannels(); virtual eOSState ProcessKey(eKeys Key); }; @@ -694,6 +693,12 @@ cMenuChannels::cMenuChannels(void) Add(new cMenuChannelItem(channel), channel->Number() == cDevice::CurrentChannel()); } SetHelp(tr("Edit"), tr("New"), tr("Delete"), tr("Mark")); + Channels.IncBeingEdited(); +} + +cMenuChannels::~cMenuChannels() +{ + Channels.DecBeingEdited(); } cChannel *cMenuChannels::GetChannel(int Index) @@ -705,11 +710,10 @@ cChannel *cMenuChannels::GetChannel(int Index) void cMenuChannels::Propagate(void) { Channels.ReNumber(); - Channels.Save(); for (cMenuChannelItem *ci = (cMenuChannelItem *)First(); ci; ci = (cMenuChannelItem *)ci->Next()) ci->Set(); - Timers.Save(); // channel numbering has changed! Display(); + Channels.SetModified(); } eOSState cMenuChannels::Switch(void) @@ -904,7 +908,7 @@ eOSState cMenuEditTimer::ProcessKey(eKeys Key) if (state == osUnknown) { switch (Key) { - case kOk: { + case kOk: { cChannel *ch = Channels.GetByNumber(channel); if (ch) data.channel = ch; @@ -1128,29 +1132,29 @@ eOSState cMenuTimers::ProcessKey(eKeys Key) class cMenuEvent : public cOsdMenu { private: - const cEventInfo *eventInfo; + const cEvent *event; public: - cMenuEvent(const cEventInfo *EventInfo, bool CanSwitch = false); + cMenuEvent(const cEvent *Event, bool CanSwitch = false); cMenuEvent(bool Now); virtual eOSState ProcessKey(eKeys Key); }; -cMenuEvent::cMenuEvent(const cEventInfo *EventInfo, bool CanSwitch) +cMenuEvent::cMenuEvent(const cEvent *Event, bool CanSwitch) :cOsdMenu(tr("Event")) { - eventInfo = EventInfo; - if (eventInfo) { - cChannel *channel = Channels.GetByChannelID(eventInfo->GetChannelID(), true); + event = Event; + if (event) { + cChannel *channel = Channels.GetByChannelID(event->ChannelID(), true); if (channel) { char *buffer; - asprintf(&buffer, "%-17.*s\t%.*s %s - %s", 17, channel->Name(), 5, eventInfo->GetDate(), eventInfo->GetTimeString(), eventInfo->GetEndTimeString()); + asprintf(&buffer, "%-17.*s\t%.*s %s - %s", 17, channel->Name(), 5, event->GetDateString(), event->GetTimeString(), event->GetEndTimeString()); SetTitle(buffer, false); free(buffer); int Line = 2; cMenuTextItem *item; - const char *Title = eventInfo->GetTitle(); - const char *Subtitle = eventInfo->GetSubtitle(); - const char *ExtendedDescription = eventInfo->GetExtendedDescription(); + const char *Title = event->Title(); + const char *Subtitle = event->ShortText(); + const char *ExtendedDescription = event->Description(); if (!isempty(Title)) { Add(item = new cMenuTextItem(Title, 1, Line, Setup.OSDwidth - 2, -1, clrCyan)); Line += item->Height() + 1; @@ -1185,16 +1189,16 @@ eOSState cMenuEvent::ProcessKey(eKeys Key) class cMenuWhatsOnItem : public cOsdItem { public: - const cEventInfo *eventInfo; - cMenuWhatsOnItem(const cEventInfo *EventInfo); + const cEvent *event; + cMenuWhatsOnItem(const cEvent *Event); }; -cMenuWhatsOnItem::cMenuWhatsOnItem(const cEventInfo *EventInfo) +cMenuWhatsOnItem::cMenuWhatsOnItem(const cEvent *Event) { - eventInfo = EventInfo; + event = Event; char *buffer = NULL; - cChannel *channel = Channels.GetByNumber(eventInfo->GetChannelNumber()); - asprintf(&buffer, "%d\t%.*s\t%.*s\t%s", eventInfo->GetChannelNumber(), 6, channel ? channel->Name() : "???", 5, eventInfo->GetTimeString(), eventInfo->GetTitle()); + cChannel *channel = Channels.GetByNumber(event->ChannelNumber()); + asprintf(&buffer, "%d\t%.*s\t%.*s\t%s", event->ChannelNumber(), 6, channel ? channel->Name() : "???", 5, event->GetTimeString(), event->Title()); SetText(buffer, false); } @@ -1205,36 +1209,36 @@ private: eOSState Record(void); eOSState Switch(void); static int currentChannel; - static const cEventInfo *scheduleEventInfo; + static const cEvent *scheduleEvent; public: cMenuWhatsOn(const cSchedules *Schedules, bool Now, int CurrentChannelNr); static int CurrentChannel(void) { return currentChannel; } static void SetCurrentChannel(int ChannelNr) { currentChannel = ChannelNr; } - static const cEventInfo *ScheduleEventInfo(void); + static const cEvent *ScheduleEvent(void); virtual eOSState ProcessKey(eKeys Key); }; int cMenuWhatsOn::currentChannel = 0; -const cEventInfo *cMenuWhatsOn::scheduleEventInfo = NULL; +const cEvent *cMenuWhatsOn::scheduleEvent = NULL; static int CompareEventChannel(const void *p1, const void *p2) { - return (int)( (*(const cEventInfo **)p1)->GetChannelNumber() - (*(const cEventInfo **)p2)->GetChannelNumber()); + return (int)( (*(const cEvent **)p1)->ChannelNumber() - (*(const cEvent **)p2)->ChannelNumber()); } cMenuWhatsOn::cMenuWhatsOn(const cSchedules *Schedules, bool Now, int CurrentChannelNr) :cOsdMenu(Now ? tr("What's on now?") : tr("What's on next?"), CHNUMWIDTH, 7, 6) { const cSchedule *Schedule = Schedules->First(); - const cEventInfo **pArray = NULL; + const cEvent **pArray = NULL; int num = 0; while (Schedule) { - pArray = (const cEventInfo **)realloc(pArray, (num + 1) * sizeof(cEventInfo *)); + pArray = (const cEvent **)realloc(pArray, (num + 1) * sizeof(cEvent *)); pArray[num] = Now ? Schedule->GetPresentEvent() : Schedule->GetFollowingEvent(); if (pArray[num]) { - cChannel *channel = Channels.GetByChannelID(pArray[num]->GetChannelID(), true); + cChannel *channel = Channels.GetByChannelID(pArray[num]->ChannelID(), true); if (channel) { pArray[num]->SetChannelNumber(channel->Number()); num++; @@ -1243,20 +1247,20 @@ cMenuWhatsOn::cMenuWhatsOn(const cSchedules *Schedules, bool Now, int CurrentCha Schedule = (const cSchedule *)Schedules->Next(Schedule); } - qsort(pArray, num, sizeof(cEventInfo *), CompareEventChannel); + qsort(pArray, num, sizeof(cEvent *), CompareEventChannel); for (int a = 0; a < num; a++) - Add(new cMenuWhatsOnItem(pArray[a]), pArray[a]->GetChannelNumber() == CurrentChannelNr); + Add(new cMenuWhatsOnItem(pArray[a]), pArray[a]->ChannelNumber() == CurrentChannelNr); currentChannel = CurrentChannelNr; free(pArray); SetHelp(Count() ? tr("Record") : NULL, Now ? tr("Next") : tr("Now"), tr("Button$Schedule"), tr("Switch")); } -const cEventInfo *cMenuWhatsOn::ScheduleEventInfo(void) +const cEvent *cMenuWhatsOn::ScheduleEvent(void) { - const cEventInfo *ei = scheduleEventInfo; - scheduleEventInfo = NULL; + const cEvent *ei = scheduleEvent; + scheduleEvent = NULL; return ei; } @@ -1264,7 +1268,7 @@ eOSState cMenuWhatsOn::Switch(void) { cMenuWhatsOnItem *item = (cMenuWhatsOnItem *)Get(Current()); if (item) { - cChannel *channel = Channels.GetByChannelID(item->eventInfo->GetChannelID(), true); + cChannel *channel = Channels.GetByChannelID(item->event->ChannelID(), true); if (channel && cDevice::PrimaryDevice()->SwitchChannel(channel, true)) return osEnd; } @@ -1276,7 +1280,7 @@ eOSState cMenuWhatsOn::Record(void) { cMenuWhatsOnItem *item = (cMenuWhatsOnItem *)Get(Current()); if (item) { - cTimer *timer = new cTimer(item->eventInfo); + cTimer *timer = new cTimer(item->event); cTimer *t = Timers.GetTimer(timer); if (t) { delete timer; @@ -1300,14 +1304,14 @@ eOSState cMenuWhatsOn::ProcessKey(eKeys Key) case kGreen: { cMenuWhatsOnItem *mi = (cMenuWhatsOnItem *)Get(Current()); if (mi) { - scheduleEventInfo = mi->eventInfo; - currentChannel = mi->eventInfo->GetChannelNumber(); + scheduleEvent = mi->event; + currentChannel = mi->event->ChannelNumber(); } } break; case kBlue: return Switch(); case kOk: if (Count()) - return AddSubMenu(new cMenuEvent(((cMenuWhatsOnItem *)Get(Current()))->eventInfo, true)); + return AddSubMenu(new cMenuEvent(((cMenuWhatsOnItem *)Get(Current()))->event, true)); break; default: break; } @@ -1319,15 +1323,15 @@ eOSState cMenuWhatsOn::ProcessKey(eKeys Key) class cMenuScheduleItem : public cOsdItem { public: - const cEventInfo *eventInfo; - cMenuScheduleItem(const cEventInfo *EventInfo); + const cEvent *event; + cMenuScheduleItem(const cEvent *Event); }; -cMenuScheduleItem::cMenuScheduleItem(const cEventInfo *EventInfo) +cMenuScheduleItem::cMenuScheduleItem(const cEvent *Event) { - eventInfo = EventInfo; + event = Event; char *buffer = NULL; - asprintf(&buffer, "%.*s\t%.*s\t%s", 5, eventInfo->GetDate(), 5, eventInfo->GetTimeString(), eventInfo->GetTitle()); + asprintf(&buffer, "%.*s\t%.*s\t%s", 5, event->GetDateString(), 5, event->GetTimeString(), event->Title()); SetText(buffer, false); } @@ -1335,7 +1339,7 @@ cMenuScheduleItem::cMenuScheduleItem(const cEventInfo *EventInfo) class cMenuSchedule : public cOsdMenu { private: - cMutexLock mutexLock; + cSchedulesLock schedulesLock; const cSchedules *schedules; bool now, next; int otherChannel; @@ -1356,7 +1360,7 @@ cMenuSchedule::cMenuSchedule(void) cChannel *channel = Channels.GetByNumber(cDevice::CurrentChannel()); if (channel) { cMenuWhatsOn::SetCurrentChannel(channel->Number()); - schedules = cSIProcessor::Schedules(mutexLock); + schedules = cSchedules::Schedules(schedulesLock); PrepareSchedule(channel); SetHelp(Count() ? tr("Record") : NULL, tr("Now"), tr("Next")); } @@ -1364,12 +1368,12 @@ cMenuSchedule::cMenuSchedule(void) cMenuSchedule::~cMenuSchedule() { - cMenuWhatsOn::ScheduleEventInfo(); // makes sure any posted data is cleared + cMenuWhatsOn::ScheduleEvent(); // makes sure any posted data is cleared } static int CompareEventTime(const void *p1, const void *p2) { - return (int)((*(cEventInfo **)p1)->GetTime() - (*(cEventInfo **)p2)->GetTime()); + return (int)((*(cEvent **)p1)->StartTime() - (*(cEvent **)p2)->StartTime()); } void cMenuSchedule::PrepareSchedule(cChannel *Channel) @@ -1381,22 +1385,24 @@ void cMenuSchedule::PrepareSchedule(cChannel *Channel) free(buffer); if (schedules) { const cSchedule *Schedule = schedules->GetSchedule(Channel->GetChannelID()); - int num = Schedule->NumEvents(); - const cEventInfo **pArray = MALLOC(const cEventInfo *, num); - if (pArray) { - time_t now = time(NULL); - int numreal = 0; - for (int a = 0; a < num; a++) { - const cEventInfo *EventInfo = Schedule->GetEventNumber(a); - if (EventInfo->GetTime() + EventInfo->GetDuration() > now) - pArray[numreal++] = EventInfo; - } - - qsort(pArray, numreal, sizeof(cEventInfo *), CompareEventTime); - - for (int a = 0; a < numreal; a++) - Add(new cMenuScheduleItem(pArray[a])); - free(pArray); + if (Schedule) { + int num = Schedule->NumEvents(); + const cEvent **pArray = MALLOC(const cEvent *, num); + if (pArray) { + time_t now = time(NULL); + int numreal = 0; + for (int a = 0; a < num; a++) { + const cEvent *Event = Schedule->GetEventNumber(a); + if (Event->StartTime() + Event->Duration() > now) + pArray[numreal++] = Event; + } + + qsort(pArray, numreal, sizeof(cEvent *), CompareEventTime); + + for (int a = 0; a < numreal; a++) + Add(new cMenuScheduleItem(pArray[a])); + free(pArray); + } } } } @@ -1405,7 +1411,7 @@ eOSState cMenuSchedule::Record(void) { cMenuScheduleItem *item = (cMenuScheduleItem *)Get(Current()); if (item) { - cTimer *timer = new cTimer(item->eventInfo); + cTimer *timer = new cTimer(item->event); cTimer *t = Timers.GetTimer(timer); if (t) { delete timer; @@ -1438,7 +1444,7 @@ eOSState cMenuSchedule::ProcessKey(eKeys Key) if (!now && !next) { int ChannelNr = 0; if (Count()) { - cChannel *channel = Channels.GetByChannelID(((cMenuScheduleItem *)Get(Current()))->eventInfo->GetChannelID(), true); + cChannel *channel = Channels.GetByChannelID(((cMenuScheduleItem *)Get(Current()))->event->ChannelID(), true); if (channel) ChannelNr = channel->Number(); } @@ -1456,16 +1462,16 @@ eOSState cMenuSchedule::ProcessKey(eKeys Key) return Switch(); break; case kOk: if (Count()) - return AddSubMenu(new cMenuEvent(((cMenuScheduleItem *)Get(Current()))->eventInfo, otherChannel)); + return AddSubMenu(new cMenuEvent(((cMenuScheduleItem *)Get(Current()))->event, otherChannel)); break; default: break; } } else if (!HasSubMenu()) { now = next = false; - const cEventInfo *ei = cMenuWhatsOn::ScheduleEventInfo(); + const cEvent *ei = cMenuWhatsOn::ScheduleEvent(); if (ei) { - cChannel *channel = Channels.GetByChannelID(ei->GetChannelID(), true); + cChannel *channel = Channels.GetByChannelID(ei->ChannelID(), true); if (channel) { PrepareSchedule(channel); if (channel->Number() != cDevice::CurrentChannel()) { @@ -1985,6 +1991,7 @@ private: virtual void Set(void); public: cMenuSetupOSD(void) { Set(); } + virtual ~cMenuSetupOSD() { cFont::SetCode(I18nCharSets()[Setup.OSDLanguage]); } virtual eOSState ProcessKey(eKeys Key); }; @@ -2011,6 +2018,7 @@ eOSState cMenuSetupOSD::ProcessKey(eKeys Key) if (data.OSDLanguage != osdLanguage) { int OriginalOSDLanguage = Setup.OSDLanguage; Setup.OSDLanguage = data.OSDLanguage; + cFont::SetCode(I18nCharSets()[Setup.OSDLanguage]); Set(); Display(); Setup.OSDLanguage = OriginalOSDLanguage; @@ -2631,10 +2639,10 @@ cDisplayChannel::cDisplayChannel(int Number, bool Switched) int EpgLines = withInfo ? 5 : 1; lines = 0; number = 0; - cChannel *channel = Channels.GetByNumber(Number); + channel = Channels.GetByNumber(Number); Interface->Open(Setup.OSDwidth, Setup.ChannelInfoPos ? EpgLines : -EpgLines); if (channel) { - DisplayChannel(channel); + DisplayChannel(); DisplayInfo(); } lastTime = time_ms(); @@ -2658,16 +2666,16 @@ cDisplayChannel::~cDisplayChannel() Interface->Close(); } -void cDisplayChannel::DisplayChannel(const cChannel *Channel) +void cDisplayChannel::DisplayChannel(void) { int BufSize = Width() + 1; char buffer[BufSize]; *buffer = 0; - if (Channel) { - if (Channel->GroupSep()) - snprintf(buffer, BufSize, "%s", Channel->Name()); + if (channel) { + if (channel->GroupSep()) + snprintf(buffer, BufSize, "%s", channel->Name()); else - snprintf(buffer, BufSize, "%d%s %s", Channel->Number(), number ? "-" : "", Channel->Name()); + snprintf(buffer, BufSize, "%d%s %s", channel->Number(), number ? "-" : "", channel->Name()); } else if (number) snprintf(buffer, BufSize, "%d-", number); @@ -2682,28 +2690,28 @@ void cDisplayChannel::DisplayChannel(const cChannel *Channel) void cDisplayChannel::DisplayInfo(void) { - if (withInfo) { - const cEventInfo *Present = NULL, *Following = NULL; - cMutexLock MutexLock; - const cSchedules *Schedules = cSIProcessor::Schedules(MutexLock); + if (withInfo && channel) { + const cEvent *Present = NULL, *Following = NULL; + cSchedulesLock SchedulesLock; + const cSchedules *Schedules = cSchedules::Schedules(SchedulesLock); if (Schedules) { - const cSchedule *Schedule = Schedules->GetSchedule(); + const cSchedule *Schedule = Schedules->GetSchedule(channel->GetChannelID()); if (Schedule) { const char *PresentTitle = NULL, *PresentSubtitle = NULL, *FollowingTitle = NULL, *FollowingSubtitle = NULL; int Lines = 0; if ((Present = Schedule->GetPresentEvent()) != NULL) { - PresentTitle = Present->GetTitle(); + PresentTitle = Present->Title(); if (!isempty(PresentTitle)) Lines++; - PresentSubtitle = Present->GetSubtitle(); + PresentSubtitle = Present->ShortText(); if (!isempty(PresentSubtitle)) Lines++; } if ((Following = Schedule->GetFollowingEvent()) != NULL) { - FollowingTitle = Following->GetTitle(); + FollowingTitle = Following->Title(); if (!isempty(FollowingTitle)) Lines++; - FollowingSubtitle = Following->GetSubtitle(); + FollowingSubtitle = Following->ShortText(); if (!isempty(FollowingSubtitle)) Lines++; } @@ -2731,7 +2739,7 @@ void cDisplayChannel::DisplayInfo(void) Interface->Flush(); lines = Lines; lastTime = time_ms(); - cStatus::MsgOsdProgramme(Present ? Present->GetTime() : 0, PresentTitle, PresentSubtitle, Following ? Following->GetTime() : 0, FollowingTitle, FollowingSubtitle); + cStatus::MsgOsdProgramme(Present ? Present->StartTime() : 0, PresentTitle, PresentSubtitle, Following ? Following->StartTime() : 0, FollowingTitle, FollowingSubtitle); } } } @@ -2741,7 +2749,8 @@ void cDisplayChannel::DisplayInfo(void) void cDisplayChannel::Refresh(void) { Interface->Clear(); - DisplayChannel(Channels.GetByNumber(cDevice::CurrentChannel())); + channel = Channels.GetByNumber(cDevice::CurrentChannel()); + DisplayChannel(); lastTime = time_ms(); lines = 0; } @@ -2759,20 +2768,21 @@ eOSState cDisplayChannel::ProcessKey(eKeys Key) if (number >= 0) { number = number * 10 + Key - k0; if (number > 0) { - cChannel *channel = Channels.GetByNumber(number); + channel = Channels.GetByNumber(number); Interface->Clear(); withInfo = false; - DisplayChannel(channel); + DisplayChannel(); lastTime = time_ms(); // Lets see if there can be any useful further input: int n = channel ? number * 10 : 0; - while (channel && (channel = Channels.Next(channel)) != NULL) { - if (!channel->GroupSep()) { - if (n <= channel->Number() && channel->Number() <= n + 9) { + cChannel *ch = channel; + while (ch && (ch = Channels.Next(ch)) != NULL) { + if (!ch->GroupSep()) { + if (n <= ch->Number() && ch->Number() <= n + 9) { n = 0; break; } - if (channel->Number() > n) + if (ch->Number() > n) n *= 10; } } @@ -2803,10 +2813,10 @@ eOSState cDisplayChannel::ProcessKey(eKeys Key) group = Channels.GetPrevGroup(group < 1 ? 1 : group); if (group < 0) group = SaveGroup; - cChannel *channel = Channels.Get(group); + channel = Channels.Get(group); if (channel) { Interface->Clear(); - DisplayChannel(channel); + DisplayChannel(); if (!channel->GroupSep()) group = -1; } @@ -2833,7 +2843,8 @@ eOSState cDisplayChannel::ProcessKey(eKeys Key) Channels.SwitchTo(number); else { number = 0; - DisplayChannel(NULL); + channel = NULL; + DisplayChannel(); lastTime = time_ms(); return osContinue; } @@ -2965,7 +2976,7 @@ eOSState cDisplayVolume::ProcessKey(eKeys Key) cRecordControl::cRecordControl(cDevice *Device, cTimer *Timer, bool Pause) { - eventInfo = NULL; + event = NULL; instantId = NULL; fileName = NULL; recorder = NULL; @@ -2984,10 +2995,10 @@ cRecordControl::cRecordControl(cDevice *Device, cTimer *Timer, bool Pause) const char *Title = NULL; const char *Subtitle = NULL; const char *Summary = NULL; - if (GetEventInfo()) { - Title = eventInfo->GetTitle(); - Subtitle = eventInfo->GetSubtitle(); - Summary = eventInfo->GetExtendedDescription(); + if (GetEvent()) { + Title = event->Title(); + Subtitle = event->ShortText(); + Summary = event->Description(); dsyslog("Title: '%s' Subtitle: '%s'", Title, Subtitle); } cRecording Recording(timer, Title, Subtitle, Summary); @@ -3036,19 +3047,19 @@ cRecordControl::~cRecordControl() #define INSTANT_REC_EPG_LOOKAHEAD 300 // seconds to look into the EPG data for an instant recording -bool cRecordControl::GetEventInfo(void) +bool cRecordControl::GetEvent(void) { const cChannel *channel = timer->Channel(); time_t Time = timer->Active() == taActInst ? timer->StartTime() + INSTANT_REC_EPG_LOOKAHEAD : timer->StartTime() + (timer->StopTime() - timer->StartTime()) / 2; for (int seconds = 0; seconds <= MAXWAIT4EPGINFO; seconds++) { { - cMutexLock MutexLock; - const cSchedules *Schedules = cSIProcessor::Schedules(MutexLock); + cSchedulesLock SchedulesLock; + const cSchedules *Schedules = cSchedules::Schedules(SchedulesLock); if (Schedules) { const cSchedule *Schedule = Schedules->GetSchedule(channel->GetChannelID()); if (Schedule) { - eventInfo = Schedule->GetEventAround(Time); - if (eventInfo) { + event = Schedule->GetEventAround(Time); + if (event) { if (seconds > 0) dsyslog("got EPG info after %d seconds", seconds); return true; @@ -3215,6 +3226,20 @@ void cRecordControls::Process(time_t t) } } +void cRecordControls::ChannelDataModified(cChannel *Channel) +{ + for (int i = 0; i < MAXRECORDCONTROLS; i++) { + if (RecordControls[i]) { + if (RecordControls[i]->Timer() && RecordControls[i]->Timer()->Channel() == Channel) { + isyslog("stopping recording due to modification of channel %d", Channel->Number()); + RecordControls[i]->Stop(true); + // This will restart the recording, maybe even from a different + // device in case conditional access has changed. + } + } + } +} + bool cRecordControls::Active(void) { for (int i = 0; i < MAXRECORDCONTROLS; i++) { @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: menu.h 1.57 2003/08/03 09:37:18 kls Exp $ + * $Id: menu.h 1.59 2004/01/04 11:01:13 kls Exp $ */ #ifndef __MENU_H @@ -12,6 +12,7 @@ #include "ci.h" #include "device.h" +#include "epg.h" #include "osd.h" #include "dvbplayer.h" #include "recorder.h" @@ -36,7 +37,8 @@ private: int lines; int lastTime; int number; - void DisplayChannel(const cChannel *Channel); + cChannel *channel; + void DisplayChannel(void); void DisplayInfo(void); void Refresh(void); public: @@ -113,10 +115,10 @@ private: cDevice *device; cTimer *timer; cRecorder *recorder; - const cEventInfo *eventInfo; + const cEvent *event; char *instantId; char *fileName; - bool GetEventInfo(void); + bool GetEvent(void); public: cRecordControl(cDevice *Device, cTimer *Timer = NULL, bool Pause = false); virtual ~cRecordControl(); @@ -141,6 +143,7 @@ public: static const char *GetInstantId(const char *LastInstantId); static cRecordControl *GetRecordControl(const char *FileName); static void Process(time_t t); + static void ChannelDataModified(cChannel *Channel); static bool Active(void); static void Shutdown(void); }; @@ -151,7 +154,7 @@ private: bool visible, modeOnly, shown, displayFrames; int lastCurrent, lastTotal; time_t timeoutShow; - bool timeSearchActive, timeSearchHide; + bool timeSearchActive, timeSearchHide; int timeSearchTime, timeSearchPos; void TimeSearchDisplay(void); void TimeSearchProcess(eKeys Key); @@ -12,7 +12,7 @@ # See the main source file 'vdr.c' for copyright information and # how to reach the author. # -# $Id: newplugin 1.15 2003/05/09 14:59:28 kls Exp $ +# $Id: newplugin 1.16 2003/12/21 15:45:18 kls Exp $ $PLUGIN_NAME = $ARGV[0] || die "Usage: newplugin <name>\n"; @@ -97,7 +97,7 @@ PACKAGE = vdr-\$(ARCHIVE) INCLUDES += -I\$(VDRDIR)/include -I\$(DVBDIR)/include -DEFINES += -DPLUGIN_NAME_I18N='"\$(PLUGIN)"' +DEFINES += -D_GNU_SOURCE -DPLUGIN_NAME_I18N='"\$(PLUGIN)"' ### The object files (add further files here): @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: osdbase.c 1.10 2003/08/24 11:38:27 kls Exp $ + * $Id: osdbase.c 1.11 2003/10/19 14:32:32 kls Exp $ */ #include "osdbase.h" @@ -131,7 +131,6 @@ cBitmap::cBitmap(int Width, int Height, int Bpp, bool ClearWithBackground) cBitmap::~cBitmap() { - delete font; free(bitmap); } @@ -139,8 +138,7 @@ eDvbFont cBitmap::SetFont(eDvbFont Font) { eDvbFont oldFont = fontType; if (fontType != Font || !font) { - delete font; - font = new cFont(Font); + font = cFont::GetFont(Font); fontType = Font; } return oldFont; @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: osdbase.h 1.6 2002/09/08 14:12:41 kls Exp $ + * $Id: osdbase.h 1.8 2004/01/04 14:22:43 kls Exp $ */ #ifndef __OSDBASE_H @@ -13,7 +13,7 @@ #include <stdio.h> #include "font.h" -#define MAXNUMCOLORS 16 +#define MAXNUMCOLORS 256 enum eDvbColor { #ifdef DEBUG_OSD @@ -73,7 +73,7 @@ public: class cBitmap : public cPalette { private: - cFont *font; + const cFont *font; eDvbFont fontType; char *bitmap; bool clearWithBackground; @@ -0,0 +1,378 @@ +/* + * pat.c: PAT section filter + * + * See the main source file 'vdr.c' for copyright information and + * how to reach the author. + * + * $Id: pat.c 1.3 2004/01/04 12:27:06 kls Exp $ + */ + +#include "pat.h" +#include <malloc.h> +#include "channels.h" +#include "libsi/section.h" +#include "libsi/descriptor.h" +#include "thread.h" + +#define PMT_SCAN_TIMEOUT 10 // seconds + +// --- cCaDescriptor --------------------------------------------------------- + +class cCaDescriptor : public cListObject { +private: + int caSystem; + bool stream; + int length; + uchar *data; +public: + cCaDescriptor(int CaSystem, int CaPid, bool Stream, int Length, const uchar *Data); + virtual ~cCaDescriptor(); + bool operator== (const cCaDescriptor &arg) const; + int CaSystem(void) { return caSystem; } + int Stream(void) { return stream; } + int Length(void) const { return length; } + const uchar *Data(void) const { return data; } + }; + +cCaDescriptor::cCaDescriptor(int CaSystem, int CaPid, bool Stream, int Length, const uchar *Data) +{ + caSystem = CaSystem; + stream = Stream; + length = Length + 6; + data = MALLOC(uchar, length); + data[0] = SI::CaDescriptorTag; + data[1] = length - 2; + data[2] = (caSystem >> 8) & 0xFF; + data[3] = caSystem & 0xFF; + data[4] = ((CaPid >> 8) & 0x1F) | 0xE0; + data[5] = CaPid & 0xFF; + if (Length) + memcpy(&data[6], Data, Length); +} + +cCaDescriptor::~cCaDescriptor() +{ + free(data); +} + +bool cCaDescriptor::operator== (const cCaDescriptor &arg) const +{ + return length == arg.length && memcmp(data, arg.data, length) == 0; +} + +// --- cCaDescriptors -------------------------------------------------------- + +class cCaDescriptors : public cListObject { +private: + int source; + int transponder; + int serviceId; + int numCaIds; + int caIds[MAXCAIDS + 1]; + cList<cCaDescriptor> caDescriptors; + void AddCaId(int CaId); +public: + cCaDescriptors(int Source, int Transponder, int ServiceId); + bool operator== (const cCaDescriptors &arg) const; + bool Is(int Source, int Transponder, int ServiceId); + bool Is(cCaDescriptors * CaDescriptors); + bool Empty(void) { return caDescriptors.Count() == 0; } + void AddCaDescriptor(SI::CaDescriptor *d, bool Stream); + int GetCaDescriptors(const unsigned short *CaSystemIds, int BufSize, uchar *Data, bool &StreamFlag); + const int *CaIds(void) { return caIds; } + }; + +cCaDescriptors::cCaDescriptors(int Source, int Transponder, int ServiceId) +{ + source = Source; + transponder = Transponder; + serviceId = ServiceId; + numCaIds = 0; + caIds[0] = 0; +} + +bool cCaDescriptors::operator== (const cCaDescriptors &arg) const +{ + cCaDescriptor *ca1 = caDescriptors.First(); + cCaDescriptor *ca2 = arg.caDescriptors.First(); + while (ca1 && ca2) { + if (!(*ca1 == *ca2)) + return false; + ca1 = caDescriptors.Next(ca1); + ca2 = arg.caDescriptors.Next(ca2); + } + return !ca1 && !ca2; +} + +bool cCaDescriptors::Is(int Source, int Transponder, int ServiceId) +{ + return source == Source && transponder == Transponder && serviceId == ServiceId; +} + +bool cCaDescriptors::Is(cCaDescriptors * CaDescriptors) +{ + return Is(CaDescriptors->source, CaDescriptors->transponder, CaDescriptors->serviceId); +} + +void cCaDescriptors::AddCaId(int CaId) +{ + if (numCaIds < MAXCAIDS) { + for (int i = 0; i < numCaIds; i++) { + if (caIds[i] == CaId) + return; + } + caIds[numCaIds++] = CaId; + caIds[numCaIds] = 0; + } +} + +void cCaDescriptors::AddCaDescriptor(SI::CaDescriptor *d, bool Stream) +{ + cCaDescriptor *nca = new cCaDescriptor(d->getCaType(), d->getCaPid(), Stream, d->privateData.getLength(), d->privateData.getData()); + for (cCaDescriptor *ca = caDescriptors.First(); ca; ca = caDescriptors.Next(ca)) { + if (*ca == *nca) { + delete nca; + return; + } + } + AddCaId(nca->CaSystem()); + caDescriptors.Add(nca); +//#define DEBUG_CA_DESCRIPTORS 1 +#ifdef DEBUG_CA_DESCRIPTORS + char buffer[1024]; + char *q = buffer; + q += sprintf(q, "CAM: %04X %5d %5d %04X %d -", source, transponder, serviceId, d->getCaType(), Stream); + for (int i = 0; i < nca->Length(); i++) + q += sprintf(q, " %02X", nca->Data()[i]); + dsyslog(buffer); +#endif +} + +int cCaDescriptors::GetCaDescriptors(const unsigned short *CaSystemIds, int BufSize, uchar *Data, bool &StreamFlag) +{ + if (!CaSystemIds || !*CaSystemIds) + return 0; + if (BufSize > 0 && Data) { + int length = 0; + int IsStream = -1; + for (cCaDescriptor *d = caDescriptors.First(); d; d = caDescriptors.Next(d)) { + const unsigned short *caids = CaSystemIds; + do { + if (d->CaSystem() == *caids) { + if (length + d->Length() <= BufSize) { + if (IsStream >= 0 && IsStream != d->Stream()) + dsyslog("CAM: different stream flag in CA descriptors"); + IsStream = d->Stream(); + memcpy(Data + length, d->Data(), d->Length()); + length += d->Length(); + } + else + return -1; + } + } while (*++caids); + } + StreamFlag = IsStream == 1; + return length; + } + return -1; +} + +// --- cCaDescriptorHandler -------------------------------------------------- + +class cCaDescriptorHandler : public cList<cCaDescriptors> { +private: + cMutex mutex; +public: + int AddCaDescriptors(cCaDescriptors *CaDescriptors); + // Returns 0 if this is an already known descriptor, + // 1 if it is an all new descriptor with actual contents, + // and 2 if an existing descriptor was changed. + int GetCaDescriptors(int Source, int Transponder, int ServiceId, const unsigned short *CaSystemIds, int BufSize, uchar *Data, bool &StreamFlag); + }; + +int cCaDescriptorHandler::AddCaDescriptors(cCaDescriptors *CaDescriptors) +{ + cMutexLock MutexLock(&mutex); + for (cCaDescriptors *ca = First(); ca; ca = Next(ca)) { + if (ca->Is(CaDescriptors)) { + if (*ca == *CaDescriptors) { + delete CaDescriptors; + return 0; + } + Del(ca); + Add(CaDescriptors); + return 2; + } + } + Add(CaDescriptors); + return CaDescriptors->Empty() ? 0 : 1; +} + +int cCaDescriptorHandler::GetCaDescriptors(int Source, int Transponder, int ServiceId, const unsigned short *CaSystemIds, int BufSize, uchar *Data, bool &StreamFlag) +{ + cMutexLock MutexLock(&mutex); + for (cCaDescriptors *ca = First(); ca; ca = Next(ca)) { + if (ca->Is(Source, Transponder, ServiceId)) + return ca->GetCaDescriptors(CaSystemIds, BufSize, Data, StreamFlag); + } + return 0; +} + +cCaDescriptorHandler CaDescriptorHandler; + +int GetCaDescriptors(int Source, int Transponder, int ServiceId, const unsigned short *CaSystemIds, int BufSize, uchar *Data, bool &StreamFlag) +{ + return CaDescriptorHandler.GetCaDescriptors(Source, Transponder, ServiceId, CaSystemIds, BufSize, Data, StreamFlag); +} + +// --- cPatFilter ------------------------------------------------------------ + +cPatFilter::cPatFilter(void) +{ + pmtIndex = 0; + pmtPid = 0; + lastPmtScan = 0; + numPmtEntries = 0; + Set(0x00, 0x00); // PAT +} + +void cPatFilter::SetStatus(bool On) +{ + cFilter::SetStatus(On); + pmtIndex = 0; + pmtPid = 0; + lastPmtScan = 0; + numPmtEntries = 0; +} + +void cPatFilter::Trigger(void) +{ + numPmtEntries = 0; +} + +bool cPatFilter::PmtVersionChanged(int PmtPid, int Version) +{ + Version <<= 16; + for (int i = 0; i < numPmtEntries; i++) { + if ((pmtVersion[i] & 0x0000FFFF) == PmtPid) { + bool Changed = (pmtVersion[i] & 0x00FF0000) != Version; + if (Changed) + pmtVersion[i] = PmtPid | Version; + return Changed; + } + } + if (numPmtEntries < MAXPMTENTRIES) + pmtVersion[numPmtEntries++] = PmtPid | Version; + return true; +} + +void cPatFilter::Process(u_short Pid, u_char Tid, const u_char *Data, int Length) +{ + if (Pid == 0x00) { + if (Tid == 0x00) { + if (pmtPid && time(NULL) - lastPmtScan > PMT_SCAN_TIMEOUT) { + Del(pmtPid, 0x02); + pmtPid = 0; + pmtIndex++; + lastPmtScan = time(NULL); + } + if (!pmtPid) { + SI::PAT pat(Data, false); + if (!pat.CheckCRCAndParse()) + return; + SI::PAT::Association assoc; + int Index = 0; + for (SI::Loop::Iterator it; pat.associationLoop.hasNext(it); ) { + assoc = pat.associationLoop.getNext(it); + if (!assoc.isNITPid()) { + if (Index++ == pmtIndex) { + pmtPid = assoc.getPid(); + Add(pmtPid, 0x02); + break; + } + } + } + if (!pmtPid) + pmtIndex = 0; + } + } + } + else if (Pid == pmtPid && Tid == SI::TableIdPMT && Source() && Transponder()) { + SI::PMT pmt(Data, false); + if (!pmt.CheckCRCAndParse()) + return; + if (!PmtVersionChanged(pmtPid, pmt.getVersionNumber())) { + lastPmtScan = 0; // this triggers the next scan + return; + } + if (!Channels.Lock(true, 10)) { + numPmtEntries = 0; // to make sure we try again + return; + } + cChannel *Channel = Channels.GetByServiceID(Source(), Transponder(), pmt.getServiceId()); + if (Channel) { + SI::CaDescriptor *d; + cCaDescriptors *CaDescriptors = new cCaDescriptors(Channel->Source(), Channel->Transponder(), Channel->Sid()); + // Scan the common loop: + for (SI::Loop::Iterator it; (d = (SI::CaDescriptor*)pmt.commonDescriptors.getNext(it, SI::CaDescriptorTag)); ) { + CaDescriptors->AddCaDescriptor(d, false); + delete d; + } + // Scan the stream-specific loop: + SI::PMT::Stream stream; + int Vpid = 0; + int Ppid = pmt.getPCRPid(); + int Apids[MAXAPIDS] = { 0 }; + int Dpids[MAXAPIDS] = { 0 }; + int Tpid = 0; + int NumApids = 0; + int NumDpids = 0; + for (SI::Loop::Iterator it; pmt.streamLoop.hasNext(it); ) { + stream = pmt.streamLoop.getNext(it); + switch (stream.getStreamType()) { + case 1: // STREAMTYPE_11172_VIDEO + case 2: // STREAMTYPE_13818_VIDEO + Vpid = stream.getPid(); + break; + case 3: // STREAMTYPE_11172_AUDIO + case 4: // STREAMTYPE_13818_AUDIO + { + if (NumApids < MAXAPIDS) + Apids[NumApids++] = stream.getPid(); + } + break; + case 5: // STREAMTYPE_13818_PRIVATE + case 6: // STREAMTYPE_13818_PES_PRIVATE + //XXX case 8: // STREAMTYPE_13818_DSMCC + { + SI::Descriptor *d; + for (SI::Loop::Iterator it; (d = stream.streamDescriptors.getNext(it)); ) { + switch (d->getDescriptorTag()) { + case SI::AC3DescriptorTag: + if (NumDpids < MAXAPIDS) + Dpids[NumDpids++] = stream.getPid(); + break; + case SI::TeletextDescriptorTag: + Tpid = stream.getPid(); + break; + default: ; + } + delete d; + } + } + break; + //default: printf("PID: %5d %5d %2d %3d %3d\n", pmt.getServiceId(), stream.getPid(), stream.getStreamType(), pmt.getVersionNumber(), Channel->Number());//XXX + } + for (SI::Loop::Iterator it; (d = (SI::CaDescriptor*)stream.streamDescriptors.getNext(it, SI::CaDescriptorTag)); ) { + CaDescriptors->AddCaDescriptor(d, true); + delete d; + } + } + Channel->SetPids(Vpid, Ppid, Apids[0], Apids[1], Dpids[0], Dpids[1], Tpid); + Channel->SetCaIds(CaDescriptors->CaIds()); + Channel->SetCaDescriptors(CaDescriptorHandler.AddCaDescriptors(CaDescriptors)); + } + lastPmtScan = 0; // this triggers the next scan + Channels.Unlock(); + } +} @@ -0,0 +1,43 @@ +/* + * pat.h: PAT section filter + * + * See the main source file 'vdr.c' for copyright information and + * how to reach the author. + * + * $Id: pat.h 1.3 2004/01/03 13:47:54 kls Exp $ + */ + +#ifndef __PAT_H +#define __PAT_H + +#include "filter.h" + +#define MAXPMTENTRIES 64 + +class cPatFilter : public cFilter { +private: + time_t lastPmtScan; + int pmtIndex; + int pmtPid; + int pmtVersion[MAXPMTENTRIES]; + int numPmtEntries; + bool PmtVersionChanged(int PmtPid, int Version); +protected: + virtual void Process(u_short Pid, u_char Tid, const u_char *Data, int Length); +public: + cPatFilter(void); + virtual void SetStatus(bool On); + void Trigger(void); + }; + +int GetCaDescriptors(int Source, int Transponder, int ServiceId, const unsigned short *CaSystemIds, int BufSize, uchar *Data, bool &StreamFlag); + ///< Gets all CA descriptors for a given channel. + ///< Copies all available CA descriptors for the given Source, Transponder and ServiceId + ///< into the provided buffer at Data (at most BufSize bytes). Only those CA descriptors + ///< are copied that match one of the given CA system IDs. + ///< \return Returns the number of bytes copied into Data (0 if no CA descriptors are + ///< available), or -1 if BufSize was too small to hold all CA descriptors. + ///< The return value in StreamFlag tells whether these CA descriptors are to be used + ///< for the individual streams. + +#endif //__PAT_H @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: rcu.c 1.5 2003/05/02 14:42:40 kls Exp $ + * $Id: rcu.c 1.6 2003/10/18 11:34:30 kls Exp $ */ #include "rcu.h" @@ -18,6 +18,7 @@ cRcuRemote::cRcuRemote(char *DeviceName) :cRemote("RCU") +,cThread("RCU remote control") { dp = 0; mode = modeB; @@ -92,8 +93,6 @@ void cRcuRemote::Action(void) } buffer; #pragma pack() - dsyslog("RCU remote control thread started (pid=%d)", getpid()); - time_t LastCodeRefresh = 0; int FirstTime = 0; uint64 LastCommand = 0; @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: recorder.c 1.7 2003/08/02 13:01:19 kls Exp $ + * $Id: recorder.c 1.8 2003/10/18 11:35:02 kls Exp $ */ #include <stdarg.h> @@ -25,6 +25,7 @@ cRecorder::cRecorder(const char *FileName, int Ca, int Priority, int VPid, int APid1, int APid2, int DPid1, int DPid2) :cReceiver(Ca, Priority, 5, VPid, APid1, APid2, DPid1, DPid2) +,cThread("recording") { ringBuffer = NULL; remux = NULL; @@ -106,8 +107,6 @@ void cRecorder::Receive(uchar *Data, int Length) void cRecorder::Action(void) { - dsyslog("recording thread started (pid=%d)", getpid()); - time_t t = time(NULL); active = true; while (active) { @@ -143,6 +142,4 @@ void cRecorder::Action(void) else usleep(1); // this keeps the CPU load low } - - dsyslog("recording thread ended (pid=%d)", getpid()); } @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: remote.c 1.38 2003/05/02 10:49:50 kls Exp $ + * $Id: remote.c 1.39 2003/10/18 11:35:32 kls Exp $ */ #include "remote.h" @@ -197,6 +197,7 @@ bool cKbdRemote::rawMode = false; cKbdRemote::cKbdRemote(void) :cRemote("KBD") +,cThread("KBD remote control") { active = false; tcgetattr(STDIN_FILENO, &savedTm); @@ -245,7 +246,6 @@ int cKbdRemote::MapCodeToFunc(uint64 Code) void cKbdRemote::Action(void) { - dsyslog("KBD remote control thread started (pid=%d)", getpid()); cPoller Poller(STDIN_FILENO); active = true; while (active) { @@ -285,5 +285,4 @@ void cKbdRemote::Action(void) } } } - dsyslog("KBD remote control thread ended (pid=%d)", getpid()); } diff --git a/ringbuffer.c b/ringbuffer.c index 2cf9d75..c92b75f 100644 --- a/ringbuffer.c +++ b/ringbuffer.c @@ -7,7 +7,7 @@ * Parts of this file were inspired by the 'ringbuffy.c' from the * LinuxDVB driver (see linuxtv.org). * - * $Id: ringbuffer.c 1.17 2003/05/12 17:38:11 kls Exp $ + * $Id: ringbuffer.c 1.18 2003/10/12 14:25:09 kls Exp $ */ #include "ringbuffer.h" @@ -75,7 +75,7 @@ cRingBufferLinear::cRingBufferLinear(int Size, int Margin, bool Statistics) { margin = Margin; buffer = NULL; - getThreadPid = -1; + getThreadTid = 0; if (Size > 1) { // 'Size - 1' must not be 0! buffer = MALLOC(uchar, Size); if (!buffer) @@ -125,7 +125,7 @@ int cRingBufferLinear::Put(const uchar *Data, int Count) int percent = maxFill * 100 / (Size() - 1) / 5 * 5; if (abs(lastPercent - percent) >= 5) { if (percent > 75) - dsyslog("buffer usage: %d%% (pid=%d)", percent, getThreadPid); + dsyslog("buffer usage: %d%% (tid=%ld)", percent, getThreadTid); lastPercent = percent; } } @@ -159,8 +159,8 @@ uchar *cRingBufferLinear::Get(int &Count) { uchar *p = NULL; Lock(); - if (getThreadPid < 0) - getThreadPid = getpid(); + if (getThreadTid <= 0) + getThreadTid = pthread_self(); int rest = Size() - tail; if (rest < margin && head < tail) { int t = margin - rest; diff --git a/ringbuffer.h b/ringbuffer.h index 1506345..0680df4 100644 --- a/ringbuffer.h +++ b/ringbuffer.h @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: ringbuffer.h 1.12 2003/05/12 17:35:10 kls Exp $ + * $Id: ringbuffer.h 1.13 2003/10/12 13:57:56 kls Exp $ */ #ifndef __RINGBUFFER_H @@ -46,7 +46,7 @@ private: int margin, head, tail; int lastGet; uchar *buffer; - pid_t getThreadPid; + pthread_t getThreadTid; public: cRingBufferLinear(int Size, int Margin = 0, bool Statistics = false); ///< Creates a linear ring buffer. @@ -0,0 +1,146 @@ +/* + * sdt.c: SDT section filter + * + * See the main source file 'vdr.c' for copyright information and + * how to reach the author. + * + * $Id: sdt.c 1.1 2004/01/04 11:54:42 kls Exp $ + */ + +#include "sdt.h" +#include "channels.h" +#include "libsi/section.h" +#include "libsi/descriptor.h" + +// --- cSDT ------------------------------------------------------------------ + +class cSDT : public SI::SDT { +public: + cSDT(int Source, int Transponder, uchar &lastSdtVersion, cPatFilter *PatFilter, const u_char *Data); + }; + +cSDT::cSDT(int Source, int Transponder, uchar &lastSdtVersion, cPatFilter *PatFilter, const u_char *Data) +:SI::SDT(Data, false) +{ + if (!CheckCRCAndParse()) + return; + + if (getVersionNumber() == lastSdtVersion) + return; + + if (!Channels.Lock(true, 10)) + return; + + lastSdtVersion = getVersionNumber(); + + SI::SDT::Service SiSdtService; + for (SI::Loop::Iterator it; serviceLoop.hasNext(it); ) { + SiSdtService = serviceLoop.getNext(it); + + cChannel *Channel = Channels.GetByChannelID(tChannelID(Source, getOriginalNetworkId(), getTransportStreamId(), SiSdtService.getServiceId())); + if (!Channel) + Channel = Channels.GetByChannelID(tChannelID(Source, 0, Transponder, SiSdtService.getServiceId())); + + SI::Descriptor *d; + for (SI::Loop::Iterator it2; (d = SiSdtService.serviceDescriptors.getNext(it2)); ) { + switch (d->getDescriptorTag()) { + case SI::ServiceDescriptorTag: { + SI::ServiceDescriptor *sd = (SI::ServiceDescriptor *)d; + switch (sd->getServiceType()) { + case 0x01: // digital television service + //XXX TODO case 0x02: // digital radio sound service + //XXX TODO case 0x04: // NVOD reference service + //XXX TODO case 0x05: // NVOD time-shifted service + { + char buffer[1024]; + char *p = sd->serviceName.getText(buffer); + char NameBuf[1024]; + char ShortNameBuf[1024]; + char *pn = NameBuf; + char *ps = ShortNameBuf; + int IsShortName = 0; + while (*p) { + if ((uchar)*p == 0x86) + IsShortName++; + else if ((uchar)*p == 0x87) + IsShortName--; + else { + *pn++ = *p; + if (IsShortName) + *ps++ = *p; + } + p++; + } + *pn = *ps = 0; + pn = NameBuf; + if (*NameBuf && *ShortNameBuf) { + *ps++ = ','; + strcpy(ps, NameBuf); + pn = ShortNameBuf; + } + if (Channel) { + Channel->SetId(getOriginalNetworkId(), getTransportStreamId(), SiSdtService.getServiceId()); + Channel->SetName(pn); + // Using SiSdtService.getFreeCaMode() is no good, because some + // tv stations set this flag even for non-encrypted channels :-( + // The special value 0xFFFF was supposed to mean "unknown encryption" + // and would have been overwritten with real CA values later: + // Channel->SetCa(SiSdtService.getFreeCaMode() ? 0xFFFF : 0); + } + else if (*pn) { + Channel = Channels.NewChannel(Source, Transponder, pn, getOriginalNetworkId(), getTransportStreamId(), SiSdtService.getServiceId()); + PatFilter->Trigger(); + } + } + } + } + break; + // Using the CaIdentifierDescriptor is no good, because some tv stations + // just don't use it. The actual CA values are collected in pat.c: + /* + case SI::CaIdentifierDescriptorTag: { + SI::CaIdentifierDescriptor *cid = (SI::CaIdentifierDescriptor *)d; + if (Channel) { + for (SI::Loop::Iterator it; cid->identifiers.hasNext(it); ) + Channel->SetCa(cid->identifiers.getNext(it)); + } + } + break; + */ + case SI::NVODReferenceDescriptorTag: { + SI::NVODReferenceDescriptor *nrd = (SI::NVODReferenceDescriptor *)d; + for (SI::Loop::Iterator it; nrd->serviceLoop.hasNext(it); ) { + SI::NVODReferenceDescriptor::Service Service = nrd->serviceLoop.getNext(it); + //printf(" %04X-%04X-%04X\n", Service.getOriginalNetworkId(), Service.getTransportStream(), Service.getServiceId());//XXX TODO + } + } + break; + default: ; + } + delete d; + } + } + Channels.Unlock(); +} + + +// --- cSdtFilter ------------------------------------------------------------ + +cSdtFilter::cSdtFilter(cPatFilter *PatFilter) +{ + lastSdtVersion = 0xFF; + patFilter = PatFilter; + Set(0x11, 0x42); // SDT +} + +void cSdtFilter::SetStatus(bool On) +{ + cFilter::SetStatus(On); + lastSdtVersion = 0xFF; +} + +void cSdtFilter::Process(u_short Pid, u_char Tid, const u_char *Data, int Length) +{ + if (Source() && Transponder()) + cSDT SDT(Source(), Transponder(), lastSdtVersion, patFilter, Data); +} @@ -0,0 +1,27 @@ +/* + * sdt.h: SDT section filter + * + * See the main source file 'vdr.c' for copyright information and + * how to reach the author. + * + * $Id: sdt.h 1.1 2004/01/03 13:49:55 kls Exp $ + */ + +#ifndef __SDT_H +#define __SDT_H + +#include "filter.h" +#include "pat.h" + +class cSdtFilter : public cFilter { +private: + uchar lastSdtVersion; + cPatFilter *patFilter; +protected: + virtual void Process(u_short Pid, u_char Tid, const u_char *Data, int Length); +public: + cSdtFilter(cPatFilter *PatFilter); + virtual void SetStatus(bool On); + }; + +#endif //__SDT_H diff --git a/sections.c b/sections.c new file mode 100644 index 0000000..6b4d490 --- /dev/null +++ b/sections.c @@ -0,0 +1,187 @@ +/* + * sections.c: Section data handling + * + * See the main source file 'vdr.c' for copyright information and + * how to reach the author. + * + * $Id: sections.c 1.2 2004/01/03 12:54:01 kls Exp $ + */ + +#include "sections.h" +#include <unistd.h> +#include "device.h" + +// --- cFilterHandle---------------------------------------------------------- + +class cFilterHandle : public cListObject { +public: + cFilterData filterData; + int handle; + int used; + cFilterHandle(const cFilterData &FilterData); + }; + +cFilterHandle::cFilterHandle(const cFilterData &FilterData) +{ + filterData = FilterData; + handle = -1; + used = 0; +} + +// --- cSectionHandler ------------------------------------------------------- + +cSectionHandler::cSectionHandler(cDevice *Device) +:cThread("Section handler") +{ + device = Device; + active = false; + source = 0; + transponder = 0; + statusCount = 0; + on = false; + Start(); +} + +cSectionHandler::~cSectionHandler() +{ + active = false; + Cancel(3); + cFilter *fi; + while ((fi = filters.First()) != NULL) + Detach(fi); +} + +void cSectionHandler::Add(const cFilterData *FilterData) +{ + Lock(); + statusCount++; + cFilterHandle *fh; + for (fh = filterHandles.First(); fh; fh = filterHandles.Next(fh)) { + if (fh->filterData.Is(FilterData->pid, FilterData->tid, FilterData->mask)) + break; + } + if (!fh) { + fh = new cFilterHandle(*FilterData); + filterHandles.Add(fh); + fh->handle = device->OpenFilter(FilterData->pid, FilterData->tid, FilterData->mask); + } + fh->used++; + Unlock(); +} + +void cSectionHandler::Del(const cFilterData *FilterData) +{ + Lock(); + statusCount++; + cFilterHandle *fh; + for (fh = filterHandles.First(); fh; fh = filterHandles.Next(fh)) { + if (fh->filterData.Is(FilterData->pid, FilterData->tid, FilterData->mask)) { + if (--fh->used <= 0) { + close(fh->handle); + filterHandles.Del(fh); + break; + } + } + } + Unlock(); +} + +void cSectionHandler::Attach(cFilter *Filter) +{ + Lock(); + statusCount++; + filters.Add(Filter); + Filter->sectionHandler = this; + Filter->SetStatus(true); + Unlock(); +} + +void cSectionHandler::Detach(cFilter *Filter) +{ + Lock(); + statusCount++; + Filter->SetStatus(false); + Filter->sectionHandler = NULL; + filters.Del(Filter, false); + Unlock(); +} + +void cSectionHandler::SetSource(int Source, int Transponder) +{ + Lock(); + source = Source; + transponder = Transponder; + Unlock(); +} + +void cSectionHandler::SetStatus(bool On) +{ + Lock(); + if (on != On) { + statusCount++; + for (cFilter *fi = filters.First(); fi; fi = filters.Next(fi)) { + fi->SetStatus(false); + if (On) + fi->SetStatus(true); + } + on = On; + } + Unlock(); +} + +void cSectionHandler::Action(void) +{ + active = true; + while (active) { + + Lock(); + int NumFilters = filterHandles.Count(); + pollfd pfd[NumFilters]; + for (cFilterHandle *fh = filterHandles.First(); fh; fh = filterHandles.Next(fh)) { + int i = fh->Index(); + pfd[i].fd = fh->handle; + pfd[i].events = POLLIN; + } + int oldStatusCount = statusCount; + Unlock(); + + if (poll(pfd, NumFilters, 1000) != 0) { + bool DeviceHasLock = device->HasLock(); + if (!DeviceHasLock) + usleep(100000); + for (int i = 0; i < NumFilters; i++) { + if (pfd[i].revents & POLLIN) { + cFilterHandle *fh = NULL; + LOCK_THREAD; + if (statusCount != oldStatusCount) + break; + for (fh = filterHandles.First(); fh; fh = filterHandles.Next(fh)) { + if (pfd[i].fd == fh->handle) + break; + } + if (fh) { + // Read section data: + unsigned char buf[4096]; // max. allowed size for any EIT section + int r = safe_read(fh->handle, buf, sizeof(buf)); + if (!DeviceHasLock) + continue; // we do the read anyway, to flush any data that might have come from a different transponder + if (r > 3) { // minimum number of bytes necessary to get section length + int len = (((buf[1] & 0x0F) << 8) | (buf[2] & 0xFF)) + 3; + if (len == r) { + // Distribute data to all attached filters: + int pid = fh->filterData.pid; + int tid = buf[0]; + for (cFilter *fi = filters.First(); fi; fi = filters.Next(fi)) { + if (fi->Matches(pid, tid)) + fi->Process(pid, tid, buf, len); + } + } + else + dsyslog("read incomplete section - len = %d, r = %d", len, r); + } + } + } + } + } + } +} diff --git a/sections.h b/sections.h new file mode 100644 index 0000000..1f4f462 --- /dev/null +++ b/sections.h @@ -0,0 +1,45 @@ +/* + * sections.h: Section data handling + * + * See the main source file 'vdr.c' for copyright information and + * how to reach the author. + * + * $Id: sections.h 1.1 2003/12/21 14:37:00 kls Exp $ + */ + +#ifndef __SECTIONS_H +#define __SECTIONS_H + +#include "filter.h" +#include "thread.h" +#include "tools.h" + +class cDevice; +class cFilterHandle; + +class cSectionHandler : public cThread { + friend class cFilter; +private: + cDevice *device; + bool active; + int source; + int transponder; + int statusCount; + bool on; + cList<cFilter> filters; + cList<cFilterHandle> filterHandles; + void Add(const cFilterData *FilterData); + void Del(const cFilterData *FilterData); + virtual void Action(void); +public: + cSectionHandler(cDevice *Device); + virtual ~cSectionHandler(); + int Source(void) { return source; } + int Transponder(void) { return transponder; } + void Attach(cFilter *Filter); + void Detach(cFilter *Filter); + void SetSource(int Source, int Transponder); + void SetStatus(bool On); + }; + +#endif //__SECTIONS_H @@ -10,7 +10,7 @@ * and interact with the Video Disk Recorder - or write a full featured * graphical interface that sits on top of an SVDRP connection. * - * $Id: svdrp.c 1.55 2003/08/31 11:24:47 kls Exp $ + * $Id: svdrp.c 1.57 2003/12/28 10:09:30 kls Exp $ */ #include "svdrp.h" @@ -155,7 +155,7 @@ bool cPUTEhandler::Process(const char *s) else { rewind(f); if (cSchedules::Read(f)) { - cSIProcessor::TriggerDump(); + cSchedules::Cleanup(true); status = 250; message = "EPG data processed"; } @@ -458,7 +458,7 @@ void cSVDRP::CmdCHAN(const char *Option) void cSVDRP::CmdCLRE(const char *Option) { - cSIProcessor::Clear(); + cSchedules::ClearAll(); Reply(250, "EPG data cleared"); } @@ -476,7 +476,7 @@ void cSVDRP::CmdDELC(const char *Option) } Channels.Del(channel); Channels.ReNumber(); - Channels.Save(); + Channels.SetModified(); isyslog("channel %s deleted", Option); Reply(250, "Channel \"%s\" deleted", Option); } @@ -707,8 +707,8 @@ void cSVDRP::CmdLSTC(const char *Option) void cSVDRP::CmdLSTE(const char *Option) { - cMutexLock MutexLock; - const cSchedules *Schedules = cSIProcessor::Schedules(MutexLock); + cSchedulesLock SchedulesLock; + const cSchedules *Schedules = cSchedules::Schedules(SchedulesLock); if (Schedules) { FILE *f = fdopen(file, "w"); if (f) { @@ -810,9 +810,8 @@ void cSVDRP::CmdMODC(const char *Option) if (Channels.HasUniqueChannelID(&ch, channel)) { *channel = ch; Channels.ReNumber(); - Channels.Save(); + Channels.SetModified(); isyslog("modifed channel %d %s", channel->Number(), channel->ToText()); - Timers.Save(); Reply(250, "%d %s", channel->Number(), channel->ToText()); } else @@ -886,7 +885,7 @@ void cSVDRP::CmdNEWC(const char *Option) *channel = ch; Channels.Add(channel); Channels.ReNumber(); - Channels.Save(); + Channels.SetModified(); isyslog("new channel %d %s", channel->Number(), channel->ToText()); Reply(250, "%d %s", channel->Number(), channel->ToText()); } @@ -4,12 +4,14 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: thread.c 1.25 2003/05/18 12:45:13 kls Exp $ + * $Id: thread.c 1.30 2004/01/03 16:59:33 kls Exp $ */ #include "thread.h" #include <errno.h> +#include <malloc.h> #include <signal.h> +#include <stdarg.h> #include <sys/resource.h> #include <sys/time.h> #include <sys/wait.h> @@ -30,7 +32,7 @@ cCondVar::~cCondVar() void cCondVar::Wait(cMutex &Mutex) { - if (Mutex.locked && Mutex.lockingPid == getpid()) { + if (Mutex.locked) { int locked = Mutex.locked; Mutex.locked = 0; // have to clear the locked count here, as pthread_cond_wait // does an implizit unlock of the mutex @@ -43,7 +45,7 @@ bool cCondVar::TimedWait(cMutex &Mutex, int TimeoutMs) { bool r = true; // true = condition signaled false = timeout - if (Mutex.locked && Mutex.lockingPid == getpid()) { + if (Mutex.locked) { struct timeval now; // unfortunately timedwait needs the absolute time, not the delta :-( if (gettimeofday(&now, NULL) == 0) { // get current time now.tv_usec += TimeoutMs * 1000; // add the timeout @@ -61,7 +63,6 @@ bool cCondVar::TimedWait(cMutex &Mutex, int TimeoutMs) if (pthread_cond_timedwait(&cond, &Mutex.mutex, &abstime) == ETIMEDOUT) r = false; Mutex.locked = locked; - Mutex.lockingPid = getpid(); } } return r; @@ -79,13 +80,46 @@ void cCondVar::Signal(void) } */ +// --- cRwLock --------------------------------------------------------------- + +cRwLock::cRwLock(bool PreferWriter) +{ + pthread_rwlockattr_t attr = { PreferWriter ? PTHREAD_RWLOCK_PREFER_WRITER_NP : PTHREAD_RWLOCK_PREFER_READER_NP }; + pthread_rwlock_init(&rwlock, &attr); +} + +cRwLock::~cRwLock() +{ + pthread_rwlock_destroy(&rwlock); +} + +bool cRwLock::Lock(bool Write, int TimeoutMs) +{ + int Result = 0; + struct timespec abstime; + if (TimeoutMs) { + abstime.tv_sec = TimeoutMs / 1000; + abstime.tv_nsec = (TimeoutMs % 1000) * 1000000; + } + if (Write) + Result = TimeoutMs ? pthread_rwlock_timedwrlock(&rwlock, &abstime) : pthread_rwlock_wrlock(&rwlock); + else + Result = TimeoutMs ? pthread_rwlock_timedrdlock(&rwlock, &abstime) : pthread_rwlock_rdlock(&rwlock); + return Result == 0; +} + +void cRwLock::Unlock(void) +{ + pthread_rwlock_unlock(&rwlock); +} + // --- cMutex ---------------------------------------------------------------- cMutex::cMutex(void) { - lockingPid = 0; locked = 0; - pthread_mutex_init(&mutex, NULL); + pthread_mutexattr_t attr = { PTHREAD_MUTEX_ERRORCHECK_NP }; + pthread_mutex_init(&mutex, &attr); } cMutex::~cMutex() @@ -95,19 +129,14 @@ cMutex::~cMutex() void cMutex::Lock(void) { - if (getpid() != lockingPid || !locked) { - pthread_mutex_lock(&mutex); - lockingPid = getpid(); - } + pthread_mutex_lock(&mutex); locked++; } void cMutex::Unlock(void) { - if (!--locked) { - lockingPid = 0; + if (!--locked) pthread_mutex_unlock(&mutex); - } } // --- cThread --------------------------------------------------------------- @@ -118,18 +147,33 @@ void cMutex::Unlock(void) bool cThread::signalHandlerInstalled = false; bool cThread::emergencyExitRequested = false; -cThread::cThread(void) +cThread::cThread(const char *Description) { if (!signalHandlerInstalled) { signal(SIGIO, SignalHandler); signalHandlerInstalled = true; } running = false; - parentPid = threadPid = 0; + parentTid = childTid = 0; + description = NULL; + SetDescription(Description); } cThread::~cThread() { + free(description); +} + +void cThread::SetDescription(const char *Description, ...) +{ + free(description); + description = NULL; + if (Description) { + va_list ap; + va_start(ap, Description); + vasprintf(&description, Description, ap); + va_end(ap); + } } void cThread::SignalHandler(int signum) @@ -139,8 +183,13 @@ void cThread::SignalHandler(int signum) void *cThread::StartThread(cThread *Thread) { - Thread->threadPid = getpid(); + Thread->childTid = pthread_self(); + if (Thread->description) + dsyslog("%s thread started (pid=%d, tid=%ld)", Thread->description, getpid(), Thread->childTid); Thread->Action(); + if (Thread->description) + dsyslog("%s thread ended (pid=%d, tid=%ld)", Thread->description, getpid(), Thread->childTid); + Thread->childTid = 0; return NULL; } @@ -148,9 +197,9 @@ bool cThread::Start(void) { if (!running) { running = true; - parentPid = getpid(); - pthread_create(&thread, NULL, (void *(*) (void *))&StartThread, (void *)this); - pthread_setschedparam(thread, SCHED_RR, 0); + parentTid = pthread_self(); + pthread_create(&childTid, NULL, (void *(*) (void *))&StartThread, (void *)this); + pthread_setschedparam(childTid, SCHED_RR, 0); usleep(10000); // otherwise calling Active() immediately after Start() causes a "pure virtual method called" error } return true; //XXX return value of pthread_create()??? @@ -158,12 +207,21 @@ bool cThread::Start(void) bool cThread::Active(void) { - if (threadPid) { - if (kill(threadPid, SIGIO) < 0) { // couldn't find another way of checking whether the thread is still running - any ideas? - if (errno == ESRCH) - threadPid = 0; - else + if (childTid) { + // + // Single UNIX Spec v2 says: + // + // The pthread_kill() function is used to request + // that a signal be delivered to the specified thread. + // + // As in kill(), if sig is zero, error checking is + // performed but no signal is actually sent. + // + int err; + if ((err = pthread_kill(childTid, 0)) != 0) { + if (err != ESRCH) LOG_ERROR; + childTid = 0; } else return true; @@ -180,14 +238,14 @@ void cThread::Cancel(int WaitSeconds) return; usleep(10000); } - esyslog("ERROR: thread %d won't end (waited %d seconds) - cancelling it...", threadPid, WaitSeconds); + esyslog("ERROR: thread %ld won't end (waited %d seconds) - cancelling it...", childTid, WaitSeconds); } - pthread_cancel(thread); + pthread_cancel(childTid); } void cThread::WakeUp(void) { - kill(parentPid, SIGIO); // makes any waiting 'select()' call return immediately + pthread_kill(parentTid, SIGIO); // makes any waiting 'select()' call return immediately } bool cThread::EmergencyExit(bool Request) @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: thread.h 1.15 2003/05/03 14:03:36 kls Exp $ + * $Id: thread.h 1.20 2004/01/03 16:58:50 kls Exp $ */ #ifndef __THREAD_H @@ -28,11 +28,20 @@ public: //void Signal(void); }; +class cRwLock { +private: + pthread_rwlock_t rwlock; +public: + cRwLock(bool PreferWriter = false); + ~cRwLock(); + bool Lock(bool Write, int TimeoutMs = 0); + void Unlock(void); + }; + class cMutex { friend class cCondVar; private: pthread_mutex_t mutex; - pid_t lockingPid; int locked; public: cMutex(void); @@ -44,10 +53,10 @@ public: class cThread { friend class cThreadLock; private: - pthread_t thread; + pthread_t parentTid, childTid; cMutex mutex; - pid_t parentPid, threadPid; bool running; + char *description; static bool emergencyExitRequested; static bool signalHandlerInstalled; static void SignalHandler(int signum); @@ -59,8 +68,9 @@ protected: virtual void Action(void) = 0; void Cancel(int WaitSeconds = 0); public: - cThread(void); + cThread(const char *Description = NULL); virtual ~cThread(); + void SetDescription(const char *Description, ...); bool Start(void); bool Active(void); static bool EmergencyExit(bool Request = false); @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: timers.c 1.6 2003/10/12 10:33:09 kls Exp $ + * $Id: timers.c 1.8 2003/12/27 13:10:04 kls Exp $ */ #include "timers.h" @@ -44,14 +44,14 @@ cTimer::cTimer(bool Instant, bool Pause) snprintf(file, sizeof(file), "%s%s", Setup.MarkInstantRecord ? "@" : "", *Setup.NameInstantRecord ? Setup.NameInstantRecord : channel->Name()); } -cTimer::cTimer(const cEventInfo *EventInfo) +cTimer::cTimer(const cEvent *Event) { startTime = stopTime = 0; recording = pending = false; active = true; - channel = Channels.GetByChannelID(EventInfo->GetChannelID(), true); - time_t tstart = EventInfo->GetTime(); - time_t tstop = tstart + EventInfo->GetDuration() + Setup.MarginStop * 60; + channel = Channels.GetByChannelID(Event->ChannelID(), true); + time_t tstart = Event->StartTime(); + time_t tstop = tstart + Event->Duration() + Setup.MarginStop * 60; tstart -= Setup.MarginStart * 60; struct tm tm_r; struct tm *time = localtime_r(&tstart, &tm_r); @@ -64,9 +64,9 @@ cTimer::cTimer(const cEventInfo *EventInfo) priority = Setup.DefaultPriority; lifetime = Setup.DefaultLifetime; *file = 0; - const char *Title = EventInfo->GetTitle(); + const char *Title = Event->Title(); if (!isempty(Title)) - strn0cpy(file, EventInfo->GetTitle(), sizeof(file)); + strn0cpy(file, Event->Title(), sizeof(file)); firstday = 0; summary = NULL; } @@ -216,8 +216,10 @@ bool cTimer::Parse(const char *s) strn0cpy(file, filebuffer, MaxFileName); strreplace(file, '|', ':'); strreplace(summary, '|', '\n'); - tChannelID cid = tChannelID::FromString(channelbuffer); - channel = cid.Valid() ? Channels.GetByChannelID(cid, true) : Channels.GetByNumber(atoi(channelbuffer)); + if (isnumber(channelbuffer)) + channel = Channels.GetByNumber(atoi(channelbuffer)); + else + channel = Channels.GetByChannelID(tChannelID::FromString(channelbuffer), true); if (!channel) { esyslog("ERROR: channel %s not defined", channelbuffer); result = false; @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: timers.h 1.5 2003/05/11 13:35:53 kls Exp $ + * $Id: timers.h 1.6 2003/12/13 13:04:21 kls Exp $ */ #ifndef __TIMERS_H @@ -12,7 +12,7 @@ #include "channels.h" #include "config.h" -#include "eit.h" +#include "epg.h" #include "tools.h" enum eTimerActive { taInactive = 0, @@ -39,7 +39,7 @@ private: char *summary; public: cTimer(bool Instant = false, bool Pause = false); - cTimer(const cEventInfo *EventInfo); + cTimer(const cEvent *Event); virtual ~cTimer(); cTimer& operator= (const cTimer &Timer); virtual bool operator< (const cListObject &ListObject); @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: transfer.c 1.14 2003/08/31 12:19:16 kls Exp $ + * $Id: transfer.c 1.15 2003/10/18 11:36:03 kls Exp $ */ #include "transfer.h" @@ -19,6 +19,7 @@ cTransfer::cTransfer(int VPid, int APid1, int APid2, int DPid1, int DPid2) :cReceiver(0, -1, 5, VPid, APid1, APid2, DPid1, DPid2) +,cThread("transfer") { ringBuffer = new cRingBufferLinear(VIDEOBUFSIZE, TS_SIZE * 2, true); remux = new cRemux(VPid, APid1, APid2, DPid1, DPid2); @@ -66,8 +67,6 @@ void cTransfer::Receive(uchar *Data, int Length) void cTransfer::Action(void) { - dsyslog("transfer thread started (pid=%d)", getpid()); - int PollTimeouts = 0; active = true; while (active) { @@ -125,8 +124,6 @@ void cTransfer::Action(void) else usleep(1); // this keeps the CPU load low } - - dsyslog("transfer thread ended (pid=%d)", getpid()); } void cTransfer::StripAudioPackets(uchar *b, int Length, uchar Except) @@ -8,7 +8,7 @@ .\" License as specified in the file COPYING that comes with the .\" vdr distribution. .\" -.\" $Id: vdr.5 1.20 2003/05/29 11:58:57 kls Exp $ +.\" $Id: vdr.5 1.21 2004/01/02 15:24:21 kls Exp $ .\" .TH vdr 5 "1 Jun 2003" "1.2.0" "Video Disk Recorder Files" .SH NAME @@ -45,7 +45,7 @@ Such a delimiter will not appear in the Channels menu. A \fBchannel definition\fR is a line with channel data, where the fields are separated by ':' characters. Example: -\fBRTL:12188:h:S19.2E:27500:163:104:105:0:12003:0:0:0\fR +\fBRTL,RTL Television:12188:h:S19.2E:27500:163:104:105:0:12003:1:1089:0\fR The line number of a channel definition (not counting group separators, and based on a possible previous '@...' parameter) @@ -57,6 +57,13 @@ to right): .B Name The channel's name (if the name originally contains a ':' character it has to be replaced by '|'). +Some tv stations provide a way of deriving a "short name" from the +channel name, which can be used in situations where there is not +much space for displaying a long name. If a short name is available +for this channel, it preceeds the full name and is delimited by a comma, +as in + +\fBRTL,RTL Television:...\fR .TP .B Frequency The transponder frequency (as an integer). For DVB-S this value is in MHz. For DVB-C @@ -119,23 +126,33 @@ the audio PIDs, separated by a semicolon, as in The teletext PID. .TP .B Conditional access -An integer defining how this channel can be accessed: +A hexadecimal integer defining how this channel can be accessed: .TS tab (@); l l. -\fB0\fR@Free To Air -\fB1...4\fR@explicitly requires the DVB card with the given number -\fB>=100\fR@requires a specific decryption method defined in \fIca.conf\fR +\fB0000\fR@Free To Air +\fB0001...000F\fR@explicitly requires the device with the given number +\fB0010...00FF\fR@reserved for user defined assignments defined in \fIca.conf\fR +\fB0100...FFFF\fR@specific decryption methods as broadcast in the data stream\fR .TE +Values in the range 0001...00FF will not be overwritten, all other values +will be automatically replaced by the actual CA system identifiers received +from the data stream. If there is more than one CA system id broadcast, they +will be separated by commas, as in + +.B ...:1702,1722,1801:... + +The values are in hex because that's the way they are defined in the "ETR 162" +document. Leading zeros may be omitted. .TP .B SID The Service ID of this channel. .TP .B NID -The Network ID of this channel (for future use, currently always 0). +The Network ID of this channel. .TP .B TID -The Transport stream ID of this channel (for future use, currently always 0). +The Transport stream ID of this channel. .TP .B RID The Radio ID of this channel (typically 0, may be used to distinguish channels where @@ -144,12 +161,12 @@ NID, TID and SID are all equal). A particular channel can be uniquely identified by its \fBchannel\ ID\fR, which is a string that looks like this: -\fBS19.2E-0-12188-12003-0\fR +\fBS19.2E-1-1089-12003-0\fR -The components of this string are the \fBSource\fR (S19.2E), \fBFrequency\fR -(12188, MHz) and \fBSID\fR (12003) as defined above. The parts that are currently -\fB0\fR are reserved for future use (the last part can be omitted if it is \fB0\fR, -so the above example could also be written as \fBS19.2E-0-12188-12003\fR). +The components of this string are the \fBSource\fR (S19.2E), \fBNID\fR +(1), \fBTID\fR (1089), \fBSID\fR (12003) and \fBRID\fR (0) as defined above. +The last part can be omitted if it is \fB0\fR, +so the above example could also be written as S19.2E-1-1089-12003). .br The \fBchannel\ ID\fR is used in the \fItimers.conf\fR and \fIepg.data\fR files to properly identify the channels. @@ -22,7 +22,7 @@ * * The project's page is at http://www.cadsoft.de/vdr * - * $Id: vdr.c 1.169 2003/09/14 09:36:54 kls Exp $ + * $Id: vdr.c 1.172 2004/01/04 11:12:05 kls Exp $ */ #include <getopt.h> @@ -39,6 +39,7 @@ #include "diseqc.h" #include "dvbdevice.h" #include "eitscan.h" +#include "epg.h" #include "i18n.h" #include "interface.h" #include "keys.h" @@ -93,10 +94,12 @@ int main(int argc, char *argv[]) #define DEFAULTSVDRPPORT 2001 #define DEFAULTWATCHDOG 0 // seconds #define DEFAULTPLUGINDIR PLUGINDIR +#define DEFAULTEPGDATAFILENAME "epg.data" int SVDRPport = DEFAULTSVDRPPORT; const char *AudioCommand = NULL; const char *ConfigDirectory = NULL; + const char *EpgDataFileName = DEFAULTEPGDATAFILENAME; bool DisplayHelp = false; bool DisplayVersion = false; bool DaemonMode = false; @@ -146,7 +149,7 @@ int main(int argc, char *argv[]) fprintf(stderr, "vdr: invalid DVB device number: %s\n", optarg); return 2; break; - case 'E': cSIProcessor::SetEpgDataFileName(*optarg != '-' ? optarg : NULL); + case 'E': EpgDataFileName = (*optarg != '-' ? optarg : NULL); break; case 'h': DisplayHelp = true; break; @@ -239,7 +242,8 @@ int main(int argc, char *argv[]) " there may be several -D options (default: all DVB\n" " devices will be used)\n" " -E FILE --epgfile=FILE write the EPG data into the given FILE (default is\n" - " %s); use '-E-' to disable this\n" + " '%s' in the video directory)\n" + " '-E-' disables this\n" " if FILE is a directory, the default EPG file will be\n" " created in that directory\n" " -h, --help print this help and exit\n" @@ -261,7 +265,7 @@ int main(int argc, char *argv[]) " -w SEC, --watchdog=SEC activate the watchdog timer with a timeout of SEC\n" " seconds (default: %d); '0' disables the watchdog\n" "\n", - cSIProcessor::GetEpgDataFileName() ? cSIProcessor::GetEpgDataFileName() : "'-'", + DEFAULTEPGDATAFILENAME, DEFAULTPLUGINDIR, DEFAULTSVDRPPORT, VideoDirectory, @@ -358,6 +362,19 @@ int main(int argc, char *argv[]) )) return 2; + cFont::SetCode(I18nCharSets()[Setup.OSDLanguage]); + + // EPG data: + + if (EpgDataFileName) { + if (DirectoryOk(EpgDataFileName)) + EpgDataFileName = AddDirectory(EpgDataFileName, DEFAULTEPGDATAFILENAME); + else if (*EpgDataFileName != '/' && *EpgDataFileName != '.') + EpgDataFileName = AddDirectory(VideoDirectory, EpgDataFileName); + } + cSchedules::SetEpgDataFileName(EpgDataFileName); + cSchedules::Read(); + // DVB interfaces: cDvbDevice::Initialize(); @@ -436,8 +453,6 @@ int main(int argc, char *argv[]) else cDevice::PrimaryDevice()->SetVolume(Setup.CurrentVolume, true); - cSIProcessor::Read(); - // Signal handlers: if (signal(SIGHUP, SignalHandler) == SIG_IGN) signal(SIGHUP, SIG_IGN); @@ -496,6 +511,25 @@ int main(int argc, char *argv[]) dsyslog("max. latency time %d seconds", MaxLatencyTime); } } + // Handle channel modifications: + if (!Channels.BeingEdited() && Channels.Modified()) { + if (Channels.Lock(false, 100)) { + Channels.Save(); //XXX only after user changes??? + Timers.Save(); + for (cChannel *Channel = Channels.First(); Channel; Channel = Channels.Next(Channel)) { + if (Channel && Channel->Modification(CHANNELMOD_RETUNE)) { + cRecordControls::ChannelDataModified(Channel); + if (Channel->Number() == cDevice::CurrentChannel()) { + if (!cDevice::PrimaryDevice()->Replaying()) { + isyslog("retuning due to modification of channel %d", Channel->Number()); + Channels.SwitchTo(Channel->Number()); + } + } + } + } + Channels.Unlock(); + } + } // Channel display: if (!EITScanner.Active() && cDevice::CurrentChannel() != LastChannel) { if (!Menu) @@ -779,6 +813,7 @@ int main(int argc, char *argv[]) } // Disk housekeeping: RemoveDeletedRecordings(); + cSchedules::Cleanup(); // Plugins housekeeping: PluginManager.Housekeeping(); } @@ -799,6 +834,7 @@ int main(int argc, char *argv[]) Setup.Save(); cDevice::Shutdown(); PluginManager.Shutdown(true); + ReportEpgBugFixStats(); if (WatchdogTimeout > 0) dsyslog("max. latency time %d seconds", MaxLatencyTime); isyslog("exiting"); |