Importing SDLPerl 2.2
cthulhuology [Sun, 12 Jul 2009 10:21:55 +0000 (06:21 -0400)]
138 files changed:
BUGS [new file with mode: 0644]
Build [new file with mode: 0755]
Build.PL [new file with mode: 0644]
CHANGELOG [new file with mode: 0644]
COPYING [new file with mode: 0644]
MANIFEST [new file with mode: 0644]
META.yml [new file with mode: 0644]
MacOSX/Info.plist [new file with mode: 0644]
MacOSX/SDL Perl.icns [new file with mode: 0644]
MacOSX/launcher.h [new file with mode: 0644]
MacOSX/launcher.m [new file with mode: 0644]
README [new file with mode: 0644]
TODO [new file with mode: 0644]
lib/SDL.pm [new file with mode: 0644]
lib/SDL/App.pm [new file with mode: 0644]
lib/SDL/Cdrom.pm [new file with mode: 0644]
lib/SDL/Color.pm [new file with mode: 0644]
lib/SDL/Config.pm [new file with mode: 0644]
lib/SDL/Constants.pm [new file with mode: 0644]
lib/SDL/Cursor.pm [new file with mode: 0644]
lib/SDL/Event.pm [new file with mode: 0644]
lib/SDL/Font.pm [new file with mode: 0644]
lib/SDL/MPEG.pm [new file with mode: 0644]
lib/SDL/Mixer.pm [new file with mode: 0644]
lib/SDL/Music.pm [new file with mode: 0644]
lib/SDL/OpenGL.pm [new file with mode: 0644]
lib/SDL/OpenGL/Constants.pm [new file with mode: 0644]
lib/SDL/Palette.pm [new file with mode: 0644]
lib/SDL/Rect.pm [new file with mode: 0644]
lib/SDL/SFont.pm [new file with mode: 0644]
lib/SDL/Sound.pm [new file with mode: 0644]
lib/SDL/Surface.pm [new file with mode: 0644]
lib/SDL/TTFont.pm [new file with mode: 0644]
lib/SDL/Timer.pm [new file with mode: 0644]
lib/SDL/Tool/Font.pm [new file with mode: 0644]
lib/SDL/Tool/Graphic.pm [new file with mode: 0644]
lib/SDL/Tutorial.pm [new file with mode: 0644]
lib/SDL/Tutorial/.svn/README.txt [new file with mode: 0644]
lib/SDL/Tutorial/.svn/dir-wcprops [new file with mode: 0644]
lib/SDL/Tutorial/.svn/empty-file [new file with mode: 0644]
lib/SDL/Tutorial/.svn/entries [new file with mode: 0644]
lib/SDL/Tutorial/.svn/format [new file with mode: 0644]
lib/SDL/Tutorial/.svn/prop-base/Animation.pm.svn-base [new file with mode: 0644]
lib/SDL/Tutorial/.svn/prop-base/Drawing.pm.svn-base [new file with mode: 0644]
lib/SDL/Tutorial/.svn/prop-base/Images.pm.svn-base [new file with mode: 0644]
lib/SDL/Tutorial/.svn/props/Animation.pm.svn-work [new file with mode: 0644]
lib/SDL/Tutorial/.svn/props/Drawing.pm.svn-work [new file with mode: 0644]
lib/SDL/Tutorial/.svn/props/Images.pm.svn-work [new file with mode: 0644]
lib/SDL/Tutorial/.svn/text-base/Animation.pm.svn-base [new file with mode: 0644]
lib/SDL/Tutorial/.svn/text-base/Drawing.pm.svn-base [new file with mode: 0644]
lib/SDL/Tutorial/.svn/text-base/Images.pm.svn-base [new file with mode: 0644]
lib/SDL/Tutorial/.svn/wcprops/Animation.pm.svn-work [new file with mode: 0644]
lib/SDL/Tutorial/.svn/wcprops/Drawing.pm.svn-work [new file with mode: 0644]
lib/SDL/Tutorial/.svn/wcprops/Images.pm.svn-work [new file with mode: 0644]
lib/SDL/Tutorial/Animation.pm [new file with mode: 0644]
lib/SDL/Tutorial/Drawing.pm [new file with mode: 0644]
lib/SDL/Tutorial/Images.pm [new file with mode: 0644]
lib/SDL/Video.pm [new file with mode: 0644]
lib/SDL_perl.pm [new file with mode: 0644]
logo/sdl_perl_logo_large.png [new file with mode: 0644]
logo/sdl_perl_logo_small.png [new file with mode: 0644]
make/lib/SDL/Build.pm [new file with mode: 0644]
make/lib/SDL/Build/Cygwin.pm [new file with mode: 0644]
make/lib/SDL/Build/Darwin.pm [new file with mode: 0644]
make/lib/SDL/Build/Freebsd.pm [new file with mode: 0644]
make/lib/SDL/Build/Linux.pm [new file with mode: 0644]
make/lib/SDL/Build/MSWin32.pm [new file with mode: 0644]
make/lib/SDL/Build/Netbsd.pm [new file with mode: 0644]
src/OpenGL.xs [new file with mode: 0644]
src/SDL.xs [new file with mode: 0644]
src/SDL/OpenGL.bs [new file with mode: 0644]
src/SDL/OpenGL.c [new file with mode: 0644]
src/SDL/OpenGL.o [new file with mode: 0644]
src/SDL/OpenGL.xs [new file with mode: 0644]
src/SDL/SFont.bs [new file with mode: 0644]
src/SDL/SFont.c [new file with mode: 0644]
src/SDL/SFont.o [new file with mode: 0644]
src/SDL/SFont.xs [new file with mode: 0644]
src/SDL_perl.bs [new file with mode: 0644]
src/SDL_perl.c [new file with mode: 0644]
src/SDL_perl.o [new file with mode: 0644]
src/SDL_perl.xs [new file with mode: 0644]
src/SFont.h [new file with mode: 0644]
src/SFont.xs [new file with mode: 0644]
src/defines.h [new file with mode: 0644]
src/support/darwin_support.h [new file with mode: 0644]
src/support/darwin_support.m [new file with mode: 0644]
src/support/win32.c [new file with mode: 0644]
t/apppm.t [new file with mode: 0644]
t/cdrompm.t [new file with mode: 0644]
t/colorpm.t [new file with mode: 0644]
t/cursorpm.t [new file with mode: 0644]
t/eventpm.t [new file with mode: 0644]
t/fontpm.t [new file with mode: 0644]
t/mixerpm.t [new file with mode: 0644]
t/mpegpm.t [new file with mode: 0644]
t/musicpm.t [new file with mode: 0644]
t/opengl.t [new file with mode: 0644]
t/palettepm.t [new file with mode: 0644]
t/rectpm.t [new file with mode: 0644]
t/sdlpm.t [new file with mode: 0644]
t/soundpm.t [new file with mode: 0644]
t/surfacepm.t [new file with mode: 0644]
t/timerpm.t [new file with mode: 0644]
t/toolfontpm.t [new file with mode: 0644]
t/toolgraphicpm.t [new file with mode: 0644]
t/ttfontpm.t [new file with mode: 0644]
t/videopm.t [new file with mode: 0644]
test/64encode.pl [new file with mode: 0644]
test/OpenGL/.DS_Store [new file with mode: 0644]
test/OpenGL/README [new file with mode: 0644]
test/OpenGL/test1.sdlpl [new file with mode: 0644]
test/OpenGL/test2.sdlpl [new file with mode: 0644]
test/OpenGL/test3.sdlpl [new file with mode: 0644]
test/OpenGL/test4.sdlpl [new file with mode: 0644]
test/OpenGL/test5.sdlpl [new file with mode: 0644]
test/OpenGL/tutorial/.DS_Store [new file with mode: 0644]
test/OpenGL/tutorial/lesson02.sdlpl [new file with mode: 0644]
test/OpenGL/tutorial/lesson03.sdlpl [new file with mode: 0644]
test/OpenGL/tutorial/lesson04.sdlpl [new file with mode: 0644]
test/OpenGL/tutorial/lesson05.sdlpl [new file with mode: 0644]
test/OpenGL/tutorial/lesson06.sdlpl [new file with mode: 0644]
test/OpenGL/tutorial/lesson07.sdlpl [new file with mode: 0644]
test/OpenGL/tutorial/lesson08.sdlpl [new file with mode: 0644]
test/README [new file with mode: 0644]
test/checkkeys.sdlpl [new file with mode: 0644]
test/graywin.sdlpl [new file with mode: 0644]
test/loopwave.sdlpl [new file with mode: 0644]
test/testcolor.sdlpl [new file with mode: 0644]
test/testfonttool.sdlpl [new file with mode: 0644]
test/testgfxprim.sdlpl [new file with mode: 0644]
test/testgfxroto.sdlpl [new file with mode: 0644]
test/testgraphictool.sdlpl [new file with mode: 0644]
test/testjoystick.sdlpl [new file with mode: 0644]
test/testmenu.sdlpl [new file with mode: 0644]
test/testsprite.sdlpl [new file with mode: 0644]
test/testtimer.sdlpl [new file with mode: 0644]
typemap [new file with mode: 0644]

diff --git a/BUGS b/BUGS
new file mode 100644 (file)
index 0000000..3c3d8d3
--- /dev/null
+++ b/BUGS
@@ -0,0 +1,12 @@
+BUGS and Outstanding Issues 
+
+
+Using SDL::TTFont::width function with UTF-8 encoded strings returns 
+the width of the characters that make up the UTF-8 format and not what 
+they represent.  The function for this appears to exist in SDL.xs: 
+
+AV* TTFSizeUTF8 ( font, text )
+
+However, this function crashes immediately when called with a valid 
+font and [utf-8 encoded] string.
+
diff --git a/Build b/Build
new file mode 100755 (executable)
index 0000000..343458c
--- /dev/null
+++ b/Build
@@ -0,0 +1,39 @@
+#! /usr/env/bin perl
+
+use strict;
+use Cwd;
+use File::Spec;
+
+BEGIN {
+  $^W = 1;  # Use warnings
+  my $curdir = File::Spec->canonpath( Cwd::cwd() );
+  my $is_same_dir = $^O eq 'MSWin32' ? (Win32::GetShortPathName($curdir) eq '/Users/dave/sdlperl')
+                                       : ($curdir eq '/Users/dave/sdlperl');
+  unless ($is_same_dir) {
+    die ('This script must be run from /Users/dave/sdlperl, not '.$curdir."\n".
+        "Please re-run the Build.PL script here.\n");
+  }
+  unshift @INC,
+    (
+     '/Users/dave/sdlperl/make/lib'
+    );
+}
+
+use SDL::Build;
+
+# Some platforms have problems setting $^X in shebang contexts, fix it up here
+$^X = Module::Build->find_perl_interpreter
+  unless File::Spec->file_name_is_absolute($^X);
+
+if (-e 'Build.PL' and not SDL::Build->up_to_date("Build.PL", $0)) {
+   warn "Warning: Build.PL has been altered.  You may need to run 'perl Build.PL' again.\n";
+}
+
+# This should have just enough arguments to be able to bootstrap the rest.
+my $build = SDL::Build->resume (
+  properties => {
+    config_dir => '/Users/dave/sdlperl/_build',
+  },
+);
+
+$build->dispatch;
diff --git a/Build.PL b/Build.PL
new file mode 100644 (file)
index 0000000..b5ba309
--- /dev/null
+++ b/Build.PL
@@ -0,0 +1,195 @@
+#!/usr/bin/env perl
+#
+# Build.PL
+#
+# Copyright (C) 2005 David J. Goehrig <dgoehrig@cpan.org>
+#
+# ------------------------------------------------------------------------------
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+# 
+# This library 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
+# Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+#
+# ------------------------------------------------------------------------------
+#
+# Please feel free to send questions, suggestions or improvements to:
+#
+#      David J. Goehrig
+#      dgoehrig@cpan.org
+#
+
+
+use strict;
+
+use lib  'make/lib';
+
+use SDL::Build;
+use YAML;
+
+my $sdl_compile_flags = `sdl-config --cflags`;
+my $sdl_link_flags    = `sdl-config --libs`;
+
+if ($? >> 8)
+{
+       die "SDL doesn't appear to be installed.\n" .
+               "Please check that sdl-config is in your path and try again.\n";
+}
+
+chomp( $sdl_compile_flags );
+chomp( $sdl_link_flags );
+
+# subsystem to build
+#      file
+#              location of source file => location of build file to get name right
+#      libraries
+#              name of shared library (soname)
+#                      preprocessor definition
+#                      name of header file
+my %subsystems =
+(
+       SDL => {
+               file      => {
+                       from  => 'src/SDL.xs',
+                       to    => 'src/SDL_perl.xs',
+               },
+               libraries => [qw( SDL SDL_image SDL_mixer SDL_sound SDL_net SDL_ttf 
+                               SDL_gfx SDL_svg png jpeg smpeg )],
+       },
+       OpenGL => {
+               file      => {
+                       from => 'src/OpenGL.xs',
+                       to   => 'src/SDL/OpenGL.xs', 
+               },
+               libraries => [qw( SDL GL GLU )],
+       },
+       SFont => {
+               file    => {
+                       from => 'src/SFont.xs',
+                       to   => 'src/SDL/SFont.xs',
+               },
+               libraries => [qw( SDL SDL_image )],
+       },      
+);
+
+my %libraries = (
+       SDL         => {
+               define => 'HAVE_SDL', 
+               header => 'SDL.h',
+       },
+       SDL_image   => {
+               define => 'HAVE_SDL_IMAGE',   
+               header => 'SDL_image.h'
+       },
+       SDL_mixer   => {
+               define => 'HAVE_SDL_MIXER',   
+               header => 'SDL_mixer.h'
+       },
+       SDL_sound => {
+               define => 'HAVE_SDL_SOUND',
+               header => 'SDL_sound.h'
+       },
+       SDL_net     => {
+               define => 'HAVE_SDL_NET',     
+               header => 'SDL_net.h'
+       },
+       SDL_ttf     => {
+               define => 'HAVE_SDL_TTF',     
+               header => 'SDL_ttf.h'
+       },
+       SDL_gfx     => {
+               define => 'HAVE_SDL_GFX',     
+               header => 'SDL_gfxPrimitives.h'
+       },
+       SDL_svg => {
+               define => 'HAVE_SDL_SVG',
+               header => 'SDL_svg.h'
+       },
+       png         => {
+               define    => 'HAVE_PNG',
+               header    => 'png.h',
+       },
+       jpeg        => {        
+               define    => 'HAVE_JPEG',
+               header    => 'jpeglib.h',
+       },
+       smpeg       => {
+               define    => 'HAVE_SMPEG',
+               header    => 'smpeg.h',
+       },
+       GL          => {
+               define => 'HAVE_GL',  
+               header => 'gl.h'
+       },
+       GLU         => {
+               define => 'HAVE_GLU', 
+               header => 'glu.h'
+       },
+);
+
+# need the platform-specific module to find include paths correctly
+# see build/lib/SDL/Build/*pm
+my $arch          = SDL::Build->get_arch( $^O );
+
+print "[Build.PL] arch $arch\n";
+
+# see which subsystems can be built -- do we have headers for them?
+my $build_systems = $arch->find_subsystems( \%subsystems, \%libraries );
+
+# now write SDL::Config
+$arch->write_sdl_config( $build_systems );
+
+# and fetch all of the information needed to compile
+my $defines    = $arch->build_defines( \%libraries, $build_systems );
+my $includes   = $arch->build_includes( \%libraries, $build_systems );
+my $links      = $arch->build_links( \%libraries, $build_systems );
+my $c_sources  = $arch->build_c_sources( \%libraries, $build_systems );
+my $c_source   = $arch->build_c_source( \%libraries, $build_systems );
+my $install_base = $arch->build_install_base( \%libraries, $build_systems );
+
+# mangle the compilable files into a format Module::Build can understand
+my %xs = map { $subsystems{$_}{file}{from} => $subsystems{$_}{file}{to} }
+            keys %subsystems;
+
+my $build   = SDL::Build->new(
+       dist_name            => 'SDL_Perl', 
+       license              => 'lgpl',
+       dist_version_from    => 'lib/SDL.pm',
+       build_requires       =>
+       {
+               'Test::Simple' => '0.47',
+               'Module::Build' => '0.22',
+       },
+       build_recommends     =>
+       {
+               'Pod::ToDemo'  => '0.20',
+       },
+       c_source => $c_source,
+       c_sources => $c_sources,
+       xs_files             => \%xs,
+       dist_author          => 'David J. Goehrig <DGOEHRIG@cpan.org>',
+       install_base => $install_base
+);
+
+# and here's where the real (and ugly) magic works... see SDL::Build
+$build->set_flags(
+       \%subsystems,
+       $build_systems,
+       $defines,
+       $includes,
+       $links,
+       $sdl_compile_flags,
+       $sdl_link_flags,
+);
+
+# now we're ready to go!
+$build->create_build_script();
diff --git a/CHANGELOG b/CHANGELOG
new file mode 100644 (file)
index 0000000..95d64ed
--- /dev/null
+++ b/CHANGELOG
@@ -0,0 +1,489 @@
+Revision history for Perl extension SDL_perl.
+
+* Jul 8 2006   David J. Goehrig <dgoehrig@cpan.org>
+       - finished embedding data in example scripts
+       - fixed Mac OS X file associations
+
+* Mar 15 2006  David J. Goehrig <dgoehrig@cpan.org>
+       - fixed OpenGL examples to work under MacOS X using the SDL Perl.app bundle
+       
+* Oct 12 2005  David J. Goehrig <dgoehrig@cpan.org>
+       - Fixed bug where SDL::App frees underlying Surface via DESTROY
+       - Added SDL_svg support
+       - cleaned up SDL_gfx support in SDL.xs
+       - cleaned up smpeg support in SDL.xs
+       - Added more SDL_sound support
+       - Added basic SDL_RWops support (TODO - perl callback for user defined)
+
+* Oct 6 2005   David J. Goehrig <dgoehrig@cpan.org>
+       - Changed constructors to die upon invalid initialization
+
+* Oct 5 2005   David J. Goehrig <dgoehrig@cpan.org>
+       - Updated the copyright notices as per the LGPL guidelines
+
+* Oct 4 2005   David J. Goehrig <dgoehrig@cpan.org>
+       - Patched Cygwin.pm
+       - Fixed SDL::Rect documentation
+       - Fixed Freebsd build module package designation
+       - Fixed compile and link argument splitting in make/lib/Build.pm
+       - Added Module::Build to MEAT.yml
+
+* Sep 23 2004  David J. Goehrig <dgoehrig@cpan.org>
+       - added SDL::Config tests for SDL_gfx support to test/testgfxroto.pl
+               test/testgfxprim.pl and SDL::Tool::Graphic.pm
+       - removed exists test form SDL::Config::has()
+       - added SDL::PushEvent
+       - added SDL::SetEventType
+       - renamed SDL::OpenGL::glReadPixel(s)
+       - added error message for SDL::OpenGL::glLightModel
+       - cleaned up some formatting issues in OpenGL.xs
+       - fixed bug in SDL::Cdrom (referencing a scalar as a hashref) 
+       - added some more documentation to SDL::Color
+       - added SDL::Event::push (Andy Bakun)
+       - fixed documentation and usage of SDL::Event::set
+       - added SDL::Event::type([type]) setting parameter
+       - updated Pod::ToDemo recommends in Build.PL
+       - added chromatic's OpenGL version checks
+       - added GL_ALL_CLIENT_ATTRIB_BITS (in addition to GL_CLIENT_ATTRIB_BITS)
+       - added chromatic's SDL::Build::Cygwin.pm and SDL::Build::Win32.pm
+       - applied chromatic's patches to SDL::Tutorial, etc. for updated Pod::ToDemo
+
+
+* Sep 21 2004  David J. Goehrig <dgoehrig@cpan.org>
+       - added thread check to SDL::Constants.pm (prevent unsafe SelfLoader)
+       - applied Andy Bakun <sdlperl@thwartedefforts.org>'s patches
+               to SDL::CreateRGBSurfaceFrom, SDL::SurfaceCopy, and
+               SDL::FreeSurface
+       - applied GLint* to typemap patch
+       - applied glRenderMode patch
+       - applied gluPickMatrix patch
+       - fixed SDL::Surface::blit typo bug
+       - applied glGet patch by Luke (enumerating them all!)
+       - fixed typo bug in make/lib/SDL/Build/Darwin.pm
+               
+
+* Feb 23 2004  David J. Goehrig <dgoehrig@cpan.org>
+       - fixed OpenGL exporting & bootstrapping
+       - added ifdefs in OpenGL for NURBS and GLUTesslator
+       - updated the test scripts to use SDL::Config 
+       - added OpenGL test
+       - modified SDL::Config->has to use grep instead
+       - fixed SDL::Cdrom::status
+       - added tests for SDL::Video and SDL::MPEG
+       - fixed gluPerspective in test1.pl & test2.pl
+       - moved SDL::OpenGL::Cube code into test2.pl
+       - released SDL_Perl-2.1.0
+
+* Feb 7 2004   David J. Goehrig <dgoehrig@cpan.org>
+       - added more SMPEG support
+       - added SDL::Video.pm and SDL::MPEG
+
+* Feb 6 2004   David J. Goehrig <dgoehrig@cpan.org>
+       - removed old build stuff
+       - added SDL::GetAppState
+       - added SDL::GetMouseState and SDL::GetRelativeMouseState
+       - added SDL Perl logo files
+       - Finalized 2.0.5 release
+
+* Feb 6 2004   chromatic
+       - added SDL::Tutorial
+       - added SDL::Tutorial::Animation
+       - added SDL::Tutorial::Drawing
+       - added SDL::Tutorial::Images
+
+* Feb 5 2004   David J. Goehrig <dgoehrig@cpan.org>
+       - port chromatic's Module::Build changes to 2.0.4
+       - moved SDL_TEXTWIDTH to SDL.pm (where EXPORTS BELONG in SDL.pm)
+       - applied chromatic's test directory change to testfonttool.pl
+       - fixed near/far in OpenGL.xs
+       - fixed checkkeys.pl to work with new event structure
+       - fixed testjoystick.pl to use new constants
+       - fixed USE_THREADS issue in build system
+       - fixed typo-bugs in SDL::Tool::Graphic.pm
+       - Updated MANIFEST
+       - fixed SFont support added SDL::SFont.pm
+       - removed SDL::Mixer and SDL::Event constants checks, no export
+
+* Dec 21 2003  chromatic
+       - added glDeleteLists
+       - added glReadPixels
+       - added glReadPixel
+
+* Sept 2 2003  David J. Goehrig <dave@sdlperl.org>
+       - fixed SDL::Music and SDL::Sound usage in SDL::Mixer
+
+* Aug 28 2003  Stephane Desneux <sdx@desneux.com>
+       - added SDL_VIDEOEXPOSE constant in SDL::Constants
+
+* Aug 26 2003  Stephane Desneux <sdx@desneux.com>
+       - modified Makefile.linux to remove debug unless $ENV{DEBUG} is defined
+       - added scripts/GL/gl.h header (OpenGL 1.4 header from Linux NVidia driver)
+       - modified gl_const.pl to generate SDL::OpenGL::Constants.pm using scripts/GL/gl.h
+         OpenGL constants now uses Exporter and SelfLoader
+       - modified sdl_const.pl to generate SDL::Constants 
+         SDL constants now uses Exporter and SelfLoader
+       - modified SDL.pm to export constants from SDL::Constants
+       - modified SDL/OpenGL.pm to export constants from SDL::OpenGL::Constants 
+       - changed all function names in OpenGL.xs (xxx replaced by glxxx or gluxxx)
+         changed export in SDL/OpenGL.pm accordingly
+       - removed warning in SDL::Surface::new()
+
+* Aug 21 2003  David J. Goehrig <dave@sdlperl.org>
+       - applied Thomas Tongue's MacOS X support patches
+
+* Aug 20 2003  David J. Goehrig <dave@sdlperl.org>
+       - fixed SDL::Event bug
+
+* Aug 17 2003  David J. Goehrig <dave@sdlperl.org>
+       - applied Tels' call list patches
+       - fixed some general boneheadedness with use strict
+       - got tests really working
+       - applied Russell's SDL::Tool::Graphic::grayScale patch
+       - added glLightModel
+
+* Aug 16 2003  David J. Goehrig <dave@sdlperl.org>
+       - applied morgoth.666's patch for glGetdv & others
+       - released 2.0 last week :)
+
+* May 23 2003  David J. Goehrig <dave@sdlperl.org>
+       - applied Ryan Hanlon's patch for SDL::TTFont::width
+
+* May 22 2003  David J. Goehrig <dave@sdlperl.org>
+       - fixed typemap
+       - changed SDL::Cdrom to use scalar refs
+       - changed SDL::Console to use scalar refs
+       - changed SDL::Event to use scalar refs
+       - changed SDL::Cursor to use scalar refs
+       - changed SDL::Font to use scalar refs
+       - changed SDL::Music to use scalar refs
+       - changed SDL::Palette to use scalar refs
+       - changed SDL::Sound to use scalar refs
+
+* May 20 2003  David J. Goehrig <dave@sdlperl.org>
+       - added more OpenGL constants
+       - added OpenGL name & Feedback functions
+       - ported documentation from the website to distro
+
+* Mar 13 2003  David J. Goehrig <dave@sdlperl.org>
+       - cleaned up OpenGL constants exportation
+       - fixed glColor alpha
+       - fixed all tests & the causes of failure
+       - fixed TTFont.pm color bug
+       - fixed SDL::Tool::Graphic
+
+* Mar 11 2003  David J. Goehrig <dave@sdlperl.org>
+       - changed USE_THREAD support because perl5.8 usually builds with it
+       - added SDL::Constants & SDL::OpenGL::Constants
+       - removed constant functions from XS code (going easier on the linker)
+       - changed version to SDL_perl-2.0-beta1 Way Too much is Broken release
+       - Moved Opt/* to regular & fixing as found broken
+       - 27% of tests now fail!
+
+* Feb 25 2003  David J. Goehrig <dave@sdlperl.org>
+       - resized the testmenu.pl script
+
+* Jan 6 2003   Wayne Keenan  <tripixuk@yahoo.co.uk>
+       - fixed testjoystick.pl
+
+* Jan 4 2003   David J. Goehrig <dave@sdlperl.org>
+       - Added test suite, Thanks Tels
+       - Added SDL::SurfaceCopy finally
+       - Added SDL::Surface::new -surface && -copy constructors
+       - Changed SDL::Tool::Graphic::* to return a new SDL::Surface object 
+       - Added SDL::Event::resize_w && SDL::Event::resize_h
+
+* Jan 3 2003   David J. Goehrig <dave@sdlperl.org>
+       - SDL_perl-1.20.0 release
+       - fixed default pitch value in SDL::Surface
+       - fixed test/OpenGL/tutorials/*, removed nasty -flags options
+
+* Jan 2 2003   David J. Goehrig <dave@sdlperl.org>
+       - Changed SDL::SurfacePixel to work as documented returns SDL_Color*
+       - Changed SDL::Surface::pixel to return SDL::Color object
+       - Changed SDL::SetColorKey to take SDL_Color*
+       - Changed SDL::Surface::set_color_key to take SDL_Color*,SDL::Color, && (x,y)
+       - Added test/testcolor.pl
+       - Fixed SDL::Opt::Surface::pixel to return SDL::Opt::Color objects
+       - Fixed test/testsprite.pl (must call display_format before set_color_key)
+       - removed use strict from test/testmenu.pl
+       - Added SDL::INIT_TIMER
+
+* Jan 1 2003   David J. Goehrig <dave@sdlperl.org>
+       - Added a lot of documentation stubs
+       - Added SDL_PREALLOC support
+       - Added SDL_VIDEORESIZE event type
+       - Moved SDL_* SDL_Surface flags EXPORT to SDL::Surface
+       - Added SDL::App::resize & -resizeable tag
+       - Updated README
+       - Added SDL::Opt::Surface, SDL::Opt::Rect, SDL::Opt::Color
+
+* Dec 30 2002  David J. Goehrig <dave@sdlperl.org>
+       - Cleaned SDL::App a little more
+       - Patch release SDL_perl-1.19.2
+
+* Dec 29 2002  Tels <http://www.bloodgate.com>
+       - Patched SDL::Font includes
+       - Optimized SDL::Rect
+
+* Dec 28 2002  Tels <http://www.bloodgate.com>
+       - Removed miscelaneous typos
+       - Rewrote utility function SDL::in
+
+* Dec 25 2002  Tels <http://www.bloodgate.com>
+       - Patched SDL::Timer documentation
+       - Patched SDL::Event documentation
+       - Patched SDL::Cdrom documentation
+       - Patched mail address in Readme
+
+* Dec 20 2002   Michael Lamertz <mike@perl-ronin.de>
+        - Fixed wrong spelling of XS call to SDL::App::grab_input function
+
+* Oct 14 2002  David J. Goehrig <dave@sdlperl.org>
+       - Altered usage message printing behavior for Guillaume
+       - Added Guillaume Cottenceau's <gc@mandrakesoft.com>
+       64 bit support patch.
+       - Patch release SDL_perl-1.19.1
+
+* Oct 13 2002  David J. Goehrig <dave@sdlperl.org>
+       - Added ConvertRGB and ConvertRGBA functions, useful
+       for creating OpenGL textures from arbitrary images.
+       - Updated documentation for SDL::Cursor
+
+* Oct 11 2002  David J. Goehrig <dave@sdlperl.org>
+       - Added library disable configure options for linux
+       - Released SDL_perl-1.19.0
+
+* Sept 28 2002 David J. Goehrig <dave@sdlperl.org>
+       - Fixed some prototypes (OpenGL happier on Debian)
+
+* Sept 5 2002  David J. Goehrig <dave@sdlperl.org>
+       - Optimizaiton in SDL::App::loop, 
+       now syncs app only if action called
+       - Added test/testmenu.pl (precursor to a menu class)
+
+* Sept 4 2002  Russell Valentine <russ_allegro@yahoo.com>
+       - Added SDL::GraphicTool and testgraphictool.pl
+
+* Aug 31 2002   David J. Goehrig <dave@sdlperl.org>
+       - Removed redundant variable in SDL::Mixer::fade_in_music
+       Thanks to Peter BARABAS <z0d@artifact.hu> for finding it
+
+* Aug 30 2002   David J. Goehrig <dave@sdlperl.org>
+       - Altered examples to use 16 bit color
+       - Fixed OpenGL/tutorial gluPerspective bugs
+
+* Jun 14 2002  David J. Goehrig <dave@sdlperl.org>
+       - Finished color table and convolution support
+       - Added more GLUtesselator support
+
+* Jun 10 2002  David J. Goehrig <dave@sdlperl.org>
+       - Added configure script, gnuish build environemnt
+
+* Jun 8 2002   David J. Goehrig <dave@sdlperl.org>
+       - Applied Wayne Keenan's win32 build patches
+
+* Jun 5 2002   David J. Goehrig <dave@sdlperl.org>
+       - Simply defines GL_ALL_CLIENT_ATTRIB_BITS 0xffffffff
+       - SDL::TTFont added font metric query methods
+
+* Jun  4 2002  David J. Goehrig <dave@sdlperl.org>
+       - Fixed GL_ALL_CLIENT_BITS Mesa bug again... 
+       It appears to have disappeared after 1.17.2,
+       Thanks Seemant Kulleen & Chris Moeller for
+       pointing it out.
+
+* May 28 2002  David J. Goehrig <dave@sdlperl.org>
+       - Added tutorials 7 & 8 to test/OpenGL/tutorial
+
+* May 27 2002  David J. Goehrig <dave@sdlperl.org>
+       - Fixed SDL::OpenGL::TexCoordPointer
+
+* May 26 2002  David J. Goehrig <dave@sdlperl.org>
+       - SDL_perl-1.18
+
+* May 25 2002  David J. Goehrig <dave@sdlperl.org>
+       - Fixed include paths under linux
+       - Added SDL::Shell.pm and test/testshell.pl
+
+* May 24 2002  David J. Goehrig <dave@sdlperl.org>
+       - Fixed more OpenGL GLU tesselator code
+       - Added HAVE_SDL_MIXER around callbacks
+
+* May 23 2002  Benedikt Meurer <bmeurer@fwdn.de>
+       - Added FreeBSD support
+
+* May 21 2002  David J. Goehrig <dave@sdlperl.org>
+       - Fixed typo in SDL::App:iconify
+
+* May 3 2002   David J. Goehrig <dave@sdlperl.org>
+       - Added still more OpenGL support (errors and textures)
+       - Ported old OpenGL tutorials 2-6
+       - Fixed more bugs, improved SDL::SurfacePixels
+       - Added support for glu* and GLU_* exportation
+       - Added OpenGLU Nurbs support
+       - Added Nurbs example test/OpenGL/test5.pl
+       - Added more OpenGL projection and color code
+
+* May 1 2002   David J. Goehrig <dave@sdlperl.org>
+       - Fixed -Wall (added prototypes, fixed typos, etc)
+       - Improved Makefile, added GLU version detection
+       - Added OpenGL 1.2 dependent feature detection
+       - Added one and two dimension evaluators for OpenGL
+       - Added OpenGL test3.pl and test4.pl
+
+* Apr 30 2002  Wayne Keenan <wayne@metaverse.fsnet.co.uk>
+       - updated Makefile.win32
+
+* Apr 29 2002  Guillaume Cottenceau <gc@mandrakesoft.com>
+       - updated Makefile.linux
+
+* Apr 27 2002  David J. Goehrig <dave@sdlperl.org>
+       - SDL_perl-1.17 release made
+       - updated MANIFEST, etc.
+
+* Apr 26 2002  David J. Goehrig <dave@sdlperl.org>
+       - Added more OpenGL support 
+
+* Apr 23 2002  David J. Goehrig <dave@sdlperl.org>
+       - fixed SFont and SDL_Console support
+       - Added SDL::FontTool
+       - Added test/testfonttool.pl 
+
+* Apr 19 2002  David J. Goehrig <dave@sdlperl.org>
+       - Added proper SDL_mixer callback support
+       - Broke out linux makefile 
+       - Begun OpenGL support
+       - fixed test/testgfxprim.pl screen update bug
+       - fixed test/testgfxroto.pl alpha blits 
+       - Added test/logo.png
+
+* Apr 16 2002  Wayne Keenan <wayne@metaverse.fsnet.co.uk>
+       - Added SDL_Console support
+       - Added test/testconsole.pl
+       - Added SDL_gfx support
+       - Added test/testgfxroto.pl and test/testgfxprim.pl
+       - Updated Makefile
+
+* Apr 11 2002  David J. Goehrig <dave@sdlperl.org>
+       - Fixed SDL::ColorB typo
+       - Altered SDL::FillRect and SDL::Pixel to use SDL_Color* sources
+       - Documented SDL::Surface, SDL::Color
+       - Added automagic Surface, Color, and Rect support throughout OO layer
+       - Fixed testsprite.pl, graywin.pl to use above classes
+       - Brokeout Win32 Makefile.PL 
+       - Fixed SMPEG a little bit 
+
+* Apr 11 2002  Wayne Keenan <wayne@metaverse.fsnet.co.uk>
+       - Added SMPEG support
+       - Added test/testsprite.pl
+
+* Apr 10 2002  Wayne Keenan <wayne@metaverse.fsnet.co.uk>
+       - Added Win32 threading support in callbacks
+       - Added SDL_GetKeyState
+
+* Apr 8 2002   Wayne Keenan <wayne@metaverse.fsnet.co.uk>
+       - Added joystick hat constants
+       - Added joystick hat constants to test/testjoystick.pl
+
+* Apr 5 2002   David J. Goehrig <dave@sdlperl.org>
+       - Fixed SDL_perl.spec according to most of Guillaume's suggestions
+       - Expanded the build_rpms script to upload to sdlperl.org
+       - Added SDL::Timer.pm for timer objects
+       - Added test/testtimer.pl 
+
+* Apr 4 2002   David J. Goehrig <dave@sdlperl.org>
+       - Added SDL_perl.spec for RPM/SRPM builds
+       - Fixed typo in SDL_perl.xs
+
+* Apr 4 2002   Wayne Keenan  <wayne@metaverse.fsnet.co.uk>
+       - Fixed Makefile.PL for Win32 builds
+
+* Apr 4 2002   Russell Valentine <russ_allegro@yahoo.com>
+       - Added test/testjoystick.pl
+
+* Apr 3 2002   David J. Goehrig <dave@sdlperl.org>
+       - Fixed SDL::TTFont support
+       - Fixed SDL::Color support
+       - Applied Wayne's changes for Win32 support
+       - Moved XS code to SDL_perl.xs
+       - Created SDL_perl.pm
+       - Altered SDL.pm to use SDL_perl.pm
+
+* Apr 1 2002   David J. Goehrig <dave@sdlperl.org>
+       - Added SDL::Color
+       - Added SDL::TTFont
+       - Added SDL::App::loop
+       - More Documentation
+
+* Mar 31 2002  David J. Goehrig <dave@sdlperl.org>
+       - Upgraded SFont to version 1.5 <http://www.linux-games.com/sfont>
+       - Removed old examples and began porting SDL test programs to perl
+       - Updated key state modifier code
+       - Added audio processing callbacks and driver interrogation
+
+* Mar 14 2002  David J. Goehrig <dave@sdlperl.org>
+
+       - Added YUV Overlay support
+       - Added more WM support (toggle fullscreen,grab input,iconify window)
+       - Added Resize Event support
+       - Added Joystick Events support
+       - Added audio status query support
+       - Removed TrackListing  
+
+* Mar  9 2002  David J. Goehrig <dave@sdlperl.org>
+
+       - Generated sdlpl compatability layer ( known to be buggy )
+       - Bug fixes in OO modules, frozen-bubble now runs under 1.14
+       - Added patches directory to contain fixes for other people's programs 
+       - Added some Set/GetClipRect support
+       - More Documentation 
+       - Began SDL_ttf support
+       - Began SDL_net support
+
+* Feb 28 2002  David J. Goehrig <dave@sdlperl.org>
+
+       - Fixed-up OO modules to use new API
+       - Added AddTimer and RemoveTimer Support
+       - Added Joystick Support
+       - Added full Init/Quit support for subsystems
+       - Began Documentation Rewrite
+       - Began 1.12 compatability layer
+
+* Feb 26 2002  David J. Goehrig <dave@sdlperl.org>
+
+       - Altered API / Simplified namespace 
+       - Removed SDL_Image, SDL_Mixer, and OpenGL dependencies
+       - Added extension autodetection to config process
+
+* Jan 28 2002  Guillaume Cottenceau <gc@mandrakesoft.com>
+
+       - Fixed a deallocation bug in Sound.pm 
+
+* Jan 22 2002  Guillaume Cottenceau <gc@mandrakesoft.com>
+
+       - Fixed a deallocation bug in Music.pm
+
+* Dec 18 2000  David J. Goehrig 
+
+       - Removed clipping fuctions 
+       - Updated Readme
+       - Moved more to sourceforge
+
+* Aug  5 2000  Wayne Keenan
+
+       - Open GL support
+       - OpenGL Glut like Application framework
+       - more video flags 
+       - creating Surface from pre-allocated memory 
+       - BMP screen dump
+       - added state dumpers as an debugging aid
+       - bug fixes
+
+* May 26 2000  David J. Goehrig
+
+       - Added SFont support.
+
+* May 22 2000  David J. Goehrig
+
+       - Finished the first release
+
diff --git a/COPYING b/COPYING
new file mode 100644 (file)
index 0000000..191a97f
--- /dev/null
+++ b/COPYING
@@ -0,0 +1,437 @@
+                 GNU LIBRARY GENERAL PUBLIC LICENSE
+                      Version 2, June 1991
+
+ Copyright (C) 1991 Free Software Foundation, Inc.
+                   59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+[This is the first released version of the library GPL.  It is
+ numbered 2 because it goes with version 2 of the ordinary GPL.]
+
+                           Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+Licenses are intended to guarantee your freedom to share and change
+free software--to make sure the software is free for all its users.
+
+  This license, the Library General Public License, applies to some
+specially designated Free Software Foundation software, and to any
+other libraries whose authors decide to use it.  You can use it for
+your libraries, 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 library, or if you modify it.
+
+  For example, if you distribute copies of the library, whether gratis
+or for a fee, you must give the recipients all the rights that we gave
+you.  You must make sure that they, too, receive or can get the source
+code.  If you link a program with the library, you must provide
+complete object files to the recipients so that they can relink them
+with the library, after making changes to the library and recompiling
+it.  And you must show them these terms so they know their rights.
+
+  Our method of protecting your rights has two steps: (1) copyright
+the library, and (2) offer you this license which gives you legal
+permission to copy, distribute and/or modify the library.
+
+  Also, for each distributor's protection, we want to make certain
+that everyone understands that there is no warranty for this free
+library.  If the library is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original
+version, so that any problems introduced by others will not reflect on
+the original authors' reputations.
+\f
+  Finally, any free program is threatened constantly by software
+patents.  We wish to avoid the danger that companies distributing free
+software will individually obtain patent licenses, thus in effect
+transforming the program into proprietary software.  To prevent this,
+we have made it clear that any patent must be licensed for everyone's
+free use or not licensed at all.
+
+  Most GNU software, including some libraries, is covered by the ordinary
+GNU General Public License, which was designed for utility programs.  This
+license, the GNU Library General Public License, applies to certain
+designated libraries.  This license is quite different from the ordinary
+one; be sure to read it in full, and don't assume that anything in it is
+the same as in the ordinary license.
+
+  The reason we have a separate public license for some libraries is that
+they blur the distinction we usually make between modifying or adding to a
+program and simply using it.  Linking a program with a library, without
+changing the library, is in some sense simply using the library, and is
+analogous to running a utility program or application program.  However, in
+a textual and legal sense, the linked executable is a combined work, a
+derivative of the original library, and the ordinary General Public License
+treats it as such.
+
+  Because of this blurred distinction, using the ordinary General
+Public License for libraries did not effectively promote software
+sharing, because most developers did not use the libraries.  We
+concluded that weaker conditions might promote sharing better.
+
+  However, unrestricted linking of non-free programs would deprive the
+users of those programs of all benefit from the free status of the
+libraries themselves.  This Library General Public License is intended to
+permit developers of non-free programs to use free libraries, while
+preserving your freedom as a user of such programs to change the free
+libraries that are incorporated in them.  (We have not seen how to achieve
+this as regards changes in header files, but we have achieved it as regards
+changes in the actual functions of the Library.)  The hope is that this
+will lead to faster development of free libraries.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.  Pay close attention to the difference between a
+"work based on the library" and a "work that uses the library".  The
+former contains code derived from the library, while the latter only
+works together with the library.
+
+  Note that it is possible for a library to be covered by the ordinary
+General Public License rather than by this special one.
+\f
+                 GNU LIBRARY GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License Agreement applies to any software library which
+contains a notice placed by the copyright holder or other authorized
+party saying it may be distributed under the terms of this Library
+General Public License (also called "this License").  Each licensee is
+addressed as "you".
+
+  A "library" means a collection of software functions and/or data
+prepared so as to be conveniently linked with application programs
+(which use some of those functions and data) to form executables.
+
+  The "Library", below, refers to any such software library or work
+which has been distributed under these terms.  A "work based on the
+Library" means either the Library or any derivative work under
+copyright law: that is to say, a work containing the Library or a
+portion of it, either verbatim or with modifications and/or translated
+straightforwardly into another language.  (Hereinafter, translation is
+included without limitation in the term "modification".)
+
+  "Source code" for a work means the preferred form of the work for
+making modifications to it.  For a library, 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 library.
+
+  Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running a program using the Library is not restricted, and output from
+such a program is covered only if its contents constitute a work based
+on the Library (independent of the use of the Library in a tool for
+writing it).  Whether that is true depends on what the Library does
+and what the program that uses the Library does.
+  
+  1. You may copy and distribute verbatim copies of the Library's
+complete 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 distribute a copy of this License along with the
+Library.
+
+  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.
+\f
+  2. You may modify your copy or copies of the Library or any portion
+of it, thus forming a work based on the Library, 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) The modified work must itself be a software library.
+
+    b) You must cause the files modified to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    c) You must cause the whole of the work to be licensed at no
+    charge to all third parties under the terms of this License.
+
+    d) If a facility in the modified Library refers to a function or a
+    table of data to be supplied by an application program that uses
+    the facility, other than as an argument passed when the facility
+    is invoked, then you must make a good faith effort to ensure that,
+    in the event an application does not supply such function or
+    table, the facility still operates, and performs whatever part of
+    its purpose remains meaningful.
+
+    (For example, a function in a library to compute square roots has
+    a purpose that is entirely well-defined independent of the
+    application.  Therefore, Subsection 2d requires that any
+    application-supplied function or table used by this function must
+    be optional: if the application does not supply it, the square
+    root function must still compute square roots.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Library,
+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 Library, 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 Library.
+
+In addition, mere aggregation of another work not based on the Library
+with the Library (or with a work based on the Library) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may opt to apply the terms of the ordinary GNU General Public
+License instead of this License to a given copy of the Library.  To do
+this, you must alter all the notices that refer to this License, so
+that they refer to the ordinary GNU General Public License, version 2,
+instead of to this License.  (If a newer version than version 2 of the
+ordinary GNU General Public License has appeared, then you can specify
+that version instead if you wish.)  Do not make any other change in
+these notices.
+\f
+  Once this change is made in a given copy, it is irreversible for
+that copy, so the ordinary GNU General Public License applies to all
+subsequent copies and derivative works made from that copy.
+
+  This option is useful when you wish to copy part of the code of
+the Library into a program that is not a library.
+
+  4. You may copy and distribute the Library (or a portion or
+derivative of it, under Section 2) in object code or executable form
+under the terms of Sections 1 and 2 above provided that you 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.
+
+  If distribution of 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 satisfies the requirement to
+distribute the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  5. A program that contains no derivative of any portion of the
+Library, but is designed to work with the Library by being compiled or
+linked with it, is called a "work that uses the Library".  Such a
+work, in isolation, is not a derivative work of the Library, and
+therefore falls outside the scope of this License.
+
+  However, linking a "work that uses the Library" with the Library
+creates an executable that is a derivative of the Library (because it
+contains portions of the Library), rather than a "work that uses the
+library".  The executable is therefore covered by this License.
+Section 6 states terms for distribution of such executables.
+
+  When a "work that uses the Library" uses material from a header file
+that is part of the Library, the object code for the work may be a
+derivative work of the Library even though the source code is not.
+Whether this is true is especially significant if the work can be
+linked without the Library, or if the work is itself a library.  The
+threshold for this to be true is not precisely defined by law.
+
+  If such an object file uses only numerical parameters, data
+structure layouts and accessors, and small macros and small inline
+functions (ten lines or less in length), then the use of the object
+file is unrestricted, regardless of whether it is legally a derivative
+work.  (Executables containing this object code plus portions of the
+Library will still fall under Section 6.)
+
+  Otherwise, if the work is a derivative of the Library, you may
+distribute the object code for the work under the terms of Section 6.
+Any executables containing that work also fall under Section 6,
+whether or not they are linked directly with the Library itself.
+\f
+  6. As an exception to the Sections above, you may also compile or
+link a "work that uses the Library" with the Library to produce a
+work containing portions of the Library, and distribute that work
+under terms of your choice, provided that the terms permit
+modification of the work for the customer's own use and reverse
+engineering for debugging such modifications.
+
+  You must give prominent notice with each copy of the work that the
+Library is used in it and that the Library and its use are covered by
+this License.  You must supply a copy of this License.  If the work
+during execution displays copyright notices, you must include the
+copyright notice for the Library among them, as well as a reference
+directing the user to the copy of this License.  Also, you must do one
+of these things:
+
+    a) Accompany the work with the complete corresponding
+    machine-readable source code for the Library including whatever
+    changes were used in the work (which must be distributed under
+    Sections 1 and 2 above); and, if the work is an executable linked
+    with the Library, with the complete machine-readable "work that
+    uses the Library", as object code and/or source code, so that the
+    user can modify the Library and then relink to produce a modified
+    executable containing the modified Library.  (It is understood
+    that the user who changes the contents of definitions files in the
+    Library will not necessarily be able to recompile the application
+    to use the modified definitions.)
+
+    b) Accompany the work with a written offer, valid for at
+    least three years, to give the same user the materials
+    specified in Subsection 6a, above, for a charge no more
+    than the cost of performing this distribution.
+
+    c) If distribution of the work is made by offering access to copy
+    from a designated place, offer equivalent access to copy the above
+    specified materials from the same place.
+
+    d) Verify that the user has already received a copy of these
+    materials or that you have already sent this user a copy.
+
+  For an executable, the required form of the "work that uses the
+Library" must include any data and utility programs needed for
+reproducing the executable from it.  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.
+
+  It may happen that this requirement contradicts the license
+restrictions of other proprietary libraries that do not normally
+accompany the operating system.  Such a contradiction means you cannot
+use both them and the Library together in an executable that you
+distribute.
+\f
+  7. You may place library facilities that are a work based on the
+Library side-by-side in a single library together with other library
+facilities not covered by this License, and distribute such a combined
+library, provided that the separate distribution of the work based on
+the Library and of the other library facilities is otherwise
+permitted, and provided that you do these two things:
+
+    a) Accompany the combined library with a copy of the same work
+    based on the Library, uncombined with any other library
+    facilities.  This must be distributed under the terms of the
+    Sections above.
+
+    b) Give prominent notice with the combined library of the fact
+    that part of it is a work based on the Library, and explaining
+    where to find the accompanying uncombined form of the same work.
+
+  8. You may not copy, modify, sublicense, link with, or distribute
+the Library except as expressly provided under this License.  Any
+attempt otherwise to copy, modify, sublicense, link with, or
+distribute the Library 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.
+
+  9. 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 Library or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Library (or any work based on the
+Library), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Library or works based on it.
+
+  10. Each time you redistribute the Library (or any work based on the
+Library), the recipient automatically receives a license from the
+original licensor to copy, distribute, link with or modify the Library
+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.
+\f
+  11. 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 Library at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Library 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 Library.
+
+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.
+
+  12. If the distribution and/or use of the Library is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Library 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.
+
+  13. The Free Software Foundation may publish revised and/or new
+versions of the Library 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 Library
+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 Library does not specify a
+license version number, you may choose any version ever published by
+the Free Software Foundation.
+\f
+  14. If you wish to incorporate parts of the Library into other free
+programs whose distribution conditions are incompatible with these,
+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
+
+  15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE LIBRARY "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
+LIBRARY IS WITH YOU.  SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. 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 LIBRARY 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
+LIBRARY (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 LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES.
+
+                    END OF TERMS AND CONDITIONS
diff --git a/MANIFEST b/MANIFEST
new file mode 100644 (file)
index 0000000..e2fec81
--- /dev/null
+++ b/MANIFEST
@@ -0,0 +1,114 @@
+BUGS
+Build.PL
+CHANGELOG
+COPYING
+lib/SDL/App.pm
+lib/SDL/Cdrom.pm
+lib/SDL/Color.pm
+lib/SDL/Constants.pm
+lib/SDL/Cursor.pm
+lib/SDL/Event.pm
+lib/SDL/Font.pm
+lib/SDL/Mixer.pm
+lib/SDL/MPEG.pm
+lib/SDL/Music.pm
+lib/SDL/OpenGL/Constants.pm
+lib/SDL/OpenGL.pm
+lib/SDL/Palette.pm
+lib/SDL_perl.pm
+lib/SDL.pm
+lib/SDL/Rect.pm
+lib/SDL/SFont.pm
+lib/SDL/Sound.pm
+lib/SDL/Surface.pm
+lib/SDL/Timer.pm
+lib/SDL/Tool/Font.pm
+lib/SDL/Tool/Graphic.pm
+lib/SDL/TTFont.pm
+lib/SDL/Tutorial/Animation.pm
+lib/SDL/Tutorial/Drawing.pm
+lib/SDL/Tutorial/Images.pm
+lib/SDL/Tutorial.pm
+lib/SDL/Video.pm
+logo/sdl_perl_logo_large.png
+logo/sdl_perl_logo_small.png
+make/lib/SDL/Build/Cygwin.pm
+make/lib/SDL/Build/Darwin.pm
+make/lib/SDL/Build/Freebsd.pm
+make/lib/SDL/Build/Linux.pm
+make/lib/SDL/Build/MSWin32.pm
+make/lib/SDL/Build/Netbsd.pm
+make/lib/SDL/Build.pm
+MANIFEST
+META.yml
+README
+src/defines.h
+src/OpenGL.xs
+src/SDL.xs
+src/SFont.h
+src/SFont.xs
+t/apppm.t
+t/cdrompm.t
+t/colorpm.t
+t/cursorpm.t
+t/eventpm.t
+t/fontpm.t
+t/mixerpm.t
+t/mpegpm.t
+t/musicpm.t
+t/opengl.t
+t/palettepm.t
+t/rectpm.t
+t/sdlpm.t
+t/soundpm.t
+t/surfacepm.t
+t/timerpm.t
+t/toolfontpm.t
+t/toolgraphicpm.t
+t/ttfontpm.t
+t/videopm.t
+test/checkkeys.pl
+test/data/24P_Arial_NeonYellow.png
+test/data/24P_Copperplate_Blue.png
+test/data/aircut3.ttf
+test/data/electrohar.ttf
+test/data/highlight.png
+test/data/icon.bmp
+test/data/LargeFont.bmp
+test/data/logo.png
+test/data/menu.png
+test/data/sample.wav
+test/graywin.pl
+test/loopwave.pl
+test/OpenGL/README
+test/OpenGL/test1.pl
+test/OpenGL/test2.pl
+test/OpenGL/test3.pl
+test/OpenGL/test4.pl
+test/OpenGL/test5.pl
+test/OpenGL/tutorial/Data/crate.png
+test/OpenGL/tutorial/Data/cube.bmp
+test/OpenGL/tutorial/Data/glass.bmp
+test/OpenGL/tutorial/Data/NeHe.png
+test/OpenGL/tutorial/Data/Star.bmp
+test/OpenGL/tutorial/Data/tim.jpg
+test/OpenGL/tutorial/Data/world.txt
+test/OpenGL/tutorial/lesson02.pl
+test/OpenGL/tutorial/lesson03.pl
+test/OpenGL/tutorial/lesson04.pl
+test/OpenGL/tutorial/lesson05.pl
+test/OpenGL/tutorial/lesson06.pl
+test/OpenGL/tutorial/lesson07.pl
+test/OpenGL/tutorial/lesson08.pl
+test/README
+test/testcolor.pl
+test/testfonttool.pl
+test/testgfxprim.pl
+test/testgfxroto.pl
+test/testgraphictool.pl
+test/testjoystick.pl
+test/testmenu.pl
+test/testsprite.pl
+test/testtimer.pl
+TODO
+typemap
diff --git a/META.yml b/META.yml
new file mode 100644 (file)
index 0000000..0e83a56
--- /dev/null
+++ b/META.yml
@@ -0,0 +1,73 @@
+---
+name: SDL_Perl
+version: 2.2.0
+author:
+  - David J. Goehrig <DGOEHRIG@cpan.org>
+abstract: Simple DirectMedia Layer for Perl
+license: lgpl
+build_requires:
+  Module::Build: 0.22
+  Test::Simple: 0.47
+provides:
+  SDL:
+    file: lib/SDL.pm
+    version: 2.2.0
+  SDL::App:
+    file: lib/SDL/App.pm
+  SDL::Cdrom:
+    file: lib/SDL/Cdrom.pm
+  SDL::Color:
+    file: lib/SDL/Color.pm
+  SDL::Constants:
+    file: lib/SDL/Constants.pm
+  SDL::Cursor:
+    file: lib/SDL/Cursor.pm
+  SDL::Event:
+    file: lib/SDL/Event.pm
+  SDL::Font:
+    file: lib/SDL/Font.pm
+  SDL::MPEG:
+    file: lib/SDL/MPEG.pm
+  SDL::Mixer:
+    file: lib/SDL/Mixer.pm
+  SDL::Music:
+    file: lib/SDL/Music.pm
+  SDL::OpenGL:
+    file: lib/SDL/OpenGL.pm
+  SDL::OpenGL::Constants:
+    file: lib/SDL/OpenGL/Constants.pm
+  SDL::Palette:
+    file: lib/SDL/Palette.pm
+  SDL::Rect:
+    file: lib/SDL/Rect.pm
+  SDL::SFont:
+    file: lib/SDL/SFont.pm
+  SDL::Sound:
+    file: lib/SDL/Sound.pm
+  SDL::Surface:
+    file: lib/SDL/Surface.pm
+  SDL::Timer:
+    file: lib/SDL/Timer.pm
+  SDL::Tool::Font:
+    file: lib/SDL/Tool/Font.pm
+  SDL::Tool::Graphic:
+    file: lib/SDL/Tool/Graphic.pm
+  SDL::Tutorial:
+    file: lib/SDL/Tutorial.pm
+  SDL::Tutorial::Animation:
+    file: lib/SDL/Tutorial/Animation.pm
+  SDL::Tutorial::Images:
+    file: lib/SDL/Tutorial/Images.pm
+  SDL::Tutorial:Drawing:
+    file: lib/SDL/Tutorial/Drawing.pm
+  SDL::Video:
+    file: lib/SDL/Video.pm
+  SDL:TTFont:
+    file: lib/SDL/TTFont.pm
+  SDL_perl:
+    file: lib/SDL_perl.pm
+  Walker:
+    file: lib/SDL/Tutorial/Images.pm
+  main:
+    file: lib/SDL/Tutorial/Images.pm
+generated_by: Module::Build version 0.2611
diff --git a/MacOSX/Info.plist b/MacOSX/Info.plist
new file mode 100644 (file)
index 0000000..2d4aa04
--- /dev/null
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+       <key>CFBundleDisplayName</key>
+       <string>SDL Perl</string>
+       <key>CFBundleDocumentTypes</key>
+       <array>
+               <dict>
+                       <key>CFBundleTypeExtensions</key>
+                       <array>
+                               <string>sdlpl</string>
+                       </array>
+                       <key>CFBundleTypeIconFile</key>
+                       <string>SDL Perl.icns</string>
+                       <key>CFBundleTypeName</key>
+                       <string>SDL Perl Script</string>
+                       <key>CFBundleTypeRole</key>
+                       <string>Shell</string>
+               </dict>
+       </array>
+       <key>CFBundleExecutable</key>
+       <string>SDL Perl</string>
+       <key>CFBundleGetInfoString</key>
+       <string>Multimedia for Perl</string>
+       <key>CFBundleIconFile</key>
+       <string>SDL Perl.icns</string>
+       <key>CFBundleIdentifier</key>
+       <string>org.perl.sdl</string>
+       <key>CFBundleName</key>
+       <string>SDL Perl</string>
+       <key>CFBundlePackageType</key>
+       <string>APPL</string>
+       <key>CFBundleShortVersionString</key>
+       <string>2.2.0</string>
+       <key>CFBundleVersion</key>
+       <string>2.2.0</string>
+       <key>CSBundleSignature</key>
+       <string>sdpl</string>
+       <key>LSEnvironment</key>
+       <dict/>
+       <key>LSHasLocalizedDisplayName</key>
+       <false/>
+       <key>NSAppleScriptEnabled</key>
+       <false/>
+       <key>NSHumanReadableCopyright</key>
+       <string>Copyright Â© 2000-2006, David J. Goehrig, All Rights Reserved.</string>
+       <key>NSMainNibFile</key>
+       <string></string>
+</dict>
+</plist>
diff --git a/MacOSX/SDL Perl.icns b/MacOSX/SDL Perl.icns
new file mode 100644 (file)
index 0000000..922d064
Binary files /dev/null and b/MacOSX/SDL Perl.icns differ
diff --git a/MacOSX/launcher.h b/MacOSX/launcher.h
new file mode 100644 (file)
index 0000000..92e9959
--- /dev/null
@@ -0,0 +1,12 @@
+// launcher.h
+
+@interface SDLPerlMain : NSObject
+- (void) launchPerl: (NSString*) script;
+- (void) applicationWillFinishLaunching: (NSNotification*) note;
+- (void) applicationDidFinishLaunching: (NSNotification*) note;
+- (void) setupWorkingDirectory: (BOOL) changep;
+@end
+
+@interface SDLPerlApplication : NSApplication
+- (void) terminate: (id) sender;
+@end
diff --git a/MacOSX/launcher.m b/MacOSX/launcher.m
new file mode 100644 (file)
index 0000000..749f664
--- /dev/null
@@ -0,0 +1,198 @@
+// lancher.m
+//
+// Copyright (C) 2006 David J. Goehrig <dgoehrig@cpan.org>
+// 
+//
+
+
+// Define _SDL_main_h to avoid using SDLMain.m
+
+#define _SDL_main_h
+#include <Foundation/Foundation.h>
+#include <AppKit/AppKit.h>
+#include <EXTERN.h>
+#include <perl.h>
+#include <SDL/SDL.h>
+#include "launcher.h"
+
+static SDLPerlMain* sdlplmain;
+static PerlInterpreter *my_perl = NULL; 
+char path[MAXPATHLEN];
+char libpath[MAXPATHLEN];
+char scriptfile[MAXPATHLEN];
+BOOL init_path;
+
+void xs_init (pTHX);
+EXTERN_C void boot_DynaLoader (pTHX_ CV* cv);
+EXTERN_C void
+xs_init(pTHX)
+{
+       char *file = __FILE__;
+       
+       sprintf(libpath,"%s/Contents/Resources/lib/%s",path,ARCHNAME);
+       fprintf(stderr,"LIBPATH: %s\n",libpath);
+
+       dXSUB_SYS;
+
+       /* DynaLoader is a special case */
+       newXS("DynaLoader::boot_DynaLoader", boot_DynaLoader, file);
+       SV* svpth = newSVpv(libpath,strlen(libpath));
+       AV* inc = get_av("INC",0);
+       if (inc && svpth) {
+               av_unshift(inc,1);
+               av_store(inc,0,svpth);
+       }
+}
+
+
+@implementation SDLPerlApplication
+- (void) terminate:(id)sender
+{
+       fprintf(stderr,"Quitting Event\n");
+       SDL_Event event;
+       event.type = SDL_QUIT;
+       SDL_PushEvent(&event);
+       [NSApp stop: nil];
+}
+@end
+
+@implementation SDLPerlMain
+- (void) setupWorkingDirectory:(BOOL)changep
+{
+       CFURLRef bpath;
+       fprintf(stderr,"Setup working directory ? %s", (changep ? "True" : "False"));
+       if (! changep) return;
+       bpath = CFBundleCopyBundleURL(CFBundleGetMainBundle());
+       if (CFURLGetFileSystemRepresentation(bpath,true,(UInt8*)path,MAXPATHLEN)) {
+               fprintf(stderr,"PATH: %s\n",path);
+               chdir((char*)path);
+       }
+}
+
+- (void) applicationWillFinishLaunching: (NSNotification *) note
+{
+       NSMenu* appleMenu;
+       NSMenuItem* item;
+       NSDictionary* dict;
+       NSString* appName;
+       NSString* title;
+       
+       fprintf(stderr, "Application will finish launching\n");
+
+       dict = (NSDictionary*)CFBundleGetInfoDictionary(CFBundleGetMainBundle());
+       appName = (dict ? [dict objectForKey: @"CFBundleName"] : [[NSProcessInfo processInfo] processName]);
+
+       appleMenu = [[NSMenu alloc] initWithTitle: @""];
+       
+       title = [@"About " stringByAppendingString: appName ];
+       [appleMenu addItemWithTitle: title action:@selector(orderFrontStandardAboutPanel:) keyEquivalent:@""];
+
+       [appleMenu addItem: [NSMenuItem separatorItem]];
+       
+       title = [@"Hide " stringByAppendingString: appName ];
+       [appleMenu addItemWithTitle: title action:@selector(hide:) keyEquivalent:@"h"];
+
+       title = @"Hide Others";
+       [appleMenu addItemWithTitle: title action:@selector(hideOtherApplications:) keyEquivalent:@"h"];
+
+       title = @"Show All";
+       [appleMenu addItemWithTitle: title action:@selector(unhideAllApplications:) keyEquivalent:@""];
+
+       [appleMenu addItem: [NSMenuItem separatorItem]];
+       
+       title = @"Quit";
+       [appleMenu addItemWithTitle: title action:@selector(terminate:) keyEquivalent:@"q"];
+
+       item = [[NSMenuItem alloc] initWithTitle:@"" action: nil keyEquivalent:@""];
+       [item setSubmenu: appleMenu];
+
+       [[NSApp mainMenu] addItem: item];
+       
+       [NSApp setMainMenu: appleMenu];
+       
+       fprintf(stderr,"Done with menu\n");
+}
+
+- (void) applicationDidFinishLaunching: (NSNotification *) note
+{
+       fprintf(stderr, "Application did  finish launching\n");
+
+//     fprintf(stderr, "SCRIPT: %s\n",scriptfile);
+//     NSString* scr = [[NSString alloc] initWithUTF8String: scriptfile];
+//     fprintf(stderr, "Setting directory: %s\n",init_path ? "true" : "false");
+//     [self setupWorkingDirectory: init_path];
+//     fprintf(stderr,"Launching perl script %s\n", scriptfile);
+//     [self launchPerl: scr ];
+       [NSApp terminate: self];        
+}
+
+- (void) launchPerl: (NSString*) script
+{
+       int count = 3;
+       char* embedding[] = { path, scriptfile , "0" } ;
+       unsigned buflen = [ script lengthOfBytesUsingEncoding: NSUTF8StringEncoding] + 1;
+       [script getCString:scriptfile maxLength: buflen encoding:NSUTF8StringEncoding];
+       fprintf(stderr,"Launching script: %s\n",scriptfile);
+       PERL_SYS_INIT3(&count,&embedding,NULL);
+       my_perl = perl_alloc();
+       perl_construct(my_perl);
+       perl_parse(my_perl,xs_init,count,embedding,NULL);
+       fprintf(stderr,"Running perl\n");
+       perl_run(my_perl);
+       fprintf(stderr,"Destructing  perl\n");
+       perl_destruct(my_perl);
+       fprintf(stderr,"Freeing perl\n");
+       perl_free(my_perl);
+       fprintf(stderr,"Quiting perl script: %s\n",scriptfile);
+       PERL_SYS_TERM();
+}
+
+- (BOOL) application: (NSApplication*) theApplication openFile: (NSString*) filename
+{
+       fprintf(stderr,"openFile %s\n", [filename UTF8String]);
+       fprintf(stderr, "Setting directory: %s\n",init_path ? "true" : "false");
+       [self setupWorkingDirectory: init_path];
+       fprintf(stderr,"launchgin perl\n");
+       [self launchPerl: filename];
+}
+
+@end
+
+int
+main( int argc, char** argv)
+{
+       int i;
+       NSAutoreleasePool* pool;
+
+       fprintf(stderr, "ARGC %d \n", argc);
+       for (i = 0; i < argc; ++i) {
+               fprintf(stderr,"ARGV[%d] %s\n",i,argv[i]);
+       }
+
+       init_path = YES;
+       memset(scriptfile,0,MAXPATHLEN);
+       if (argc >= 2) {
+               if ( argc == 2 ) {
+                       strncpy(scriptfile,argv[1],strlen(argv[1]));
+               } else {
+                       strncpy(scriptfile,argv[1],strlen(argv[2]));
+               }
+       }
+       fprintf(stderr, "[main] SCRIPT: %s\n",scriptfile);
+
+       pool = [[NSAutoreleasePool alloc] init];
+
+       [SDLPerlApplication sharedApplication];
+       [NSApp setMainMenu: [[NSMenu alloc] init]];
+       
+       sdlplmain = [[SDLPerlMain alloc] init];
+       [NSApp setDelegate: sdlplmain];
+
+       [NSApp run];
+       
+       fprintf(stderr,"Terminating NSApp\n");
+       [sdlplmain release];
+       [pool release];
+
+       return 0;
+}
diff --git a/README b/README
new file mode 100644 (file)
index 0000000..cd87cf5
--- /dev/null
+++ b/README
@@ -0,0 +1,72 @@
+README for SDL_Perl-2.2.0
+
+What's New in 2.2.0:
+
+SDL_Perl-2.2.0 adds support for a few new modules, fixes a few more
+bugs, and improves the error handling of the object layer.  Additional
+support for SDL_sound, SDL_svg, and SDL_vnc has been added.  In the 
+OO layer, all constructors now die when they fail to construct an object
+with a valid underlying datastructure pointer.
+
+Prerequisites:
+
+SDL Perl recommends installing the following libraries available
+from http://www.libsdl.org/ prior to installing:
+
+       SDL-1.2.8
+       smpeg-0.4.5
+       SDL_image-1.2.4
+       SDL_mixer-1.2.6
+       SDL_sound-1.0.1
+       SDL_net-1.2.5
+       SDL_gfx-2.0.13
+       SDL_ttf-2.0.7
+       SDL_svg-1.1.9
+       SDL_vnc-1.0.0
+
+Additionally the following Perl modules should be installed:
+
+       Module-Build-0.22
+       Test-Simple-0.62
+
+Installation:
+
+       perl Build.PL
+       ./Build
+       ./Build test
+       ./Build install
+
+The build process will use the new Module::Build facility
+to autodetect and build SDL Perl for your platform.  If
+the build fails please forward bugs to sdl-devel@perl.org.
+
+Documentation:
+
+Each module now includes its own documentation, and 
+is accessible through perldoc.  Additional tutorials,
+code, and tips can be found at the website:
+
+       http://sdl.perl.org
+
+Online documentation and tutorials are available through
+perldoc module.  
+
+Contributing:
+
+Anyone wishing to contribute modules, sprite engines, documentation,
+and anything else that others might find useful, please join
+the mailing list:
+
+       sdl-devel@perl.org
+
+This is a mailing list for those interested in SDLperl development,
+both as an applications developer, and as a core contributor.
+
+I am always more than happy to take patches, bug reports, and
+helpful suggestions.  It is feedback, both good and poor, that
+keeps projects like this going.
+
+Enjoy,
+
+David J. Goehrig <dgoehrig@cpan.org>
+
diff --git a/TODO b/TODO
new file mode 100644 (file)
index 0000000..b7f85ef
--- /dev/null
+++ b/TODO
@@ -0,0 +1,10 @@
+TODO for SDL_perl
+
+       o Add SDL_EventFilter support
+       o fix OpenGL build without glu.h
+       o fix openFile: support on Mac (SDL patch)
+       o add Windows application bundle support
+       o add Linux application bundle support
+       o add embedded media module
+
+
diff --git a/lib/SDL.pm b/lib/SDL.pm
new file mode 100644 (file)
index 0000000..8def190
--- /dev/null
@@ -0,0 +1,1035 @@
+#!/usr/bin/env perl
+#
+# SDL.pm
+#
+# Copyright (C) 2005 David J. Goehrig <dgoehrig@cpan.org>
+#
+# ------------------------------------------------------------------------------
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+# 
+# This library 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
+# Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+#
+# ------------------------------------------------------------------------------
+#
+# Please feel free to send questions, suggestions or improvements to:
+#
+#      David J. Goehrig
+#      dgoehrig@cpan.org
+#
+
+package SDL;
+
+use strict;
+use vars qw($VERSION @ISA @EXPORT @EXPORT_OK);
+
+require Exporter;
+require DynaLoader;
+
+use SDL_perl;
+use SDL::Constants;
+
+BEGIN {
+       @ISA = qw(Exporter DynaLoader);
+       @EXPORT = qw( in verify &NULL );
+};
+
+
+$VERSION = '2.2.1';
+
+print "$VERSION" if (defined($ARGV[0]) && ($ARGV[0] eq '--SDLperl'));
+
+$SDL::DEBUG=1;
+
+sub NULL {
+       return 0;
+}
+
+sub in {
+       my ($k,@t) = @_;
+       (scalar grep { defined $_ && $_ eq $k } @t) <=> 0;
+} 
+
+sub verify (\%@) {
+       my ($options,@valid_options) = @_;
+       for (keys %$options) {
+               die "Invalid option $_\n" unless in ($_, @valid_options);
+       }
+}
+
+
+1;
+__END__
+
+=head1 NAME
+
+SDL_perl - Simple DirectMedia Layer for Perl
+
+=head1 SYNOPSIS
+
+  use SDL;
+
+=head1 DESCRIPTION
+
+SDL_perl is a package of perl modules that provides both functional and object orient
+interfaces to the Simple DirectMedia Layer for Perl 5.  This package does take some
+liberties with the SDL API, and attempts to adhere to the spirit of both the SDL
+and Perl.  This document describes the low-level functional SDL_perl API.  For the
+object oriented programming interface please see the documentation provided on a
+per class basis.
+
+=head2 Init(flags) 
+
+As with the C language API, SDL_perl initializes the SDL environment through
+the C<SDL::Init> subroutine.  This routine takes a mode flag constructed through
+the bitwise OR product of the following functions:  
+
+=over 4
+=item *
+INIT_AUDIO()
+
+=item *
+INIT_VIDEO()
+
+=item *
+INIT_CDROM()
+
+=item *
+INIT_EVERYTHING()
+
+=item *
+INIT_NOPARACHUTE() 
+
+=item *
+INIT_JOYSTICK()
+
+=item *
+INIT_TIMER()
+
+=back
+
+C<SDL::Init> returns 0 on success, or -1 on error.
+
+=head2 GetError()
+
+The last error message set by the SDL library can be retrieved using the subroutine
+C<SDL::GetError>, which returns a scalar containing the text of the message if any.
+
+=head2 Delay(ms)
+
+This subroutine allows an application to delay further operations for atleast a
+number of milliseconds provided as the argument.  The actual delay may be longer
+than the specified depending on the underlying OS.
+
+=head2 GetTicks() 
+
+An application may retrieve the number of milliseconds expired since the initilization
+of the application through this subroutine.  This value resets rougly ever 49 days.
+
+=head2 AddTimer(interval,callback,param)
+
+C<AddTimer> will register a SDL_NewTimerCallback function to be executed after
+C<interval> milliseconds, with parameter C<param>.  SDL_NewTimerCallback objects
+can be constructed with the C<NewTimer> subroutine.   C<SDL::PerlTimerCallback>
+will return a valid callback for executing a perl subroutine or closure.
+This subroutine returns a SDL_TimerID for the newly registered callback, or NULL 
+on error.
+
+=head2 NewTimer(interval,subroutine)
+
+The C<NewTimer> takes an interval in milliseconds and a reference to a subroutine
+to call at that interval.  The subroutine will be invoked in a void context
+and accepts no parameters.  The callback used is that returned by C<SDL::PerlTimerCallback>.
+C<NewTimer> returns the SDL_TimerID for the new timer or NULL on error.
+
+=head2 RemoveTimer(id)
+
+This subroutine taks a SDL_TimerID and removes it from the list of active callbacks.
+RemoveTimer returns false on failure.
+
+=head2 SetTimer 
+
+This subroutine is depreciated, please use C<NewTimer> or C<AddTimer> instead.
+
+=head2 CDNumDrives() 
+
+C<SDL::CDNumDrives> returns the number of available CD-ROM drives in the system.
+
+=head2 CDName(drive)
+
+The subroutine C<SDL::CDName> returns the system specific human readable device name
+for the given CD-ROM drive.
+
+=head2 CDOpen(drive)
+
+This subroutine opens a CD-ROM drive for access, returning NULL if the drive is busy 
+or otherwise unavailable.  On success this subroutine returns a handle to the CD-ROM
+drive.
+
+=head2 CDTrackListing(cd)
+
+C<SDL::CDTrackListing> returns a human readable description of a CD-ROM.  For each
+track one line will be produced with the following format:
+
+       Track index: %d, id %d, %2d.%2d 
+
+This is provided to ease the creation of human readable descriptions and debugging.
+
+=head2 CDTrackId(track) 
+
+C<CDTrackId> returns the id field of the given SDL_CDtrack structure.
+
+=head2 CDTrackType(track)
+
+C<CDTrackType> returns the type field of the given SDL_CDtrack structure.
+
+=head2 CDTrackLength(track)
+
+C<CDTrackLength> returns the length field of the given SDL_CDtrack structure.
+
+=head2 CDTrackOffset(track)
+
+C<CDTrackOffset> returns the offset field of the given SDL_CDtrack structure.
+
+=head2 CDStatus(cd)
+
+The function C<CDStatus> returns the current status of the given SDL_CDrom.
+C<CDStatus>'s return values are:
+
+=over 4
+
+=item *
+CD_TRAYEMPTY 
+
+=item *
+CD_PLAYING 
+
+=item *
+CD_STOPPED
+
+=item *
+CD_PAUSED 
+
+=item *
+CD_ERROR 
+
+=back
+
+=head2 CDPlayTracks(cd,track,tracks,frame,frames)
+
+To start playing from an arbitrary portion of a CD, one can provide
+C<SDL::CDPlayTracks> with a CD, a starting track, the number of tracks,
+a starting frame, and the number of frames to be played. 
+
+=head2 CDPlay(cd,track,length) 
+
+C<SDL::CDPlay> plays the next C<length> tracks starting from C<track>
+
+=head2 CDPause(cd) 
+
+This function will pause CD playback until resume is called.
+
+=head2 CDResume(cd) 
+
+This function will resume CD playback if paused.
+
+=head2 CDStop(cd) 
+
+C<SDL::CDStop> will stop CD playback if playing.
+
+=head2 CDEject(cd) 
+
+This function will eject the CD
+
+=head2 CDClose(cd) 
+
+This function will release an opened CD. 
+
+=head2 CDNumTracks 
+
+=head2 CDCurTrack 
+
+=head2 CDCurFrame 
+
+=head2 CDTrack 
+
+=head2 PumpEvents 
+
+=head2 NewEvent 
+
+=head2 FreeEvent
+
+=head2 PollEvent 
+
+=head2 WaitEvent 
+
+=head2 EventState 
+
+=head2 IGNORE 
+
+=head2 ENABLE 
+
+=head2 QUERY 
+
+=head2 ACTIVEEVENT
+
+=head2 KEYDOWN 
+
+=head2 KEYUP 
+
+=head2 MOUSEMOTION 
+
+=head2 MOUSEBUTTONDOWN 
+
+=head2 MOUSEBUTTONUP 
+
+=head2 QUIT 
+
+=head2 SYSWMEVENT 
+
+=head2 EventType 
+
+=head2 ActiveEventGain 
+
+=head2 ActiveEventState 
+
+=head2 APPMOUSEFOCUS 
+
+=head2 APPINPUTFOCUS 
+
+=head2 APPACTIVE 
+
+=head2 KeyEventState
+
+=head2 SDLK_BACKSPACE 
+
+=head2 SDLK_TAB 
+
+=head2 SDLK_CLEAR 
+
+=head2 SDLK_RETURN 
+
+=head2 SDLK_PAUSE 
+
+=head2 SDLK_ESCAPE 
+
+=head2 SDLK_SPACE 
+
+=head2 SDLK_EXCLAIM 
+
+=head2 SDLK_QUOTEDBL 
+
+=head2 SDLK_HASH 
+
+=head2 SDLK_DOLLAR 
+
+=head2 SDLK_AMPERSAND 
+
+=head2 SDLK_QUOTE 
+
+=head2 SDLK_LEFTPAREN 
+
+=head2 SDLK_RIGHTPAREN 
+
+=head2 SDLK_ASTERISK 
+
+=head2 SDLK_PLUS 
+
+=head2 SDLK_COMMA 
+
+=head2 SDLK_MINUS 
+
+=head2 SDLK_PERIOD 
+
+=head2 SDLK_SLASH 
+
+=head2 SDLK_0 
+
+=head2 SDLK_1 
+
+=head2 SDLK_2 
+
+=head2 SDLK_3 
+
+=head2 SDLK_4 
+
+=head2 SDLK_5 
+
+=head2 SDLK_6 
+
+=head2 SDLK_7 
+
+=head2 SDLK_8 
+
+=head2 SDLK_9 
+
+=head2 SDLK_COLON 
+
+=head2 SDLK_SEMICOLON 
+
+=head2 SDLK_LESS 
+
+=head2 SDLK_EQUALS 
+
+=head2 SDLK_GREATER 
+
+=head2 SDLK_QUESTION 
+
+=head2 SDLK_AT 
+
+=head2 SDLK_LEFTBRACKET 
+
+=head2 SDLK_BACKSLASH 
+
+=head2 SDLK_RIGHTBRACKET 
+
+=head2 SDLK_CARET 
+
+=head2 SDLK_UNDERSCORE 
+
+=head2 SDLK_BACKQUOTE 
+
+=head2 SDLK_a 
+
+=head2 SDLK_b 
+
+=head2 SDLK_c 
+
+=head2 SDLK_d 
+
+=head2 SDLK_e 
+
+=head2 SDLK_f 
+
+=head2 SDLK_g 
+
+=head2 SDLK_h 
+
+=head2 SDLK_i 
+
+=head2 SDLK_j 
+
+=head2 SDLK_k 
+
+=head2 SDLK_l 
+
+=head2 SDLK_m 
+
+=head2 SDLK_n 
+
+=head2 SDLK_o 
+
+=head2 SDLK_p 
+
+=head2 SDLK_q 
+
+=head2 SDLK_r 
+
+=head2 SDLK_s 
+
+=head2 SDLK_t 
+
+=head2 SDLK_u 
+
+=head2 SDLK_v 
+
+=head2 SDLK_w 
+
+=head2 SDLK_x 
+
+=head2 SDLK_y 
+
+=head2 SDLK_z 
+
+=head2 SDLK_DELETE 
+
+=head2 SDLK_KP0 
+
+=head2 SDLK_KP1 
+
+=head2 SDLK_KP2 
+
+=head2 SDLK_KP3 
+
+=head2 SDLK_KP4 
+
+=head2 SDLK_KP5 
+
+=head2 SDLK_KP6 
+
+=head2 SDLK_KP7 
+
+=head2 SDLK_KP8 
+
+=head2 SDLK_KP9 
+
+=head2 SDLK_KP_PERIOD 
+
+=head2 SDLK_KP_DIVIDE 
+
+=head2 SDLK_KP_MULTIPLY 
+
+=head2 SDLK_KP_MINUS 
+
+=head2 SDLK_KP_PLUS 
+
+=head2 SDLK_KP_ENTER 
+
+=head2 SDLK_KP_EQUALS 
+
+=head2 SDLK_UP 
+
+=head2 SDLK_DOWN 
+
+=head2 SDLK_RIGHT 
+
+=head2 SDLK_LEFT 
+
+=head2 SDLK_INSERT 
+
+=head2 SDLK_HOME 
+
+=head2 SDLK_END 
+
+=head2 SDLK_PAGEUP 
+
+=head2 SDLK_PAGEDOWN 
+
+=head2 SDLK_F1 
+
+=head2 SDLK_F2 
+
+=head2 SDLK_F3 
+
+=head2 SDLK_F4 
+
+=head2 SDLK_F5 
+
+=head2 SDLK_F6 
+
+=head2 SDLK_F7 
+
+=head2 SDLK_F8 
+
+=head2 SDLK_F9 
+
+=head2 SDLK_F10 
+
+=head2 SDLK_F11 
+
+=head2 SDLK_F12 
+
+=head2 SDLK_F13 
+
+=head2 SDLK_F14 
+
+=head2 SDLK_F15 
+
+=head2 SDLK_NUMLOCK 
+
+=head2 SDLK_CAPSLOCK 
+
+=head2 SDLK_SCROLLOCK 
+
+=head2 SDLK_RSHIFT 
+
+=head2 SDLK_LSHIFT 
+
+=head2 SDLK_RCTRL 
+
+=head2 SDLK_LCTRL 
+
+=head2 SDLK_RALT 
+
+=head2 SDLK_LALT 
+
+=head2 SDLK_RMETA 
+
+=head2 SDLK_LMETA 
+
+=head2 SDLK_LSUPER 
+
+=head2 SDLK_RSUPER 
+
+=head2 SDLK_MODE 
+
+=head2 SDLK_HELP 
+
+=head2 SDLK_PRINT 
+
+=head2 SDLK_SYSREQ 
+
+=head2 SDLK_BREAK 
+
+=head2 SDLK_MENU 
+
+=head2 SDLK_POWER 
+
+=head2 SDLK_EURO 
+
+=head2 KMOD_NONE 
+
+=head2 KMOD_NUM 
+
+=head2 KMOD_CAPS 
+
+=head2 KMOD_LCTRL 
+
+=head2 KMOD_RCTRL 
+
+=head2 KMOD_RSHIFT 
+
+=head2 KMOD_LSHIFT 
+
+=head2 KMOD_RALT 
+
+=head2 KMOD_LALT 
+
+=head2 KMOD_CTRL 
+
+=head2 KMOD_SHIFT 
+
+=head2 KMOD_ALT 
+
+=head2 KeyEventSym 
+
+=head2 KeyEventMod 
+
+=head2 KeyEventUnicode 
+
+=head2 KeyEventScanCode 
+
+=head2 MouseMotionState 
+
+=head2 MouseMotionX 
+
+=head2 MouseMotionY 
+
+=head2 MouseMotionXrel
+
+=head2 MouseMotionYrel 
+
+=head2 MouseButtonState 
+
+=head2 MouseButton 
+
+=head2 MouseButtonX 
+
+=head2 MouseButtonY 
+
+=head2 SysWMEventMsg 
+
+=head2 EnableUnicode 
+
+=head2 EnableKeyRepeat 
+
+=head2 GetKeyName 
+
+=head2 PRESSED 
+
+=head2 RELEASED 
+
+=head2 CreateRGBSurface 
+
+=head2 CreateRGBSurfaceFrom 
+
+=head2 IMG_Load 
+
+=head2 FreeSurface 
+
+=head2 SurfacePalette 
+
+=head2 SurfaceBitsPerPixel 
+
+=head2 SurfaceBytesPerPixel 
+
+=head2 SurfaceRshift 
+
+=head2 SurfaceGshift 
+
+=head2 SurfaceBshift 
+
+=head2 SurfaceAshift 
+
+=head2 SurfaceRmask
+
+=head2 SurfaceGmask 
+
+=head2 SurfaceBmask 
+
+=head2 SurfaceAmask 
+
+=head2 SurfaceColorKey 
+
+=head2 SurfaceAlpha
+
+=head2 SurfaceW 
+
+=head2 SurfaceH 
+
+=head2 SurfacePitch 
+
+=head2 SurfacePixels 
+
+=head2 SurfacePixel 
+
+=head2 MUSTLOCK 
+
+=head2 SurfaceLock 
+
+=head2 SurfaceUnlock 
+
+=head2 GetVideoSurface 
+
+=head2 VideoInfo 
+
+=head2 NewRect 
+
+=head2 FreeRect 
+
+=head2 RectX 
+
+=head2 RectY 
+
+=head2 RectW 
+
+=head2 RectH 
+
+=head2 NewColor 
+
+=head2 ColorR 
+
+=head2 ColorG 
+
+=head2 CologB 
+
+=head2 FreeColor 
+
+=head2 NewPalette 
+
+=head2 PaletteNColors 
+
+=head2 PaletteColors 
+
+=head2 SWSURFACE 
+
+=head2 HWSURFACE 
+
+=head2 ANYFORMAT 
+
+=head2 HWPALETTE 
+
+=head2 DOUBLEBUF 
+
+=head2 FULLSCREEN 
+
+=head2 ASYNCBLIT 
+
+=head2 OPENGL 
+
+=head2 HWACCEL 
+
+=head2 VideoModeOK 
+
+=head2 SetVideoMode 
+
+=head2 UpdateRects 
+
+=head2 Flip 
+
+=head2 SetColors 
+
+=head2 MapRGB (surface,r,g,b)
+
+C<SDL::MapRGB> translates the composite red (r), green (g), blue (b)
+colors according to the given surface to a interger color value.  This
+integer can be used in functions like C<SDL::FillRect>, and is not
+the same as the format independent Color object returned by C<SDL::NewColor>.
+
+=head2 MapRGBA (surface,r,g,b,a)
+
+C<SDL::MapRGBA> works as C<SDL::MapRGB> but takes an additional alpha (a)
+component for semi-transperant colors.
+
+=head2 GetRGB 
+
+=head2 GetRGBA 
+
+=head2 SaveBMP 
+
+=head2 SetColorKey 
+
+=head2 SRCCOLORKEY 
+
+=head2 RLEACCEL 
+
+=head2 SRCALPHA 
+
+=head2 SetAlpha 
+
+=head2 DisplayFormat 
+
+=head2 BlitSurface 
+
+=head2 FillRect(surface,rect,color)
+       
+C<SDL::FillRect> draws a solid rectangle of color on the given surface.
+If the rectangle is NULL, the entire surface will be painted.
+
+=head2 WMSetCaption 
+
+=head2 WMGetCaption 
+
+=head2 WMSetIcon 
+
+=head2 WarpMouse 
+
+=head2 NewCursor 
+
+=head2 FreeCursor 
+
+=head2 SetCursor 
+
+=head2 GetCursor 
+
+=head2 ShowCursor 
+
+=head2 NewAudioSpec 
+
+=head2 FreeAudioSpec 
+
+=head2 AUDIO_U8 
+
+=head2 AUDIO_S8 
+
+=head2 AUDIO_U16 
+
+=head2 AUDIO_S16 
+
+=head2 AUDIO_U16MSB 
+
+=head2 AUDIO_S16MSB 
+
+=head2 NewAudioCVT 
+
+=head2 FreeAudioCVT 
+
+=head2 ConvertAudioData 
+
+=head2 OpenAudio 
+
+=head2 PauseAudio 
+
+=head2 UnlockAudio 
+
+=head2 CloseAudio 
+
+=head2 FreeWAV 
+
+=head2 LoadWAV 
+
+=head2 MixAudio 
+
+=head2 MIX_MAX_VOLUME 
+
+=head2 MIX_DEFAULT_FREQUENCY 
+
+=head2 MIX_DEFAULT_FORMAT 
+
+=head2 MIX_DEFAULT_CHANNELS 
+
+=head2 MIX_NO_FADING 
+
+=head2 MIX_FADING_OUT 
+
+=head2 MIX_FADING_IN 
+
+=head2 MixOpenAudio 
+
+=head2 MixAllocateChannels 
+
+=head2 MixQuerySpec 
+
+=head2 MixLoadWAV 
+
+=head2 MixLoadMusic 
+
+=head2 MixQuickLoadWAV 
+
+=head2 MixFreeChunk
+
+=head2 MixFreeMusic 
+
+=head2 MixSetPostMixCallback 
+
+=head2 MixSetMusicHook 
+
+=head2 MixSetMusicFinishedHook 
+
+=head2 MixGetMusicHookData 
+
+=head2 MixReverseChannels 
+
+=head2 MixGroupChannel 
+
+=head2 MixGroupChannels 
+
+=head2 MixGroupAvailable 
+
+=head2 MixGroupCount 
+
+=head2 MixGroupOldest 
+
+=head2 MixGroupNewer 
+
+=head2 MixPlayChannel 
+
+=head2 MixPlayChannelTimed 
+
+=head2 MixPlayMusic 
+
+=head2 MixFadeInChannel 
+
+=head2 MixFadeInChannelTimed 
+
+=head2 MixFadeInMusic 
+
+=head2 MixVolume 
+
+=head2 MixVolumeChunk 
+
+=head2 MixVolumeMusic 
+
+=head2 MixHaltChannel 
+
+=head2 MixHaltGroup 
+
+=head2 MixHaltMusic 
+
+=head2 MixExpireChannel 
+
+=head2 MixFadeOutChannel 
+
+=head2 MixFadeOutGroup 
+
+=head2 MixFadeOutMusic 
+
+=head2 MixFadingMusic
+
+=head2 MixFadingChannel
+
+=head2 MixPause 
+
+=head2 MixResume 
+
+=head2 MixPaused 
+
+=head2 MixPauseMusic 
+
+=head2 MixResumeMusic 
+
+=head2 MixRewindMusic 
+
+=head2 MixPausedMusic 
+
+=head2 MixPlaying
+
+=head2 MixPlayingMusic
+
+=head2 MixCloseAudio 
+
+=head2 NewFont 
+
+=head2 UseFont 
+
+=head2 PutString 
+
+=head2 TextWidth 
+
+=head2 GL_RED_SIZE 
+
+=head2 GL_GREEN_SIZE 
+
+=head2 GL_BLUE_SIZE 
+
+=head2 GL_ALPHA_SIZE 
+
+=head2 GL_ACCUM_RED_SIZE 
+
+=head2 GL_ACCUM_GREEN_SIZE 
+
+=head2 GL_ACCUM_BLUE_SIZE 
+
+=head2 GL_ACCUM_ALPHA_SIZE 
+
+=head2 GL_BUFFER_SIZE 
+
+=head2 GL_DEPTH_SIZE 
+
+=head2 GL_STENCIL_SIZE 
+
+=head2 GL_DOUBLEBUFFER 
+
+=head2 GL_SetAttribute 
+
+=head2 GL_GetAttribute 
+
+=head2 GL_SwapBuffers 
+
+=head2 BigEndian 
+
+=head2 NumJoysticks 
+
+=head2 JoystickName 
+
+=head2 JoystickOpen 
+
+=head2 JoystickOpened 
+
+=head2 JoystickIndex 
+
+=head2 JoystickNumAxes 
+
+=head2 JoystickNumBalls 
+
+=head2 JoystickNumHats 
+
+=head2 JoystickNumButtons 
+
+=head2 JoystickUpdate 
+
+=head2 JoystickGetAxis 
+
+=head2 JoystickGetHat 
+
+=head2 JoystickGetButton 
+
+=head2 JoystickGetBall 
+
+=head2 JoystickClose 
+
+=head1 AUTHOR
+
+David J. Goehrig
+
+=head1 CONTRIBUTORS
+
+David J. Goehrig, Wayne Keenan, Guillaume Cottenceau
+
+=head1 SEE ALSO
+
+       perl(1) SDL::App(3) SDL::Surface(3) SDL::Event(3) SDL::Rect(3) 
+       SDL::Palette(3) SDL::Mixer(3) SDL::Cdrom(3)
+
+=cut
+
diff --git a/lib/SDL/App.pm b/lib/SDL/App.pm
new file mode 100644 (file)
index 0000000..1fd0b5b
--- /dev/null
@@ -0,0 +1,368 @@
+#!/usr/bin/env perl
+#
+# App.pm
+#
+# Copyright (C) 2005 David J. Goehrig <dgoehrig@cpan.org>
+#
+# ------------------------------------------------------------------------------
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+# 
+# This library 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
+# Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+#
+# ------------------------------------------------------------------------------
+#
+# Please feel free to send questions, suggestions or improvements to:
+#
+#      David J. Goehrig
+#      dgoehrig@cpan.org
+#
+
+package SDL::App;
+
+use strict;
+use SDL;
+use SDL::Event;
+use SDL::Surface;
+use SDL::Rect;
+
+our @ISA = qw(SDL::Surface);
+
+sub DESTROY {
+
+}
+
+sub new {
+       my $proto = shift;
+       my $class = ref($proto) || $proto;
+       my %options = @_;
+
+       verify (%options, qw/   -opengl -gl -fullscreen -full -resizeable
+                               -title -t -icon_title -it -icon -i 
+                               -width -w -height -h -depth -d -flags -f 
+                               -red_size -r -blue_size -b -green_size -g -alpha_size -a
+                               -red_accum_size -ras -blue_accum_size -bas 
+                               -green_accum_sizee -gas -alpha_accum_size -aas
+                               -double_buffer -db -buffer_size -bs -stencil_size -st
+                               -asyncblit
+               / ) if ($SDL::DEBUG);
+
+       SDL::Init(SDL::SDL_INIT_EVERYTHING());
+       
+       my $t = $options{-title}        || $options{-t}         || $0;
+       my $it = $options{-icon_title}  || $options{-it}        || $t;
+       my $ic = $options{-icon}        || $options{-i}         || "";
+       my $w = $options{-width}        || $options{-w}         || 800;
+       my $h = $options{-height}       || $options{-h}         || 600;
+       my $d = $options{-depth}        || $options{-d}         || 16;
+       my $f = $options{-flags}        || $options{-f}         || SDL::SDL_ANYFORMAT();
+       my $r = $options{-red_size}     || $options{-r}         || 5;
+       my $g = $options{-green_size}   || $options{-g}         || 5;
+       my $b = $options{-blue_size}    || $options{-b}         || 5;
+       my $a = $options{-alpha_size}   || $options{-a}         || 0;
+       my $ras = $options{-red_accum_size}     || $options{-ras}               || 0;
+       my $gas = $options{-green_accum_size}   || $options{-gas}               || 0;
+       my $bas = $options{-blue_accum_size}    || $options{-bas}               || 0;
+       my $aas = $options{-alpha_accum_size}   || $options{-aas}               || 0;
+       my $db = $options{-double_buffer}       || $options{-db}                || 0;
+       my $bs = $options{-buffer_size}         || $options{-bs}                || 0;
+       my $st  = $options{-stencil_size}       || $options{-st}                || 0;
+       my $async = $options{-asyncblit} || 0;
+
+       $f |= SDL::SDL_OPENGL() if ($options{-gl} || $options{-opengl});
+       $f |= SDL::SDL_FULLSCREEN() if ($options{-fullscreen} || $options{-full});
+       $f |= SDL::SDL_RESIZABLE() if ($options{-resizeable});
+       $f |= SDL::SDL_DOUBLEBUF() if ($db); 
+       $f |= SDL::SDL_ASYNCBLIT() if ($async);
+
+       if ($f & SDL::SDL_OPENGL()) { 
+               $SDL::App::USING_OPENGL = 1;
+               SDL::GLSetAttribute(SDL::SDL_GL_RED_SIZE(),$r) if ($r); 
+               SDL::GLSetAttribute(SDL::SDL_GL_GREEN_SIZE(),$g) if ($g);       
+               SDL::GLSetAttribute(SDL::SDL_GL_BLUE_SIZE(),$b) if ($b);        
+               SDL::GLSetAttribute(SDL::SDL_GL_ALPHA_SIZE(),$a) if ($a);       
+
+               SDL::GLSetAttribute(SDL::SDL_GL_RED_ACCUM_SIZE(),$ras) if ($ras);       
+               SDL::GLSetAttribute(SDL::SDL_GL_GREEN_ACCUM_SIZE(),$gas) if ($gas);     
+               SDL::GLSetAttribute(SDL::SDL_GL_BLUE_ACCUM_SIZE(),$bas) if ($bas);      
+               SDL::GLSetAttribute(SDL::SDL_GL_ALPHA_ACCUM_SIZE(),$aas) if ($aas);     
+               
+               SDL::GLSetAttribute(SDL::SDL_GL_DOUBLEBUFFER(),$db) if ($db);
+               SDL::GLSetAttribute(SDL::SDL_GL_BUFFER_SIZE(),$bs) if ($bs);
+               SDL::GLSetAttribute(SDL::SDL_GL_DEPTH_SIZE(),$d);
+       } else {
+               $SDL::App::USING_OPENGL = 0;
+       }
+
+       my $self = \SDL::SetVideoMode($w,$h,$d,$f)
+               or die SDL::GetError();
+       
+       if ($ic and -e $ic) {
+          my $icon = new SDL::Surface -name => $ic;
+          SDL::WMSetIcon($$icon);         
+       }
+
+       SDL::WMSetCaption($t,$it);
+       
+       bless $self,$class;
+       return $self;
+}      
+
+sub resize ($$$) {
+       my ($self,$w,$h) = @_;
+       my $flags = SDL::SurfaceFlags($$self);
+       if ( $flags & SDL::SDL_RESIZABLE()) {
+               my $bpp = SDL::SurfaceBitsPerPixel($$self);
+               $self = \SDL::SetVideoMode($w,$h,$bpp,$flags);
+       }
+}
+
+sub title ($;$) {
+       my $self = shift;
+       my ($title,$icon);
+       if (@_) { 
+               $title = shift; 
+               $icon = shift || $title;
+               SDL::WMSetCaption($title,$icon);
+       }
+       return SDL::WMGetCaption();
+}
+
+sub delay ($$) {
+       my $self = shift;
+       my $delay = shift;
+       SDL::Delay($delay);
+}
+
+sub ticks {
+       return SDL::GetTicks();
+}
+
+sub error {
+       return SDL::GetError();
+}
+
+sub warp ($$$) {
+       my $self = shift;
+       SDL::WarpMouse(@_);
+}
+
+sub fullscreen ($) {
+       my $self = shift;
+       SDL::WMToggleFullScreen($$self);
+}
+
+sub iconify ($) {
+       my $self = shift;
+       SDL::WMIconifyWindow();
+}
+
+sub grab_input ($$) {
+       my ($self,$mode) = @_;
+       SDL::WMGrabInput($mode);
+}
+
+sub loop ($$) {
+       my ($self,$href) = @_;
+       my $event = new SDL::Event;
+       while ( $event->wait() ) {
+               if ( ref($$href{$event->type()}) eq "CODE" ) {
+                       &{$$href{$event->type()}}($event);
+                       $self->sync();
+               }
+       }
+}
+
+sub sync ($) {
+       my $self = shift;
+       if ($SDL::App::USING_OPENGL) {
+               SDL::GLSwapBuffers()
+       } else {
+               $self->flip();
+       }
+}
+
+sub attribute ($$;$) {
+       my ($self,$mode,$value) = @_;
+       return undef unless ($SDL::App::USING_OPENGL);
+       if (defined $value) {
+               SDL::GLSetAttribute($mode,$value);
+       }
+       my $returns = SDL::GLGetAttribute($mode);       
+       die "SDL::App::attribute failed to get GL attribute" if ($$returns[0] < 0);
+       $$returns[1];   
+}
+
+1;
+
+__END__;
+
+=pod
+
+=head1 NAME
+
+SDL::App - a SDL perl extension
+
+=head1 SYNOPSIS
+
+       my $app = new SDL::App (
+               -title => 'Application Title',
+               -width => 640, 
+               -height => 480,
+               -depth => 32 );
+
+=head1 DESCRIPTION
+
+L<SDL::App> controls the root window of the of your SDL based application.
+It extends the L<SDL_Surface> class, and provides an interface to the window
+manager oriented functions.
+
+=head1 METHODS
+
+=head2 new
+
+C<SDL::App::new> initializes the SDL, creates a new screen,
+and initializes some of the window manager properties.
+C<SDL::App::new> takes a series of named parameters:
+
+=over 4
+
+=item *
+
+-title
+
+=item *
+
+-icon_title
+
+=item *
+
+-icon
+
+=item *
+
+-width
+
+=item *
+
+-height
+
+=item *
+
+-depth
+
+=item *
+
+-flags
+
+=item *
+
+-resizeable
+
+=back
+
+=head2 title
+
+C<SDL::App::title> takes 0, 1, or 2  arguments.  It returns the current
+application window title.  If one parameter is passed, both the window
+title and icon title will be set to its value.  If two parameters are
+passed the window title will be set to the first, and the icon title
+to the second.
+
+=head2 delay
+
+C<SDL::App::delay> takes 1 argument, and will sleep the application for
+that many ms.
+
+=head2 ticks
+
+C<SDL::App::ticks> returns the number of ms since the application began.
+
+=head2 error
+
+C<SDL::App::error> returns the last error message set by the SDL.
+
+=head2 resize
+
+C<SDL::App::resize> takes a new height and width of the application
+if the application was originally created with the -resizable option.
+
+=head2 fullscreen
+
+C<SDL::App::fullscreen> toggles the application in and out of fullscreen mode.
+
+=head2 iconify
+
+C<SDL::App::iconify> iconifies the applicaiton window.
+
+=head2 grab_input
+
+C<SDL::App::grab_input> can be used to change the input focus behavior of
+the application.  It takes one argument, which should be one of the following:
+
+=over 4
+
+=item *
+SDL_GRAB_QUERY
+
+=item *
+SDL_GRAB_ON
+
+=item *
+SDL_GRAB_OFF
+
+=back
+
+=head2 loop
+
+C<SDL::App::loop> is a simple event loop method which takes a reference to a hash
+of event handler subroutines.  The keys of the hash must be SDL event types such
+as SDL_QUIT(), SDL_KEYDOWN(), and the like.  The event method recieves as its parameter 
+the event object used in the loop.
+  Example:
+
+       my $app = new SDL::App  -title => "test.app", 
+                               -width => 800, 
+                               -height => 600, 
+                               -depth => 32;
+       
+       my %actions = (
+               SDL_QUIT() => sub { exit(0); },
+               SDL_KEYDOWN() => sub { print "Key Pressed" },
+       );
+
+       $app->loop(\%actions);
+
+=head2 sync
+
+C<SDL::App::sync> encapsulates the various methods of syncronizing the screen with the
+current video buffer.  C<SDL::App::sync> will do a fullscreen update, using the double buffer
+or OpenGL buffer if applicable.  This is prefered to calling flip on the application window.
+
+=head2 attribute ( attr, [value] )
+
+C<SDL::App::attribute> allows one to set and get GL attributes.  By passing a value
+in addition to the attribute selector, the value will be set.  C<SDL:::App::attribute>
+always returns the current value of the given attribute, or dies on failure.
+
+=head1 AUTHOR
+
+David J. Goehrig
+
+=head1 SEE ALSO
+
+L<perl> L<SDL::Surface> L<SDL::Event>  L<SDL::OpenGL>
+
+=cut   
diff --git a/lib/SDL/Cdrom.pm b/lib/SDL/Cdrom.pm
new file mode 100644 (file)
index 0000000..3f2dc36
--- /dev/null
@@ -0,0 +1,231 @@
+#!/usr/bin/env perl
+#
+# Cdrom.pm
+#
+# Copyright (C) 2005 David J. Goehrig <dgoehrig@cpan.org>
+#
+# ------------------------------------------------------------------------------
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+# 
+# This library 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
+# Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+#
+# ------------------------------------------------------------------------------
+#
+# Please feel free to send questions, suggestions or improvements to:
+#
+#      David J. Goehrig
+#      dgoehrig@cpan.org
+#
+
+package SDL::Cdrom;
+use strict;
+
+BEGIN {
+       use Exporter();
+       use vars qw(@ISA @EXPORT);
+       @ISA = qw(Exporter);
+       @EXPORT = qw/ &CD_NUM_DRIVES /;
+}
+
+sub new {
+       my $proto = shift;
+       my $class = ref($proto) || $proto;
+       my $self;
+       my $number = shift;
+       $self = \SDL::CDOpen($number);
+       die SDL::GetError() if ( SDL::CD_ERROR() eq SDL::CDStatus($$self));
+       bless $self,$class;
+       return $self;
+}
+
+sub DESTROY {
+       my $self = shift;
+       SDL::CDClose($$self);
+}
+
+sub CD_NUM_DRIVES {
+       return SDL::CDNumDrives();
+}
+
+sub name ($) {
+       my $self = shift;
+       return SDL::CDName($$self);
+}
+
+sub status ($) {
+       my $self = shift;
+       return SDL::CDstatus($$self);
+}
+
+sub play ($$$;$$) {
+       my ($self,$start,$length,$fs,$fl) = @_;
+       return SDL::CDPlayTracks($$self,$start,$length,$fs,$fl);
+}
+
+sub pause ($) {
+       my $self = shift;
+       return SDL::CDPause($$self);
+}
+
+sub resume ($) {
+       my $self = shift;
+       return SDL::CDResume($$self);
+}
+
+sub stop ($) {
+       my $self = shift;
+       return SDL::CDStop($$self);
+}
+
+sub eject ($) {
+       my $self = shift;
+       return SDL::CDEject($$self);
+}
+
+sub id ($) {
+       my $self = shift;
+       return SDL::CDId($$self);
+}
+
+sub num_tracks ($) {
+       my $self = shift;
+       return SDL::CDNumTracks($$self);
+}
+
+my $buildtrack = sub {
+       my $ptr = shift;
+       my %track = ();
+       $track{-id} = SDL::CDTrackId($ptr);
+       $track{-type} = SDL::CDTrackType($ptr);
+       $track{-length} = SDL::CDTrackLength($ptr);
+       $track{-offset} = SDL::CDTrackOffset($ptr);
+       return \%track;
+};
+
+sub track {
+       my $self = shift;
+       my $number = shift;
+       return &$buildtrack(SDL::CDTrack($$self,$number));
+}
+
+sub current {
+       my $self = shift;
+       return $self->track(SDL::CDCurTrack($$self));
+}
+
+sub current_frame {
+       my $self = shift;
+       return SDL::CDCurFrame($$self);
+}
+
+1;
+
+__END__;
+
+=pod
+
+
+
+=head1 NAME
+
+SDL::Cdrom - a SDL perl extension for managing CD-ROM drives
+
+=head1 SYNOPSIS
+
+       use SDL::Cdrom;
+       $cdrom = SDL::Cdrom->new(0);
+       $cdrom->play();
+
+=head1 EXPORTS
+
+=over 4
+
+=item *
+
+C<CD_NUM_DRIVES>.
+
+=back
+
+=head1 DESCRIPTION
+
+Create a new SDL::Cdrom object. The passed $id is the number of the drive,
+whereas 0 is the first drive etc.
+       
+       use SDL::Cdrom;
+       my $drive => SDL::Cdrom->new($id);
+
+=head1 METHODS
+
+=head2 CD_NUM_DRIVES()
+
+Returns the number of CD-ROM drives present.
+
+=head2 name()
+
+Returns the system dependent name of the CD-ROM device.
+
+=head2 status()
+
+Return the status of the drive.
+
+=head2 play()
+
+Play a track.
+
+=head2 pause()
+
+Pause the playing.
+
+=head2 resume()
+
+Resume the playing.
+
+=head2 stop()
+
+Stop the playing.
+
+=head2 eject()
+
+Eject the medium in the drive.
+
+=head2 id()
+
+Return the ID of the drive.
+
+=head2 num_tracks()
+
+Return the number of tracks on the medium.
+
+=head2 track()
+
+Returns the track description
+
+=head2 current()
+
+Return the current played track number.
+
+=head2 current_frame()
+
+Return the current frame.
+
+=head1 AUTHORS
+
+David J. Goehrig
+Documentation by Tels <http://bloodgate.com/>.
+
+=head1 SEE ALSO
+
+L<perl> L<SDL::Mixer> L<SDL::App>.
+
+=cut
diff --git a/lib/SDL/Color.pm b/lib/SDL/Color.pm
new file mode 100644 (file)
index 0000000..ff6d291
--- /dev/null
@@ -0,0 +1,153 @@
+#!/usr/bin/env perl
+#
+# Color.pm
+#
+# Copyright (C) 2005 David J. Goehrig <dgoehrig@cpan.org>
+#
+# ------------------------------------------------------------------------------
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+# 
+# This library 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
+# Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+#
+# ------------------------------------------------------------------------------
+#
+# Please feel free to send questions, suggestions or improvements to:
+#
+#      David J. Goehrig
+#      dgoehrig@cpan.org
+#
+
+package SDL::Color;
+
+use strict;
+use SDL;
+
+sub new {
+       my $proto = shift;
+       my $class = ref($proto) || $proto;
+       my $self;
+
+       my (%options) = @_;
+
+       verify (%options, qw/ -color -surface -pixel -r -g -b /) if $SDL::DEBUG;
+
+       if ($options{-color}) {
+               $self = \$options{-color};      
+       } elsif ($options{-pixel} && $options{-surface}) {
+               die "SDL::Color::new requires an SDL::Surface"
+                       unless !$SDL::DEBUG || $options{-surface}->isa("SDL::Surface");
+               $self = \SDL::NewColor(SDL::GetRGB(${$options{-surface}}, $options{-pixel}));
+       } else {
+               my @color;
+               push @color, $options{-red}     || $options{-r} || 0;
+               push @color, $options{-green}   || $options{-g} || 0;
+               push @color, $options{-blue}    || $options{-b} || 0;
+               $self = \SDL::NewColor(@color);
+       } 
+       die "Could not create color, ", SDL::GetError(), "\n"
+               unless ($$self);
+       bless $self,$class;
+       return $self;
+}
+
+sub DESTROY {
+       SDL::FreeColor(${$_[0]});
+}
+
+sub r {
+       my $self = shift;
+       SDL::ColorR($$self,@_); 
+}
+
+sub g {
+       my $self = shift;
+       SDL::ColorG($$self,@_);
+}
+
+sub b {
+       my $self = shift;
+       SDL::ColorB($$self,@_);
+}
+
+sub pixel {
+       die "SDL::Color::pixel requires an SDL::Surface"
+               unless !$SDL::DEBUG || $_[1]->isa("SDL::Surface");
+       SDL::MapRGB(${$_[1]},$_[0]->r(),$_[0]->g(),$_[0]->b());
+}
+
+$SDL::Color::black = new SDL::Color -r => 0, -g => 0, -b => 0;
+$SDL::Color::white = new SDL::Color -r => 255, -g => 255, -b => 255;
+$SDL::Color::red = new SDL::Color -r => 255, -g => 0, -b => 0;
+$SDL::Color::blue = new SDL::Color -r => 0, -g => 0, -b => 255;
+$SDL::Color::green = new SDL::Color -r => 0, -g => 255, -b => 0;
+$SDL::Color::purple = new SDL::Color -r => 255, -g => 0, -b => 255;
+$SDL::Color::yellow = new SDL::Color -r => 255, -g => 255, -b => 0;
+
+1;
+
+__END__;
+
+=pod
+
+=head1 NAME
+
+SDL::Color - a SDL perl extension
+
+=head1 SYNOPSIS
+
+  $color = new SDL::Color ( -r => 0xde, -g => 0xad, -b =>c0 );
+  $color = new SDL::Color -surface => $app, -pixel => $app->pixel($x,$y);
+  $color = new SDL::Color -color => SDL::NewColor(0xff,0xaa,0xdd);
+
+=head1 DESCRIPTION
+
+C<SDL::Color> is a wrapper for display format independent color
+representations, with the same interface as L<SDL::Color>.  
+
+=head2 new ( -color => )
+
+C<SDL::Color::new> with a C<-color> option will construct a new object
+referencing the passed SDL_Color*.
+
+=head2 new (-r => , -g => , -b => )
+
+C<SDL::Color::new> with C<-r,-g,-b> options will construct both a SDL_Color
+structure, and the associated object with the specified vales.
+
+=head2 new (-pixel =>, -surface =>)
+
+C<SDL::Color::new> with C<-pixel,-surface> options will generate a SDL_Color*
+with the r,g,b values associated with the integer value passed by C<-pixel>
+for the given C<-surface>'s format.
+
+=head2 r ( [ red ] ), g( [ green ] ), b( [ blue ] )
+
+C<SDL::Color::r, SDL::Color::g, SDL::Color::b> are accessor methods for
+the red, green, and blue components respectively.  The color value can be set
+by passing a byte value (0-255) to each function.
+
+=head2 pixel ( surface )
+
+C<SDL::Color::pixel> takes a C<SDL::Surface> object and r,g,b values, and
+returns the integer representation of the closest color for the given surface.
+
+=head1 AUTHOR
+
+David J. Goehrig
+
+=head1 SEE ALSO
+
+L<perl> L<SDL::Surface> 
+
+=cut
diff --git a/lib/SDL/Config.pm b/lib/SDL/Config.pm
new file mode 100644 (file)
index 0000000..3d9b731
--- /dev/null
@@ -0,0 +1,41 @@
+package SDL::Config;
+
+my $sdl_config; 
+$sdl_config = {
+                'OpenGL' => {
+                              'GL' => [
+                                        '/System/Library/Frameworks/OpenGL.framework/Headers',
+                                        '/System/Library/Frameworks/OpenGL.framework/Libraries'
+                                      ],
+                              'SDL' => 0,
+                              'GLU' => [
+                                         '/System/Library/Frameworks/OpenGL.framework/Headers',
+                                         '/System/Library/Frameworks/OpenGL.framework/Libraries'
+                                       ]
+                            },
+                'SDL' => {
+                           'png' => 0,
+                           'SDL' => 0,
+                           'SDL_ttf' => 0,
+                           'SDL_svg' => 0,
+                           'SDL_net' => 0,
+                           'SDL_image' => 0,
+                           'jpeg' => 0,
+                           'SDL_gfx' => 0,
+                           'smpeg' => 0,
+                           'SDL_sound' => 0,
+                           'SDL_mixer' => 0
+                         },
+                'SFont' => {
+                             'SDL_image' => 0,
+                             'SDL' => 0
+                           }
+              };
+
+sub has
+{
+       my ($class, $define) = @_;
+       scalar grep { $$sdl_config{$_}{$define} } keys %$sdl_config;
+}
+
+1;
diff --git a/lib/SDL/Constants.pm b/lib/SDL/Constants.pm
new file mode 100644 (file)
index 0000000..fedd9d1
--- /dev/null
@@ -0,0 +1,586 @@
+#!/usr/bin/env perl
+#
+# Constants.pm
+#
+# Copyright (C) 2005 David J. Goehrig <dgoehrig@cpan.org>
+#
+# ------------------------------------------------------------------------------
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+# 
+# This library 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
+# Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+#
+# ------------------------------------------------------------------------------
+#
+# Please feel free to send questions, suggestions or improvements to:
+#
+#      David J. Goehrig
+#      dgoehrig@cpan.org
+#
+
+package SDL::Constants;
+
+@EXPORT=qw(
+       AUDIO_S16
+       AUDIO_S16MSB
+       AUDIO_S8
+       AUDIO_U16
+       AUDIO_U16MSB
+       AUDIO_U8
+       CD_ERROR
+       CD_PAUSED
+       CD_PLAYING
+       CD_STOPPED
+       CD_TRAYEMPTY
+       INADDR_ANY
+       INADDR_NONE
+       KMOD_ALT
+       KMOD_CAPS
+       KMOD_CTRL
+       KMOD_LALT
+       KMOD_LCTRL
+       KMOD_LSHIFT
+       KMOD_NONE
+       KMOD_NUM
+       KMOD_RALT
+       KMOD_RCTRL
+       KMOD_RSHIFT
+       KMOD_SHIFT
+       MIX_DEFAULT_CHANNELS
+       MIX_DEFAULT_FORMAT
+       MIX_DEFAULT_FREQUENCY
+       MIX_FADING_IN
+       MIX_FADING_OUT
+       MIX_MAX_VOLUME
+       MIX_NO_FADING
+       SDLK_0
+       SDLK_1
+       SDLK_2
+       SDLK_3
+       SDLK_4
+       SDLK_5
+       SDLK_6
+       SDLK_7
+       SDLK_8
+       SDLK_9
+       SDLK_AMPERSAND
+       SDLK_ASTERISK
+       SDLK_AT
+       SDLK_BACKQUOTE
+       SDLK_BACKSLASH
+       SDLK_BACKSPACE
+       SDLK_BREAK
+       SDLK_CAPSLOCK
+       SDLK_CARET
+       SDLK_CLEAR
+       SDLK_COLON
+       SDLK_COMMA
+       SDLK_DELETE
+       SDLK_DOLLAR
+       SDLK_DOWN
+       SDLK_END
+       SDLK_EQUALS
+       SDLK_ESCAPE
+       SDLK_EURO
+       SDLK_EXCLAIM
+       SDLK_F1
+       SDLK_F10
+       SDLK_F11
+       SDLK_F12
+       SDLK_F13
+       SDLK_F14
+       SDLK_F15
+       SDLK_F2
+       SDLK_F3
+       SDLK_F4
+       SDLK_F5
+       SDLK_F6
+       SDLK_F7
+       SDLK_F8
+       SDLK_F9
+       SDLK_GREATER
+       SDLK_HASH
+       SDLK_HELP
+       SDLK_HOME
+       SDLK_INSERT
+       SDLK_KP0
+       SDLK_KP1
+       SDLK_KP2
+       SDLK_KP3
+       SDLK_KP4
+       SDLK_KP5
+       SDLK_KP6
+       SDLK_KP7
+       SDLK_KP8
+       SDLK_KP9
+       SDLK_KP_DIVIDE
+       SDLK_KP_ENTER
+       SDLK_KP_EQUALS
+       SDLK_KP_MINUS
+       SDLK_KP_MULTIPLY
+       SDLK_KP_PERIOD
+       SDLK_KP_PLUS
+       SDLK_LALT
+       SDLK_LCTRL
+       SDLK_LEFT
+       SDLK_LEFTBRACKET
+       SDLK_LEFTPAREN
+       SDLK_LESS
+       SDLK_LMETA
+       SDLK_LSHIFT
+       SDLK_LSUPER
+       SDLK_MENU
+       SDLK_MINUS
+       SDLK_MODE
+       SDLK_NUMLOCK
+       SDLK_PAGEDOWN
+       SDLK_PAGEUP
+       SDLK_PAUSE
+       SDLK_PERIOD
+       SDLK_PLUS
+       SDLK_POWER
+       SDLK_PRINT
+       SDLK_QUESTION
+       SDLK_QUOTE
+       SDLK_QUOTEDBL
+       SDLK_RALT
+       SDLK_RCTRL
+       SDLK_RETURN
+       SDLK_RIGHT
+       SDLK_RIGHTBRACKET
+       SDLK_RIGHTPAREN
+       SDLK_RMETA
+       SDLK_RSHIFT
+       SDLK_RSUPER
+       SDLK_SCROLLOCK
+       SDLK_SEMICOLON
+       SDLK_SLASH
+       SDLK_SPACE
+       SDLK_SYSREQ
+       SDLK_TAB
+       SDLK_UNDERSCORE
+       SDLK_UP
+       SDLK_a
+       SDLK_b
+       SDLK_c
+       SDLK_d
+       SDLK_e
+       SDLK_f
+       SDLK_g
+       SDLK_h
+       SDLK_i
+       SDLK_j
+       SDLK_k
+       SDLK_l
+       SDLK_m
+       SDLK_n
+       SDLK_o
+       SDLK_p
+       SDLK_q
+       SDLK_r
+       SDLK_s
+       SDLK_t
+       SDLK_u
+       SDLK_v
+       SDLK_w
+       SDLK_x
+       SDLK_y
+       SDLK_z
+       SDL_ACTIVEEVENT
+       SDL_ANYFORMAT
+       SDL_APPACTIVE
+       SDL_APPINPUTFOCUS
+       SDL_APPMOUSEFOCUS
+       SDL_ASYNCBLIT
+       SDL_AUDIO_PAUSED
+       SDL_AUDIO_PLAYING
+       SDL_AUDIO_STOPPED
+       SDL_BUTTON_LEFT
+       SDL_BUTTON_MIDDLE
+       SDL_BUTTON_RIGHT
+       SDL_BUTTON_WHEELUP
+       SDL_BUTTON_WHEELDOWN
+       SDL_DOUBLEBUF
+       SDL_ENABLE
+       SDL_FULLSCREEN
+       SDL_GL_ACCUM_ALPHA_SIZE
+       SDL_GL_ACCUM_BLUE_SIZE
+       SDL_GL_ACCUM_GREEN_SIZE
+       SDL_GL_ACCUM_RED_SIZE
+       SDL_GL_ALPHA_SIZE
+       SDL_GL_BLUE_SIZE
+       SDL_GL_BUFFER_SIZE
+       SDL_GL_DEPTH_SIZE
+       SDL_GL_DOUBLEBUFFER
+       SDL_GL_GREEN_SIZE
+       SDL_GL_RED_SIZE
+       SDL_GL_STENCIL_SIZE
+       SDL_GRAB_OFF
+       SDL_GRAB_ON
+       SDL_GRAB_QUERY
+       SDL_HAT_CENTERED
+       SDL_HAT_DOWN
+       SDL_HAT_LEFT
+       SDL_HAT_LEFTDOWN
+       SDL_HAT_LEFTUP
+       SDL_HAT_RIGHT
+       SDL_HAT_RIGHTDOWN
+       SDL_HAT_RIGHTUP
+       SDL_HAT_UP
+       SDL_HWACCEL
+       SDL_HWPALETTE
+       SDL_HWSURFACE
+       SDL_IGNORE
+       SDL_INIT_AUDIO
+       SDL_INIT_CDROM
+       SDL_INIT_EVERYTHING
+       SDL_INIT_JOYSTICK
+       SDL_INIT_NOPARACHUTE
+       SDL_INIT_TIMER
+       SDL_INIT_VIDEO
+       SDL_IYUV_OVERLAY
+       SDL_JOYAXISMOTION
+       SDL_JOYBALLMOTION
+       SDL_JOYBUTTONDOWN
+       SDL_JOYBUTTONUP
+       SDL_JOYHATMOTION
+       SDL_KEYDOWN
+       SDL_KEYUP
+       SDL_MIX_MAXVOLUME
+       SDL_MOUSEBUTTONDOWN
+       SDL_MOUSEBUTTONUP
+       SDL_MOUSEMOTION
+       SDL_OPENGL
+       SDL_OPENGLBLIT
+       SDL_PREALLOC
+       SDL_PRESSED
+       SDL_QUERY
+       SDL_QUIT
+       SDL_RELEASED
+       SDL_RESIZABLE
+       SDL_RLEACCEL
+       SDL_RLEACCELOK
+       SDL_SRCALPHA
+       SDL_SRCCOLORKEY
+       SDL_SWSURFACE
+       SDL_SYSWMEVENT
+       SDL_UYVY_OVERLAY
+       SDL_VIDEOEXPOSE
+       SDL_VIDEORESIZE
+       SDL_YUY2_OVERLAY
+       SDL_YV12_OVERLAY
+       SDL_YVYU_OVERLAY
+       SMPEG_ERROR
+       SMPEG_PLAYING
+       SMPEG_STOPPED
+       TEXT_BLENDED
+       TEXT_SHADED
+       TEXT_SOLID
+       TTF_STYLE_BOLD
+       TTF_STYLE_ITALIC
+       TTF_STYLE_NORMAL
+       TTF_STYLE_UNDERLINE
+       UNICODE_BLENDED
+       UNICODE_SHADED
+       UNICODE_SOLID
+       UTF8_BLENDED
+       UTF8_SHADED
+       UTF8_SOLID
+       SDL_SVG_FLAG_DIRECT
+       SDL_SVG_FLAG_COMPOSITE
+       SDL_SAMPLEFLAG_NONE
+       SDL_SAMPLEFLAG_CANSEEK
+       SDL_SAMPLEFLAG_EOF
+       SDL_SAMPLEFLAG_ERROR
+       SDL_SAMPLEFLAG_EAGAIN
+);
+
+for (@EXPORT) {
+       *{"SDL::" . $_} = *{$_};
+       *{"main::" . $_} = *{$_};
+}
+
+sub AUDIO_S16 {32784}
+sub AUDIO_S16MSB {36880}
+sub AUDIO_S8 {32776}
+sub AUDIO_U16 {16}
+sub AUDIO_U16MSB {4112}
+sub AUDIO_U8 {8}
+sub CD_ERROR {-1}
+sub CD_PAUSED {3}
+sub CD_PLAYING {2}
+sub CD_STOPPED {1}
+sub CD_TRAYEMPTY {0}
+sub INADDR_ANY {0}
+sub INADDR_NONE {-1}
+sub KMOD_ALT {768}
+sub KMOD_CAPS {8192}
+sub KMOD_CTRL {192}
+sub KMOD_LALT {256}
+sub KMOD_LCTRL {64}
+sub KMOD_LSHIFT {1}
+sub KMOD_NONE {0}
+sub KMOD_NUM {4096}
+sub KMOD_RALT {512}
+sub KMOD_RCTRL {128}
+sub KMOD_RSHIFT {2}
+sub KMOD_SHIFT {3}
+sub MIX_DEFAULT_CHANNELS {2}
+sub MIX_DEFAULT_FORMAT {32784}
+sub MIX_DEFAULT_FREQUENCY {22050}
+sub MIX_FADING_IN {2}
+sub MIX_FADING_OUT {1}
+sub MIX_MAX_VOLUME {128}
+sub MIX_NO_FADING {0}
+sub SDLK_0 {48}
+sub SDLK_1 {49}
+sub SDLK_2 {50}
+sub SDLK_3 {51}
+sub SDLK_4 {52}
+sub SDLK_5 {53}
+sub SDLK_6 {54}
+sub SDLK_7 {55}
+sub SDLK_8 {56}
+sub SDLK_9 {57}
+sub SDLK_AMPERSAND {38}
+sub SDLK_ASTERISK {42}
+sub SDLK_AT {64}
+sub SDLK_BACKQUOTE {96}
+sub SDLK_BACKSLASH {92}
+sub SDLK_BACKSPACE {8}
+sub SDLK_BREAK {318}
+sub SDLK_CAPSLOCK {301}
+sub SDLK_CARET {94}
+sub SDLK_CLEAR {12}
+sub SDLK_COLON {58}
+sub SDLK_COMMA {44}
+sub SDLK_DELETE {127}
+sub SDLK_DOLLAR {36}
+sub SDLK_DOWN {274}
+sub SDLK_END {279}
+sub SDLK_EQUALS {61}
+sub SDLK_ESCAPE {27}
+sub SDLK_EURO {321}
+sub SDLK_EXCLAIM {33}
+sub SDLK_F1 {282}
+sub SDLK_F10 {291}
+sub SDLK_F11 {292}
+sub SDLK_F12 {293}
+sub SDLK_F13 {294}
+sub SDLK_F14 {295}
+sub SDLK_F15 {296}
+sub SDLK_F2 {283}
+sub SDLK_F3 {284}
+sub SDLK_F4 {285}
+sub SDLK_F5 {286}
+sub SDLK_F6 {287}
+sub SDLK_F7 {288}
+sub SDLK_F8 {289}
+sub SDLK_F9 {290}
+sub SDLK_GREATER {62}
+sub SDLK_HASH {35}
+sub SDLK_HELP {315}
+sub SDLK_HOME {278}
+sub SDLK_INSERT {277}
+sub SDLK_KP0 {256}
+sub SDLK_KP1 {257}
+sub SDLK_KP2 {258}
+sub SDLK_KP3 {259}
+sub SDLK_KP4 {260}
+sub SDLK_KP5 {261}
+sub SDLK_KP6 {262}
+sub SDLK_KP7 {263}
+sub SDLK_KP8 {264}
+sub SDLK_KP9 {265}
+sub SDLK_KP_DIVIDE {267}
+sub SDLK_KP_ENTER {271}
+sub SDLK_KP_EQUALS {272}
+sub SDLK_KP_MINUS {269}
+sub SDLK_KP_MULTIPLY {268}
+sub SDLK_KP_PERIOD {266}
+sub SDLK_KP_PLUS {270}
+sub SDLK_LALT {308}
+sub SDLK_LCTRL {306}
+sub SDLK_LEFT {276}
+sub SDLK_LEFTBRACKET {91}
+sub SDLK_LEFTPAREN {40}
+sub SDLK_LESS {60}
+sub SDLK_LMETA {310}
+sub SDLK_LSHIFT {304}
+sub SDLK_LSUPER {311}
+sub SDLK_MENU {319}
+sub SDLK_MINUS {45}
+sub SDLK_MODE {313}
+sub SDLK_NUMLOCK {300}
+sub SDLK_PAGEDOWN {281}
+sub SDLK_PAGEUP {280}
+sub SDLK_PAUSE {19}
+sub SDLK_PERIOD {46}
+sub SDLK_PLUS {43}
+sub SDLK_POWER {320}
+sub SDLK_PRINT {316}
+sub SDLK_QUESTION {63}
+sub SDLK_QUOTE {39}
+sub SDLK_QUOTEDBL {34}
+sub SDLK_RALT {307}
+sub SDLK_RCTRL {305}
+sub SDLK_RETURN {13}
+sub SDLK_RIGHT {275}
+sub SDLK_RIGHTBRACKET {93}
+sub SDLK_RIGHTPAREN {41}
+sub SDLK_RMETA {309}
+sub SDLK_RSHIFT {303}
+sub SDLK_RSUPER {312}
+sub SDLK_SCROLLOCK {302}
+sub SDLK_SEMICOLON {59}
+sub SDLK_SLASH {47}
+sub SDLK_SPACE {32}
+sub SDLK_SYSREQ {317}
+sub SDLK_TAB {9}
+sub SDLK_UNDERSCORE {95}
+sub SDLK_UP {273}
+sub SDLK_a {97}
+sub SDLK_b {98}
+sub SDLK_c {99}
+sub SDLK_d {100}
+sub SDLK_e {101}
+sub SDLK_f {102}
+sub SDLK_g {103}
+sub SDLK_h {104}
+sub SDLK_i {105}
+sub SDLK_j {106}
+sub SDLK_k {107}
+sub SDLK_l {108}
+sub SDLK_m {109}
+sub SDLK_n {110}
+sub SDLK_o {111}
+sub SDLK_p {112}
+sub SDLK_q {113}
+sub SDLK_r {114}
+sub SDLK_s {115}
+sub SDLK_t {116}
+sub SDLK_u {117}
+sub SDLK_v {118}
+sub SDLK_w {119}
+sub SDLK_x {120}
+sub SDLK_y {121}
+sub SDLK_z {122}
+sub SDL_ACTIVEEVENT {1}
+sub SDL_ANYFORMAT {268435456}
+sub SDL_APPACTIVE {4}
+sub SDL_APPINPUTFOCUS {2}
+sub SDL_APPMOUSEFOCUS {1}
+sub SDL_ASYNCBLIT {4}
+sub SDL_AUDIO_PAUSED {2}
+sub SDL_AUDIO_PLAYING {1}
+sub SDL_AUDIO_STOPPED {0}
+sub SDL_BUTTON_LEFT {1}
+sub SDL_BUTTON_MIDDLE {2}
+sub SDL_BUTTON_RIGHT {4}
+sub SDL_BUTTON_WHEELUP {8}
+sub SDL_BUTTON_WHEELDOWN {16}
+sub SDL_DOUBLEBUF {1073741824}
+sub SDL_ENABLE {1}
+sub SDL_FULLSCREEN {-2147483648}
+sub SDL_GL_ACCUM_ALPHA_SIZE {11}
+sub SDL_GL_ACCUM_BLUE_SIZE {10}
+sub SDL_GL_ACCUM_GREEN_SIZE {9}
+sub SDL_GL_ACCUM_RED_SIZE {8}
+sub SDL_GL_ALPHA_SIZE {3}
+sub SDL_GL_BLUE_SIZE {2}
+sub SDL_GL_BUFFER_SIZE {4}
+sub SDL_GL_DEPTH_SIZE {6}
+sub SDL_GL_DOUBLEBUFFER {5}
+sub SDL_GL_GREEN_SIZE {1}
+sub SDL_GL_RED_SIZE {0}
+sub SDL_GL_STENCIL_SIZE {7}
+sub SDL_GRAB_OFF {0}
+sub SDL_GRAB_ON {1}
+sub SDL_GRAB_QUERY {-1}
+sub SDL_HAT_CENTERED {0}
+sub SDL_HAT_DOWN {4}
+sub SDL_HAT_LEFT {8}
+sub SDL_HAT_LEFTDOWN {12}
+sub SDL_HAT_LEFTUP {9}
+sub SDL_HAT_RIGHT {2}
+sub SDL_HAT_RIGHTDOWN {6}
+sub SDL_HAT_RIGHTUP {3}
+sub SDL_HAT_UP {1}
+sub SDL_HWACCEL {256}
+sub SDL_HWPALETTE {536870912}
+sub SDL_HWSURFACE {1}
+sub SDL_IGNORE {0}
+sub SDL_INIT_AUDIO {16}
+sub SDL_INIT_CDROM {256}
+sub SDL_INIT_EVERYTHING {65535}
+sub SDL_INIT_JOYSTICK {512}
+sub SDL_INIT_NOPARACHUTE {1048576}
+sub SDL_INIT_TIMER {1}
+sub SDL_INIT_VIDEO {32}
+sub SDL_IYUV_OVERLAY {1448433993}
+sub SDL_JOYAXISMOTION {7}
+sub SDL_JOYBALLMOTION {8}
+sub SDL_JOYBUTTONDOWN {10}
+sub SDL_JOYBUTTONUP {11}
+sub SDL_JOYHATMOTION {9}
+sub SDL_KEYDOWN {2}
+sub SDL_KEYUP {3}
+sub SDL_MIX_MAXVOLUME {128}
+sub SDL_MOUSEBUTTONDOWN {5}
+sub SDL_MOUSEBUTTONUP {6}
+sub SDL_MOUSEMOTION {4}
+sub SDL_OPENGL {2}
+sub SDL_OPENGLBLIT {10}
+sub SDL_PREALLOC {16777216}
+sub SDL_PRESSED {1}
+sub SDL_QUERY {-1}
+sub SDL_QUIT {12}
+sub SDL_RELEASED {0}
+sub SDL_RESIZABLE {16}
+sub SDL_RLEACCEL {16384}
+sub SDL_RLEACCELOK {8192}
+sub SDL_SRCALPHA {65536}
+sub SDL_SRCCOLORKEY {4096}
+sub SDL_SWSURFACE {0}
+sub SDL_SYSWMEVENT {13}
+sub SDL_UYVY_OVERLAY {1498831189}
+sub SDL_VIDEOEXPOSE {17}
+sub SDL_VIDEORESIZE {16}
+sub SDL_YUY2_OVERLAY {844715353}
+sub SDL_YV12_OVERLAY {842094169}
+sub SDL_YVYU_OVERLAY {1431918169}
+sub SMPEG_ERROR {-1}
+sub SMPEG_PLAYING {1}
+sub SMPEG_STOPPED {0}
+sub TEXT_BLENDED {4}
+sub TEXT_SHADED {2}
+sub TEXT_SOLID {1}
+sub TTF_STYLE_BOLD {1}
+sub TTF_STYLE_ITALIC {2}
+sub TTF_STYLE_NORMAL {0}
+sub TTF_STYLE_UNDERLINE {4}
+sub UNICODE_BLENDED {256}
+sub UNICODE_SHADED {128}
+sub UNICODE_SOLID {64}
+sub UTF8_BLENDED {32}
+sub UTF8_SHADED {16}
+sub UTF8_SOLID {8}
+sub SDL_SVG_FLAG_DIRECT {0}
+sub SDL_SVG_FLAG_COMPOSITE {1}
+sub SDL_SAMPLEFLAG_NONE {0}
+sub SDL_SAMPLEFLAG_CANSEEK {1}
+sub SDL_SAMPLEFLAG_EOF {1<<29}
+sub SDL_SAMPLEFLAG_ERROR {1<<30}
+sub SDL_SAMPLEFLAG_EAGAIN {1<<31}
+
+1;
diff --git a/lib/SDL/Cursor.pm b/lib/SDL/Cursor.pm
new file mode 100644 (file)
index 0000000..847ee65
--- /dev/null
@@ -0,0 +1,131 @@
+#!/usr/bin/env perl
+#
+# Cursor.pm
+#
+# Copyright (C) 2005 David J. Goehrig <dgoehrig@cpan.org>
+#
+# ------------------------------------------------------------------------------
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+# 
+# This library 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
+# Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+#
+# ------------------------------------------------------------------------------
+#
+# Please feel free to send questions, suggestions or improvements to:
+#
+#      David J. Goehrig
+#      dgoehrig@cpan.org
+#
+
+package SDL::Cursor;
+use strict;
+
+sub new {
+       my $proto = shift;
+       my $class = ref($proto) || $proto;
+       my %options = @_;
+
+       verify (%options, qw/ -data -mask -x -y /) if $SDL::DEBUG;
+
+       my $self = \SDL::NewCursor($options{-data},$options{-mask},
+                               $options{-x},$options{-y});
+       die SDL::GetError() unless $$self;
+       bless $self, $class;
+       $self;
+}
+
+sub DESTROY ($) {
+       my $self = shift;
+       SDL::FreeCursor($$self);
+}
+
+sub warp ($$$) {
+       my ($self,$x,$y) = @_;
+       SDL::WarpMouse($x,$y);
+}
+
+sub use ($) {
+       my $self = shift;
+       SDL::SetCursor($$self);
+}
+
+sub get () {
+       SDL::GetCursor();
+}
+
+sub show ($;$) {
+       my ($self,$toggle) = @_;
+       SDL::ShowCursor($toggle);
+}
+
+1;
+
+__END__;
+
+=pod
+
+
+
+=head1 NAME
+
+SDL::Cursor - a SDL perl extension
+
+=head1 SYNOPSIS
+
+  $cursor = SDL::Cursor->new(
+       -data => new SDL::Surface "cursor.png",
+       -mask => new SDL::Surface "mask.png",
+       -x    => 0, -y => 0 );
+  $cusor->use;
+
+=head1 DESCRIPTION
+
+the SDL::Cursor module handles mouse cursors, and provide the developer to
+use custom made cursors. Note that the cursors can only be in black and
+white.
+
+=head1 METHODS
+
+=head2 new( -data => $surface_data, -mask => $surface_mask, x => $x, y => $y)
+
+Creates a new cursor. The <C>-data</C> and <C>-mask</C> parameters should be both black and white pictures. The height and width of these surfaces should be a multiple of 8. The <C>-x</C> and <C>-y</C> are the coordinates of the cursor 'hot spot'.
+
+=head2 warp($x, $y)
+
+Set the position of the cursor at the <C>$x</C>, <C>$y</C> coordinates in the application window.
+
+=head2 use()
+
+Set the cursor as the active cursor.
+
+=head2 get()
+
+When used statically <C>SDL::Cursor::get()</C>, it will return the instance of the current cursor in use. Called as a method, it will return itself.
+
+This method can be useful if you are dealing with several cursors.
+
+=head2 show($toggle)
+
+Set the visibility of the cursor. A false value will make the cursor
+invisible in the Application window. A true value will show it back.
+
+=head1 AUTHOR
+
+David J. Goehrig
+
+=head1 SEE ALSO
+
+L<perl> L<SDL::Surface>
+
+=cut   
diff --git a/lib/SDL/Event.pm b/lib/SDL/Event.pm
new file mode 100644 (file)
index 0000000..323a85e
--- /dev/null
@@ -0,0 +1,319 @@
+#!/usr/bin/env perl
+#
+# Event.pm
+#
+# Copyright (C) 2005 David J. Goehrig <dgoehrig@cpan.org>
+#
+# ------------------------------------------------------------------------------
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+# 
+# This library 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
+# Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+#
+# ------------------------------------------------------------------------------
+#
+# Please feel free to send questions, suggestions or improvements to:
+#
+#      David J. Goehrig
+#      dgoehrig@cpan.org
+#
+
+package SDL::Event;
+
+use strict;
+use SDL;
+
+sub new {
+       my $proto = shift;
+       my $class = ref($proto) || $proto;
+       my $self;
+       $self = \SDL::NewEvent();
+       bless $self, $class;
+       return $self;
+}
+
+sub DESTROY {
+       my $self = shift;
+       SDL::FreeEvent($$self);
+}
+
+sub type {
+       my $self = shift;
+       if (@_) {
+               SDL::SetEventType($$self,$_[0]);
+       }
+       return SDL::EventType($$self);
+}
+
+sub pump {
+       SDL::PumpEvents();
+}
+
+sub poll {
+       my $self = shift;
+       return SDL::PollEvent($$self);
+}
+
+sub push {
+       my $self = shift;
+       return SDL::PushEvent($$self);
+}
+
+sub wait {
+       my $self = shift;
+       return SDL::WaitEvent($$self);
+}
+
+sub set { 
+       my $self = shift;
+       my $state = shift;
+       return SDL::EventState($self->type(),$state);
+}
+
+sub set_unicode {
+       my $self = shift;
+       my $toggle = shift;
+       return SDL::EnableUnicode($toggle);
+}
+
+sub set_key_repeat {
+       my $self = shift;
+       my $delay = shift;
+       my $interval = shift;
+       return SDL::EnableKeyRepeat($delay,$interval);
+}
+
+sub active_gain {
+       my $self = shift;
+       return SDL::ActiveEventGain($$self);
+}
+
+sub active_state {
+       my $self = shift;
+       return SDL::ActiveEventState($$self);
+}
+
+sub key_state {
+       my $self = shift;
+       return SDL::KeyEventState($$self);
+}
+
+sub key_sym {
+       my $self = shift;
+       return SDL::KeyEventSym($$self);
+}
+
+sub key_name {
+       my $self = shift;
+       return SDL::GetKeyName(SDL::KeyEventSym($$self));
+}
+
+sub key_mod {
+       my $self = shift;
+       return SDL::KeyEventMod($$self);
+}
+
+sub key_unicode {
+       my $self = shift;
+       return SDL::KeyEventUnicode($$self);
+}
+
+sub key_scancode {
+       my $self = shift;
+       return SDL::KeyEventScanCode($$self);
+}
+
+sub motion_state {
+       my $self = shift;
+       return SDL::MouseMotionState($$self);
+}
+
+sub motion_x {
+       my $self = shift;
+       return SDL::MouseMotionX($$self);
+}
+
+sub motion_y {
+       my $self = shift;
+       return SDL::MouseMotionY($$self);
+}
+
+sub motion_xrel {
+       my $self = shift;
+       return SDL::MouseMotionXrel($$self);
+}
+
+sub motion_yrel {
+       my $self = shift;
+       return SDL::MouseMotionYrel($$self);
+}
+
+sub button_state {
+       my $self = shift;
+       return SDL::MouseButtonState($$self);
+}
+
+sub button_x {
+       my $self = shift;
+       return SDL::MouseButtonX($$self);
+}
+
+sub button_y {
+       my $self = shift;
+       return SDL::MouseButtonY($$self);
+}
+
+sub button {
+       my $self = shift;
+       return SDL::MouseButton($$self);
+}
+
+sub resize_w {
+       my $self = shift;
+       SDL::ResizeEventW($$self);
+}
+
+sub resize_h {
+       my $self = shift;
+       SDL::ResizeEventH($$self);
+}
+
+1;
+
+__END__;
+
+=pod
+
+=head1 NAME
+
+SDL::Event - a SDL perl extension
+
+=head1 SYNOPSIS
+
+ use SDL::Event;
+ my $event = new SDL::Event;             # create a new event
+ while ($event->wait()) {
+       my $type = $event->type();      # get event type
+       # ... handle event
+       exit if $type == SDL_QUIT;
+ }
+=head1 DESCRIPTION
+
+C<SDL::Event> offers an object-oriented approach to SDL events. By creating
+an instance of SDL::Event via new() you can wait for events, and then determine
+the type of the event and take an appropriate action.
+
+=head1 EXAMPLE
+
+Here is an example of a simple event handler loop routine.
+See also L<SDL::App::loop>.
+
+       sub loop {
+               my ($self,$href) = @_;
+               my $event = new SDL::Event;
+               while ( $event->wait() ) {
+                       # ... insert here your event handling like:
+                       if ( ref($$href{$event->type()}) eq "CODE" ) {
+                               &{$$href{$event->type()}}($event);
+                               $self->sync();
+                       }
+               }
+       }
+
+=head1 METHODS
+
+=head2 new()
+
+Create a new event object.
+
+=head2 type()
+
+Returns the type of the event, see list of exported symbols for which are
+available.
+
+=head2 pump()
+
+=head2 poll()
+
+=head2 wait()
+
+Waits for an event end returns then. Always returns true.
+
+=head2 set( type, state )
+
+Set the state for all events of the given event's type
+
+=head2 set_unicode( toggle )
+
+Toggle unicode on the event.
+
+=head2 set_key_repeat( delay, interval)
+
+Sets the delay and intervall of the key repeat rate (e.g. when a user
+holds down a key on the keyboard).
+
+=head2 active_gain()
+
+=head2 active_state()
+
+=head2 key_state()
+
+=head2 key_sym()
+
+=head2 key_name()
+
+=head2 key_mod()
+
+=head2 key_unicode()
+
+=head2 key_scancode()
+
+=head2 motion_state()
+
+=head2 motion_x()
+
+Returns the motion of the mouse in X direction as an absolute value.
+
+=head2 motion_y()
+
+Returns the motion of the mouse in Y direction as an absolute value.
+
+=head2 motion_xrel()
+
+Returns the motion of the mouse in X direction as a relative value.
+
+=head2 motion_yrel()
+
+Returns the motion of the mouse in Y direction as a relative value.
+
+=head2 button_state()
+
+Returns the state of the mouse buttons.
+
+=head2 button_x()
+
+=head2 button_y()
+
+=head2 button()
+
+=head1 AUTHOR
+
+David J. Goehrig
+Documentation by Tels <http://bloodgate.com/>
+
+=head1 SEE ALSO
+
+L<perl> L<SDL::App>
+
+=cut
diff --git a/lib/SDL/Font.pm b/lib/SDL/Font.pm
new file mode 100644 (file)
index 0000000..a9ffd88
--- /dev/null
@@ -0,0 +1,94 @@
+#!/usr/bin/env perl
+#
+# Font.pm
+#
+# Copyright (C) 2005 David J. Goehrig <dgoehrig@cpan.org>
+#
+# ------------------------------------------------------------------------------
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+# 
+# This library 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
+# Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+#
+# ------------------------------------------------------------------------------
+#
+# Please feel free to send questions, suggestions or improvements to:
+#
+#      David J. Goehrig
+#      dgoehrig@cpan.org
+#
+
+package SDL::Font;
+
+use strict;
+use SDL;
+use SDL::SFont;
+use SDL::Surface;
+
+use vars qw(@ISA $CurrentFont );
+           
+
+@ISA = qw(SDL::Surface);
+
+
+sub new {
+       my $proto = shift;
+       my $class = ref($proto) || $proto;
+       my $self = \SDL::SFont::NewFont(shift);
+       bless $self,$class;
+       return $self;   
+}
+
+sub DESTROY {
+       my $self = shift;
+       SDL::FreeSurface($$self);
+}
+
+sub use ($) {
+       my $self = shift;
+       $CurrentFont = $self;
+       if ( $self->isa('SDL::Font')) {
+               SDL::SFont::UseFont($$self);
+       }       
+}
+
+1;
+
+__END__;
+
+=pod
+
+
+=head1 NAME
+
+SDL::Font - a SDL perl extension
+
+=head1 SYNOPSIS
+
+  $font = new Font "Font.png";
+  $font->use();
+       
+=head1 DESCRIPTION
+
+L<SDL::Font> provides an interface to loading and using SFont style 
+fonts with L<SDL::Surface> objects.  
+
+=head1 AUTHOR
+
+David J. Goehrig
+
+=head1 SEE ALSO
+
+L<perl> L<SDL::Surface>
+
+=cut
diff --git a/lib/SDL/MPEG.pm b/lib/SDL/MPEG.pm
new file mode 100644 (file)
index 0000000..b9c9987
--- /dev/null
@@ -0,0 +1,175 @@
+#!/usr/bin/env perl
+#
+# MPEG.pm
+#
+# Copyright (C) 2005 David J. Goehrig <dgoehrig@cpan.org>
+#
+# ------------------------------------------------------------------------------
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+# 
+# This library 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
+# Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+#
+# ------------------------------------------------------------------------------
+#
+# Please feel free to send questions, suggestions or improvements to:
+#
+#      David J. Goehrig
+#      dgoehrig@cpan.org
+#
+
+package SDL::MPEG;
+
+use strict;
+use SDL;
+
+sub new {
+       my $proto = shift;
+       my $class = ref($proto) || $proto;
+       my %options = @_;
+
+       verify (%options, qw/ -from / ) if $SDL::DEBUG;
+
+       my $self;
+       if ( $options{-from} ) {
+               die "SDL::MPEG::new -from requires a SDL::Video object\n"
+                       unless $options{-from}->isa('SDL::Video');
+
+               $self = \SDL::SMPEGGetInfo(${$options{-from}});
+       } else {
+               $self = \SDL::NewSMPEGInfo();
+       }       
+       bless $self,$class;
+       return $self;
+}
+
+sub DESTROY {
+       SDL::FreeSMPEGInfo(${$_[0]});
+}
+
+sub has_audio {
+       SDL::SMPEGInfoHasAudio(${$_[0]});
+}
+
+sub has_video {
+       SDL::SMPEGInfoHasVideo(${$_[0]});
+}
+
+sub width {
+       SDL::SMPEGInfoWidth(${$_[0]});
+}
+
+sub height {
+       SDL::SMPEGInfoHeight(${$_[0]});
+}
+
+sub size {
+       SDL::SMPEGInfoTotalSize(${$_[0]});
+}
+
+sub offset {
+       SDL::SMPEGInfoCurrentOffset(${$_[0]});
+}
+
+sub frame {
+       SDL::SMPEGInfoCurrentFrame(${$_[0]});
+}
+
+sub fps {
+       SDL::SMPEGInfoCurrentFPS(${$_[0]});
+}
+
+sub time {
+       SDL::SMPEGInfoCurrentTime(${$_[0]});
+}
+
+sub length {
+       SDL::SMPEGInfoTotalTime(${$_[0]});
+}
+
+1;
+
+__END__;
+
+=pod
+
+
+=head1 NAME
+
+SDL::MPEG - a SDL perl extension
+
+=head1 SYNOPSIS
+
+  $info = new SDL::MPEG -from => $mpeg;
+
+=head1 DESCRIPTION
+
+C<SDL::MPEG> provides an interface to quering the status
+of a SMPEG stream.  
+
+=head2 METHODS 
+
+=over 4
+
+=item *
+
+C<SDL::MPEG::has_audio> returns true if it has audio track
+
+=item *
+
+C<SDL::MPEG::has_video> returns true if it has a video track
+
+=item *
+
+C<SDL::MPEG::width> returns the width of the video in pixels
+
+=item *
+
+C<SDL::MPEG::height> returns the height of the video in pixels
+
+=item *
+
+C<SDL::MPEG::size> returns the total size of the clip in bytes
+
+=item *
+
+C<SDL::MPEG::offset> returns the offset into the clip in bytes
+
+=item *
+
+C<SDL::MPEG::frame> returns the offset into the clip in fames 
+
+=item *
+
+C<SDL::MPEG::fps> returns the play rate in frames per second
+
+=item *
+
+C<SDL::MPEG::time> returns the current play time in seconds
+
+=item *
+
+C<SDL::MPEG::length> returns the total play time in seconds
+
+=back
+
+=head1 AUTHOR
+
+David J. Goehrig
+
+=head1 SEE ALSO
+
+perl(1) SDL::Video(3)
+
+=cut
+
diff --git a/lib/SDL/Mixer.pm b/lib/SDL/Mixer.pm
new file mode 100644 (file)
index 0000000..86b627c
--- /dev/null
@@ -0,0 +1,417 @@
+#!/usr/bin/env perl
+#
+# Mixer.pm
+#
+# Copyright (C) 2005 David J. Goehrig <dgoehrig@cpan.org>
+#
+# ------------------------------------------------------------------------------
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+# 
+# This library 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
+# Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+#
+# ------------------------------------------------------------------------------
+#
+# Please feel free to send questions, suggestions or improvements to:
+#
+#      David J. Goehrig
+#      dgoehrig@cpan.org
+#
+
+package SDL::Mixer;
+
+use strict;
+use SDL;
+use SDL::Sound;
+use SDL::Music;
+
+BEGIN {
+}
+
+$SDL::Mixer::initialized = 0;
+
+sub new {
+       my $proto = shift;
+       my $class = ref($proto) || $proto;
+       my $self = {};
+       my %options = @_;
+       my $frequency = $options{-frequency} || $options{-rate} || SDL::MIX_DEFAULT_FREQUENCY();
+       my $format = $options{-format} || SDL::MIX_DEFAULT_FORMAT();
+       my $channels = $options{-channels} || SDL::MIX_DEFAULT_CHANNELS();
+       my $size = $options{-size} || 4096;
+       unless ( $SDL::Mixer::initialized ) {
+               SDL::MixOpenAudio($frequency,$format,$channels,$size ) && 
+                       die SDL::GetError(); 
+               $SDL::Mixer::initialized = 1;
+       } else {
+               ++$SDL::Mixer::initialized;
+       }
+       bless $self,$class;
+       return $self;
+}      
+
+sub DESTROY {
+       my $self = shift;
+       --$SDL::Mixer::initialized;
+       unless ($SDL::Mixer::initialized) {
+               SDL::MixCloseAudio();
+       }
+}
+
+
+sub query_spec () {
+       my ($status,$freq,$format,$channels) = SDL::MixQuerySpec();
+       my %hash = ( -status => $status, -frequency => $freq, 
+                       -format => $format, -channels => $channels );
+       return \%hash;
+}
+
+sub reserve_channels ($$) {
+       my ($self,$channels) = @_;
+       return SDL::MixReserveChannels($channels);
+}
+
+sub allocate_channels ($$) {
+       my ($self,$channels) = @_;
+       return SDL::MixAllocateChannels($channels);
+}
+
+sub group_channel ($$$) {
+       my ($self,$channel,$group) = @_;
+       return SDL::MixGroupChannel($channel, $group);
+}
+
+sub group_channels ($$$$) {
+       my ($self,$from,$to,$group) = @_;
+       return SDL::MixGroupChannels($from,$to,$group);
+}
+
+sub group_available ($$) {
+       my ($self,$group) = @_; 
+       return SDL::MixGroupAvailable($group);
+}
+
+sub group_count ($$) {
+       my ($self,$group) = @_; 
+       return SDL::MixGroupCount($group);
+}      
+
+sub group_oldest ($$) {
+       my ($self,$group) = @_; 
+       return SDL::MixGroupOldest($group);
+}      
+
+sub group_newer ($$) {
+       my ($self,$group) = @_; 
+       return SDL::MixGroupNewer($group);
+}      
+
+sub play_channel ($$$$;$) {
+       my ($self,$channel,$chunk,$loops,$ticks) = @_;
+       $ticks ||= -1; 
+       return SDL::MixPlayChannelTimed($channel,$$chunk,$loops,$ticks);
+}
+
+sub play_music ($$$) {
+       my ($self,$music,$loops) = @_;
+       return SDL::MixPlayMusic($$music,$loops);
+}
+
+sub fade_in_channel ($$$$$;$) {
+       my ($self,$channel,$chunk,$loops,$ms,$ticks) = @_;
+       $ticks ||= -1;
+       return SDL::MixFadeInChannelTimed($channel,$$chunk,$loops,$ms,$ticks);
+}
+
+sub fade_in_music ($$$$) {
+       my ($self,$music,$loops,$ms) = @_;
+       return SDL::MixFadeInMusic($$music,$loops,$ms);
+}
+
+sub channel_volume ($$$) {
+       my ($self,$channel,$volume) = @_;
+       return SDL::MixVolume($channel,$volume);
+}
+
+sub music_volume ($$) {
+       my ($self,$volume) = @_;
+       return SDL::MixVolumeMusic($volume);
+}
+
+sub halt_channel ($$) {
+       my ($self,$channel) = @_;
+       return SDL::MixHaltChannel($channel);
+}
+
+sub halt_group ($$) {
+       my ($self,$group) = @_;
+       return SDL::MixHaltGroup($group);
+}
+
+sub halt_music (){
+       return SDL::MixHaltMusic();
+}
+
+sub channel_expire ($$$) {
+       my ($self,$channel,$ticks) = @_;
+       return SDL::MixExpireChannel($channel,$ticks);
+}
+
+sub fade_out_channel ($$$) {
+       my ($self,$channel,$ms) = @_;
+       return SDL::MixFadeOutChannel($channel,$ms);
+}
+
+sub fade_out_group ($$$) {
+       my ($self,$group,$ms) = @_;
+       return SDL::MixFadeOutGroup($group,$ms);
+}
+
+sub fade_out_music ($$) {
+       my ($self,$ms) = @_;
+       return SDL::MixFadeOutMusic($ms);
+}
+
+sub fading_music () {
+       return SDL::MixFadingMusic();
+}
+
+sub fading_channel ($$) {
+       my ($self,$channel) = @_;
+       return SDL::MixFadingChannel($channel);
+}
+       
+sub pause ($$) {
+       my ($self,$channel) = @_;
+       SDL::MixPause($channel);
+}
+
+sub resume ($$) {
+       my ($self,$channel) = @_;
+       SDL::MixResume($channel);
+}
+
+sub paused ($$) {
+       my ($self,$channel) = @_;
+       return SDL::MixPaused($channel);
+}
+
+sub pause_music () {
+       SDL::MixPauseMusic();
+}
+
+sub resume_music () {
+       SDL::MixResumeMusic();
+}
+
+sub rewind_music (){
+       SDL::MixRewindMusic();
+}
+
+sub music_paused (){
+       return SDL::MixPausedMusic();
+}
+
+sub playing ($$) {
+       my ($self,$channel) = @_;
+       return SDL::MixPlaying($channel);
+}
+
+sub playing_music () {
+       return SDL::MixPlayingMusic();
+}
+
+1;
+
+__END__;
+
+=pod
+
+=head1 NAME
+
+SDL::Mixer - a SDL perl extension
+
+=head1 SYNOPSIS
+
+  $mixer = new SDL::Mixer      -frequency => MIX_DEFAULT_FREQUENCY,
+                               -format => MIX_DEFAULT_FORMAT,
+                               -channels => MIX_DEFAULT_CHANNELS,
+                               -size => 4096;
+
+=head1 DESCRIPTION
+
+SDL::Mixer allows you access to the SDL mixer library, enablig sound and
+music volume setting, playing, pausing and resuming, as well as fading
+the sound and music in and out.
+
+=head1 METHODS
+  
+=head2 new()
+
+       $mixer = SDL::Mixer->new(       -frequency => MIX_DEFAULT_FREQUENCY,
+                                       -format    => MIX_DEFAULT_FORMAT,
+                                       -channels  => MIX_DEFAULT_CHANNELS,
+                                       -size      => 4096);
+
+Creates a new SDL::Mixer object. C<$size> is the buffer size in bytes.
+
+=head2 query_spec()
+
+       my $specs = SDL::Mixer::query_spec();
+
+Returns a hash reference, containing the following keys and their respective
+values:
+
+       -status
+       -frequency
+       -channels
+       -format
+
+=head2 reserve_channels
+
+       $mixer->reserve_channels(4);
+
+Reserve so many channels.
+
+=head2 allocate_channels()
+
+       $mixer->reserve_channels(2);
+
+Allocate so many channels.
+
+=head2 group_channel(channel,group)
+
+Group the channel number C<$channel> into group C<$group>.
+
+=head2 group_channels(from,to,group)
+
+Groups a range of channels
+
+=head2 group_available(group)
+
+Return true when the group is available.
+
+=head2 group_count(group)
+
+Returns the number of channels in the group
+
+=head2 group_oldest()
+
+
+=head2 group_newer()
+
+
+=head2 play_channel()
+
+
+=head2 play_music()
+
+Play C<$music> C<$loop> times.
+
+=head2 fade_in_channel(channel,chunk,loops,ms,ticks)
+
+Fades a channel in
+
+=head2 fade_in_music(music,loops,ms)
+
+Fades the music in over a number of ms, looping as it does
+
+=head2 channel_volume(channel,volume)
+
+Sets the volume for a single channel
+
+=head2 mucis_volume(volume)
+
+Set the volume for the music.
+
+=head2 halt_channel(channel)
+
+Stops a specific channel
+
+=head2 halt_group(group)
+
+Stops a group of channels
+
+=head2 halt_music()
+
+Stops the music
+
+=head2 channel_expire(channel,ticks)
+
+Ignores the channel after C<ticks> has expired
+
+=head2 fade_out_channel(channel,ms)
+
+Fade the channel number C<$channel> in C<$ms> ms out.
+
+=head2 fade_out_group(group,ms)
+       
+Fade the channel group C<$group> in C<$ms> ms out.
+
+=head2 fade_out_music(ms)
+       
+Fade the music in C<$ms> ms out.
+
+=head2 fading_music()
+
+Return true when the music is currently fading in or out.
+
+=head2 fading_channel()
+
+Return true when the channel number C<$channel> is currently fading in or out.
+
+=head2 pause( channel )
+
+Pause the channel C<$channel>.
+
+=head2 resume(channel)
+
+Resume the channel C<$channel>.
+
+=head2 paused()
+
+Return true when the channel is currently paused.
+
+=head2 pause_music()
+
+Pause the music play.
+
+=head2 resume_music()
+       
+Resume the music play.
+
+=head2 rewind_music()
+
+Resets the music file to the beginning
+
+=head2 music_paused()
+
+Return true when the music is currently paused.
+
+=head2 playing()
+
+Return true when the channel is currently playing.
+
+=head2 playing_music ()
+
+Return true when the music is currently playing.
+
+=head1 AUTHORS 
+
+David J. Goehrig, basic doc added by Tels <http://bloodgate.com>.
+
+=head1 SEE ALSO
+
+L<perl>, L<SDL::Music> and L<SDL::Sound>.
+
+=cut
diff --git a/lib/SDL/Music.pm b/lib/SDL/Music.pm
new file mode 100644 (file)
index 0000000..3184d42
--- /dev/null
@@ -0,0 +1,78 @@
+#!/usr/bin/env perl
+#
+# Music.pm
+#
+# Copyright (C) 2005 David J. Goehrig <dgoehrig@cpan.org>
+#
+# ------------------------------------------------------------------------------
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+# 
+# This library 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
+# Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+#
+# ------------------------------------------------------------------------------
+#
+# Please feel free to send questions, suggestions or improvements to:
+#
+#      David J. Goehrig
+#      dgoehrig@cpan.org
+#
+
+package SDL::Music;
+
+use strict;
+use SDL;
+
+sub new {
+       my $proto = shift;      
+       my $class = ref($proto) || $proto;
+       my $filename = shift;
+       my $self = \SDL::MixLoadMusic($filename);
+       die SDL::GetError() unless $$self;
+       bless $self,$class;
+       return $self;
+}
+
+sub DESTROY {
+       my $self = shift;
+       SDL::MixFreeMusic($$self);
+}
+
+1;
+
+__END__;
+
+=pod
+
+=head1 NAME
+
+SDL::Music - a perl extension
+
+=head1 DESCRIPTION
+
+L<SDL::Music> is used to load music files for use with L<SDL::Mixer>.
+To load a music file one simply creates a new object passing the filename 
+to the constructor:
+
+       my $music = new SDL::Music 'my_song.ogg';
+
+
+=head1 AUTHOR
+
+David J. Goehrig
+
+=head1 SEE ALSO
+
+L<perl> L<SDL::Mixer>
+
+=cut
diff --git a/lib/SDL/OpenGL.pm b/lib/SDL/OpenGL.pm
new file mode 100644 (file)
index 0000000..b89c913
--- /dev/null
@@ -0,0 +1,123 @@
+#!/usr/bin/env perl
+#
+# OpenGL.pm
+#
+# Copyright (C) 2005 David J. Goehrig <dgoehrig@cpan.org>
+#
+# ------------------------------------------------------------------------------
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+# 
+# This library 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
+# Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+#
+# ------------------------------------------------------------------------------
+#
+# Please feel free to send questions, suggestions or improvements to:
+#
+#      David J. Goehrig
+#      dgoehrig@cpan.org
+#
+
+package SDL::OpenGL;
+
+require Exporter;
+require DynaLoader;
+use vars qw(
+       @EXPORT
+       @ISA
+);
+@ISA=qw(Exporter DynaLoader);
+
+use SDL;
+
+bootstrap SDL::OpenGL;
+for ( keys %SDL::OpenGL:: ) {
+       if (/^gl/) {
+               push @EXPORT,$_;
+       }
+}
+
+use SDL::OpenGL::Constants;
+
+1;
+
+__END__;
+
+=pod
+
+
+
+=head1 NAME
+
+SDL::OpenGL - a perl extension
+
+=head1 DESCRIPTION
+
+L<SDL::OpenGL> is a perl module which when used by your application
+exports the gl* and glu* functions into your application's primary namespace.
+Most of the functions described in the OpenGL 1.3 specification are currently
+supported in this fashion.  As the implementation of the OpenGL bindings that
+comes with SDL_perl is largely type agnositic, there is no need to decline
+the function names in the fashion that is done in the C API. For example,
+glVertex3d is simply glVertex, and perl just does the right thing with regards
+to types.
+
+=head1 CAVEATS
+
+The following methods work different in Perl than in C:
+
+=over 2
+
+=item glCallLists
+
+        glCallLists(@array_of_numbers);
+
+Unlike the C function, which get's passed a count, a type and a list of
+numbers, the Perl equivalent only takes a list of numbers.
+
+Note that this is slow, since it needs to allocate memory and construct a
+list of numbers from the given scalars. For a faster version see
+L<glCallListsString>.
+
+=back
+
+The following methods exist in addition to the normal OpenGL specification:
+
+=over 2
+
+=item glCallListsString
+
+        glCallListsString($string);
+
+Works like L<glCallLists()>, except that it needs only one parameter, a scalar
+holding a string. The string is interpreted as a set of bytes, and each of
+these will be passed to glCallLists as GL_BYTE. This is faster than
+glCallLists, so you might want to pack your data like this:
+
+        my $lists = pack("C", @array_of_numbers);
+
+And later use it like this:
+
+        glCallListsString($lists);
+
+=back
+
+=head1 AUTHOR
+
+David J. Goehrig
+
+=head1 SEE ALSO
+
+L<perl> L<SDL::App>
+
+=cut
diff --git a/lib/SDL/OpenGL/Constants.pm b/lib/SDL/OpenGL/Constants.pm
new file mode 100644 (file)
index 0000000..5a4223e
--- /dev/null
@@ -0,0 +1,3172 @@
+#!/usr/bin/env perl
+#
+# Constants.pm
+#
+# Copyright (C) 2005 David J. Goehrig <dgoehrig@cpan.org>
+#
+# ------------------------------------------------------------------------------
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+# 
+# This library 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
+# Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+#
+# ------------------------------------------------------------------------------
+#
+# Please feel free to send questions, suggestions or improvements to:
+#
+#      David J. Goehrig
+#      dgoehrig@cpan.org
+#
+
+package SDL::OpenGL::Constants;
+
+@EXPORT=qw(
+       GLU_AUTO_LOAD_MATRIX
+       GLU_CULLING
+       GLU_DISPLAY_MODE
+       GLU_DOMAIN_DISTANCE
+       GLU_FILL
+       GLU_MAP1_TRIM_2
+       GLU_MAP1_TRIM_3
+       GLU_NURBS_BEGIN
+       GLU_NURBS_BEGIN_DATA
+       GLU_NURBS_COLOR
+       GLU_NURBS_COLOR_DATA
+       GLU_NURBS_END
+       GLU_NURBS_END_DATA
+       GLU_NURBS_ERROR
+       GLU_NURBS_MODE
+       GLU_NURBS_NORMAL
+       GLU_NURBS_NORMAL_DATA
+       GLU_NURBS_RENDERER
+       GLU_NURBS_TESSELLATOR
+       GLU_NURBS_TEXTURE_COORD
+       GLU_NURBS_TEXTURE_COORD_DATA
+       GLU_NURBS_VERTEX
+       GLU_NURBS_VERTEX_DATA
+       GLU_OBJECT_PARAMETRIC_ERROR
+       GLU_OBJECT_PATH_LENGTH
+       GLU_OUTLINE_PATCH
+       GLU_OUTLINE_POLYGON
+       GLU_PARAMETRIC_TOLERANCE
+       GLU_PATH_LENGTH
+       GLU_SAMPLING_METHOD
+       GLU_SAMPLING_TOLERANCE
+       GLU_TESS_BOUNDARY_ONLY
+       GLU_TESS_TOLERANCE
+       GLU_TESS_WINDING_ABS_GEQ_TWO
+       GLU_TESS_WINDING_NEGATIVE
+       GLU_TESS_WINDING_NONZERO
+       GLU_TESS_WINDING_ODD
+       GLU_TESS_WINDING_POSITIVE
+       GLU_TESS_WINDING_RULE
+       GLU_U_STEP
+       GLU_V_STEP
+       GL_2D
+       GL_2_BYTES
+       GL_3D
+       GL_3D_COLOR
+       GL_3D_COLOR_TEXTURE
+       GL_3_BYTES
+       GL_4D_COLOR_TEXTURE
+       GL_4_BYTES
+       GL_ABGR_EXT
+       GL_ACCUM
+       GL_ACCUM_ALPHA_BITS
+       GL_ACCUM_BLUE_BITS
+       GL_ACCUM_BUFFER_BIT
+       GL_ACCUM_CLEAR_VALUE
+       GL_ACCUM_GREEN_BITS
+       GL_ACCUM_RED_BITS
+       GL_ACTIVE_STENCIL_FACE_EXT
+       GL_ACTIVE_TEXTURE
+       GL_ACTIVE_TEXTURE_ARB
+       GL_ADD
+       GL_ADD_SIGNED
+       GL_ADD_SIGNED_ARB
+       GL_ADD_SIGNED_EXT
+       GL_ALIASED_LINE_WIDTH_RANGE
+       GL_ALIASED_POINT_SIZE_RANGE
+       GL_ALL_ATTRIB_BITS
+       GL_ALL_COMPLETED_NV
+       GL_ALL_EXTENSIONS_NV
+       GL_ALPHA
+       GL_ALPHA12
+       GL_ALPHA16
+       GL_ALPHA4
+       GL_ALPHA8
+       GL_ALPHA_BIAS
+       GL_ALPHA_BITS
+       GL_ALPHA_SCALE
+       GL_ALPHA_TEST
+       GL_ALPHA_TEST_FUNC
+       GL_ALPHA_TEST_REF
+       GL_ALWAYS
+       GL_AMBIENT
+       GL_AMBIENT_AND_DIFFUSE
+       GL_AND
+       GL_AND_INVERTED
+       GL_AND_REVERSE
+       GL_ARRAY_BUFFER_ARB
+       GL_ARRAY_BUFFER_BINDING_ARB
+       GL_ARRAY_ELEMENT_LOCK_COUNT_EXT
+       GL_ARRAY_ELEMENT_LOCK_FIRST_EXT
+       GL_ATTRIB_ARRAY_POINTER_NV
+       GL_ATTRIB_ARRAY_SIZE_NV
+       GL_ATTRIB_ARRAY_STRIDE_NV
+       GL_ATTRIB_ARRAY_TYPE_NV
+       GL_ATTRIB_STACK_DEPTH
+       GL_AUTO_NORMAL
+       GL_AUX0
+       GL_AUX1
+       GL_AUX2
+       GL_AUX3
+       GL_AUX_BUFFERS
+       GL_BACK
+       GL_BACK_LEFT
+       GL_BACK_RIGHT
+       GL_BGR
+       GL_BGRA
+       GL_BGRA_EXT
+       GL_BGR_EXT
+       GL_BIAS_BY_NEGATIVE_ONE_HALF_NV
+       GL_BITMAP
+       GL_BITMAP_TOKEN
+       GL_BLEND
+       GL_BLEND_COLOR
+       GL_BLEND_COLOR_EXT
+       GL_BLEND_DST
+       GL_BLEND_DST_ALPHA
+       GL_BLEND_DST_ALPHA_EXT
+       GL_BLEND_DST_RGB
+       GL_BLEND_DST_RGB_EXT
+       GL_BLEND_EQUATION
+       GL_BLEND_EQUATION_EXT
+       GL_BLEND_SRC
+       GL_BLEND_SRC_ALPHA
+       GL_BLEND_SRC_ALPHA_EXT
+       GL_BLEND_SRC_RGB
+       GL_BLEND_SRC_RGB_EXT
+       GL_BLUE
+       GL_BLUE_BIAS
+       GL_BLUE_BITS
+       GL_BLUE_SCALE
+       GL_BUFFER_ACCESS_ARB
+       GL_BUFFER_MAPPED_ARB
+       GL_BUFFER_MAP_POINTER_ARB
+       GL_BUFFER_SIZE_ARB
+       GL_BUFFER_USAGE_ARB
+       GL_BYTE
+       GL_C3F_V3F
+       GL_C4F_N3F_V3F
+       GL_C4UB_V2F
+       GL_C4UB_V3F
+       GL_CCW
+       GL_CLAMP
+       GL_CLAMP_TO_BORDER
+       GL_CLAMP_TO_BORDER_ARB
+       GL_CLAMP_TO_EDGE
+       GL_CLAMP_TO_EDGE_EXT
+       GL_CLEAR
+       GL_CLIENT_ACTIVE_TEXTURE
+       GL_CLIENT_ACTIVE_TEXTURE_ARB
+       GL_CLIENT_ALL_ATTRIB_BITS
+       GL_ALL_CLIENT_ATTRIB_BITS
+       GL_CLIENT_ATTRIB_STACK_DEPTH
+       GL_CLIENT_PIXEL_STORE_BIT
+       GL_CLIENT_VERTEX_ARRAY_BIT
+       GL_CLIP_PLANE0
+       GL_CLIP_PLANE1
+       GL_CLIP_PLANE2
+       GL_CLIP_PLANE3
+       GL_CLIP_PLANE4
+       GL_CLIP_PLANE5
+       GL_CLIP_VOLUME_CLIPPING_HINT_EXT
+       GL_COEFF
+       GL_COLOR
+       GL_COLOR_ARRAY
+       GL_COLOR_ARRAY_BUFFER_BINDING_ARB
+       GL_COLOR_ARRAY_COUNT_EXT
+       GL_COLOR_ARRAY_EXT
+       GL_COLOR_ARRAY_POINTER
+       GL_COLOR_ARRAY_POINTER_EXT
+       GL_COLOR_ARRAY_SIZE
+       GL_COLOR_ARRAY_SIZE_EXT
+       GL_COLOR_ARRAY_STRIDE
+       GL_COLOR_ARRAY_STRIDE_EXT
+       GL_COLOR_ARRAY_TYPE
+       GL_COLOR_ARRAY_TYPE_EXT
+       GL_COLOR_BUFFER_BIT
+       GL_COLOR_CLEAR_VALUE
+       GL_COLOR_INDEX
+       GL_COLOR_INDEX12_EXT
+       GL_COLOR_INDEX16_EXT
+       GL_COLOR_INDEX1_EXT
+       GL_COLOR_INDEX2_EXT
+       GL_COLOR_INDEX4_EXT
+       GL_COLOR_INDEX8_EXT
+       GL_COLOR_INDEXES
+       GL_COLOR_LOGIC_OP
+       GL_COLOR_MATERIAL
+       GL_COLOR_MATERIAL_FACE
+       GL_COLOR_MATERIAL_PARAMETER
+       GL_COLOR_MATRIX
+       GL_COLOR_MATRIX_STACK_DEPTH
+       GL_COLOR_SUM
+       GL_COLOR_SUM_ARB
+       GL_COLOR_SUM_CLAMP_NV
+       GL_COLOR_SUM_EXT
+       GL_COLOR_TABLE
+       GL_COLOR_TABLE_ALPHA_SIZE
+       GL_COLOR_TABLE_ALPHA_SIZE_EXT
+       GL_COLOR_TABLE_BIAS
+       GL_COLOR_TABLE_BLUE_SIZE
+       GL_COLOR_TABLE_BLUE_SIZE_EXT
+       GL_COLOR_TABLE_FORMAT
+       GL_COLOR_TABLE_FORMAT_EXT
+       GL_COLOR_TABLE_GREEN_SIZE
+       GL_COLOR_TABLE_GREEN_SIZE_EXT
+       GL_COLOR_TABLE_INTENSITY_SIZE
+       GL_COLOR_TABLE_INTENSITY_SIZE_EXT
+       GL_COLOR_TABLE_LUMINANCE_SIZE
+       GL_COLOR_TABLE_LUMINANCE_SIZE_EXT
+       GL_COLOR_TABLE_RED_SIZE
+       GL_COLOR_TABLE_RED_SIZE_EXT
+       GL_COLOR_TABLE_SCALE
+       GL_COLOR_TABLE_WIDTH
+       GL_COLOR_TABLE_WIDTH_EXT
+       GL_COLOR_WRITEMASK
+       GL_COMBINE
+       GL_COMBINE4_NV
+       GL_COMBINER0_NV
+       GL_COMBINER1_NV
+       GL_COMBINER2_NV
+       GL_COMBINER3_NV
+       GL_COMBINER4_NV
+       GL_COMBINER5_NV
+       GL_COMBINER6_NV
+       GL_COMBINER7_NV
+       GL_COMBINER_AB_DOT_PRODUCT_NV
+       GL_COMBINER_AB_OUTPUT_NV
+       GL_COMBINER_BIAS_NV
+       GL_COMBINER_CD_DOT_PRODUCT_NV
+       GL_COMBINER_CD_OUTPUT_NV
+       GL_COMBINER_COMPONENT_USAGE_NV
+       GL_COMBINER_INPUT_NV
+       GL_COMBINER_MAPPING_NV
+       GL_COMBINER_MUX_SUM_NV
+       GL_COMBINER_SCALE_NV
+       GL_COMBINER_SUM_OUTPUT_NV
+       GL_COMBINE_ALPHA
+       GL_COMBINE_ALPHA_ARB
+       GL_COMBINE_ALPHA_EXT
+       GL_COMBINE_ARB
+       GL_COMBINE_EXT
+       GL_COMBINE_RGB
+       GL_COMBINE_RGB_ARB
+       GL_COMBINE_RGB_EXT
+       GL_COMPARE_R_TO_TEXTURE
+       GL_COMPARE_R_TO_TEXTURE_ARB
+       GL_COMPILE
+       GL_COMPILE_AND_EXECUTE
+       GL_COMPRESSED_ALPHA
+       GL_COMPRESSED_ALPHA_ARB
+       GL_COMPRESSED_INTENSITY
+       GL_COMPRESSED_INTENSITY_ARB
+       GL_COMPRESSED_LUMINANCE
+       GL_COMPRESSED_LUMINANCE_ALPHA
+       GL_COMPRESSED_LUMINANCE_ALPHA_ARB
+       GL_COMPRESSED_LUMINANCE_ARB
+       GL_COMPRESSED_RGB
+       GL_COMPRESSED_RGBA
+       GL_COMPRESSED_RGBA_ARB
+       GL_COMPRESSED_RGBA_S3TC_DXT1_EXT
+       GL_COMPRESSED_RGBA_S3TC_DXT3_EXT
+       GL_COMPRESSED_RGBA_S3TC_DXT5_EXT
+       GL_COMPRESSED_RGB_ARB
+       GL_COMPRESSED_RGB_S3TC_DXT1_EXT
+       GL_COMPRESSED_TEXTURE_FORMATS
+       GL_COMPRESSED_TEXTURE_FORMATS_ARB
+       GL_CONSTANT
+       GL_CONSTANT_ALPHA
+       GL_CONSTANT_ALPHA_EXT
+       GL_CONSTANT_ARB
+       GL_CONSTANT_ATTENUATION
+       GL_CONSTANT_BORDER
+       GL_CONSTANT_COLOR
+       GL_CONSTANT_COLOR0_NV
+       GL_CONSTANT_COLOR1_NV
+       GL_CONSTANT_COLOR_EXT
+       GL_CONSTANT_EXT
+       GL_CONST_EYE_NV
+       GL_CONVOLUTION_1D
+       GL_CONVOLUTION_2D
+       GL_CONVOLUTION_BORDER_COLOR
+       GL_CONVOLUTION_BORDER_MODE
+       GL_CONVOLUTION_FILTER_BIAS
+       GL_CONVOLUTION_FILTER_SCALE
+       GL_CONVOLUTION_FORMAT
+       GL_CONVOLUTION_HEIGHT
+       GL_CONVOLUTION_WIDTH
+       GL_COORD_REPLACE_NV
+       GL_COPY
+       GL_COPY_INVERTED
+       GL_COPY_PIXEL_TOKEN
+       GL_CRYCBY_422_NVX
+       GL_CULL_FACE
+       GL_CULL_FACE_MODE
+       GL_CULL_FRAGMENT_NV
+       GL_CULL_MODES_NV
+       GL_CURRENT_ATTRIB_NV
+       GL_CURRENT_BIT
+       GL_CURRENT_COLOR
+       GL_CURRENT_FLUSHHOLD_NVX
+       GL_CURRENT_FOG_COORDINATE
+       GL_CURRENT_FOG_COORDINATE_EXT
+       GL_CURRENT_INDEX
+       GL_CURRENT_MATRIX_ARB
+       GL_CURRENT_MATRIX_NV
+       GL_CURRENT_MATRIX_STACK_DEPTH_ARB
+       GL_CURRENT_MATRIX_STACK_DEPTH_NV
+       GL_CURRENT_NORMAL
+       GL_CURRENT_OCCLUSION_QUERY_ID_NV
+       GL_CURRENT_RASTER_COLOR
+       GL_CURRENT_RASTER_DISTANCE
+       GL_CURRENT_RASTER_INDEX
+       GL_CURRENT_RASTER_POSITION
+       GL_CURRENT_RASTER_POSITION_VALID
+       GL_CURRENT_RASTER_TEXTURE_COORDS
+       GL_CURRENT_SECONDARY_COLOR
+       GL_CURRENT_SECONDARY_COLOR_EXT
+       GL_CURRENT_TEXTURE_COORDS
+       GL_CURRENT_VERTEX_ATTRIB_ARB
+       GL_CURRENT_VERTEX_WEIGHT_EXT
+       GL_CW
+       GL_DECAL
+       GL_DECR
+       GL_DECR_WRAP
+       GL_DECR_WRAP_EXT
+       GL_DEPENDENT_AR_TEXTURE_2D_NV
+       GL_DEPENDENT_GB_TEXTURE_2D_NV
+       GL_DEPENDENT_HILO_TEXTURE_2D_NV
+       GL_DEPENDENT_RGB_TEXTURE_3D_NV
+       GL_DEPENDENT_RGB_TEXTURE_CUBE_MAP_NV
+       GL_DEPTH
+       GL_DEPTH_BIAS
+       GL_DEPTH_BITS
+       GL_DEPTH_BOUNDS_NV
+       GL_DEPTH_BOUNDS_TEST_NV
+       GL_DEPTH_BUFFER_BIT
+       GL_DEPTH_CLAMP_NV
+       GL_DEPTH_CLEAR_VALUE
+       GL_DEPTH_COMPONENT
+       GL_DEPTH_COMPONENT16
+       GL_DEPTH_COMPONENT16_ARB
+       GL_DEPTH_COMPONENT16_SGIX
+       GL_DEPTH_COMPONENT24
+       GL_DEPTH_COMPONENT24_ARB
+       GL_DEPTH_COMPONENT24_SGIX
+       GL_DEPTH_COMPONENT32
+       GL_DEPTH_COMPONENT32_ARB
+       GL_DEPTH_COMPONENT32_SGIX
+       GL_DEPTH_FUNC
+       GL_DEPTH_RANGE
+       GL_DEPTH_SCALE
+       GL_DEPTH_STENCIL_NV
+       GL_DEPTH_STENCIL_TO_BGRA_NV
+       GL_DEPTH_STENCIL_TO_RGBA_NV
+       GL_DEPTH_TEST
+       GL_DEPTH_TEXTURE_MODE
+       GL_DEPTH_TEXTURE_MODE_ARB
+       GL_DEPTH_WRITEMASK
+       GL_DIFFUSE
+       GL_DISCARD_NV
+       GL_DISTANCE_ATTENUATION_EXT
+       GL_DITHER
+       GL_DOMAIN
+       GL_DONT_CARE
+       GL_DOT3_RGB
+       GL_DOT3_RGBA
+       GL_DOT3_RGBA_ARB
+       GL_DOT3_RGBA_EXT
+       GL_DOT3_RGB_ARB
+       GL_DOT3_RGB_EXT
+       GL_DOT_PRODUCT_AFFINE_DEPTH_REPLACE_NV
+       GL_DOT_PRODUCT_CONST_EYE_REFLECT_CUBE_MAP_NV
+       GL_DOT_PRODUCT_DEPTH_REPLACE_NV
+       GL_DOT_PRODUCT_DIFFUSE_CUBE_MAP_NV
+       GL_DOT_PRODUCT_NV
+       GL_DOT_PRODUCT_PASS_THROUGH_NV
+       GL_DOT_PRODUCT_REFLECT_CUBE_MAP_NV
+       GL_DOT_PRODUCT_TEXTURE_1D_NV
+       GL_DOT_PRODUCT_TEXTURE_2D_NV
+       GL_DOT_PRODUCT_TEXTURE_3D_NV
+       GL_DOT_PRODUCT_TEXTURE_CUBE_MAP_NV
+       GL_DOT_PRODUCT_TEXTURE_RECTANGLE_NV
+       GL_DOUBLE
+       GL_DOUBLEBUFFER
+       GL_DOUBLE_EXT
+       GL_DRAW_BUFFER
+       GL_DRAW_PIXEL_TOKEN
+       GL_DSDT8_MAG8_INTENSITY8_NV
+       GL_DSDT8_MAG8_NV
+       GL_DSDT8_NV
+       GL_DSDT_MAG_INTENSITY_NV
+       GL_DSDT_MAG_NV
+       GL_DSDT_MAG_VIB_NV
+       GL_DSDT_NV
+       GL_DST_ALPHA
+       GL_DST_COLOR
+       GL_DS_BIAS_NV
+       GL_DS_SCALE_NV
+       GL_DT_BIAS_NV
+       GL_DT_SCALE_NV
+       GL_DYNAMIC_COPY_ARB
+       GL_DYNAMIC_DRAW_ARB
+       GL_DYNAMIC_READ_ARB
+       GL_EDGE_FLAG
+       GL_EDGE_FLAG_ARRAY
+       GL_EDGE_FLAG_ARRAY_BUFFER_BINDING_ARB
+       GL_EDGE_FLAG_ARRAY_COUNT_EXT
+       GL_EDGE_FLAG_ARRAY_EXT
+       GL_EDGE_FLAG_ARRAY_POINTER
+       GL_EDGE_FLAG_ARRAY_POINTER_EXT
+       GL_EDGE_FLAG_ARRAY_STRIDE
+       GL_EDGE_FLAG_ARRAY_STRIDE_EXT
+       GL_ELEMENT_ARRAY_BUFFER_ARB
+       GL_ELEMENT_ARRAY_BUFFER_BINDING_ARB
+       GL_EMISSION
+       GL_ENABLE_BIT
+       GL_EQUAL
+       GL_EQUIV
+       GL_EVAL_BIT
+       GL_EXP
+       GL_EXP2
+       GL_EXPAND_NEGATE_NV
+       GL_EXPAND_NORMAL_NV
+       GL_EXTENSIONS
+       GL_EYE_LINEAR
+       GL_EYE_PLANE
+       GL_EYE_PLANE_ABSOLUTE_NV
+       GL_EYE_RADIAL_NV
+       GL_E_TIMES_F_NV
+       GL_FALSE
+       GL_FASTEST
+       GL_FEEDBACK
+       GL_FEEDBACK_BUFFER_POINTER
+       GL_FEEDBACK_BUFFER_SIZE
+       GL_FEEDBACK_BUFFER_TYPE
+       GL_FENCE_CONDITION_NV
+       GL_FENCE_STATUS_NV
+       GL_FILL
+       GL_FLAT
+       GL_FLOAT
+       GL_FLOAT_CLEAR_COLOR_VALUE_NV
+       GL_FLOAT_R16_NV
+       GL_FLOAT_R32_NV
+       GL_FLOAT_RG16_NV
+       GL_FLOAT_RG32_NV
+       GL_FLOAT_RGB16_NV
+       GL_FLOAT_RGB32_NV
+       GL_FLOAT_RGBA16_NV
+       GL_FLOAT_RGBA32_NV
+       GL_FLOAT_RGBA_MODE_NV
+       GL_FLOAT_RGBA_NV
+       GL_FLOAT_RGB_NV
+       GL_FLOAT_RG_NV
+       GL_FLOAT_R_NV
+       GL_FOG
+       GL_FOG_BIT
+       GL_FOG_COLOR
+       GL_FOG_COORDINATE
+       GL_FOG_COORDINATE_ARRAY
+       GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING_ARB
+       GL_FOG_COORDINATE_ARRAY_EXT
+       GL_FOG_COORDINATE_ARRAY_POINTER
+       GL_FOG_COORDINATE_ARRAY_POINTER_EXT
+       GL_FOG_COORDINATE_ARRAY_STRIDE
+       GL_FOG_COORDINATE_ARRAY_STRIDE_EXT
+       GL_FOG_COORDINATE_ARRAY_TYPE
+       GL_FOG_COORDINATE_ARRAY_TYPE_EXT
+       GL_FOG_COORDINATE_EXT
+       GL_FOG_COORDINATE_SOURCE
+       GL_FOG_COORDINATE_SOURCE_EXT
+       GL_FOG_DENSITY
+       GL_FOG_DISTANCE_MODE_NV
+       GL_FOG_END
+       GL_FOG_HINT
+       GL_FOG_INDEX
+       GL_FOG_MODE
+       GL_FOG_START
+       GL_FORCE_BLUE_TO_ONE_NV
+       GL_FORCE_SOFTWARE_NV
+       GL_FRAGMENT_DEPTH
+       GL_FRAGMENT_DEPTH_EXT
+       GL_FRAGMENT_PROGRAM_ARB
+       GL_FRAGMENT_PROGRAM_BINDING_NV
+       GL_FRAGMENT_PROGRAM_NV
+       GL_FRONT
+       GL_FRONT_AND_BACK
+       GL_FRONT_FACE
+       GL_FRONT_LEFT
+       GL_FRONT_RIGHT
+       GL_FUNC_ADD
+       GL_FUNC_ADD_EXT
+       GL_FUNC_REVERSE_SUBTRACT
+       GL_FUNC_REVERSE_SUBTRACT_EXT
+       GL_FUNC_SUBTRACT
+       GL_FUNC_SUBTRACT_EXT
+       GL_GENERATE_MIPMAP
+       GL_GENERATE_MIPMAP_HINT
+       GL_GENERATE_MIPMAP_HINT_SGIS
+       GL_GENERATE_MIPMAP_SGIS
+       GL_GEQUAL
+       GL_GREATER
+       GL_GREEN
+       GL_GREEN_BIAS
+       GL_GREEN_BITS
+       GL_GREEN_SCALE
+       GL_HALF_BIAS_NEGATE_NV
+       GL_HALF_BIAS_NORMAL_NV
+       GL_HALF_FLOAT_NV
+       GL_HILO16_NV
+       GL_HILO8_NV
+       GL_HILO_NV
+       GL_HINT_BIT
+       GL_HISTOGRAM
+       GL_HISTOGRAM_ALPHA_SIZE
+       GL_HISTOGRAM_BLUE_SIZE
+       GL_HISTOGRAM_FORMAT
+       GL_HISTOGRAM_GREEN_SIZE
+       GL_HISTOGRAM_LUMINANCE_SIZE
+       GL_HISTOGRAM_RED_SIZE
+       GL_HISTOGRAM_SINK
+       GL_HISTOGRAM_WIDTH
+       GL_HI_BIAS_NV
+       GL_HI_SCALE_NV
+       GL_IDENTITY_NV
+       GL_IGNORE_BORDER
+       GL_INCR
+       GL_INCR_WRAP
+       GL_INCR_WRAP_EXT
+       GL_INDEX_ARRAY
+       GL_INDEX_ARRAY_BUFFER_BINDING_ARB
+       GL_INDEX_ARRAY_COUNT_EXT
+       GL_INDEX_ARRAY_EXT
+       GL_INDEX_ARRAY_POINTER
+       GL_INDEX_ARRAY_POINTER_EXT
+       GL_INDEX_ARRAY_STRIDE
+       GL_INDEX_ARRAY_STRIDE_EXT
+       GL_INDEX_ARRAY_TYPE
+       GL_INDEX_ARRAY_TYPE_EXT
+       GL_INDEX_BITS
+       GL_INDEX_CLEAR_VALUE
+       GL_INDEX_LOGIC_OP
+       GL_INDEX_MODE
+       GL_INDEX_OFFSET
+       GL_INDEX_SHIFT
+       GL_INDEX_WRITEMASK
+       GL_INT
+       GL_INTENSITY
+       GL_INTENSITY12
+       GL_INTENSITY16
+       GL_INTENSITY4
+       GL_INTENSITY8
+       GL_INTERPOLATE
+       GL_INTERPOLATE_ARB
+       GL_INTERPOLATE_EXT
+       GL_INVALID_ENUM
+       GL_INVALID_OPERATION
+       GL_INVALID_VALUE
+       GL_INVERSE_NV
+       GL_INVERSE_TRANSPOSE_NV
+       GL_INVERT
+       GL_KEEP
+       GL_LEFT
+       GL_LEQUAL
+       GL_LESS
+       GL_LIGHT0
+       GL_LIGHT1
+       GL_LIGHT2
+       GL_LIGHT3
+       GL_LIGHT4
+       GL_LIGHT5
+       GL_LIGHT6
+       GL_LIGHT7
+       GL_LIGHTING
+       GL_LIGHTING_BIT
+       GL_LIGHT_MODEL_AMBIENT
+       GL_LIGHT_MODEL_COLOR_CONTROL
+       GL_LIGHT_MODEL_COLOR_CONTROL_EXT
+       GL_LIGHT_MODEL_LOCAL_VIEWER
+       GL_LIGHT_MODEL_TWO_SIDE
+       GL_LINE
+       GL_LINEAR
+       GL_LINEAR_ATTENUATION
+       GL_LINEAR_MIPMAP_LINEAR
+       GL_LINEAR_MIPMAP_NEAREST
+       GL_LINES
+       GL_LINE_BIT
+       GL_LINE_LOOP
+       GL_LINE_RESET_TOKEN
+       GL_LINE_SMOOTH
+       GL_LINE_SMOOTH_HINT
+       GL_LINE_STIPPLE
+       GL_LINE_STIPPLE_PATTERN
+       GL_LINE_STIPPLE_REPEAT
+       GL_LINE_STRIP
+       GL_LINE_TOKEN
+       GL_LINE_WIDTH
+       GL_LINE_WIDTH_GRANULARITY
+       GL_LINE_WIDTH_RANGE
+       GL_LIST_BASE
+       GL_LIST_BIT
+       GL_LIST_INDEX
+       GL_LIST_MODE
+       GL_LOAD
+       GL_LOGIC_OP
+       GL_LOGIC_OP_MODE
+       GL_LO_BIAS_NV
+       GL_LO_SCALE_NV
+       GL_LUMINANCE
+       GL_LUMINANCE12
+       GL_LUMINANCE12_ALPHA12
+       GL_LUMINANCE12_ALPHA4
+       GL_LUMINANCE16
+       GL_LUMINANCE16_ALPHA16
+       GL_LUMINANCE4
+       GL_LUMINANCE4_ALPHA4
+       GL_LUMINANCE6_ALPHA2
+       GL_LUMINANCE8
+       GL_LUMINANCE8_ALPHA8
+       GL_LUMINANCE_ALPHA
+       GL_MAC_GET_PROC_ADDRESS_NV
+       GL_MAGNITUDE_BIAS_NV
+       GL_MAGNITUDE_SCALE_NV
+       GL_MAP1_COLOR_4
+       GL_MAP1_GRID_DOMAIN
+       GL_MAP1_GRID_SEGMENTS
+       GL_MAP1_INDEX
+       GL_MAP1_NORMAL
+       GL_MAP1_TEXTURE_COORD_1
+       GL_MAP1_TEXTURE_COORD_2
+       GL_MAP1_TEXTURE_COORD_3
+       GL_MAP1_TEXTURE_COORD_4
+       GL_MAP1_VERTEX_3
+       GL_MAP1_VERTEX_4
+       GL_MAP1_VERTEX_ATTRIB0_4_NV
+       GL_MAP1_VERTEX_ATTRIB10_4_NV
+       GL_MAP1_VERTEX_ATTRIB11_4_NV
+       GL_MAP1_VERTEX_ATTRIB12_4_NV
+       GL_MAP1_VERTEX_ATTRIB13_4_NV
+       GL_MAP1_VERTEX_ATTRIB14_4_NV
+       GL_MAP1_VERTEX_ATTRIB15_4_NV
+       GL_MAP1_VERTEX_ATTRIB1_4_NV
+       GL_MAP1_VERTEX_ATTRIB2_4_NV
+       GL_MAP1_VERTEX_ATTRIB3_4_NV
+       GL_MAP1_VERTEX_ATTRIB4_4_NV
+       GL_MAP1_VERTEX_ATTRIB5_4_NV
+       GL_MAP1_VERTEX_ATTRIB6_4_NV
+       GL_MAP1_VERTEX_ATTRIB7_4_NV
+       GL_MAP1_VERTEX_ATTRIB8_4_NV
+       GL_MAP1_VERTEX_ATTRIB9_4_NV
+       GL_MAP2_COLOR_4
+       GL_MAP2_GRID_DOMAIN
+       GL_MAP2_GRID_SEGMENTS
+       GL_MAP2_INDEX
+       GL_MAP2_NORMAL
+       GL_MAP2_TEXTURE_COORD_1
+       GL_MAP2_TEXTURE_COORD_2
+       GL_MAP2_TEXTURE_COORD_3
+       GL_MAP2_TEXTURE_COORD_4
+       GL_MAP2_VERTEX_3
+       GL_MAP2_VERTEX_4
+       GL_MAP2_VERTEX_ATTRIB0_4_NV
+       GL_MAP2_VERTEX_ATTRIB10_4_NV
+       GL_MAP2_VERTEX_ATTRIB11_4_NV
+       GL_MAP2_VERTEX_ATTRIB12_4_NV
+       GL_MAP2_VERTEX_ATTRIB13_4_NV
+       GL_MAP2_VERTEX_ATTRIB14_4_NV
+       GL_MAP2_VERTEX_ATTRIB15_4_NV
+       GL_MAP2_VERTEX_ATTRIB1_4_NV
+       GL_MAP2_VERTEX_ATTRIB2_4_NV
+       GL_MAP2_VERTEX_ATTRIB3_4_NV
+       GL_MAP2_VERTEX_ATTRIB4_4_NV
+       GL_MAP2_VERTEX_ATTRIB5_4_NV
+       GL_MAP2_VERTEX_ATTRIB6_4_NV
+       GL_MAP2_VERTEX_ATTRIB7_4_NV
+       GL_MAP2_VERTEX_ATTRIB8_4_NV
+       GL_MAP2_VERTEX_ATTRIB9_4_NV
+       GL_MAP_COLOR
+       GL_MAP_STENCIL
+       GL_MATRIX0_ARB
+       GL_MATRIX0_NV
+       GL_MATRIX10_ARB
+       GL_MATRIX11_ARB
+       GL_MATRIX12_ARB
+       GL_MATRIX13_ARB
+       GL_MATRIX14_ARB
+       GL_MATRIX15_ARB
+       GL_MATRIX16_ARB
+       GL_MATRIX17_ARB
+       GL_MATRIX18_ARB
+       GL_MATRIX19_ARB
+       GL_MATRIX1_ARB
+       GL_MATRIX1_NV
+       GL_MATRIX20_ARB
+       GL_MATRIX21_ARB
+       GL_MATRIX22_ARB
+       GL_MATRIX23_ARB
+       GL_MATRIX24_ARB
+       GL_MATRIX25_ARB
+       GL_MATRIX26_ARB
+       GL_MATRIX27_ARB
+       GL_MATRIX28_ARB
+       GL_MATRIX29_ARB
+       GL_MATRIX2_ARB
+       GL_MATRIX2_NV
+       GL_MATRIX30_ARB
+       GL_MATRIX31_ARB
+       GL_MATRIX3_ARB
+       GL_MATRIX3_NV
+       GL_MATRIX4_ARB
+       GL_MATRIX4_NV
+       GL_MATRIX5_ARB
+       GL_MATRIX5_NV
+       GL_MATRIX6_ARB
+       GL_MATRIX6_NV
+       GL_MATRIX7_ARB
+       GL_MATRIX7_NV
+       GL_MATRIX8_ARB
+       GL_MATRIX9_ARB
+       GL_MATRIX_MODE
+       GL_MAX
+       GL_MAX_3D_TEXTURE_SIZE
+       GL_MAX_3D_TEXTURE_SIZE_EXT
+       GL_MAX_ATTRIB_STACK_DEPTH
+       GL_MAX_CLIENT_ATTRIB_STACK_DEPTH
+       GL_MAX_CLIP_PLANES
+       GL_MAX_COLOR_MATRIX_STACK_DEPTH
+       GL_MAX_CONVOLUTION_HEIGHT
+       GL_MAX_CONVOLUTION_WIDTH
+       GL_MAX_CUBE_MAP_TEXTURE_SIZE
+       GL_MAX_CUBE_MAP_TEXTURE_SIZE_ARB
+       GL_MAX_CUBE_MAP_TEXTURE_SIZE_EXT
+       GL_MAX_ELEMENTS_INDICES
+       GL_MAX_ELEMENTS_INDICES_EXT
+       GL_MAX_ELEMENTS_VERTICES
+       GL_MAX_ELEMENTS_VERTICES_EXT
+       GL_MAX_EVAL_ORDER
+       GL_MAX_EXT
+       GL_MAX_FRAGMENT_PROGRAM_LOCAL_PARAMETERS_NV
+       GL_MAX_GENERAL_COMBINERS_NV
+       GL_MAX_LIGHTS
+       GL_MAX_LIST_NESTING
+       GL_MAX_MODELVIEW_STACK_DEPTH
+       GL_MAX_NAME_STACK_DEPTH
+       GL_MAX_PENDING_FLUSHHOLD_NVX
+       GL_MAX_PIXEL_MAP_TABLE
+       GL_MAX_PROGRAM_ADDRESS_REGISTERS_ARB
+       GL_MAX_PROGRAM_ALU_INSTRUCTIONS_ARB
+       GL_MAX_PROGRAM_ATTRIBS_ARB
+       GL_MAX_PROGRAM_ENV_PARAMETERS_ARB
+       GL_MAX_PROGRAM_INSTRUCTIONS_ARB
+       GL_MAX_PROGRAM_LOCAL_PARAMETERS_ARB
+       GL_MAX_PROGRAM_MATRICES_ARB
+       GL_MAX_PROGRAM_MATRIX_STACK_DEPTH_ARB
+       GL_MAX_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB
+       GL_MAX_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB
+       GL_MAX_PROGRAM_NATIVE_ATTRIBS_ARB
+       GL_MAX_PROGRAM_NATIVE_INSTRUCTIONS_ARB
+       GL_MAX_PROGRAM_NATIVE_PARAMETERS_ARB
+       GL_MAX_PROGRAM_NATIVE_TEMPORARIES_ARB
+       GL_MAX_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB
+       GL_MAX_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB
+       GL_MAX_PROGRAM_PARAMETERS_ARB
+       GL_MAX_PROGRAM_TEMPORARIES_ARB
+       GL_MAX_PROGRAM_TEX_INDIRECTIONS_ARB
+       GL_MAX_PROGRAM_TEX_INSTRUCTIONS_ARB
+       GL_MAX_PROJECTION_STACK_DEPTH
+       GL_MAX_RECTANGLE_TEXTURE_SIZE_NV
+       GL_MAX_SHININESS_NV
+       GL_MAX_SPOT_EXPONENT_NV
+       GL_MAX_TEXTURES_SGIS
+       GL_MAX_TEXTURE_COORDS_ARB
+       GL_MAX_TEXTURE_COORDS_NV
+       GL_MAX_TEXTURE_IMAGE_UNITS_ARB
+       GL_MAX_TEXTURE_IMAGE_UNITS_NV
+       GL_MAX_TEXTURE_LOD_BIAS
+       GL_MAX_TEXTURE_LOD_BIAS_EXT
+       GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT
+       GL_MAX_TEXTURE_SIZE
+       GL_MAX_TEXTURE_STACK_DEPTH
+       GL_MAX_TEXTURE_UNITS
+       GL_MAX_TEXTURE_UNITS_ARB
+       GL_MAX_TRACK_MATRICES_NV
+       GL_MAX_TRACK_MATRIX_STACK_DEPTH_NV
+       GL_MAX_VERTEX_ARRAY_RANGE_ELEMENT_NV
+       GL_MAX_VERTEX_ATTRIBS_ARB
+       GL_MAX_VIEWPORT_DIMS
+       GL_MIN
+       GL_MINMAX
+       GL_MINMAX_FORMAT
+       GL_MINMAX_SINK
+       GL_MIN_EXT
+       GL_MIRRORED_REPEAT
+       GL_MIRRORED_REPEAT_ARB
+       GL_MIRRORED_REPEAT_IBM
+       GL_MODELVIEW
+       GL_MODELVIEW0_EXT
+       GL_MODELVIEW0_MATRIX_EXT
+       GL_MODELVIEW0_STACK_DEPTH_EXT
+       GL_MODELVIEW1_EXT
+       GL_MODELVIEW1_MATRIX_EXT
+       GL_MODELVIEW1_STACK_DEPTH_EXT
+       GL_MODELVIEW_MATRIX
+       GL_MODELVIEW_PROJECTION_NV
+       GL_MODELVIEW_STACK_DEPTH
+       GL_MODULATE
+       GL_MULT
+       GL_MULTISAMPLE
+       GL_MULTISAMPLE_ARB
+       GL_MULTISAMPLE_BIT
+       GL_MULTISAMPLE_BIT_ARB
+       GL_MULTISAMPLE_FILTER_HINT_NV
+       GL_N3F_V3F
+       GL_NAME_STACK_DEPTH
+       GL_NAND
+       GL_NEAREST
+       GL_NEAREST_MIPMAP_LINEAR
+       GL_NEAREST_MIPMAP_NEAREST
+       GL_NEVER
+       GL_NICEST
+       GL_NONE
+       GL_NOOP
+       GL_NOR
+       GL_NORMALIZE
+       GL_NORMAL_ARRAY
+       GL_NORMAL_ARRAY_BUFFER_BINDING_ARB
+       GL_NORMAL_ARRAY_COUNT_EXT
+       GL_NORMAL_ARRAY_EXT
+       GL_NORMAL_ARRAY_POINTER
+       GL_NORMAL_ARRAY_POINTER_EXT
+       GL_NORMAL_ARRAY_STRIDE
+       GL_NORMAL_ARRAY_STRIDE_EXT
+       GL_NORMAL_ARRAY_TYPE
+       GL_NORMAL_ARRAY_TYPE_EXT
+       GL_NORMAL_MAP
+       GL_NORMAL_MAP_ARB
+       GL_NORMAL_MAP_EXT
+       GL_NORMAL_MAP_NV
+       GL_NOTEQUAL
+       GL_NO_ERROR
+       GL_NUM_COMPRESSED_TEXTURE_FORMATS
+       GL_NUM_COMPRESSED_TEXTURE_FORMATS_ARB
+       GL_NUM_GENERAL_COMBINERS_NV
+       GL_OBJECT_LINEAR
+       GL_OBJECT_PLANE
+       GL_OCCLUSION_TEST_HP
+       GL_OCCLUSION_TEST_RESULT_HP
+       GL_OFFSET_HILO_PROJECTIVE_TEXTURE_2D_NV
+       GL_OFFSET_HILO_PROJECTIVE_TEXTURE_RECTANGLE_NV
+       GL_OFFSET_HILO_TEXTURE_2D_NV
+       GL_OFFSET_HILO_TEXTURE_RECTANGLE_NV
+       GL_OFFSET_PROJECTIVE_TEXTURE_2D_NV
+       GL_OFFSET_PROJECTIVE_TEXTURE_2D_SCALE_NV
+       GL_OFFSET_PROJECTIVE_TEXTURE_RECTANGLE_NV
+       GL_OFFSET_PROJECTIVE_TEXTURE_RECTANGLE_SCALE_NV
+       GL_OFFSET_TEXTURE_2D_BIAS_NV
+       GL_OFFSET_TEXTURE_2D_MATRIX_NV
+       GL_OFFSET_TEXTURE_2D_NV
+       GL_OFFSET_TEXTURE_2D_SCALE_NV
+       GL_OFFSET_TEXTURE_BIAS_NV
+       GL_OFFSET_TEXTURE_MATRIX_NV
+       GL_OFFSET_TEXTURE_RECTANGLE_NV
+       GL_OFFSET_TEXTURE_RECTANGLE_SCALE_NV
+       GL_OFFSET_TEXTURE_SCALE_NV
+       GL_ONE
+       GL_ONE_MINUS_CONSTANT_ALPHA
+       GL_ONE_MINUS_CONSTANT_ALPHA_EXT
+       GL_ONE_MINUS_CONSTANT_COLOR
+       GL_ONE_MINUS_CONSTANT_COLOR_EXT
+       GL_ONE_MINUS_DST_ALPHA
+       GL_ONE_MINUS_DST_COLOR
+       GL_ONE_MINUS_SRC_ALPHA
+       GL_ONE_MINUS_SRC_COLOR
+       GL_OPERAND0_ALPHA
+       GL_OPERAND0_ALPHA_ARB
+       GL_OPERAND0_ALPHA_EXT
+       GL_OPERAND0_RGB
+       GL_OPERAND0_RGB_ARB
+       GL_OPERAND0_RGB_EXT
+       GL_OPERAND1_ALPHA
+       GL_OPERAND1_ALPHA_ARB
+       GL_OPERAND1_ALPHA_EXT
+       GL_OPERAND1_RGB
+       GL_OPERAND1_RGB_ARB
+       GL_OPERAND1_RGB_EXT
+       GL_OPERAND2_ALPHA
+       GL_OPERAND2_ALPHA_ARB
+       GL_OPERAND2_ALPHA_EXT
+       GL_OPERAND2_RGB
+       GL_OPERAND2_RGB_ARB
+       GL_OPERAND2_RGB_EXT
+       GL_OPERAND3_ALPHA_NV
+       GL_OPERAND3_RGB_NV
+       GL_OR
+       GL_ORDER
+       GL_OR_INVERTED
+       GL_OR_REVERSE
+       GL_OUT_OF_MEMORY
+       GL_PACK_ALIGNMENT
+       GL_PACK_IMAGE_HEIGHT
+       GL_PACK_IMAGE_HEIGHT_EXT
+       GL_PACK_LSB_FIRST
+       GL_PACK_ROW_LENGTH
+       GL_PACK_SKIP_IMAGES
+       GL_PACK_SKIP_IMAGES_EXT
+       GL_PACK_SKIP_PIXELS
+       GL_PACK_SKIP_ROWS
+       GL_PACK_SWAP_BYTES
+       GL_PASS_THROUGH_NV
+       GL_PASS_THROUGH_TOKEN
+       GL_PERSPECTIVE_CORRECTION_HINT
+       GL_PER_STAGE_CONSTANTS_NV
+       GL_PIXEL_COUNTER_BITS_NV
+       GL_PIXEL_COUNT_AVAILABLE_NV
+       GL_PIXEL_COUNT_NV
+       GL_PIXEL_MAP_A_TO_A
+       GL_PIXEL_MAP_A_TO_A_SIZE
+       GL_PIXEL_MAP_B_TO_B
+       GL_PIXEL_MAP_B_TO_B_SIZE
+       GL_PIXEL_MAP_G_TO_G
+       GL_PIXEL_MAP_G_TO_G_SIZE
+       GL_PIXEL_MAP_I_TO_A
+       GL_PIXEL_MAP_I_TO_A_SIZE
+       GL_PIXEL_MAP_I_TO_B
+       GL_PIXEL_MAP_I_TO_B_SIZE
+       GL_PIXEL_MAP_I_TO_G
+       GL_PIXEL_MAP_I_TO_G_SIZE
+       GL_PIXEL_MAP_I_TO_I
+       GL_PIXEL_MAP_I_TO_I_SIZE
+       GL_PIXEL_MAP_I_TO_R
+       GL_PIXEL_MAP_I_TO_R_SIZE
+       GL_PIXEL_MAP_R_TO_R
+       GL_PIXEL_MAP_R_TO_R_SIZE
+       GL_PIXEL_MAP_S_TO_S
+       GL_PIXEL_MAP_S_TO_S_SIZE
+       GL_PIXEL_MODE_BIT
+       GL_POINT
+       GL_POINTS
+       GL_POINT_BIT
+       GL_POINT_DISTANCE_ATTENUATION
+       GL_POINT_DISTANCE_ATTENUATION_ARB
+       GL_POINT_FADE_THRESHOLD_SIZE
+       GL_POINT_FADE_THRESHOLD_SIZE_ARB
+       GL_POINT_FADE_THRESHOLD_SIZE_EXT
+       GL_POINT_SIZE
+       GL_POINT_SIZE_GRANULARITY
+       GL_POINT_SIZE_MAX
+       GL_POINT_SIZE_MAX_ARB
+       GL_POINT_SIZE_MAX_EXT
+       GL_POINT_SIZE_MIN
+       GL_POINT_SIZE_MIN_ARB
+       GL_POINT_SIZE_MIN_EXT
+       GL_POINT_SIZE_RANGE
+       GL_POINT_SMOOTH
+       GL_POINT_SMOOTH_HINT
+       GL_POINT_SPRITE_NV
+       GL_POINT_SPRITE_R_MODE_NV
+       GL_POINT_TOKEN
+       GL_POLYGON
+       GL_POLYGON_BIT
+       GL_POLYGON_MODE
+       GL_POLYGON_OFFSET_FACTOR
+       GL_POLYGON_OFFSET_FILL
+       GL_POLYGON_OFFSET_LINE
+       GL_POLYGON_OFFSET_POINT
+       GL_POLYGON_OFFSET_UNITS
+       GL_POLYGON_SMOOTH
+       GL_POLYGON_SMOOTH_HINT
+       GL_POLYGON_STIPPLE
+       GL_POLYGON_STIPPLE_BIT
+       GL_POLYGON_TOKEN
+       GL_POSITION
+       GL_POST_COLOR_MATRIX_ALPHA_BIAS
+       GL_POST_COLOR_MATRIX_ALPHA_SCALE
+       GL_POST_COLOR_MATRIX_BLUE_BIAS
+       GL_POST_COLOR_MATRIX_BLUE_SCALE
+       GL_POST_COLOR_MATRIX_COLOR_TABLE
+       GL_POST_COLOR_MATRIX_GREEN_BIAS
+       GL_POST_COLOR_MATRIX_GREEN_SCALE
+       GL_POST_COLOR_MATRIX_RED_BIAS
+       GL_POST_COLOR_MATRIX_RED_SCALE
+       GL_POST_CONVOLUTION_ALPHA_BIAS
+       GL_POST_CONVOLUTION_ALPHA_SCALE
+       GL_POST_CONVOLUTION_BLUE_BIAS
+       GL_POST_CONVOLUTION_BLUE_SCALE
+       GL_POST_CONVOLUTION_COLOR_TABLE
+       GL_POST_CONVOLUTION_GREEN_BIAS
+       GL_POST_CONVOLUTION_GREEN_SCALE
+       GL_POST_CONVOLUTION_RED_BIAS
+       GL_POST_CONVOLUTION_RED_SCALE
+       GL_PREVIOUS
+       GL_PREVIOUS_ARB
+       GL_PREVIOUS_EXT
+       GL_PREVIOUS_TEXTURE_INPUT_NV
+       GL_PRIMARY_COLOR
+       GL_PRIMARY_COLOR_ARB
+       GL_PRIMARY_COLOR_EXT
+       GL_PRIMARY_COLOR_NV
+       GL_PRIMITIVE_RESTART_INDEX_NV
+       GL_PRIMITIVE_RESTART_NV
+       GL_PROGRAM_ADDRESS_REGISTERS_ARB
+       GL_PROGRAM_ALU_INSTRUCTIONS_ARB
+       GL_PROGRAM_ATTRIBS_ARB
+       GL_PROGRAM_BINDING_ARB
+       GL_PROGRAM_ERROR_POSITION_ARB
+       GL_PROGRAM_ERROR_POSITION_NV
+       GL_PROGRAM_ERROR_STRING_ARB
+       GL_PROGRAM_ERROR_STRING_NV
+       GL_PROGRAM_FORMAT_ARB
+       GL_PROGRAM_FORMAT_ASCII_ARB
+       GL_PROGRAM_INSTRUCTIONS_ARB
+       GL_PROGRAM_LENGTH_ARB
+       GL_PROGRAM_LENGTH_NV
+       GL_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB
+       GL_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB
+       GL_PROGRAM_NATIVE_ATTRIBS_ARB
+       GL_PROGRAM_NATIVE_INSTRUCTIONS_ARB
+       GL_PROGRAM_NATIVE_PARAMETERS_ARB
+       GL_PROGRAM_NATIVE_TEMPORARIES_ARB
+       GL_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB
+       GL_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB
+       GL_PROGRAM_PARAMETERS_ARB
+       GL_PROGRAM_PARAMETER_NV
+       GL_PROGRAM_RESIDENT_NV
+       GL_PROGRAM_STRING_ARB
+       GL_PROGRAM_STRING_NV
+       GL_PROGRAM_TARGET_NV
+       GL_PROGRAM_TEMPORARIES_ARB
+       GL_PROGRAM_TEX_INDIRECTIONS_ARB
+       GL_PROGRAM_TEX_INSTRUCTIONS_ARB
+       GL_PROGRAM_UNDER_NATIVE_LIMITS_ARB
+       GL_PROJECTION
+       GL_PROJECTION_MATRIX
+       GL_PROJECTION_STACK_DEPTH
+       GL_PROXY_COLOR_TABLE
+       GL_PROXY_HISTOGRAM
+       GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE
+       GL_PROXY_POST_CONVOLUTION_COLOR_TABLE
+       GL_PROXY_TEXTURE_1D
+       GL_PROXY_TEXTURE_2D
+       GL_PROXY_TEXTURE_3D
+       GL_PROXY_TEXTURE_3D_EXT
+       GL_PROXY_TEXTURE_CUBE_MAP
+       GL_PROXY_TEXTURE_CUBE_MAP_ARB
+       GL_PROXY_TEXTURE_CUBE_MAP_EXT
+       GL_PROXY_TEXTURE_RECTANGLE_NV
+       GL_Q
+       GL_QUADRATIC_ATTENUATION
+       GL_QUADS
+       GL_QUAD_STRIP
+       GL_R
+       GL_R3_G3_B2
+       GL_READ_BUFFER
+       GL_READ_ONLY_ARB
+       GL_READ_PIXEL_DATA_RANGE_LENGTH_NV
+       GL_READ_PIXEL_DATA_RANGE_NV
+       GL_READ_PIXEL_DATA_RANGE_POINTER_NV
+       GL_READ_WRITE_ARB
+       GL_RED
+       GL_REDUCE
+       GL_RED_BIAS
+       GL_RED_BITS
+       GL_RED_SCALE
+       GL_REFLECTION_MAP
+       GL_REFLECTION_MAP_ARB
+       GL_REFLECTION_MAP_EXT
+       GL_REFLECTION_MAP_NV
+       GL_REGISTER_COMBINERS_NV
+       GL_RENDER
+       GL_RENDERER
+       GL_RENDER_MODE
+       GL_REPEAT
+       GL_REPLACE
+       GL_REPLICATE_BORDER
+       GL_RESCALE_NORMAL
+       GL_RESCALE_NORMAL_EXT
+       GL_RETURN
+       GL_RGB
+       GL_RGB10
+       GL_RGB10_A2
+       GL_RGB12
+       GL_RGB16
+       GL_RGB4
+       GL_RGB4_S3TC
+       GL_RGB5
+       GL_RGB5_A1
+       GL_RGB8
+       GL_RGBA
+       GL_RGBA12
+       GL_RGBA16
+       GL_RGBA2
+       GL_RGBA4
+       GL_RGBA4_DXT5_S3TC
+       GL_RGBA4_S3TC
+       GL_RGBA8
+       GL_RGBA_DXT5_S3TC
+       GL_RGBA_MODE
+       GL_RGBA_S3TC
+       GL_RGBA_UNSIGNED_DOT_PRODUCT_MAPPING_NV
+       GL_RGB_S3TC
+       GL_RGB_SCALE
+       GL_RGB_SCALE_ARB
+       GL_RGB_SCALE_EXT
+       GL_RIGHT
+       GL_S
+       GL_SAMPLES
+       GL_SAMPLES_ARB
+       GL_SAMPLE_ALPHA_TO_COVERAGE
+       GL_SAMPLE_ALPHA_TO_COVERAGE_ARB
+       GL_SAMPLE_ALPHA_TO_ONE
+       GL_SAMPLE_ALPHA_TO_ONE_ARB
+       GL_SAMPLE_BUFFERS
+       GL_SAMPLE_BUFFERS_ARB
+       GL_SAMPLE_COVERAGE
+       GL_SAMPLE_COVERAGE_ARB
+       GL_SAMPLE_COVERAGE_INVERT
+       GL_SAMPLE_COVERAGE_INVERT_ARB
+       GL_SAMPLE_COVERAGE_VALUE
+       GL_SAMPLE_COVERAGE_VALUE_ARB
+       GL_SCALE_BY_FOUR_NV
+       GL_SCALE_BY_ONE_HALF_NV
+       GL_SCALE_BY_TWO_NV
+       GL_SCISSOR_BIT
+       GL_SCISSOR_BOX
+       GL_SCISSOR_TEST
+       GL_SECONDARY_COLOR_ARRAY
+       GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING_ARB
+       GL_SECONDARY_COLOR_ARRAY_EXT
+       GL_SECONDARY_COLOR_ARRAY_POINTER
+       GL_SECONDARY_COLOR_ARRAY_POINTER_EXT
+       GL_SECONDARY_COLOR_ARRAY_SIZE
+       GL_SECONDARY_COLOR_ARRAY_SIZE_EXT
+       GL_SECONDARY_COLOR_ARRAY_STRIDE
+       GL_SECONDARY_COLOR_ARRAY_STRIDE_EXT
+       GL_SECONDARY_COLOR_ARRAY_TYPE
+       GL_SECONDARY_COLOR_ARRAY_TYPE_EXT
+       GL_SECONDARY_COLOR_NV
+       GL_SELECT
+       GL_SELECTED_TEXTURE_SGIS
+       GL_SELECTION_BUFFER_POINTER
+       GL_SELECTION_BUFFER_SIZE
+       GL_SEPARABLE_2D
+       GL_SEPARATE_SPECULAR_COLOR
+       GL_SEPARATE_SPECULAR_COLOR_EXT
+       GL_SET
+       GL_SHADER_CONSISTENT_NV
+       GL_SHADER_OPERATION_NV
+       GL_SHADE_MODEL
+       GL_SHARED_TEXTURE_PALETTE_EXT
+       GL_SHININESS
+       GL_SHORT
+       GL_SIGNED_ALPHA8_NV
+       GL_SIGNED_ALPHA_NV
+       GL_SIGNED_HILO16_NV
+       GL_SIGNED_HILO8_NV
+       GL_SIGNED_HILO_NV
+       GL_SIGNED_IDENTITY_NV
+       GL_SIGNED_INTENSITY8_NV
+       GL_SIGNED_INTENSITY_NV
+       GL_SIGNED_LUMINANCE8_ALPHA8_NV
+       GL_SIGNED_LUMINANCE8_NV
+       GL_SIGNED_LUMINANCE_ALPHA_NV
+       GL_SIGNED_LUMINANCE_NV
+       GL_SIGNED_NEGATE_NV
+       GL_SIGNED_RGB8_NV
+       GL_SIGNED_RGB8_UNSIGNED_ALPHA8_NV
+       GL_SIGNED_RGBA8_NV
+       GL_SIGNED_RGBA_NV
+       GL_SIGNED_RGB_NV
+       GL_SIGNED_RGB_UNSIGNED_ALPHA_NV
+       GL_SINGLE_COLOR
+       GL_SINGLE_COLOR_EXT
+       GL_SMOOTH
+       GL_SMOOTH_LINE_WIDTH_GRANULARITY
+       GL_SMOOTH_LINE_WIDTH_RANGE
+       GL_SMOOTH_POINT_SIZE_GRANULARITY
+       GL_SMOOTH_POINT_SIZE_RANGE
+       GL_SOURCE0_ALPHA
+       GL_SOURCE0_ALPHA_ARB
+       GL_SOURCE0_ALPHA_EXT
+       GL_SOURCE0_RGB
+       GL_SOURCE0_RGB_ARB
+       GL_SOURCE0_RGB_EXT
+       GL_SOURCE1_ALPHA
+       GL_SOURCE1_ALPHA_ARB
+       GL_SOURCE1_ALPHA_EXT
+       GL_SOURCE1_RGB
+       GL_SOURCE1_RGB_ARB
+       GL_SOURCE1_RGB_EXT
+       GL_SOURCE2_ALPHA
+       GL_SOURCE2_ALPHA_ARB
+       GL_SOURCE2_ALPHA_EXT
+       GL_SOURCE2_RGB
+       GL_SOURCE2_RGB_ARB
+       GL_SOURCE2_RGB_EXT
+       GL_SOURCE3_ALPHA_NV
+       GL_SOURCE3_RGB_NV
+       GL_SPARE0_NV
+       GL_SPARE0_PLUS_SECONDARY_COLOR_NV
+       GL_SPARE1_NV
+       GL_SPECULAR
+       GL_SPHERE_MAP
+       GL_SPOT_CUTOFF
+       GL_SPOT_DIRECTION
+       GL_SPOT_EXPONENT
+       GL_SRC_ALPHA
+       GL_SRC_ALPHA_SATURATE
+       GL_SRC_COLOR
+       GL_STACK_OVERFLOW
+       GL_STACK_UNDERFLOW
+       GL_STATIC_COPY_ARB
+       GL_STATIC_DRAW_ARB
+       GL_STATIC_READ_ARB
+       GL_STENCIL
+       GL_STENCIL_BITS
+       GL_STENCIL_BUFFER_BIT
+       GL_STENCIL_CLEAR_VALUE
+       GL_STENCIL_FAIL
+       GL_STENCIL_FUNC
+       GL_STENCIL_INDEX
+       GL_STENCIL_PASS_DEPTH_FAIL
+       GL_STENCIL_PASS_DEPTH_PASS
+       GL_STENCIL_REF
+       GL_STENCIL_TEST
+       GL_STENCIL_TEST_TWO_SIDE_EXT
+       GL_STENCIL_VALUE_MASK
+       GL_STENCIL_WRITEMASK
+       GL_STEREO
+       GL_STREAM_COPY_ARB
+       GL_STREAM_DRAW_ARB
+       GL_STREAM_READ_ARB
+       GL_SUBPIXEL_BITS
+       GL_SUBTRACT
+       GL_SUBTRACT_ARB
+       GL_T
+       GL_T2F_C3F_V3F
+       GL_T2F_C4F_N3F_V3F
+       GL_T2F_C4UB_V3F
+       GL_T2F_N3F_V3F
+       GL_T2F_V3F
+       GL_T4F_C4F_N3F_V4F
+       GL_T4F_V4F
+       GL_TABLE_TOO_LARGE
+       GL_TABLE_TOO_LARGE_EXT
+       GL_TBUFFER_WRITE_MASK_3DFX
+       GL_TEXTURE
+       GL_TEXTURE0
+       GL_TEXTURE0_ARB
+       GL_TEXTURE0_SGIS
+       GL_TEXTURE1
+       GL_TEXTURE10
+       GL_TEXTURE10_ARB
+       GL_TEXTURE11
+       GL_TEXTURE11_ARB
+       GL_TEXTURE12
+       GL_TEXTURE12_ARB
+       GL_TEXTURE13
+       GL_TEXTURE13_ARB
+       GL_TEXTURE14
+       GL_TEXTURE14_ARB
+       GL_TEXTURE15
+       GL_TEXTURE15_ARB
+       GL_TEXTURE16
+       GL_TEXTURE16_ARB
+       GL_TEXTURE17
+       GL_TEXTURE17_ARB
+       GL_TEXTURE18
+       GL_TEXTURE18_ARB
+       GL_TEXTURE19
+       GL_TEXTURE19_ARB
+       GL_TEXTURE1_ARB
+       GL_TEXTURE1_SGIS
+       GL_TEXTURE2
+       GL_TEXTURE20
+       GL_TEXTURE20_ARB
+       GL_TEXTURE21
+       GL_TEXTURE21_ARB
+       GL_TEXTURE22
+       GL_TEXTURE22_ARB
+       GL_TEXTURE23
+       GL_TEXTURE23_ARB
+       GL_TEXTURE24
+       GL_TEXTURE24_ARB
+       GL_TEXTURE25
+       GL_TEXTURE25_ARB
+       GL_TEXTURE26
+       GL_TEXTURE26_ARB
+       GL_TEXTURE27
+       GL_TEXTURE27_ARB
+       GL_TEXTURE28
+       GL_TEXTURE28_ARB
+       GL_TEXTURE29
+       GL_TEXTURE29_ARB
+       GL_TEXTURE2_ARB
+       GL_TEXTURE2_SGIS
+       GL_TEXTURE3
+       GL_TEXTURE30
+       GL_TEXTURE30_ARB
+       GL_TEXTURE31
+       GL_TEXTURE31_ARB
+       GL_TEXTURE3_ARB
+       GL_TEXTURE3_SGIS
+       GL_TEXTURE4
+       GL_TEXTURE4_ARB
+       GL_TEXTURE5
+       GL_TEXTURE5_ARB
+       GL_TEXTURE6
+       GL_TEXTURE6_ARB
+       GL_TEXTURE7
+       GL_TEXTURE7_ARB
+       GL_TEXTURE8
+       GL_TEXTURE8_ARB
+       GL_TEXTURE9
+       GL_TEXTURE9_ARB
+       GL_TEXTURE_1D
+       GL_TEXTURE_2D
+       GL_TEXTURE_3D
+       GL_TEXTURE_3D_EXT
+       GL_TEXTURE_ALPHA_SIZE
+       GL_TEXTURE_BASE_LEVEL
+       GL_TEXTURE_BASE_LEVEL_SGIS
+       GL_TEXTURE_BINDING_1D
+       GL_TEXTURE_BINDING_2D
+       GL_TEXTURE_BINDING_3D
+       GL_TEXTURE_BINDING_CUBE_MAP
+       GL_TEXTURE_BINDING_CUBE_MAP_ARB
+       GL_TEXTURE_BINDING_CUBE_MAP_EXT
+       GL_TEXTURE_BINDING_RECTANGLE_NV
+       GL_TEXTURE_BIT
+       GL_TEXTURE_BLUE_SIZE
+       GL_TEXTURE_BORDER
+       GL_TEXTURE_BORDER_COLOR
+       GL_TEXTURE_BORDER_VALUES_NV
+       GL_TEXTURE_COLOR_WRITEMASK_SGIS
+       GL_TEXTURE_COMPARE_FAIL_VALUE_ARB
+       GL_TEXTURE_COMPARE_FUNC
+       GL_TEXTURE_COMPARE_FUNC_ARB
+       GL_TEXTURE_COMPARE_MODE
+       GL_TEXTURE_COMPARE_MODE_ARB
+       GL_TEXTURE_COMPARE_OPERATOR_SGIX
+       GL_TEXTURE_COMPARE_SGIX
+       GL_TEXTURE_COMPONENTS
+       GL_TEXTURE_COMPRESSED
+       GL_TEXTURE_COMPRESSED_ARB
+       GL_TEXTURE_COMPRESSED_IMAGE_SIZE
+       GL_TEXTURE_COMPRESSED_IMAGE_SIZE_ARB
+       GL_TEXTURE_COMPRESSION_HINT
+       GL_TEXTURE_COMPRESSION_HINT_ARB
+       GL_TEXTURE_COORD_ARRAY
+       GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING_ARB
+       GL_TEXTURE_COORD_ARRAY_COUNT_EXT
+       GL_TEXTURE_COORD_ARRAY_EXT
+       GL_TEXTURE_COORD_ARRAY_POINTER
+       GL_TEXTURE_COORD_ARRAY_POINTER_EXT
+       GL_TEXTURE_COORD_ARRAY_SIZE
+       GL_TEXTURE_COORD_ARRAY_SIZE_EXT
+       GL_TEXTURE_COORD_ARRAY_STRIDE
+       GL_TEXTURE_COORD_ARRAY_STRIDE_EXT
+       GL_TEXTURE_COORD_ARRAY_TYPE
+       GL_TEXTURE_COORD_ARRAY_TYPE_EXT
+       GL_TEXTURE_CUBE_MAP
+       GL_TEXTURE_CUBE_MAP_ARB
+       GL_TEXTURE_CUBE_MAP_EXT
+       GL_TEXTURE_CUBE_MAP_NEGATIVE_X
+       GL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB
+       GL_TEXTURE_CUBE_MAP_NEGATIVE_X_EXT
+       GL_TEXTURE_CUBE_MAP_NEGATIVE_Y
+       GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB
+       GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_EXT
+       GL_TEXTURE_CUBE_MAP_NEGATIVE_Z
+       GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB
+       GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_EXT
+       GL_TEXTURE_CUBE_MAP_POSITIVE_X
+       GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB
+       GL_TEXTURE_CUBE_MAP_POSITIVE_X_EXT
+       GL_TEXTURE_CUBE_MAP_POSITIVE_Y
+       GL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB
+       GL_TEXTURE_CUBE_MAP_POSITIVE_Y_EXT
+       GL_TEXTURE_CUBE_MAP_POSITIVE_Z
+       GL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB
+       GL_TEXTURE_CUBE_MAP_POSITIVE_Z_EXT
+       GL_TEXTURE_DEPTH
+       GL_TEXTURE_DEPTH_EXT
+       GL_TEXTURE_DEPTH_SIZE
+       GL_TEXTURE_DEPTH_SIZE_ARB
+       GL_TEXTURE_DS_SIZE_NV
+       GL_TEXTURE_DT_SIZE_NV
+       GL_TEXTURE_ENV
+       GL_TEXTURE_ENV_COLOR
+       GL_TEXTURE_ENV_MODE
+       GL_TEXTURE_FILTER_CONTROL
+       GL_TEXTURE_FILTER_CONTROL_EXT
+       GL_TEXTURE_FLOAT_COMPONENTS_NV
+       GL_TEXTURE_GEN_MODE
+       GL_TEXTURE_GEN_Q
+       GL_TEXTURE_GEN_R
+       GL_TEXTURE_GEN_S
+       GL_TEXTURE_GEN_T
+       GL_TEXTURE_GEQUAL_R_SGIX
+       GL_TEXTURE_GREEN_SIZE
+       GL_TEXTURE_HEIGHT
+       GL_TEXTURE_HI_SIZE_NV
+       GL_TEXTURE_INDEX_SIZE_EXT
+       GL_TEXTURE_INTENSITY_SIZE
+       GL_TEXTURE_INTERNAL_FORMAT
+       GL_TEXTURE_LEQUAL_R_SGIX
+       GL_TEXTURE_LOD_BIAS
+       GL_TEXTURE_LOD_BIAS_EXT
+       GL_TEXTURE_LO_SIZE_NV
+       GL_TEXTURE_LUMINANCE_SIZE
+       GL_TEXTURE_MAG_FILTER
+       GL_TEXTURE_MAG_SIZE_NV
+       GL_TEXTURE_MATRIX
+       GL_TEXTURE_MAX_ANISOTROPY_EXT
+       GL_TEXTURE_MAX_LEVEL
+       GL_TEXTURE_MAX_LEVEL_SGIS
+       GL_TEXTURE_MAX_LOD
+       GL_TEXTURE_MAX_LOD_SGIS
+       GL_TEXTURE_MIN_FILTER
+       GL_TEXTURE_MIN_LOD
+       GL_TEXTURE_MIN_LOD_SGIS
+       GL_TEXTURE_PRIORITY
+       GL_TEXTURE_RECTANGLE_NV
+       GL_TEXTURE_RED_SIZE
+       GL_TEXTURE_RESIDENT
+       GL_TEXTURE_SHADER_NV
+       GL_TEXTURE_STACK_DEPTH
+       GL_TEXTURE_UNSIGNED_REMAP_MODE_NV
+       GL_TEXTURE_WIDTH
+       GL_TEXTURE_WRAP_R
+       GL_TEXTURE_WRAP_R_EXT
+       GL_TEXTURE_WRAP_S
+       GL_TEXTURE_WRAP_T
+       GL_TRACK_MATRIX_NV
+       GL_TRACK_MATRIX_TRANSFORM_NV
+       GL_TRANSFORM_BIT
+       GL_TRANSFORM_HINT_APPLE
+       GL_TRANSPOSE_COLOR_MATRIX
+       GL_TRANSPOSE_COLOR_MATRIX_ARB
+       GL_TRANSPOSE_CURRENT_MATRIX_ARB
+       GL_TRANSPOSE_MODELVIEW_MATRIX
+       GL_TRANSPOSE_MODELVIEW_MATRIX_ARB
+       GL_TRANSPOSE_NV
+       GL_TRANSPOSE_PROJECTION_MATRIX
+       GL_TRANSPOSE_PROJECTION_MATRIX_ARB
+       GL_TRANSPOSE_TEXTURE_MATRIX
+       GL_TRANSPOSE_TEXTURE_MATRIX_ARB
+       GL_TRIANGLES
+       GL_TRIANGLE_FAN
+       GL_TRIANGLE_STRIP
+       GL_TRUE
+       GL_UNPACK_ALIGNMENT
+       GL_UNPACK_IMAGE_HEIGHT
+       GL_UNPACK_IMAGE_HEIGHT_EXT
+       GL_UNPACK_LSB_FIRST
+       GL_UNPACK_ROW_LENGTH
+       GL_UNPACK_SKIP_IMAGES
+       GL_UNPACK_SKIP_IMAGES_EXT
+       GL_UNPACK_SKIP_PIXELS
+       GL_UNPACK_SKIP_ROWS
+       GL_UNPACK_SWAP_BYTES
+       GL_UNSIGNED_BYTE
+       GL_UNSIGNED_BYTE_2_3_3_REV
+       GL_UNSIGNED_BYTE_3_3_2
+       GL_UNSIGNED_BYTE_3_3_2_EXT
+       GL_UNSIGNED_IDENTITY_NV
+       GL_UNSIGNED_INT
+       GL_UNSIGNED_INT_10_10_10_2
+       GL_UNSIGNED_INT_10_10_10_2_EXT
+       GL_UNSIGNED_INT_24_8_NV
+       GL_UNSIGNED_INT_2_10_10_10_REV
+       GL_UNSIGNED_INT_8_8_8_8
+       GL_UNSIGNED_INT_8_8_8_8_EXT
+       GL_UNSIGNED_INT_8_8_8_8_REV
+       GL_UNSIGNED_INT_8_8_S8_S8_REV_NV
+       GL_UNSIGNED_INT_S10_S11_S11_REV_NV
+       GL_UNSIGNED_INT_S8_S8_8_8_NV
+       GL_UNSIGNED_INVERT_NV
+       GL_UNSIGNED_SHORT
+       GL_UNSIGNED_SHORT_1_5_5_5_REV
+       GL_UNSIGNED_SHORT_4_4_4_4
+       GL_UNSIGNED_SHORT_4_4_4_4_EXT
+       GL_UNSIGNED_SHORT_4_4_4_4_REV
+       GL_UNSIGNED_SHORT_5_5_5_1
+       GL_UNSIGNED_SHORT_5_5_5_1_EXT
+       GL_UNSIGNED_SHORT_5_6_5
+       GL_UNSIGNED_SHORT_5_6_5_REV
+       GL_V2F
+       GL_V3F
+       GL_VARIABLE_A_NV
+       GL_VARIABLE_B_NV
+       GL_VARIABLE_C_NV
+       GL_VARIABLE_D_NV
+       GL_VARIABLE_E_NV
+       GL_VARIABLE_F_NV
+       GL_VARIABLE_G_NV
+       GL_VENDOR
+       GL_VERSION
+       GL_VERTEX_ARRAY
+       GL_VERTEX_ARRAY_BUFFER_BINDING_ARB
+       GL_VERTEX_ARRAY_COUNT_EXT
+       GL_VERTEX_ARRAY_EXT
+       GL_VERTEX_ARRAY_POINTER
+       GL_VERTEX_ARRAY_POINTER_EXT
+       GL_VERTEX_ARRAY_RANGE_LENGTH_NV
+       GL_VERTEX_ARRAY_RANGE_NV
+       GL_VERTEX_ARRAY_RANGE_POINTER_NV
+       GL_VERTEX_ARRAY_RANGE_VALID_NV
+       GL_VERTEX_ARRAY_RANGE_WITHOUT_FLUSH_NV
+       GL_VERTEX_ARRAY_SIZE
+       GL_VERTEX_ARRAY_SIZE_EXT
+       GL_VERTEX_ARRAY_STRIDE
+       GL_VERTEX_ARRAY_STRIDE_EXT
+       GL_VERTEX_ARRAY_TYPE
+       GL_VERTEX_ARRAY_TYPE_EXT
+       GL_VERTEX_ATTRIB_ARRAY0_NV
+       GL_VERTEX_ATTRIB_ARRAY10_NV
+       GL_VERTEX_ATTRIB_ARRAY11_NV
+       GL_VERTEX_ATTRIB_ARRAY12_NV
+       GL_VERTEX_ATTRIB_ARRAY13_NV
+       GL_VERTEX_ATTRIB_ARRAY14_NV
+       GL_VERTEX_ATTRIB_ARRAY15_NV
+       GL_VERTEX_ATTRIB_ARRAY1_NV
+       GL_VERTEX_ATTRIB_ARRAY2_NV
+       GL_VERTEX_ATTRIB_ARRAY3_NV
+       GL_VERTEX_ATTRIB_ARRAY4_NV
+       GL_VERTEX_ATTRIB_ARRAY5_NV
+       GL_VERTEX_ATTRIB_ARRAY6_NV
+       GL_VERTEX_ATTRIB_ARRAY7_NV
+       GL_VERTEX_ATTRIB_ARRAY8_NV
+       GL_VERTEX_ATTRIB_ARRAY9_NV
+       GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING_ARB
+       GL_VERTEX_ATTRIB_ARRAY_ENABLED_ARB
+       GL_VERTEX_ATTRIB_ARRAY_NORMALIZED_ARB
+       GL_VERTEX_ATTRIB_ARRAY_POINTER_ARB
+       GL_VERTEX_ATTRIB_ARRAY_SIZE_ARB
+       GL_VERTEX_ATTRIB_ARRAY_STRIDE_ARB
+       GL_VERTEX_ATTRIB_ARRAY_TYPE_ARB
+       GL_VERTEX_PROGRAM_ARB
+       GL_VERTEX_PROGRAM_BINDING_NV
+       GL_VERTEX_PROGRAM_NV
+       GL_VERTEX_PROGRAM_POINT_SIZE_ARB
+       GL_VERTEX_PROGRAM_POINT_SIZE_NV
+       GL_VERTEX_PROGRAM_TWO_SIDE_ARB
+       GL_VERTEX_PROGRAM_TWO_SIDE_NV
+       GL_VERTEX_STATE_PROGRAM_NV
+       GL_VERTEX_WEIGHTING_EXT
+       GL_VERTEX_WEIGHT_ARRAY_EXT
+       GL_VERTEX_WEIGHT_ARRAY_POINTER_EXT
+       GL_VERTEX_WEIGHT_ARRAY_SIZE_EXT
+       GL_VERTEX_WEIGHT_ARRAY_STRIDE_EXT
+       GL_VERTEX_WEIGHT_ARRAY_TYPE_EXT
+       GL_VIBRANCE_BIAS_NV
+       GL_VIBRANCE_SCALE_NV
+       GL_VIEWPORT
+       GL_VIEWPORT_BIT
+       GL_WEIGHT_ARRAY_BUFFER_BINDING_ARB
+       GL_WRITE_ONLY_ARB
+       GL_WRITE_PIXEL_DATA_RANGE_LENGTH_NV
+       GL_WRITE_PIXEL_DATA_RANGE_NV
+       GL_WRITE_PIXEL_DATA_RANGE_POINTER_NV
+       GL_XOR
+       GL_YCRYCB_422_NVX
+       GL_ZERO
+       GL_ZOOM_X
+       GL_ZOOM_Y
+);
+
+for (@EXPORT) {
+       *{"SDL::" . $_} = *{$_};
+       *{"main::" . $_} = *{$_};
+}
+
+sub GLU_AUTO_LOAD_MATRIX {100200}
+sub GLU_CULLING {100201}
+sub GLU_DISPLAY_MODE {100204}
+sub GLU_DOMAIN_DISTANCE {100217}
+sub GLU_FILL {100012}
+sub GLU_MAP1_TRIM_2 {100210}
+sub GLU_MAP1_TRIM_3 {100211}
+sub GLU_NURBS_BEGIN {100164}
+sub GLU_NURBS_BEGIN_DATA {100170}
+sub GLU_NURBS_COLOR {100167}
+sub GLU_NURBS_COLOR_DATA {100173}
+sub GLU_NURBS_END {100169}
+sub GLU_NURBS_END_DATA {100175}
+sub GLU_NURBS_ERROR {100103}
+sub GLU_NURBS_MODE {100160}
+sub GLU_NURBS_NORMAL {100166}
+sub GLU_NURBS_NORMAL_DATA {100172}
+sub GLU_NURBS_RENDERER {100162}
+sub GLU_NURBS_TESSELLATOR {100161}
+sub GLU_NURBS_TEXTURE_COORD {100168}
+sub GLU_NURBS_TEXTURE_COORD_DATA {100174}
+sub GLU_NURBS_VERTEX {100165}
+sub GLU_NURBS_VERTEX_DATA {100171}
+sub GLU_OBJECT_PARAMETRIC_ERROR {100208}
+sub GLU_OBJECT_PATH_LENGTH {100209}
+sub GLU_OUTLINE_PATCH {100241}
+sub GLU_OUTLINE_POLYGON {100240}
+sub GLU_PARAMETRIC_TOLERANCE {100202}
+sub GLU_PATH_LENGTH {100215}
+sub GLU_SAMPLING_METHOD {100205}
+sub GLU_SAMPLING_TOLERANCE {100203}
+sub GLU_TESS_BOUNDARY_ONLY {100141}
+sub GLU_TESS_TOLERANCE {100142}
+sub GLU_TESS_WINDING_ABS_GEQ_TWO {100134}
+sub GLU_TESS_WINDING_NEGATIVE {100133}
+sub GLU_TESS_WINDING_NONZERO {100131}
+sub GLU_TESS_WINDING_ODD {100130}
+sub GLU_TESS_WINDING_POSITIVE {100132}
+sub GLU_TESS_WINDING_RULE {100140}
+sub GLU_U_STEP {100206}
+sub GLU_V_STEP {100207}
+sub GL_2D {0x0600}
+sub GL_2_BYTES {0x1407}
+sub GL_3D {0x0601}
+sub GL_3D_COLOR {0x0602}
+sub GL_3D_COLOR_TEXTURE {0x0603}
+sub GL_3_BYTES {0x1408}
+sub GL_4D_COLOR_TEXTURE {0x0604}
+sub GL_4_BYTES {0x1409}
+sub GL_ABGR_EXT {0x8000}
+sub GL_ACCUM {0x0100}
+sub GL_ACCUM_ALPHA_BITS {0x0D5B}
+sub GL_ACCUM_BLUE_BITS {0x0D5A}
+sub GL_ACCUM_BUFFER_BIT {0x00000200}
+sub GL_ACCUM_CLEAR_VALUE {0x0B80}
+sub GL_ACCUM_GREEN_BITS {0x0D59}
+sub GL_ACCUM_RED_BITS {0x0D58}
+sub GL_ACTIVE_STENCIL_FACE_EXT {0x8911}
+sub GL_ACTIVE_TEXTURE {0x84E0}
+sub GL_ACTIVE_TEXTURE_ARB {0x84E0}
+sub GL_ADD {0x0104}
+sub GL_ADD_SIGNED {0x8574}
+sub GL_ADD_SIGNED_ARB {0x8574}
+sub GL_ADD_SIGNED_EXT {0x8574}
+sub GL_ALIASED_LINE_WIDTH_RANGE {0x846E}
+sub GL_ALIASED_POINT_SIZE_RANGE {0x846D}
+sub GL_ALL_ATTRIB_BITS {0xFFFFFFFF}
+sub GL_ALL_COMPLETED_NV {0x84F2}
+sub GL_ALL_EXTENSIONS_NV {0x84FB}
+sub GL_ALPHA {0x1906}
+sub GL_ALPHA12 {0x803D}
+sub GL_ALPHA16 {0x803E}
+sub GL_ALPHA4 {0x803B}
+sub GL_ALPHA8 {0x803C}
+sub GL_ALPHA_BIAS {0x0D1D}
+sub GL_ALPHA_BITS {0x0D55}
+sub GL_ALPHA_SCALE {0x0D1C}
+sub GL_ALPHA_TEST {0x0BC0}
+sub GL_ALPHA_TEST_FUNC {0x0BC1}
+sub GL_ALPHA_TEST_REF {0x0BC2}
+sub GL_ALWAYS {0x0207}
+sub GL_AMBIENT {0x1200}
+sub GL_AMBIENT_AND_DIFFUSE {0x1602}
+sub GL_AND {0x1501}
+sub GL_AND_INVERTED {0x1504}
+sub GL_AND_REVERSE {0x1502}
+sub GL_ARRAY_BUFFER_ARB {0x8892}
+sub GL_ARRAY_BUFFER_BINDING_ARB {0x8894}
+sub GL_ARRAY_ELEMENT_LOCK_COUNT_EXT {0x81A9}
+sub GL_ARRAY_ELEMENT_LOCK_FIRST_EXT {0x81A8}
+sub GL_ATTRIB_ARRAY_POINTER_NV {0x8645}
+sub GL_ATTRIB_ARRAY_SIZE_NV {0x8623}
+sub GL_ATTRIB_ARRAY_STRIDE_NV {0x8624}
+sub GL_ATTRIB_ARRAY_TYPE_NV {0x8625}
+sub GL_ATTRIB_STACK_DEPTH {0x0BB0}
+sub GL_AUTO_NORMAL {0x0D80}
+sub GL_AUX0 {0x0409}
+sub GL_AUX1 {0x040A}
+sub GL_AUX2 {0x040B}
+sub GL_AUX3 {0x040C}
+sub GL_AUX_BUFFERS {0x0C00}
+sub GL_BACK {0x0405}
+sub GL_BACK_LEFT {0x0402}
+sub GL_BACK_RIGHT {0x0403}
+sub GL_BGR {0x80E0}
+sub GL_BGRA {0x80E1}
+sub GL_BGRA_EXT {0x80E1}
+sub GL_BGR_EXT {0x80E0}
+sub GL_BIAS_BY_NEGATIVE_ONE_HALF_NV {0x8541}
+sub GL_BITMAP {0x1A00}
+sub GL_BITMAP_TOKEN {0x0704}
+sub GL_BLEND {0x0BE2}
+sub GL_BLEND_COLOR {0x8005}
+sub GL_BLEND_COLOR_EXT {0x8005}
+sub GL_BLEND_DST {0x0BE0}
+sub GL_BLEND_DST_ALPHA {0x80CA}
+sub GL_BLEND_DST_ALPHA_EXT {0x80CA}
+sub GL_BLEND_DST_RGB {0x80C8}
+sub GL_BLEND_DST_RGB_EXT {0x80C8}
+sub GL_BLEND_EQUATION {0x8009}
+sub GL_BLEND_EQUATION_EXT {0x8009}
+sub GL_BLEND_SRC {0x0BE1}
+sub GL_BLEND_SRC_ALPHA {0x80CB}
+sub GL_BLEND_SRC_ALPHA_EXT {0x80CB}
+sub GL_BLEND_SRC_RGB {0x80C9}
+sub GL_BLEND_SRC_RGB_EXT {0x80C9}
+sub GL_BLUE {0x1905}
+sub GL_BLUE_BIAS {0x0D1B}
+sub GL_BLUE_BITS {0x0D54}
+sub GL_BLUE_SCALE {0x0D1A}
+sub GL_BUFFER_ACCESS_ARB {0x88BB}
+sub GL_BUFFER_MAPPED_ARB {0x88BC}
+sub GL_BUFFER_MAP_POINTER_ARB {0x88BD}
+sub GL_BUFFER_SIZE_ARB {0x8764}
+sub GL_BUFFER_USAGE_ARB {0x8765}
+sub GL_BYTE {0x1400}
+sub GL_C3F_V3F {0x2A24}
+sub GL_C4F_N3F_V3F {0x2A26}
+sub GL_C4UB_V2F {0x2A22}
+sub GL_C4UB_V3F {0x2A23}
+sub GL_CCW {0x0901}
+sub GL_CLAMP {0x2900}
+sub GL_CLAMP_TO_BORDER {0x812D}
+sub GL_CLAMP_TO_BORDER_ARB {0x812D}
+sub GL_CLAMP_TO_EDGE {0x812F}
+sub GL_CLAMP_TO_EDGE_EXT {0x812F}
+sub GL_CLEAR {0x1500}
+sub GL_CLIENT_ACTIVE_TEXTURE {0x84E1}
+sub GL_CLIENT_ACTIVE_TEXTURE_ARB {0x84E1}
+sub GL_CLIENT_ALL_ATTRIB_BITS {0xFFFFFFFF}
+sub GL_ALL_CLIENT_ATTRIB_BITS {0xFFFFFFFF}
+sub GL_CLIENT_ATTRIB_STACK_DEPTH {0x0BB1}
+sub GL_CLIENT_PIXEL_STORE_BIT {0x00000001}
+sub GL_CLIENT_VERTEX_ARRAY_BIT {0x00000002}
+sub GL_CLIP_PLANE0 {0x3000}
+sub GL_CLIP_PLANE1 {0x3001}
+sub GL_CLIP_PLANE2 {0x3002}
+sub GL_CLIP_PLANE3 {0x3003}
+sub GL_CLIP_PLANE4 {0x3004}
+sub GL_CLIP_PLANE5 {0x3005}
+sub GL_CLIP_VOLUME_CLIPPING_HINT_EXT {0x80F0}
+sub GL_COEFF {0x0A00}
+sub GL_COLOR {0x1800}
+sub GL_COLOR_ARRAY {0x8076}
+sub GL_COLOR_ARRAY_BUFFER_BINDING_ARB {0x8898}
+sub GL_COLOR_ARRAY_COUNT_EXT {0x8084}
+sub GL_COLOR_ARRAY_EXT {0x8076}
+sub GL_COLOR_ARRAY_POINTER {0x8090}
+sub GL_COLOR_ARRAY_POINTER_EXT {0x8090}
+sub GL_COLOR_ARRAY_SIZE {0x8081}
+sub GL_COLOR_ARRAY_SIZE_EXT {0x8081}
+sub GL_COLOR_ARRAY_STRIDE {0x8083}
+sub GL_COLOR_ARRAY_STRIDE_EXT {0x8083}
+sub GL_COLOR_ARRAY_TYPE {0x8082}
+sub GL_COLOR_ARRAY_TYPE_EXT {0x8082}
+sub GL_COLOR_BUFFER_BIT {0x00004000}
+sub GL_COLOR_CLEAR_VALUE {0x0C22}
+sub GL_COLOR_INDEX {0x1900}
+sub GL_COLOR_INDEX12_EXT {0x80E6}
+sub GL_COLOR_INDEX16_EXT {0x80E7}
+sub GL_COLOR_INDEX1_EXT {0x80E2}
+sub GL_COLOR_INDEX2_EXT {0x80E3}
+sub GL_COLOR_INDEX4_EXT {0x80E4}
+sub GL_COLOR_INDEX8_EXT {0x80E5}
+sub GL_COLOR_INDEXES {0x1603}
+sub GL_COLOR_LOGIC_OP {0x0BF2}
+sub GL_COLOR_MATERIAL {0x0B57}
+sub GL_COLOR_MATERIAL_FACE {0x0B55}
+sub GL_COLOR_MATERIAL_PARAMETER {0x0B56}
+sub GL_COLOR_MATRIX {0x80B1}
+sub GL_COLOR_MATRIX_STACK_DEPTH {0x80B2}
+sub GL_COLOR_SUM {0x8458}
+sub GL_COLOR_SUM_ARB {0x8458}
+sub GL_COLOR_SUM_CLAMP_NV {0x854F}
+sub GL_COLOR_SUM_EXT {0x8458}
+sub GL_COLOR_TABLE {0x80D0}
+sub GL_COLOR_TABLE_ALPHA_SIZE {0x80DD}
+sub GL_COLOR_TABLE_ALPHA_SIZE_EXT {0x80DD}
+sub GL_COLOR_TABLE_BIAS {0x80D7}
+sub GL_COLOR_TABLE_BLUE_SIZE {0x80DC}
+sub GL_COLOR_TABLE_BLUE_SIZE_EXT {0x80DC}
+sub GL_COLOR_TABLE_FORMAT {0x80D8}
+sub GL_COLOR_TABLE_FORMAT_EXT {0x80D8}
+sub GL_COLOR_TABLE_GREEN_SIZE {0x80DB}
+sub GL_COLOR_TABLE_GREEN_SIZE_EXT {0x80DB}
+sub GL_COLOR_TABLE_INTENSITY_SIZE {0x80DF}
+sub GL_COLOR_TABLE_INTENSITY_SIZE_EXT {0x80DF}
+sub GL_COLOR_TABLE_LUMINANCE_SIZE {0x80DE}
+sub GL_COLOR_TABLE_LUMINANCE_SIZE_EXT {0x80DE}
+sub GL_COLOR_TABLE_RED_SIZE {0x80DA}
+sub GL_COLOR_TABLE_RED_SIZE_EXT {0x80DA}
+sub GL_COLOR_TABLE_SCALE {0x80D6}
+sub GL_COLOR_TABLE_WIDTH {0x80D9}
+sub GL_COLOR_TABLE_WIDTH_EXT {0x80D9}
+sub GL_COLOR_WRITEMASK {0x0C23}
+sub GL_COMBINE {0x8570}
+sub GL_COMBINE4_NV {0x8503}
+sub GL_COMBINER0_NV {0x8550}
+sub GL_COMBINER1_NV {0x8551}
+sub GL_COMBINER2_NV {0x8552}
+sub GL_COMBINER3_NV {0x8553}
+sub GL_COMBINER4_NV {0x8554}
+sub GL_COMBINER5_NV {0x8555}
+sub GL_COMBINER6_NV {0x8556}
+sub GL_COMBINER7_NV {0x8557}
+sub GL_COMBINER_AB_DOT_PRODUCT_NV {0x8545}
+sub GL_COMBINER_AB_OUTPUT_NV {0x854A}
+sub GL_COMBINER_BIAS_NV {0x8549}
+sub GL_COMBINER_CD_DOT_PRODUCT_NV {0x8546}
+sub GL_COMBINER_CD_OUTPUT_NV {0x854B}
+sub GL_COMBINER_COMPONENT_USAGE_NV {0x8544}
+sub GL_COMBINER_INPUT_NV {0x8542}
+sub GL_COMBINER_MAPPING_NV {0x8543}
+sub GL_COMBINER_MUX_SUM_NV {0x8547}
+sub GL_COMBINER_SCALE_NV {0x8548}
+sub GL_COMBINER_SUM_OUTPUT_NV {0x854C}
+sub GL_COMBINE_ALPHA {0x8572}
+sub GL_COMBINE_ALPHA_ARB {0x8572}
+sub GL_COMBINE_ALPHA_EXT {0x8572}
+sub GL_COMBINE_ARB {0x8570}
+sub GL_COMBINE_EXT {0x8570}
+sub GL_COMBINE_RGB {0x8571}
+sub GL_COMBINE_RGB_ARB {0x8571}
+sub GL_COMBINE_RGB_EXT {0x8571}
+sub GL_COMPARE_R_TO_TEXTURE {0x884E}
+sub GL_COMPARE_R_TO_TEXTURE_ARB {0x884E}
+sub GL_COMPILE {0x1300}
+sub GL_COMPILE_AND_EXECUTE {0x1301}
+sub GL_COMPRESSED_ALPHA {0x84E9}
+sub GL_COMPRESSED_ALPHA_ARB {0x84E9}
+sub GL_COMPRESSED_INTENSITY {0x84EC}
+sub GL_COMPRESSED_INTENSITY_ARB {0x84EC}
+sub GL_COMPRESSED_LUMINANCE {0x84EA}
+sub GL_COMPRESSED_LUMINANCE_ALPHA {0x84EB}
+sub GL_COMPRESSED_LUMINANCE_ALPHA_ARB {0x84EB}
+sub GL_COMPRESSED_LUMINANCE_ARB {0x84EA}
+sub GL_COMPRESSED_RGB {0x84ED}
+sub GL_COMPRESSED_RGBA {0x84EE}
+sub GL_COMPRESSED_RGBA_ARB {0x84EE}
+sub GL_COMPRESSED_RGBA_S3TC_DXT1_EXT {0x83F1}
+sub GL_COMPRESSED_RGBA_S3TC_DXT3_EXT {0x83F2}
+sub GL_COMPRESSED_RGBA_S3TC_DXT5_EXT {0x83F3}
+sub GL_COMPRESSED_RGB_ARB {0x84ED}
+sub GL_COMPRESSED_RGB_S3TC_DXT1_EXT {0x83F0}
+sub GL_COMPRESSED_TEXTURE_FORMATS {0x86A3}
+sub GL_COMPRESSED_TEXTURE_FORMATS_ARB {0x86A3}
+sub GL_CONSTANT {0x8576}
+sub GL_CONSTANT_ALPHA {0x8003}
+sub GL_CONSTANT_ALPHA_EXT {0x8003}
+sub GL_CONSTANT_ARB {0x8576}
+sub GL_CONSTANT_ATTENUATION {0x1207}
+sub GL_CONSTANT_BORDER {0x8151}
+sub GL_CONSTANT_COLOR {0x8001}
+sub GL_CONSTANT_COLOR0_NV {0x852A}
+sub GL_CONSTANT_COLOR1_NV {0x852B}
+sub GL_CONSTANT_COLOR_EXT {0x8001}
+sub GL_CONSTANT_EXT {0x8576}
+sub GL_CONST_EYE_NV {0x86E5}
+sub GL_CONVOLUTION_1D {0x8010}
+sub GL_CONVOLUTION_2D {0x8011}
+sub GL_CONVOLUTION_BORDER_COLOR {0x8154}
+sub GL_CONVOLUTION_BORDER_MODE {0x8013}
+sub GL_CONVOLUTION_FILTER_BIAS {0x8015}
+sub GL_CONVOLUTION_FILTER_SCALE {0x8014}
+sub GL_CONVOLUTION_FORMAT {0x8017}
+sub GL_CONVOLUTION_HEIGHT {0x8019}
+sub GL_CONVOLUTION_WIDTH {0x8018}
+sub GL_COORD_REPLACE_NV {0x8862}
+sub GL_COPY {0x1503}
+sub GL_COPY_INVERTED {0x150C}
+sub GL_COPY_PIXEL_TOKEN {0x0706}
+sub GL_CRYCBY_422_NVX {0x600A}
+sub GL_CULL_FACE {0x0B44}
+sub GL_CULL_FACE_MODE {0x0B45}
+sub GL_CULL_FRAGMENT_NV {0x86E7}
+sub GL_CULL_MODES_NV {0x86E0}
+sub GL_CURRENT_ATTRIB_NV {0x8626}
+sub GL_CURRENT_BIT {0x00000001}
+sub GL_CURRENT_COLOR {0x0B00}
+sub GL_CURRENT_FLUSHHOLD_NVX {0x6008}
+sub GL_CURRENT_FOG_COORDINATE {0x8453}
+sub GL_CURRENT_FOG_COORDINATE_EXT {0x8453}
+sub GL_CURRENT_INDEX {0x0B01}
+sub GL_CURRENT_MATRIX_ARB {0x8641}
+sub GL_CURRENT_MATRIX_NV {0x8641}
+sub GL_CURRENT_MATRIX_STACK_DEPTH_ARB {0x8640}
+sub GL_CURRENT_MATRIX_STACK_DEPTH_NV {0x8640}
+sub GL_CURRENT_NORMAL {0x0B02}
+sub GL_CURRENT_OCCLUSION_QUERY_ID_NV {0x8865}
+sub GL_CURRENT_RASTER_COLOR {0x0B04}
+sub GL_CURRENT_RASTER_DISTANCE {0x0B09}
+sub GL_CURRENT_RASTER_INDEX {0x0B05}
+sub GL_CURRENT_RASTER_POSITION {0x0B07}
+sub GL_CURRENT_RASTER_POSITION_VALID {0x0B08}
+sub GL_CURRENT_RASTER_TEXTURE_COORDS {0x0B06}
+sub GL_CURRENT_SECONDARY_COLOR {0x8459}
+sub GL_CURRENT_SECONDARY_COLOR_EXT {0x8459}
+sub GL_CURRENT_TEXTURE_COORDS {0x0B03}
+sub GL_CURRENT_VERTEX_ATTRIB_ARB {0x8626}
+sub GL_CURRENT_VERTEX_WEIGHT_EXT {0x850B}
+sub GL_CW {0x0900}
+sub GL_DECAL {0x2101}
+sub GL_DECR {0x1E03}
+sub GL_DECR_WRAP {0x8508}
+sub GL_DECR_WRAP_EXT {0x8508}
+sub GL_DEPENDENT_AR_TEXTURE_2D_NV {0x86E9}
+sub GL_DEPENDENT_GB_TEXTURE_2D_NV {0x86EA}
+sub GL_DEPENDENT_HILO_TEXTURE_2D_NV {0x8858}
+sub GL_DEPENDENT_RGB_TEXTURE_3D_NV {0x8859}
+sub GL_DEPENDENT_RGB_TEXTURE_CUBE_MAP_NV {0x885A}
+sub GL_DEPTH {0x1801}
+sub GL_DEPTH_BIAS {0x0D1F}
+sub GL_DEPTH_BITS {0x0D56}
+sub GL_DEPTH_BOUNDS_NV {0x8891}
+sub GL_DEPTH_BOUNDS_TEST_NV {0x8890}
+sub GL_DEPTH_BUFFER_BIT {0x00000100}
+sub GL_DEPTH_CLAMP_NV {0x864F}
+sub GL_DEPTH_CLEAR_VALUE {0x0B73}
+sub GL_DEPTH_COMPONENT {0x1902}
+sub GL_DEPTH_COMPONENT16 {0x81A5}
+sub GL_DEPTH_COMPONENT16_ARB {0x81A5}
+sub GL_DEPTH_COMPONENT16_SGIX {0x81A5}
+sub GL_DEPTH_COMPONENT24 {0x81A6}
+sub GL_DEPTH_COMPONENT24_ARB {0x81A6}
+sub GL_DEPTH_COMPONENT24_SGIX {0x81A6}
+sub GL_DEPTH_COMPONENT32 {0x81A7}
+sub GL_DEPTH_COMPONENT32_ARB {0x81A7}
+sub GL_DEPTH_COMPONENT32_SGIX {0x81A7}
+sub GL_DEPTH_FUNC {0x0B74}
+sub GL_DEPTH_RANGE {0x0B70}
+sub GL_DEPTH_SCALE {0x0D1E}
+sub GL_DEPTH_STENCIL_NV {0x84F9}
+sub GL_DEPTH_STENCIL_TO_BGRA_NV {0x886F}
+sub GL_DEPTH_STENCIL_TO_RGBA_NV {0x886E}
+sub GL_DEPTH_TEST {0x0B71}
+sub GL_DEPTH_TEXTURE_MODE {0x884B}
+sub GL_DEPTH_TEXTURE_MODE_ARB {0x884B}
+sub GL_DEPTH_WRITEMASK {0x0B72}
+sub GL_DIFFUSE {0x1201}
+sub GL_DISCARD_NV {0x8530}
+sub GL_DISTANCE_ATTENUATION_EXT {0x8129}
+sub GL_DITHER {0x0BD0}
+sub GL_DOMAIN {0x0A02}
+sub GL_DONT_CARE {0x1100}
+sub GL_DOT3_RGB {0x86AE}
+sub GL_DOT3_RGBA {0x86AF}
+sub GL_DOT3_RGBA_ARB {0x86AF}
+sub GL_DOT3_RGBA_EXT {0x8741}
+sub GL_DOT3_RGB_ARB {0x86AE}
+sub GL_DOT3_RGB_EXT {0x8740}
+sub GL_DOT_PRODUCT_AFFINE_DEPTH_REPLACE_NV {0x885D}
+sub GL_DOT_PRODUCT_CONST_EYE_REFLECT_CUBE_MAP_NV {0x86F3}
+sub GL_DOT_PRODUCT_DEPTH_REPLACE_NV {0x86ED}
+sub GL_DOT_PRODUCT_DIFFUSE_CUBE_MAP_NV {0x86F1}
+sub GL_DOT_PRODUCT_NV {0x86EC}
+sub GL_DOT_PRODUCT_PASS_THROUGH_NV {0x885B}
+sub GL_DOT_PRODUCT_REFLECT_CUBE_MAP_NV {0x86F2}
+sub GL_DOT_PRODUCT_TEXTURE_1D_NV {0x885C}
+sub GL_DOT_PRODUCT_TEXTURE_2D_NV {0x86EE}
+sub GL_DOT_PRODUCT_TEXTURE_3D_NV {0x86EF}
+sub GL_DOT_PRODUCT_TEXTURE_CUBE_MAP_NV {0x86F0}
+sub GL_DOT_PRODUCT_TEXTURE_RECTANGLE_NV {0x864E}
+sub GL_DOUBLE {0x140A}
+sub GL_DOUBLEBUFFER {0x0C32}
+sub GL_DOUBLE_EXT {0x140A}
+sub GL_DRAW_BUFFER {0x0C01}
+sub GL_DRAW_PIXEL_TOKEN {0x0705}
+sub GL_DSDT8_MAG8_INTENSITY8_NV {0x870B}
+sub GL_DSDT8_MAG8_NV {0x870A}
+sub GL_DSDT8_NV {0x8709}
+sub GL_DSDT_MAG_INTENSITY_NV {0x86DC}
+sub GL_DSDT_MAG_NV {0x86F6}
+sub GL_DSDT_MAG_VIB_NV {0x86F7}
+sub GL_DSDT_NV {0x86F5}
+sub GL_DST_ALPHA {0x0304}
+sub GL_DST_COLOR {0x0306}
+sub GL_DS_BIAS_NV {0x8716}
+sub GL_DS_SCALE_NV {0x8710}
+sub GL_DT_BIAS_NV {0x8717}
+sub GL_DT_SCALE_NV {0x8711}
+sub GL_DYNAMIC_COPY_ARB {0x88EA}
+sub GL_DYNAMIC_DRAW_ARB {0x88E8}
+sub GL_DYNAMIC_READ_ARB {0x88E9}
+sub GL_EDGE_FLAG {0x0B43}
+sub GL_EDGE_FLAG_ARRAY {0x8079}
+sub GL_EDGE_FLAG_ARRAY_BUFFER_BINDING_ARB {0x889B}
+sub GL_EDGE_FLAG_ARRAY_COUNT_EXT {0x808D}
+sub GL_EDGE_FLAG_ARRAY_EXT {0x8079}
+sub GL_EDGE_FLAG_ARRAY_POINTER {0x8093}
+sub GL_EDGE_FLAG_ARRAY_POINTER_EXT {0x8093}
+sub GL_EDGE_FLAG_ARRAY_STRIDE {0x808C}
+sub GL_EDGE_FLAG_ARRAY_STRIDE_EXT {0x808C}
+sub GL_ELEMENT_ARRAY_BUFFER_ARB {0x8893}
+sub GL_ELEMENT_ARRAY_BUFFER_BINDING_ARB {0x8895}
+sub GL_EMISSION {0x1600}
+sub GL_ENABLE_BIT {0x00002000}
+sub GL_EQUAL {0x0202}
+sub GL_EQUIV {0x1509}
+sub GL_EVAL_BIT {0x00010000}
+sub GL_EXP {0x0800}
+sub GL_EXP2 {0x0801}
+sub GL_EXPAND_NEGATE_NV {0x8539}
+sub GL_EXPAND_NORMAL_NV {0x8538}
+sub GL_EXTENSIONS {0x1F03}
+sub GL_EYE_LINEAR {0x2400}
+sub GL_EYE_PLANE {0x2502}
+sub GL_EYE_PLANE_ABSOLUTE_NV {0x855C}
+sub GL_EYE_RADIAL_NV {0x855B}
+sub GL_E_TIMES_F_NV {0x8531}
+sub GL_FALSE {0}
+sub GL_FASTEST {0x1101}
+sub GL_FEEDBACK {0x1C01}
+sub GL_FEEDBACK_BUFFER_POINTER {0x0DF0}
+sub GL_FEEDBACK_BUFFER_SIZE {0x0DF1}
+sub GL_FEEDBACK_BUFFER_TYPE {0x0DF2}
+sub GL_FENCE_CONDITION_NV {0x84F4}
+sub GL_FENCE_STATUS_NV {0x84F3}
+sub GL_FILL {0x1B02}
+sub GL_FLAT {0x1D00}
+sub GL_FLOAT {0x1406}
+sub GL_FLOAT_CLEAR_COLOR_VALUE_NV {0x888D}
+sub GL_FLOAT_R16_NV {0x8884}
+sub GL_FLOAT_R32_NV {0x8885}
+sub GL_FLOAT_RG16_NV {0x8886}
+sub GL_FLOAT_RG32_NV {0x8887}
+sub GL_FLOAT_RGB16_NV {0x8888}
+sub GL_FLOAT_RGB32_NV {0x8889}
+sub GL_FLOAT_RGBA16_NV {0x888A}
+sub GL_FLOAT_RGBA32_NV {0x888B}
+sub GL_FLOAT_RGBA_MODE_NV {0x888E}
+sub GL_FLOAT_RGBA_NV {0x8883}
+sub GL_FLOAT_RGB_NV {0x8882}
+sub GL_FLOAT_RG_NV {0x8881}
+sub GL_FLOAT_R_NV {0x8880}
+sub GL_FOG {0x0B60}
+sub GL_FOG_BIT {0x00000080}
+sub GL_FOG_COLOR {0x0B66}
+sub GL_FOG_COORDINATE {0x8451}
+sub GL_FOG_COORDINATE_ARRAY {0x8457}
+sub GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING_ARB {0x889D}
+sub GL_FOG_COORDINATE_ARRAY_EXT {0x8457}
+sub GL_FOG_COORDINATE_ARRAY_POINTER {0x8456}
+sub GL_FOG_COORDINATE_ARRAY_POINTER_EXT {0x8456}
+sub GL_FOG_COORDINATE_ARRAY_STRIDE {0x8455}
+sub GL_FOG_COORDINATE_ARRAY_STRIDE_EXT {0x8455}
+sub GL_FOG_COORDINATE_ARRAY_TYPE {0x8454}
+sub GL_FOG_COORDINATE_ARRAY_TYPE_EXT {0x8454}
+sub GL_FOG_COORDINATE_EXT {0x8451}
+sub GL_FOG_COORDINATE_SOURCE {0x8450}
+sub GL_FOG_COORDINATE_SOURCE_EXT {0x8450}
+sub GL_FOG_DENSITY {0x0B62}
+sub GL_FOG_DISTANCE_MODE_NV {0x855A}
+sub GL_FOG_END {0x0B64}
+sub GL_FOG_HINT {0x0C54}
+sub GL_FOG_INDEX {0x0B61}
+sub GL_FOG_MODE {0x0B65}
+sub GL_FOG_START {0x0B63}
+sub GL_FORCE_BLUE_TO_ONE_NV {0x8860}
+sub GL_FORCE_SOFTWARE_NV {0x6007}
+sub GL_FRAGMENT_DEPTH {0x8452}
+sub GL_FRAGMENT_DEPTH_EXT {0x8452}
+sub GL_FRAGMENT_PROGRAM_ARB {0x8804}
+sub GL_FRAGMENT_PROGRAM_BINDING_NV {0x8873}
+sub GL_FRAGMENT_PROGRAM_NV {0x8870}
+sub GL_FRONT {0x0404}
+sub GL_FRONT_AND_BACK {0x0408}
+sub GL_FRONT_FACE {0x0B46}
+sub GL_FRONT_LEFT {0x0400}
+sub GL_FRONT_RIGHT {0x0401}
+sub GL_FUNC_ADD {0x8006}
+sub GL_FUNC_ADD_EXT {0x8006}
+sub GL_FUNC_REVERSE_SUBTRACT {0x800B}
+sub GL_FUNC_REVERSE_SUBTRACT_EXT {0x800B}
+sub GL_FUNC_SUBTRACT {0x800A}
+sub GL_FUNC_SUBTRACT_EXT {0x800A}
+sub GL_GENERATE_MIPMAP {0x8191}
+sub GL_GENERATE_MIPMAP_HINT {0x8192}
+sub GL_GENERATE_MIPMAP_HINT_SGIS {0x8192}
+sub GL_GENERATE_MIPMAP_SGIS {0x8191}
+sub GL_GEQUAL {0x0206}
+sub GL_GREATER {0x0204}
+sub GL_GREEN {0x1904}
+sub GL_GREEN_BIAS {0x0D19}
+sub GL_GREEN_BITS {0x0D53}
+sub GL_GREEN_SCALE {0x0D18}
+sub GL_HALF_BIAS_NEGATE_NV {0x853B}
+sub GL_HALF_BIAS_NORMAL_NV {0x853A}
+sub GL_HALF_FLOAT_NV {0x140B}
+sub GL_HILO16_NV {0x86F8}
+sub GL_HILO8_NV {0x885E}
+sub GL_HILO_NV {0x86F4}
+sub GL_HINT_BIT {0x00008000}
+sub GL_HISTOGRAM {0x8024}
+sub GL_HISTOGRAM_ALPHA_SIZE {0x802B}
+sub GL_HISTOGRAM_BLUE_SIZE {0x802A}
+sub GL_HISTOGRAM_FORMAT {0x8027}
+sub GL_HISTOGRAM_GREEN_SIZE {0x8029}
+sub GL_HISTOGRAM_LUMINANCE_SIZE {0x802C}
+sub GL_HISTOGRAM_RED_SIZE {0x8028}
+sub GL_HISTOGRAM_SINK {0x802D}
+sub GL_HISTOGRAM_WIDTH {0x8026}
+sub GL_HI_BIAS_NV {0x8714}
+sub GL_HI_SCALE_NV {0x870E}
+sub GL_IDENTITY_NV {0x862A}
+sub GL_IGNORE_BORDER {0x8150}
+sub GL_INCR {0x1E02}
+sub GL_INCR_WRAP {0x8507}
+sub GL_INCR_WRAP_EXT {0x8507}
+sub GL_INDEX_ARRAY {0x8077}
+sub GL_INDEX_ARRAY_BUFFER_BINDING_ARB {0x8899}
+sub GL_INDEX_ARRAY_COUNT_EXT {0x8087}
+sub GL_INDEX_ARRAY_EXT {0x8077}
+sub GL_INDEX_ARRAY_POINTER {0x8091}
+sub GL_INDEX_ARRAY_POINTER_EXT {0x8091}
+sub GL_INDEX_ARRAY_STRIDE {0x8086}
+sub GL_INDEX_ARRAY_STRIDE_EXT {0x8086}
+sub GL_INDEX_ARRAY_TYPE {0x8085}
+sub GL_INDEX_ARRAY_TYPE_EXT {0x8085}
+sub GL_INDEX_BITS {0x0D51}
+sub GL_INDEX_CLEAR_VALUE {0x0C20}
+sub GL_INDEX_LOGIC_OP {0x0BF1}
+sub GL_INDEX_MODE {0x0C30}
+sub GL_INDEX_OFFSET {0x0D13}
+sub GL_INDEX_SHIFT {0x0D12}
+sub GL_INDEX_WRITEMASK {0x0C21}
+sub GL_INT {0x1404}
+sub GL_INTENSITY {0x8049}
+sub GL_INTENSITY12 {0x804C}
+sub GL_INTENSITY16 {0x804D}
+sub GL_INTENSITY4 {0x804A}
+sub GL_INTENSITY8 {0x804B}
+sub GL_INTERPOLATE {0x8575}
+sub GL_INTERPOLATE_ARB {0x8575}
+sub GL_INTERPOLATE_EXT {0x8575}
+sub GL_INVALID_ENUM {0x0500}
+sub GL_INVALID_OPERATION {0x0502}
+sub GL_INVALID_VALUE {0x0501}
+sub GL_INVERSE_NV {0x862B}
+sub GL_INVERSE_TRANSPOSE_NV {0x862D}
+sub GL_INVERT {0x150A}
+sub GL_KEEP {0x1E00}
+sub GL_LEFT {0x0406}
+sub GL_LEQUAL {0x0203}
+sub GL_LESS {0x0201}
+sub GL_LIGHT0 {0x4000}
+sub GL_LIGHT1 {0x4001}
+sub GL_LIGHT2 {0x4002}
+sub GL_LIGHT3 {0x4003}
+sub GL_LIGHT4 {0x4004}
+sub GL_LIGHT5 {0x4005}
+sub GL_LIGHT6 {0x4006}
+sub GL_LIGHT7 {0x4007}
+sub GL_LIGHTING {0x0B50}
+sub GL_LIGHTING_BIT {0x00000040}
+sub GL_LIGHT_MODEL_AMBIENT {0x0B53}
+sub GL_LIGHT_MODEL_COLOR_CONTROL {0x81F8}
+sub GL_LIGHT_MODEL_COLOR_CONTROL_EXT {0x81F8}
+sub GL_LIGHT_MODEL_LOCAL_VIEWER {0x0B51}
+sub GL_LIGHT_MODEL_TWO_SIDE {0x0B52}
+sub GL_LINE {0x1B01}
+sub GL_LINEAR {0x2601}
+sub GL_LINEAR_ATTENUATION {0x1208}
+sub GL_LINEAR_MIPMAP_LINEAR {0x2703}
+sub GL_LINEAR_MIPMAP_NEAREST {0x2701}
+sub GL_LINES {0x0001}
+sub GL_LINE_BIT {0x00000004}
+sub GL_LINE_LOOP {0x0002}
+sub GL_LINE_RESET_TOKEN {0x0707}
+sub GL_LINE_SMOOTH {0x0B20}
+sub GL_LINE_SMOOTH_HINT {0x0C52}
+sub GL_LINE_STIPPLE {0x0B24}
+sub GL_LINE_STIPPLE_PATTERN {0x0B25}
+sub GL_LINE_STIPPLE_REPEAT {0x0B26}
+sub GL_LINE_STRIP {0x0003}
+sub GL_LINE_TOKEN {0x0702}
+sub GL_LINE_WIDTH {0x0B21}
+sub GL_LINE_WIDTH_GRANULARITY {0x0B23}
+sub GL_LINE_WIDTH_RANGE {0x0B22}
+sub GL_LIST_BASE {0x0B32}
+sub GL_LIST_BIT {0x00020000}
+sub GL_LIST_INDEX {0x0B33}
+sub GL_LIST_MODE {0x0B30}
+sub GL_LOAD {0x0101}
+sub GL_LOGIC_OP {0x0BF1}
+sub GL_LOGIC_OP_MODE {0x0BF0}
+sub GL_LO_BIAS_NV {0x8715}
+sub GL_LO_SCALE_NV {0x870F}
+sub GL_LUMINANCE {0x1909}
+sub GL_LUMINANCE12 {0x8041}
+sub GL_LUMINANCE12_ALPHA12 {0x8047}
+sub GL_LUMINANCE12_ALPHA4 {0x8046}
+sub GL_LUMINANCE16 {0x8042}
+sub GL_LUMINANCE16_ALPHA16 {0x8048}
+sub GL_LUMINANCE4 {0x803F}
+sub GL_LUMINANCE4_ALPHA4 {0x8043}
+sub GL_LUMINANCE6_ALPHA2 {0x8044}
+sub GL_LUMINANCE8 {0x8040}
+sub GL_LUMINANCE8_ALPHA8 {0x8045}
+sub GL_LUMINANCE_ALPHA {0x190A}
+sub GL_MAC_GET_PROC_ADDRESS_NV {0x84FC}
+sub GL_MAGNITUDE_BIAS_NV {0x8718}
+sub GL_MAGNITUDE_SCALE_NV {0x8712}
+sub GL_MAP1_COLOR_4 {0x0D90}
+sub GL_MAP1_GRID_DOMAIN {0x0DD0}
+sub GL_MAP1_GRID_SEGMENTS {0x0DD1}
+sub GL_MAP1_INDEX {0x0D91}
+sub GL_MAP1_NORMAL {0x0D92}
+sub GL_MAP1_TEXTURE_COORD_1 {0x0D93}
+sub GL_MAP1_TEXTURE_COORD_2 {0x0D94}
+sub GL_MAP1_TEXTURE_COORD_3 {0x0D95}
+sub GL_MAP1_TEXTURE_COORD_4 {0x0D96}
+sub GL_MAP1_VERTEX_3 {0x0D97}
+sub GL_MAP1_VERTEX_4 {0x0D98}
+sub GL_MAP1_VERTEX_ATTRIB0_4_NV {0x8660}
+sub GL_MAP1_VERTEX_ATTRIB10_4_NV {0x866A}
+sub GL_MAP1_VERTEX_ATTRIB11_4_NV {0x866B}
+sub GL_MAP1_VERTEX_ATTRIB12_4_NV {0x866C}
+sub GL_MAP1_VERTEX_ATTRIB13_4_NV {0x866D}
+sub GL_MAP1_VERTEX_ATTRIB14_4_NV {0x866E}
+sub GL_MAP1_VERTEX_ATTRIB15_4_NV {0x866F}
+sub GL_MAP1_VERTEX_ATTRIB1_4_NV {0x8661}
+sub GL_MAP1_VERTEX_ATTRIB2_4_NV {0x8662}
+sub GL_MAP1_VERTEX_ATTRIB3_4_NV {0x8663}
+sub GL_MAP1_VERTEX_ATTRIB4_4_NV {0x8664}
+sub GL_MAP1_VERTEX_ATTRIB5_4_NV {0x8665}
+sub GL_MAP1_VERTEX_ATTRIB6_4_NV {0x8666}
+sub GL_MAP1_VERTEX_ATTRIB7_4_NV {0x8667}
+sub GL_MAP1_VERTEX_ATTRIB8_4_NV {0x8668}
+sub GL_MAP1_VERTEX_ATTRIB9_4_NV {0x8669}
+sub GL_MAP2_COLOR_4 {0x0DB0}
+sub GL_MAP2_GRID_DOMAIN {0x0DD2}
+sub GL_MAP2_GRID_SEGMENTS {0x0DD3}
+sub GL_MAP2_INDEX {0x0DB1}
+sub GL_MAP2_NORMAL {0x0DB2}
+sub GL_MAP2_TEXTURE_COORD_1 {0x0DB3}
+sub GL_MAP2_TEXTURE_COORD_2 {0x0DB4}
+sub GL_MAP2_TEXTURE_COORD_3 {0x0DB5}
+sub GL_MAP2_TEXTURE_COORD_4 {0x0DB6}
+sub GL_MAP2_VERTEX_3 {0x0DB7}
+sub GL_MAP2_VERTEX_4 {0x0DB8}
+sub GL_MAP2_VERTEX_ATTRIB0_4_NV {0x8670}
+sub GL_MAP2_VERTEX_ATTRIB10_4_NV {0x867A}
+sub GL_MAP2_VERTEX_ATTRIB11_4_NV {0x867B}
+sub GL_MAP2_VERTEX_ATTRIB12_4_NV {0x867C}
+sub GL_MAP2_VERTEX_ATTRIB13_4_NV {0x867D}
+sub GL_MAP2_VERTEX_ATTRIB14_4_NV {0x867E}
+sub GL_MAP2_VERTEX_ATTRIB15_4_NV {0x867F}
+sub GL_MAP2_VERTEX_ATTRIB1_4_NV {0x8671}
+sub GL_MAP2_VERTEX_ATTRIB2_4_NV {0x8672}
+sub GL_MAP2_VERTEX_ATTRIB3_4_NV {0x8673}
+sub GL_MAP2_VERTEX_ATTRIB4_4_NV {0x8674}
+sub GL_MAP2_VERTEX_ATTRIB5_4_NV {0x8675}
+sub GL_MAP2_VERTEX_ATTRIB6_4_NV {0x8676}
+sub GL_MAP2_VERTEX_ATTRIB7_4_NV {0x8677}
+sub GL_MAP2_VERTEX_ATTRIB8_4_NV {0x8678}
+sub GL_MAP2_VERTEX_ATTRIB9_4_NV {0x8679}
+sub GL_MAP_COLOR {0x0D10}
+sub GL_MAP_STENCIL {0x0D11}
+sub GL_MATRIX0_ARB {0x88C0}
+sub GL_MATRIX0_NV {0x8630}
+sub GL_MATRIX10_ARB {0x88CA}
+sub GL_MATRIX11_ARB {0x88CB}
+sub GL_MATRIX12_ARB {0x88CC}
+sub GL_MATRIX13_ARB {0x88CD}
+sub GL_MATRIX14_ARB {0x88CE}
+sub GL_MATRIX15_ARB {0x88CF}
+sub GL_MATRIX16_ARB {0x88D0}
+sub GL_MATRIX17_ARB {0x88D1}
+sub GL_MATRIX18_ARB {0x88D2}
+sub GL_MATRIX19_ARB {0x88D3}
+sub GL_MATRIX1_ARB {0x88C1}
+sub GL_MATRIX1_NV {0x8631}
+sub GL_MATRIX20_ARB {0x88D4}
+sub GL_MATRIX21_ARB {0x88D5}
+sub GL_MATRIX22_ARB {0x88D6}
+sub GL_MATRIX23_ARB {0x88D7}
+sub GL_MATRIX24_ARB {0x88D8}
+sub GL_MATRIX25_ARB {0x88D9}
+sub GL_MATRIX26_ARB {0x88DA}
+sub GL_MATRIX27_ARB {0x88DB}
+sub GL_MATRIX28_ARB {0x88DC}
+sub GL_MATRIX29_ARB {0x88DD}
+sub GL_MATRIX2_ARB {0x88C2}
+sub GL_MATRIX2_NV {0x8632}
+sub GL_MATRIX30_ARB {0x88DE}
+sub GL_MATRIX31_ARB {0x88DF}
+sub GL_MATRIX3_ARB {0x88C3}
+sub GL_MATRIX3_NV {0x8633}
+sub GL_MATRIX4_ARB {0x88C4}
+sub GL_MATRIX4_NV {0x8634}
+sub GL_MATRIX5_ARB {0x88C5}
+sub GL_MATRIX5_NV {0x8635}
+sub GL_MATRIX6_ARB {0x88C6}
+sub GL_MATRIX6_NV {0x8636}
+sub GL_MATRIX7_ARB {0x88C7}
+sub GL_MATRIX7_NV {0x8637}
+sub GL_MATRIX8_ARB {0x88C8}
+sub GL_MATRIX9_ARB {0x88C9}
+sub GL_MATRIX_MODE {0x0BA0}
+sub GL_MAX {0x8008}
+sub GL_MAX_3D_TEXTURE_SIZE {0x8073}
+sub GL_MAX_3D_TEXTURE_SIZE_EXT {0x8073}
+sub GL_MAX_ATTRIB_STACK_DEPTH {0x0D35}
+sub GL_MAX_CLIENT_ATTRIB_STACK_DEPTH {0x0D3B}
+sub GL_MAX_CLIP_PLANES {0x0D32}
+sub GL_MAX_COLOR_MATRIX_STACK_DEPTH {0x80B3}
+sub GL_MAX_CONVOLUTION_HEIGHT {0x801B}
+sub GL_MAX_CONVOLUTION_WIDTH {0x801A}
+sub GL_MAX_CUBE_MAP_TEXTURE_SIZE {0x851C}
+sub GL_MAX_CUBE_MAP_TEXTURE_SIZE_ARB {0x851C}
+sub GL_MAX_CUBE_MAP_TEXTURE_SIZE_EXT {0x851C}
+sub GL_MAX_ELEMENTS_INDICES {0x80E9}
+sub GL_MAX_ELEMENTS_INDICES_EXT {0x80E9}
+sub GL_MAX_ELEMENTS_VERTICES {0x80E8}
+sub GL_MAX_ELEMENTS_VERTICES_EXT {0x80E8}
+sub GL_MAX_EVAL_ORDER {0x0D30}
+sub GL_MAX_EXT {0x8008}
+sub GL_MAX_FRAGMENT_PROGRAM_LOCAL_PARAMETERS_NV {0x8868}
+sub GL_MAX_GENERAL_COMBINERS_NV {0x854D}
+sub GL_MAX_LIGHTS {0x0D31}
+sub GL_MAX_LIST_NESTING {0x0B31}
+sub GL_MAX_MODELVIEW_STACK_DEPTH {0x0D36}
+sub GL_MAX_NAME_STACK_DEPTH {0x0D37}
+sub GL_MAX_PENDING_FLUSHHOLD_NVX {0x6009}
+sub GL_MAX_PIXEL_MAP_TABLE {0x0D34}
+sub GL_MAX_PROGRAM_ADDRESS_REGISTERS_ARB {0x88B1}
+sub GL_MAX_PROGRAM_ALU_INSTRUCTIONS_ARB {0x880B}
+sub GL_MAX_PROGRAM_ATTRIBS_ARB {0x88AD}
+sub GL_MAX_PROGRAM_ENV_PARAMETERS_ARB {0x88B5}
+sub GL_MAX_PROGRAM_INSTRUCTIONS_ARB {0x88A1}
+sub GL_MAX_PROGRAM_LOCAL_PARAMETERS_ARB {0x88B4}
+sub GL_MAX_PROGRAM_MATRICES_ARB {0x862F}
+sub GL_MAX_PROGRAM_MATRIX_STACK_DEPTH_ARB {0x862E}
+sub GL_MAX_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB {0x88B3}
+sub GL_MAX_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB {0x880E}
+sub GL_MAX_PROGRAM_NATIVE_ATTRIBS_ARB {0x88AF}
+sub GL_MAX_PROGRAM_NATIVE_INSTRUCTIONS_ARB {0x88A3}
+sub GL_MAX_PROGRAM_NATIVE_PARAMETERS_ARB {0x88AB}
+sub GL_MAX_PROGRAM_NATIVE_TEMPORARIES_ARB {0x88A7}
+sub GL_MAX_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB {0x8810}
+sub GL_MAX_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB {0x880F}
+sub GL_MAX_PROGRAM_PARAMETERS_ARB {0x88A9}
+sub GL_MAX_PROGRAM_TEMPORARIES_ARB {0x88A5}
+sub GL_MAX_PROGRAM_TEX_INDIRECTIONS_ARB {0x880D}
+sub GL_MAX_PROGRAM_TEX_INSTRUCTIONS_ARB {0x880C}
+sub GL_MAX_PROJECTION_STACK_DEPTH {0x0D38}
+sub GL_MAX_RECTANGLE_TEXTURE_SIZE_NV {0x84F8}
+sub GL_MAX_SHININESS_NV {0x8504}
+sub GL_MAX_SPOT_EXPONENT_NV {0x8505}
+sub GL_MAX_TEXTURES_SGIS {0x835D}
+sub GL_MAX_TEXTURE_COORDS_ARB {0x8871}
+sub GL_MAX_TEXTURE_COORDS_NV {0x8871}
+sub GL_MAX_TEXTURE_IMAGE_UNITS_ARB {0x8872}
+sub GL_MAX_TEXTURE_IMAGE_UNITS_NV {0x8872}
+sub GL_MAX_TEXTURE_LOD_BIAS {0x84FD}
+sub GL_MAX_TEXTURE_LOD_BIAS_EXT {0x84FD}
+sub GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT {0x84FF}
+sub GL_MAX_TEXTURE_SIZE {0x0D33}
+sub GL_MAX_TEXTURE_STACK_DEPTH {0x0D39}
+sub GL_MAX_TEXTURE_UNITS {0x84E2}
+sub GL_MAX_TEXTURE_UNITS_ARB {0x84E2}
+sub GL_MAX_TRACK_MATRICES_NV {0x862F}
+sub GL_MAX_TRACK_MATRIX_STACK_DEPTH_NV {0x862E}
+sub GL_MAX_VERTEX_ARRAY_RANGE_ELEMENT_NV {0x8520}
+sub GL_MAX_VERTEX_ATTRIBS_ARB {0x8869}
+sub GL_MAX_VIEWPORT_DIMS {0x0D3A}
+sub GL_MIN {0x8007}
+sub GL_MINMAX {0x802E}
+sub GL_MINMAX_FORMAT {0x802F}
+sub GL_MINMAX_SINK {0x8030}
+sub GL_MIN_EXT {0x8007}
+sub GL_MIRRORED_REPEAT {0x8370}
+sub GL_MIRRORED_REPEAT_ARB {0x8370}
+sub GL_MIRRORED_REPEAT_IBM {0x8370}
+sub GL_MODELVIEW {0x1700}
+sub GL_MODELVIEW0_EXT {0x1700}
+sub GL_MODELVIEW0_MATRIX_EXT {0x0BA6}
+sub GL_MODELVIEW0_STACK_DEPTH_EXT {0x0BA3}
+sub GL_MODELVIEW1_EXT {0x850A}
+sub GL_MODELVIEW1_MATRIX_EXT {0x8506}
+sub GL_MODELVIEW1_STACK_DEPTH_EXT {0x8502}
+sub GL_MODELVIEW_MATRIX {0x0BA6}
+sub GL_MODELVIEW_PROJECTION_NV {0x8629}
+sub GL_MODELVIEW_STACK_DEPTH {0x0BA3}
+sub GL_MODULATE {0x2100}
+sub GL_MULT {0x0103}
+sub GL_MULTISAMPLE {0x809D}
+sub GL_MULTISAMPLE_ARB {0x809D}
+sub GL_MULTISAMPLE_BIT {0x20000000}
+sub GL_MULTISAMPLE_BIT_ARB {0x20000000}
+sub GL_MULTISAMPLE_FILTER_HINT_NV {0x8534}
+sub GL_N3F_V3F {0x2A25}
+sub GL_NAME_STACK_DEPTH {0x0D70}
+sub GL_NAND {0x150E}
+sub GL_NEAREST {0x2600}
+sub GL_NEAREST_MIPMAP_LINEAR {0x2702}
+sub GL_NEAREST_MIPMAP_NEAREST {0x2700}
+sub GL_NEVER {0x0200}
+sub GL_NICEST {0x1102}
+sub GL_NONE {0}
+sub GL_NOOP {0x1505}
+sub GL_NOR {0x1508}
+sub GL_NORMALIZE {0x0BA1}
+sub GL_NORMAL_ARRAY {0x8075}
+sub GL_NORMAL_ARRAY_BUFFER_BINDING_ARB {0x8897}
+sub GL_NORMAL_ARRAY_COUNT_EXT {0x8080}
+sub GL_NORMAL_ARRAY_EXT {0x8075}
+sub GL_NORMAL_ARRAY_POINTER {0x808F}
+sub GL_NORMAL_ARRAY_POINTER_EXT {0x808F}
+sub GL_NORMAL_ARRAY_STRIDE {0x807F}
+sub GL_NORMAL_ARRAY_STRIDE_EXT {0x807F}
+sub GL_NORMAL_ARRAY_TYPE {0x807E}
+sub GL_NORMAL_ARRAY_TYPE_EXT {0x807E}
+sub GL_NORMAL_MAP {0x8511}
+sub GL_NORMAL_MAP_ARB {0x8511}
+sub GL_NORMAL_MAP_EXT {0x8511}
+sub GL_NORMAL_MAP_NV {0x8511}
+sub GL_NOTEQUAL {0x0205}
+sub GL_NO_ERROR {0}
+sub GL_NUM_COMPRESSED_TEXTURE_FORMATS {0x86A2}
+sub GL_NUM_COMPRESSED_TEXTURE_FORMATS_ARB {0x86A2}
+sub GL_NUM_GENERAL_COMBINERS_NV {0x854E}
+sub GL_OBJECT_LINEAR {0x2401}
+sub GL_OBJECT_PLANE {0x2501}
+sub GL_OCCLUSION_TEST_HP {0x8165}
+sub GL_OCCLUSION_TEST_RESULT_HP {0x8166}
+sub GL_OFFSET_HILO_PROJECTIVE_TEXTURE_2D_NV {0x8856}
+sub GL_OFFSET_HILO_PROJECTIVE_TEXTURE_RECTANGLE_NV {0x8857}
+sub GL_OFFSET_HILO_TEXTURE_2D_NV {0x8854}
+sub GL_OFFSET_HILO_TEXTURE_RECTANGLE_NV {0x8855}
+sub GL_OFFSET_PROJECTIVE_TEXTURE_2D_NV {0x8850}
+sub GL_OFFSET_PROJECTIVE_TEXTURE_2D_SCALE_NV {0x8851}
+sub GL_OFFSET_PROJECTIVE_TEXTURE_RECTANGLE_NV {0x8852}
+sub GL_OFFSET_PROJECTIVE_TEXTURE_RECTANGLE_SCALE_NV {0x8853}
+sub GL_OFFSET_TEXTURE_2D_BIAS_NV {0x86E3}
+sub GL_OFFSET_TEXTURE_2D_MATRIX_NV {0x86E1}
+sub GL_OFFSET_TEXTURE_2D_NV {0x86E8}
+sub GL_OFFSET_TEXTURE_2D_SCALE_NV {0x86E2}
+sub GL_OFFSET_TEXTURE_BIAS_NV {0x86E3}
+sub GL_OFFSET_TEXTURE_MATRIX_NV {0x86E1}
+sub GL_OFFSET_TEXTURE_RECTANGLE_NV {0x864C}
+sub GL_OFFSET_TEXTURE_RECTANGLE_SCALE_NV {0x864D}
+sub GL_OFFSET_TEXTURE_SCALE_NV {0x86E2}
+sub GL_ONE {1}
+sub GL_ONE_MINUS_CONSTANT_ALPHA {0x8004}
+sub GL_ONE_MINUS_CONSTANT_ALPHA_EXT {0x8004}
+sub GL_ONE_MINUS_CONSTANT_COLOR {0x8002}
+sub GL_ONE_MINUS_CONSTANT_COLOR_EXT {0x8002}
+sub GL_ONE_MINUS_DST_ALPHA {0x0305}
+sub GL_ONE_MINUS_DST_COLOR {0x0307}
+sub GL_ONE_MINUS_SRC_ALPHA {0x0303}
+sub GL_ONE_MINUS_SRC_COLOR {0x0301}
+sub GL_OPERAND0_ALPHA {0x8598}
+sub GL_OPERAND0_ALPHA_ARB {0x8598}
+sub GL_OPERAND0_ALPHA_EXT {0x8598}
+sub GL_OPERAND0_RGB {0x8590}
+sub GL_OPERAND0_RGB_ARB {0x8590}
+sub GL_OPERAND0_RGB_EXT {0x8590}
+sub GL_OPERAND1_ALPHA {0x8599}
+sub GL_OPERAND1_ALPHA_ARB {0x8599}
+sub GL_OPERAND1_ALPHA_EXT {0x8599}
+sub GL_OPERAND1_RGB {0x8591}
+sub GL_OPERAND1_RGB_ARB {0x8591}
+sub GL_OPERAND1_RGB_EXT {0x8591}
+sub GL_OPERAND2_ALPHA {0x859A}
+sub GL_OPERAND2_ALPHA_ARB {0x859A}
+sub GL_OPERAND2_ALPHA_EXT {0x859A}
+sub GL_OPERAND2_RGB {0x8592}
+sub GL_OPERAND2_RGB_ARB {0x8592}
+sub GL_OPERAND2_RGB_EXT {0x8592}
+sub GL_OPERAND3_ALPHA_NV {0x859B}
+sub GL_OPERAND3_RGB_NV {0x8593}
+sub GL_OR {0x1507}
+sub GL_ORDER {0x0A01}
+sub GL_OR_INVERTED {0x150D}
+sub GL_OR_REVERSE {0x150B}
+sub GL_OUT_OF_MEMORY {0x0505}
+sub GL_PACK_ALIGNMENT {0x0D05}
+sub GL_PACK_IMAGE_HEIGHT {0x806C}
+sub GL_PACK_IMAGE_HEIGHT_EXT {0x806C}
+sub GL_PACK_LSB_FIRST {0x0D01}
+sub GL_PACK_ROW_LENGTH {0x0D02}
+sub GL_PACK_SKIP_IMAGES {0x806B}
+sub GL_PACK_SKIP_IMAGES_EXT {0x806B}
+sub GL_PACK_SKIP_PIXELS {0x0D04}
+sub GL_PACK_SKIP_ROWS {0x0D03}
+sub GL_PACK_SWAP_BYTES {0x0D00}
+sub GL_PASS_THROUGH_NV {0x86E6}
+sub GL_PASS_THROUGH_TOKEN {0x0700}
+sub GL_PERSPECTIVE_CORRECTION_HINT {0x0C50}
+sub GL_PER_STAGE_CONSTANTS_NV {0x8535}
+sub GL_PIXEL_COUNTER_BITS_NV {0x8864}
+sub GL_PIXEL_COUNT_AVAILABLE_NV {0x8867}
+sub GL_PIXEL_COUNT_NV {0x8866}
+sub GL_PIXEL_MAP_A_TO_A {0x0C79}
+sub GL_PIXEL_MAP_A_TO_A_SIZE {0x0CB9}
+sub GL_PIXEL_MAP_B_TO_B {0x0C78}
+sub GL_PIXEL_MAP_B_TO_B_SIZE {0x0CB8}
+sub GL_PIXEL_MAP_G_TO_G {0x0C77}
+sub GL_PIXEL_MAP_G_TO_G_SIZE {0x0CB7}
+sub GL_PIXEL_MAP_I_TO_A {0x0C75}
+sub GL_PIXEL_MAP_I_TO_A_SIZE {0x0CB5}
+sub GL_PIXEL_MAP_I_TO_B {0x0C74}
+sub GL_PIXEL_MAP_I_TO_B_SIZE {0x0CB4}
+sub GL_PIXEL_MAP_I_TO_G {0x0C73}
+sub GL_PIXEL_MAP_I_TO_G_SIZE {0x0CB3}
+sub GL_PIXEL_MAP_I_TO_I {0x0C70}
+sub GL_PIXEL_MAP_I_TO_I_SIZE {0x0CB0}
+sub GL_PIXEL_MAP_I_TO_R {0x0C72}
+sub GL_PIXEL_MAP_I_TO_R_SIZE {0x0CB2}
+sub GL_PIXEL_MAP_R_TO_R {0x0C76}
+sub GL_PIXEL_MAP_R_TO_R_SIZE {0x0CB6}
+sub GL_PIXEL_MAP_S_TO_S {0x0C71}
+sub GL_PIXEL_MAP_S_TO_S_SIZE {0x0CB1}
+sub GL_PIXEL_MODE_BIT {0x00000020}
+sub GL_POINT {0x1B00}
+sub GL_POINTS {0x0000}
+sub GL_POINT_BIT {0x00000002}
+sub GL_POINT_DISTANCE_ATTENUATION {0x8129}
+sub GL_POINT_DISTANCE_ATTENUATION_ARB {0x8129}
+sub GL_POINT_FADE_THRESHOLD_SIZE {0x8128}
+sub GL_POINT_FADE_THRESHOLD_SIZE_ARB {0x8128}
+sub GL_POINT_FADE_THRESHOLD_SIZE_EXT {0x8128}
+sub GL_POINT_SIZE {0x0B11}
+sub GL_POINT_SIZE_GRANULARITY {0x0B13}
+sub GL_POINT_SIZE_MAX {0x8127}
+sub GL_POINT_SIZE_MAX_ARB {0x8127}
+sub GL_POINT_SIZE_MAX_EXT {0x8127}
+sub GL_POINT_SIZE_MIN {0x8126}
+sub GL_POINT_SIZE_MIN_ARB {0x8126}
+sub GL_POINT_SIZE_MIN_EXT {0x8126}
+sub GL_POINT_SIZE_RANGE {0x0B12}
+sub GL_POINT_SMOOTH {0x0B10}
+sub GL_POINT_SMOOTH_HINT {0x0C51}
+sub GL_POINT_SPRITE_NV {0x8861}
+sub GL_POINT_SPRITE_R_MODE_NV {0x8863}
+sub GL_POINT_TOKEN {0x0701}
+sub GL_POLYGON {0x0009}
+sub GL_POLYGON_BIT {0x00000008}
+sub GL_POLYGON_MODE {0x0B40}
+sub GL_POLYGON_OFFSET_FACTOR {0x8038}
+sub GL_POLYGON_OFFSET_FILL {0x8037}
+sub GL_POLYGON_OFFSET_LINE {0x2A02}
+sub GL_POLYGON_OFFSET_POINT {0x2A01}
+sub GL_POLYGON_OFFSET_UNITS {0x2A00}
+sub GL_POLYGON_SMOOTH {0x0B41}
+sub GL_POLYGON_SMOOTH_HINT {0x0C53}
+sub GL_POLYGON_STIPPLE {0x0B42}
+sub GL_POLYGON_STIPPLE_BIT {0x00000010}
+sub GL_POLYGON_TOKEN {0x0703}
+sub GL_POSITION {0x1203}
+sub GL_POST_COLOR_MATRIX_ALPHA_BIAS {0x80BB}
+sub GL_POST_COLOR_MATRIX_ALPHA_SCALE {0x80B7}
+sub GL_POST_COLOR_MATRIX_BLUE_BIAS {0x80BA}
+sub GL_POST_COLOR_MATRIX_BLUE_SCALE {0x80B6}
+sub GL_POST_COLOR_MATRIX_COLOR_TABLE {0x80D2}
+sub GL_POST_COLOR_MATRIX_GREEN_BIAS {0x80B9}
+sub GL_POST_COLOR_MATRIX_GREEN_SCALE {0x80B5}
+sub GL_POST_COLOR_MATRIX_RED_BIAS {0x80B8}
+sub GL_POST_COLOR_MATRIX_RED_SCALE {0x80B4}
+sub GL_POST_CONVOLUTION_ALPHA_BIAS {0x8023}
+sub GL_POST_CONVOLUTION_ALPHA_SCALE {0x801F}
+sub GL_POST_CONVOLUTION_BLUE_BIAS {0x8022}
+sub GL_POST_CONVOLUTION_BLUE_SCALE {0x801E}
+sub GL_POST_CONVOLUTION_COLOR_TABLE {0x80D1}
+sub GL_POST_CONVOLUTION_GREEN_BIAS {0x8021}
+sub GL_POST_CONVOLUTION_GREEN_SCALE {0x801D}
+sub GL_POST_CONVOLUTION_RED_BIAS {0x8020}
+sub GL_POST_CONVOLUTION_RED_SCALE {0x801C}
+sub GL_PREVIOUS {0x8578}
+sub GL_PREVIOUS_ARB {0x8578}
+sub GL_PREVIOUS_EXT {0x8578}
+sub GL_PREVIOUS_TEXTURE_INPUT_NV {0x86E4}
+sub GL_PRIMARY_COLOR {0x8577}
+sub GL_PRIMARY_COLOR_ARB {0x8577}
+sub GL_PRIMARY_COLOR_EXT {0x8577}
+sub GL_PRIMARY_COLOR_NV {0x852C}
+sub GL_PRIMITIVE_RESTART_INDEX_NV {0x8559}
+sub GL_PRIMITIVE_RESTART_NV {0x8558}
+sub GL_PROGRAM_ADDRESS_REGISTERS_ARB {0x88B0}
+sub GL_PROGRAM_ALU_INSTRUCTIONS_ARB {0x8805}
+sub GL_PROGRAM_ATTRIBS_ARB {0x88AC}
+sub GL_PROGRAM_BINDING_ARB {0x8677}
+sub GL_PROGRAM_ERROR_POSITION_ARB {0x864B}
+sub GL_PROGRAM_ERROR_POSITION_NV {0x864B}
+sub GL_PROGRAM_ERROR_STRING_ARB {0x8874}
+sub GL_PROGRAM_ERROR_STRING_NV {0x8874}
+sub GL_PROGRAM_FORMAT_ARB {0x8876}
+sub GL_PROGRAM_FORMAT_ASCII_ARB {0x8875}
+sub GL_PROGRAM_INSTRUCTIONS_ARB {0x88A0}
+sub GL_PROGRAM_LENGTH_ARB {0x8627}
+sub GL_PROGRAM_LENGTH_NV {0x8627}
+sub GL_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB {0x88B2}
+sub GL_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB {0x8808}
+sub GL_PROGRAM_NATIVE_ATTRIBS_ARB {0x88AE}
+sub GL_PROGRAM_NATIVE_INSTRUCTIONS_ARB {0x88A2}
+sub GL_PROGRAM_NATIVE_PARAMETERS_ARB {0x88AA}
+sub GL_PROGRAM_NATIVE_TEMPORARIES_ARB {0x88A6}
+sub GL_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB {0x880A}
+sub GL_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB {0x8809}
+sub GL_PROGRAM_PARAMETERS_ARB {0x88A8}
+sub GL_PROGRAM_PARAMETER_NV {0x8644}
+sub GL_PROGRAM_RESIDENT_NV {0x8647}
+sub GL_PROGRAM_STRING_ARB {0x8628}
+sub GL_PROGRAM_STRING_NV {0x8628}
+sub GL_PROGRAM_TARGET_NV {0x8646}
+sub GL_PROGRAM_TEMPORARIES_ARB {0x88A4}
+sub GL_PROGRAM_TEX_INDIRECTIONS_ARB {0x8807}
+sub GL_PROGRAM_TEX_INSTRUCTIONS_ARB {0x8806}
+sub GL_PROGRAM_UNDER_NATIVE_LIMITS_ARB {0x88B6}
+sub GL_PROJECTION {0x1701}
+sub GL_PROJECTION_MATRIX {0x0BA7}
+sub GL_PROJECTION_STACK_DEPTH {0x0BA4}
+sub GL_PROXY_COLOR_TABLE {0x80D3}
+sub GL_PROXY_HISTOGRAM {0x8025}
+sub GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE {0x80D5}
+sub GL_PROXY_POST_CONVOLUTION_COLOR_TABLE {0x80D4}
+sub GL_PROXY_TEXTURE_1D {0x8063}
+sub GL_PROXY_TEXTURE_2D {0x8064}
+sub GL_PROXY_TEXTURE_3D {0x8070}
+sub GL_PROXY_TEXTURE_3D_EXT {0x8070}
+sub GL_PROXY_TEXTURE_CUBE_MAP {0x851B}
+sub GL_PROXY_TEXTURE_CUBE_MAP_ARB {0x851B}
+sub GL_PROXY_TEXTURE_CUBE_MAP_EXT {0x851B}
+sub GL_PROXY_TEXTURE_RECTANGLE_NV {0x84F7}
+sub GL_Q {0x2003}
+sub GL_QUADRATIC_ATTENUATION {0x1209}
+sub GL_QUADS {0x0007}
+sub GL_QUAD_STRIP {0x0008}
+sub GL_R {0x2002}
+sub GL_R3_G3_B2 {0x2A10}
+sub GL_READ_BUFFER {0x0C02}
+sub GL_READ_ONLY_ARB {0x88B8}
+sub GL_READ_PIXEL_DATA_RANGE_LENGTH_NV {0x887B}
+sub GL_READ_PIXEL_DATA_RANGE_NV {0x8879}
+sub GL_READ_PIXEL_DATA_RANGE_POINTER_NV {0x887D}
+sub GL_READ_WRITE_ARB {0x88BA}
+sub GL_RED {0x1903}
+sub GL_REDUCE {0x8016}
+sub GL_RED_BIAS {0x0D15}
+sub GL_RED_BITS {0x0D52}
+sub GL_RED_SCALE {0x0D14}
+sub GL_REFLECTION_MAP {0x8512}
+sub GL_REFLECTION_MAP_ARB {0x8512}
+sub GL_REFLECTION_MAP_EXT {0x8512}
+sub GL_REFLECTION_MAP_NV {0x8512}
+sub GL_REGISTER_COMBINERS_NV {0x8522}
+sub GL_RENDER {0x1C00}
+sub GL_RENDERER {0x1F01}
+sub GL_RENDER_MODE {0x0C40}
+sub GL_REPEAT {0x2901}
+sub GL_REPLACE {0x1E01}
+sub GL_REPLICATE_BORDER {0x8153}
+sub GL_RESCALE_NORMAL {0x803A}
+sub GL_RESCALE_NORMAL_EXT {0x803A}
+sub GL_RETURN {0x0102}
+sub GL_RGB {0x1907}
+sub GL_RGB10 {0x8052}
+sub GL_RGB10_A2 {0x8059}
+sub GL_RGB12 {0x8053}
+sub GL_RGB16 {0x8054}
+sub GL_RGB4 {0x804F}
+sub GL_RGB4_S3TC {0x83A1}
+sub GL_RGB5 {0x8050}
+sub GL_RGB5_A1 {0x8057}
+sub GL_RGB8 {0x8051}
+sub GL_RGBA {0x1908}
+sub GL_RGBA12 {0x805A}
+sub GL_RGBA16 {0x805B}
+sub GL_RGBA2 {0x8055}
+sub GL_RGBA4 {0x8056}
+sub GL_RGBA4_DXT5_S3TC {0x83A5}
+sub GL_RGBA4_S3TC {0x83A3}
+sub GL_RGBA8 {0x8058}
+sub GL_RGBA_DXT5_S3TC {0x83A4}
+sub GL_RGBA_MODE {0x0C31}
+sub GL_RGBA_S3TC {0x83A2}
+sub GL_RGBA_UNSIGNED_DOT_PRODUCT_MAPPING_NV {0x86D9}
+sub GL_RGB_S3TC {0x83A0}
+sub GL_RGB_SCALE {0x8573}
+sub GL_RGB_SCALE_ARB {0x8573}
+sub GL_RGB_SCALE_EXT {0x8573}
+sub GL_RIGHT {0x0407}
+sub GL_S {0x2000}
+sub GL_SAMPLES {0x80A9}
+sub GL_SAMPLES_ARB {0x80A9}
+sub GL_SAMPLE_ALPHA_TO_COVERAGE {0x809E}
+sub GL_SAMPLE_ALPHA_TO_COVERAGE_ARB {0x809E}
+sub GL_SAMPLE_ALPHA_TO_ONE {0x809F}
+sub GL_SAMPLE_ALPHA_TO_ONE_ARB {0x809F}
+sub GL_SAMPLE_BUFFERS {0x80A8}
+sub GL_SAMPLE_BUFFERS_ARB {0x80A8}
+sub GL_SAMPLE_COVERAGE {0x80A0}
+sub GL_SAMPLE_COVERAGE_ARB {0x80A0}
+sub GL_SAMPLE_COVERAGE_INVERT {0x80AB}
+sub GL_SAMPLE_COVERAGE_INVERT_ARB {0x80AB}
+sub GL_SAMPLE_COVERAGE_VALUE {0x80AA}
+sub GL_SAMPLE_COVERAGE_VALUE_ARB {0x80AA}
+sub GL_SCALE_BY_FOUR_NV {0x853F}
+sub GL_SCALE_BY_ONE_HALF_NV {0x8540}
+sub GL_SCALE_BY_TWO_NV {0x853E}
+sub GL_SCISSOR_BIT {0x00080000}
+sub GL_SCISSOR_BOX {0x0C10}
+sub GL_SCISSOR_TEST {0x0C11}
+sub GL_SECONDARY_COLOR_ARRAY {0x845E}
+sub GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING_ARB {0x889C}
+sub GL_SECONDARY_COLOR_ARRAY_EXT {0x845E}
+sub GL_SECONDARY_COLOR_ARRAY_POINTER {0x845D}
+sub GL_SECONDARY_COLOR_ARRAY_POINTER_EXT {0x845D}
+sub GL_SECONDARY_COLOR_ARRAY_SIZE {0x845A}
+sub GL_SECONDARY_COLOR_ARRAY_SIZE_EXT {0x845A}
+sub GL_SECONDARY_COLOR_ARRAY_STRIDE {0x845C}
+sub GL_SECONDARY_COLOR_ARRAY_STRIDE_EXT {0x845C}
+sub GL_SECONDARY_COLOR_ARRAY_TYPE {0x845B}
+sub GL_SECONDARY_COLOR_ARRAY_TYPE_EXT {0x845B}
+sub GL_SECONDARY_COLOR_NV {0x852D}
+sub GL_SELECT {0x1C02}
+sub GL_SELECTED_TEXTURE_SGIS {0x835C}
+sub GL_SELECTION_BUFFER_POINTER {0x0DF3}
+sub GL_SELECTION_BUFFER_SIZE {0x0DF4}
+sub GL_SEPARABLE_2D {0x8012}
+sub GL_SEPARATE_SPECULAR_COLOR {0x81FA}
+sub GL_SEPARATE_SPECULAR_COLOR_EXT {0x81FA}
+sub GL_SET {0x150F}
+sub GL_SHADER_CONSISTENT_NV {0x86DD}
+sub GL_SHADER_OPERATION_NV {0x86DF}
+sub GL_SHADE_MODEL {0x0B54}
+sub GL_SHARED_TEXTURE_PALETTE_EXT {0x81FB}
+sub GL_SHININESS {0x1601}
+sub GL_SHORT {0x1402}
+sub GL_SIGNED_ALPHA8_NV {0x8706}
+sub GL_SIGNED_ALPHA_NV {0x8705}
+sub GL_SIGNED_HILO16_NV {0x86FA}
+sub GL_SIGNED_HILO8_NV {0x885F}
+sub GL_SIGNED_HILO_NV {0x86F9}
+sub GL_SIGNED_IDENTITY_NV {0x853C}
+sub GL_SIGNED_INTENSITY8_NV {0x8708}
+sub GL_SIGNED_INTENSITY_NV {0x8707}
+sub GL_SIGNED_LUMINANCE8_ALPHA8_NV {0x8704}
+sub GL_SIGNED_LUMINANCE8_NV {0x8702}
+sub GL_SIGNED_LUMINANCE_ALPHA_NV {0x8703}
+sub GL_SIGNED_LUMINANCE_NV {0x8701}
+sub GL_SIGNED_NEGATE_NV {0x853D}
+sub GL_SIGNED_RGB8_NV {0x86FF}
+sub GL_SIGNED_RGB8_UNSIGNED_ALPHA8_NV {0x870D}
+sub GL_SIGNED_RGBA8_NV {0x86FC}
+sub GL_SIGNED_RGBA_NV {0x86FB}
+sub GL_SIGNED_RGB_NV {0x86FE}
+sub GL_SIGNED_RGB_UNSIGNED_ALPHA_NV {0x870C}
+sub GL_SINGLE_COLOR {0x81F9}
+sub GL_SINGLE_COLOR_EXT {0x81F9}
+sub GL_SMOOTH {0x1D01}
+sub GL_SMOOTH_LINE_WIDTH_GRANULARITY {0x0B23}
+sub GL_SMOOTH_LINE_WIDTH_RANGE {0x0B22}
+sub GL_SMOOTH_POINT_SIZE_GRANULARITY {0x0B13}
+sub GL_SMOOTH_POINT_SIZE_RANGE {0x0B12}
+sub GL_SOURCE0_ALPHA {0x8588}
+sub GL_SOURCE0_ALPHA_ARB {0x8588}
+sub GL_SOURCE0_ALPHA_EXT {0x8588}
+sub GL_SOURCE0_RGB {0x8580}
+sub GL_SOURCE0_RGB_ARB {0x8580}
+sub GL_SOURCE0_RGB_EXT {0x8580}
+sub GL_SOURCE1_ALPHA {0x8589}
+sub GL_SOURCE1_ALPHA_ARB {0x8589}
+sub GL_SOURCE1_ALPHA_EXT {0x8589}
+sub GL_SOURCE1_RGB {0x8581}
+sub GL_SOURCE1_RGB_ARB {0x8581}
+sub GL_SOURCE1_RGB_EXT {0x8581}
+sub GL_SOURCE2_ALPHA {0x858A}
+sub GL_SOURCE2_ALPHA_ARB {0x858A}
+sub GL_SOURCE2_ALPHA_EXT {0x858A}
+sub GL_SOURCE2_RGB {0x8582}
+sub GL_SOURCE2_RGB_ARB {0x8582}
+sub GL_SOURCE2_RGB_EXT {0x8582}
+sub GL_SOURCE3_ALPHA_NV {0x858B}
+sub GL_SOURCE3_RGB_NV {0x8583}
+sub GL_SPARE0_NV {0x852E}
+sub GL_SPARE0_PLUS_SECONDARY_COLOR_NV {0x8532}
+sub GL_SPARE1_NV {0x852F}
+sub GL_SPECULAR {0x1202}
+sub GL_SPHERE_MAP {0x2402}
+sub GL_SPOT_CUTOFF {0x1206}
+sub GL_SPOT_DIRECTION {0x1204}
+sub GL_SPOT_EXPONENT {0x1205}
+sub GL_SRC_ALPHA {0x0302}
+sub GL_SRC_ALPHA_SATURATE {0x0308}
+sub GL_SRC_COLOR {0x0300}
+sub GL_STACK_OVERFLOW {0x0503}
+sub GL_STACK_UNDERFLOW {0x0504}
+sub GL_STATIC_COPY_ARB {0x88E6}
+sub GL_STATIC_DRAW_ARB {0x88E4}
+sub GL_STATIC_READ_ARB {0x88E5}
+sub GL_STENCIL {0x1802}
+sub GL_STENCIL_BITS {0x0D57}
+sub GL_STENCIL_BUFFER_BIT {0x00000400}
+sub GL_STENCIL_CLEAR_VALUE {0x0B91}
+sub GL_STENCIL_FAIL {0x0B94}
+sub GL_STENCIL_FUNC {0x0B92}
+sub GL_STENCIL_INDEX {0x1901}
+sub GL_STENCIL_PASS_DEPTH_FAIL {0x0B95}
+sub GL_STENCIL_PASS_DEPTH_PASS {0x0B96}
+sub GL_STENCIL_REF {0x0B97}
+sub GL_STENCIL_TEST {0x0B90}
+sub GL_STENCIL_TEST_TWO_SIDE_EXT {0x8910}
+sub GL_STENCIL_VALUE_MASK {0x0B93}
+sub GL_STENCIL_WRITEMASK {0x0B98}
+sub GL_STEREO {0x0C33}
+sub GL_STREAM_COPY_ARB {0x88E2}
+sub GL_STREAM_DRAW_ARB {0x88E0}
+sub GL_STREAM_READ_ARB {0x88E1}
+sub GL_SUBPIXEL_BITS {0x0D50}
+sub GL_SUBTRACT {0x84E7}
+sub GL_SUBTRACT_ARB {0x84E7}
+sub GL_T {0x2001}
+sub GL_T2F_C3F_V3F {0x2A2A}
+sub GL_T2F_C4F_N3F_V3F {0x2A2C}
+sub GL_T2F_C4UB_V3F {0x2A29}
+sub GL_T2F_N3F_V3F {0x2A2B}
+sub GL_T2F_V3F {0x2A27}
+sub GL_T4F_C4F_N3F_V4F {0x2A2D}
+sub GL_T4F_V4F {0x2A28}
+sub GL_TABLE_TOO_LARGE {0x8031}
+sub GL_TABLE_TOO_LARGE_EXT {0x8031}
+sub GL_TBUFFER_WRITE_MASK_3DFX {0x86D8}
+sub GL_TEXTURE {0x1702}
+sub GL_TEXTURE0 {0x84C0}
+sub GL_TEXTURE0_ARB {0x84C0}
+sub GL_TEXTURE0_SGIS {0x835E}
+sub GL_TEXTURE1 {0x84C1}
+sub GL_TEXTURE10 {0x84CA}
+sub GL_TEXTURE10_ARB {0x84CA}
+sub GL_TEXTURE11 {0x84CB}
+sub GL_TEXTURE11_ARB {0x84CB}
+sub GL_TEXTURE12 {0x84CC}
+sub GL_TEXTURE12_ARB {0x84CC}
+sub GL_TEXTURE13 {0x84CD}
+sub GL_TEXTURE13_ARB {0x84CD}
+sub GL_TEXTURE14 {0x84CE}
+sub GL_TEXTURE14_ARB {0x84CE}
+sub GL_TEXTURE15 {0x84CF}
+sub GL_TEXTURE15_ARB {0x84CF}
+sub GL_TEXTURE16 {0x84D0}
+sub GL_TEXTURE16_ARB {0x84D0}
+sub GL_TEXTURE17 {0x84D1}
+sub GL_TEXTURE17_ARB {0x84D1}
+sub GL_TEXTURE18 {0x84D2}
+sub GL_TEXTURE18_ARB {0x84D2}
+sub GL_TEXTURE19 {0x84D3}
+sub GL_TEXTURE19_ARB {0x84D3}
+sub GL_TEXTURE1_ARB {0x84C1}
+sub GL_TEXTURE1_SGIS {0x835F}
+sub GL_TEXTURE2 {0x84C2}
+sub GL_TEXTURE20 {0x84D4}
+sub GL_TEXTURE20_ARB {0x84D4}
+sub GL_TEXTURE21 {0x84D5}
+sub GL_TEXTURE21_ARB {0x84D5}
+sub GL_TEXTURE22 {0x84D6}
+sub GL_TEXTURE22_ARB {0x84D6}
+sub GL_TEXTURE23 {0x84D7}
+sub GL_TEXTURE23_ARB {0x84D7}
+sub GL_TEXTURE24 {0x84D8}
+sub GL_TEXTURE24_ARB {0x84D8}
+sub GL_TEXTURE25 {0x84D9}
+sub GL_TEXTURE25_ARB {0x84D9}
+sub GL_TEXTURE26 {0x84DA}
+sub GL_TEXTURE26_ARB {0x84DA}
+sub GL_TEXTURE27 {0x84DB}
+sub GL_TEXTURE27_ARB {0x84DB}
+sub GL_TEXTURE28 {0x84DC}
+sub GL_TEXTURE28_ARB {0x84DC}
+sub GL_TEXTURE29 {0x84DD}
+sub GL_TEXTURE29_ARB {0x84DD}
+sub GL_TEXTURE2_ARB {0x84C2}
+sub GL_TEXTURE2_SGIS {0x8360}
+sub GL_TEXTURE3 {0x84C3}
+sub GL_TEXTURE30 {0x84DE}
+sub GL_TEXTURE30_ARB {0x84DE}
+sub GL_TEXTURE31 {0x84DF}
+sub GL_TEXTURE31_ARB {0x84DF}
+sub GL_TEXTURE3_ARB {0x84C3}
+sub GL_TEXTURE3_SGIS {0x8361}
+sub GL_TEXTURE4 {0x84C4}
+sub GL_TEXTURE4_ARB {0x84C4}
+sub GL_TEXTURE5 {0x84C5}
+sub GL_TEXTURE5_ARB {0x84C5}
+sub GL_TEXTURE6 {0x84C6}
+sub GL_TEXTURE6_ARB {0x84C6}
+sub GL_TEXTURE7 {0x84C7}
+sub GL_TEXTURE7_ARB {0x84C7}
+sub GL_TEXTURE8 {0x84C8}
+sub GL_TEXTURE8_ARB {0x84C8}
+sub GL_TEXTURE9 {0x84C9}
+sub GL_TEXTURE9_ARB {0x84C9}
+sub GL_TEXTURE_1D {0x0DE0}
+sub GL_TEXTURE_2D {0x0DE1}
+sub GL_TEXTURE_3D {0x806F}
+sub GL_TEXTURE_3D_EXT {0x806F}
+sub GL_TEXTURE_ALPHA_SIZE {0x805F}
+sub GL_TEXTURE_BASE_LEVEL {0x813C}
+sub GL_TEXTURE_BASE_LEVEL_SGIS {0x813C}
+sub GL_TEXTURE_BINDING_1D {0x8068}
+sub GL_TEXTURE_BINDING_2D {0x8069}
+sub GL_TEXTURE_BINDING_3D {0x806A}
+sub GL_TEXTURE_BINDING_CUBE_MAP {0x8514}
+sub GL_TEXTURE_BINDING_CUBE_MAP_ARB {0x8514}
+sub GL_TEXTURE_BINDING_CUBE_MAP_EXT {0x8514}
+sub GL_TEXTURE_BINDING_RECTANGLE_NV {0x84F6}
+sub GL_TEXTURE_BIT {0x00040000}
+sub GL_TEXTURE_BLUE_SIZE {0x805E}
+sub GL_TEXTURE_BORDER {0x1005}
+sub GL_TEXTURE_BORDER_COLOR {0x1004}
+sub GL_TEXTURE_BORDER_VALUES_NV {0x871A}
+sub GL_TEXTURE_COLOR_WRITEMASK_SGIS {0x81EF}
+sub GL_TEXTURE_COMPARE_FAIL_VALUE_ARB {0x80BF}
+sub GL_TEXTURE_COMPARE_FUNC {0x884D}
+sub GL_TEXTURE_COMPARE_FUNC_ARB {0x884D}
+sub GL_TEXTURE_COMPARE_MODE {0x884C}
+sub GL_TEXTURE_COMPARE_MODE_ARB {0x884C}
+sub GL_TEXTURE_COMPARE_OPERATOR_SGIX {0x819B}
+sub GL_TEXTURE_COMPARE_SGIX {0x819A}
+sub GL_TEXTURE_COMPONENTS {0x1003}
+sub GL_TEXTURE_COMPRESSED {0x86A1}
+sub GL_TEXTURE_COMPRESSED_ARB {0x86A1}
+sub GL_TEXTURE_COMPRESSED_IMAGE_SIZE {0x86A0}
+sub GL_TEXTURE_COMPRESSED_IMAGE_SIZE_ARB {0x86A0}
+sub GL_TEXTURE_COMPRESSION_HINT {0x84EF}
+sub GL_TEXTURE_COMPRESSION_HINT_ARB {0x84EF}
+sub GL_TEXTURE_COORD_ARRAY {0x8078}
+sub GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING_ARB {0x889A}
+sub GL_TEXTURE_COORD_ARRAY_COUNT_EXT {0x808B}
+sub GL_TEXTURE_COORD_ARRAY_EXT {0x8078}
+sub GL_TEXTURE_COORD_ARRAY_POINTER {0x8092}
+sub GL_TEXTURE_COORD_ARRAY_POINTER_EXT {0x8092}
+sub GL_TEXTURE_COORD_ARRAY_SIZE {0x8088}
+sub GL_TEXTURE_COORD_ARRAY_SIZE_EXT {0x8088}
+sub GL_TEXTURE_COORD_ARRAY_STRIDE {0x808A}
+sub GL_TEXTURE_COORD_ARRAY_STRIDE_EXT {0x808A}
+sub GL_TEXTURE_COORD_ARRAY_TYPE {0x8089}
+sub GL_TEXTURE_COORD_ARRAY_TYPE_EXT {0x8089}
+sub GL_TEXTURE_CUBE_MAP {0x8513}
+sub GL_TEXTURE_CUBE_MAP_ARB {0x8513}
+sub GL_TEXTURE_CUBE_MAP_EXT {0x8513}
+sub GL_TEXTURE_CUBE_MAP_NEGATIVE_X {0x8516}
+sub GL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB {0x8516}
+sub GL_TEXTURE_CUBE_MAP_NEGATIVE_X_EXT {0x8516}
+sub GL_TEXTURE_CUBE_MAP_NEGATIVE_Y {0x8518}
+sub GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB {0x8518}
+sub GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_EXT {0x8518}
+sub GL_TEXTURE_CUBE_MAP_NEGATIVE_Z {0x851A}
+sub GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB {0x851A}
+sub GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_EXT {0x851A}
+sub GL_TEXTURE_CUBE_MAP_POSITIVE_X {0x8515}
+sub GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB {0x8515}
+sub GL_TEXTURE_CUBE_MAP_POSITIVE_X_EXT {0x8515}
+sub GL_TEXTURE_CUBE_MAP_POSITIVE_Y {0x8517}
+sub GL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB {0x8517}
+sub GL_TEXTURE_CUBE_MAP_POSITIVE_Y_EXT {0x8517}
+sub GL_TEXTURE_CUBE_MAP_POSITIVE_Z {0x8519}
+sub GL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB {0x8519}
+sub GL_TEXTURE_CUBE_MAP_POSITIVE_Z_EXT {0x8519}
+sub GL_TEXTURE_DEPTH {0x8071}
+sub GL_TEXTURE_DEPTH_EXT {0x8071}
+sub GL_TEXTURE_DEPTH_SIZE {0x884A}
+sub GL_TEXTURE_DEPTH_SIZE_ARB {0x884A}
+sub GL_TEXTURE_DS_SIZE_NV {0x871D}
+sub GL_TEXTURE_DT_SIZE_NV {0x871E}
+sub GL_TEXTURE_ENV {0x2300}
+sub GL_TEXTURE_ENV_COLOR {0x2201}
+sub GL_TEXTURE_ENV_MODE {0x2200}
+sub GL_TEXTURE_FILTER_CONTROL {0x8500}
+sub GL_TEXTURE_FILTER_CONTROL_EXT {0x8500}
+sub GL_TEXTURE_FLOAT_COMPONENTS_NV {0x888C}
+sub GL_TEXTURE_GEN_MODE {0x2500}
+sub GL_TEXTURE_GEN_Q {0x0C63}
+sub GL_TEXTURE_GEN_R {0x0C62}
+sub GL_TEXTURE_GEN_S {0x0C60}
+sub GL_TEXTURE_GEN_T {0x0C61}
+sub GL_TEXTURE_GEQUAL_R_SGIX {0x819D}
+sub GL_TEXTURE_GREEN_SIZE {0x805D}
+sub GL_TEXTURE_HEIGHT {0x1001}
+sub GL_TEXTURE_HI_SIZE_NV {0x871B}
+sub GL_TEXTURE_INDEX_SIZE_EXT {0x80ED}
+sub GL_TEXTURE_INTENSITY_SIZE {0x8061}
+sub GL_TEXTURE_INTERNAL_FORMAT {0x1003}
+sub GL_TEXTURE_LEQUAL_R_SGIX {0x819C}
+sub GL_TEXTURE_LOD_BIAS {0x8501}
+sub GL_TEXTURE_LOD_BIAS_EXT {0x8501}
+sub GL_TEXTURE_LO_SIZE_NV {0x871C}
+sub GL_TEXTURE_LUMINANCE_SIZE {0x8060}
+sub GL_TEXTURE_MAG_FILTER {0x2800}
+sub GL_TEXTURE_MAG_SIZE_NV {0x871F}
+sub GL_TEXTURE_MATRIX {0x0BA8}
+sub GL_TEXTURE_MAX_ANISOTROPY_EXT {0x84FE}
+sub GL_TEXTURE_MAX_LEVEL {0x813D}
+sub GL_TEXTURE_MAX_LEVEL_SGIS {0x813D}
+sub GL_TEXTURE_MAX_LOD {0x813B}
+sub GL_TEXTURE_MAX_LOD_SGIS {0x813B}
+sub GL_TEXTURE_MIN_FILTER {0x2801}
+sub GL_TEXTURE_MIN_LOD {0x813A}
+sub GL_TEXTURE_MIN_LOD_SGIS {0x813A}
+sub GL_TEXTURE_PRIORITY {0x8066}
+sub GL_TEXTURE_RECTANGLE_NV {0x84F5}
+sub GL_TEXTURE_RED_SIZE {0x805C}
+sub GL_TEXTURE_RESIDENT {0x8067}
+sub GL_TEXTURE_SHADER_NV {0x86DE}
+sub GL_TEXTURE_STACK_DEPTH {0x0BA5}
+sub GL_TEXTURE_UNSIGNED_REMAP_MODE_NV {0x888F}
+sub GL_TEXTURE_WIDTH {0x1000}
+sub GL_TEXTURE_WRAP_R {0x8072}
+sub GL_TEXTURE_WRAP_R_EXT {0x8072}
+sub GL_TEXTURE_WRAP_S {0x2802}
+sub GL_TEXTURE_WRAP_T {0x2803}
+sub GL_TRACK_MATRIX_NV {0x8648}
+sub GL_TRACK_MATRIX_TRANSFORM_NV {0x8649}
+sub GL_TRANSFORM_BIT {0x00001000}
+sub GL_TRANSFORM_HINT_APPLE {0x85B1}
+sub GL_TRANSPOSE_COLOR_MATRIX {0x84E6}
+sub GL_TRANSPOSE_COLOR_MATRIX_ARB {0x84E6}
+sub GL_TRANSPOSE_CURRENT_MATRIX_ARB {0x88B7}
+sub GL_TRANSPOSE_MODELVIEW_MATRIX {0x84E3}
+sub GL_TRANSPOSE_MODELVIEW_MATRIX_ARB {0x84E3}
+sub GL_TRANSPOSE_NV {0x862C}
+sub GL_TRANSPOSE_PROJECTION_MATRIX {0x84E4}
+sub GL_TRANSPOSE_PROJECTION_MATRIX_ARB {0x84E4}
+sub GL_TRANSPOSE_TEXTURE_MATRIX {0x84E5}
+sub GL_TRANSPOSE_TEXTURE_MATRIX_ARB {0x84E5}
+sub GL_TRIANGLES {0x0004}
+sub GL_TRIANGLE_FAN {0x0006}
+sub GL_TRIANGLE_STRIP {0x0005}
+sub GL_TRUE {1}
+sub GL_UNPACK_ALIGNMENT {0x0CF5}
+sub GL_UNPACK_IMAGE_HEIGHT {0x806E}
+sub GL_UNPACK_IMAGE_HEIGHT_EXT {0x806E}
+sub GL_UNPACK_LSB_FIRST {0x0CF1}
+sub GL_UNPACK_ROW_LENGTH {0x0CF2}
+sub GL_UNPACK_SKIP_IMAGES {0x806D}
+sub GL_UNPACK_SKIP_IMAGES_EXT {0x806D}
+sub GL_UNPACK_SKIP_PIXELS {0x0CF4}
+sub GL_UNPACK_SKIP_ROWS {0x0CF3}
+sub GL_UNPACK_SWAP_BYTES {0x0CF0}
+sub GL_UNSIGNED_BYTE {0x1401}
+sub GL_UNSIGNED_BYTE_2_3_3_REV {0x8362}
+sub GL_UNSIGNED_BYTE_3_3_2 {0x8032}
+sub GL_UNSIGNED_BYTE_3_3_2_EXT {0x8032}
+sub GL_UNSIGNED_IDENTITY_NV {0x8536}
+sub GL_UNSIGNED_INT {0x1405}
+sub GL_UNSIGNED_INT_10_10_10_2 {0x8036}
+sub GL_UNSIGNED_INT_10_10_10_2_EXT {0x8036}
+sub GL_UNSIGNED_INT_24_8_NV {0x84FA}
+sub GL_UNSIGNED_INT_2_10_10_10_REV {0x8368}
+sub GL_UNSIGNED_INT_8_8_8_8 {0x8035}
+sub GL_UNSIGNED_INT_8_8_8_8_EXT {0x8035}
+sub GL_UNSIGNED_INT_8_8_8_8_REV {0x8367}
+sub GL_UNSIGNED_INT_8_8_S8_S8_REV_NV {0x86DB}
+sub GL_UNSIGNED_INT_S10_S11_S11_REV_NV {0x886B}
+sub GL_UNSIGNED_INT_S8_S8_8_8_NV {0x86DA}
+sub GL_UNSIGNED_INVERT_NV {0x8537}
+sub GL_UNSIGNED_SHORT {0x1403}
+sub GL_UNSIGNED_SHORT_1_5_5_5_REV {0x8366}
+sub GL_UNSIGNED_SHORT_4_4_4_4 {0x8033}
+sub GL_UNSIGNED_SHORT_4_4_4_4_EXT {0x8033}
+sub GL_UNSIGNED_SHORT_4_4_4_4_REV {0x8365}
+sub GL_UNSIGNED_SHORT_5_5_5_1 {0x8034}
+sub GL_UNSIGNED_SHORT_5_5_5_1_EXT {0x8034}
+sub GL_UNSIGNED_SHORT_5_6_5 {0x8363}
+sub GL_UNSIGNED_SHORT_5_6_5_REV {0x8364}
+sub GL_V2F {0x2A20}
+sub GL_V3F {0x2A21}
+sub GL_VARIABLE_A_NV {0x8523}
+sub GL_VARIABLE_B_NV {0x8524}
+sub GL_VARIABLE_C_NV {0x8525}
+sub GL_VARIABLE_D_NV {0x8526}
+sub GL_VARIABLE_E_NV {0x8527}
+sub GL_VARIABLE_F_NV {0x8528}
+sub GL_VARIABLE_G_NV {0x8529}
+sub GL_VENDOR {0x1F00}
+sub GL_VERSION {0x1F02}
+sub GL_VERTEX_ARRAY {0x8074}
+sub GL_VERTEX_ARRAY_BUFFER_BINDING_ARB {0x8896}
+sub GL_VERTEX_ARRAY_COUNT_EXT {0x807D}
+sub GL_VERTEX_ARRAY_EXT {0x8074}
+sub GL_VERTEX_ARRAY_POINTER {0x808E}
+sub GL_VERTEX_ARRAY_POINTER_EXT {0x808E}
+sub GL_VERTEX_ARRAY_RANGE_LENGTH_NV {0x851E}
+sub GL_VERTEX_ARRAY_RANGE_NV {0x851D}
+sub GL_VERTEX_ARRAY_RANGE_POINTER_NV {0x8521}
+sub GL_VERTEX_ARRAY_RANGE_VALID_NV {0x851F}
+sub GL_VERTEX_ARRAY_RANGE_WITHOUT_FLUSH_NV {0x8533}
+sub GL_VERTEX_ARRAY_SIZE {0x807A}
+sub GL_VERTEX_ARRAY_SIZE_EXT {0x807A}
+sub GL_VERTEX_ARRAY_STRIDE {0x807C}
+sub GL_VERTEX_ARRAY_STRIDE_EXT {0x807C}
+sub GL_VERTEX_ARRAY_TYPE {0x807B}
+sub GL_VERTEX_ARRAY_TYPE_EXT {0x807B}
+sub GL_VERTEX_ATTRIB_ARRAY0_NV {0x8650}
+sub GL_VERTEX_ATTRIB_ARRAY10_NV {0x865A}
+sub GL_VERTEX_ATTRIB_ARRAY11_NV {0x865B}
+sub GL_VERTEX_ATTRIB_ARRAY12_NV {0x865C}
+sub GL_VERTEX_ATTRIB_ARRAY13_NV {0x865D}
+sub GL_VERTEX_ATTRIB_ARRAY14_NV {0x865E}
+sub GL_VERTEX_ATTRIB_ARRAY15_NV {0x865F}
+sub GL_VERTEX_ATTRIB_ARRAY1_NV {0x8651}
+sub GL_VERTEX_ATTRIB_ARRAY2_NV {0x8652}
+sub GL_VERTEX_ATTRIB_ARRAY3_NV {0x8653}
+sub GL_VERTEX_ATTRIB_ARRAY4_NV {0x8654}
+sub GL_VERTEX_ATTRIB_ARRAY5_NV {0x8655}
+sub GL_VERTEX_ATTRIB_ARRAY6_NV {0x8656}
+sub GL_VERTEX_ATTRIB_ARRAY7_NV {0x8657}
+sub GL_VERTEX_ATTRIB_ARRAY8_NV {0x8658}
+sub GL_VERTEX_ATTRIB_ARRAY9_NV {0x8659}
+sub GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING_ARB {0x889F}
+sub GL_VERTEX_ATTRIB_ARRAY_ENABLED_ARB {0x8622}
+sub GL_VERTEX_ATTRIB_ARRAY_NORMALIZED_ARB {0x886A}
+sub GL_VERTEX_ATTRIB_ARRAY_POINTER_ARB {0x8645}
+sub GL_VERTEX_ATTRIB_ARRAY_SIZE_ARB {0x8623}
+sub GL_VERTEX_ATTRIB_ARRAY_STRIDE_ARB {0x8624}
+sub GL_VERTEX_ATTRIB_ARRAY_TYPE_ARB {0x8625}
+sub GL_VERTEX_PROGRAM_ARB {0x8620}
+sub GL_VERTEX_PROGRAM_BINDING_NV {0x864A}
+sub GL_VERTEX_PROGRAM_NV {0x8620}
+sub GL_VERTEX_PROGRAM_POINT_SIZE_ARB {0x8642}
+sub GL_VERTEX_PROGRAM_POINT_SIZE_NV {0x8642}
+sub GL_VERTEX_PROGRAM_TWO_SIDE_ARB {0x8643}
+sub GL_VERTEX_PROGRAM_TWO_SIDE_NV {0x8643}
+sub GL_VERTEX_STATE_PROGRAM_NV {0x8621}
+sub GL_VERTEX_WEIGHTING_EXT {0x8509}
+sub GL_VERTEX_WEIGHT_ARRAY_EXT {0x850C}
+sub GL_VERTEX_WEIGHT_ARRAY_POINTER_EXT {0x8510}
+sub GL_VERTEX_WEIGHT_ARRAY_SIZE_EXT {0x850D}
+sub GL_VERTEX_WEIGHT_ARRAY_STRIDE_EXT {0x850F}
+sub GL_VERTEX_WEIGHT_ARRAY_TYPE_EXT {0x850E}
+sub GL_VIBRANCE_BIAS_NV {0x8719}
+sub GL_VIBRANCE_SCALE_NV {0x8713}
+sub GL_VIEWPORT {0x0BA2}
+sub GL_VIEWPORT_BIT {0x00000800}
+sub GL_WEIGHT_ARRAY_BUFFER_BINDING_ARB {0x889E}
+sub GL_WRITE_ONLY_ARB {0x88B9}
+sub GL_WRITE_PIXEL_DATA_RANGE_LENGTH_NV {0x887A}
+sub GL_WRITE_PIXEL_DATA_RANGE_NV {0x8878}
+sub GL_WRITE_PIXEL_DATA_RANGE_POINTER_NV {0x887C}
+sub GL_XOR {0x1506}
+sub GL_YCRYCB_422_NVX {0x600B}
+sub GL_ZERO {0}
+sub GL_ZOOM_X {0x0D16}
+sub GL_ZOOM_Y {0x0D17}
+
+1;
diff --git a/lib/SDL/Palette.pm b/lib/SDL/Palette.pm
new file mode 100644 (file)
index 0000000..62a58f5
--- /dev/null
@@ -0,0 +1,162 @@
+#!/usr/bin/env perl
+#
+# Palette.pm
+#
+# Copyright (C) 2005 David J. Goehrig <dgoehrig@cpan.org>
+#
+# ------------------------------------------------------------------------------
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+# 
+# This library 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
+# Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+#
+# ------------------------------------------------------------------------------
+#
+# Please feel free to send questions, suggestions or improvements to:
+#
+#      David J. Goehrig
+#      dgoehrig@cpan.org
+#
+
+# NB: there is no palette destructor because most of the time the 
+# palette will be owned by a surface, so any palettes you create 
+# with new, won't be destroyed until the program ends!
+
+package SDL::Palette;
+use strict;
+
+# NB: there is no palette destructor because most of the time the 
+# palette will be owned by a surface, so any palettes you create 
+# with new, won't be destroyed until the program ends!
+
+sub new {
+       my $proto = shift;
+       my $class = ref($proto) || $proto;
+       my $image;
+       my $self;
+       if (@_) { 
+               $image = shift;
+               $self = \$image->palette(); 
+       } else { 
+               $self = \SDL::NewPalette(256); 
+       }
+       die SDL::GetError() unless $$self;
+       bless $self, $class;
+       return $self;
+}
+
+sub size {
+       my $self = shift;
+       return SDL::PaletteNColors($$self);
+}
+
+sub color {
+       my $self = shift;
+       my $index = shift;
+       my ($r,$g,$b);
+       if (@_) { 
+               $r = shift; $g = shift; $b = shift; 
+               return SDL::PaletteColors($$self,$index,$r,$g,$b);
+       } else {
+               return SDL::PaletteColors($$self,$index);
+       }
+}
+
+sub red {
+       my $self = shift;
+       my $index = shift;
+       my $c;
+       if (@_) {
+               $c = shift;
+               return SDL::ColorR(
+                       SDL::PaletteColors($$self,$index),$c);
+       } else {        
+               return SDL::ColorR(
+                       SDL::PaletteColors($$self,$index));
+       }
+}
+
+sub green {
+       my $self = shift;
+       my $index = shift;
+       my $c;
+       if (@_) {
+               $c = shift;
+               return SDL::ColorG(
+                       SDL::PaletteColors($$self,$index),$c);
+       } else {        
+               return SDL::ColorG(
+                       SDL::PaletteColors($$self,$index));
+       }
+}
+
+sub blue {
+       my $self = shift;
+       my $index = shift;
+       my $c;
+       if (@_) {
+               $c = shift;
+               return SDL::ColorB(
+                       SDL::PaletteColors($$self,$index),$c);
+       } else {        
+               return SDL::ColorB(
+                       SDL::PaletteColors($$self,$index));
+       }
+}
+
+1;
+
+__END__;
+
+=pod
+
+=head1 NAME
+
+SDL::Palette - a perl extension
+
+=head1 DESCRIPTION
+
+L<SDL::Palette> provides an interface to the SDL_Palette structures,
+and can be used to set the color values of an existing palette's indexes.
+
+=head1 METHODS
+
+=head2 blue ( index, [value] )
+
+Fetches and sets the blue component of the color at index.
+
+=head2 green ( index, [value] )
+
+Fetches and sets the green component of the color at index.
+
+=head2 red ( index, [value] )
+
+Fetches and sets the red component of the color at index.
+
+=head2 color ( index, [ r, g, b ] )
+
+Fetches and sets the RGB, returns an SDL_Color *.
+
+=head2 size
+
+Returns the size of the palette.
+
+=head1 AUTHOR
+
+David J. Goehrig
+
+=head1 SEE ALSO
+
+L<perl> L<SDL::Color> L<SDL::Surface>
+
+=cut
diff --git a/lib/SDL/Rect.pm b/lib/SDL/Rect.pm
new file mode 100644 (file)
index 0000000..f63dbe2
--- /dev/null
@@ -0,0 +1,135 @@
+#!/usr/bin/env perl
+#
+# Rect.pm
+#
+# Copyright (C) 2005 David J. Goehrig <dgoehrig@cpan.org>
+#
+# ------------------------------------------------------------------------------
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+# 
+# This library 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
+# Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+#
+# ------------------------------------------------------------------------------
+#
+# Please feel free to send questions, suggestions or improvements to:
+#
+#      David J. Goehrig
+#      dgoehrig@cpan.org
+#
+
+package SDL::Rect;
+
+use strict;
+use SDL;
+
+sub new {
+       my $proto = shift;
+       my $class = ref($proto) || $proto;
+       my %options = @_;
+
+       verify (%options, qw/ -x -y -width -height -w -h / ) if $SDL::DEBUG;
+
+       my $x = $options{-x}            || 0;
+       my $y = $options{-y}            || 0;
+       my $w = $options{-width}        || $options{-w}         || 0;
+       my $h = $options{-height}       || $options{-h}         || 0;
+       
+       my $self = \SDL::NewRect($x,$y,$w,$h);
+       die SDL::GetError() unless $$self;
+       bless $self,$class;
+       return $self;
+}
+
+sub DESTROY {
+       SDL::FreeRect(${$_[0]});
+}
+
+sub x {
+       my $self = shift;
+       SDL::RectX($$self,@_);
+}
+
+sub y {
+       my $self = shift;
+       SDL::RectY($$self,@_);
+}
+
+sub width {
+       my $self = shift;
+       SDL::RectW($$self,@_);
+}
+
+sub height {
+       my $self = shift;
+       SDL::RectH($$self,@_);
+}
+
+1;
+
+__END__;
+
+=pod
+
+
+=head1 NAME
+
+SDL::Rect - a SDL perl extension
+
+=head1 SYNOPSIS
+
+  $rect = new SDL::Rect ( -height => 4, -width => 40 );
+
+=head1 DESCRIPTION
+
+C<SDL::Rect::new> creates a SDL_Rect structure which is
+used for specifying regions for filling, blitting, and updating.
+These objects make it easy to cut and backfill.
+By default, x, y, h, w are 0.
+
+=head2 METHODS 
+
+The four fields of a rectangle can be set simply
+by passing a value to the applicable method.  These are:
+
+=over 4
+
+=item *
+
+C<SDL::Rect::x>        sets and fetches the x position.
+
+=item *
+
+C<SDL::Rect::y>        sets and fetches the y position.
+
+=item *
+
+C<SDL::Rect::width> sets and fetched the width.
+
+=item *
+
+C<SDL::Rect::height> sets and fetched the height.
+
+=back
+
+=head1 AUTHOR
+
+David J. Goehrig
+
+=head1 SEE ALSO
+
+perl(1) SDL::Surface(3)
+
+
+=cut
+
diff --git a/lib/SDL/SFont.pm b/lib/SDL/SFont.pm
new file mode 100644 (file)
index 0000000..3efe1e7
--- /dev/null
@@ -0,0 +1,78 @@
+#!/usr/bin/env perl
+#
+# SFont.pm
+#
+# Copyright (C) 2005 David J. Goehrig <dgoehrig@cpan.org>
+#
+# ------------------------------------------------------------------------------
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+# 
+# This library 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
+# Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+#
+# ------------------------------------------------------------------------------
+#
+# Please feel free to send questions, suggestions or improvements to:
+#
+#      David J. Goehrig
+#      dgoehrig@cpan.org
+#
+
+package SDL::SFont;
+
+require Exporter;
+require DynaLoader;
+use vars qw(
+       @EXPORT
+       @ISA
+);
+@ISA=qw(Exporter DynaLoader);
+
+use SDL;
+
+BEGIN {
+
+};
+
+sub SDL_TEXTWIDTH {
+       return SDL::SFont::TextWidth(join('',@_));
+}
+
+
+bootstrap SDL::SFont;
+
+1;
+
+__END__;
+
+=pod
+
+
+
+=head1 NAME
+
+SDL::SFont - a perl extension
+
+=head1 DESCRIPTION
+
+
+
+=head1 AUTHOR
+
+David J. Goehrig
+
+=head1 SEE ALSO
+
+L<perl> L<SDL::App>
+
+=cut
diff --git a/lib/SDL/Sound.pm b/lib/SDL/Sound.pm
new file mode 100644 (file)
index 0000000..f6afb27
--- /dev/null
@@ -0,0 +1,89 @@
+#!/usr/bin/env perl
+#
+# Sound.pm
+#
+# Copyright (C) 2005 David J. Goehrig <dgoehrig@cpan.org>
+#
+# ------------------------------------------------------------------------------
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+# 
+# This library 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
+# Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+#
+# ------------------------------------------------------------------------------
+#
+# Please feel free to send questions, suggestions or improvements to:
+#
+#      David J. Goehrig
+#      dgoehrig@cpan.org
+#
+
+package SDL::Sound;
+use strict;
+
+sub new {
+       my $proto = shift;      
+       my $class = ref($proto) || $proto;
+       my $filename = shift;
+       my $self = \SDL::MixLoadWAV($filename);
+       die SDL::GetError() unless $$self;
+       bless $self,$class;
+       return $self;
+}
+
+sub DESTROY {
+       my $self = shift;
+       SDL::MixFreeChunk($$self);
+}
+
+sub volume {
+       my $self = shift;
+       my $volume = shift;
+       return SDL::MixVolumeChunk($$self,$volume);
+}
+
+1;
+
+__END__;
+
+=pod
+
+
+
+=head1 NAME
+
+SDL::Sound - a perl extension
+
+=head1 DESCRIPTION
+
+L<SDL::Sound> is a module for loading WAV files for sound effects.
+The file can be loaded by creating a new L<SDL::Sound> object by
+passing the filename to the constructor;
+
+       my $sound = new SDL::Sound 'my_sfx.wav';
+
+=head1 METHODS
+
+=head2 volume ( value )
+
+Sets the volume of the sample.
+
+=head1 AUTHOR
+
+David J. Goehrig
+
+=head1 SEE ALSO
+
+L<perl> L<SDL::Mixer>
+
+=cut
diff --git a/lib/SDL/Surface.pm b/lib/SDL/Surface.pm
new file mode 100644 (file)
index 0000000..c10af8d
--- /dev/null
@@ -0,0 +1,556 @@
+#!/usr/bin/env perl
+#
+# Surface.pm
+#
+# Copyright (C) 2005 David J. Goehrig <dgoehrig@cpan.org>
+#
+# ------------------------------------------------------------------------------
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+# 
+# This library 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
+# Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+#
+# ------------------------------------------------------------------------------
+#
+# Please feel free to send questions, suggestions or improvements to:
+#
+#      David J. Goehrig
+#      dgoehrig@cpan.org
+#
+
+package SDL::Surface;
+
+use strict;
+use SDL;
+use SDL::SFont;
+use SDL::Color;
+use SDL::Rect;
+
+sub new {
+       my $proto = shift;      
+       my $class = ref($proto) || $proto;
+       my %options = @_;
+       my $self;
+
+       verify (%options, qw/ -name -n -flags -fl -width -w -height -h -depth -d
+                               -pitch -p -Rmask -r -Gmask -g -Bmask -b -Amask -a
+                               -from -f /) if $SDL::DEBUG;
+       
+       if ( defined($options{-name}) && $options{-name} ne "" && exists $SDL::{IMGLoad} ) {            
+          $self = \SDL::IMGLoad($options{-name});      
+       } else {
+               my $f = $options{-flags}        || $options{-fl}        || SDL::SDL_ANYFORMAT();
+               my $w = $options{-width}        || $options{-w}         || 1;
+               my $h = $options{-height}       || $options{-h}         || 1;   
+               my $d = $options{-depth}        || $options{-d}         || 8;
+               my $p = $options{-pitch}        || $options{-p}         || $w*$d;              
+               my $r = $options{-Rmask}        || $options{-r} 
+                       ||  ( SDL::BigEndian() ? 0xff000000 : 0x000000ff );
+               my $g = $options{-Gmask}        || $options{-g}
+                       ||  ( SDL::BigEndian() ? 0x00ff0000 : 0x0000ff00 );
+               my $b = $options{-Bmask}        || $options{-b}
+                       ||  ( SDL::BigEndian() ? 0x0000ff00 : 0x00ff0000 );
+               my $a = $options{-Amask}        || $options{-a}
+                       ||  ( SDL::BigEndian() ? 0x000000ff : 0xff000000 );
+
+               if ( $options{-from}|| $options{-f} ) { 
+                       my $src = $options{-from}|| $options{-f};
+                       $self = \SDL::CreateRGBSurfaceFrom($src,$w,$h,$d,$p,$r,$g,$b,$a);
+               } else {
+                       $self = \SDL::CreateRGBSurface($f,$w,$h,$d,$r,$g,$b,$a);
+               }
+       }
+       die SDL::GetError() unless $$self;
+       bless $self,$class;
+       return $self;
+}
+
+sub DESTROY {          
+       SDL::FreeSurface(${$_[0]});
+}
+
+sub flags {
+       SDL::SurfaceFlags(${$_[0]});
+}
+
+sub palette {
+       SDL::SurfacePalette(${$_[0]});
+}
+
+sub bpp {
+       SDL::SurfaceBitsPerPixel(${$_[0]});
+}
+
+sub bytes_per_pixel {
+       SDL::SurfaceBytesPerPixel(${$_[0]});
+}
+
+sub Rshift {
+       SDL::SurfaceRshift(${$_[0]});
+}
+
+sub Gshift {
+       SDL::SurfaceGshift(${$_[0]});
+}
+
+sub Bshift {
+       SDL::SurfaceBshift(${$_[0]});
+}
+
+sub Ashift {
+       SDL::SurfaceAshift(${$_[0]});
+}
+
+sub Rmask {
+       SDL::SurfaceRmask(${$_[0]});
+}
+
+sub Gmask {
+       SDL::SurfaceGmask(${$_[0]});
+}
+
+sub Bmask {
+       SDL::SurfaceBmask(${$_[0]});
+}
+
+sub Amask {
+       SDL::SurfaceAmask(${$_[0]});
+}
+
+sub color_key {
+       SDL::SurfaceColorKey(${$_[0]});
+}
+
+sub alpha {
+       SDL::SurfaceAlpha(${$_[0]});
+}
+
+sub width {
+       SDL::SurfaceW(${$_[0]});
+}
+
+sub height {
+       SDL::SurfaceH(${$_[0]});
+}
+
+sub pitch {
+       SDL::SurfacePitch(${$_[0]});
+}
+
+sub pixels {
+       SDL::SurfacePixels(${$_[0]});
+}
+
+sub pixel {
+       die "SDL::Surface::pixel requires a SDL::Color"
+               if $_[3] && $SDL::DEBUG && !$_[3]->isa("SDL::Color");
+       $_[3] ?
+               new SDL::Color -color => SDL::SurfacePixel(${$_[0]},$_[1],$_[2],${$_[3]}) :
+               new SDL::Color -color => SDL::SurfacePixel(${$_[0]},$_[1],$_[2]);
+}
+
+sub fill {
+       die "SDL::Surface::fill requires a SDL::Rect object"
+               unless !$SDL::DEBUG || $_[1] == 0 || $_[1]->isa('SDL::Rect');
+       die "SDL::Surface::fill requires a SDL::Color object"
+               unless !$SDL::DEBUG || $_[2]->isa('SDL::Color');
+       if ($_[1] == 0 ) {
+               SDL::FillRect(${$_[0]},0,${$_[2]});
+       } else {
+               SDL::FillRect(${$_[0]},${$_[1]},${$_[2]});
+       }
+}
+
+sub lockp {
+       SDL::MUSTLOCK(${$_[0]});
+}
+
+sub lock {
+       SDL::SurfaceLock(${$_[0]});
+}
+
+sub unlock {
+       SDL::SurfaceUnlock(${$_[0]});
+}
+
+sub update {
+       my $self = shift;;
+       if ($SDL::DEBUG) {
+               for (@_) { 
+                       die "SDL::Surface::update requires SDL::Rect objects"
+                               unless $_->isa('SDL::Rect');
+               }
+       }
+       SDL::UpdateRects($$self, map { ${$_} } @_ );
+}
+
+sub flip {
+       SDL::Flip(${$_[0]});
+}
+
+sub blit {
+       if ($SDL::DEBUG) {
+               die "SDL::Surface::blit requires SDL::Rect objects"
+                       unless ($_[1] == 0 || $_[1]->isa('SDL::Rect'))
+                       && ($_[3] == 0 || $_[3]->isa('SDL::Rect'));
+               die "SDL::Surface::blit requires SDL::Surface objects"
+                       unless $_[2]->isa('SDL::Surface'); 
+       }
+       SDL::BlitSurface(map { $_ != 0 ? ${$_} : $_ } @_);
+}
+
+sub set_colors {
+       my $self = shift;
+       my $start = shift;
+       for (@_) {
+               die "SDL::Surface::set_colors requires SDL::Color objects"
+                       unless !$SDL::DEBUG || $_->isa('SDL::Color');
+       }
+       return SDL::SetColors($$self, $start, map { ${$_} } @_);
+}
+
+sub set_color_key {
+       die "SDL::Surface::set_color_key requires a SDL::Color object"
+               unless !$SDL::DEBUG || (ref($_[2]) && $_[2]->isa('SDL::Color'));
+       SDL::SetColorKey(${$_[0]},$_[1],${$_[2]});
+}
+
+sub set_alpha {
+       SDL::SetAlpha(${$_[0]},$_[1],$_[2]);
+}
+
+sub display_format {
+       my $self = shift;
+       my $tmp = SDL::DisplayFormat($$self);
+       SDL::FreeSurface ($$self);
+       $$self = $tmp;
+       $self;
+}
+
+sub rgb {
+       my $self = shift;
+       my $tmp = SDL::ConvertRGB($$self);
+       SDL::FreeSurface($$self);
+       $$self = $tmp;
+       $self;
+}
+
+sub rgba {
+       my $self = shift;
+       my $tmp = SDL::ConvertRGBA($$self);
+       SDL::FreeSurface($$self);
+       $$self = $tmp;
+       $self;
+}
+
+sub rect {
+       my $self = shift;
+       new SDL::Rect -width => $self->width(), -height => $self->height(),
+                       -x => $_[0] || 0, -y => $_[1] || 0;
+}
+
+sub print {
+       my ($self,$x,$y,@text) = @_;
+       SDL::SFont::PutString( $$self, $x, $y, join('',@text));
+}
+
+sub save_bmp {
+       SDL::SaveBMP( ${$_[0]},$_[1]);
+}
+
+sub video_info {
+       shift;
+       SDL::VideoInfo();
+}
+
+1;
+
+__END__;
+
+=pod 
+
+=head1 NAME
+
+SDL::Surface - a SDL perl extension
+
+=head1 SYNOPSIS
+
+  use SDL::Surface;
+  $image = new SDL::Surface(-name=>"yomama.jpg");
+
+=head1 DESCRIPTION
+
+The C<SDL::Surface> module encapsulates the SDL_Surface* structure, and
+many of its ancillatory functions.  Not only is it a workhorse of the
+OO Layer, it is the base class for the C<SDL::App> class.  
+       
+=head1 EXPORTS
+
+       SDL_SWSURFACE           SDL_HWSURFACE
+       SDL_ASYNCBLIT           SDL_ANYFORMAT
+       SDL_HWPALETTE           SDL_DOUBLEBUF 
+       SDL_FULLSCREEN          SDL_OPENGL 
+       SDL_OPENGLBLIT          SDL_RESIZEABLE
+       SDL_NOFRAME             SDL_SRCCOLORKEY
+       SDL_RLEACCEL            SDL_SRCALPHA
+       SDL_PREALLOC
+
+=head1 METHODS
+
+=head2 new (-name => 'foo.png')
+
+The C<SDL::Surface> class can be instantiated in a number of different ways.
+If support for the SDL_image library was included when SDL_perl was compiled,
+the easiest way to create a new surface is to use the C<SDL::Surface::new>
+method with the C<-name> option.  This will load the image from the file 
+and return an object encapsulating the SDL_Surface*.
+
+=head2 new (-from => $buffer, ... )
+
+If the contents of the new Surface is already in memory, C<SDL::Surface::new>
+may be called with the C<-from> option to create an image from that section
+of memory.  This method takes the following additional parameters:
+
+=over 4
+
+=item *
+
+-width         the width of the image in pixels
+
+=item *
+
+-height                the height of the image in pixels
+
+=item *
+
+-depth         the number of bits per pixel
+
+=item *
+
+-pitch         the number of bytes per line
+
+=item *
+
+-Rmask         an optional bitmask for red
+
+=item *
+
+-Gmask         an optional bitmask for green
+
+=item *
+
+-Bmask         an optional bitmask for green
+
+=item *
+
+-Amask         an optional bitmask for alpha
+
+=back
+
+=head2 new ( -flags => SDL_SWSURFACE, ... )
+
+Finally, C<SDL::Suface::new> may be invoked with the C<-flags> option, in a
+similar fashion to the C<-from> directive.  This invocation takes the same
+additional options as C<-from> with the exception of C<-pitch> which is ignored.
+This method returns a new, blank, SDL::Surface option with any of the following
+flags turned on:
+
+=over 4
+
+=item *
+
+SWSURFACE()    a non-accelerated surface
+
+=item *
+
+HWSURFACE()    a hardware accelerated surface 
+
+=item *
+
+SRCCOLORKEY()  a surface with a transperant color      
+
+=item *
+
+SRCALPHA()     an alpha blended, translucent surface 
+
+=back
+
+=head2 flags ()
+
+C<SDL::Surface::flags> returns the flags with which the surface was initialized.
+
+=head2 palette ()
+
+C<SDL::Surface::palette> currently returns a SDL_Palette*, this may change in
+future revisions.
+
+=head2 bpp ()
+
+C<SDL::Surface::bpp> returns the bits per pixel of the surface
+
+=head2 bytes_per_pixel ()
+
+C<SDL::Surface::bytes_per_pixel> returns the bytes per pixel of the surface
+
+=head2 Rshift ()
+
+C<SDL::Surface::Rshift> returns the bit index of the red field for the surface's pixel format
+
+=head2 Gshift ()
+
+C<SDL::Surface::Gshift> returns the bit index of the green field for the surface's pixel format
+
+=head2 Bshift ()
+
+C<SDL::Surface::Bshift> returns the bit index of the blue field for the surface's pixel format
+
+=head2 Ashift ()
+
+C<SDL::Surface::Ashift> returns the bit index of the alpha field for the surface's pixel format
+
+=head2 Rmask ()
+
+C<SDL::Surface::Rmask> returns the bit mask for the red field for teh surface's pixel format
+
+=head2 Gmask ()
+
+C<SDL::Surface::Gmask> returns the bit mask for the green field for teh surface's pixel format
+
+=head2 Bmask ()
+
+C<SDL::Surface::Bmask> returns the bit mask for the blue field for teh surface's pixel format
+
+=head2 Amask ()
+
+C<SDL::Surface::Amask> returns the bit mask for the alpha field for teh surface's pixel format
+
+=head2 color_key ()
+
+C<SDL::Surface::color_key> returns the current color key for the image, which can be set with
+the C<SDL::Surface::set_color_key> method.  Before calling C<SDL::Surface::color_key> on 
+a image, you should fist call C<SDL::Surface::display_format> to convert it to the same
+format as the display.  Failure to do so will result in failure to apply the correct color_key.
+
+=head2 alpha ()
+
+C<SDL::Surface::alpha> returns the current alpha value for the image, which can be set with
+the C<SDL::Surface::set_alpha> method.
+
+=head2 width ()
+
+C<SDL::Surface::width> returns the width in pixels of the surface
+
+=head2 height ()
+
+C<SDL::Surface::height> returns the height in pixels of the surface
+
+=head2 pitch ()
+
+C<SDL::Surface::pitch> returns the width of a surface's scanline in bytes
+
+=head2 pixels ()
+
+C<SDL::Surface::pixels> returns a Uint8* to the image's pixel data.  This is not
+inherently useful within perl, though may be used to pass image data to user provided
+C functions.
+
+=head2 pixel (x,y,[color])
+
+C<SDL::Surface::pixel> will set the color value of the pixel at (x,y) to the given
+color if provided.  C<SDL::Surface::pixel> returns a SDL::Color object for the 
+color value of the pixel at (x,y) after any possible modifications.
+
+=head2 fill (rect,color)
+
+C<SDL::Surface::fill> will fill the given SDL::Rect rectangle with the specified SDL::Color
+This function optionally takes a SDL_Rect* and a SDL_Color*
+
+=head2 lockp ()
+
+C<SDL::Surface::lockp> returns true if the surface must be locked
+
+=head2 lock ()
+
+C<SDL::Surface::lock> places a hardware lock if necessary, preventing access to 
+the surface's memory
+
+=head2 unlock ()
+
+C<SDL::Surface::unlock> removes any hardware locks, enabling blits
+
+=head2 update ( rects...)
+
+C<SDL::Surface::update> takes one or more SDL::Rect's which determine which sections
+of the image are to be updated.  This option is only useful on the appliaction surface.
+
+=head2 flip ()
+
+C<SDL::Surface::flip> updates the full surface, using a double buffer if available
+
+=head2 blit (srect,dest,drect)
+
+C<SDL::Surface::blit> blits the current surface onto the destination surface,
+according to the provided rectangles.  If a rectangle is 0, then the full surface is used.
+
+=head2 set_colors (start,colors...) 
+
+C<SDL::Surface::set_colors> updates the palette starting at index C<start> with the
+supplied colors.  The colors may either be SDL::Color objects or SDL_Color* from the
+low level C-style API.
+
+=head2 set_color_key (flag,pixel) or (flag,x,y)
+
+C<SDL::Surface::set_color_key> sets the blit flag, usually SDL_SRCCOLORKEY, 
+to the specified L<SDL::Color> object.  Optional a SDL_Color* may be passed.
+
+=head2 set_alpha (flag,alpha)
+
+C<SDL::Surface::set_alpha> sets the opacity of the image for alpha blits. 
+C<alpha> takes a value from 0x00 to 0xff.
+
+=head2 display_format ()
+
+C<SDL::Surface::display_format> converts the surface to the same format as the
+current screen.
+
+=head2 rgb ()
+C<SDL::Surface::rgb> converts the surface to a 24 bit rgb format regardless of the 
+initial format.
+
+=head2 rgba ()
+C<SDL::Surface::rgba> converts the surface to a 32 bit rgba format regarless of the
+initial format.
+
+=head2 print (x,y,text...)
+
+C<SDL::Surface::print> renders the text using the current font onto the image.
+This option is only supported for with SDL_image and SFont.
+
+=head2 save_bmp (filename)
+
+C<SDL::Surface::save_bmp> saves the surface to filename in Windows BMP format.
+
+=head2 video_info ()
+
+C<SDL::Surface::video_info> returns a hash describing the current state of the 
+video hardware.
+
+=head1 AUTHOR
+
+David J. Goehrig
+
+=head1 SEE ALSO
+
+L<perl> L<SDL::App> L<SDL::Color> L<SDL::Palette> L<SDL::Rect> 
+
+=cut
diff --git a/lib/SDL/TTFont.pm b/lib/SDL/TTFont.pm
new file mode 100644 (file)
index 0000000..7ddc930
--- /dev/null
@@ -0,0 +1,205 @@
+#!/usr/bin/env perl
+#
+# TTFont.pm
+#
+# Copyright (C) 2005 David J. Goehrig <dgoehrig@cpan.org>
+#
+# ------------------------------------------------------------------------------
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+# 
+# This library 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
+# Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+#
+# ------------------------------------------------------------------------------
+#
+# Please feel free to send questions, suggestions or improvements to:
+#
+#      David J. Goehrig
+#      dgoehrig@cpan.org
+#
+
+package SDL::TTFont;
+
+use strict;
+use SDL;
+use SDL::Surface;
+
+use vars qw/ @ISA /;
+
+@ISA = qw(SDL::Surface);
+
+sub new {
+       my $proto = shift;
+       my $class = ref($proto) || $proto;
+       my $self = {};
+       my %options;
+       (%options) = @_;
+       $self->{-mode} = $options{-mode}        || $options{-m}  || SDL::TEXT_SHADED();
+       $self->{-name} = $options{-name}        || $options{-n};
+       $self->{-size} = $options{-size}        || $options{-s};
+       $self->{-fg} = $options{-foreground}    || $options{-fg} || $SDL::Color::black;
+       $self->{-bg} = $options{-background}    || $options{-bg} || $SDL::Color::white;
+
+       die "SDL::TTFont::new requires a -name\n"
+               unless ($$self{-name});
+
+       die "SDL::TTFont::new requires a -size\n"
+               unless ($$self{-size});
+
+       $self->{-font} = SDL::TTFOpenFont($self->{-name},$self->{-size});
+
+       die "Could not open font $$self{-name}, ", SDL::GetError(), "\n"
+               unless ($self->{-font});
+
+       bless $self,$class;
+       return $self;   
+}
+
+sub DESTROY {
+       my $self = shift;
+       SDL::FreeSurface($self->{-surface});
+       SDL::TTFCloseFont($self->{-font});
+}
+
+sub print {
+       my ($self,$surface,$x,$y,@text) = @_;
+
+       die "Print requies an SDL::Surface"
+               unless( ref($surface) && $surface->isa("SDL::Surface") );
+
+       SDL::FreeSurface($self->{-surface}) if ($$self{-surface});
+
+       $$self{-surface} = SDL::TTFPutString($$self{-font},$$self{-mode},
+               $$surface,$x,$y,${$$self{-fg}},${$$self{-bg}},join("",@text));
+
+       die "Could not print \"", join("",@text), "\" to surface, ",
+               SDL::GetError(), "\n" unless ($$self{-surface});
+}
+
+sub width {
+        my ($self,@text) = @_;
+        my $aref = SDL::TTFSizeText($$self{-font},join(" ",@text));
+       $$aref[0];
+}
+
+sub height {
+        my ($self) = @_;
+        SDL::TTFFontHeight($$self{-font});
+}
+
+sub ascent {
+        my ($self) = @_;
+        SDL::TTFFontAscent($$self{-font});
+}
+
+sub descent {
+        my ($self) = @_;
+        SDL::TTFFontDescent($$self{-font});
+}
+
+sub normal {
+       my ($self) = @_;
+       SDL::TTFSetFontStyle($$self{-font},SDL::TTF_STYLE_NORMAL());
+}
+
+sub bold {
+       my ($self) = @_;
+       SDL::TTFSetFontStyle($$self{-font},SDL::TTF_STYLE_BOLD());
+}
+
+sub italic {
+       my ($self) = @_;
+       SDL::TTFSetFontStyle($$self{-font},SDL::TTF_STYLE_ITALIC());
+
+}
+
+sub underline {
+       my ($self) = @_;
+       SDL::TTFSetFontStyle($$self{-font},SDL::TTF_STYLE_UNDERLINE());
+}
+
+sub text_shaded {
+       my ($self) = @_;
+       $$self{-mode} = SDL::TEXT_SHADED();
+}
+
+sub text_solid {
+       my ($self) = @_;
+       $$self{-mode} = SDL::TEXT_SOLID();
+}
+
+sub text_blended {
+       my ($self) = @_;
+       $$self{-mode} = SDL::TEXT_BLENDED();
+}
+
+sub utf8_shaded {
+       my ($self) = @_;
+       $$self{-mode} = SDL::UTF8_SHADED();
+}
+
+sub utf8_solid {
+       my ($self) = @_;
+       $$self{-mode} = SDL::UTF8_SOLID();
+}
+
+sub utf8_blended {
+       my ($self) = @_;
+       $$self{-mode} = SDL::UTF8_BLENDED();
+}
+
+sub unicode_shaded {
+       my ($self) = @_;
+       $$self{-mode} = SDL::UNICODE_SHADED();
+}
+
+sub unicode_solid {
+       my ($self) = @_;
+       $$self{-mode} = SDL::UNICODE_SOLID();
+}
+
+sub unicode_blended {
+       my ($self) = @_;
+       $$self{-mode} = SDL::UNICODE_BLENDED();
+}
+
+die "Could not initialize True Type Fonts\n"
+       if ( SDL::TTFInit() < 0);
+
+1;
+
+__END__;
+
+=pod
+
+=head1 NAME
+
+SDL::TTFont - a SDL perl extension
+
+=head1 SYNOPSIS
+
+  $font = new TTFont -name => "Utopia.ttf", -size => 18;
+       
+=head1 DESCRIPTION
+
+L<SDL::TTFont> is a module for applying true type fonts to L<SDL::Surface>.
+
+=head1 AUTHOR
+
+David J. Goehrig
+
+=head1 SEE ALSO
+
+L<perl> L<SDL::Surface>
+
+=cut
diff --git a/lib/SDL/Timer.pm b/lib/SDL/Timer.pm
new file mode 100644 (file)
index 0000000..9f24d85
--- /dev/null
@@ -0,0 +1,112 @@
+#!/usr/bin/env perl
+#
+# Timer.pm
+#
+# Copyright (C) 2005 David J. Goehrig <dgoehrig@cpan.org>
+#
+# ------------------------------------------------------------------------------
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+# 
+# This library 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
+# Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+#
+# ------------------------------------------------------------------------------
+#
+# Please feel free to send questions, suggestions or improvements to:
+#
+#      David J. Goehrig
+#      dgoehrig@cpan.org
+#
+
+package SDL::Timer;
+
+use strict;
+use SDL;
+
+sub new {
+       my $proto = shift;
+       my $class = ref($proto) || $proto;
+       my $self = {};
+       my $func = shift;
+       my (%options) = @_;
+
+       verify(%options,qw/ -delay -times -d -t /);
+
+       die "SDL::Timer::new no delay specified\n"
+               unless ($options{-delay});
+       $$self{-delay} = $options{-delay} || $options{-d} || 0;
+       $$self{-times} = $options{-times} || $options{-t} || 0;
+       if ($$self{-times}) {
+               $$self{-routine} = sub { &$func($self); $$self{-delay} if(--$$self{-times}) };
+       } else {
+               $$self{-routine} = sub { &$func; $$self{-delay}};
+       }
+       $$self{-timer} = SDL::NewTimer($$self{-delay},$$self{-routine});
+       die "Could not create timer, ", SDL::GetError(), "\n"
+               unless ($self->{-timer});
+       bless $self,$class;
+       return $self;
+}
+
+sub DESTROY {
+       my $self = shift;
+       SDL::RemoveTimer($$self{-timer}) if ($$self{-timer});
+       $$self{-timer} = 0;
+}
+
+sub run {
+       my ($self,$delay,$times) = @_;
+       $$self{-delay} = $delay;
+       $$self{-times} = $times;
+       SDL::RemoveTimer($$self{-timer}) if ($$self{-timer});
+       $$self{-timer} = SDL::AddTimer($$self{-delay},SDL::PerlTimerCallback,$$self{-routine});
+}
+
+sub stop {
+       my ($self) = @_;
+       SDL::RemoveTimer($$self{-timer}) if ($$self{-timer});
+       $$self{-timer} = 0;
+}
+
+1;
+
+__END__;
+
+=pod
+
+
+=head1 NAME
+
+SDL::Timer - a SDL perl extension to handle timers
+
+=head1 SYNOPSIS
+
+  $timer = new SDL::Timer { print "tick"; 4000; } -delay => 4000;
+
+=head1 DESCRIPTION
+
+C<SDL::Timer> provides an abstract interface to the SDL::Timer
+callback code.  SDL::Timer::new requires a subroutine and a delay
+at which is the initial interval between the creation of the
+timer until the first call to the subroutine.  The subroutine
+must return a value which is the delay until the it is called again.
+
+=head1 AUTHOR
+
+David J. Goehrig
+
+=head1 SEE ALSO
+
+L<perl> L<SDL>
+
+=pod
diff --git a/lib/SDL/Tool/Font.pm b/lib/SDL/Tool/Font.pm
new file mode 100644 (file)
index 0000000..6cf2d27
--- /dev/null
@@ -0,0 +1,113 @@
+#!/usr/bin/env perl
+#
+# Font.pm
+#
+# Copyright (C) 2005 David J. Goehrig <dgoehrig@cpan.org>
+#
+# ------------------------------------------------------------------------------
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+# 
+# This library 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
+# Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+#
+# ------------------------------------------------------------------------------
+#
+# Please feel free to send questions, suggestions or improvements to:
+#
+#      David J. Goehrig
+#      dgoehrig@cpan.org
+#
+
+package SDL::Tool::Font;
+
+use SDL;
+use SDL::Font;
+use SDL::TTFont;
+
+sub new {
+       my $proto = shift;
+       my $class = ref($proto) || $proto;
+       $self = {};
+       my %option = @_;
+
+       verify (%option, qw/ -sfont -ttfont -size -fg -bg -foreground -background
+                               -normal -bold -italic -underline / ) if $SDL::DEBUG;
+
+       if ($option{-sfont}) {
+               $$self{-font} = new SDL::Font $option{-sfont};
+       } elsif ($option{-ttfont} || $option{-t}) {
+               $option{-size} ||= 12;
+               $$self{-font} = new SDL::TTFont 
+                                       -name => $option{-ttfont} || $option{-t},
+                                       -size => $option{-size} || $option{-s},
+                                       -fg => $option{-foreground} || $option{-fg} ,
+                                       -bg => $option{-background} || $option{-bg};
+               for (qw/ normal bold italic underline / ) {
+                       if ($option{"-$_"}) {
+                               &{"SDL::TTFont::$_"}($$self{-font});
+                       }
+               }
+       } else {
+               die "SDL::Tool::Font requires either a -sfont or -ttfont";      
+       }
+       bless $self,$class;
+       $self;
+}
+
+sub DESTROY {
+
+}
+
+sub print {
+       my ($self,$surface,$x,$y,@text) = @_;
+       die "Tool::Font::print requires a SDL::Surface\n"
+               unless ($SDL::DEBUG && $surface->isa('SDL::Surface'));
+       if ($$self{-font}->isa('SDL::Font')) {
+               $$self{-font}->use();
+               SDL::SFont::PutString( $$surface, $x, $y, join('',@text));
+       } else {
+               $$self{-font}->print($surface,$x,$y,@text);
+       }
+}
+
+1;
+
+__END__;
+
+=pod
+
+=head1 NAME
+
+SDL::Tool::Font - a perl extension
+
+=head1 DESCRIPTION
+
+L<SDL::Tool::Font> provides a unified interface for applying
+True Type and SFont fonts to various surfaces.
+
+=head1 METHODS
+
+=head2 print ( surface, x, y, text ... )
+
+C<SDL::Tool::Font::print> print the given text on the supplied surface
+with the upper left hand corner starting at the specified coordinates.
+
+=head1 AUTHOR
+
+David J. Goehrig
+
+=head1 SEE ALSO
+
+L<perl> L<SDL::Font> L<SDL::TTFont> L<SDL::Surface>
+
+=cut
diff --git a/lib/SDL/Tool/Graphic.pm b/lib/SDL/Tool/Graphic.pm
new file mode 100644 (file)
index 0000000..4e42c5a
--- /dev/null
@@ -0,0 +1,167 @@
+#!/usr/bin/env perl
+#
+# Graphic.pm
+#
+# Copyright (C) 2005 David J. Goehrig <dgoehrig@cpan.org>
+#
+# ------------------------------------------------------------------------------
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+# 
+# This library 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
+# Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+#
+# ------------------------------------------------------------------------------
+#
+# Please feel free to send questions, suggestions or improvements to:
+#
+#      David J. Goehrig
+#      dgoehrig@cpan.org
+#
+
+package SDL::Tool::Graphic;
+
+use SDL;
+use SDL::Config;
+require SDL::Surface;
+
+sub new {
+       my $proto = shift;
+       my $class = ref($proto) || $proto;
+       $self = {};
+       bless $self, $class;
+       $self;
+}
+
+
+sub DESTROY {
+       # nothing to do
+}
+
+
+sub zoom {
+       my ( $self, $surface, $zoomx, $zoomy, $smooth) = @_;
+       die "SDL::Tool::Graphic::zoom requires an SDL::Surface\n"
+               unless ( ref($surface) && $surface->isa('SDL::Surface'));
+       my $tmp = $$surface;
+       $$surface = SDL::GFXZoom($$surface, $zoomx, $zoomy, $smooth);
+       SDL::FreeSurface($tmp);
+       $surface;
+}
+
+sub rotoZoom {
+       my ( $self, $surface, $angle, $zoom, $smooth) = @_;
+       die "SDL::Tool::Graphic::rotoZoom requires an SDL::Surface\n"
+               unless ( ref($surface) && $surface->isa('SDL::Surface'));
+       my $tmp = $$surface;
+       $$surface = SDL::GFXRotoZoom($$surface, $angle, $zoom, $smooth);
+       SDL::FreeSurface($tmp);
+       $surface;
+}
+
+sub grayScale {
+       my ( $self, $surface ) = @_;
+       if($surface->isa('SDL::Surface')) {
+               $workingSurface = $$surface;
+       } else {
+               $workingSurface = $surface;
+       }
+       my $color;
+       my $width = SDL::SurfaceW($workingSurface);
+       my $height = SDL::SurfaceH($workingSurface);
+       for(my $x = 0; $x < $width; $x++){
+               for(my $y = 0; $y < $height; $y++){
+                       my $origValue = SDL::SurfacePixel($workingSurface, $x, $y);
+                       my $newValue = int(0.3*SDL::ColorR($origValue) + 0.59 * SDL::ColorG($origValue) + 0.11*SDL::ColorB($origValue));
+                       SDL::SurfacePixel($workingSurface, $x, $y, SDL::NewColor($newValue, $newValue, $newValue));
+               }
+       }
+       if($surface->isa('SDL::Surface')) {
+                       $surface = \$workingSurface;
+       } else {
+               $surface = $workingSurface;
+       }
+}
+sub invertColor {
+       my ( $self, $surface ) = @_;
+       if($surface->isa('SDL::Surface')) {
+               $workingSurface = $$surface;
+       } else {
+               $workingSurface = $surface;
+       }
+       my $width = SDL::SurfaceW($workingSurface);
+       my $height = SDL::SurfaceH($workingSurface);
+       for(my $x = 0; $x < $width; $x++){
+               for(my $y = 0; $y < $height; $y++){
+                       my $origValue = SDL::SurfacePixel($workingSurface, $x, $y);
+                       my $newValue = int(0.3*SDL::ColorR($origValue) + 0.59 * SDL::ColorG($origValue) + 0.11*SDL::ColorB($origValue));
+                       SDL::SurfacePixel($workingSurface, $x, $y, SDL::NewColor(255-SDL::ColorR($origValue), 255 - SDL::ColorG($origValue), 255 - SDL::ColorB($origValue)));
+               }
+       }
+
+       if($surface->isa('SDL::Surface')) {
+               $$surface = $workingSurface;
+       } else {
+               $surface = $workingSurface;
+       }
+}
+
+die "SDL::Tool::Graphic requires SDL_gfx support\n"
+       unless SDL::Config->has('SDL_gfx');
+
+1;
+
+__END__;
+
+=pod
+
+
+
+=head1 NAME
+
+SDL::Tool::Graphic
+
+=head1 DESCRIPTION
+
+L<SDL::Tool::Graphic> is a module for zooming and rotating L<SDL::Surface> objects.
+
+=head1 METHODS
+
+=head2 zoom ( surface, xzoom, yzoom, smooth )
+
+C<SDL::Tool::Graphic::zoom> scales a L<SDL::Surface> along the two axis independently.
+
+=head2 rotoZoom ( surface, angle, zoom, smooth )
+
+C<SDL::Tool::Graphic::rotoZoom> rotates and fixed axis zooms a L<SDL::Surface>.
+
+=head2 grayScale ( surface )
+C<SDL::Tool::Graphic::grayScale> rotates and fixed axis zooms a L<SDL::Surface>.
+
+=head2 invertColor ( surface )
+
+C<SDL::Tool::Graphic::invertColor> inverts the color of a <SDL::Surface>.
+
+
+=head1 AUTHOR
+
+Russell E. Valentine
+
+=head1 SEE ALSO
+
+L<perl> L<SDL::Surface>
+
+=cut
diff --git a/lib/SDL/Tutorial.pm b/lib/SDL/Tutorial.pm
new file mode 100644 (file)
index 0000000..6d151f7
--- /dev/null
@@ -0,0 +1,158 @@
+#!/usr/bin/env perl
+#
+# Tutorial.pm
+#
+# Copyright (C) 2005 David J. Goehrig <dgoehrig@cpan.org>
+#
+# ------------------------------------------------------------------------------
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+# 
+# This library 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
+# Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+#
+# ------------------------------------------------------------------------------
+#
+# Please feel free to send questions, suggestions or improvements to:
+#
+#      David J. Goehrig
+#      dgoehrig@cpan.org
+#
+
+package SDL::Tutorial;
+
+use strict;
+use SDL;
+use SDL::App;
+
+# change these values as necessary
+my  $title                   = 'My SDL App';
+my ($width, $height, $depth) = ( 640, 480, 16 );
+
+my $app = SDL::App->new(
+       -width  => $width,
+       -height => $height,
+       -depth  => $depth,
+       -title  => $title,
+);
+
+# your code here; remove the next line
+sleep 2;
+END_HERE
+
+1;
+
+__END__
+
+=head1 NAME
+
+SDL::Tutorial - introduction to Perl SDL
+
+=head1 SYNOPSIS
+
+       # to read this tutorial
+       $ perldoc SDL::Tutorial
+
+       # to create a bare-bones SDL app based on this tutorial
+       $ perl -MSDL::Tutorial=basic_app.pl -e 1
+
+=head1 SDL BASICS
+
+SDL, the Simple DirectMedia Layer, is a cross-platform multimedia library.
+These are the Perl 5 bindings.  You can find out more about SDL at
+L<http://www.libsdl.org/>.
+
+Creating an SDL application with Perl is easy.  You have to know a few basics,
+though.  Here's how to get up and running as quickly as possible.
+
+=head2 Surfaces
+
+All graphics in SDL live on a surface.  You'll need at least one.  That's what
+L<SDL::App> provides.
+
+Of course, before you can get a surface, you need to initialize your video
+mode.  SDL gives you several options, including whether to run in a window or
+take over the full screen, the size of the window, the bit depth of your
+colors, and whether to use hardware acceleration.  For now, we'll build
+something really simple.
+
+=head2 Initialization
+
+SDL::App makes it easy to initialize video and create a surface.  Here's how to
+ask for a windowed surface with 640x480x16 resolution:
+
+       use SDL::App;
+
+       my $app = SDL::App->new(
+               -width  => 640,
+               -height => 480,
+               -depth  => 16,
+       );
+
+You can get more creative, especially if you use the C<-title> and C<-icon>
+attributes in a windowed application.  Here's how to set the window title of
+the application to C<My SDL Program>:
+
+       use SDL::App;
+
+       my $app = SDL::App->new(
+               -height => 640,
+               -width  => 480,
+               -depth  => 16,
+               -title  => 'My SDL Program',
+       );
+
+Setting an icon is a little more involved -- you have to load an image onto a
+surface.  That's a bit more complicated, but see the C<-name> parameter to
+C<SDL::Surface->new()> if you want to skip ahead.
+
+=head2 Working With The App
+
+Since C<$app> from the code above is just an SDL surface with some extra sugar,
+it behaves much like L<SDL::Surface>.  In particular, the all-important C<blit>
+and C<update> methods work.  You'll need to create L<SDL::Rect> objects
+representing sources of graphics to draw onto the C<$app>'s surface, C<blit>
+them there, then C<update> the C<$app>.
+
+B<Note:>  "blitting" is copying a chunk of memory from one place to another.
+
+That, however, is another tutorial.
+
+=head1 SEE ALSO
+
+=over 4
+
+=item L<SDL::Tutorial::Drawing>
+
+basic drawing with rectangles
+
+=item L<SDL::Tutorial::Animation>
+
+basic rectangle animation
+
+=item L<SDL::Tutorial::Images>
+
+image loading and animation
+
+=back
+
+=head1 AUTHOR
+
+chromatic, E<lt>chromatic@wgz.orgE<gt>.  
+
+Written for and maintained by the Perl SDL project, L<http://sdl.perl.org/>.
+
+=head1 COPYRIGHT
+
+Copyright (c) 2003 - 2004, chromatic.  All rights reserved.  This module is
+distributed under the same terms as Perl itself, in the hope that it is useful
+but certainly under no guarantee.
diff --git a/lib/SDL/Tutorial/.svn/README.txt b/lib/SDL/Tutorial/.svn/README.txt
new file mode 100644 (file)
index 0000000..271a8ce
--- /dev/null
@@ -0,0 +1,2 @@
+This is a Subversion working copy administrative directory.
+Visit http://subversion.tigris.org/ for more information.
diff --git a/lib/SDL/Tutorial/.svn/dir-wcprops b/lib/SDL/Tutorial/.svn/dir-wcprops
new file mode 100644 (file)
index 0000000..6ce67f3
--- /dev/null
@@ -0,0 +1,5 @@
+K 25
+svn:wc:ra_dav:version-url
+V 36
+/sdlperl/!svn/ver/1/lib/SDL/Tutorial
+END
diff --git a/lib/SDL/Tutorial/.svn/empty-file b/lib/SDL/Tutorial/.svn/empty-file
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/lib/SDL/Tutorial/.svn/entries b/lib/SDL/Tutorial/.svn/entries
new file mode 100644 (file)
index 0000000..0bb58df
--- /dev/null
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8"?>
+<wc-entries
+   xmlns="svn:">
+<entry
+   committed-rev="1"
+   name=""
+   committed-date="2006-03-02T00:09:24.247311Z"
+   url="http://sdlperl.nexttolast.com/sdlperl/lib/SDL/Tutorial"
+   kind="dir"
+   uuid="6e26d18a-f70d-0410-a0fd-8c28a9da13a5"
+   revision="2"/>
+<entry
+   committed-rev="1"
+   name="Images.pm"
+   text-time="2006-07-08T17:51:11.000000Z"
+   committed-date="2006-03-02T00:09:24.247311Z"
+   checksum="947cdb472983352bf543cc3b94c28402"
+   kind="file"
+   prop-time="2006-07-08T17:51:10.000000Z"/>
+<entry
+   committed-rev="1"
+   name="Drawing.pm"
+   text-time="2006-07-08T17:51:11.000000Z"
+   committed-date="2006-03-02T00:09:24.247311Z"
+   checksum="7c16c8c7758e9a5d417c4393e2190e1f"
+   kind="file"
+   prop-time="2006-07-08T17:51:11.000000Z"/>
+<entry
+   committed-rev="1"
+   name="Animation.pm"
+   text-time="2006-07-08T17:51:11.000000Z"
+   committed-date="2006-03-02T00:09:24.247311Z"
+   checksum="bd141ab697587677c8225bcf307bbe80"
+   kind="file"
+   prop-time="2006-07-08T17:51:11.000000Z"/>
+</wc-entries>
diff --git a/lib/SDL/Tutorial/.svn/format b/lib/SDL/Tutorial/.svn/format
new file mode 100644 (file)
index 0000000..b8626c4
--- /dev/null
@@ -0,0 +1 @@
+4
diff --git a/lib/SDL/Tutorial/.svn/prop-base/Animation.pm.svn-base b/lib/SDL/Tutorial/.svn/prop-base/Animation.pm.svn-base
new file mode 100644 (file)
index 0000000..dce2c1d
--- /dev/null
@@ -0,0 +1 @@
+END
diff --git a/lib/SDL/Tutorial/.svn/prop-base/Drawing.pm.svn-base b/lib/SDL/Tutorial/.svn/prop-base/Drawing.pm.svn-base
new file mode 100644 (file)
index 0000000..dce2c1d
--- /dev/null
@@ -0,0 +1 @@
+END
diff --git a/lib/SDL/Tutorial/.svn/prop-base/Images.pm.svn-base b/lib/SDL/Tutorial/.svn/prop-base/Images.pm.svn-base
new file mode 100644 (file)
index 0000000..dce2c1d
--- /dev/null
@@ -0,0 +1 @@
+END
diff --git a/lib/SDL/Tutorial/.svn/props/Animation.pm.svn-work b/lib/SDL/Tutorial/.svn/props/Animation.pm.svn-work
new file mode 100644 (file)
index 0000000..dce2c1d
--- /dev/null
@@ -0,0 +1 @@
+END
diff --git a/lib/SDL/Tutorial/.svn/props/Drawing.pm.svn-work b/lib/SDL/Tutorial/.svn/props/Drawing.pm.svn-work
new file mode 100644 (file)
index 0000000..dce2c1d
--- /dev/null
@@ -0,0 +1 @@
+END
diff --git a/lib/SDL/Tutorial/.svn/props/Images.pm.svn-work b/lib/SDL/Tutorial/.svn/props/Images.pm.svn-work
new file mode 100644 (file)
index 0000000..dce2c1d
--- /dev/null
@@ -0,0 +1 @@
+END
diff --git a/lib/SDL/Tutorial/.svn/text-base/Animation.pm.svn-base b/lib/SDL/Tutorial/.svn/text-base/Animation.pm.svn-base
new file mode 100644 (file)
index 0000000..16f8c84
--- /dev/null
@@ -0,0 +1,282 @@
+#!/usr/bin/env perl
+#
+# Animation.pm
+#
+# Copyright (C) 2005 David J. Goehrig <dgoehrig@cpan.org>
+#
+# ------------------------------------------------------------------------------
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+# 
+# This library 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
+# Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+#
+# ------------------------------------------------------------------------------
+#
+# Please feel free to send questions, suggestions or improvements to:
+#
+#      David J. Goehrig
+#      dgoehrig@cpan.org
+#
+
+package SDL::Tutorial::Animation;
+
+use strict;
+use SDL;
+use SDL::App;
+use SDL::Rect;
+use SDL::Color;
+
+# change these values as necessary
+my $title                                = 'My SDL Animation';
+my ($width,      $height,      $depth)   = (  640,  480,   16 );
+my ($bg_r,       $bg_g,        $bg_b)    = ( 0x00, 0x00, 0x00 );
+my ($rect_r,     $rect_g,      $rect_b)  = ( 0x00, 0x00, 0xff ); 
+my ($rect_width, $rect_height, $rect_y)  = (  100,  100,  190 );
+
+my $app = SDL::App->new(
+       -width  => $width,
+       -height => $height,
+       -depth  => $depth,
+);
+
+my $color = SDL::Color->new(
+       -r => $rect_r,
+       -g => $rect_g,
+       -b => $rect_b,
+);
+
+my $bg_color = SDL::Color->new(
+       -r => $bg_r,
+       -g => $bg_g,
+       -b => $bg_b,
+);
+
+my $background = SDL::Rect->new(
+       -width  => $width,
+       -height => $height,
+);
+
+my $rect = create_rect();
+
+# your code here, perhaps
+for my $x (0 .. 640)
+{
+       $rect->x( $x );
+       draw_frame( $app,
+               bg   => $background, bg_color   => $bg_color,
+               rect => $rect,       rect_color => $color,
+       );
+}
+
+# remove this line
+sleep 2;
+
+# XXX - if you know why I need to create a new rect here, please tell me!
+$rect        = create_rect();
+my $old_rect = create_rect();
+
+# your code also here, perhaps
+for my $x (0 .. 640)
+{
+       $rect->x( $x );
+       draw_undraw_rect( $app,
+               rect       => $rect,  old_rect => $old_rect,
+               rect_color => $color, bg_color => $bg_color, 
+       );
+       $old_rect->x( $x );
+}
+
+# your code almost certainly follows; remove this line
+sleep 2;
+
+sub create_rect
+{
+       return SDL::Rect->new(
+               -height => $rect_height,
+               -width  => $rect_width,
+               -x      => 0,
+               -y      => $rect_y,
+       );
+}
+
+sub draw_frame
+{
+       my ($app, %args) = @_;
+
+       $app->fill(   $args{bg},   $args{bg_color}   );
+       $app->fill(   $args{rect}, $args{rect_color} );
+       $app->update( $args{bg} );
+}
+
+sub draw_undraw_rect
+{
+       my ($app, %args) = @_;
+
+       $app->fill(   $args{old_rect}, $args{bg_color}   );
+       $app->fill(   $args{rect},     $args{rect_color} );
+       $app->update( $args{old_rect} );
+       $app->update( $args{rect} );
+}
+END_HERE
+
+1;
+__END__
+
+=head1 NAME
+
+SDL::Tutorial::Animation
+
+=head1 SYNOPSIS
+
+       # to read this tutorial
+       $ perldoc SDL::Tutorial::Animation
+
+       # to create a demo animation program based on this tutorial
+       $ perl -MSDL::Tutorial::Animation=sdl_anim.pl -e 1
+
+=head1 ANIMATING A RECTANGLE
+
+Now that you can display a rectangle on the screen, the next step is to animate
+that rectangle.  As with movies, there's no actual motion.  Computer animations are just very very fast slideshows.  The hard work is creating nearly identical images in every slide (or frame, in graphics terms).
+
+Okay, it's not that difficult.
+
+There is one small difficulty to address, however.  Once you blit one surface
+onto another, the destination is changed permanently.  There's no concept of
+layers here unless you write it yourself.  If you fail to take this into
+account (and just about everyone does at first), you'll end up with blurry
+graphics moving around on the screen.
+
+There are two approaches to solve this problem, redrawing the screen on every
+frame and saving and restoring the background for every object drawn.
+
+=head2 Redrawing the Screen
+
+Since you have to draw the screen in the right order once to start with it's
+pretty easy to make this into a loop and redraw things in the right order for
+every frame.  Given a L<SDL::App> object C<$app>, a L<SDL::Rect> C<$rect>, and
+a L<SDL::Color> C<$color>, you only have to create a new SDL::Rect C<$bg>,
+representing the whole of the background surface and a new SDL::Color
+C<$bg_color>, representing the background color.  You can write a
+C<draw_frame()> function as follows:
+
+       sub draw_frame
+       {
+               my ($app, %args) = @_;
+
+               $app->fill( $args{ bg }, $args{ bg_color } );
+               $app->fill( $args{rect}, $args{rect_color} );
+               $app->update( $args{bg} );
+       }
+
+Since you can change the C<x> and C<y> coordinates of a rect with the C<x()>
+and C<y()> methods, you can move a rectangle across the screen with a loop like
+this:
+
+       for my $x (0 .. 640)
+       {
+               $rect->x( $x );
+               draw_frame( $app,
+                       bg   => $bg,   bg_color   => $bg_color,
+                       rect => $rect, rect_color => $color,
+               );
+       }
+
+If C<$rect>'s starting y position is 190 and its height and width are 100, the
+rectangle (er, square) will move across the middle of the screen.
+
+Provided you can keep track of the proper order in which to redraw rectangles
+and provided you don't need the optimal speed necessary (since blitting every
+object takes more work than just blitting the portions you need), this works
+quite well.
+
+=head2 Undrawing the Updated Rectangle
+
+If you need more speed or want to make a different complexity tradeoff, you can
+take a snapshot of the destination rectangle I<before> you blit onto it.  That
+way, when you need to redraw, you can blit the old snapshot back before
+blitting to the new position.
+
+B<Note:>  I have no idea how this will work in the face of alpha blending,
+which, admittedly, I haven't even mentioned yet.  If you don't know what this
+means, forget it.  If you do know what this means and know why I'm waving my
+hands here, feel free to explain what should and what does happen and why.  :)
+
+With this technique, the frame-drawing subroutine has to be a little more
+complicated.  Instead of the background rect, it needs a rect for the previous
+position.  It also needs to do two updates (or must perform some scary math to
+figure out the rectangle of the correct size to C<update()>.  No thanks!).
+
+       sub undraw_redraw_rect
+       {
+               my ($app, %args) = @_;
+
+               $app->fill(   $args{old_rect}, $args{bg_color}   );
+               $app->fill(   $args{rect],     $args{rect_color} );
+               $app->update( $args{old_rect}, $args{rect}       );
+       }
+
+We'll need to create a new SDL::Rect, C<$old_rect>, that is a duplicate of
+C<$rect>, at the same position at first.  You should already know how to do
+this.
+
+As before, the loop to call C<undraw_redraw_rect()> would look something like:
+
+       for my $x (0 .. 640)
+       {
+               $rect->x( $x );
+
+               undraw_redraw_rect( $app,
+                       rect       => $rect,  old_rect => $old_rect,
+                       rect_color => $color, bg_color => $bgcolor,
+               );
+
+               $old_rect->x( $x );
+       }
+
+If you run this code, you'll probably notice that it's tremendously faster than
+the previous version.  It may be too fast, where the alternate technique was
+just fast enough.  There are a couple of good ways to set a fixed animation
+speed regardless of the speed of the processor and graphics hardware (provided
+they're good enough, which is increasingly often the case), and we'll get to
+them soon.
+
+=head1 SEE ALSO
+
+=over 4
+
+=item L<SDL::Tutorial::Drawing>
+
+basic drawing with SDL Perl
+
+=item L<SDL::Tutorial::Images>
+
+animating images
+
+=back
+
+=head1 AUTHOR
+
+chromatic, E<lt>chromatic@wgz.orgE<gt>
+
+Written for and maintained by the Perl SDL project, L<http://sdl.perl.org/>.
+
+=head1 BUGS
+
+No known bugs.
+
+=head1 COPYRIGHT
+
+Copyright (c) 2003 - 2004, chromatic.  All rights reserved.  This module is
+distributed under the same terms as Perl itself, in the hope that it is useful
+but certainly under no guarantee.
diff --git a/lib/SDL/Tutorial/.svn/text-base/Drawing.pm.svn-base b/lib/SDL/Tutorial/.svn/text-base/Drawing.pm.svn-base
new file mode 100644 (file)
index 0000000..c071306
--- /dev/null
@@ -0,0 +1,221 @@
+#!/usr/bin/env perl
+#
+# Drawing.pm
+#
+# Copyright (C) 2005 David J. Goehrig <dgoehrig@cpan.org>
+#
+# ------------------------------------------------------------------------------
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+# 
+# This library 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
+# Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+#
+# ------------------------------------------------------------------------------
+#
+# Please feel free to send questions, suggestions or improvements to:
+#
+#      David J. Goehrig
+#      dgoehrig@cpan.org
+#
+
+package SDL::Tutorial:Drawing;
+
+use strict;
+use SDL;
+use SDL::App;
+use SDL::Rect;
+use SDL::Color;
+
+# change these values as necessary
+my $title                      = 'My SDL Rectangle-Drawing App';
+my ($width, $height, $depth)   = ( 640,   480, 16   );
+my ($red, $green, $blue)       = ( 0x00, 0x00, 0xff );
+my ($rect_width, $rect_height) = ( 100,   100       );
+my ($rect_x,     $rect_y)      = ( 270,   190       );
+
+my $app = SDL::App->new(
+       -width  => $width,
+       -height => $height,
+       -depth  => $depth,
+);
+
+my $rect = SDL::Rect->new(
+       -height => $rect_height,
+       -width  => $rect_width,
+       -x      => $rect_x,
+       -y      => $rect_y,
+);
+
+my $color = SDL::Color->new(
+       -r => $red,
+       -g => $green,
+       -b => $blue,
+);
+
+$app->fill( $rect, $color );
+$app->update( $rect );
+
+# your code here; remove the next line
+sleep 2;
+END_HERE
+
+1;
+__END__
+
+=head1 NAME
+
+SDL::Tutorial::Drawing - basic drawing with Perl SDL
+
+=head1 SYNOPSIS
+
+       # to read this tutorial
+       $ perldoc SDL::Tutorial::Drawing
+
+       # to create a bare-bones SDL app based on this tutorial
+       $ perl -MSDL::Tutorial::Drawing=basic_app.pl -e 1
+
+=head1 DRAWING BASICS
+
+As explained in L<SDL::Tutorial>, all graphics in SDL live on a surface.
+Consequently, all drawing operations operate on a surface, whether drawing on
+it directly or blitting from another surface.  The important modules for this
+exercise are L<SDL::Rect> and L<SDL::Color>.
+
+As usual, we'll start by creating a L<SDL::App> object:
+
+       use SDL::App;
+
+       my $app = SDL::App->new(
+               -width  => 640,
+               -height => 480,
+               -depth  => 16,
+       );
+
+=head2 Creating a New Surface with SDL::Rect
+
+A SDL::Rect object is an SDL surface, just as an SDL::App object is.  As you'd
+expect, you need to specify the size of this object as you create it.  You can
+also specify its coordinates relative to the origin.
+
+B<Note:>  The origin, or coordinates 0, 0, is at the upper left of the screen.
+
+Here's how to create a square 100 pixels by 100 pixels centered in the window:
+
+       use SDL::Rect;
+
+       my $rect = SDL::Rect->new(
+               -height => 100,
+               -width  => 100,
+               -x      => 270,
+               -y      => 390,
+       );
+
+This won't actually display anything yet, it just creates a rectangular
+surface.  Of course, even if it did display, you wouldn't see anything, as it
+defaults to the background color just as C<$app> does.  That's where SDL::Color
+comes in.
+
+=head2 A Bit About Color
+
+SDL::Color objects represent colors in the SDL world.  These colors are
+additive, so they're represented as mixtures of Red, Green, and Blue
+components.  The color values are traditionally given in hexadecimal numbers.
+If you're exceedingly clever or really like the math, you can figure out which
+values are possible by comparing them to your current bit depth.  SDL does a
+lot of autoconversion for you, though, so unless extreme speed or pedantic
+detail are important, you can get by without worrying too much.
+
+Creating a color object is reasonably easy.  As the color scheme is additive,
+the lower the number for a color component, the less of that color.  The higher
+the number, the higher the component.  Experimentation may be your best bet, as
+these aren't exactly the primary colors you learned as a child (since that's a
+subtractive scheme).
+
+Let's create a nice, full blue:
+
+       use SDL::Color;
+
+       my $color = SDL::Color->new(
+               -r => 0x00,
+               -g => 0x00,
+               -b => 0xff,
+       );
+
+B<Note:>  The numbers are in hex; if you've never used hex notation in Perl
+before, the leading C<0x> just signifies that the rest of the number is in
+base-16.  In this case, the blue component has a value of 255 and the red and
+green are both zero.
+
+=head2 Filling Part of a Surface
+
+The C<fill()> method of SDL::Surface fills a given rectangular section of the
+surface with the given color.  Since we already have a rect and a color, it's
+as easy as saying:
+
+       $app->fill( $rect, $color );
+
+That's a little subtle; it turns out that the SDL::Rect created earlier
+represents a destination within the surface of the main window.  It's not
+attached to anything else.  We could re-use it later, as necessary.
+
+=head2 Updating the Surface
+
+If you try the code so far, you'll notice that it still doesn't display.  Don't
+fret.  All that's left to do is to call C<update()> on the appropriate surface.
+As usual, C<update()> takes a Rect to control which part of the surface to
+update.  In this case, that's:
+
+       $app->update( $rect );
+
+This may seem like a useless extra step, but it can be quite handy.  While
+drawing to the screen directly seems like the fastest way to go, the
+intricacies of working with hardware with the appropriate timings is tricky.
+
+=head2 Working With The App
+
+You can, of course, create all sorts of Rects with different sizes and
+coordinates as well as varied colors and experiment to your heart's content
+drawing them to the window.  It's more fun when you can animate them smoothly,
+though.
+
+That, as usual, is another tutorial.
+
+=head1 SEE ALSO
+
+=over 4
+
+=item L<SDL::Tutorial>
+
+the basics of Perl SDL.
+
+=item L<SDL::Tutorial::Animation>
+
+basic animation techniques
+
+=back
+
+=head1 AUTHOR
+
+chromatic, E<lt>chromatic@wgz.orgE<gt>
+
+Written for and maintained by the Perl SDL project, L<http://sdl.perl.org/>.
+
+=head1 BUGS
+
+No known bugs.
+
+=head1 COPYRIGHT
+
+Copyright (c) 2003 - 2004, chromatic.  All rights reserved.  This module is
+distributed under the same terms as Perl itself, in the hope that it is useful
+but certainly under no guarantee.
diff --git a/lib/SDL/Tutorial/.svn/text-base/Images.pm.svn-base b/lib/SDL/Tutorial/.svn/text-base/Images.pm.svn-base
new file mode 100644 (file)
index 0000000..007b632
--- /dev/null
@@ -0,0 +1,492 @@
+#!/usr/bin/env perl
+#
+# Images.pm
+#
+# Copyright (C) 2005 David J. Goehrig <dgoehrig@cpan.org>
+#
+# ------------------------------------------------------------------------------
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+# 
+# This library 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
+# Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+#
+# ------------------------------------------------------------------------------
+#
+# Please feel free to send questions, suggestions or improvements to:
+#
+#      David J. Goehrig
+#      dgoehrig@cpan.org
+#
+
+package SDL::Tutorial::Images;
+
+use strict;
+use SDL;
+use warnings;
+
+my %images;
+BEGIN
+{
+       %images = (
+       left => [qw(
+               47 49 46 38 37 61 10 00 10 00 E7 00 00 00 00 00 01 01 01 02 02 02 03 03
+               03 04 04 04 05 05 05 06 06 06 07 07 07 08 08 08 09 09 09 0A 0A 0A 0B 0B
+               0B 0C 0C 0C 0D 0D 0D 0E 0E 0E 0F 0F 0F 10 10 10 11 11 11 12 12 12 13 13
+               13 14 14 14 15 15 15 16 16 16 17 17 17 18 18 18 19 19 19 1A 1A 1A 1B 1B
+               1B 1C 1C 1C 1D 1D 1D 1E 1E 1E 1F 1F 1F 20 20 20 21 21 21 22 22 22 23 23
+               23 24 24 24 25 25 25 26 26 26 27 27 27 28 28 28 29 29 29 2A 2A 2A 2B 2B
+               2B 2C 2C 2C 2D 2D 2D 2E 2E 2E 2F 2F 2F 30 30 30 31 31 31 32 32 32 33 33
+               33 34 34 34 35 35 35 36 36 36 37 37 37 38 38 38 39 39 39 3A 3A 3A 3B 3B
+               3B 3C 3C 3C 3D 3D 3D 3E 3E 3E 3F 3F 3F 40 40 40 41 41 41 42 42 42 43 43
+               43 44 44 44 45 45 45 46 46 46 47 47 47 48 48 48 49 49 49 4A 4A 4A 4B 4B
+               4B 4C 4C 4C 4D 4D 4D 4E 4E 4E 4F 4F 4F 50 50 50 51 51 51 52 52 52 53 53
+               53 54 54 54 55 55 55 56 56 56 57 57 57 58 58 58 59 59 59 5A 5A 5A 5B 5B
+               5B 5C 5C 5C 5D 5D 5D 5E 5E 5E 5F 5F 5F 60 60 60 61 61 61 62 62 62 63 63
+               63 64 64 64 65 65 65 66 66 66 67 67 67 68 68 68 69 69 69 6A 6A 6A 6B 6B
+               6B 6C 6C 6C 6D 6D 6D 6E 6E 6E 6F 6F 6F 70 70 70 71 71 71 72 72 72 73 73
+               73 74 74 74 75 75 75 76 76 76 77 77 77 78 78 78 79 79 79 7A 7A 7A 7B 7B
+               7B 7C 7C 7C 7D 7D 7D 7E 7E 7E 7F 7F 7F 80 80 80 81 81 81 82 82 82 83 83
+               83 84 84 84 85 85 85 86 86 86 87 87 87 88 88 88 89 89 89 8A 8A 8A 8B 8B
+               8B 8C 8C 8C 8D 8D 8D 8E 8E 8E 8F 8F 8F 90 90 90 91 91 91 92 92 92 93 93
+               93 94 94 94 95 95 95 96 96 96 97 97 97 98 98 98 99 99 99 9A 9A 9A 9B 9B
+               9B 9C 9C 9C 9D 9D 9D 9E 9E 9E 9F 9F 9F A0 A0 A0 A1 A1 A1 A2 A2 A2 A3 A3
+               A3 A4 A4 A4 A5 A5 A5 A6 A6 A6 A7 A7 A7 A8 A8 A8 A9 A9 A9 AA AA AA AB AB
+               AB AC AC AC AD AD AD AE AE AE AF AF AF B0 B0 B0 B1 B1 B1 B2 B2 B2 B3 B3
+               B3 B4 B4 B4 B5 B5 B5 B6 B6 B6 B7 B7 B7 B8 B8 B8 B9 B9 B9 BA BA BA BB BB
+               BB BC BC BC BD BD BD BE BE BE BF BF BF C0 C0 C0 C1 C1 C1 C2 C2 C2 C3 C3
+               C3 C4 C4 C4 C5 C5 C5 C6 C6 C6 C7 C7 C7 C8 C8 C8 C9 C9 C9 CA CA CA CB CB
+               CB CC CC CC CD CD CD CE CE CE CF CF CF D0 D0 D0 D1 D1 D1 D2 D2 D2 D3 D3
+               D3 D4 D4 D4 D5 D5 D5 D6 D6 D6 D7 D7 D7 D8 D8 D8 D9 D9 D9 DA DA DA DB DB
+               DB DC DC DC DD DD DD DE DE DE DF DF DF E0 E0 E0 E1 E1 E1 E2 E2 E2 E3 E3
+               E3 E4 E4 E4 E5 E5 E5 E6 E6 E6 E7 E7 E7 E8 E8 E8 E9 E9 E9 EA EA EA EB EB
+               EB EC EC EC ED ED ED EE EE EE EF EF EF F0 F0 F0 F1 F1 F1 F2 F2 F2 F3 F3
+               F3 F4 F4 F4 F5 F5 F5 F6 F6 F6 F7 F7 F7 F8 F8 F8 F9 F9 F9 FA FA FA FB FB
+               FB FC FC FC FD FD FD FE FE FE FF FF FF 2C 00 00 00 00 10 00 10 00 00 08
+               36 00 FF 09 1C 48 B0 A0 C1 83 08 13 22 04 C0 10 80 C2 7F 0C 05 46 4C E8
+               70 60 C5 85 15 27 52 6C A8 30 E3 45 8C 0D 39 76 FC 38 F2 A1 44 91 1B 4F
+               82 24 88 D2 64 C1 80 00 3B
+       )],
+       center => [qw(
+               47 49 46 38 37 61 10 00 10 00 E7 00 00 00 00 00 01 01 01 02 02 02 03 03
+               03 04 04 04 05 05 05 06 06 06 07 07 07 08 08 08 09 09 09 0A 0A 0A 0B 0B
+               0B 0C 0C 0C 0D 0D 0D 0E 0E 0E 0F 0F 0F 10 10 10 11 11 11 12 12 12 13 13
+               13 14 14 14 15 15 15 16 16 16 17 17 17 18 18 18 19 19 19 1A 1A 1A 1B 1B
+               1B 1C 1C 1C 1D 1D 1D 1E 1E 1E 1F 1F 1F 20 20 20 21 21 21 22 22 22 23 23
+               23 24 24 24 25 25 25 26 26 26 27 27 27 28 28 28 29 29 29 2A 2A 2A 2B 2B
+               2B 2C 2C 2C 2D 2D 2D 2E 2E 2E 2F 2F 2F 30 30 30 31 31 31 32 32 32 33 33
+               33 34 34 34 35 35 35 36 36 36 37 37 37 38 38 38 39 39 39 3A 3A 3A 3B 3B
+               3B 3C 3C 3C 3D 3D 3D 3E 3E 3E 3F 3F 3F 40 40 40 41 41 41 42 42 42 43 43
+               43 44 44 44 45 45 45 46 46 46 47 47 47 48 48 48 49 49 49 4A 4A 4A 4B 4B
+               4B 4C 4C 4C 4D 4D 4D 4E 4E 4E 4F 4F 4F 50 50 50 51 51 51 52 52 52 53 53
+               53 54 54 54 55 55 55 56 56 56 57 57 57 58 58 58 59 59 59 5A 5A 5A 5B 5B
+               5B 5C 5C 5C 5D 5D 5D 5E 5E 5E 5F 5F 5F 60 60 60 61 61 61 62 62 62 63 63
+               63 64 64 64 65 65 65 66 66 66 67 67 67 68 68 68 69 69 69 6A 6A 6A 6B 6B
+               6B 6C 6C 6C 6D 6D 6D 6E 6E 6E 6F 6F 6F 70 70 70 71 71 71 72 72 72 73 73
+               73 74 74 74 75 75 75 76 76 76 77 77 77 78 78 78 79 79 79 7A 7A 7A 7B 7B
+               7B 7C 7C 7C 7D 7D 7D 7E 7E 7E 7F 7F 7F 80 80 80 81 81 81 82 82 82 83 83
+               83 84 84 84 85 85 85 86 86 86 87 87 87 88 88 88 89 89 89 8A 8A 8A 8B 8B
+               8B 8C 8C 8C 8D 8D 8D 8E 8E 8E 8F 8F 8F 90 90 90 91 91 91 92 92 92 93 93
+               93 94 94 94 95 95 95 96 96 96 97 97 97 98 98 98 99 99 99 9A 9A 9A 9B 9B
+               9B 9C 9C 9C 9D 9D 9D 9E 9E 9E 9F 9F 9F A0 A0 A0 A1 A1 A1 A2 A2 A2 A3 A3
+               A3 A4 A4 A4 A5 A5 A5 A6 A6 A6 A7 A7 A7 A8 A8 A8 A9 A9 A9 AA AA AA AB AB
+               AB AC AC AC AD AD AD AE AE AE AF AF AF B0 B0 B0 B1 B1 B1 B2 B2 B2 B3 B3
+               B3 B4 B4 B4 B5 B5 B5 B6 B6 B6 B7 B7 B7 B8 B8 B8 B9 B9 B9 BA BA BA BB BB
+               BB BC BC BC BD BD BD BE BE BE BF BF BF C0 C0 C0 C1 C1 C1 C2 C2 C2 C3 C3
+               C3 C4 C4 C4 C5 C5 C5 C6 C6 C6 C7 C7 C7 C8 C8 C8 C9 C9 C9 CA CA CA CB CB
+               CB CC CC CC CD CD CD CE CE CE CF CF CF D0 D0 D0 D1 D1 D1 D2 D2 D2 D3 D3
+               D3 D4 D4 D4 D5 D5 D5 D6 D6 D6 D7 D7 D7 D8 D8 D8 D9 D9 D9 DA DA DA DB DB
+               DB DC DC DC DD DD DD DE DE DE DF DF DF E0 E0 E0 E1 E1 E1 E2 E2 E2 E3 E3
+               E3 E4 E4 E4 E5 E5 E5 E6 E6 E6 E7 E7 E7 E8 E8 E8 E9 E9 E9 EA EA EA EB EB
+               EB EC EC EC ED ED ED EE EE EE EF EF EF F0 F0 F0 F1 F1 F1 F2 F2 F2 F3 F3
+               F3 F4 F4 F4 F5 F5 F5 F6 F6 F6 F7 F7 F7 F8 F8 F8 F9 F9 F9 FA FA FA FB FB
+               FB FC FC FC FD FD FD FE FE FE FF FF FF 2C 00 00 00 00 10 00 10 00 00 08
+               36 00 FF 09 1C 48 B0 A0 C1 83 08 13 26 04 C0 10 80 C2 7F 0C 05 46 5C 48
+               D0 E1 42 8B 13 2F 66 54 B8 F1 60 C3 8F 16 2F 3E 1C D8 11 E1 C7 87 13 4B
+               4A DC D8 70 E4 C1 80 00 3B
+       )],
+       right => [qw(
+               47 49 46 38 37 61 10 00 10 00 E7 00 00 00 00 00 01 01 01 02 02 02 03 03
+               03 04 04 04 05 05 05 06 06 06 07 07 07 08 08 08 09 09 09 0A 0A 0A 0B 0B
+               0B 0C 0C 0C 0D 0D 0D 0E 0E 0E 0F 0F 0F 10 10 10 11 11 11 12 12 12 13 13
+               13 14 14 14 15 15 15 16 16 16 17 17 17 18 18 18 19 19 19 1A 1A 1A 1B 1B
+               1B 1C 1C 1C 1D 1D 1D 1E 1E 1E 1F 1F 1F 20 20 20 21 21 21 22 22 22 23 23
+               23 24 24 24 25 25 25 26 26 26 27 27 27 28 28 28 29 29 29 2A 2A 2A 2B 2B
+               2B 2C 2C 2C 2D 2D 2D 2E 2E 2E 2F 2F 2F 30 30 30 31 31 31 32 32 32 33 33
+               33 34 34 34 35 35 35 36 36 36 37 37 37 38 38 38 39 39 39 3A 3A 3A 3B 3B
+               3B 3C 3C 3C 3D 3D 3D 3E 3E 3E 3F 3F 3F 40 40 40 41 41 41 42 42 42 43 43
+               43 44 44 44 45 45 45 46 46 46 47 47 47 48 48 48 49 49 49 4A 4A 4A 4B 4B
+               4B 4C 4C 4C 4D 4D 4D 4E 4E 4E 4F 4F 4F 50 50 50 51 51 51 52 52 52 53 53
+               53 54 54 54 55 55 55 56 56 56 57 57 57 58 58 58 59 59 59 5A 5A 5A 5B 5B
+               5B 5C 5C 5C 5D 5D 5D 5E 5E 5E 5F 5F 5F 60 60 60 61 61 61 62 62 62 63 63
+               63 64 64 64 65 65 65 66 66 66 67 67 67 68 68 68 69 69 69 6A 6A 6A 6B 6B
+               6B 6C 6C 6C 6D 6D 6D 6E 6E 6E 6F 6F 6F 70 70 70 71 71 71 72 72 72 73 73
+               73 74 74 74 75 75 75 76 76 76 77 77 77 78 78 78 79 79 79 7A 7A 7A 7B 7B
+               7B 7C 7C 7C 7D 7D 7D 7E 7E 7E 7F 7F 7F 80 80 80 81 81 81 82 82 82 83 83
+               83 84 84 84 85 85 85 86 86 86 87 87 87 88 88 88 89 89 89 8A 8A 8A 8B 8B
+               8B 8C 8C 8C 8D 8D 8D 8E 8E 8E 8F 8F 8F 90 90 90 91 91 91 92 92 92 93 93
+               93 94 94 94 95 95 95 96 96 96 97 97 97 98 98 98 99 99 99 9A 9A 9A 9B 9B
+               9B 9C 9C 9C 9D 9D 9D 9E 9E 9E 9F 9F 9F A0 A0 A0 A1 A1 A1 A2 A2 A2 A3 A3
+               A3 A4 A4 A4 A5 A5 A5 A6 A6 A6 A7 A7 A7 A8 A8 A8 A9 A9 A9 AA AA AA AB AB
+               AB AC AC AC AD AD AD AE AE AE AF AF AF B0 B0 B0 B1 B1 B1 B2 B2 B2 B3 B3
+               B3 B4 B4 B4 B5 B5 B5 B6 B6 B6 B7 B7 B7 B8 B8 B8 B9 B9 B9 BA BA BA BB BB
+               BB BC BC BC BD BD BD BE BE BE BF BF BF C0 C0 C0 C1 C1 C1 C2 C2 C2 C3 C3
+               C3 C4 C4 C4 C5 C5 C5 C6 C6 C6 C7 C7 C7 C8 C8 C8 C9 C9 C9 CA CA CA CB CB
+               CB CC CC CC CD CD CD CE CE CE CF CF CF D0 D0 D0 D1 D1 D1 D2 D2 D2 D3 D3
+               D3 D4 D4 D4 D5 D5 D5 D6 D6 D6 D7 D7 D7 D8 D8 D8 D9 D9 D9 DA DA DA DB DB
+               DB DC DC DC DD DD DD DE DE DE DF DF DF E0 E0 E0 E1 E1 E1 E2 E2 E2 E3 E3
+               E3 E4 E4 E4 E5 E5 E5 E6 E6 E6 E7 E7 E7 E8 E8 E8 E9 E9 E9 EA EA EA EB EB
+               EB EC EC EC ED ED ED EE EE EE EF EF EF F0 F0 F0 F1 F1 F1 F2 F2 F2 F3 F3
+               F3 F4 F4 F4 F5 F5 F5 F6 F6 F6 F7 F7 F7 F8 F8 F8 F9 F9 F9 FA FA FA FB FB
+               FB FC FC FC FD FD FD FE FE FE FF FF FF 2C 00 00 00 00 10 00 10 00 00 08
+               3A 00 FF 09 1C 48 B0 A0 C1 83 08 13 2A 04 C0 10 80 C2 7F 0C 05 46 4C E8
+               70 60 45 84 13 27 52 6C F8 50 62 C5 8B 05 1B 8A 04 79 50 E3 43 93 1B 51
+               1A CC 48 D2 A2 49 8E 1D 0B 06 04 00 3B
+       )],
+);
+}
+
+use Pod::ToDemo sub
+{
+       (undef, my $filename) = @_;
+       (my $imagebase        = $filename) =~ s/\.\w+$//;
+       my @img_files         = map { $imagebase . "_$_.gif" }
+               qw( left center right );
+       my $demo_source       = <<'END_HERE';
+package Walker;
+
+sub new
+{
+       my ($class, @images) = @_;
+       my @frames           = map { SDL::Surface->new( -name => $_ ) } @images;
+       my $frame_rect       = SDL::Rect->new(
+               -height => $frames[0]->height(),
+               -width  => $frames[0]->width(),
+               -x      => 0,
+               -y      => 0,
+       );
+       my $self             = 
+       {
+               frames      => \@frames,
+               frame_rect  => $frame_rect,
+       };
+       bless $self, $class;
+}
+
+sub frames
+{
+       my $self        = shift;
+       $self->{frames} = shift if @_;
+       $self->{frames};
+}
+
+sub frame_rect
+{
+       my $self            = shift;
+       $self->{frame_rect} = shift if @_;
+       $self->{frame_rect};
+}
+
+sub next_frame
+{
+       my $self   = shift;
+       my $frames = $self->frames();
+       my $frame  = shift @$frames;
+
+       push @$frames, $frame;
+       $self->frames( $frames );
+
+       return $frame;
+}
+
+package main;
+
+use strict;
+
+use SDL;
+use SDL::App;
+use SDL::Surface;
+use SDL::Color;
+
+# change these values as necessary
+my $title                                = 'My SDL Animation';
+my ($width,      $height,      $depth)   = (  640,  480,   16 );
+my ($bg_r,       $bg_g,        $bg_b)    = ( 0xff, 0xff, 0xff );
+my ($start_x,    $end_x)                 = (   20,  600       );
+my $sleep_msec                           = 0.05;
+
+my $app = SDL::App->new(
+       -width  => $width,
+       -height => $height,
+       -depth  => $depth,
+);
+
+my $bg_color = SDL::Color->new(
+       -r => $bg_r,
+       -g => $bg_g,
+       -b => $bg_b,
+);
+
+my $background = SDL::Rect->new(
+       -width  => $width,
+       -height => $height,
+);
+
+my $pos = SDL::Rect->new(
+       -width  => 16,
+       -height => 16,
+       -x      => 0,
+       -y      => 240,
+);
+
+my $walker = Walker->new(qw(
+END_HERE
+
+$demo_source .= join( ' ', @img_files ) . "));" . <<'END_HERE';
+
+for my $x ( $start_x .. $end_x )
+{
+       draw_background( $app, $background, $bg_color );
+       $pos->x( $x );
+       draw_walker( $walker, $app, $pos );
+       $app->update( $background );
+       select( undef, undef, undef, $sleep_msec );
+}
+
+# you'll want to remove this
+sleep 2;
+
+sub draw_background
+{
+       my ($app, $background, $bg_color) = @_;
+       $app->fill( $background, $bg_color );
+}
+
+sub draw_walker
+{
+       my ($walker, $app, $pos) = @_;
+       my $frame                = $walker->next_frame();
+       my $frame_rect           = $walker->frame_rect();
+       $frame->blit( $frame_rect, $app, $pos );
+}
+END_HERE
+
+       Pod::ToDemo::write_demo( $filename, "#$^X\n$demo_source" );
+       write_files( $imagebase );
+};
+               
+sub write_files
+{
+       my $imagebase = shift;
+
+       for my $image (qw( left center right ))
+       {
+               my $file = join('', map { chr( hex( $_ ) ) } @{ $images{ $image } });
+               write_file( $imagebase . "_$image" . '.gif', $file );
+       }
+}
+
+sub write_file
+{
+    my ($file, $contents) = @_;
+
+       die "Cowardly refusing to overwrite '$file'\n" if -e $file;
+       open my $out, '>', $file or die "Cannot write '$file': $!\n";
+       binmode $out;
+       print $out $contents;
+}
+
+__END__
+
+=head1 NAME
+
+SDL::Tutorial::Images
+
+=head1 SYNOPSIS
+
+       # to read this tutorial
+       $ perldoc SDL::Tutorial::Images
+
+       # to create a demo animation program based on this tutorial
+       $ perl -MSDL::Tutorial::Images=sdl_images.pl -e 1
+
+=head1 ANIMATING IMAGES
+
+Since you're already familiar with the concepts behind animation, it's time to
+learn how to work with images.  As usual, the important point is that computer animation is just I<simulating> motion by painting several slightly different frames to the screen every second.
+
+There are two ways to vary an image on screen.  One is to change its
+coordinates so it's at a slightly different position.  This is very easy to do;
+it's just like animating a rectangle.  The other way is to change the image
+itself so it's slightly different.  This is a little more difficult, as you'll
+need to draw the alternate image beforehand somehow.
+
+=head2 Loading Images
+
+As usual, start with an L<SDL::App> object representing the image window.  Then
+preload the image file.  This is easy; just pass the C<name> parameter to the
+L<SDL::Surface> constructor:
+
+       use SDL::Surface;
+
+       my $frame = SDL::Surface->new( -name => 'frame1.png' );
+
+B<Note:> you'll need to have compiled SDL Perl (and probably SDL) to support
+JPEG and PNG files for this to work.
+
+That's it; now you have an SDL::Surface object containing the image.  You can
+use the C<height()>, C<width()>, and C<bpp()> methods to retrieve its height,
+width, and bits per pixel, if you need them.
+
+=head2 Displaying Images
+
+Drawing an image onto the screen requires blitting it from one surface to
+another.  (Remember, "blitting" means copying bits in memory.)  The C<blit()>
+method of SDL::Surface objects comes in handy.  Its arguments are a little odd,
+though.  Assuming C<$app> is the SDL::App object, as usual:
+
+       use SDL::Rect;
+
+       my $frame_rect = SDL::Rect->new(
+               -height => $frame->height(),
+               -width  => $frame->width(),
+               -x      => 0,
+               -y      => 0,
+       );
+
+       my $dest_rect  = SDL::Rect->new(
+               -height => $frame->height(),
+               -width  => $frame->width(),
+               -x      => 0,
+               -y      => 0,
+       );
+
+       $frame->blit( $frame_rect, $app, $dest_rect );
+       $app->update( $dest_rect );
+
+Here we have two L<SDL::Rect> objects which represent rectangular regions of a
+Surface.  C<$frame_rect> represents the entire area of C<$frame>, while
+C<$dest_rect> represents the area of the main window in which to blit the
+frame.  This may be clearer with more descriptive variable names:
+
+       $source_surface->blit(
+               $area_of_source_to_blit,
+               $destination_surface,
+               $destination_area
+       );
+
+As usual, call C<update()> on C<$app> to see the change.
+
+Requiring the source and destination Rect objects may seem tedious in this
+simple example, but it's highly useful for copying only part of surface to part
+of another.  For example, animating this image is a matter of changing the C<x>
+and C<y> coordinates of C<$dest_rect>:
+
+       for my $x ( 1 .. 100 )
+       {
+               $dest_rect->x( $x );
+               $frame->blit( $frame_rect, $app, $dest_rect );
+               $app->update( $dest_rect );
+       }
+
+Of course, you'll have to redraw all or part of the screen to avoid artifacts,
+as discussed in the previous tutorial.
+
+=head2 Multi-Image Animation
+
+That covers moving a single image around the screen.  What if you want
+something more?  For example, what if you want to animate a stick figure
+walking?
+
+You'll need several frames, just as in a flip-book.  Each frame should be slightly different than the one before it.  It's probably handy to encapsulate all of this in a C<Walker> class:
+
+       package Walker;
+
+       use SDL::Surface;
+
+       sub new
+       {
+               my ($class, @images) = @_;
+               my $self = [ map { SDL::Surface->new( -name => $_ ) } @images ];
+
+               bless $self, $class;
+       }
+
+       sub next_frame
+       {
+               my $self  = shift;
+               my $frame = shift @$self;
+
+               push @$self, $frame;
+               return $frame;
+       }
+
+To use this class, instantiate an object:
+
+       my $walker = Walker->new( 'frame1.png', 'frame2.png', 'frame3.png' );
+
+Then call C<next_frame()> within the loop:
+
+       for my $x ( 1 .. 100 )
+       {
+               my $frame = $walker->next_frame();
+
+               $dest_rect->x( $x );
+               $frame->blit( $frame_rect, $app, $dest_rect );
+               $app->update( $dest_rect );
+       }
+
+Again, the rest of the frame drawing is missing from this example so as not to
+distract from this technique.  You'll probably want to abstract the undrawing
+and redrawing into a separate subroutine so you don't have to worry about it
+every time.
+
+It'd be easy to make C<next_frame()> much smarter, selecting an image
+appropriate to the direction of travel, using a bored animation when the
+character is no longer moving, or adding other characteristics to the
+character.  As you can see, the hard part of this technique is generating the
+images beforehand.  That can add up to a tremendous amount of art and that's
+one reason for the popularity of 3D models... but that's another tutorial much
+further down the road.
+
+More importantly, it's time to discuss how to make these animations run more
+smoothly.  More on that next time.
+
+=head1 SEE ALSO
+
+=over 4
+
+=item L<SDL::Tutorial>
+
+basic SDL tutorial
+
+=item L<SDL::Tutorial::Animation>
+
+non-image animation
+
+=back
+
+=head1 AUTHOR
+
+chromatic, E<lt>chromatic@wgz.orgE<gt>
+
+Written for and maintained by the Perl SDL project, L<http://sdl.perl.org/>.
+
+=head1 BUGS
+
+No known bugs.
+
+=head1 COPYRIGHT
+
+Copyright (c) 2004, chromatic.  All rights reserved.  This module is
+distributed under the same terms as Perl itself, in the hope that it is useful
+but certainly under no guarantee.
diff --git a/lib/SDL/Tutorial/.svn/wcprops/Animation.pm.svn-work b/lib/SDL/Tutorial/.svn/wcprops/Animation.pm.svn-work
new file mode 100644 (file)
index 0000000..44644f2
--- /dev/null
@@ -0,0 +1,5 @@
+K 25
+svn:wc:ra_dav:version-url
+V 49
+/sdlperl/!svn/ver/1/lib/SDL/Tutorial/Animation.pm
+END
diff --git a/lib/SDL/Tutorial/.svn/wcprops/Drawing.pm.svn-work b/lib/SDL/Tutorial/.svn/wcprops/Drawing.pm.svn-work
new file mode 100644 (file)
index 0000000..87ceb50
--- /dev/null
@@ -0,0 +1,5 @@
+K 25
+svn:wc:ra_dav:version-url
+V 47
+/sdlperl/!svn/ver/1/lib/SDL/Tutorial/Drawing.pm
+END
diff --git a/lib/SDL/Tutorial/.svn/wcprops/Images.pm.svn-work b/lib/SDL/Tutorial/.svn/wcprops/Images.pm.svn-work
new file mode 100644 (file)
index 0000000..285afe8
--- /dev/null
@@ -0,0 +1,5 @@
+K 25
+svn:wc:ra_dav:version-url
+V 46
+/sdlperl/!svn/ver/1/lib/SDL/Tutorial/Images.pm
+END
diff --git a/lib/SDL/Tutorial/Animation.pm b/lib/SDL/Tutorial/Animation.pm
new file mode 100644 (file)
index 0000000..16f8c84
--- /dev/null
@@ -0,0 +1,282 @@
+#!/usr/bin/env perl
+#
+# Animation.pm
+#
+# Copyright (C) 2005 David J. Goehrig <dgoehrig@cpan.org>
+#
+# ------------------------------------------------------------------------------
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+# 
+# This library 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
+# Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+#
+# ------------------------------------------------------------------------------
+#
+# Please feel free to send questions, suggestions or improvements to:
+#
+#      David J. Goehrig
+#      dgoehrig@cpan.org
+#
+
+package SDL::Tutorial::Animation;
+
+use strict;
+use SDL;
+use SDL::App;
+use SDL::Rect;
+use SDL::Color;
+
+# change these values as necessary
+my $title                                = 'My SDL Animation';
+my ($width,      $height,      $depth)   = (  640,  480,   16 );
+my ($bg_r,       $bg_g,        $bg_b)    = ( 0x00, 0x00, 0x00 );
+my ($rect_r,     $rect_g,      $rect_b)  = ( 0x00, 0x00, 0xff ); 
+my ($rect_width, $rect_height, $rect_y)  = (  100,  100,  190 );
+
+my $app = SDL::App->new(
+       -width  => $width,
+       -height => $height,
+       -depth  => $depth,
+);
+
+my $color = SDL::Color->new(
+       -r => $rect_r,
+       -g => $rect_g,
+       -b => $rect_b,
+);
+
+my $bg_color = SDL::Color->new(
+       -r => $bg_r,
+       -g => $bg_g,
+       -b => $bg_b,
+);
+
+my $background = SDL::Rect->new(
+       -width  => $width,
+       -height => $height,
+);
+
+my $rect = create_rect();
+
+# your code here, perhaps
+for my $x (0 .. 640)
+{
+       $rect->x( $x );
+       draw_frame( $app,
+               bg   => $background, bg_color   => $bg_color,
+               rect => $rect,       rect_color => $color,
+       );
+}
+
+# remove this line
+sleep 2;
+
+# XXX - if you know why I need to create a new rect here, please tell me!
+$rect        = create_rect();
+my $old_rect = create_rect();
+
+# your code also here, perhaps
+for my $x (0 .. 640)
+{
+       $rect->x( $x );
+       draw_undraw_rect( $app,
+               rect       => $rect,  old_rect => $old_rect,
+               rect_color => $color, bg_color => $bg_color, 
+       );
+       $old_rect->x( $x );
+}
+
+# your code almost certainly follows; remove this line
+sleep 2;
+
+sub create_rect
+{
+       return SDL::Rect->new(
+               -height => $rect_height,
+               -width  => $rect_width,
+               -x      => 0,
+               -y      => $rect_y,
+       );
+}
+
+sub draw_frame
+{
+       my ($app, %args) = @_;
+
+       $app->fill(   $args{bg},   $args{bg_color}   );
+       $app->fill(   $args{rect}, $args{rect_color} );
+       $app->update( $args{bg} );
+}
+
+sub draw_undraw_rect
+{
+       my ($app, %args) = @_;
+
+       $app->fill(   $args{old_rect}, $args{bg_color}   );
+       $app->fill(   $args{rect},     $args{rect_color} );
+       $app->update( $args{old_rect} );
+       $app->update( $args{rect} );
+}
+END_HERE
+
+1;
+__END__
+
+=head1 NAME
+
+SDL::Tutorial::Animation
+
+=head1 SYNOPSIS
+
+       # to read this tutorial
+       $ perldoc SDL::Tutorial::Animation
+
+       # to create a demo animation program based on this tutorial
+       $ perl -MSDL::Tutorial::Animation=sdl_anim.pl -e 1
+
+=head1 ANIMATING A RECTANGLE
+
+Now that you can display a rectangle on the screen, the next step is to animate
+that rectangle.  As with movies, there's no actual motion.  Computer animations are just very very fast slideshows.  The hard work is creating nearly identical images in every slide (or frame, in graphics terms).
+
+Okay, it's not that difficult.
+
+There is one small difficulty to address, however.  Once you blit one surface
+onto another, the destination is changed permanently.  There's no concept of
+layers here unless you write it yourself.  If you fail to take this into
+account (and just about everyone does at first), you'll end up with blurry
+graphics moving around on the screen.
+
+There are two approaches to solve this problem, redrawing the screen on every
+frame and saving and restoring the background for every object drawn.
+
+=head2 Redrawing the Screen
+
+Since you have to draw the screen in the right order once to start with it's
+pretty easy to make this into a loop and redraw things in the right order for
+every frame.  Given a L<SDL::App> object C<$app>, a L<SDL::Rect> C<$rect>, and
+a L<SDL::Color> C<$color>, you only have to create a new SDL::Rect C<$bg>,
+representing the whole of the background surface and a new SDL::Color
+C<$bg_color>, representing the background color.  You can write a
+C<draw_frame()> function as follows:
+
+       sub draw_frame
+       {
+               my ($app, %args) = @_;
+
+               $app->fill( $args{ bg }, $args{ bg_color } );
+               $app->fill( $args{rect}, $args{rect_color} );
+               $app->update( $args{bg} );
+       }
+
+Since you can change the C<x> and C<y> coordinates of a rect with the C<x()>
+and C<y()> methods, you can move a rectangle across the screen with a loop like
+this:
+
+       for my $x (0 .. 640)
+       {
+               $rect->x( $x );
+               draw_frame( $app,
+                       bg   => $bg,   bg_color   => $bg_color,
+                       rect => $rect, rect_color => $color,
+               );
+       }
+
+If C<$rect>'s starting y position is 190 and its height and width are 100, the
+rectangle (er, square) will move across the middle of the screen.
+
+Provided you can keep track of the proper order in which to redraw rectangles
+and provided you don't need the optimal speed necessary (since blitting every
+object takes more work than just blitting the portions you need), this works
+quite well.
+
+=head2 Undrawing the Updated Rectangle
+
+If you need more speed or want to make a different complexity tradeoff, you can
+take a snapshot of the destination rectangle I<before> you blit onto it.  That
+way, when you need to redraw, you can blit the old snapshot back before
+blitting to the new position.
+
+B<Note:>  I have no idea how this will work in the face of alpha blending,
+which, admittedly, I haven't even mentioned yet.  If you don't know what this
+means, forget it.  If you do know what this means and know why I'm waving my
+hands here, feel free to explain what should and what does happen and why.  :)
+
+With this technique, the frame-drawing subroutine has to be a little more
+complicated.  Instead of the background rect, it needs a rect for the previous
+position.  It also needs to do two updates (or must perform some scary math to
+figure out the rectangle of the correct size to C<update()>.  No thanks!).
+
+       sub undraw_redraw_rect
+       {
+               my ($app, %args) = @_;
+
+               $app->fill(   $args{old_rect}, $args{bg_color}   );
+               $app->fill(   $args{rect],     $args{rect_color} );
+               $app->update( $args{old_rect}, $args{rect}       );
+       }
+
+We'll need to create a new SDL::Rect, C<$old_rect>, that is a duplicate of
+C<$rect>, at the same position at first.  You should already know how to do
+this.
+
+As before, the loop to call C<undraw_redraw_rect()> would look something like:
+
+       for my $x (0 .. 640)
+       {
+               $rect->x( $x );
+
+               undraw_redraw_rect( $app,
+                       rect       => $rect,  old_rect => $old_rect,
+                       rect_color => $color, bg_color => $bgcolor,
+               );
+
+               $old_rect->x( $x );
+       }
+
+If you run this code, you'll probably notice that it's tremendously faster than
+the previous version.  It may be too fast, where the alternate technique was
+just fast enough.  There are a couple of good ways to set a fixed animation
+speed regardless of the speed of the processor and graphics hardware (provided
+they're good enough, which is increasingly often the case), and we'll get to
+them soon.
+
+=head1 SEE ALSO
+
+=over 4
+
+=item L<SDL::Tutorial::Drawing>
+
+basic drawing with SDL Perl
+
+=item L<SDL::Tutorial::Images>
+
+animating images
+
+=back
+
+=head1 AUTHOR
+
+chromatic, E<lt>chromatic@wgz.orgE<gt>
+
+Written for and maintained by the Perl SDL project, L<http://sdl.perl.org/>.
+
+=head1 BUGS
+
+No known bugs.
+
+=head1 COPYRIGHT
+
+Copyright (c) 2003 - 2004, chromatic.  All rights reserved.  This module is
+distributed under the same terms as Perl itself, in the hope that it is useful
+but certainly under no guarantee.
diff --git a/lib/SDL/Tutorial/Drawing.pm b/lib/SDL/Tutorial/Drawing.pm
new file mode 100644 (file)
index 0000000..c071306
--- /dev/null
@@ -0,0 +1,221 @@
+#!/usr/bin/env perl
+#
+# Drawing.pm
+#
+# Copyright (C) 2005 David J. Goehrig <dgoehrig@cpan.org>
+#
+# ------------------------------------------------------------------------------
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+# 
+# This library 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
+# Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+#
+# ------------------------------------------------------------------------------
+#
+# Please feel free to send questions, suggestions or improvements to:
+#
+#      David J. Goehrig
+#      dgoehrig@cpan.org
+#
+
+package SDL::Tutorial:Drawing;
+
+use strict;
+use SDL;
+use SDL::App;
+use SDL::Rect;
+use SDL::Color;
+
+# change these values as necessary
+my $title                      = 'My SDL Rectangle-Drawing App';
+my ($width, $height, $depth)   = ( 640,   480, 16   );
+my ($red, $green, $blue)       = ( 0x00, 0x00, 0xff );
+my ($rect_width, $rect_height) = ( 100,   100       );
+my ($rect_x,     $rect_y)      = ( 270,   190       );
+
+my $app = SDL::App->new(
+       -width  => $width,
+       -height => $height,
+       -depth  => $depth,
+);
+
+my $rect = SDL::Rect->new(
+       -height => $rect_height,
+       -width  => $rect_width,
+       -x      => $rect_x,
+       -y      => $rect_y,
+);
+
+my $color = SDL::Color->new(
+       -r => $red,
+       -g => $green,
+       -b => $blue,
+);
+
+$app->fill( $rect, $color );
+$app->update( $rect );
+
+# your code here; remove the next line
+sleep 2;
+END_HERE
+
+1;
+__END__
+
+=head1 NAME
+
+SDL::Tutorial::Drawing - basic drawing with Perl SDL
+
+=head1 SYNOPSIS
+
+       # to read this tutorial
+       $ perldoc SDL::Tutorial::Drawing
+
+       # to create a bare-bones SDL app based on this tutorial
+       $ perl -MSDL::Tutorial::Drawing=basic_app.pl -e 1
+
+=head1 DRAWING BASICS
+
+As explained in L<SDL::Tutorial>, all graphics in SDL live on a surface.
+Consequently, all drawing operations operate on a surface, whether drawing on
+it directly or blitting from another surface.  The important modules for this
+exercise are L<SDL::Rect> and L<SDL::Color>.
+
+As usual, we'll start by creating a L<SDL::App> object:
+
+       use SDL::App;
+
+       my $app = SDL::App->new(
+               -width  => 640,
+               -height => 480,
+               -depth  => 16,
+       );
+
+=head2 Creating a New Surface with SDL::Rect
+
+A SDL::Rect object is an SDL surface, just as an SDL::App object is.  As you'd
+expect, you need to specify the size of this object as you create it.  You can
+also specify its coordinates relative to the origin.
+
+B<Note:>  The origin, or coordinates 0, 0, is at the upper left of the screen.
+
+Here's how to create a square 100 pixels by 100 pixels centered in the window:
+
+       use SDL::Rect;
+
+       my $rect = SDL::Rect->new(
+               -height => 100,
+               -width  => 100,
+               -x      => 270,
+               -y      => 390,
+       );
+
+This won't actually display anything yet, it just creates a rectangular
+surface.  Of course, even if it did display, you wouldn't see anything, as it
+defaults to the background color just as C<$app> does.  That's where SDL::Color
+comes in.
+
+=head2 A Bit About Color
+
+SDL::Color objects represent colors in the SDL world.  These colors are
+additive, so they're represented as mixtures of Red, Green, and Blue
+components.  The color values are traditionally given in hexadecimal numbers.
+If you're exceedingly clever or really like the math, you can figure out which
+values are possible by comparing them to your current bit depth.  SDL does a
+lot of autoconversion for you, though, so unless extreme speed or pedantic
+detail are important, you can get by without worrying too much.
+
+Creating a color object is reasonably easy.  As the color scheme is additive,
+the lower the number for a color component, the less of that color.  The higher
+the number, the higher the component.  Experimentation may be your best bet, as
+these aren't exactly the primary colors you learned as a child (since that's a
+subtractive scheme).
+
+Let's create a nice, full blue:
+
+       use SDL::Color;
+
+       my $color = SDL::Color->new(
+               -r => 0x00,
+               -g => 0x00,
+               -b => 0xff,
+       );
+
+B<Note:>  The numbers are in hex; if you've never used hex notation in Perl
+before, the leading C<0x> just signifies that the rest of the number is in
+base-16.  In this case, the blue component has a value of 255 and the red and
+green are both zero.
+
+=head2 Filling Part of a Surface
+
+The C<fill()> method of SDL::Surface fills a given rectangular section of the
+surface with the given color.  Since we already have a rect and a color, it's
+as easy as saying:
+
+       $app->fill( $rect, $color );
+
+That's a little subtle; it turns out that the SDL::Rect created earlier
+represents a destination within the surface of the main window.  It's not
+attached to anything else.  We could re-use it later, as necessary.
+
+=head2 Updating the Surface
+
+If you try the code so far, you'll notice that it still doesn't display.  Don't
+fret.  All that's left to do is to call C<update()> on the appropriate surface.
+As usual, C<update()> takes a Rect to control which part of the surface to
+update.  In this case, that's:
+
+       $app->update( $rect );
+
+This may seem like a useless extra step, but it can be quite handy.  While
+drawing to the screen directly seems like the fastest way to go, the
+intricacies of working with hardware with the appropriate timings is tricky.
+
+=head2 Working With The App
+
+You can, of course, create all sorts of Rects with different sizes and
+coordinates as well as varied colors and experiment to your heart's content
+drawing them to the window.  It's more fun when you can animate them smoothly,
+though.
+
+That, as usual, is another tutorial.
+
+=head1 SEE ALSO
+
+=over 4
+
+=item L<SDL::Tutorial>
+
+the basics of Perl SDL.
+
+=item L<SDL::Tutorial::Animation>
+
+basic animation techniques
+
+=back
+
+=head1 AUTHOR
+
+chromatic, E<lt>chromatic@wgz.orgE<gt>
+
+Written for and maintained by the Perl SDL project, L<http://sdl.perl.org/>.
+
+=head1 BUGS
+
+No known bugs.
+
+=head1 COPYRIGHT
+
+Copyright (c) 2003 - 2004, chromatic.  All rights reserved.  This module is
+distributed under the same terms as Perl itself, in the hope that it is useful
+but certainly under no guarantee.
diff --git a/lib/SDL/Tutorial/Images.pm b/lib/SDL/Tutorial/Images.pm
new file mode 100644 (file)
index 0000000..007b632
--- /dev/null
@@ -0,0 +1,492 @@
+#!/usr/bin/env perl
+#
+# Images.pm
+#
+# Copyright (C) 2005 David J. Goehrig <dgoehrig@cpan.org>
+#
+# ------------------------------------------------------------------------------
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+# 
+# This library 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
+# Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+#
+# ------------------------------------------------------------------------------
+#
+# Please feel free to send questions, suggestions or improvements to:
+#
+#      David J. Goehrig
+#      dgoehrig@cpan.org
+#
+
+package SDL::Tutorial::Images;
+
+use strict;
+use SDL;
+use warnings;
+
+my %images;
+BEGIN
+{
+       %images = (
+       left => [qw(
+               47 49 46 38 37 61 10 00 10 00 E7 00 00 00 00 00 01 01 01 02 02 02 03 03
+               03 04 04 04 05 05 05 06 06 06 07 07 07 08 08 08 09 09 09 0A 0A 0A 0B 0B
+               0B 0C 0C 0C 0D 0D 0D 0E 0E 0E 0F 0F 0F 10 10 10 11 11 11 12 12 12 13 13
+               13 14 14 14 15 15 15 16 16 16 17 17 17 18 18 18 19 19 19 1A 1A 1A 1B 1B
+               1B 1C 1C 1C 1D 1D 1D 1E 1E 1E 1F 1F 1F 20 20 20 21 21 21 22 22 22 23 23
+               23 24 24 24 25 25 25 26 26 26 27 27 27 28 28 28 29 29 29 2A 2A 2A 2B 2B
+               2B 2C 2C 2C 2D 2D 2D 2E 2E 2E 2F 2F 2F 30 30 30 31 31 31 32 32 32 33 33
+               33 34 34 34 35 35 35 36 36 36 37 37 37 38 38 38 39 39 39 3A 3A 3A 3B 3B
+               3B 3C 3C 3C 3D 3D 3D 3E 3E 3E 3F 3F 3F 40 40 40 41 41 41 42 42 42 43 43
+               43 44 44 44 45 45 45 46 46 46 47 47 47 48 48 48 49 49 49 4A 4A 4A 4B 4B
+               4B 4C 4C 4C 4D 4D 4D 4E 4E 4E 4F 4F 4F 50 50 50 51 51 51 52 52 52 53 53
+               53 54 54 54 55 55 55 56 56 56 57 57 57 58 58 58 59 59 59 5A 5A 5A 5B 5B
+               5B 5C 5C 5C 5D 5D 5D 5E 5E 5E 5F 5F 5F 60 60 60 61 61 61 62 62 62 63 63
+               63 64 64 64 65 65 65 66 66 66 67 67 67 68 68 68 69 69 69 6A 6A 6A 6B 6B
+               6B 6C 6C 6C 6D 6D 6D 6E 6E 6E 6F 6F 6F 70 70 70 71 71 71 72 72 72 73 73
+               73 74 74 74 75 75 75 76 76 76 77 77 77 78 78 78 79 79 79 7A 7A 7A 7B 7B
+               7B 7C 7C 7C 7D 7D 7D 7E 7E 7E 7F 7F 7F 80 80 80 81 81 81 82 82 82 83 83
+               83 84 84 84 85 85 85 86 86 86 87 87 87 88 88 88 89 89 89 8A 8A 8A 8B 8B
+               8B 8C 8C 8C 8D 8D 8D 8E 8E 8E 8F 8F 8F 90 90 90 91 91 91 92 92 92 93 93
+               93 94 94 94 95 95 95 96 96 96 97 97 97 98 98 98 99 99 99 9A 9A 9A 9B 9B
+               9B 9C 9C 9C 9D 9D 9D 9E 9E 9E 9F 9F 9F A0 A0 A0 A1 A1 A1 A2 A2 A2 A3 A3
+               A3 A4 A4 A4 A5 A5 A5 A6 A6 A6 A7 A7 A7 A8 A8 A8 A9 A9 A9 AA AA AA AB AB
+               AB AC AC AC AD AD AD AE AE AE AF AF AF B0 B0 B0 B1 B1 B1 B2 B2 B2 B3 B3
+               B3 B4 B4 B4 B5 B5 B5 B6 B6 B6 B7 B7 B7 B8 B8 B8 B9 B9 B9 BA BA BA BB BB
+               BB BC BC BC BD BD BD BE BE BE BF BF BF C0 C0 C0 C1 C1 C1 C2 C2 C2 C3 C3
+               C3 C4 C4 C4 C5 C5 C5 C6 C6 C6 C7 C7 C7 C8 C8 C8 C9 C9 C9 CA CA CA CB CB
+               CB CC CC CC CD CD CD CE CE CE CF CF CF D0 D0 D0 D1 D1 D1 D2 D2 D2 D3 D3
+               D3 D4 D4 D4 D5 D5 D5 D6 D6 D6 D7 D7 D7 D8 D8 D8 D9 D9 D9 DA DA DA DB DB
+               DB DC DC DC DD DD DD DE DE DE DF DF DF E0 E0 E0 E1 E1 E1 E2 E2 E2 E3 E3
+               E3 E4 E4 E4 E5 E5 E5 E6 E6 E6 E7 E7 E7 E8 E8 E8 E9 E9 E9 EA EA EA EB EB
+               EB EC EC EC ED ED ED EE EE EE EF EF EF F0 F0 F0 F1 F1 F1 F2 F2 F2 F3 F3
+               F3 F4 F4 F4 F5 F5 F5 F6 F6 F6 F7 F7 F7 F8 F8 F8 F9 F9 F9 FA FA FA FB FB
+               FB FC FC FC FD FD FD FE FE FE FF FF FF 2C 00 00 00 00 10 00 10 00 00 08
+               36 00 FF 09 1C 48 B0 A0 C1 83 08 13 22 04 C0 10 80 C2 7F 0C 05 46 4C E8
+               70 60 C5 85 15 27 52 6C A8 30 E3 45 8C 0D 39 76 FC 38 F2 A1 44 91 1B 4F
+               82 24 88 D2 64 C1 80 00 3B
+       )],
+       center => [qw(
+               47 49 46 38 37 61 10 00 10 00 E7 00 00 00 00 00 01 01 01 02 02 02 03 03
+               03 04 04 04 05 05 05 06 06 06 07 07 07 08 08 08 09 09 09 0A 0A 0A 0B 0B
+               0B 0C 0C 0C 0D 0D 0D 0E 0E 0E 0F 0F 0F 10 10 10 11 11 11 12 12 12 13 13
+               13 14 14 14 15 15 15 16 16 16 17 17 17 18 18 18 19 19 19 1A 1A 1A 1B 1B
+               1B 1C 1C 1C 1D 1D 1D 1E 1E 1E 1F 1F 1F 20 20 20 21 21 21 22 22 22 23 23
+               23 24 24 24 25 25 25 26 26 26 27 27 27 28 28 28 29 29 29 2A 2A 2A 2B 2B
+               2B 2C 2C 2C 2D 2D 2D 2E 2E 2E 2F 2F 2F 30 30 30 31 31 31 32 32 32 33 33
+               33 34 34 34 35 35 35 36 36 36 37 37 37 38 38 38 39 39 39 3A 3A 3A 3B 3B
+               3B 3C 3C 3C 3D 3D 3D 3E 3E 3E 3F 3F 3F 40 40 40 41 41 41 42 42 42 43 43
+               43 44 44 44 45 45 45 46 46 46 47 47 47 48 48 48 49 49 49 4A 4A 4A 4B 4B
+               4B 4C 4C 4C 4D 4D 4D 4E 4E 4E 4F 4F 4F 50 50 50 51 51 51 52 52 52 53 53
+               53 54 54 54 55 55 55 56 56 56 57 57 57 58 58 58 59 59 59 5A 5A 5A 5B 5B
+               5B 5C 5C 5C 5D 5D 5D 5E 5E 5E 5F 5F 5F 60 60 60 61 61 61 62 62 62 63 63
+               63 64 64 64 65 65 65 66 66 66 67 67 67 68 68 68 69 69 69 6A 6A 6A 6B 6B
+               6B 6C 6C 6C 6D 6D 6D 6E 6E 6E 6F 6F 6F 70 70 70 71 71 71 72 72 72 73 73
+               73 74 74 74 75 75 75 76 76 76 77 77 77 78 78 78 79 79 79 7A 7A 7A 7B 7B
+               7B 7C 7C 7C 7D 7D 7D 7E 7E 7E 7F 7F 7F 80 80 80 81 81 81 82 82 82 83 83
+               83 84 84 84 85 85 85 86 86 86 87 87 87 88 88 88 89 89 89 8A 8A 8A 8B 8B
+               8B 8C 8C 8C 8D 8D 8D 8E 8E 8E 8F 8F 8F 90 90 90 91 91 91 92 92 92 93 93
+               93 94 94 94 95 95 95 96 96 96 97 97 97 98 98 98 99 99 99 9A 9A 9A 9B 9B
+               9B 9C 9C 9C 9D 9D 9D 9E 9E 9E 9F 9F 9F A0 A0 A0 A1 A1 A1 A2 A2 A2 A3 A3
+               A3 A4 A4 A4 A5 A5 A5 A6 A6 A6 A7 A7 A7 A8 A8 A8 A9 A9 A9 AA AA AA AB AB
+               AB AC AC AC AD AD AD AE AE AE AF AF AF B0 B0 B0 B1 B1 B1 B2 B2 B2 B3 B3
+               B3 B4 B4 B4 B5 B5 B5 B6 B6 B6 B7 B7 B7 B8 B8 B8 B9 B9 B9 BA BA BA BB BB
+               BB BC BC BC BD BD BD BE BE BE BF BF BF C0 C0 C0 C1 C1 C1 C2 C2 C2 C3 C3
+               C3 C4 C4 C4 C5 C5 C5 C6 C6 C6 C7 C7 C7 C8 C8 C8 C9 C9 C9 CA CA CA CB CB
+               CB CC CC CC CD CD CD CE CE CE CF CF CF D0 D0 D0 D1 D1 D1 D2 D2 D2 D3 D3
+               D3 D4 D4 D4 D5 D5 D5 D6 D6 D6 D7 D7 D7 D8 D8 D8 D9 D9 D9 DA DA DA DB DB
+               DB DC DC DC DD DD DD DE DE DE DF DF DF E0 E0 E0 E1 E1 E1 E2 E2 E2 E3 E3
+               E3 E4 E4 E4 E5 E5 E5 E6 E6 E6 E7 E7 E7 E8 E8 E8 E9 E9 E9 EA EA EA EB EB
+               EB EC EC EC ED ED ED EE EE EE EF EF EF F0 F0 F0 F1 F1 F1 F2 F2 F2 F3 F3
+               F3 F4 F4 F4 F5 F5 F5 F6 F6 F6 F7 F7 F7 F8 F8 F8 F9 F9 F9 FA FA FA FB FB
+               FB FC FC FC FD FD FD FE FE FE FF FF FF 2C 00 00 00 00 10 00 10 00 00 08
+               36 00 FF 09 1C 48 B0 A0 C1 83 08 13 26 04 C0 10 80 C2 7F 0C 05 46 5C 48
+               D0 E1 42 8B 13 2F 66 54 B8 F1 60 C3 8F 16 2F 3E 1C D8 11 E1 C7 87 13 4B
+               4A DC D8 70 E4 C1 80 00 3B
+       )],
+       right => [qw(
+               47 49 46 38 37 61 10 00 10 00 E7 00 00 00 00 00 01 01 01 02 02 02 03 03
+               03 04 04 04 05 05 05 06 06 06 07 07 07 08 08 08 09 09 09 0A 0A 0A 0B 0B
+               0B 0C 0C 0C 0D 0D 0D 0E 0E 0E 0F 0F 0F 10 10 10 11 11 11 12 12 12 13 13
+               13 14 14 14 15 15 15 16 16 16 17 17 17 18 18 18 19 19 19 1A 1A 1A 1B 1B
+               1B 1C 1C 1C 1D 1D 1D 1E 1E 1E 1F 1F 1F 20 20 20 21 21 21 22 22 22 23 23
+               23 24 24 24 25 25 25 26 26 26 27 27 27 28 28 28 29 29 29 2A 2A 2A 2B 2B
+               2B 2C 2C 2C 2D 2D 2D 2E 2E 2E 2F 2F 2F 30 30 30 31 31 31 32 32 32 33 33
+               33 34 34 34 35 35 35 36 36 36 37 37 37 38 38 38 39 39 39 3A 3A 3A 3B 3B
+               3B 3C 3C 3C 3D 3D 3D 3E 3E 3E 3F 3F 3F 40 40 40 41 41 41 42 42 42 43 43
+               43 44 44 44 45 45 45 46 46 46 47 47 47 48 48 48 49 49 49 4A 4A 4A 4B 4B
+               4B 4C 4C 4C 4D 4D 4D 4E 4E 4E 4F 4F 4F 50 50 50 51 51 51 52 52 52 53 53
+               53 54 54 54 55 55 55 56 56 56 57 57 57 58 58 58 59 59 59 5A 5A 5A 5B 5B
+               5B 5C 5C 5C 5D 5D 5D 5E 5E 5E 5F 5F 5F 60 60 60 61 61 61 62 62 62 63 63
+               63 64 64 64 65 65 65 66 66 66 67 67 67 68 68 68 69 69 69 6A 6A 6A 6B 6B
+               6B 6C 6C 6C 6D 6D 6D 6E 6E 6E 6F 6F 6F 70 70 70 71 71 71 72 72 72 73 73
+               73 74 74 74 75 75 75 76 76 76 77 77 77 78 78 78 79 79 79 7A 7A 7A 7B 7B
+               7B 7C 7C 7C 7D 7D 7D 7E 7E 7E 7F 7F 7F 80 80 80 81 81 81 82 82 82 83 83
+               83 84 84 84 85 85 85 86 86 86 87 87 87 88 88 88 89 89 89 8A 8A 8A 8B 8B
+               8B 8C 8C 8C 8D 8D 8D 8E 8E 8E 8F 8F 8F 90 90 90 91 91 91 92 92 92 93 93
+               93 94 94 94 95 95 95 96 96 96 97 97 97 98 98 98 99 99 99 9A 9A 9A 9B 9B
+               9B 9C 9C 9C 9D 9D 9D 9E 9E 9E 9F 9F 9F A0 A0 A0 A1 A1 A1 A2 A2 A2 A3 A3
+               A3 A4 A4 A4 A5 A5 A5 A6 A6 A6 A7 A7 A7 A8 A8 A8 A9 A9 A9 AA AA AA AB AB
+               AB AC AC AC AD AD AD AE AE AE AF AF AF B0 B0 B0 B1 B1 B1 B2 B2 B2 B3 B3
+               B3 B4 B4 B4 B5 B5 B5 B6 B6 B6 B7 B7 B7 B8 B8 B8 B9 B9 B9 BA BA BA BB BB
+               BB BC BC BC BD BD BD BE BE BE BF BF BF C0 C0 C0 C1 C1 C1 C2 C2 C2 C3 C3
+               C3 C4 C4 C4 C5 C5 C5 C6 C6 C6 C7 C7 C7 C8 C8 C8 C9 C9 C9 CA CA CA CB CB
+               CB CC CC CC CD CD CD CE CE CE CF CF CF D0 D0 D0 D1 D1 D1 D2 D2 D2 D3 D3
+               D3 D4 D4 D4 D5 D5 D5 D6 D6 D6 D7 D7 D7 D8 D8 D8 D9 D9 D9 DA DA DA DB DB
+               DB DC DC DC DD DD DD DE DE DE DF DF DF E0 E0 E0 E1 E1 E1 E2 E2 E2 E3 E3
+               E3 E4 E4 E4 E5 E5 E5 E6 E6 E6 E7 E7 E7 E8 E8 E8 E9 E9 E9 EA EA EA EB EB
+               EB EC EC EC ED ED ED EE EE EE EF EF EF F0 F0 F0 F1 F1 F1 F2 F2 F2 F3 F3
+               F3 F4 F4 F4 F5 F5 F5 F6 F6 F6 F7 F7 F7 F8 F8 F8 F9 F9 F9 FA FA FA FB FB
+               FB FC FC FC FD FD FD FE FE FE FF FF FF 2C 00 00 00 00 10 00 10 00 00 08
+               3A 00 FF 09 1C 48 B0 A0 C1 83 08 13 2A 04 C0 10 80 C2 7F 0C 05 46 4C E8
+               70 60 45 84 13 27 52 6C F8 50 62 C5 8B 05 1B 8A 04 79 50 E3 43 93 1B 51
+               1A CC 48 D2 A2 49 8E 1D 0B 06 04 00 3B
+       )],
+);
+}
+
+use Pod::ToDemo sub
+{
+       (undef, my $filename) = @_;
+       (my $imagebase        = $filename) =~ s/\.\w+$//;
+       my @img_files         = map { $imagebase . "_$_.gif" }
+               qw( left center right );
+       my $demo_source       = <<'END_HERE';
+package Walker;
+
+sub new
+{
+       my ($class, @images) = @_;
+       my @frames           = map { SDL::Surface->new( -name => $_ ) } @images;
+       my $frame_rect       = SDL::Rect->new(
+               -height => $frames[0]->height(),
+               -width  => $frames[0]->width(),
+               -x      => 0,
+               -y      => 0,
+       );
+       my $self             = 
+       {
+               frames      => \@frames,
+               frame_rect  => $frame_rect,
+       };
+       bless $self, $class;
+}
+
+sub frames
+{
+       my $self        = shift;
+       $self->{frames} = shift if @_;
+       $self->{frames};
+}
+
+sub frame_rect
+{
+       my $self            = shift;
+       $self->{frame_rect} = shift if @_;
+       $self->{frame_rect};
+}
+
+sub next_frame
+{
+       my $self   = shift;
+       my $frames = $self->frames();
+       my $frame  = shift @$frames;
+
+       push @$frames, $frame;
+       $self->frames( $frames );
+
+       return $frame;
+}
+
+package main;
+
+use strict;
+
+use SDL;
+use SDL::App;
+use SDL::Surface;
+use SDL::Color;
+
+# change these values as necessary
+my $title                                = 'My SDL Animation';
+my ($width,      $height,      $depth)   = (  640,  480,   16 );
+my ($bg_r,       $bg_g,        $bg_b)    = ( 0xff, 0xff, 0xff );
+my ($start_x,    $end_x)                 = (   20,  600       );
+my $sleep_msec                           = 0.05;
+
+my $app = SDL::App->new(
+       -width  => $width,
+       -height => $height,
+       -depth  => $depth,
+);
+
+my $bg_color = SDL::Color->new(
+       -r => $bg_r,
+       -g => $bg_g,
+       -b => $bg_b,
+);
+
+my $background = SDL::Rect->new(
+       -width  => $width,
+       -height => $height,
+);
+
+my $pos = SDL::Rect->new(
+       -width  => 16,
+       -height => 16,
+       -x      => 0,
+       -y      => 240,
+);
+
+my $walker = Walker->new(qw(
+END_HERE
+
+$demo_source .= join( ' ', @img_files ) . "));" . <<'END_HERE';
+
+for my $x ( $start_x .. $end_x )
+{
+       draw_background( $app, $background, $bg_color );
+       $pos->x( $x );
+       draw_walker( $walker, $app, $pos );
+       $app->update( $background );
+       select( undef, undef, undef, $sleep_msec );
+}
+
+# you'll want to remove this
+sleep 2;
+
+sub draw_background
+{
+       my ($app, $background, $bg_color) = @_;
+       $app->fill( $background, $bg_color );
+}
+
+sub draw_walker
+{
+       my ($walker, $app, $pos) = @_;
+       my $frame                = $walker->next_frame();
+       my $frame_rect           = $walker->frame_rect();
+       $frame->blit( $frame_rect, $app, $pos );
+}
+END_HERE
+
+       Pod::ToDemo::write_demo( $filename, "#$^X\n$demo_source" );
+       write_files( $imagebase );
+};
+               
+sub write_files
+{
+       my $imagebase = shift;
+
+       for my $image (qw( left center right ))
+       {
+               my $file = join('', map { chr( hex( $_ ) ) } @{ $images{ $image } });
+               write_file( $imagebase . "_$image" . '.gif', $file );
+       }
+}
+
+sub write_file
+{
+    my ($file, $contents) = @_;
+
+       die "Cowardly refusing to overwrite '$file'\n" if -e $file;
+       open my $out, '>', $file or die "Cannot write '$file': $!\n";
+       binmode $out;
+       print $out $contents;
+}
+
+__END__
+
+=head1 NAME
+
+SDL::Tutorial::Images
+
+=head1 SYNOPSIS
+
+       # to read this tutorial
+       $ perldoc SDL::Tutorial::Images
+
+       # to create a demo animation program based on this tutorial
+       $ perl -MSDL::Tutorial::Images=sdl_images.pl -e 1
+
+=head1 ANIMATING IMAGES
+
+Since you're already familiar with the concepts behind animation, it's time to
+learn how to work with images.  As usual, the important point is that computer animation is just I<simulating> motion by painting several slightly different frames to the screen every second.
+
+There are two ways to vary an image on screen.  One is to change its
+coordinates so it's at a slightly different position.  This is very easy to do;
+it's just like animating a rectangle.  The other way is to change the image
+itself so it's slightly different.  This is a little more difficult, as you'll
+need to draw the alternate image beforehand somehow.
+
+=head2 Loading Images
+
+As usual, start with an L<SDL::App> object representing the image window.  Then
+preload the image file.  This is easy; just pass the C<name> parameter to the
+L<SDL::Surface> constructor:
+
+       use SDL::Surface;
+
+       my $frame = SDL::Surface->new( -name => 'frame1.png' );
+
+B<Note:> you'll need to have compiled SDL Perl (and probably SDL) to support
+JPEG and PNG files for this to work.
+
+That's it; now you have an SDL::Surface object containing the image.  You can
+use the C<height()>, C<width()>, and C<bpp()> methods to retrieve its height,
+width, and bits per pixel, if you need them.
+
+=head2 Displaying Images
+
+Drawing an image onto the screen requires blitting it from one surface to
+another.  (Remember, "blitting" means copying bits in memory.)  The C<blit()>
+method of SDL::Surface objects comes in handy.  Its arguments are a little odd,
+though.  Assuming C<$app> is the SDL::App object, as usual:
+
+       use SDL::Rect;
+
+       my $frame_rect = SDL::Rect->new(
+               -height => $frame->height(),
+               -width  => $frame->width(),
+               -x      => 0,
+               -y      => 0,
+       );
+
+       my $dest_rect  = SDL::Rect->new(
+               -height => $frame->height(),
+               -width  => $frame->width(),
+               -x      => 0,
+               -y      => 0,
+       );
+
+       $frame->blit( $frame_rect, $app, $dest_rect );
+       $app->update( $dest_rect );
+
+Here we have two L<SDL::Rect> objects which represent rectangular regions of a
+Surface.  C<$frame_rect> represents the entire area of C<$frame>, while
+C<$dest_rect> represents the area of the main window in which to blit the
+frame.  This may be clearer with more descriptive variable names:
+
+       $source_surface->blit(
+               $area_of_source_to_blit,
+               $destination_surface,
+               $destination_area
+       );
+
+As usual, call C<update()> on C<$app> to see the change.
+
+Requiring the source and destination Rect objects may seem tedious in this
+simple example, but it's highly useful for copying only part of surface to part
+of another.  For example, animating this image is a matter of changing the C<x>
+and C<y> coordinates of C<$dest_rect>:
+
+       for my $x ( 1 .. 100 )
+       {
+               $dest_rect->x( $x );
+               $frame->blit( $frame_rect, $app, $dest_rect );
+               $app->update( $dest_rect );
+       }
+
+Of course, you'll have to redraw all or part of the screen to avoid artifacts,
+as discussed in the previous tutorial.
+
+=head2 Multi-Image Animation
+
+That covers moving a single image around the screen.  What if you want
+something more?  For example, what if you want to animate a stick figure
+walking?
+
+You'll need several frames, just as in a flip-book.  Each frame should be slightly different than the one before it.  It's probably handy to encapsulate all of this in a C<Walker> class:
+
+       package Walker;
+
+       use SDL::Surface;
+
+       sub new
+       {
+               my ($class, @images) = @_;
+               my $self = [ map { SDL::Surface->new( -name => $_ ) } @images ];
+
+               bless $self, $class;
+       }
+
+       sub next_frame
+       {
+               my $self  = shift;
+               my $frame = shift @$self;
+
+               push @$self, $frame;
+               return $frame;
+       }
+
+To use this class, instantiate an object:
+
+       my $walker = Walker->new( 'frame1.png', 'frame2.png', 'frame3.png' );
+
+Then call C<next_frame()> within the loop:
+
+       for my $x ( 1 .. 100 )
+       {
+               my $frame = $walker->next_frame();
+
+               $dest_rect->x( $x );
+               $frame->blit( $frame_rect, $app, $dest_rect );
+               $app->update( $dest_rect );
+       }
+
+Again, the rest of the frame drawing is missing from this example so as not to
+distract from this technique.  You'll probably want to abstract the undrawing
+and redrawing into a separate subroutine so you don't have to worry about it
+every time.
+
+It'd be easy to make C<next_frame()> much smarter, selecting an image
+appropriate to the direction of travel, using a bored animation when the
+character is no longer moving, or adding other characteristics to the
+character.  As you can see, the hard part of this technique is generating the
+images beforehand.  That can add up to a tremendous amount of art and that's
+one reason for the popularity of 3D models... but that's another tutorial much
+further down the road.
+
+More importantly, it's time to discuss how to make these animations run more
+smoothly.  More on that next time.
+
+=head1 SEE ALSO
+
+=over 4
+
+=item L<SDL::Tutorial>
+
+basic SDL tutorial
+
+=item L<SDL::Tutorial::Animation>
+
+non-image animation
+
+=back
+
+=head1 AUTHOR
+
+chromatic, E<lt>chromatic@wgz.orgE<gt>
+
+Written for and maintained by the Perl SDL project, L<http://sdl.perl.org/>.
+
+=head1 BUGS
+
+No known bugs.
+
+=head1 COPYRIGHT
+
+Copyright (c) 2004, chromatic.  All rights reserved.  This module is
+distributed under the same terms as Perl itself, in the hope that it is useful
+but certainly under no guarantee.
diff --git a/lib/SDL/Video.pm b/lib/SDL/Video.pm
new file mode 100644 (file)
index 0000000..a97bf0a
--- /dev/null
@@ -0,0 +1,240 @@
+#!/usr/bin/env perl
+#
+# Video.pm
+#
+# Copyright (C) 2005 David J. Goehrig <dgoehrig@cpan.org>
+#
+# ------------------------------------------------------------------------------
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+# 
+# This library 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
+# Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+#
+# ------------------------------------------------------------------------------
+#
+# Please feel free to send questions, suggestions or improvements to:
+#
+#      David J. Goehrig
+#      dgoehrig@cpan.org
+#
+
+package SDL::Video;
+
+use strict;
+use SDL;
+use SDL::Surface;
+use SDL::MPEG;
+
+sub new {
+       my $proto = shift;
+       my $class = ref($proto) || $proto;
+       my %options = @_;
+
+       verify (%options, qw/ -name -audio / ) if $SDL::DEBUG;
+
+       my $n = $options{-name} || die "SDL::Video must supply a filename to SDL::Video::new\n";
+       my $a = $options{'-audio'} ? 1 : 0;
+       my $info = new SDL::MPEG();
+       
+       my $self = \SDL::NewSMPEG($n,$$info,$a);
+       die SDL::GetError() unless $$self;
+       bless $self,$class;
+       $self->audio(1);
+       $self->video(1);
+       return $self, $info;
+}
+
+sub DESTROY {
+       SDL::FreeSMPEG(${$_[0]});
+}
+
+sub error {
+       SDL::SMPEGError(${$_[0]});
+}
+
+sub audio {
+       SDL::SMPEGEnableAudio( ${$_[0]}, $_[1]);
+}
+
+sub video {
+       SDL::SMPEGEnableVideo( ${$_[0]}, $_[1]);
+}
+
+sub volume {
+       SDL::SMPEGSetVolume( ${$_[0]}, $_[1] );
+}
+
+sub display {
+       die "SDL::Video::Display requires a SDL::Surface\n" unless $_[1]->isa('SDL::Surface');
+       SDL::SMPEGSetDisplay( ${$_[0]}, ${$_[1]}, 0);
+}
+
+sub scale {
+       return SDL::SMPEGScaleXY(${$_[0]},$_[1],$_[2]) if (@_ == 3 );
+       return SDL::SMPEGScaleXY(${$_[0]},$_[1]->width(),$_[1]->height()) if $_[1]->isa('SDL::Surface');
+       SDL::SMPEGScale(${$_[0]},$_[1]);
+}
+
+sub play {
+       SDL::SMPEGPlay(${$_[0]});
+}
+
+sub pause {
+       SDL::SMPEGPause(${$_[0]});
+}
+
+sub stop {
+       SDL::SMPEGStop(${$_[0]});
+}
+
+sub rewind {
+       SDL::SMPEGRewind(${$_[0]});
+}
+
+sub seek {
+       SDL::SMPEGSeek(${$_[0]},$_[1]);
+}
+
+sub skip {
+       SDL::SMPEGSkip(${$_[0]},$_[1]);
+}
+
+sub loop {
+       SDL::SMPEGLoop(${$_[0]},$_[1]);
+}
+
+sub region {
+       die "SDL::Video::region requires a SDL::Rect\n" unless $_[1]->isa('SDL::Rect');
+       SDL::SMPEGDisplayRegion(${$_[0]},${$_[1]});
+}
+
+sub frame {
+       SDL::SMPEGRenderFrame(${$_[0]},$_[1]);
+}
+
+sub info {
+       new SDL::MPEG -from => $_[0];
+}
+
+sub status {
+       SDL::SMPEGStatus(${$_[0]});
+}
+
+1;
+
+__END__;
+
+=pod
+
+
+=head1 NAME
+
+SDL::Video - a SDL perl extension
+
+=head1 SYNOPSIS
+
+  $video = new SDL::Video ( -name => 'pr0n.mpg' );
+
+=head1 DESCRIPTION
+
+C<SDL::Video> adds support for MPEG video to your
+SDL Perl application.  Videos are objects bound to
+surfaces, whose playback is controled through the
+object's interface.
+
+=head2 METHODS 
+
+
+=over 4
+
+=item *
+
+C<SDL::Video::error()> returns any error messages associated with playback 
+
+=item * 
+
+C<SDL::Video::audio(bool)> enables or disables audio playback, (on by default)
+
+=item * 
+
+C<SDL::Video::video(bool)> enables or disable video playback, (on by default)
+
+=item * 
+
+C<SDL::Video::loop(bool)> enables or disable playback looping (off by default) 
+
+=item * 
+
+C<SDL::Video::volume(int)> set the volume as per the mixer volume
+
+=item * 
+
+C<SDL::Video:display(surface)> binds the clip to a display surface
+
+=item * 
+
+C<SDL::Video::scale([x,y]|[surface]|int)> scales the clip by either x,y
+factors, scales to the image dimensions, or a single scalar.
+
+=item * 
+
+C<SDL::Video::play()> plays the video clip, call C<SDL::Video::display()> before playing
+
+=item * 
+
+C<SDL::Video::pause()> pauses video playback
+
+=item * 
+
+C<SDL::Video::stop()> stops video playback
+
+=item * 
+
+C<SDL::Video::rewind()> resets the clip to the beginning 
+
+=item * 
+
+C<SDL::Video::seek(offset)> seeks to a particular byte offset
+
+=item * 
+
+C<SDL::Video::skip(time)> skips to a particular time
+
+=item * 
+
+C<SDL::Video::region(rect)> takes a SDL::Rect and defines the display area
+
+=item * 
+
+C<SDL::Video::frame(int)> renders a specific frame to the screen
+
+=item * 
+
+C<SDL::Video::info()> returns a new C<SDL::MPEG> object reflecting the current status
+
+=item *
+
+C<SDL::Video::status()> returns either SMPEG_PLAYING or SMPEG_STOPPED or SMPEG_ERROR
+
+=back
+
+=head1 AUTHOR
+
+David J. Goehrig
+
+=head1 SEE ALSO
+
+perl(1) SDL::Surface(3) SDL::MPEG(3)
+
+=cut
+
diff --git a/lib/SDL_perl.pm b/lib/SDL_perl.pm
new file mode 100644 (file)
index 0000000..69c9559
--- /dev/null
@@ -0,0 +1,39 @@
+#!/usr/bin/env perl
+#
+# SDL_perl.pm
+#
+# Copyright (C) 2005 David J. Goehrig <dgoehrig@cpan.org>
+#
+# ------------------------------------------------------------------------------
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+# 
+# This library 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
+# Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+#
+# ------------------------------------------------------------------------------
+#
+# Please feel free to send questions, suggestions or improvements to:
+#
+#      David J. Goehrig
+#      dgoehrig@cpan.org
+#
+
+package SDL_perl;
+
+require DynaLoader;
+
+@ISA = qw/ DynaLoader /;
+
+bootstrap SDL_perl;
+
+1;
diff --git a/logo/sdl_perl_logo_large.png b/logo/sdl_perl_logo_large.png
new file mode 100644 (file)
index 0000000..5e5838c
Binary files /dev/null and b/logo/sdl_perl_logo_large.png differ
diff --git a/logo/sdl_perl_logo_small.png b/logo/sdl_perl_logo_small.png
new file mode 100644 (file)
index 0000000..879ba3e
Binary files /dev/null and b/logo/sdl_perl_logo_small.png differ
diff --git a/make/lib/SDL/Build.pm b/make/lib/SDL/Build.pm
new file mode 100644 (file)
index 0000000..3ffc43c
--- /dev/null
@@ -0,0 +1,267 @@
+#!/usr/bin/env perl
+#
+# Build.pm
+#
+# Copyright (C) 2005 David J. Goehrig <dgoehrig@cpan.org>
+#
+# ------------------------------------------------------------------------------
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+# 
+# This library 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
+# Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+#
+# ------------------------------------------------------------------------------
+#
+# Please feel free to send questions, suggestions or improvements to:
+#
+#      David J. Goehrig
+#      dgoehrig@cpan.org
+#
+
+package SDL::Build;
+
+use strict;
+use base 'Module::Build';
+
+use File::Spec;
+use Data::Dumper;
+use Config;
+
+# Module::Build doesn't seem to have a way to use separate flags for separate
+# XS files, so here's the override that makes separate files build correctly:
+sub process_xs
+{
+       my ($self, $file) = @_;
+
+       my $properties                   = $self->{properties};
+       my $file_args                    = $self->notes( 'file_flags' )->{$file};
+       my @old_values                   = @$properties{ keys %$file_args };
+       @$properties{ keys %$file_args } = values %$file_args;
+
+       $self->SUPER::process_xs( $file );
+       @$properties{ keys %$file_args } = @old_values;
+}
+
+
+# every platform has slightly different library and header paths
+sub get_arch
+{
+       my ($self, $os)   = @_;
+       my $modpath       = File::Spec->catfile(
+               'SDL', 'Build', ucfirst( $os ) . '.pm' );
+       my $module        = 'SDL::Build::' . ucfirst( $os );
+
+       require $modpath or die "No module for $os platform\n";
+
+       return $module;
+}
+
+# which headers are installed?
+sub find_subsystems
+{
+       my ($self, $subsystems, $libraries) = @_;
+       my %includes_libs                   = $self->fetch_includes();
+       my %enabled;
+
+       while ( my ($name, $subsystem) = each %$subsystems )
+       {
+               for my $library (@{ $subsystem->{libraries} })
+               {
+                       my $lib = $libraries->{$library}
+                               or die "Unknown library '$library' for '$name'\n";
+
+                       my ($inc_dir, $link_dir)   =
+                               $self->find_header( $lib->{header}, \%includes_libs );
+                       $enabled{$name}{ $library } = $inc_dir ? [ $inc_dir, $link_dir ]
+                               : 0;
+               }
+       }
+
+       return \%enabled;
+}
+
+# set the define flags for the libraries we have
+sub build_defines
+{
+       my ($self, $libraries, $build_systems) = @_;
+
+       my %defines;
+
+       while (my ($subsystem, $buildable) = each %$build_systems)
+       {
+               for my $build (grep { $buildable->{ $_ } } keys %$buildable)
+               {
+                       push @{ $defines{ $subsystem } }, "-D$libraries->{$build}{define}";
+               }
+       }
+
+       return \%defines;
+}
+
+# set the include paths for the libraries we have
+sub build_includes
+{
+       my ($self, $libraries, $build_systems) = @_;
+
+       my %includes;
+
+       while (my ($subsystem, $buildable) = each %$build_systems)
+       {
+               my %sub_include;
+               for my $build (grep { $buildable->{ $_ } } keys %$buildable)
+               {
+                       $sub_include{ $buildable->{ $build }[0] }++;
+               }
+
+               $includes{ $subsystem } = [ map { "-I$_" } keys %sub_include ];
+       }
+
+       return \%includes;
+}
+
+# set the linker paths and flags for the libraries we have
+sub build_links
+{
+       my ($self, $libraries, $build_systems) = @_;
+
+       my %links;
+
+       while (my ($subsystem, $buildable) = each %$build_systems)
+       {
+               my %sub_links;
+               for my $build (grep { $buildable->{ $_ } } keys %$buildable)
+               {
+                       $sub_links{ $buildable->{ $build }[1] }++;
+                       push @{ $links{ $subsystem }{libs} }, "-l$build";
+               }
+
+               $links{ $subsystem }{paths} = [ map { "-L$_" } keys %sub_links ];
+       }
+
+       return \%links;
+}
+
+# save this all in a format process_xs() can understand
+sub set_flags
+{
+       my ($self, $subsystems, $build, $defines, $includes, $links,
+           $sdl_compile, $sdl_link) = @_;
+
+       my %file_flags;
+
+       while (my ($subsystem, $buildable) = each %$build)
+       {
+               my $sub_file     = $subsystems->{$subsystem}{file}{to};
+               my $sub_includes = join(' ', @{ $includes->{$subsystem} } );
+
+               $file_flags{ $sub_file } = 
+               {
+                       extra_compiler_flags =>
+                       [
+                               @{ $includes->{$subsystem} },
+                               split(' ',$sdl_compile),
+                               @{ $defines->{$subsystem} },
+                               ( defined $Config{usethreads} ? ('-DUSE_THREADS', '-fPIC') : ('-fPIC' )),
+                       ],
+                       extra_linker_flags => 
+                       [
+                               @{ $links->{$subsystem}{paths} },
+                               split(' ',$sdl_link),
+                               @{ $links->{$subsystem}{libs} },
+                       ],
+               },
+       }
+
+       $self->notes( 'file_flags' => \%file_flags );
+}
+
+# look for a header somewhere on the system
+sub find_header
+{
+       my ($self, $header, $includes) = @_;
+
+       for my $inc_dir (keys %$includes)
+       {
+               next unless -e File::Spec->catfile( $inc_dir, $header );
+               return ($inc_dir, $includes->{$inc_dir});
+       }
+}
+
+sub write_sdl_config
+{
+       my ($self, $config) = @_;
+       my $path            = File::Spec->catfile(qw( lib SDL Config.pm ));
+       my $dd              = Data::Dumper->new( [ $config ], [ 'sdl_config' ] );
+       my $hash            = $dd->Dump();
+       (my $text           = <<'       END_HEADER' . $hash . <<'       END_FOOTER');
+       package SDL::Config;
+
+       my $sdl_config; 
+       END_HEADER
+
+       sub has
+       {
+               my ($class, $define) = @_;
+               scalar grep { $$sdl_config{$_}{$define} } keys %$sdl_config;
+       }
+
+       1;
+       END_FOOTER
+
+       $text =~ s/^\t//gm;
+
+       open my $file, '>', $path or die "Cannot write to '$path': $!\n";
+       print $file $text;
+}
+
+# Subclass  Darwin to build Objective-C addons
+
+sub filter_support {
+       my $self = shift;
+       print STDERR "[SDL::Build] generic filter\n";
+       return ();
+}
+
+sub process_support_files {
+       my $self = shift;
+       my $p = $self->{properties};
+       return unless $p->{c_source};
+       return unless $p->{c_sources};
+
+       push @{$p->{include_dirs}}, $p->{c_source};
+       unless ( $p->{extra_compiler_flags} && $p->{extra_compiler_flags} =~ /DARCHNAME/) {
+               $p->{extra_compiler_flags} .=  " -DARCHNAME=" . $self->{config}{archname};
+       }
+       print STDERR "[SDL::Build] extra compiler flags" . $p->{extra_compiler_flags} . "\n";
+
+       foreach my $file (map($p->{c_source} . "/$_", @{$p->{c_sources}})) {
+               push @{$p->{objects}}, $self->compile_c($file);
+       }
+}
+
+# Override to create a MacOS Bundle
+sub build_bundle
+{
+       return;
+}
+
+# Override Install method for darwin
+sub ACTION_install {
+  my ($self) = @_;
+  require ExtUtils::Install;
+  $self->depends_on('build');
+  $self->get_arch($^O)->build_bundle();
+  ExtUtils::Install::install($self->install_map, 1, 0, $self->{args}{uninst}||0);
+}
+
+1;
diff --git a/make/lib/SDL/Build/Cygwin.pm b/make/lib/SDL/Build/Cygwin.pm
new file mode 100644 (file)
index 0000000..4258925
--- /dev/null
@@ -0,0 +1,74 @@
+#!/usr/bin/env perl
+#
+# Cygwin.pm
+#
+# Copyright (C) 2005 David J. Goehrig <dgoehrig@cpan.org>
+#
+# ------------------------------------------------------------------------------
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+# 
+# This library 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
+# Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+#
+# ------------------------------------------------------------------------------
+#
+# Please feel free to send questions, suggestions or improvements to:
+#
+#      David J. Goehrig
+#      dgoehrig@cpan.org
+#
+
+package SDL::Build::Cygwin;
+
+use base 'SDL::Build';
+
+sub opengl_headers
+{
+       return GL => 'SDL_opengl.h';
+}
+
+sub fetch_includes
+{
+       return (
+       '/usr/local/include'       => '/usr/local/lib',
+       '/usr/local/include/gl'    => '/usr/local/lib',
+       '/usr/local/include/GL'    => '/usr/local/lib',
+       '/usr/local/include/SDL'   => '/usr/local/lib',
+       '/usr/local/include/smpeg' => '/usr/local/lib',
+
+       '/usr/include'              => '/usr/lib',
+       '/usr/include/gl'           => '/usr/lib',
+       '/usr/include/GL'           => '/usr/lib',
+       '/usr/include/SDL'          => '/usr/lib',
+       '/usr/include/smpeg'        => '/usr/lib',
+
+       '/usr/X11R6/include'        => '/usr/X11R6/lib',
+       '/usr/X11R6/include/gl'     => '/usr/X11R6/lib',
+       '/usr/X11R6/include/GL'     => '/usr/X11R6/lib',
+       );
+}
+
+sub build_links
+{
+       my $self  = shift;
+       my $links = $self->SUPER::build_links();
+
+       for my $subsystem (values %$links)
+       {
+               push @{ $subsystem{ libs } }, '-lpthreads';
+       }
+
+       return $links;
+}
+
+1;
diff --git a/make/lib/SDL/Build/Darwin.pm b/make/lib/SDL/Build/Darwin.pm
new file mode 100644 (file)
index 0000000..18d5b1e
--- /dev/null
@@ -0,0 +1,95 @@
+#!/usr/bin/env perl
+#
+# Darwin.pm
+#
+# Copyright (C) 2005 David J. Goehrig <dgoehrig@cpan.org>
+#
+# ------------------------------------------------------------------------------
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+# 
+# This library 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
+# Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+#
+# ------------------------------------------------------------------------------
+#
+# Please feel free to send questions, suggestions or improvements to:
+#
+#      David J. Goehrig
+#      dgoehrig@cpan.org
+#
+
+package SDL::Build::Darwin;
+
+use base 'SDL::Build';
+
+sub fetch_includes
+{
+       return (
+       '/usr/local/include/SDL'   => '/usr/local/lib',
+       '/usr/local/include'       => '/usr/local/lib',
+       '/usr/local/include/smpeg' => '/usr/local/lib',
+       '/usr/include/SDL'         => '/usr/lib',
+       '/usr/include'             => '/usr/lib',
+       '/usr/include/smpeg'       => '/usr/lib',
+       '/usr/local/include/GL'    => '/usr/local/lib',
+       '/usr/local/include/gl'    => '/usr/local/lib',
+       '/usr/include/GL'          => '/usr/lib', 
+       '/usr/include/gl'          => '/usr/lib', 
+
+       '/System/Library/Frameworks/SDL_mixer.framework/Headers'     => '../../lib',
+       '/System/Library/Frameworks/SDL_image.framework/Headers'     => '../../lib',
+       '/System/Library/Frameworks/SDL_ttf.framework/Headers'       => '../../lib',
+       '/System/Library/Frameworks/libogg.framework/Headers'        => '../../lib',
+       '/System/Library/Frameworks/libvorbis.framework/Headers'     => '../../lib',
+       '/System/Library/Frameworks/libvorbisfile.framework/Headers' => '../../lib',
+       '/System/Library/Frameworks/libvorbisenc.framework/Headers'  => '../../lib',
+       '../../include'                                              => '../../lib',
+       '/System/Library/Frameworks/OpenGL.framework/Headers'        =>
+               '/System/Library/Frameworks/OpenGL.framework/Libraries',
+       );
+}
+
+sub build_c_sources 
+{
+       return [qw/ 
+               launcher.m
+       /];
+}
+
+sub build_c_source
+{
+       return 'MacOSX';
+}
+
+sub build_install_base
+{
+       return "SDL Perl.app/Contents/Resources";       
+}
+
+sub build_bundle
+{
+       $bundle_contents="SDL Perl.app/Contents";
+       system "mkdir -p \"$bundle_contents\"";
+       mkdir "$bundle_contents/MacOS",0755;
+       $libs = `sdl-config --libs`;
+       chomp($libs);
+       $libs =~ s/-lSDLmain//g;
+       system "gcc $libs -framework Cocoa `perl -MExtUtils::Embed -e ldopts` MacOSX/launcher.o -o \"$bundle_contents/MacOS/SDL Perl\"";
+
+       mkdir "$bundle_contents/Resources",0755;
+       system "echo \"APPL????\" > \"$bundle_contents/PkgInfo\"";
+       system "cp MacOSX/Info.plist \"$bundle_contents/\"";
+       system "cp \"MacOSX/SDL Perl.icns\" \"$bundle_contents/Resources\"";
+}
+
+1;
diff --git a/make/lib/SDL/Build/Freebsd.pm b/make/lib/SDL/Build/Freebsd.pm
new file mode 100644 (file)
index 0000000..4b1a0fb
--- /dev/null
@@ -0,0 +1,59 @@
+#!/usr/bin/env perl
+#
+# Freebsd.pm
+#
+# Copyright (C) 2005 David J. Goehrig <dgoehrig@cpan.org>
+#
+# ------------------------------------------------------------------------------
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+# 
+# This library 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
+# Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+#
+# ------------------------------------------------------------------------------
+#
+# Please feel free to send questions, suggestions or improvements to:
+#
+#      David J. Goehrig
+#      dgoehrig@cpan.org
+#
+
+package SDL::Build::Freebsd;
+
+use base 'SDL::Build';
+
+sub fetch_includes
+{
+       return (
+       '/usr/local/include/SDL11' => '/usr/local/lib',
+
+       '/usr/local/include'       => '/usr/local/lib',
+       '/usr/local/include/gl'    => '/usr/local/lib',
+       '/usr/local/include/GL'    => '/usr/local/lib',
+       '/usr/local/include/SDL'   => '/usr/local/lib',
+       '/usr/local/include/smpeg' => '/usr/local/lib',
+
+       '/usr/include'              => '/usr/lib',
+       '/usr/include/gl'           => '/usr/lib',
+       '/usr/include/GL'           => '/usr/lib',
+       '/usr/include/SDL'          => '/usr/lib',
+       '/usr/include/smpeg'        => '/usr/lib',
+
+       '/usr/X11R6/include'        => '/usr/X11R6/lib',
+       '/usr/X11R6/include/gl'     => '/usr/X11R6/lib',
+       '/usr/X11R6/include/GL'     => '/usr/X11R6/lib',
+
+       );
+}
+
+1;
diff --git a/make/lib/SDL/Build/Linux.pm b/make/lib/SDL/Build/Linux.pm
new file mode 100644 (file)
index 0000000..0a8ec4a
--- /dev/null
@@ -0,0 +1,56 @@
+#!/usr/bin/env perl
+#
+# Linux.pm
+#
+# Copyright (C) 2005 David J. Goehrig <dgoehrig@cpan.org>
+#
+# ------------------------------------------------------------------------------
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+# 
+# This library 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
+# Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+#
+# ------------------------------------------------------------------------------
+#
+# Please feel free to send questions, suggestions or improvements to:
+#
+#      David J. Goehrig
+#      dgoehrig@cpan.org
+#
+
+package SDL::Build::Linux;
+
+use base 'SDL::Build';
+
+sub fetch_includes
+{
+       return (
+       '/usr/local/include'       => '/usr/local/lib',
+       '/usr/local/include/gl'    => '/usr/local/lib',
+       '/usr/local/include/GL'    => '/usr/local/lib',
+       '/usr/local/include/SDL'   => '/usr/local/lib',
+       '/usr/local/include/smpeg' => '/usr/local/lib',
+
+       '/usr/include'              => '/usr/lib',
+       '/usr/include/gl'           => '/usr/lib',
+       '/usr/include/GL'           => '/usr/lib',
+       '/usr/include/SDL'          => '/usr/lib',
+       '/usr/include/smpeg'        => '/usr/lib',
+
+       '/usr/X11R6/include'        => '/usr/X11R6/lib',
+       '/usr/X11R6/include/gl'     => '/usr/X11R6/lib',
+       '/usr/X11R6/include/GL'     => '/usr/X11R6/lib',
+       );
+}
+
+1;
diff --git a/make/lib/SDL/Build/MSWin32.pm b/make/lib/SDL/Build/MSWin32.pm
new file mode 100644 (file)
index 0000000..2e23d03
--- /dev/null
@@ -0,0 +1,149 @@
+#!/usr/bin/env perl
+#
+# MSWin32.pm
+#
+# Copyright (C) 2005 David J. Goehrig <dgoehrig@cpan.org>
+#
+# ------------------------------------------------------------------------------
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+# 
+# This library 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
+# Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+#
+# ------------------------------------------------------------------------------
+#
+# Please feel free to send questions, suggestions or improvements to:
+#
+#      David J. Goehrig
+#      dgoehrig@cpan.org
+#
+
+package SDL::Build::MSWin32;
+
+use strict;
+
+use base 'SDL::Build';
+use File::Spec::Functions;
+
+sub fetch_includes
+{
+       die "Environment variable INCLUDE is empty\n" unless $ENV{INCLUDE};
+
+       return map { $_ => 1 } grep { $_ } split( ';', $ENV{INCLUDE} );
+}
+
+sub find_header
+{
+       for my $key (qw( LIBS PATH ))
+       {
+               die "Environment variable $key is empty\n" unless $ENV{$key};
+       }
+
+       my ( $self, $header, $includes ) = @_;
+       ( my $dll = $header ) =~ s/\.h/\.dll/;
+
+       my $include_dir;
+
+       for my $inc_dir ( keys %$includes )
+       {
+               next unless -e catfile( $inc_dir, $header );
+               $include_dir = $inc_dir;
+       }
+
+       return unless $include_dir;
+
+       for my $lib_path ( map { split(';', ( $ENV{$_} || '' )) }
+                                  qw( LIB LIBS PATH ) )
+       {
+               return ( $include_dir, $header ) if -e catfile( $lib_path, $dll );
+       }
+}
+
+sub link_flags
+{
+       return 'SDL.lib';
+}
+
+sub compile_flags
+{
+       return;
+}
+
+sub subsystems
+{
+       my $self         = shift;
+       my $subsystems   = $self->SUPER::subsystems();
+       my $gl_ss_method = $self->gl_vendor( $ENV{SDL_GL_VENDOR} ) . '_subsystems';
+
+       $subsystems->{OpenGL}{libraries} = $self->$gl_ss_method();
+       return $subsystems;
+}
+
+sub libraries
+{
+       my $self          = shift;
+       my $libraries     = $self->SUPER::libraries();
+       my $gl_lib_method = $self->gl_vendor( $ENV{SDL_GL_VENDOR} ) . '_libraries';
+
+       $libraries->{OpenGL}{define} .= ' -D' . $self->$gl_lib_method();
+       return $libraries;
+}
+
+sub gl_vendor
+{
+       my ( $self, $vendor ) = @_;
+
+       return 'ms_gl' unless defined $vendor;
+
+       return 'mesa_gl' if $vendor eq 'MESA';
+       return 'ms_gl'   if $vendor eq 'MS';
+
+       die "Unrecognized GL vendor '$vendor'\n";
+}
+
+sub ms_gl_subsystems
+{
+       return [qw( OpenGL GLU )];
+}
+
+sub mesa_gl_subsystems
+{
+       return [qw( mesagl mesaglu osmesa )];
+}
+
+sub ms_gl_libraries
+{
+       define => 'OPENGL_VENDOR_MS';
+}
+
+sub mesa_gl_libraries
+{
+       define => 'OPENGL_VENDOR_MESA';
+}
+
+sub link_c
+{
+       my $self           = shift;
+       my ( $blib, $rib ) = @_;
+
+       # until ExtUtils::ParseXS is patched, avoid warnings from cl.exe
+       $_[-1] =~ s{\\}{/}g;
+
+       $rib   =~ s{^src[\\/]}{};
+       $rib   =~ s{[\\/]}{::}g;
+
+       local $self->{properties}{module_name} = $rib;
+       $self->SUPER::link_c( @_ );
+}
+
+1;
diff --git a/make/lib/SDL/Build/Netbsd.pm b/make/lib/SDL/Build/Netbsd.pm
new file mode 100644 (file)
index 0000000..90ab477
--- /dev/null
@@ -0,0 +1,60 @@
+#!/usr/bin/env perl
+#
+# Netbsd.pm
+#
+# Copyright (C) 2005 David J. Goehrig <dgoehrig@cpan.org>
+#
+# ------------------------------------------------------------------------------
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+# 
+# This library 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
+# Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+#
+# ------------------------------------------------------------------------------
+#
+# Please feel free to send questions, suggestions or improvements to:
+#
+#      David J. Goehrig
+#      dgoehrig@cpan.org
+#
+
+package SDL::Build::Netbsd;
+
+use strict;
+
+sub fetch_includes
+{
+       return (
+       '/usr/pkg/include',        => '/usr/local/lib',
+       '/usr/pkg/include/SDL'     => '/usr/local/lib',
+       '/usr/pkg/include/smpeg'   => '/usr/local/lib',
+
+       '/usr/local/include'       => '/usr/local/lib',
+       '/usr/local/include/gl'    => '/usr/local/lib',
+       '/usr/local/include/GL'    => '/usr/local/lib',
+       '/usr/local/include/SDL'   => '/usr/local/lib',
+       '/usr/local/include/smpeg' => '/usr/local/lib',
+
+       '/usr/include'              => '/usr/lib',
+       '/usr/include/gl'           => '/usr/lib',
+       '/usr/include/GL'           => '/usr/lib',
+       '/usr/include/SDL'          => '/usr/lib',
+       '/usr/include/smpeg'        => '/usr/lib',
+
+       '/usr/X11R6/include'        => '/usr/X11R6/lib',
+       '/usr/X11R6/include/gl'     => '/usr/X11R6/lib',
+       '/usr/X11R6/include/GL'     => '/usr/X11R6/lib',
+       );
+}
+
+1;
diff --git a/src/OpenGL.xs b/src/OpenGL.xs
new file mode 100644 (file)
index 0000000..4c54228
--- /dev/null
@@ -0,0 +1,2732 @@
+//
+// OpenGL.xs
+//
+// Copyright (C) 2005 David J. Goehrig <dgoehrig@cpan.org>
+//
+// ------------------------------------------------------------------------------
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+// 
+// This library 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
+// Lesser General Public License for more details.
+// 
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+//
+// ------------------------------------------------------------------------------
+//
+// Please feel free to send questions, suggestions or improvements to:
+//
+//     David J. Goehrig
+//     dgoehrig@cpan.org
+//
+
+#include "EXTERN.h"
+#include "perl.h"
+#include "XSUB.h"
+
+#ifndef aTHX_
+#define aTHX_
+#endif
+
+#include <SDL.h>
+
+#include <gl.h>
+#include <glu.h>
+
+#ifdef USE_THREADS
+#define HAVE_TLS_CONTEXT
+#endif
+
+#ifndef GL_ALL_CLIENT_ATTRIB_BITS  
+#define GL_ALL_CLIENT_ATTRIB_BITS 0xFFFFFFF
+#endif /* GL_ALL_CLIENT_BITS */  
+
+#include "../defines.h"
+
+SV* sdl_perl_nurbs_error_hook;
+void
+sdl_perl_nurbs_error_callback ( GLenum errorCode )
+{
+       ENTER_TLS_CONTEXT
+       dSP;
+
+       ENTER;
+       SAVETMPS;
+       PUSHMARK(SP);
+       XPUSHs(sv_2mortal(newSViv(errorCode)));
+       PUTBACK;
+
+       call_sv(sdl_perl_nurbs_error_hook,G_VOID);
+       
+       FREETMPS;
+       LEAVE;
+       LEAVE_TLS_CONTEXT       
+}
+
+void
+sdl_perl_nurbs_being_callback ( GLenum type, void *cb )
+{
+       SV *cmd;
+       ENTER_TLS_CONTEXT
+       dSP;
+
+       cmd = (SV*)cb;
+
+       ENTER;
+       SAVETMPS;
+       PUSHMARK(SP);
+       XPUSHs(sv_2mortal(newSViv(type)));
+       PUTBACK;
+
+       call_sv(cmd,G_VOID);
+       
+       FREETMPS;
+       LEAVE;
+       LEAVE_TLS_CONTEXT       
+}
+
+void
+sdl_perl_nurbs_multi_callback ( GLfloat *vec, void *cb )
+{
+       SV *cmd;
+       ENTER_TLS_CONTEXT
+       dSP;
+
+       cmd = (SV*)cb;
+
+       ENTER;
+       SAVETMPS;
+       PUSHMARK(SP);
+       XPUSHs(sv_2mortal(newSViv(PTR2IV(vec))));
+       PUTBACK;
+
+       call_sv(cmd,G_VOID);
+       
+       FREETMPS;
+       LEAVE;
+       LEAVE_TLS_CONTEXT       
+}
+
+void
+sdl_perl_nurbs_end_callback ( void *cb )
+{
+       SV *cmd;
+       ENTER_TLS_CONTEXT
+
+       cmd = (SV*)cb;
+
+       ENTER;
+       SAVETMPS;
+
+       call_sv(cmd,G_VOID);
+       
+       FREETMPS;
+       LEAVE;
+       LEAVE_TLS_CONTEXT       
+}
+
+void
+sdl_perl_tess_end_callback ( void *cb )
+{
+       SV *cmd;
+        ENTER_TLS_CONTEXT
+       dSP;
+
+        cmd = (SV*)cb;
+
+        ENTER;
+        SAVETMPS;
+       PUSHMARK(SP);
+       XPUSHs(sv_2mortal(newSViv(GLU_TESS_BEGIN)));
+       PUTBACK;
+
+        call_sv(cmd,G_VOID);
+
+        FREETMPS;
+        LEAVE;
+        LEAVE_TLS_CONTEXT
+}
+
+void
+sdl_perl_tess_begin_callback ( GLenum type,  void *cb )
+{
+        SV *cmd;
+        ENTER_TLS_CONTEXT
+       dSP;
+
+        cmd = (SV*)cb;
+
+        ENTER;
+        SAVETMPS;
+       PUSHMARK(SP);
+       XPUSHs(sv_2mortal(newSViv(GLU_TESS_BEGIN)));
+       XPUSHs(sv_2mortal(newSViv(type)));
+       PUTBACK;
+
+        call_sv(cmd,G_VOID);
+
+        FREETMPS;
+        LEAVE;
+        LEAVE_TLS_CONTEXT
+}
+
+void
+sdl_perl_tess_error_callback ( GLenum type,  void *cb )
+{
+        SV *cmd;
+        ENTER_TLS_CONTEXT
+       dSP;
+
+        cmd = (SV*)cb;
+
+        ENTER;
+        SAVETMPS;
+        PUSHMARK(SP);
+        XPUSHs(sv_2mortal(newSViv(GLU_TESS_ERROR)));
+        XPUSHs(sv_2mortal(newSViv(type)));
+        PUTBACK;
+
+        call_sv(cmd,G_VOID);
+
+        FREETMPS;
+        LEAVE;
+        LEAVE_TLS_CONTEXT
+}
+
+void
+sdl_perl_tess_edge_flag_callback ( GLenum flag,  void *cb )
+{
+        SV *cmd;
+        ENTER_TLS_CONTEXT
+       dSP;
+
+        cmd = (SV*)cb;
+
+        ENTER;
+        SAVETMPS;
+        PUSHMARK(SP);
+       XPUSHs(sv_2mortal(newSViv(GLU_TESS_EDGE_FLAG)));
+        XPUSHs(sv_2mortal(newSViv(flag)));
+        PUTBACK;
+
+        call_sv(cmd,G_VOID);
+
+        FREETMPS;
+        LEAVE;
+        LEAVE_TLS_CONTEXT
+}
+
+void
+sdl_perl_tess_vertex_callback ( double *vd,  void *cb )
+{
+        SV *cmd;
+        ENTER_TLS_CONTEXT
+       dSP;
+
+        cmd = (SV*)cb;
+
+        ENTER;
+        SAVETMPS;
+        PUSHMARK(SP);
+       XPUSHs(sv_2mortal(newSViv(GLU_TESS_VERTEX)));
+        XPUSHs(sv_2mortal(newSVnv(vd[0])));
+        XPUSHs(sv_2mortal(newSVnv(vd[1])));
+        XPUSHs(sv_2mortal(newSVnv(vd[2])));
+        XPUSHs(sv_2mortal(newSVnv(vd[3])));
+        XPUSHs(sv_2mortal(newSVnv(vd[4])));
+        XPUSHs(sv_2mortal(newSVnv(vd[5])));
+        PUTBACK;
+
+        call_sv(cmd,G_VOID);
+
+        FREETMPS;
+        LEAVE;
+        LEAVE_TLS_CONTEXT
+}
+
+void
+sdl_perl_tess_combine_callback ( GLdouble coords[3], double *vd[4], GLfloat weight[4], 
+       GLdouble **out, void *cb )
+{
+        SV *cmd;
+       double *data;
+       int width;
+        ENTER_TLS_CONTEXT
+       dSP;
+
+        cmd = (SV*)cb;
+
+        ENTER;
+        SAVETMPS;
+        PUSHMARK(SP);
+       XPUSHs(sv_2mortal(newSViv(GLU_TESS_COMBINE)));
+       XPUSHs(sv_2mortal(newSVpvn((char*)coords,sizeof(GLdouble)*3)));
+       XPUSHs(sv_2mortal(newSVpvn((char*)vd,sizeof(GLdouble*)*4)));
+       XPUSHs(sv_2mortal(newSVpvn((char*)weight,sizeof(GLfloat)*4)));
+        PUTBACK;
+
+        if ( 1 != call_sv(cmd,G_SCALAR) ) {
+               Perl_croak(aTHX_ "sdl_perl_tess_combine_callback failed");
+       }
+
+       data = (double*)POPp;
+       width = (int)POPi;
+       *out = (double*)malloc(sizeof(double)*width);
+       memcpy(*out,data,sizeof(double)*width);
+
+        FREETMPS;
+        LEAVE;
+        LEAVE_TLS_CONTEXT
+}
+
+MODULE = SDL::OpenGL           PACKAGE = SDL::OpenGL
+PROTOTYPES : DISABLE
+
+#ifdef HAVE_GL
+
+void
+glClearColor ( r, g, b, a)
+       double r
+       double g
+       double b
+       double a
+       CODE:
+               glClearColor((GLfloat)r,(GLfloat)g,(GLfloat)b,(GLfloat)a);
+
+void
+glClearIndex ( index )
+       double index
+       CODE:
+               glClearIndex(index);
+
+void
+glClearDepth ( depth )
+       double depth
+       CODE:
+               glClearDepth(depth);
+
+void
+glClearStencil ( s )
+       int s
+       CODE:
+               glClearStencil(s);
+
+void
+glClearAccum ( r, g, b, a )
+       double r
+       double g
+       double b
+       double a
+       CODE:
+               glClearAccum((GLfloat)r,(GLfloat)g,(GLfloat)b,(GLfloat)a);
+
+void
+glClear ( m )
+       GLbitfield m
+       CODE:
+               glClear(m);
+
+void
+glFlush ()
+       CODE:
+               glFlush();
+
+void
+glFinish ()
+       CODE:
+               glFinish();
+
+void
+glRect ( r )
+       SDL_Rect* r
+       CODE:
+               glRecti(r->x,r->y,r->x+r->w,r->y+r->h);
+
+void
+glVertex ( x, y, ... )
+       double x
+       double y
+       CODE:
+               double z,w;
+               if ( items == 4 ) {
+                       w = SvNV(ST(3));
+                       z = SvNV(ST(2));
+                       glVertex4d(x,y,z,w);    
+               } else if ( items == 3 ) {
+                       z = SvNV(ST(2));
+                       glVertex3d(x,y,z);      
+               } else {
+                       glVertex2d(x,y);
+               }
+               
+void
+glBegin ( mode )
+       GLenum mode
+       CODE:
+               glBegin(mode);
+
+void
+glEnd ()
+       CODE:
+               glEnd();
+
+void
+glEnable ( cap )
+       GLenum cap
+       CODE:
+               glEnable(cap);
+
+void
+glDisable ( cap )
+       GLenum cap
+       CODE:
+               glDisable(cap);
+
+void 
+glGet ( param )
+        GLenum param
+    PPCODE:
+        switch (param) {
+        case GL_EDGE_FLAG_ARRAY:
+        case GL_MAP1_TEXTURE_COORD_1:
+        case GL_LIGHT_MODEL_TWO_SIDE:
+        case GL_INDEX_LOGIC_OP:
+        case GL_PACK_ALIGNMENT:
+        case GL_CLIP_PLANE4:
+        case GL_TEXTURE_GEN_S:
+        case GL_MAP1_VERTEX_3:
+        case GL_LIGHT6:
+        case GL_LIGHT0:
+        case GL_NORMAL_ARRAY:
+        case GL_EDGE_FLAG:
+        case GL_INDEX_ARRAY:
+        case GL_AUTO_NORMAL:
+        case GL_POLYGON_OFFSET_FILL:
+        case GL_MAP1_TEXTURE_COORD_4:
+        case GL_FOG:
+        case GL_LIGHT2:
+        case GL_UNPACK_SWAP_BYTES:
+        case GL_RGBA_MODE:
+        case GL_POLYGON_OFFSET_POINT:
+        case GL_POINT_SMOOTH:
+        case GL_ALPHA_TEST:
+        case GL_MAP2_TEXTURE_COORD_4:
+        case GL_COLOR_ARRAY:
+        case GL_POLYGON_OFFSET_LINE:
+        case GL_MAP2_NORMAL:
+        case GL_MAP1_INDEX:
+        case GL_PACK_LSB_FIRST:
+        case GL_MAP1_TEXTURE_COORD_2:
+        case GL_MAP2_VERTEX_3:
+        case GL_MAP2_TEXTURE_COORD_2:
+        case GL_CULL_FACE:
+        case GL_DOUBLEBUFFER:
+        case GL_UNPACK_LSB_FIRST:
+        case GL_TEXTURE_COORD_ARRAY:
+        case GL_LIGHT1:
+        case GL_TEXTURE_GEN_Q:
+        case GL_MAP_STENCIL:
+        case GL_TEXTURE_1D:
+        case GL_LIGHT4:
+        case GL_LIGHTING:
+        case GL_LIGHT7:
+        case GL_MAP1_NORMAL:
+        case GL_CLIP_PLANE0:
+        case GL_TEXTURE_GEN_R:
+        case GL_PACK_SWAP_BYTES:
+        case GL_DEPTH_WRITEMASK:
+        case GL_COLOR_LOGIC_OP:
+        case GL_CLIP_PLANE5:
+        case GL_NORMALIZE:
+        case GL_TEXTURE_2D:
+        case GL_CLIP_PLANE3:
+        case GL_COLOR_MATERIAL:
+        case GL_BLEND:
+        case GL_CLIP_PLANE2:
+        case GL_MAP1_VERTEX_4:
+        case GL_DITHER:
+        case GL_CLIP_PLANE1:
+        case GL_MAP2_INDEX:
+        case GL_POLYGON_SMOOTH:
+        case GL_STEREO:
+        case GL_MAP2_COLOR_4:
+        case GL_LIGHT3:
+        case GL_VERTEX_ARRAY:
+        case GL_MAP1_TEXTURE_COORD_3:
+        case GL_STENCIL_TEST:
+        case GL_MAP2_TEXTURE_COORD_3:
+        case GL_TEXTURE_GEN_T:
+        case GL_LIGHT_MODEL_LOCAL_VIEWER:
+        case GL_LINE_SMOOTH:
+        case GL_MAP1_COLOR_4:
+        case GL_MAP2_TEXTURE_COORD_1:
+        case GL_CURRENT_RASTER_POSITION_VALID:
+        case GL_INDEX_MODE:
+        case GL_SCISSOR_TEST:
+        case GL_MAP_COLOR:
+        case GL_POLYGON_STIPPLE:
+        case GL_LIGHT5:
+        case GL_DEPTH_TEST:
+        case GL_LINE_STIPPLE:
+        case GL_MAP2_VERTEX_4:
+        {
+            GLboolean ret[1];
+            int i;
+            glGetBooleanv(param, ret);
+
+            for (i = 0; i < 1; i++) {
+                XPUSHs(sv_2mortal(newSViv(ret[i])));
+            }
+            break;
+        }
+        case GL_COLOR_WRITEMASK:
+        {
+            GLboolean ret[4];
+            int i;
+            glGetBooleanv(param, ret);
+
+            for (i = 0; i < 4; i++) {
+                XPUSHs(sv_2mortal(newSViv(ret[i])));
+            }
+            break;
+        }
+        case GL_ZOOM_Y:
+        case GL_ALPHA_TEST_REF:
+        case GL_POINT_SIZE_GRANULARITY:
+        case GL_CURRENT_RASTER_DISTANCE:
+        case GL_ALPHA_SCALE:
+        case GL_RED_BIAS:
+        case GL_DEPTH_BIAS:
+        case GL_FOG_DENSITY:
+        case GL_GREEN_BIAS:
+        case GL_DEPTH_CLEAR_VALUE:
+        case GL_ALPHA_BIAS:
+        case GL_FOG_END:
+        case GL_GREEN_SCALE:
+        case GL_BLUE_BIAS:
+        case GL_DEPTH_SCALE:
+        case GL_POINT_SIZE:
+        case GL_POLYGON_OFFSET_FACTOR:
+        case GL_ZOOM_X:
+        case GL_FOG_START:
+        case GL_POLYGON_OFFSET_UNITS:
+        case GL_LINE_WIDTH:
+        case GL_LINE_WIDTH_GRANULARITY:
+        case GL_BLUE_SCALE:
+        case GL_RED_SCALE:
+        {
+            GLdouble ret[1];
+            int i;
+            glGetDoublev(param, ret);
+
+            for (i = 0; i < 1; i++) {
+                XPUSHs(sv_2mortal(newSVnv(ret[i])));
+            }
+            break;
+        }
+        case GL_MODELVIEW_MATRIX:
+        case GL_TEXTURE_MATRIX:
+        case GL_PROJECTION_MATRIX:
+        {
+            GLdouble ret[16];
+            int i;
+            glGetDoublev(param, ret);
+
+            for (i = 0; i < 16; i++) {
+                XPUSHs(sv_2mortal(newSVnv(ret[i])));
+            }
+            break;
+        }
+        case GL_POINT_SIZE_RANGE:
+        case GL_LINE_WIDTH_RANGE:
+        case GL_MAP1_GRID_DOMAIN:
+        case GL_DEPTH_RANGE:
+        {
+            GLdouble ret[2];
+            int i;
+            glGetDoublev(param, ret);
+
+            for (i = 0; i < 2; i++) {
+                XPUSHs(sv_2mortal(newSVnv(ret[i])));
+            }
+            break;
+        }
+        case GL_CURRENT_NORMAL:
+        {
+            GLdouble ret[3];
+            int i;
+            glGetDoublev(param, ret);
+
+            for (i = 0; i < 3; i++) {
+                XPUSHs(sv_2mortal(newSVnv(ret[i])));
+            }
+            break;
+        }
+        case GL_FOG_COLOR:
+        case GL_MAP2_GRID_DOMAIN:
+        case GL_CURRENT_RASTER_POSITION:
+        case GL_CURRENT_COLOR:
+        case GL_LIGHT_MODEL_AMBIENT:
+        case GL_CURRENT_RASTER_TEXTURE_COORDS:
+        case GL_TEXTURE_ENV_COLOR:
+        case GL_CURRENT_RASTER_COLOR:
+        case GL_CURRENT_TEXTURE_COORDS:
+        case GL_COLOR_CLEAR_VALUE:
+        case GL_ACCUM_CLEAR_VALUE:
+        {
+            GLdouble ret[4];
+            int i;
+            glGetDoublev(param, ret);
+
+            for (i = 0; i < 4; i++) {
+                XPUSHs(sv_2mortal(newSVnv(ret[i])));
+            }
+            break;
+        }
+        case GL_CULL_FACE_MODE:
+        case GL_PIXEL_MAP_I_TO_A_SIZE:
+        case GL_PIXEL_MAP_A_TO_A_SIZE:
+        case GL_BLUE_BITS:
+        case GL_EDGE_FLAG_ARRAY_STRIDE:
+        case GL_RENDER_MODE:
+        case GL_FOG_MODE:
+        case GL_DEPTH_FUNC:
+        case GL_READ_BUFFER:
+        case GL_POINT_SMOOTH_HINT:
+        case GL_PACK_SKIP_PIXELS:
+        case GL_STENCIL_REF:
+        case GL_STENCIL_CLEAR_VALUE:
+        case GL_AUX_BUFFERS:
+        case GL_COLOR_MATERIAL_PARAMETER:
+        case GL_ACCUM_BLUE_BITS:
+        case GL_INDEX_SHIFT:
+        case GL_VERTEX_ARRAY_STRIDE:
+        case GL_STENCIL_PASS_DEPTH_PASS:
+        case GL_CLIENT_ATTRIB_STACK_DEPTH:
+        case GL_DRAW_BUFFER:
+        case GL_LINE_STIPPLE_REPEAT:
+        case GL_BLEND_SRC:
+        case GL_PIXEL_MAP_B_TO_B_SIZE:
+        case GL_MAX_PIXEL_MAP_TABLE:
+        case GL_MAX_TEXTURE_SIZE:
+        case GL_PIXEL_MAP_S_TO_S_SIZE:
+        case GL_LOGIC_OP_MODE:
+        case GL_DEPTH_BITS:
+        case GL_GREEN_BITS:
+        case GL_LINE_SMOOTH_HINT:
+        case GL_ALPHA_TEST_FUNC:
+        case GL_MAX_LIGHTS:
+        case GL_FOG_HINT:
+        case GL_MAX_NAME_STACK_DEPTH:
+        case GL_INDEX_ARRAY_TYPE:
+        case GL_TEXTURE_COORD_ARRAY_TYPE:
+        case GL_COLOR_ARRAY_TYPE:
+        case GL_MAX_LIST_NESTING:
+        case GL_STENCIL_WRITEMASK:
+        case GL_LIST_BASE:
+        case GL_ACCUM_ALPHA_BITS:
+        case GL_INDEX_ARRAY_STRIDE:
+        case GL_PIXEL_MAP_I_TO_B_SIZE:
+        case GL_INDEX_BITS:
+        case GL_STENCIL_FAIL:
+        case GL_UNPACK_ALIGNMENT:
+        case GL_STENCIL_PASS_DEPTH_FAIL:
+        case GL_ATTRIB_STACK_DEPTH:
+        case GL_PACK_SKIP_ROWS:
+        case GL_TEXTURE_STACK_DEPTH:
+        case GL_MATRIX_MODE:
+        case GL_COLOR_ARRAY_STRIDE:
+        case GL_LIST_MODE:
+        case GL_UNPACK_SKIP_PIXELS:
+        case GL_PIXEL_MAP_G_TO_G_SIZE:
+        case GL_VERTEX_ARRAY_TYPE:
+        case GL_RED_BITS:
+        case GL_MAX_CLIENT_ATTRIB_STACK_DEPTH:
+        case GL_INDEX_CLEAR_VALUE:
+        case GL_PIXEL_MAP_I_TO_G_SIZE:
+        case GL_ALPHA_BITS:
+        case GL_PIXEL_MAP_I_TO_R_SIZE:
+        case GL_COLOR_ARRAY_SIZE:
+        case GL_TEXTURE_COORD_ARRAY_SIZE:
+        case GL_MAP1_GRID_SEGMENTS:
+        case GL_VERTEX_ARRAY_SIZE:
+        case GL_PIXEL_MAP_R_TO_R_SIZE:
+        case GL_TEXTURE_COORD_ARRAY_STRIDE:
+        case GL_MODELVIEW_STACK_DEPTH:
+        case GL_MAX_TEXTURE_STACK_DEPTH:
+        case GL_PIXEL_MAP_I_TO_I_SIZE:
+        case GL_FOG_INDEX:
+        case GL_INDEX_WRITEMASK:
+        case GL_PACK_ROW_LENGTH:
+        case GL_CURRENT_INDEX:
+        case GL_STENCIL_VALUE_MASK:
+        case GL_UNPACK_SKIP_ROWS:
+        case GL_MAX_PROJECTION_STACK_DEPTH:
+        case GL_LIST_INDEX:
+        case GL_STENCIL_FUNC:
+        case GL_INDEX_OFFSET:
+        case GL_UNPACK_ROW_LENGTH:
+        case GL_COLOR_MATERIAL_FACE:
+        case GL_NORMAL_ARRAY_TYPE:
+        case GL_STENCIL_BITS:
+        case GL_PROJECTION_STACK_DEPTH:
+        case GL_CURRENT_RASTER_INDEX:
+        case GL_SHADE_MODEL:
+        case GL_TEXTURE_ENV_MODE:
+        case GL_NORMAL_ARRAY_STRIDE:
+        case GL_PERSPECTIVE_CORRECTION_HINT:
+        case GL_MAX_CLIP_PLANES:
+        case GL_MAX_MODELVIEW_STACK_DEPTH:
+        case GL_SUBPIXEL_BITS:
+        case GL_ACCUM_RED_BITS:
+        case GL_BLEND_DST:
+        case GL_FRONT_FACE:
+        case GL_MAX_EVAL_ORDER:
+        case GL_LINE_STIPPLE_PATTERN:
+        case GL_NAME_STACK_DEPTH:
+        case GL_MAX_ATTRIB_STACK_DEPTH:
+        case GL_POLYGON_SMOOTH_HINT:
+        case GL_ACCUM_GREEN_BITS:
+        {
+            GLint ret[1];
+            int i;
+            glGetIntegerv(param, ret);
+
+            for (i = 0; i < 1; i++) {
+                XPUSHs(sv_2mortal(newSViv(ret[i]))); 
+            }
+            break;
+        }
+        case GL_POLYGON_MODE:
+        case GL_MAX_VIEWPORT_DIMS:
+        case GL_MAP2_GRID_SEGMENTS:
+        {
+            GLint ret[2];
+            int i;
+            glGetIntegerv(param, ret);
+
+            for (i = 0; i < 2; i++) {
+                XPUSHs(sv_2mortal(newSViv(ret[i]))); 
+            }
+            break;
+        }
+        case GL_SCISSOR_BOX:
+        case GL_VIEWPORT:
+        {
+            GLint ret[4];
+            int i;
+            glGetIntegerv(param, ret);
+
+            for (i = 0; i < 4; i++) {
+                XPUSHs(sv_2mortal(newSViv(ret[i]))); 
+            }
+            break;
+        }
+        default:
+            croak("Unknown glGet parameter!");
+        }
+
+
+Uint32
+glIsEnabled ( cap )
+       Uint32 cap
+       CODE:
+               RETVAL = glIsEnabled(cap);
+       OUTPUT:
+               RETVAL
+
+void
+glPointSize ( size )
+       double size
+       CODE:
+               glPointSize((GLfloat)size);
+
+void
+glLineWidth ( size )
+       double size
+       CODE:
+               glLineWidth((GLfloat)size);
+
+void
+glLineStipple ( factor, pattern )
+       Sint32 factor
+       Uint16 pattern
+       CODE:
+               glLineStipple(factor,pattern);
+
+void
+glPolygonMode ( face, mode )
+       GLenum face
+       GLenum mode
+       CODE:
+               glPolygonMode(face,mode);
+
+void
+glFrontFace ( mode )
+       GLenum mode
+       CODE:
+               glFrontFace(mode);
+
+void
+glCullFace ( mode )
+       GLenum mode
+       CODE:
+               glCullFace(mode);
+
+void
+glPolygonStipple ( mask )
+       char *mask
+       CODE:
+               glPolygonStipple(mask);
+
+void
+glEdgeFlag ( flag )
+       GLenum flag
+       CODE:
+               glEdgeFlag(flag);
+
+void
+glNormal ( x, y, z )
+       double x
+       double y
+       double z
+       CODE:
+               glNormal3d(x,y,z);
+
+void
+glEnableClientState ( array )
+       GLenum array
+       CODE:
+               glEnableClientState(array);
+
+void
+glDisableClientState ( array )
+       GLenum array
+       CODE:
+               glDisableClientState(array);
+
+void
+glVertexPointer ( size, type, stride, pointer)
+       int size
+       GLenum type
+       Uint32 stride
+       char *pointer
+       CODE:
+               glVertexPointer(size,type,stride,pointer);
+
+void
+glColorPointer ( size, type, stride, pointer )
+       Sint32 size
+       GLenum type
+       Uint32 stride
+       char *pointer
+       CODE:
+               glColorPointer(size,type,stride,pointer);
+
+void
+glNormalPointer ( type, stride, pointer )
+       GLenum type
+       Uint32 stride
+       char *pointer
+       CODE:
+               glNormalPointer(type,stride,pointer);
+
+void
+glTexCoordPointer ( size, type, stride, pointer )
+       Sint32 size
+       GLenum type
+       Uint32 stride
+       char *pointer
+       CODE:
+               glTexCoordPointer(size,type,stride,pointer);
+
+void
+glEdgeFlagPointer ( stride, pointer )
+       Uint32 stride
+       char *pointer
+       CODE:
+               glEdgeFlagPointer(stride,pointer);
+
+void
+glArrayElement ( ith )
+       Uint32 ith
+       CODE:
+               glArrayElement(ith);
+
+void
+glDrawElements ( mode, count, type, indices )
+       GLenum mode
+       Uint32 count
+       GLenum type
+       char *indices
+       CODE:
+               glDrawElements( mode, count, type, indices);
+
+void
+glDrawRangeElements ( mode, start, end, count, type, indices )
+       GLenum mode
+       Uint32 start
+       Uint32 end
+       Uint32 count
+       GLenum type
+       char *indices
+       CODE:
+               glDrawRangeElements(mode,start,end,count,type,indices);
+
+void
+glDrawArrays ( mode, first, count )
+       GLenum mode
+       Uint32 first
+       Uint32 count
+       CODE:
+               glDrawArrays(mode,first,count);
+
+void
+glInterleavedArrays ( format, stride, pointer )
+       GLenum format
+       Uint32 stride
+       char *pointer
+       CODE:
+               glInterleavedArrays(format,stride,pointer);
+
+void
+glPushAttrib ( mask )
+       GLbitfield mask
+       CODE:
+               glPushAttrib(mask);
+
+void
+glPopAttrib ()
+       CODE:
+               glPopAttrib();
+
+void
+glPushClientAttrib ( mask )
+       GLbitfield mask
+       CODE:
+               glPushClientAttrib(mask);
+
+void
+glPopClientAttrib ()
+       CODE:
+               glPopClientAttrib();
+
+void
+glMatrixMode ( mode )
+       GLenum mode
+       CODE:
+               glMatrixMode(mode);
+
+void
+glLoadIdentity ()
+       CODE:
+               glLoadIdentity();
+
+void
+glLoadMatrix (  ... )
+       CODE:
+               int i;
+               double mat[16];
+               for ( i = 0; i < 16; i++ ) {
+                       mat[i] = (i < items  && SvNOK(ST(i)) ? SvNV(ST(i)) : 0.0 );
+               }
+               glLoadMatrixd(mat);
+
+void
+glMultMatrix ( ... )
+       CODE:
+               int i;
+               double mat[16];
+               for ( i = 0; i < 16; i++ ) {
+                       mat[i] = (i < items  && SvNOK(ST(i)) ? SvNV(ST(i)) : 0.0 );
+               }
+               glMultMatrixd(mat);
+
+void
+glTranslate ( x, y, z )
+       double x
+       double y
+       double z
+       CODE:
+               glTranslated(x,y,z);
+
+void
+glRotate ( angle, x, y, z )
+       double angle
+       double x
+       double y
+       double z
+       CODE:
+               glRotated(angle,x,y,z);
+
+void
+glScale ( x, y, z )
+       double x
+       double y
+       double z
+       CODE:
+               glScaled(x,y,z);
+
+void
+glFrustum ( left, right, bottom, top, n, f )
+       double left
+       double right
+       double bottom
+       double top
+       double n
+       double f
+       CODE:
+               glFrustum(left,right,bottom,top,n,f);
+
+void
+glOrtho ( left, right, bottom, top, n, f )
+       double left
+       double right
+       double bottom
+       double top
+       double n
+       double f
+       CODE:
+               glOrtho(left,right,bottom,top,n,f);
+
+void
+glViewport ( x, y, width, height )
+       Sint32 x
+       Sint32 y
+       Uint32 width
+       Uint32 height
+       CODE:
+               glViewport(x,y,width,height);
+
+void
+glDepthRange ( n, f )
+       double n
+       double f
+       CODE:
+               glDepthRange(n,f);
+
+void
+glPushMatrix ()
+       CODE:
+               glPushMatrix();
+
+void
+glPopMatrix ()
+       CODE:
+               glPopMatrix();
+
+void
+glClipPlane ( plane, ... )
+       GLenum plane
+       CODE:
+               double v[4];
+               int i;
+               for (i = 0; i < 4; i++ ) {
+                       v[i] = (i+1 < items && SvNOK(ST(i+1))) ? SvNV(ST(i+1)) : 0.0;
+               }
+               glClipPlane(plane,v);
+       
+void
+glColor ( r, g, b, ... )
+       double r        
+       double g
+       double b        
+       CODE:
+               if ( items == 4 ) {
+                       double a;
+                       a = SvNV(ST(3));
+                       glColor4d(r,g,b,a);
+               } else {
+                       glColor3d(r,g,b);       
+               }
+
+void
+glIndex ( c )
+       Uint32 c
+       CODE:
+               glIndexi(c);
+
+void
+glShadeModel ( mode )
+       GLenum mode
+       CODE:
+               glShadeModel(mode);
+
+void
+glLight ( light, name, ... )
+       GLenum light
+       GLenum name
+       CODE:
+               int i;
+               if ( items == 6 ) {
+                       float v[4];     
+                       for ( i = 0; i < 4; i++ ) {
+                               v[i] = (SvNOK(ST(i+2))) ? SvNV(ST(i+2)) : 0.0;
+                       }
+                       glLightfv(light,name,v);        
+               } else if ( items == 5 ) {
+                       float v[3];
+                       for ( i = 0; i < 3; i++ ) {
+                               v[i] = (SvNOK(ST(i+2))) ? SvNV(ST(i+2)) : 0.0;
+                       }
+                       glLightfv(light,name,v);        
+               } else if ( items == 3 ) {
+                       float v;
+                       v = SvNV(ST(2));
+                       glLightf(light,name,v);
+               } else {
+                       Perl_croak(aTHX_ "SDL::OpenGL::Light invalid arguments");
+               }
+
+void 
+glLightModel ( pname, ... )
+       GLenum pname
+       CODE:
+               GLfloat vec[4];
+               if ( pname == GL_LIGHT_MODEL_LOCAL_VIEWER ||
+                       pname == GL_LIGHT_MODEL_TWO_SIDE ||
+                       pname == GL_LIGHT_MODEL_COLOR_CONTROL ) {
+                       glLightModelf(pname,SvNV(ST(1)));
+               } else if ( pname == GL_LIGHT_MODEL_AMBIENT) {
+                       vec[0] = SvNV(ST(1));
+                       vec[1] = SvNV(ST(2));
+                       vec[2] = SvNV(ST(3));
+                       vec[3] = SvNV(ST(4));
+                       glLightModelfv(pname,vec);
+               } else {
+                       Perl_croak(aTHX_ "SDL::OpenGL::glLightModel unknown model %d",pname);
+               }
+
+void
+glMaterial ( face, name, ... )
+       GLenum face
+       GLenum name
+       CODE:
+               int i;
+               if ( items == 6 ) {
+                       float v[4];
+                       for ( i = 0; i < 4; i++ ) {
+                               v[i] = (SvNOK(ST(i+2))) ? SvNV(ST(i+2)) : 0.0;
+                       }
+                       glMaterialfv(face,name,v);
+               } else if ( items == 5 ) {
+                       float v[3];
+                       for ( i = 0; i < 4; i++ ) {
+                               v[i] = (SvNOK(ST(i+2))) ? SvNV(ST(i+2)) : 0.0;
+                       }
+                       glMaterialfv(face,name,v);
+               } else if ( items == 3 ) {      
+                       float v;
+                       v = SvNV(ST(2));
+                       glMaterialf(face,name,v);
+               } else {
+                       Perl_croak(aTHX_ "SDL::OpenGL::Material invalid arguments");
+               }
+
+void
+glColorMaterial ( face, mode )
+       GLenum face
+       GLenum mode
+       CODE:
+               glColorMaterial(face,mode);
+
+void
+glBlendFunc ( sfactor, dfactor )
+       GLenum sfactor
+       GLenum dfactor
+       CODE:
+               glBlendFunc(sfactor,dfactor);
+
+
+void
+glHint ( target, hint )
+       GLenum target
+       GLenum hint
+       CODE:
+               glHint(target,hint);    
+
+void
+glFog ( name, ... )
+       GLenum name
+       CODE:
+               if ( items == 5 )  {
+                       float v[4];
+                       v[0] = SvNV(ST(1));     
+                       v[1] = SvNV(ST(2));     
+                       v[2] = SvNV(ST(3));     
+                       v[3] = SvNV(ST(4));     
+                       glFogfv(name,v);
+               } else if ( items == 2 ) {
+                       float v;
+                       v = SvNV(ST(1));
+                       glFogf(name,v);
+               } else {
+                       Perl_croak(aTHX_ "SDL::OpenGL::Material invalid arguments");
+               }
+
+void
+glPolygonOffset ( factor, units )
+       double factor
+       double units
+       CODE:
+               glPolygonOffset(factor,units);
+
+Uint32
+glGenLists ( range )
+       Uint32 range
+       CODE:
+               RETVAL = glGenLists(range);
+       OUTPUT:
+               RETVAL
+
+void
+glNewList ( list, mode )
+       Uint32 list
+       GLenum mode
+       CODE:
+               glNewList(list,mode);
+
+void
+glEndList ()
+       CODE:
+               glEndList();
+
+void
+glDeleteLists ( base, count )
+        Uint32 base
+        Uint32 count
+        CODE:
+                glDeleteLists(base, count);
+
+void
+glCallList ( list )
+       Uint32 list
+       CODE:
+               glCallList(list);
+
+Uint32
+glIsList ( list )
+       Uint32 list
+       CODE:
+               RETVAL = glIsList(list);
+       OUTPUT:
+               RETVAL
+
+void
+glListBase ( base )
+       Uint32 base
+       CODE:
+               glListBase(base);
+
+void
+glCallLists ( ... )
+       CODE:
+               int *i, j;      
+               if ( items > 0 ) {
+                       i = (int*)safemalloc(sizeof(int)* (items));
+                       for ( j = 0; j < items; j++ ) {
+                               i[j] = SvIV(ST(j));
+                       } 
+               } else {
+                       Perl_croak(aTHX_ "usage: SDL::OpenGL::CallLists(type,...)");
+               }
+               glCallLists(items, GL_INT, i);
+               safefree(i);
+
+void
+glCallListsString ( string )
+       SV* string
+       CODE:
+               char *str;
+               STRLEN len;
+               str = SvPV(string,len);
+               glCallLists(len,GL_BYTE,str);
+
+void
+glRasterPos ( x, y, z, ... )
+       double x
+       double y
+       double z
+       CODE:
+               if ( items == 4 ) {
+                       double w = SvNV(ST(3));
+                       glRasterPos4d(x,y,z,w);
+               } else {
+                       glRasterPos3d(x,y,z);
+               }
+
+void
+glBitmap ( width, height, x1, y1, x2, y2, data )
+       Uint32 width
+       Uint32 height
+       double x1
+       double y1
+       double x2
+       double y2
+       char *data
+       CODE:
+               glBitmap(width,height,x1,y1,x2,y2,data);
+
+void
+glDrawPixels ( width, height, format, type, pixels )
+       Uint32 width
+       Uint32 height
+       GLenum format
+       GLenum type
+       char *pixels
+       CODE:
+               glDrawPixels(width,height,format,type,pixels);
+
+
+SV*
+glReadPixels ( x, y, width, height, format, type )
+        Uint32 x
+        Uint32 y
+        Uint32 height
+        Uint32 width
+        GLenum format
+        GLenum type
+        CODE:
+                int len, size;
+                char *buf;
+                size = 1;       /* ALPHA, BLUE, GREEN or RED */
+                if (format == GL_BGR || format == GL_RGB) 
+                        size = 3;
+                if (format == GL_BGRA || format == GL_RGBA) 
+                        size = 4;
+                len = height * width * size;            /* in bytes */
+                RETVAL = newSV(len);                    /* alloc len+1 bytes */
+                SvPOK_on(RETVAL);                       /* make an PV */
+                buf = SvPVX(RETVAL);                    /* get ptr to buffer */
+                glReadPixels(x,y,width,height,format,type,buf);
+                SvCUR_set(RETVAL, len);                 /* set real length */
+        OUTPUT:
+                RETVAL
+                                                                                                                                                            
+AV*
+glReadPixel ( x, y )
+        Uint32 x
+        Uint32 y
+        CODE:
+                int rgba[4];    /* r,g,b,a */
+                int i;
+                glReadPixels(x,y,1,1,GL_RGBA,GL_UNSIGNED_INT,rgba);
+                RETVAL = newAV();
+                for ( i = 0; i < 4; i++ ) {
+                        av_push(RETVAL,newSViv(rgba[i]));
+                }
+        OUTPUT:
+                RETVAL
+
+void
+glCopyPixels ( x, y, width, height, buffer )
+       Sint32 x
+       Sint32 y
+       Uint32 width
+       Uint32 height
+       GLenum buffer
+       CODE:
+               glCopyPixels(x,y,width,height,buffer);
+
+void
+glPixelStore ( name, param )
+       Sint32 name
+       double param
+       CODE:
+               glPixelStorei(name,param);
+
+void
+glPixelTransfer ( name, ... )
+       GLenum name
+       CODE:
+               switch ( name ) {
+                       case GL_MAP_COLOR:
+                       case GL_MAP_STENCIL:
+                       case GL_INDEX_SHIFT:
+                       case GL_INDEX_OFFSET:
+                               glPixelTransferi(name,SvIV(ST(1)));
+                               break;
+                       default:
+                               glPixelTransferf(name,SvNV(ST(1)));
+                               break;
+               }
+
+void
+glPixelMap ( type, map, mapsize, values )
+       GLenum type
+       GLenum map
+       Sint32 mapsize
+       char *values
+       CODE:
+               switch (type) {
+                       case GL_UNSIGNED_INT: 
+                               glPixelMapuiv(map,mapsize,(GLint*)values);
+                               break;
+                       case GL_UNSIGNED_SHORT:
+                               glPixelMapusv(map,mapsize,(GLushort*)values);
+                               break;
+                       case GL_FLOAT:
+                               glPixelMapfv(map,mapsize,(GLfloat*)values);
+                               break;
+               }
+               
+void
+glPixelZoom ( zoomx, zoomy )
+       double zoomx
+       double zoomy
+       CODE:
+               glPixelZoom(zoomx,zoomy);
+
+#ifdef GL_VERSION_1_3
+
+void
+glColorTable ( target, internalFormat, width, format, type, data )
+       GLenum target 
+       GLenum internalFormat
+       Uint32 width
+       GLenum format
+       GLenum type
+       char *data
+       CODE:
+               glColorTable(target,internalFormat,width,format,type,data);
+
+void
+glColorTableParameter ( target, name, r, g, b, a)
+       GLenum target
+       GLenum name
+       double r
+       double g
+       double b
+       double a
+       CODE:
+               GLfloat vec[4];
+               vec[0] = r;
+               vec[1] = g;
+               vec[2] = b;
+               vec[3] = a;
+               glColorTableParameterfv(target,name,vec);
+
+void
+glCopyColorTable ( target, internalFormat, x, y, width )
+       GLenum target
+       GLenum internalFormat
+       Sint32 x
+       Sint32 y
+       Uint32 width
+       CODE:
+               glCopyColorTable(target,internalFormat,x,y,width);
+
+void
+glColorSubTable ( target, start, count, format, type, data )
+       Uint32 target
+       Uint32 start
+       Uint32 count
+       Uint32 format
+       Uint32 type
+       char *data
+       CODE:
+               glColorSubTable(target,start,count,format,type,data);
+
+void
+glCopyColorSubTable ( target, start, x, y, count )
+       Uint32 target
+       Uint32 start
+       Sint32 x
+       Sint32 y
+       Uint32 count
+       CODE:
+               glCopyColorSubTable(target,start,x,y,count);
+
+void
+glConvolutionFilter2D ( target, internalFormat, width, height, format, type, image )
+       Uint32 target
+       Uint32 internalFormat
+       Uint32 width
+       Uint32 height
+       Uint32 format
+       Uint32 type
+       char *image
+       CODE:
+               glConvolutionFilter2D(target,internalFormat,width,height,format,type,image);
+
+void
+glCopyConvolutionFilter2D ( target, internalFormat, x, y, width, height )
+       Uint32 target
+       Uint32 internalFormat
+       Sint32 x
+       Sint32 y
+       Uint32 width
+       Uint32 height
+       CODE:
+               glCopyConvolutionFilter2D(target,internalFormat,x,y,width,height);
+
+void
+glSeparableFilter2D ( target, internalFormat, width, height, format, type, row, column )
+       Uint32 target
+       Uint32 internalFormat
+       Uint32 width
+       Uint32 height
+       Uint32 format
+       Uint32 type
+       char *row
+       char *column
+       CODE:
+               glSeparableFilter2D(target,internalFormat,width,height,format,type,row,column);
+
+void
+glConvolutionFilter1D ( target, internalFormat, width, format, type, image )
+       Uint32 target
+       Uint32 internalFormat
+       Uint32 width
+       Uint32 format
+       Uint32 type
+       char *image
+       CODE:
+               glConvolutionFilter1D(target,internalFormat,width,format,type,image);
+
+void
+glCopyConvolutionFilter1D ( target, internalFormat, x, y, width )
+       Uint32 target
+       Uint32 internalFormat
+       Sint32 x
+       Sint32 y
+       Uint32 width
+       CODE:
+               glCopyConvolutionFilter1D(target,internalFormat,x,y,width);
+
+void
+glConvolutionParameter ( target, pname, ... )
+       Uint32 target
+       Uint32 pname
+       CODE:
+               Uint32 pi;
+               GLfloat pv[4];
+               switch(pname) { 
+               case GL_CONVOLUTION_BORDER_MODE:
+                       if ( items != 3 ) 
+                               Perl_croak(aTHX_ "Usage: ConvolutionParameter(target,pname,...)");
+                       pi = SvIV(ST(2));
+                       glConvolutionParameteri(target,pname,pi);
+                       break;
+               case GL_CONVOLUTION_FILTER_SCALE:
+               case GL_CONVOLUTION_FILTER_BIAS:
+                       if ( items != 6 ) 
+                               Perl_croak(aTHX_ "Usage: ConvolutionParameter(target,pname,...)");
+                       pv[0] = (GLfloat)SvNV(ST(2));
+                       pv[1] = (GLfloat)SvNV(ST(3));
+                       pv[2] = (GLfloat)SvNV(ST(4));
+                       pv[3] = (GLfloat)SvNV(ST(5));
+                       glConvolutionParameterfv(target,pname,pv);
+                       break;
+               default:
+                       Perl_croak(aTHX_ "ConvolutionParameter invalid parameter");
+                       break;
+               }
+
+void 
+glHistogram ( target, width, internalFormat, sink )
+       Uint32 target
+       Uint32 width
+       Uint32 internalFormat
+       GLboolean sink
+       CODE:
+               glHistogram(target,width,internalFormat,sink);
+
+void
+glGetHistogram ( target, reset, format, type, values )
+       Uint32 target 
+       GLboolean reset
+       Uint32 format
+       Uint32 type
+       char *values
+       CODE:
+               glGetHistogram(target,reset,format,type,values);
+
+void
+glResetHistogram ( target )
+       Uint32 target
+       CODE:
+               glResetHistogram(target);
+
+void
+glMinmax ( target, internalFormat, sink )
+       Uint32 target
+       Uint32 internalFormat
+       GLboolean sink
+       CODE:
+               glMinmax(target,internalFormat,sink);
+
+void
+glGetMinmax ( target, reset, format, type, values )
+       Uint32 target
+       GLboolean reset
+       Uint32 format
+       Uint32 type
+       char *values
+       CODE:
+               glGetMinmax(target,reset,format,type,values);
+
+void
+glResetMinmax ( target )
+       Uint32 target
+       CODE:
+               glResetMinmax(target);
+
+void
+glBlendEquation ( mode )
+       Uint32 mode
+       CODE:
+               glBlendEquation(mode);
+
+#endif // GL_VERSION_1_3
+
+void
+glTexImage2D ( target, level, internalFormat, width, height, border, format, type, data )
+       GLenum target
+       Sint32 level
+       Sint32 internalFormat
+       Uint32 width
+       Uint32 height
+       Sint32 border
+       GLenum format
+       GLenum type
+       char *data
+       CODE:
+               glTexImage2D(target,level,internalFormat,width,height,border,format,type,data);
+       
+void
+glCopyTexImage2D ( target, level, internalFormat, x, y, width, height, border )
+       GLenum target
+       Sint32 level
+       Sint32 internalFormat
+       Sint32 x
+       Sint32 y
+       Uint32 width
+       Uint32 height
+       Sint32 border
+       CODE:
+               glCopyTexImage2D(target,level,internalFormat,x,y,width,height,border);
+
+void
+glTexSubImage2D ( target, level, xoffset, yoffset, width, height, format, type, data )
+       GLenum target
+       Sint32 level
+       Sint32 xoffset
+       Sint32 yoffset
+       Uint32 width
+       Uint32 height
+       GLenum format
+       GLenum type
+       char *data      
+       CODE:
+               glTexSubImage2D(target,level,xoffset,yoffset,width,height,format,type,data);
+
+void
+glCopyTexSubImage2D ( target, level, xoffset, yoffset, x, y, width, height )
+       GLenum target
+       Sint32 level
+       Sint32 xoffset
+       Sint32 yoffset
+       Sint32 x
+       Sint32 y
+       Uint32 width
+       Uint32 height
+       CODE:
+               glCopyTexSubImage2D(target,level,xoffset,yoffset,x,y,width,height);
+
+void
+glTexImage1D ( target, level, internalFormat, width, border, format, type, data )
+       GLenum target
+       Sint32 level
+       Sint32 internalFormat
+       Uint32 width
+       Sint32 border
+       GLenum format
+       GLenum type
+       char *data      
+       CODE:
+               glTexImage1D(target,level,internalFormat,width,border,format,type,data);        
+
+void
+glTexSubImage1D ( target, level, xoffset, width, format, type, data )
+       GLenum target
+       Sint32 level
+       Sint32 xoffset 
+       Uint32 width
+       GLenum format
+       GLenum type
+       char *data      
+       CODE:
+               glTexSubImage1D(target,level,xoffset,width,format,type,data);
+
+void
+glCopyTexImage1D ( target, level, internalFormat, x, y, width, border )
+       GLenum target
+       Sint32 level
+       Sint32 internalFormat
+       Sint32 x
+       Sint32 y
+       Uint32 width
+       Sint32 border
+       CODE:
+               glCopyTexImage1D(target,level,internalFormat,x,y,width,border);
+
+void
+glCopyTexSubImage1D ( target, level, xoffset, x, y, width )
+       GLenum target
+       Sint32 level
+       Sint32 xoffset
+       Sint32 x
+       Sint32 y
+       Uint32 width
+       CODE:
+               glCopyTexSubImage1D(target,level,xoffset,x,y,width);
+
+#ifdef GL_VERSION_1_3
+
+void
+glTexImage3D ( target, level, internalFormat, width, height, depth, border, format, type, data )
+       GLenum target
+       Sint32 level
+       Sint32 internalFormat
+       Uint32 width
+       Uint32 height
+       Uint32 depth
+       Sint32 border
+       GLenum format
+       GLenum type
+       char *data
+       CODE:
+               glTexImage3D(target,level,internalFormat,width,height,depth,border,format,type,data);
+
+void
+glTexSubImage3D ( target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, data )
+       GLenum target
+       Sint32 level
+       Sint32 xoffset
+       Sint32 yoffset
+       Sint32 zoffset
+       Uint32 width
+       Uint32 height
+       Uint32 depth
+       GLenum format
+       GLenum type
+       char *data
+       CODE:
+               glTexSubImage3D(target,level,xoffset,yoffset,zoffset,
+                       width,height,depth,format,type,data);
+
+void
+glCopyTexSubImage3D ( target, level, xoffset, yoffset, zoffset, x, y, width, height )
+       GLenum target
+       Sint32 level
+       Sint32 xoffset
+       Sint32 yoffset
+       Sint32 zoffset
+       Sint32 x
+       Sint32 y
+       Uint32 width
+       Uint32 height
+       CODE:
+               glCopyTexSubImage3D(target,level,xoffset,yoffset,zoffset,x,y,width,height);
+
+#endif // GL_VERSION_1_3
+
+AV*
+glGenTextures ( n )
+       Uint32 n;
+       CODE:
+               GLsizei i;
+               GLuint* names;
+               names = (GLuint*)safemalloc(sizeof(GLuint)*n);
+               RETVAL = newAV();
+               glGenTextures(n,names);
+               for ( i = 0; i < n; i++ ) {
+                       av_push(RETVAL,newSViv(names[i]));
+               }
+               safefree(names);
+       OUTPUT:
+               RETVAL
+
+GLboolean
+glIsTexture ( texture )
+       Uint32 texture
+       CODE:
+               RETVAL = glIsTexture(texture);
+       OUTPUT:
+               RETVAL
+
+void
+glBindTexture ( target, texture )
+       GLenum target
+       Uint32 texture
+       CODE:
+               glBindTexture(target,texture);
+
+void
+glDeleteTextures ( ... )
+       CODE:
+               GLuint* textures;
+               int i;
+               textures = (GLuint*)safemalloc(sizeof(GLuint) * items);
+               if ( textures ) {
+                       for ( i = 0; i < items; i++ ) {
+                               textures[i] = SvIV(ST(i));      
+                       }
+               }
+               glDeleteTextures(items,textures);
+               safefree(textures);
+                        
+AV*
+glAreTexturesResident ( ... )
+       CODE:
+               GLuint* textures;
+               GLboolean *homes;
+               int i;
+               RETVAL = newAV();
+               textures = (GLuint*)safemalloc(sizeof(GLuint) * items);
+               homes = (GLboolean*)safemalloc(sizeof(GLboolean) * items);
+               if ( textures ) {
+                       for ( i = 0; i < items; i++ ) {
+                               textures[i] = SvIV(ST(i));      
+                       }
+               }
+               if ( GL_FALSE != glAreTexturesResident(items,textures,homes)) {
+                       for (i = 0; i < items; i++ ) {
+                               av_push(RETVAL,newSViv(homes[i]));      
+                       }
+               }
+               safefree(homes);
+               safefree(textures);
+       OUTPUT:
+               RETVAL
+
+void
+glPrioritizeTextures ( n, names, priorities )
+       Uint32 n
+       char *names
+       char *priorities
+       CODE:
+               glPrioritizeTextures(n,(GLuint*)names,(const GLclampf *)priorities);
+
+void
+glTexEnv ( target, name, ... )
+       GLenum target
+       GLenum name
+       CODE:
+               float pv[4];
+               GLint p;        
+               switch(name) {
+                       case GL_TEXTURE_ENV_MODE:
+                               p = SvIV(ST(2));
+                               glTexEnvi(target,name,p);       
+                               break;
+                       case GL_TEXTURE_ENV_COLOR:
+                               pv[0] = SvNV(ST(2));
+                               pv[1] = SvNV(ST(3));
+                               pv[2] = SvNV(ST(4));
+                               pv[3] = SvNV(ST(5));
+                               glTexEnvfv(target,name,pv);
+                               break;
+               }
+
+void
+glTexCoord ( ... )
+       CODE:
+               double s,t,r,q;
+               if ( items < 1 || items > 4 ) 
+                       Perl_croak (aTHX_ "usage: SDL::OpenGL::TexCoord(s,[t,[r,[q]]])");
+               s = t = r = 0.0;
+               q = 1.0;
+               switch(items) {
+                       case 4:
+                               q = SvNV(ST(3)); 
+                       case 3:
+                               r = SvNV(ST(2)); 
+                       case 2:
+                               t = SvNV(ST(1)); 
+                       case 1:
+                               s = SvNV(ST(0));        
+               }
+               glTexCoord4d(s,t,r,q);
+
+void
+glTexParameter ( target, name, ... )
+       GLenum target
+       GLenum name
+       CODE:
+               GLfloat pv[4];
+               GLint p;
+               switch (name) {
+                       case GL_TEXTURE_BORDER_COLOR:
+                               pv[0] = SvNV(ST(2));
+                               pv[1] = SvNV(ST(3));
+                               pv[2] = SvNV(ST(4));
+                               pv[3] = SvNV(ST(5));
+                               glTexParameterfv(target,name,pv);
+                               break;
+                       case GL_TEXTURE_PRIORITY:
+                       case GL_TEXTURE_MIN_LOD:
+                       case GL_TEXTURE_MAX_LOD:
+                               pv[0] = SvNV(ST(2));
+                               glTexParameterf(target,name,pv[0]);     
+                               break;
+                       case GL_TEXTURE_BASE_LEVEL:
+                       case GL_TEXTURE_MAX_LEVEL:
+                       default:
+                               p = SvIV(ST(2));        
+                               glTexParameteri(target,name,p);
+                               break;
+               }
+
+void
+glTexGen ( coord, name, ... )
+       GLenum coord
+       GLenum name     
+       CODE:
+               GLdouble *pv;
+               GLint p;
+               int i;
+               switch (name) {
+                       case GL_TEXTURE_GEN_MODE:
+                               p = SvIV(ST(2));
+                               glTexGeni(coord,name,p);
+                               break;
+                       default:
+                               if ( items == 2 ) 
+                                       Perl_croak(aTHX_  "usage: glTexGen(coord,name,...)");
+                               pv = (GLdouble*)safemalloc(sizeof(GLdouble)*(items-2));
+                               for ( i = 0; i < items - 2; i++ ) {
+                                       pv[i] = SvNV(ST(i+2));  
+                               }
+                               glTexGendv(coord,name,pv);      
+                               safefree(pv);
+                               break;
+               }
+
+#ifdef GL_VERSION_1_3
+
+void
+glActiveTextureARB ( texUnit )
+       GLenum texUnit
+       CODE:
+               glActiveTextureARB(texUnit);
+                               
+void
+glMultiTexCoord ( texUnit,  ... )
+       Uint32 texUnit
+       CODE:
+               double s,t,r,q;
+               if ( items < 2 || items > 5 ) 
+                       Perl_croak (aTHX_ "usage: SDL::OpenGL::MultiTexCoord(tex,s,[t,[r,[q]]])");
+               s = t = r = 0.0;
+               q = 1.0;
+               switch(items) {
+                       case 5:
+                               q = SvNV(ST(3)); 
+                       case 4:
+                               r = SvNV(ST(2)); 
+                       case 3:
+                               t = SvNV(ST(1)); 
+                       case 2:
+                               s = SvNV(ST(0));        
+               }
+               glMultiTexCoord4dARB(texUnit,s,t,r,q);
+
+#endif // GL_VERSION_1_3
+
+void
+glDrawBuffer ( mode )
+       GLenum mode
+       CODE:
+               glDrawBuffer(mode);
+
+void
+glReadBuffer ( mode )
+       GLenum mode
+       CODE:
+               glReadBuffer(mode);
+
+void
+glIndexMask ( mask )
+       Uint32 mask
+       CODE:
+               glIndexMask(mask);
+
+void
+glColorMask ( red, green, blue, alpha )
+       GLboolean red
+       GLboolean green 
+       GLboolean blue 
+       GLboolean alpha 
+       CODE:
+               glColorMask(red,green,blue,alpha);
+
+void
+glDepthMask ( flag )
+       GLboolean flag
+       CODE:
+               glDepthMask(flag);
+
+void
+glStencilMask ( mask )
+       Uint32 mask
+       CODE:
+               glStencilMask(mask);
+
+void
+glScissor ( x , y, width, height )
+       Sint32 x
+       Sint32 y
+       Uint32 width
+       Uint32 height 
+       CODE:
+               glScissor(x,y,width,height);
+
+void
+glAlphaFunc ( func, ref )
+       GLenum func
+       double ref
+       CODE:
+               glAlphaFunc(func,ref);
+
+void
+glStencilFunc ( func, ref, mask )
+       GLenum func
+       Sint32 ref
+       Uint32 mask
+       CODE:
+               glStencilFunc(func,ref,mask);
+
+void
+glStencilOp ( fail, zfail, zpass )
+       GLenum fail
+       GLenum zfail
+       GLenum zpass
+       CODE:
+               glStencilOp(fail,zfail,zpass);
+
+void
+glDepthFunc ( func )
+       GLenum func
+       CODE:
+               glDepthFunc(func);
+
+void
+glLogicOp ( opcode )
+       GLenum opcode
+       CODE:
+               glLogicOp(opcode);
+
+void
+glAccum ( op, value )
+       GLenum op
+       double value
+       CODE:
+               glAccum(op,value);
+
+void
+glMap1 ( target, u1, u2, stride, order, points )
+       GLenum target
+       double u1
+       double u2
+       Sint32 stride
+       Sint32 order
+       char *points
+       CODE:
+               glMap1d(target,u1,u2,stride,order,(double*)points);
+
+void
+glEvalCoord1 ( u )
+       double u
+       CODE:
+               glEvalCoord1d(u);       
+
+void
+glMapGrid1 ( n, u1, u2 )
+       Sint32 n
+       double u1
+       double u2
+       CODE:
+               glMapGrid1d(n,u1,u2);
+
+void
+glEvalMesh1 ( mode, p1, p2 )
+       GLenum mode
+       Sint32 p1
+       Sint32 p2
+       CODE:
+               glEvalMesh1(mode,p1,p2);
+
+void
+glMap2 ( target, u1, u2, ustride, uorder, v1, v2, vstride, vorder, points )
+       GLenum target
+       double u1
+       double u2
+       Sint32 ustride
+       Sint32 uorder
+       double v1
+       double v2
+       Sint32 vstride
+       Sint32 vorder
+       char *points
+       CODE:
+               glMap2d(target,u1,u2,ustride,uorder,v1,v2,vstride,vorder,(double*)points);
+
+void
+glEvalCoord2 ( u, v )
+       double u
+       double v
+       CODE:
+               glEvalCoord2d(u,v);
+
+void
+glMapGrid2 ( nu, u1, u2, nv, v1, v2 )
+       Sint32 nu
+       double u1
+       double u2
+       Sint32 nv
+       double v1
+       double v2
+       CODE:
+               glMapGrid2d(nu,u1,u2,nv,v1,v2);
+
+void
+glEvalMesh2 ( mode, i1, i2, j1, j2 )
+       GLenum mode
+       Sint32 i1
+       Sint32 i2
+       Sint32 j1
+       Sint32 j2
+       CODE:
+               glEvalMesh2(mode,i1,i2,j1,j2);
+
+GLenum
+glGetError ( )
+       CODE:
+               RETVAL = glGetError();
+       OUTPUT:
+               RETVAL
+
+GLint
+glRenderMode ( mode )
+       GLenum mode
+       CODE:
+               RETVAL = glRenderMode( mode );
+       OUTPUT:
+               RETVAL
+
+void
+glInitNames ( )
+       CODE:
+               glInitNames();
+
+void
+glPushName ( name )
+       GLuint name
+       CODE:
+               glPushName(name);
+
+void
+glPopName ( )
+       CODE:
+               glPopName();            
+
+void
+glLoadName ( name )
+       GLuint name
+       CODE:
+               glLoadName(name);
+       
+void
+glFeedbackBuffer ( size, type, buffer )
+       GLuint size
+       GLenum type
+       float* buffer
+       CODE:
+               glFeedbackBuffer(size,type,buffer);             
+
+void
+glPassThrough ( token )
+       GLfloat token
+       CODE:
+               glPassThrough(token);
+
+
+#endif
+
+#ifdef HAVE_GLU
+
+void
+gluLookAt ( eyex, eyey, eyez, centerx, centery, centerz, upx, upy, upz )
+       double eyex
+       double eyey
+       double eyez
+       double centerx
+       double centery
+       double centerz
+       double upx
+       double upy
+       double upz
+       CODE:
+               gluLookAt(eyex,eyey,eyez,centerx,centery,centerz,upx,upy,upz);
+
+void
+gluPerspective ( fovy, aspect, n, f )
+       double fovy
+       double aspect
+       double n
+       double f
+       CODE:
+               gluPerspective(fovy,aspect,n,f);
+
+void
+gluPickMatrix ( x, y, delx, dely, viewport )
+       double x
+       double y
+       double delx
+       double dely
+       GLint* viewport
+       CODE:
+               gluPickMatrix(x,y,delx,dely,viewport);
+
+void
+gluOrtho2D ( left, right, bottom, top )
+       double left
+       double right
+       double bottom
+       double top
+       CODE:
+               gluOrtho2D(left,right,bottom,top);
+
+int
+gluScaleImage ( format, widthin, heightin, typein, datain, widthout, heightout, typeout, dataout )
+       GLenum format
+       Uint32 widthin
+       Uint32 heightin
+       GLenum typein
+       char *datain
+       Uint32 widthout
+       Uint32 heightout
+       GLenum typeout
+       char *dataout
+       CODE:
+               RETVAL = gluScaleImage(format,widthin,heightin,typein,datain,
+                               widthout,heightout,typeout,dataout);
+       OUTPUT:
+               RETVAL
+
+int
+gluBuild1DMipmaps ( target, internalFormat, width, format, type, data )
+       GLenum target
+       Sint32 internalFormat
+       Uint32 width
+       GLenum format
+       GLenum type
+       char *data
+       CODE:
+               RETVAL = gluBuild1DMipmaps(target,internalFormat,width,format,type,data);
+       OUTPUT:
+               RETVAL
+
+int
+gluBuild2DMipmaps ( target, internalFormat, width, height, format, type, data )
+       GLenum target
+       Sint32 internalFormat
+       Uint32 width
+       Uint32 height 
+       GLenum format
+       GLenum type
+       char *data
+       CODE:
+               RETVAL = gluBuild2DMipmaps(target,internalFormat,width,height,format,type,data);
+       OUTPUT: 
+               RETVAL
+
+
+#if HAVE_GLU_VERSION >= 12
+int
+gluBuild3DMipmaps ( target, internalFormat, width, height, depth, format, type, data )
+       GLenum target
+       Sint32 internalFormat
+       Uint32 width
+       Uint32 height 
+       Uint32 depth 
+       GLenum format
+       GLenum type
+       char *data
+       CODE:
+               RETVAL = gluBuild3DMipmaps(target,internalFormat,width,height,depth,
+                               format,type,data);
+       OUTPUT: 
+               RETVAL
+
+#else
+void
+gluBuild3DMipmaps ( )
+       CODE:
+               Perl_croak (aTHX_ "SDL::OpenGL::Build3DMipmaps requires GLU 1.2");
+
+#endif
+
+#if HAVE_GLU_VERSION >= 12
+int
+gluBuild1DMipmapLevels ( target, internalFormat, width, format, type, level, base, max, data )
+       GLenum target
+       Sint32 internalFormat
+       Uint32 width
+       GLenum format
+       GLenum type
+       Sint32 level
+       Sint32 base
+       Sint32 max
+       char *data
+       CODE:
+               RETVAL = gluBuild1DMipmapLevels(target,internalFormat,width,
+                               format,type,level,base,max,data);
+       OUTPUT:
+               RETVAL
+
+#else
+void
+gluBuild1DMipmapLevels ()
+       CODE:
+               Perl_croak(aTHX_ "SDL::OpenGL::Build1DMipmapLevels requires GLU 1.2");          
+       
+#endif
+
+#if HAVE_GLU_VERSION >= 12
+int
+gluBuild2DMipmapLevels ( target, internalFormat, width, height, format, type, level, base, max, data )
+       GLenum target
+       Sint32 internalFormat
+       Uint32 width
+       Uint32 height 
+       GLenum format
+       GLenum type
+       Sint32 level
+       Sint32 base
+       Sint32 max
+       char *data
+       CODE:
+               RETVAL = gluBuild2DMipmapLevels(target,internalFormat,width,height,
+                               format,type,level,base,max,data);
+       OUTPUT:
+               RETVAL
+
+#else
+void
+gluBuild2DMipmapLevels ()
+       CODE:
+               Perl_croak(aTHX_ "SDL::OpenGL::Build2DMipmapLevels requires GLU 1.2");          
+
+#endif
+
+#if HAVE_GLU_VERSION >= 12
+int
+gluBuild3DMipmapLevels ( target, internalFormat, width, height, depth, format, type, level, base, max, data )
+       GLenum target
+       Sint32 internalFormat
+       Uint32 width
+       Uint32 height 
+       Uint32 depth 
+       GLenum format
+       GLenum type
+       Sint32 level
+       Sint32 base
+       Sint32 max
+       char *data
+       CODE:
+               RETVAL = gluBuild3DMipmapLevels(target,internalFormat,width,height,depth,
+                               format,type,level,base,max,data);
+       OUTPUT:
+               RETVAL
+
+#else
+void
+gluBuild3DMipmapLevels ()
+       CODE:
+               Perl_croak(aTHX_ "SDL::OpenGL::Build3DMipmapLevels requires GLU 1.2");          
+
+#endif
+
+char*
+gluErrorString ( code )
+       GLenum code
+       CODE:
+               RETVAL = (char*)gluErrorString(code);
+       OUTPUT:
+               RETVAL
+
+GLUnurbsObj*
+gluNewNurbsRenderer ()
+       CODE:
+               RETVAL = gluNewNurbsRenderer();
+       OUTPUT:
+               RETVAL
+
+void
+gluDeleteNurbsRenderer ( obj )
+       GLUnurbsObj *obj
+       CODE:
+               gluDeleteNurbsRenderer(obj);
+
+void
+gluNurbsProperty ( obj, property, value )
+       GLUnurbsObj *obj
+       GLenum property
+       double value
+       CODE:
+               gluNurbsProperty(obj,property,(float)value);
+
+void
+gluLoadSamplingMatrices ( obj, mm, pm, vp )
+       GLUnurbsObj *obj
+       char *mm
+       char *pm
+       char *vp
+       CODE:
+               gluLoadSamplingMatrices(obj,(GLfloat*)mm,(GLfloat*)pm,(GLint*)vp);
+
+double
+gluGetNurbsProperty ( obj, property )
+       GLUnurbsObj *obj
+       GLenum property
+       CODE:
+               float f;
+               gluGetNurbsProperty(obj,property,&f);
+               RETVAL = (double)f;
+       OUTPUT:
+               RETVAL
+
+void
+gluNurbsCallback ( obj, which, cb )
+       GLUnurbsObj *obj
+       GLenum which
+       SV *cb
+       CODE:
+               switch(which) {
+                       case GLU_ERROR:
+                               sdl_perl_nurbs_error_hook = cb;
+                               gluNurbsCallback(obj,GLU_ERROR,(GLvoid*)sdl_perl_nurbs_error_callback);
+                               break;
+#ifdef GLU_NURBS_BEGIN
+                       case GLU_NURBS_BEGIN:
+                       case GLU_NURBS_BEGIN_DATA:
+                               gluNurbsCallbackData(obj,(void*)cb);
+                               gluNurbsCallback(obj,GLU_NURBS_BEGIN_DATA,
+                                       (GLvoid*)sdl_perl_nurbs_being_callback);        
+                               break;
+                       case GLU_NURBS_TEXTURE_COORD:
+                       case GLU_NURBS_TEXTURE_COORD_DATA:
+                               gluNurbsCallbackData(obj,(void*)cb);
+                               gluNurbsCallback(obj,GLU_NURBS_TEXTURE_COORD_DATA,
+                                       (GLvoid*)sdl_perl_nurbs_multi_callback);        
+                               break;
+                       case GLU_NURBS_COLOR:
+                       case GLU_NURBS_COLOR_DATA:
+                               gluNurbsCallbackData(obj,(void*)cb);
+                               gluNurbsCallback(obj,GLU_NURBS_COLOR_DATA,
+                                       (GLvoid*)sdl_perl_nurbs_multi_callback);        
+                               break;
+                       case GLU_NURBS_NORMAL:
+                       case GLU_NURBS_NORMAL_DATA:
+                               gluNurbsCallbackData(obj,(void*)cb);
+                               gluNurbsCallback(obj,GLU_NURBS_NORMAL_DATA,
+                                       (GLvoid*)sdl_perl_nurbs_multi_callback);        
+                               break;
+                       case GLU_NURBS_VERTEX:
+                       case GLU_NURBS_VERTEX_DATA:
+                               gluNurbsCallbackData(obj,(void*)cb);
+                               gluNurbsCallback(obj,GLU_NURBS_VERTEX_DATA,
+                                       (GLvoid*)sdl_perl_nurbs_multi_callback);        
+                               break;
+                       case GLU_NURBS_END:
+                       case GLU_NURBS_END_DATA:
+                               gluNurbsCallbackData(obj,(void*)cb);
+                               gluNurbsCallback(obj,GLU_NURBS_END_DATA,
+                                       (GLvoid*)sdl_perl_nurbs_end_callback);  
+                               break;
+#endif
+                       default:
+                               Perl_croak(aTHX_ "SDL::OpenGL::NurbsCallback - invalid type");
+               }
+
+void
+gluNurbsCallbackData ( obj, cb )
+       GLUnurbsObj *obj
+       SV *cb
+       CODE:
+               gluNurbsCallbackData(obj,(void*)cb);
+
+void
+gluBeginSurface ( obj )
+       GLUnurbsObj *obj
+       CODE:
+               gluBeginSurface(obj);
+
+void
+gluEndSurface ( obj )
+       GLUnurbsObj *obj
+       CODE:
+               gluEndSurface(obj);
+       
+void
+gluNurbsSurface ( obj, uknot_count, uknot, vknot_count, vknot, u_stride, v_stride, ctlarray, uorder, vorder, type )
+       GLUnurbsObj *obj
+       Sint32 uknot_count
+       char *uknot
+       Sint32 vknot_count
+       char *vknot
+       Sint32 u_stride
+       Sint32 v_stride
+       char *ctlarray
+       Sint32 uorder
+       Sint32 vorder
+       GLenum type
+       CODE:
+               gluNurbsSurface(obj,uknot_count,(GLfloat*)uknot,vknot_count,(GLfloat*)vknot,
+                       u_stride,v_stride,(GLfloat*)ctlarray,uorder,vorder,type);
+
+void
+gluBeginCurve ( obj )
+       GLUnurbsObj *obj
+       CODE:
+               gluBeginCurve(obj);
+
+void
+gluEndCurve ( obj ) 
+       GLUnurbsObj *obj
+       CODE:
+               gluEndCurve(obj);
+
+void
+gluNurbsCurve ( obj, uknot_count, uknot, u_stride, ctlarray, uorder, type )
+       GLUnurbsObj *obj
+       Sint32 uknot_count
+       char *uknot
+       Sint32 u_stride
+       char *ctlarray
+       Sint32 uorder
+       GLenum type
+       CODE:
+               gluNurbsCurve(obj,uknot_count,(GLfloat*)uknot,u_stride,(GLfloat*)ctlarray,
+                       uorder,type);
+
+void
+gluBeginTrim ( obj )
+       GLUnurbsObj *obj
+       CODE:
+               gluBeginTrim(obj);
+
+void
+gluEndTrim ( obj )
+       GLUnurbsObj *obj
+       CODE:
+               gluEndTrim(obj);
+
+void
+gluPwlCurve ( obj, count, array, stride, type )        
+       GLUnurbsObj *obj
+       Sint32 count
+       char *array
+       Sint32 stride
+       GLenum type
+       CODE:
+               gluPwlCurve(obj,count,(GLfloat*)array,stride,type);
+
+AV*
+gluUnProject ( winx, winy, winz, mm, pm, vp )
+       double winx
+       double winy
+       double winz
+       char *mm
+       char *pm
+       char *vp
+       CODE:
+               GLdouble objx, objy, objz;
+               RETVAL = newAV();
+               av_push(RETVAL,newSViv(gluUnProject(winx,winy,winz,(GLdouble*)mm,
+                       (GLdouble*)pm,(GLint*)vp,&objx,&objy,&objz)));
+               av_push(RETVAL,newSVnv((double)objx));
+               av_push(RETVAL,newSVnv((double)objy));
+               av_push(RETVAL,newSVnv((double)objz));
+       OUTPUT:
+               RETVAL
+
+
+#ifdef GL_VERSION_1_3
+               
+AV*
+gluUnProject4 ( winx, winy, winz, clipw, mm, pm, vp, n, f )
+        double winx
+        double winy
+        double winz
+       double clipw
+        char *mm
+        char *pm
+        char *vp
+       double n
+       double f
+        CODE:
+                GLdouble objx, objy, objz, objw;
+                RETVAL = newAV();
+                av_push(RETVAL,newSViv(gluUnProject4(winx,winy,winz,clipw,(GLdouble*)mm,
+                        (GLdouble*)pm,(GLint*)vp,(GLclampd)n,(GLclampd)f,
+                       &objx,&objy,&objz,&objw)));
+                av_push(RETVAL,newSVnv((double)objx));
+                av_push(RETVAL,newSVnv((double)objy));
+                av_push(RETVAL,newSVnv((double)objz));
+                av_push(RETVAL,newSVnv((double)objw));
+        OUTPUT:
+                RETVAL
+
+#endif // GL_VERSION_1_3
+
+AV*
+gluProject ( objx, objy, objz, mm, pm, vp )
+       double objx
+       double objy
+       double objz
+       char *mm
+       char *pm
+       char *vp
+       CODE:
+               GLdouble winx, winy, winz;
+               RETVAL = newAV();
+               av_push(RETVAL,newSViv(gluUnProject(objx,objy,objz,(GLdouble*)mm,
+                       (GLdouble*)pm,(GLint*)vp,&winx,&winy,&winz)));
+                av_push(RETVAL,newSVnv((double)winx));
+                av_push(RETVAL,newSVnv((double)winy));
+                av_push(RETVAL,newSVnv((double)winz));
+       OUTPUT:
+               RETVAL
+
+#ifdef GL_VERSION_1_2
+
+GLUtesselator*
+gluNewTess ()
+       CODE:
+               RETVAL = gluNewTess();
+       OUTPUT:
+               RETVAL
+
+void
+gluTessCallback ( tess, type )
+       GLUtesselator *tess
+       GLenum type
+       CODE:
+               switch(type) {
+                       case GLU_TESS_BEGIN:
+                       case GLU_TESS_BEGIN_DATA:
+                               gluTessCallback(tess,GLU_TESS_BEGIN_DATA,
+                                       (GLvoid*)sdl_perl_tess_begin_callback); 
+                               break;
+       
+                       case GLU_TESS_EDGE_FLAG:
+                       case GLU_TESS_EDGE_FLAG_DATA:
+                               gluTessCallback(tess,GLU_TESS_EDGE_FLAG_DATA,
+                                       (GLvoid*)sdl_perl_tess_edge_flag_callback);     
+                               break;
+
+                       case GLU_TESS_VERTEX:
+                       case GLU_TESS_VERTEX_DATA:
+                               gluTessCallback(tess,GLU_TESS_VERTEX_DATA,
+                                       (GLvoid*)sdl_perl_tess_vertex_callback);        
+                               break;
+
+                       case GLU_TESS_END:
+                       case GLU_TESS_END_DATA:
+                               gluTessCallback(tess,GLU_TESS_END_DATA,
+                                       (GLvoid*)sdl_perl_tess_end_callback);   
+                               break;
+
+                       case GLU_TESS_COMBINE:
+                       case GLU_TESS_COMBINE_DATA:
+                               gluTessCallback(tess,GLU_TESS_COMBINE_DATA,
+                                       (GLvoid*)sdl_perl_tess_combine_callback);       
+                               break;
+
+                       case GLU_TESS_ERROR:
+                       case GLU_TESS_ERROR_DATA:
+                               gluTessCallback(tess,GLU_TESS_ERROR_DATA,
+                                       (GLvoid*)sdl_perl_tess_error_callback); 
+                               break;
+               }
+
+void
+gluTessProperty ( tessobj, property, value )
+       GLUtesselator *tessobj
+       Uint32 property
+       double value
+       CODE:
+               gluTessProperty(tessobj,property,value);
+
+double
+gluGetTessProperty ( tessobj, property )
+       GLUtesselator *tessobj
+       Uint32 property
+       CODE:
+               gluGetTessProperty(tessobj,property,&RETVAL);
+       OUTPUT:
+               RETVAL
+
+void
+gluTessNormal ( tessobj, x, y, z )
+       GLUtesselator *tessobj
+       double x
+       double y
+       double z
+       CODE:
+               gluTessNormal(tessobj,x,y,z);
+
+void
+gluTessBeginPolygon ( tessobj, cb )
+       GLUtesselator *tessobj
+       SV *cb
+       CODE:
+               gluTessBeginPolygon(tessobj,cb);
+
+void
+gluTessEndPolygon ( tessobj ) 
+       GLUtesselator *tessobj
+       CODE:
+               gluTessEndPolygon(tessobj);
+
+void
+gluTessBeginContour ( tessobj )
+       GLUtesselator *tessobj
+       CODE:
+               gluTessBeginContour(tessobj);
+
+void
+gluTessEndContour ( tessobj )
+       GLUtesselator *tessobj
+       CODE:
+               gluTessEndContour(tessobj);
+
+void
+gluDeleteTess ( tessobj )
+       GLUtesselator *tessobj
+       CODE:
+               gluDeleteTess(tessobj);
+
+void
+gluTessVertex ( tessobj, coords, vd ) 
+       GLUtesselator *tessobj
+       char *coords
+       char *vd
+       CODE:
+               gluTessVertex(tessobj,(GLdouble*)coords,vd);
+       
+#endif
+
+#endif
+
diff --git a/src/SDL.xs b/src/SDL.xs
new file mode 100644 (file)
index 0000000..c327e5e
--- /dev/null
@@ -0,0 +1,4536 @@
+//
+// SDL.xs
+//
+// Copyright (C) 2005 David J. Goehrig <dgoehrig@cpan.org>
+//
+// ------------------------------------------------------------------------------
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+// 
+// This library 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
+// Lesser General Public License for more details.
+// 
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+//
+// ------------------------------------------------------------------------------
+//
+// Please feel free to send questions, suggestions or improvements to:
+//
+//     David J. Goehrig
+//     dgoehrig@cpan.org
+//
+
+#include "EXTERN.h"
+#include "perl.h"
+#include "XSUB.h"
+
+#ifndef aTHX_
+#define aTHX_
+#endif
+
+#include <SDL.h>
+
+#ifdef HAVE_GL
+#include <gl.h>
+#endif
+
+#ifdef HAVE_GLU
+#include <glu.h>
+#endif
+
+#ifdef HAVE_SDL_IMAGE
+#include <SDL_image.h>
+#endif 
+
+#ifdef HAVE_SDL_MIXER
+#include <SDL_mixer.h>
+void (*mix_music_finished_cv)();
+#endif
+
+#ifdef HAVE_SDL_SOUND
+#include <SDL_sound.h>
+#endif
+
+#ifdef HAVE_SDL_NET
+#include <SDL_net.h>
+#endif
+
+#ifdef HAVE_SDL_TTF
+#include <SDL_ttf.h>
+#define TEXT_SOLID     1
+#define TEXT_SHADED    2
+#define TEXT_BLENDED   4
+#define UTF8_SOLID     8
+#define UTF8_SHADED    16      
+#define UTF8_BLENDED   32
+#define UNICODE_SOLID  64
+#define UNICODE_SHADED 128
+#define UNICODE_BLENDED        256
+#endif
+
+#ifdef HAVE_SMPEG
+#include <smpeg/smpeg.h>
+#ifdef HAVE_SDL_MIXER
+static int sdl_perl_use_smpeg_audio = 0;
+#endif
+#endif
+
+#ifdef HAVE_SDL_GFX
+#include <SDL_rotozoom.h>
+#include <SDL_gfxPrimitives.h>
+#include <SDL_framerate.h>
+#include <SDL_imageFilter.h>
+#endif
+
+#ifdef HAVE_SDL_SVG
+#include <SDL_svg.h>
+#endif
+
+#ifdef USE_THREADS
+#define HAVE_TLS_CONTEXT
+#endif
+
+#include "defines.h"
+
+Uint32 
+sdl_perl_timer_callback ( Uint32 interval, void* param )
+{
+       Uint32 retval;
+       int back;
+       SV* cmd;
+       ENTER_TLS_CONTEXT
+       dSP;
+
+       cmd = (SV*)param;
+
+       ENTER;
+       SAVETMPS;
+       PUSHMARK(SP);
+       XPUSHs(sv_2mortal(newSViv(interval)));
+       PUTBACK;
+
+       if (0 != (back = call_sv(cmd,G_SCALAR))) {
+               SPAGAIN;
+               if (back != 1 ) Perl_croak (aTHX_ "Timer Callback failed!");
+               retval = POPi;  
+       } else {
+               Perl_croak(aTHX_ "Timer Callback failed!");
+       }
+
+       FREETMPS;
+       LEAVE;
+
+       LEAVE_TLS_CONTEXT
+       
+       return retval;
+}
+
+void
+sdl_perl_audio_callback ( void* data, Uint8 *stream, int len )
+{
+       SV *cmd;
+       ENTER_TLS_CONTEXT
+       dSP;
+
+       cmd = (SV*)data;
+
+       ENTER;
+       SAVETMPS;
+       PUSHMARK(SP);
+       XPUSHs(sv_2mortal(newSViv(PTR2IV(stream))));
+       XPUSHs(sv_2mortal(newSViv(len)));
+       PUTBACK;
+
+       call_sv(cmd,G_VOID|G_DISCARD);
+       
+       PUTBACK;
+       FREETMPS;
+       LEAVE;
+
+       LEAVE_TLS_CONTEXT       
+}
+
+#ifdef HAVE_SDL_MIXER
+
+void
+sdl_perl_music_callback ( void ) 
+{
+       SV *cmd;
+       ENTER_TLS_CONTEXT
+       dSP;
+
+       cmd = (SV*)Mix_GetMusicHookData();
+
+       ENTER;
+       SAVETMPS;
+       PUSHMARK(SP);
+       PUTBACK;
+       
+       call_sv(cmd,G_VOID|G_DISCARD);
+
+       PUTBACK;
+       FREETMPS;
+       LEAVE;
+
+       LEAVE_TLS_CONTEXT
+}
+
+void
+sdl_perl_music_finished_callback ( void )
+{
+       SV *cmd;
+       ENTER_TLS_CONTEXT
+       dSP;
+
+       cmd = (SV*)mix_music_finished_cv;
+       if ( cmd == NULL ) return;
+
+       ENTER;
+       SAVETMPS;
+       PUSHMARK(SP);
+       PUTBACK;
+       
+       call_sv(cmd,G_VOID|G_DISCARD);
+       
+       PUTBACK;
+       FREETMPS;
+       LEAVE;
+
+       LEAVE_TLS_CONTEXT
+}
+
+#endif
+
+#define INIT_NS_APPLICATION
+#define QUIT_NS_APPLICATION
+
+
+void
+sdl_perl_atexit (void)
+{
+       QUIT_NS_APPLICATION     
+       SDL_Quit();
+}
+
+void boot_SDL();
+void boot_SDL__OpenGL();
+
+XS(boot_SDL_perl)
+{
+       GET_TLS_CONTEXT
+       boot_SDL();
+}
+
+MODULE = SDL_perl      PACKAGE = SDL
+PROTOTYPES : DISABLE
+
+char *
+GetError ()
+       CODE:
+               RETVAL = SDL_GetError();
+       OUTPUT:
+               RETVAL
+
+int
+Init ( flags )
+       Uint32 flags
+       CODE:
+               INIT_NS_APPLICATION
+               RETVAL = SDL_Init(flags);
+#ifdef HAVE_TLS_CONTEXT
+               Perl_call_atexit(PERL_GET_CONTEXT, (void*)sdl_perl_atexit,0);
+#else
+               atexit(sdl_perl_atexit);
+#endif
+       OUTPUT:
+               RETVAL
+
+int
+InitSubSystem ( flags )
+       Uint32 flags
+       CODE:
+               RETVAL = SDL_InitSubSystem(flags);
+       OUTPUT:
+               RETVAL
+
+void
+QuitSubSystem ( flags )
+       Uint32 flags
+       CODE:
+               SDL_QuitSubSystem(flags);
+
+void
+Quit ()
+       CODE:
+               QUIT_NS_APPLICATION
+               SDL_Quit();
+
+int
+WasInit ( flags )
+       Uint32 flags
+       CODE:
+               RETVAL = SDL_WasInit(flags);
+       OUTPUT:
+               RETVAL
+
+void
+Delay ( ms )
+       int ms
+       CODE:
+               SDL_Delay(ms);
+
+Uint32
+GetTicks ()
+       CODE:
+               RETVAL = SDL_GetTicks();
+       OUTPUT:
+               RETVAL
+
+int
+SetTimer ( interval, callback )
+       Uint32 interval
+       SDL_TimerCallback callback
+       CODE:
+               RETVAL = SDL_SetTimer(interval,callback);
+       OUTPUT:
+               RETVAL
+
+SDL_TimerID
+AddTimer ( interval, callback, param )
+       Uint32 interval
+       SDL_NewTimerCallback callback
+       void *param
+       CODE:
+               RETVAL = SDL_AddTimer(interval,callback,param);
+       OUTPUT:
+               RETVAL
+
+SDL_NewTimerCallback
+PerlTimerCallback ()
+       CODE:
+               RETVAL = sdl_perl_timer_callback;
+       OUTPUT:
+               RETVAL  
+
+SDL_TimerID
+NewTimer ( interval, cmd )
+       Uint32 interval
+       void *cmd
+       CODE:
+               RETVAL = SDL_AddTimer(interval,sdl_perl_timer_callback,cmd);
+       OUTPUT:
+               RETVAL
+
+Uint32
+RemoveTimer ( id )
+       SDL_TimerID id
+       CODE:
+               RETVAL = SDL_RemoveTimer(id);
+       OUTPUT:
+               RETVAL
+
+SDL_RWops*
+RWFromFile ( file, mode )
+       char* file
+       char * mode
+       CODE:
+               RETVAL = SDL_RWFromFile(file,mode);
+       OUTPUT:
+               RETVAL
+
+SDL_RWops*
+RWFromFP ( fp, autoclose )
+       FILE* fp
+       int autoclose
+       CODE:
+               RETVAL = SDL_RWFromFP(fp,autoclose);
+       OUTPUT:
+               RETVAL
+
+SDL_RWops*
+RWFromMem ( mem, size )
+       char* mem
+       int size
+       CODE:
+               RETVAL = SDL_RWFromMem((void*)mem,size);
+       OUTPUT:
+               RETVAL
+
+SDL_RWops*
+RWFromConstMem ( mem, size )
+       const char* mem
+       int size
+       CODE:
+               RETVAL = SDL_RWFromConstMem((const void*)mem,size);
+       OUTPUT:
+               RETVAL
+
+SDL_RWops*
+AllocRW ()
+       CODE:
+               RETVAL = SDL_AllocRW();
+       OUTPUT:
+               RETVAL
+
+void
+FreeRW ( rw )
+       SDL_RWops* rw
+       CODE:
+               SDL_FreeRW(rw);
+
+int
+RWseek ( rw, off, whence )
+       SDL_RWops* rw
+       int off
+       int whence
+       CODE:
+               RETVAL = SDL_RWseek(rw,off,whence);
+       OUTPUT:
+               RETVAL
+
+int
+RWtell ( rw )
+       SDL_RWops* rw
+       CODE:
+               RETVAL = SDL_RWtell(rw);
+       OUTPUT:
+               RETVAL
+
+int
+RWread ( rw, mem, size, n )
+       SDL_RWops* rw
+       char* mem
+       int size
+       int n
+       CODE:
+               RETVAL = SDL_RWread(rw,mem,size,n);
+       OUTPUT:
+               RETVAL
+
+int
+RWwrite ( rw, mem, size, n )
+       SDL_RWops* rw
+       char* mem
+       int size
+       int n
+       CODE:
+               RETVAL = SDL_RWwrite(rw,mem,size,n);
+       OUTPUT:
+               RETVAL
+
+int
+RWclose ( rw )
+       SDL_RWops* rw
+       CODE:
+               RETVAL = SDL_RWclose(rw);
+       OUTPUT:
+               RETVAL
+
+int
+CDNumDrives ()
+       CODE:
+               RETVAL = SDL_CDNumDrives();
+       OUTPUT:
+               RETVAL
+
+char *
+CDName ( drive )
+       int drive
+       CODE:
+               RETVAL = strdup(SDL_CDName(drive));
+       OUTPUT:
+               RETVAL
+
+SDL_CD *
+CDOpen ( drive )
+       int drive
+       CODE:
+               RETVAL = SDL_CDOpen(drive);
+       OUTPUT:
+               RETVAL
+
+Uint8
+CDTrackId ( track )
+       SDL_CDtrack *track
+       CODE:
+               RETVAL = track->id;
+       OUTPUT:
+               RETVAL
+
+Uint8
+CDTrackType ( track )
+       SDL_CDtrack *track
+       CODE:
+               RETVAL = track->type;
+       OUTPUT:
+               RETVAL
+
+Uint16
+CDTrackLength ( track )
+       SDL_CDtrack *track
+       CODE:
+               RETVAL = track->length;
+       OUTPUT:
+               RETVAL
+
+Uint32
+CDTrackOffset ( track )
+       SDL_CDtrack *track
+       CODE:
+               RETVAL = track->offset;
+       OUTPUT: 
+               RETVAL
+
+Uint32
+CDStatus ( cd )
+       SDL_CD *cd 
+       CODE:
+               RETVAL = SDL_CDStatus(cd);
+       OUTPUT:
+               RETVAL
+
+int
+CDPlayTracks ( cd, start_track, ntracks, start_frame, nframes )
+       SDL_CD *cd
+       int start_track
+       int ntracks
+       int start_frame
+       int nframes
+       CODE:
+               RETVAL = SDL_CDPlayTracks(cd,start_track,start_frame,ntracks,nframes);
+       OUTPUT:
+               RETVAL
+
+int
+CDPlay ( cd, start, length )
+       SDL_CD *cd
+       int start
+       int length
+       CODE:
+               RETVAL = SDL_CDPlay(cd,start,length);
+       OUTPUT:
+               RETVAL
+
+int
+CDPause ( cd )
+       SDL_CD *cd
+       CODE:
+               RETVAL = SDL_CDPause(cd);
+       OUTPUT:
+               RETVAL
+
+int
+CDResume ( cd )
+       SDL_CD *cd
+       CODE:
+               RETVAL = SDL_CDResume(cd);
+       OUTPUT:
+               RETVAL
+
+int
+CDStop ( cd )
+       SDL_CD *cd
+       CODE:
+               RETVAL = SDL_CDStop(cd);
+       OUTPUT:
+               RETVAL
+
+int
+CDEject ( cd )
+       SDL_CD *cd
+       CODE:
+               RETVAL = SDL_CDEject(cd);
+       OUTPUT:
+               RETVAL
+
+void
+CDClose ( cd )
+       SDL_CD *cd
+       CODE:
+               SDL_CDClose(cd);
+       
+int
+CDId ( cd )
+       SDL_CD *cd
+       CODE:
+               RETVAL = cd->id;
+       OUTPUT: 
+               RETVAL
+
+int
+CDNumTracks ( cd )
+       SDL_CD *cd
+       CODE:
+               RETVAL = cd->numtracks;
+       OUTPUT:
+               RETVAL
+
+int
+CDCurTrack ( cd )
+       SDL_CD *cd
+       CODE:
+               RETVAL = cd->cur_track;
+       OUTPUT:
+               RETVAL
+
+int
+CDCurFrame ( cd )
+       SDL_CD *cd
+       CODE:
+               RETVAL = cd->cur_frame;
+       OUTPUT:
+               RETVAL
+
+SDL_CDtrack *
+CDTrack ( cd, number )
+       SDL_CD *cd
+       int number
+       CODE:
+               RETVAL = (SDL_CDtrack *)(cd->track + number);
+       OUTPUT:
+               RETVAL
+
+void
+PumpEvents ()
+       CODE:
+               SDL_PumpEvents();
+
+int
+PushEvent( e )
+       SDL_Event *e
+       CODE:
+               RETVAL = SDL_PushEvent( e );
+       OUTPUT:
+               RETVAL
+
+SDL_Event *
+NewEvent ()
+       CODE:   
+               RETVAL = (SDL_Event *) safemalloc (sizeof(SDL_Event));
+       OUTPUT:
+               RETVAL
+
+void
+FreeEvent ( e )
+       SDL_Event *e
+       CODE:
+               safefree(e);
+
+int
+PollEvent ( e )
+       SDL_Event *e
+       CODE:
+               RETVAL = SDL_PollEvent(e);
+       OUTPUT:
+               RETVAL
+
+int
+WaitEvent ( e )
+       SDL_Event *e
+       CODE:
+               RETVAL = SDL_WaitEvent(e);
+       OUTPUT:
+               RETVAL
+
+Uint8
+EventState ( type, state )
+       Uint8 type
+       int state
+       CODE:
+               RETVAL = SDL_EventState(type,state);
+       OUTPUT:
+               RETVAL 
+
+Uint8
+EventType ( e )
+       SDL_Event *e
+       CODE:
+               RETVAL = e->type;
+       OUTPUT:
+               RETVAL
+
+Uint8
+SetEventType ( e, type )
+       SDL_Event *e
+       Uint8 type
+       CODE:
+               RETVAL = e->type;
+               e->type = type;
+       OUTPUT:
+               RETVAL
+
+Uint8
+ActiveEventGain ( e )
+       SDL_Event *e
+       CODE:
+               RETVAL = e->active.gain;
+       OUTPUT: 
+               RETVAL
+
+Uint8
+ActiveEventState ( e )
+       SDL_Event *e
+       CODE:
+               RETVAL = e->active.state;
+       OUTPUT:
+               RETVAL
+
+Uint8
+KeyEventState( e )
+       SDL_Event *e
+       CODE:
+               RETVAL = e->key.state;
+       OUTPUT:
+               RETVAL
+
+int
+KeyEventSym ( e )
+       SDL_Event *e
+       CODE:
+               RETVAL = e->key.keysym.sym;
+       OUTPUT:
+               RETVAL
+
+int 
+KeyEventMod ( e )
+       SDL_Event *e
+       CODE:
+               RETVAL = e->key.keysym.mod;
+       OUTPUT:
+               RETVAL
+
+Uint16
+KeyEventUnicode ( e )
+       SDL_Event *e
+       CODE:
+               RETVAL = e->key.keysym.unicode;
+       OUTPUT:
+               RETVAL
+
+Uint8
+KeyEventScanCode ( e )
+       SDL_Event *e
+       CODE:
+               RETVAL = e->key.keysym.scancode;
+       OUTPUT:
+               RETVAL
+
+Uint8
+MouseMotionState ( e )
+       SDL_Event *e
+       CODE:
+               RETVAL = e->motion.state;
+       OUTPUT: 
+               RETVAL
+
+Uint16
+MouseMotionX ( e )
+       SDL_Event *e
+       CODE:
+               RETVAL = e->motion.x;
+       OUTPUT:
+               RETVAL
+
+Uint16
+MouseMotionY ( e )
+       SDL_Event *e
+       CODE:
+               RETVAL = e->motion.y;
+       OUTPUT:
+               RETVAL
+
+Sint16
+MouseMotionXrel( e )
+       SDL_Event *e
+       CODE:
+               RETVAL = e->motion.xrel;
+       OUTPUT:
+               RETVAL
+
+Sint16
+MouseMotionYrel ( e )
+       SDL_Event *e
+       CODE:
+               RETVAL = e->motion.yrel;
+       OUTPUT:
+               RETVAL
+
+Uint8
+MouseButtonState ( e )
+       SDL_Event *e
+       CODE:
+               RETVAL = e->button.state;
+       OUTPUT:
+               RETVAL
+
+Uint8
+MouseButton ( e )
+       SDL_Event *e
+       CODE:
+               RETVAL = e->button.button;
+       OUTPUT:
+               RETVAL
+
+Uint16
+MouseButtonX ( e )
+       SDL_Event *e
+       CODE:
+               RETVAL = e->button.x;
+       OUTPUT:
+               RETVAL
+
+Uint16
+MouseButtonY ( e )
+       SDL_Event *e
+       CODE:
+               RETVAL = e->button.y;
+       OUTPUT:
+               RETVAL
+
+SDL_SysWMmsg *
+SysWMEventMsg ( e )
+       SDL_Event *e
+       CODE:
+               RETVAL = e->syswm.msg;
+       OUTPUT:
+               RETVAL
+
+int
+EnableUnicode ( enable )
+       int enable
+       CODE:
+               RETVAL = SDL_EnableUNICODE(enable);
+       OUTPUT:
+               RETVAL
+
+void
+EnableKeyRepeat ( delay, interval )
+       int delay
+       int interval
+       CODE:
+               SDL_EnableKeyRepeat(delay,interval);
+
+Uint32
+GetModState ()
+       CODE:
+               RETVAL = SDL_GetModState();
+       OUTPUT:
+               RETVAL
+
+void
+SetModState ( state )
+       Uint32 state
+       CODE:
+               SDL_SetModState(state);
+
+char *
+GetKeyName ( sym )
+       int sym
+       CODE:
+               RETVAL = SDL_GetKeyName(sym);
+       OUTPUT:
+               RETVAL
+
+SDL_Surface *
+CreateRGBSurface (flags, width, height, depth, Rmask, Gmask, Bmask, Amask )
+       Uint32 flags
+       int width
+       int height
+       int depth
+       Uint32 Rmask
+       Uint32 Gmask
+       Uint32 Bmask
+       Uint32 Amask
+       CODE:
+               RETVAL = SDL_CreateRGBSurface ( flags, width, height,
+                               depth, Rmask, Gmask, Bmask, Amask );
+       OUTPUT: 
+               RETVAL
+
+
+SDL_Surface *
+CreateRGBSurfaceFrom (pixels, width, height, depth, pitch, Rmask, Gmask, Bmask, Amask )
+       char *pixels
+       int width
+       int height
+       int depth
+       int pitch
+       Uint32 Rmask
+       Uint32 Gmask
+       Uint32 Bmask
+       Uint32 Amask
+       CODE:
+               Uint8* pixeldata;
+               Uint32 len = pitch * height;
+               New(0,pixeldata,len,Uint8);
+               Copy(pixels,pixeldata,len,Uint8);
+               RETVAL = SDL_CreateRGBSurfaceFrom ( pixeldata, width, height,
+                               depth, pitch, Rmask, Gmask, Bmask, Amask );
+       OUTPUT: 
+               RETVAL
+
+#ifdef HAVE_SDL_IMAGE
+
+SDL_Surface *
+IMGLoad ( fname )
+       char *fname
+       CODE:
+               RETVAL = IMG_Load(fname);
+       OUTPUT:
+               RETVAL
+
+#endif
+
+SDL_Surface*
+SurfaceCopy ( surface )
+       SDL_Surface *surface
+       CODE:
+               Uint8* pixels;
+               Uint32 size = surface->pitch * surface->h;
+               New(0,pixels,size,Uint8);
+               Copy(surface->pixels,pixels,size,Uint8);
+               RETVAL = SDL_CreateRGBSurfaceFrom(pixels,surface->w,surface->h,
+                       surface->format->BitsPerPixel, surface->pitch,
+                       surface->format->Rmask, surface->format->Gmask,
+                       surface->format->Bmask, surface->format->Amask);
+       OUTPUT:
+               RETVAL
+
+void
+FreeSurface ( surface )
+       SDL_Surface *surface
+       CODE:
+               if (surface) {
+                       Uint8* pixels = surface->pixels;
+                       Uint32 flags = surface->flags;
+                       SDL_FreeSurface(surface);
+                       if (flags & SDL_PREALLOC)
+                               Safefree(pixels);
+               }
+       
+Uint32
+SurfaceFlags ( surface )
+       SDL_Surface *surface
+       CODE:
+               RETVAL = surface->flags;
+       OUTPUT:
+               RETVAL
+
+SDL_Palette *
+SurfacePalette ( surface )
+       SDL_Surface *surface
+       CODE:
+               RETVAL = surface->format->palette;
+       OUTPUT:
+               RETVAL
+
+Uint8
+SurfaceBitsPerPixel ( surface )
+       SDL_Surface *surface
+       CODE:
+               RETVAL = surface->format->BitsPerPixel;
+       OUTPUT:
+               RETVAL
+
+Uint8
+SurfaceBytesPerPixel ( surface )
+       SDL_Surface *surface
+       CODE:   
+               RETVAL = surface->format->BytesPerPixel;
+       OUTPUT:
+               RETVAL
+
+Uint8
+SurfaceRshift ( surface )
+       SDL_Surface *surface
+       CODE:
+               RETVAL = surface->format->Rshift;
+       OUTPUT:
+               RETVAL
+
+Uint8
+SurfaceGshift ( surface )
+       SDL_Surface *surface
+       CODE:
+               RETVAL = surface->format->Gshift;
+       OUTPUT:
+               RETVAL
+
+Uint8
+SurfaceBshift ( surface )
+       SDL_Surface *surface
+       CODE:
+               RETVAL = surface->format->Bshift;
+       OUTPUT:
+               RETVAL
+
+Uint8
+SurfaceAshift ( surface )
+       SDL_Surface *surface
+       CODE:
+               RETVAL = surface->format->Ashift;
+       OUTPUT:
+               RETVAL
+
+Uint32
+SurfaceRmask( surface )
+       SDL_Surface *surface
+       CODE:
+               RETVAL = surface->format->Rmask;
+       OUTPUT:
+               RETVAL
+
+Uint32
+SurfaceGmask ( surface )
+       SDL_Surface *surface
+       CODE:
+               RETVAL = surface->format->Gmask;
+       OUTPUT:
+               RETVAL
+
+Uint32
+SurfaceBmask ( surface )
+       SDL_Surface *surface
+       CODE:
+               RETVAL = surface->format->Bmask;
+       OUTPUT:
+               RETVAL
+
+Uint32
+SurfaceAmask ( surface )
+       SDL_Surface *surface
+       CODE:
+               RETVAL = surface->format->Amask;
+       OUTPUT:
+               RETVAL
+
+Uint32
+SurfaceColorKey ( surface )
+       SDL_Surface *surface
+       CODE:
+               RETVAL = surface->format->colorkey;
+       OUTPUT:
+               RETVAL
+
+Uint32
+SurfaceAlpha( surface )
+       SDL_Surface *surface
+       CODE:
+               RETVAL = surface->format->alpha;
+       OUTPUT:
+               RETVAL
+
+int
+SurfaceW ( surface )
+       SDL_Surface *surface
+       CODE:   
+               RETVAL = surface->w;
+       OUTPUT:
+               RETVAL
+
+int
+SurfaceH ( surface )
+       SDL_Surface *surface
+       CODE:   
+               RETVAL = surface->h;
+       OUTPUT:
+               RETVAL
+
+Uint16
+SurfacePitch ( surface )
+       SDL_Surface *surface
+       CODE:   
+               RETVAL = surface->pitch;
+       OUTPUT:
+               RETVAL
+
+SV*
+SurfacePixels ( surface )
+       SDL_Surface *surface
+       CODE:   
+               RETVAL = newSVpvn(surface->pixels,surface->pitch*surface->h);
+       OUTPUT:
+               RETVAL
+
+SDL_Color*
+SurfacePixel ( surface, x, y, ... )
+       SDL_Surface *surface
+       Sint32 x
+       Sint32 y
+       CODE:
+               SDL_Color* color;
+               int pix,index;
+               Uint8 r,g,b,a;
+               int bpp = surface->format->BytesPerPixel;
+               Uint8* p = (Uint8*)surface->pixels + bpp*x + surface->pitch*y;
+               if ( items < 3 || items > 4 ) 
+                       Perl_croak(aTHX_ "usage: SDL::SurfacePixel(surface,x,y,[color])");
+               if ( items == 4) {
+                       color = (SDL_Color*)SvIV(ST(3));
+                       pix = SDL_MapRGB(surface->format,color->r,color->g,color->b);
+                       switch(bpp) {
+                               case 1:
+                                       *(Uint8*)p = pix;
+                                       break;
+                               case 2:
+                                       *(Uint16*)p = pix;
+                                       break;
+                               case 3:
+                                       if (SDL_BYTEORDER == SDL_BIG_ENDIAN) {
+                                               p[0] = (pix >> 16) & 0xff;
+                                               p[1] = (pix >> 8) & 0xff;
+                                               p[2] = pix & 0xff;
+                                       } else {
+                                               p[0] = pix & 0xff;
+                                               p[1] = (pix >> 8) & 0xff;
+                                               p[2] = (pix >> 16) & 0xff;
+                                       }
+                                       break;
+                               case 4:
+                                       *(Uint32*)p = pix;
+                                       break;
+                       }
+               }
+               RETVAL = (SDL_Color *) safemalloc(sizeof(SDL_Color));
+               switch(bpp) {
+                       case 1:
+                               index = *(Uint8*)p;
+                               memcpy(RETVAL,&surface->format->palette[index],sizeof(SDL_Color));
+                               break;
+                       case 2:
+                               pix = *(Uint16*)p;
+                               SDL_GetRGB(pix,surface->format,&r,&g,&b);
+                               RETVAL->r = r;
+                               RETVAL->g = g;
+                               RETVAL->b = b;
+                               break;
+                       case 3:
+                       case 4:
+                               pix = *(Uint32*)p;
+                               SDL_GetRGB(pix,surface->format,&r,&g,&b);
+                               RETVAL->r = r;
+                               RETVAL->g = g;
+                               RETVAL->b = b;
+                               break;
+               }
+       OUTPUT:
+               RETVAL
+
+int
+MUSTLOCK ( surface )
+       SDL_Surface *surface
+       CODE:
+               RETVAL = SDL_MUSTLOCK(surface);
+       OUTPUT:
+               RETVAL          
+
+int
+SurfaceLock ( surface )
+       SDL_Surface *surface
+       CODE:
+               RETVAL = SDL_LockSurface(surface);
+       OUTPUT:
+               RETVAL
+
+void
+SurfaceUnlock ( surface )
+       SDL_Surface *surface
+       CODE:
+               SDL_UnlockSurface(surface);
+
+SDL_Surface *
+GetVideoSurface ()
+       CODE:
+               RETVAL = SDL_GetVideoSurface();
+       OUTPUT:
+               RETVAL
+
+
+HV *
+VideoInfo ()
+       CODE:
+               HV *hv;
+               SDL_VideoInfo *info;
+               info = (SDL_VideoInfo *) safemalloc ( sizeof(SDL_VideoInfo));
+               memcpy(info,SDL_GetVideoInfo(),sizeof(SDL_VideoInfo));
+               hv = newHV();
+               hv_store(hv,"hw_available",strlen("hw_available"),
+                       newSViv(info->hw_available),0);
+               hv_store(hv,"wm_available",strlen("wm_available"),
+                       newSViv(info->wm_available),0);
+               hv_store(hv,"blit_hw",strlen("blit_hw"),
+                       newSViv(info->blit_hw),0);
+               hv_store(hv,"blit_hw_CC",strlen("blit_hw_CC"),
+                       newSViv(info->blit_hw_CC),0);
+               hv_store(hv,"blit_hw_A",strlen("blit_hw_A"),
+                       newSViv(info->blit_hw_A),0);
+               hv_store(hv,"blit_sw",strlen("blit_sw"),
+                       newSViv(info->blit_sw),0);
+               hv_store(hv,"blit_sw_CC",strlen("blit_sw_CC"),
+                       newSViv(info->blit_sw_CC),0);
+               hv_store(hv,"blit_sw_A",strlen("blit_sw_A"),
+                       newSViv(info->blit_sw_A),0);
+               hv_store(hv,"blit_fill",strlen("blit_fill"),
+                       newSViv(info->blit_fill),0);
+               hv_store(hv,"video_mem",strlen("video_mem"),
+                       newSViv(info->video_mem),0);
+               RETVAL = hv;
+       OUTPUT:
+               RETVAL
+
+SDL_Rect *
+NewRect ( x, y, w, h )
+       Sint16 x
+       Sint16 y
+       Uint16 w
+       Uint16 h
+       CODE:
+               RETVAL = (SDL_Rect *) safemalloc (sizeof(SDL_Rect));
+               RETVAL->x = x;
+               RETVAL->y = y;
+               RETVAL->w = w;
+               RETVAL->h = h;
+       OUTPUT:
+               RETVAL
+
+void
+FreeRect ( rect )
+       SDL_Rect *rect
+       CODE:
+               safefree(rect);
+
+Sint16
+RectX ( rect, ... )
+       SDL_Rect *rect
+       CODE:
+               if (items > 1 ) rect->x = SvIV(ST(1)); 
+               RETVAL = rect->x;
+       OUTPUT:
+               RETVAL
+
+Sint16
+RectY ( rect, ... )
+       SDL_Rect *rect
+       CODE:
+               if (items > 1 ) rect->y = SvIV(ST(1)); 
+               RETVAL = rect->y;
+       OUTPUT:
+               RETVAL
+
+Uint16
+RectW ( rect, ... )
+       SDL_Rect *rect
+       CODE:
+               if (items > 1 ) rect->w = SvIV(ST(1)); 
+               RETVAL = rect->w;
+       OUTPUT:
+               RETVAL
+
+Uint16
+RectH ( rect, ... )
+       SDL_Rect *rect
+       CODE:
+               if (items > 1 ) rect->h = SvIV(ST(1)); 
+               RETVAL = rect->h;
+       OUTPUT:
+               RETVAL
+
+AV*
+ListModes ( format, flags )
+       Uint32 flags
+       SDL_PixelFormat *format
+       CODE:
+               SDL_Rect **mode;
+               RETVAL = newAV();
+               mode = SDL_ListModes(format,flags);
+               if (mode == (SDL_Rect**)-1 ) {
+                       av_push(RETVAL,newSVpv("all",0));
+               } else if (! mode ) {
+                       av_push(RETVAL,newSVpv("none",0));
+               } else {
+                       for (;*mode;mode++) {
+                               av_push(RETVAL,newSViv(PTR2IV(*mode)));
+                       }
+               }
+       OUTPUT:
+               RETVAL
+
+
+SDL_Color *
+NewColor ( r, g, b )
+       Uint8 r
+       Uint8 g
+       Uint8 b
+       CODE:
+               RETVAL = (SDL_Color *) safemalloc(sizeof(SDL_Color));
+               RETVAL->r = r;
+               RETVAL->g = g;
+               RETVAL->b = b;
+       OUTPUT:
+               RETVAL
+
+Uint8
+ColorR ( color, ... )
+       SDL_Color *color
+       CODE:
+               if (items > 1 ) color->r = SvIV(ST(1)); 
+               RETVAL = color->r;
+       OUTPUT:
+               RETVAL
+
+Uint8
+ColorG ( color, ... )
+       SDL_Color *color
+       CODE:
+               if (items > 1 ) color->g = SvIV(ST(1)); 
+               RETVAL = color->g;
+       OUTPUT:
+               RETVAL
+
+Uint8
+ColorB ( color, ... )
+       SDL_Color *color
+       CODE:
+               if (items > 1 ) color->b = SvIV(ST(1)); 
+               RETVAL = color->b;
+       OUTPUT:
+               RETVAL
+
+void
+FreeColor ( color )
+       SDL_Color *color
+       CODE:
+               return; safefree(color);
+
+SDL_Palette *
+NewPalette ( number )
+       int number
+       CODE:
+               RETVAL = (SDL_Palette *)safemalloc(sizeof(SDL_Palette));
+               RETVAL->colors = (SDL_Color *)safemalloc(number * 
+                                               sizeof(SDL_Color));
+               RETVAL->ncolors = number;
+       OUTPUT:
+               RETVAL
+
+int
+PaletteNColors ( palette, ... )
+       SDL_Palette *palette
+       CODE:
+               if ( items > 1 ) palette->ncolors = SvIV(ST(1));
+               RETVAL = palette->ncolors;
+       OUTPUT:
+               RETVAL
+
+SDL_Color *
+PaletteColors ( palette, index, ... )
+       SDL_Palette *palette
+       int index
+       CODE:
+               if ( items > 2 ) {
+                       palette->colors[index].r = SvUV(ST(2)); 
+                       palette->colors[index].g = SvUV(ST(3)); 
+                       palette->colors[index].b = SvUV(ST(4)); 
+               }
+               RETVAL = (SDL_Color *)(palette->colors + index);
+       OUTPUT:
+               RETVAL
+
+int
+VideoModeOK ( width, height, bpp, flags )
+       int width
+       int height
+       int bpp
+       Uint32 flags
+       CODE:
+               RETVAL = SDL_VideoModeOK(width,height,bpp,flags);
+       OUTPUT:
+               RETVAL
+
+SDL_Surface *
+SetVideoMode ( width, height, bpp, flags )
+       int width
+       int height
+       int bpp
+       Uint32 flags
+       CODE:
+               RETVAL = SDL_SetVideoMode(width,height,bpp,flags);
+       OUTPUT:
+               RETVAL
+
+void
+UpdateRect ( surface, x, y, w ,h )
+       SDL_Surface *surface
+       int x
+       int y
+       int w
+       int h
+       CODE:
+               SDL_UpdateRect(surface,x,y,w,h);
+
+void
+UpdateRects ( surface, ... )
+       SDL_Surface *surface
+       CODE:
+               SDL_Rect *rects, *temp;
+               int num_rects,i;
+               if ( items < 2 ) return;
+               num_rects = items - 1;  
+               rects = (SDL_Rect *)safemalloc(sizeof(SDL_Rect)*items);
+               for(i=0;i<num_rects;i++) {
+                       temp = (SDL_Rect *)SvIV(ST(i+1));
+                       rects[i].x = temp->x;
+                       rects[i].y = temp->y;
+                       rects[i].w = temp->w;
+                       rects[i].h = temp->h;
+               } 
+               SDL_UpdateRects(surface,num_rects,rects);
+               safefree(rects);
+
+int
+Flip ( surface )
+       SDL_Surface *surface
+       CODE:
+               RETVAL = SDL_Flip(surface);
+       OUTPUT:
+               RETVAL
+
+int
+SetColors ( surface, start, ... )
+       SDL_Surface *surface
+       int start
+       CODE:
+               SDL_Color *colors,*temp;
+               int i, length;
+               if ( items < 3 ) { RETVAL = 0;  goto all_done; }
+               length = items - 2;
+               colors = (SDL_Color *)safemalloc(sizeof(SDL_Color)*(length+1));
+               for ( i = 0; i < length ; i++ ) {
+                       temp = (SDL_Color *)SvIV(ST(i+2));
+                       colors[i].r = temp->r;
+                       colors[i].g = temp->g;
+                       colors[i].b = temp->b;
+               }
+               RETVAL = SDL_SetColors(surface, colors, start, length );
+               safefree(colors);
+all_done:
+       OUTPUT: 
+               RETVAL
+
+Uint32
+MapRGB ( surface, r, g, b )
+       SDL_Surface *surface
+       Uint8 r
+       Uint8 g
+       Uint8 b
+       CODE:
+               RETVAL = SDL_MapRGB(surface->format,r,g,b);
+       OUTPUT:
+               RETVAL
+
+Uint32
+MapRGBA ( surface, r, g, b, a )
+       SDL_Surface *surface
+       Uint8 r
+       Uint8 g
+       Uint8 b
+       Uint8 a
+       CODE:
+               RETVAL = SDL_MapRGBA(surface->format,r,g,b,a);
+       OUTPUT:
+               RETVAL
+
+AV *
+GetRGB ( surface, pixel )
+       SDL_Surface *surface
+       Uint32 pixel
+       CODE:
+               Uint8 r,g,b;
+               SDL_GetRGB(pixel,surface->format,&r,&g,&b);
+               RETVAL = newAV();
+               av_push(RETVAL,newSViv(r));
+               av_push(RETVAL,newSViv(g));
+               av_push(RETVAL,newSViv(b));
+       OUTPUT:
+               RETVAL
+
+AV *
+GetRGBA ( surface, pixel )
+       SDL_Surface *surface
+       Uint32 pixel
+       CODE:
+               Uint8 r,g,b,a;
+               SDL_GetRGBA(pixel,surface->format,&r,&g,&b,&a);
+               RETVAL = newAV();
+               av_push(RETVAL,newSViv(r));
+               av_push(RETVAL,newSViv(g));
+               av_push(RETVAL,newSViv(b));
+               av_push(RETVAL,newSViv(a));
+       OUTPUT:
+               RETVAL
+
+int
+SaveBMP ( surface, filename )
+       SDL_Surface *surface
+       char *filename
+       CODE:
+               RETVAL = SDL_SaveBMP(surface,filename);
+       OUTPUT:
+               RETVAL  
+
+int
+SetColorKey ( surface, flag, key )
+       SDL_Surface *surface
+       Uint32 flag
+       SDL_Color *key
+       CODE:
+               Uint32 pixel = SDL_MapRGB(surface->format,key->r,key->g,key->b);
+               RETVAL = SDL_SetColorKey(surface,flag,pixel);
+       OUTPUT:
+               RETVAL
+
+int
+SetAlpha ( surface, flag, alpha )
+       SDL_Surface *surface
+       Uint32 flag
+       Uint8 alpha
+       CODE:
+               RETVAL = SDL_SetAlpha(surface,flag,alpha);
+       OUTPUT:
+               RETVAL
+
+SDL_Surface *
+DisplayFormat ( surface )
+       SDL_Surface *surface
+       CODE:
+               RETVAL = SDL_DisplayFormat(surface);
+       OUTPUT:
+               RETVAL
+
+SDL_Surface*
+DisplayFormatAlpha ( surface )
+       SDL_Surface *surface
+       CODE:
+               RETVAL = SDL_DisplayFormatAlpha(surface);
+       OUTPUT:
+               RETVAL
+
+SDL_Surface*
+ConvertRGB ( surface )
+       SDL_Surface * surface
+       CODE:
+               SDL_PixelFormat fmt;
+               fmt.palette = NULL;
+               fmt.BitsPerPixel = 24;
+               fmt.BytesPerPixel = 3;
+               fmt.Rmask = 0x000000ff;
+               fmt.Gmask = 0x0000ff00;
+               fmt.Bmask = 0x00ff0000;
+               fmt.Amask = 0x00000000;
+               fmt.Rloss = 0;
+               fmt.Gloss = 0;
+               fmt.Bloss = 0;
+               fmt.Aloss = 0;
+               fmt.Rshift = 0;
+               fmt.Gshift = 8;
+               fmt.Bshift = 16;
+               fmt.Ashift = 24;
+               fmt.colorkey = 0;
+               fmt.alpha = 0;
+               RETVAL = SDL_ConvertSurface(surface,&fmt,surface->flags);
+       OUTPUT:
+               RETVAL
+
+SDL_Surface* 
+ConvertRGBA ( surface )
+       SDL_Surface * surface
+       CODE:
+               SDL_PixelFormat fmt;
+               fmt.palette = NULL;
+               fmt.BitsPerPixel = 32;
+               fmt.BytesPerPixel = 4;
+               fmt.Rmask = 0x000000ff;
+               fmt.Gmask = 0x0000ff00;
+               fmt.Bmask = 0x00ff0000;
+               fmt.Amask = 0xff000000;
+               fmt.Rloss = 0;
+               fmt.Gloss = 0;
+               fmt.Bloss = 0;
+               fmt.Aloss = 0;
+               fmt.Rshift = 0;
+               fmt.Gshift = 8;
+               fmt.Bshift = 16;
+               fmt.Ashift = 24;
+               fmt.colorkey = 0;
+               fmt.alpha = 0;
+               RETVAL = SDL_ConvertSurface(surface,&fmt,surface->flags);
+       OUTPUT:
+               RETVAL
+
+int
+BlitSurface ( src, src_rect, dest, dest_rect )
+       SDL_Surface *src
+       SDL_Rect *src_rect
+       SDL_Surface *dest
+       SDL_Rect *dest_rect
+       CODE:
+               RETVAL = SDL_BlitSurface(src,src_rect,dest,dest_rect);
+       OUTPUT:
+               RETVAL
+
+int
+FillRect ( dest, dest_rect, color )
+       SDL_Surface *dest
+       SDL_Rect *dest_rect
+       SDL_Color *color
+       CODE:
+               Uint32 pixel = SDL_MapRGB(dest->format,color->r,color->g,color->b);
+               RETVAL = SDL_FillRect(dest,dest_rect,pixel);
+       OUTPUT:
+               RETVAL
+
+Uint8
+GetAppState ()
+       CODE:
+               RETVAL = SDL_GetAppState();
+       OUTPUT:
+               RETVAL
+
+
+void
+WMSetCaption ( title, icon )
+       char *title
+       char *icon
+       CODE:
+               SDL_WM_SetCaption(title,icon);
+
+AV *
+WMGetCaption ()
+       CODE:
+               char *title,*icon;
+               SDL_WM_GetCaption(&title,&icon);
+               RETVAL = newAV();
+               av_push(RETVAL,newSVpv(title,0));
+               av_push(RETVAL,newSVpv(icon,0));
+       OUTPUT:
+               RETVAL
+
+void
+WMSetIcon ( icon )
+       SDL_Surface *icon
+       CODE:
+               SDL_WM_SetIcon(icon,NULL);
+
+void
+WarpMouse ( x, y )
+       Uint16 x
+       Uint16 y
+       CODE:
+               SDL_WarpMouse(x,y);
+
+AV*
+GetMouseState ()
+       CODE:
+               Uint8 mask;
+               int x;
+               int y;
+               mask = SDL_GetMouseState(&x,&y);
+               RETVAL = newAV();
+               av_push(RETVAL,newSViv(mask));
+               av_push(RETVAL,newSViv(x));
+               av_push(RETVAL,newSViv(y));
+       OUTPUT:
+               RETVAL  
+
+AV*
+GetRelativeMouseState ()
+       CODE:
+               Uint8 mask;
+               int x;
+               int y;
+               mask = SDL_GetRelativeMouseState(&x,&y);
+               RETVAL = newAV();
+               av_push(RETVAL,newSViv(mask));
+               av_push(RETVAL,newSViv(x));
+               av_push(RETVAL,newSViv(y));
+       OUTPUT:
+               RETVAL  
+
+SDL_Cursor *
+NewCursor ( data, mask, x ,y )
+       SDL_Surface *data
+       SDL_Surface *mask
+       int x
+       int y
+       CODE:
+               RETVAL = SDL_CreateCursor((Uint8*)data->pixels,
+                               (Uint8*)mask->pixels,data->w,data->h,x,y);
+       OUTPUT:
+               RETVAL
+
+void
+FreeCursor ( cursor )
+       SDL_Cursor *cursor
+       CODE:
+               SDL_FreeCursor(cursor);
+
+void
+SetCursor ( cursor )
+       SDL_Cursor *cursor
+       CODE:
+               SDL_SetCursor(cursor);
+
+SDL_Cursor *
+GetCursor ()
+       CODE:
+               RETVAL = SDL_GetCursor();
+       OUTPUT:
+               RETVAL
+
+int
+ShowCursor ( toggle )
+       int toggle
+       CODE:
+               RETVAL = SDL_ShowCursor(toggle);
+       OUTPUT: 
+               RETVAL
+
+SDL_AudioSpec *
+NewAudioSpec ( freq, format, channels, samples )
+       int freq
+       Uint16 format
+       Uint8 channels
+       Uint16 samples
+       CODE:
+               RETVAL = (SDL_AudioSpec *)safemalloc(sizeof(SDL_AudioSpec));
+               RETVAL->freq = freq;
+               RETVAL->format = format;
+               RETVAL->channels = channels;
+               RETVAL->samples = samples;
+       OUTPUT:
+               RETVAL
+
+void
+FreeAudioSpec ( spec )
+       SDL_AudioSpec *spec
+       CODE:
+               safefree(spec);
+
+SDL_AudioCVT *
+NewAudioCVT ( src_format, src_channels, src_rate, dst_format, dst_channels, dst_rate)
+       Uint16 src_format
+       Uint8 src_channels
+       int src_rate
+       Uint16 dst_format
+       Uint8 dst_channels
+       int dst_rate
+       CODE:
+               RETVAL = (SDL_AudioCVT *)safemalloc(sizeof(SDL_AudioCVT));
+               if (SDL_BuildAudioCVT(RETVAL,src_format, src_channels, src_rate,
+                       dst_format, dst_channels, dst_rate)) { 
+                       safefree(RETVAL); RETVAL = NULL; }
+       OUTPUT:
+               RETVAL
+
+void
+FreeAudioCVT ( cvt )
+       SDL_AudioCVT *cvt
+       CODE:
+               safefree(cvt);
+
+int
+ConvertAudioData ( cvt, data, len )
+       SDL_AudioCVT *cvt
+       Uint8 *data
+       int len
+       CODE:
+               cvt->len = len;
+               cvt->buf = (Uint8*) safemalloc(cvt->len*cvt->len_mult);
+               memcpy(cvt->buf,data,cvt->len);
+               RETVAL = SDL_ConvertAudio(cvt);
+       OUTPUT:
+               RETVAL                  
+
+int
+OpenAudio ( spec, callback )
+       SDL_AudioSpec *spec
+       SV* callback
+       CODE:
+               spec->userdata = (void*)callback;
+               spec->callback = sdl_perl_audio_callback;
+               RETVAL = SDL_OpenAudio(spec,NULL);
+       OUTPUT:
+               RETVAL
+
+Uint32
+GetAudioStatus ()
+       CODE:
+               RETVAL = SDL_GetAudioStatus ();
+       OUTPUT:
+               RETVAL
+
+void
+PauseAudio ( p_on )
+       int p_on
+       CODE:
+               SDL_PauseAudio(p_on);
+       
+void
+LockAudio ()
+       CODE:
+               SDL_LockAudio();
+
+void
+UnlockAudio ()
+       CODE:
+               SDL_UnlockAudio();
+
+void
+CloseAudio ()
+       CODE:
+               SDL_CloseAudio();
+
+void
+FreeWAV ( buf )
+       Uint8 *buf
+       CODE:
+               SDL_FreeWAV(buf);
+
+AV *
+LoadWAV ( filename, spec )
+       char *filename
+       SDL_AudioSpec *spec
+       CODE:
+               SDL_AudioSpec *temp;
+               Uint8 *buf;
+               Uint32 len;
+
+               RETVAL = newAV();
+               temp = SDL_LoadWAV(filename,spec,&buf,&len);
+               if ( ! temp ) goto error;
+               av_push(RETVAL,newSViv(PTR2IV(temp)));
+               av_push(RETVAL,newSViv(PTR2IV(buf)));
+               av_push(RETVAL,newSViv(len));
+error:
+       OUTPUT:
+               RETVAL
+       
+#ifdef HAVE_SDL_MIXER
+
+void
+MixAudio ( dst, src, len, volume )
+       Uint8 *dst
+       Uint8 *src
+       Uint32 len
+       int volume
+       CODE:
+               SDL_MixAudio(dst,src,len,volume);
+
+int
+MixOpenAudio ( frequency, format, channels, chunksize )
+       int frequency
+       Uint16 format
+       int channels
+       int chunksize   
+       CODE:
+               RETVAL = Mix_OpenAudio(frequency, format, channels, chunksize);
+       OUTPUT:
+               RETVAL
+
+int
+MixAllocateChannels ( number )
+       int number
+       CODE:
+               RETVAL = Mix_AllocateChannels(number);
+       OUTPUT:
+               RETVAL
+
+AV *
+MixQuerySpec ()
+       CODE:
+               int freq, channels, status;
+               Uint16 format;
+               status = Mix_QuerySpec(&freq,&format,&channels);
+               RETVAL = newAV();
+               av_push(RETVAL,newSViv(status));
+               av_push(RETVAL,newSViv(freq));
+               av_push(RETVAL,newSViv(format));
+               av_push(RETVAL,newSViv(channels));
+       OUTPUT:
+               RETVAL
+
+Mix_Chunk *
+MixLoadWAV ( filename )
+       char *filename
+       CODE:
+               RETVAL = Mix_LoadWAV(filename);
+       OUTPUT:
+               RETVAL
+
+Mix_Music *
+MixLoadMusic ( filename )
+       char *filename
+       CODE:
+               RETVAL = Mix_LoadMUS(filename);
+       OUTPUT:
+               RETVAL
+
+Mix_Chunk *
+MixQuickLoadWAV ( buf )
+       Uint8 *buf
+       CODE:
+               RETVAL = Mix_QuickLoad_WAV(buf);
+       OUTPUT:
+               RETVAL
+
+void
+MixFreeChunk( chunk )
+       Mix_Chunk *chunk
+       CODE:
+               Mix_FreeChunk(chunk);
+
+void
+MixFreeMusic ( music )
+       Mix_Music *music
+       CODE:
+               Mix_FreeMusic(music);
+
+void
+MixSetPostMixCallback ( func, arg )
+       void *func
+       void *arg
+       CODE:
+               Mix_SetPostMix(func,arg);
+
+void*
+PerlMixMusicHook ()
+       CODE:
+               RETVAL = sdl_perl_music_callback;
+       OUTPUT:
+               RETVAL
+
+void
+MixSetMusicHook ( func, arg )
+       void *func
+       void *arg
+       CODE:
+               Mix_HookMusic(func,arg);
+
+void
+MixSetMusicFinishedHook ( func )
+       void *func
+       CODE:
+               mix_music_finished_cv = func;
+               Mix_HookMusicFinished(sdl_perl_music_finished_callback);
+
+void *
+MixGetMusicHookData ()
+       CODE:
+               RETVAL = Mix_GetMusicHookData();
+       OUTPUT:
+               RETVAL
+
+int
+MixReverseChannels ( number )
+       int number
+       CODE:
+               RETVAL = Mix_ReserveChannels ( number );
+       OUTPUT:
+               RETVAL
+
+int
+MixGroupChannel ( which, tag )
+       int which
+       int tag
+       CODE:
+               RETVAL = Mix_GroupChannel(which,tag);
+       OUTPUT:
+               RETVAL
+
+int
+MixGroupChannels ( from, to, tag )
+       int from
+       int to
+       int tag
+       CODE:
+               RETVAL = Mix_GroupChannels(from,to,tag);
+       OUTPUT:
+               RETVAL
+
+int
+MixGroupAvailable ( tag )
+       int tag
+       CODE:
+               RETVAL = Mix_GroupAvailable(tag);
+       OUTPUT:
+               RETVAL
+
+int
+MixGroupCount ( tag )
+       int tag
+       CODE:
+               RETVAL = Mix_GroupCount(tag);
+       OUTPUT:
+               RETVAL
+
+int
+MixGroupOldest ( tag )
+       int tag
+       CODE:
+               RETVAL = Mix_GroupOldest(tag);
+       OUTPUT:
+               RETVAL
+
+int
+MixGroupNewer ( tag )
+       int tag
+       CODE:
+               RETVAL = Mix_GroupNewer(tag);
+       OUTPUT:
+               RETVAL
+
+int
+MixPlayChannel ( channel, chunk, loops )
+       int channel
+       Mix_Chunk *chunk
+       int loops
+       CODE:
+               RETVAL = Mix_PlayChannel(channel,chunk,loops);
+       OUTPUT:
+               RETVAL
+
+int
+MixPlayChannelTimed ( channel, chunk, loops, ticks )
+       int channel
+       Mix_Chunk *chunk
+       int loops
+       int ticks
+       CODE:
+               RETVAL = Mix_PlayChannelTimed(channel,chunk,loops,ticks);
+       OUTPUT:
+               RETVAL
+
+int
+MixPlayMusic ( music, loops )
+       Mix_Music *music
+       int loops
+       CODE:
+               RETVAL = Mix_PlayMusic(music,loops);
+       OUTPUT:
+               RETVAL
+
+int
+MixFadeInChannel ( channel, chunk, loops, ms )
+       int channel
+       Mix_Chunk *chunk
+       int loops
+       int ms
+       CODE:
+               RETVAL = Mix_FadeInChannel(channel,chunk,loops,ms);
+       OUTPUT:
+               RETVAL
+
+int
+MixFadeInChannelTimed ( channel, chunk, loops, ms, ticks )
+       int channel
+       Mix_Chunk *chunk
+       int loops
+       int ticks
+       int ms
+       CODE:
+               RETVAL = Mix_FadeInChannelTimed(channel,chunk,loops,ms,ticks);
+       OUTPUT:
+               RETVAL
+
+int
+MixFadeInMusic ( music, loops, ms )
+       Mix_Music *music
+       int loops
+       int ms
+       CODE:
+               RETVAL = Mix_FadeInMusic(music,loops,ms);
+       OUTPUT:
+               RETVAL
+
+int
+MixVolume ( channel, volume )
+       int channel
+       int volume
+       CODE:   
+               RETVAL = Mix_Volume(channel,volume);
+       OUTPUT:
+               RETVAL
+
+int
+MixVolumeChunk ( chunk, volume )
+       Mix_Chunk *chunk
+       int volume
+       CODE:
+               RETVAL = Mix_VolumeChunk(chunk,volume);
+       OUTPUT:
+               RETVAL
+
+int
+MixVolumeMusic ( volume )
+       int volume
+       CODE:
+               RETVAL = Mix_VolumeMusic(volume);
+       OUTPUT:
+               RETVAL
+
+int
+MixHaltChannel ( channel )
+       int channel
+       CODE:
+               RETVAL = Mix_HaltChannel(channel);
+       OUTPUT:
+               RETVAL
+
+int
+MixHaltGroup ( tag )
+       int tag
+       CODE:
+               RETVAL = Mix_HaltGroup(tag);
+       OUTPUT:
+               RETVAL
+
+int
+MixHaltMusic ()
+       CODE:
+               RETVAL = Mix_HaltMusic();
+       OUTPUT:
+               RETVAL
+
+int
+MixExpireChannel ( channel, ticks )
+       int channel
+       int ticks
+       CODE:
+               RETVAL = Mix_ExpireChannel ( channel,ticks);
+       OUTPUT:
+               RETVAL
+
+int
+MixFadeOutChannel ( which, ms )
+       int which
+       int ms
+       CODE:
+               RETVAL = Mix_FadeOutChannel(which,ms);
+       OUTPUT:
+               RETVAL
+
+int
+MixFadeOutGroup ( which, ms )
+       int which
+       int ms
+       CODE:
+               RETVAL = Mix_FadeOutGroup(which,ms);
+       OUTPUT:
+               RETVAL
+
+int
+MixFadeOutMusic ( ms )
+       int ms
+       CODE:
+               RETVAL = Mix_FadeOutMusic(ms);
+       OUTPUT:
+               RETVAL
+
+Mix_Fading
+MixFadingMusic()
+       CODE:
+               RETVAL = Mix_FadingMusic();
+       OUTPUT:
+               RETVAL
+
+Mix_Fading
+MixFadingChannel( which )
+       int which
+       CODE:
+               RETVAL = Mix_FadingChannel(which);
+       OUTPUT:
+               RETVAL
+
+void
+MixPause ( channel )
+       int channel
+       CODE:
+               Mix_Pause(channel);
+
+void
+MixResume ( channel )
+       int channel
+       CODE:
+               Mix_Resume(channel);
+
+int
+MixPaused ( channel )
+       int channel
+       CODE:
+               RETVAL = Mix_Paused(channel);
+       OUTPUT:
+               RETVAL
+
+void
+MixPauseMusic ()
+       CODE:
+               Mix_PauseMusic();
+
+void
+MixResumeMusic ()
+       CODE:
+               Mix_ResumeMusic();
+
+void
+MixRewindMusic ()
+       CODE:
+               Mix_RewindMusic();
+
+int
+MixPausedMusic ()
+       CODE:
+               RETVAL = Mix_PausedMusic();
+       OUTPUT:
+               RETVAL
+
+int
+MixPlaying( channel )
+       int channel     
+       CODE:
+               RETVAL = Mix_Playing(channel);
+       OUTPUT:
+               RETVAL
+
+int
+MixPlayingMusic()
+       CODE:
+               RETVAL = Mix_PlayingMusic();
+       OUTPUT:
+               RETVAL
+
+
+void
+MixCloseAudio ()
+       CODE:
+               Mix_CloseAudio();
+
+#endif
+
+int
+GLLoadLibrary ( path )
+       char *path
+       CODE:
+               RETVAL = SDL_GL_LoadLibrary(path);
+       OUTPUT:
+               RETVAL
+
+void*
+GLGetProcAddress ( proc )
+       char *proc
+       CODE:
+               RETVAL = SDL_GL_GetProcAddress(proc);
+       OUTPUT:
+               RETVAL
+
+int
+GLSetAttribute ( attr,  value )
+       int        attr
+       int        value
+       CODE:
+               RETVAL = SDL_GL_SetAttribute(attr, value);
+       OUTPUT:
+               RETVAL
+
+AV *
+GLGetAttribute ( attr )
+       int        attr
+       CODE:
+               int value;
+               RETVAL = newAV();
+               av_push(RETVAL,newSViv(SDL_GL_GetAttribute(attr, &value)));
+               av_push(RETVAL,newSViv(value));
+       OUTPUT:
+               RETVAL
+
+void
+GLSwapBuffers ()
+       CODE:
+               SDL_GL_SwapBuffers ();
+
+
+int
+BigEndian ()
+       CODE:
+               RETVAL = (SDL_BYTEORDER == SDL_BIG_ENDIAN);
+       OUTPUT:
+               RETVAL
+
+int
+NumJoysticks ()
+       CODE:
+               RETVAL = SDL_NumJoysticks();
+       OUTPUT:
+               RETVAL
+
+char *
+JoystickName ( index )
+       int index
+       CODE:
+               RETVAL = (char*)SDL_JoystickName(index);
+       OUTPUT:
+               RETVAL
+
+SDL_Joystick *
+JoystickOpen ( index ) 
+       int index
+       CODE:
+               RETVAL = SDL_JoystickOpen(index);
+       OUTPUT:
+               RETVAL
+
+int
+JoystickOpened ( index )
+       int index
+       CODE:
+               RETVAL = SDL_JoystickOpened(index);
+       OUTPUT:
+               RETVAL
+
+int
+JoystickIndex ( joystick )
+       SDL_Joystick *joystick
+       CODE:
+               RETVAL = SDL_JoystickIndex(joystick);
+       OUTPUT:
+               RETVAL
+
+int
+JoystickNumAxes ( joystick )
+       SDL_Joystick *joystick
+       CODE:
+               RETVAL = SDL_JoystickNumAxes(joystick);
+       OUTPUT:
+               RETVAL
+
+int
+JoystickNumBalls ( joystick )
+       SDL_Joystick *joystick
+       CODE:
+               RETVAL = SDL_JoystickNumBalls(joystick);
+       OUTPUT:
+               RETVAL
+
+int
+JoystickNumHats ( joystick )
+       SDL_Joystick *joystick
+       CODE:
+               RETVAL = SDL_JoystickNumHats(joystick);
+       OUTPUT:
+               RETVAL
+
+int
+JoystickNumButtons ( joystick )
+       SDL_Joystick *joystick
+       CODE:
+               RETVAL = SDL_JoystickNumButtons(joystick);
+       OUTPUT:
+               RETVAL
+
+void
+JoystickUpdate ()
+       CODE:
+               SDL_JoystickUpdate();
+
+Sint16
+JoystickGetAxis ( joystick, axis )
+       SDL_Joystick *joystick
+       int axis
+       CODE:
+               RETVAL = SDL_JoystickGetAxis(joystick,axis);
+       OUTPUT:
+               RETVAL
+
+Uint8
+JoystickGetHat ( joystick, hat )
+       SDL_Joystick *joystick
+       int hat 
+       CODE:
+               RETVAL = SDL_JoystickGetHat(joystick,hat);
+       OUTPUT:
+               RETVAL
+
+Uint8
+JoystickGetButton ( joystick, button)
+       SDL_Joystick *joystick
+       int button 
+       CODE:
+               RETVAL = SDL_JoystickGetButton(joystick,button);
+       OUTPUT:
+               RETVAL
+
+AV *
+JoystickGetBall ( joystick, ball )
+       SDL_Joystick *joystick
+       int ball 
+       CODE:
+               int success,dx,dy;
+               success = SDL_JoystickGetBall(joystick,ball,&dx,&dy);
+               RETVAL = newAV();
+               av_push(RETVAL,newSViv(success));
+               av_push(RETVAL,newSViv(dx));
+               av_push(RETVAL,newSViv(dy));
+       OUTPUT:
+               RETVAL  
+
+void
+JoystickClose ( joystick )
+       SDL_Joystick *joystick
+       CODE:
+               SDL_JoystickClose(joystick);
+
+Sint16
+JoyAxisEventWhich ( e )
+       SDL_Event *e
+       CODE:
+               RETVAL = e->jaxis.which;
+       OUTPUT:
+               RETVAL
+
+Uint8
+JoyAxisEventAxis ( e )
+        SDL_Event *e
+        CODE:
+                RETVAL = e->jaxis.axis;
+        OUTPUT:
+                RETVAL
+
+Uint8
+JoyAxisEventValue ( e )
+        SDL_Event *e
+        CODE:
+                RETVAL = e->jaxis.value;
+        OUTPUT:
+                RETVAL
+
+Uint8
+JoyButtonEventWhich ( e )
+        SDL_Event *e
+        CODE:
+                RETVAL = e->jbutton.which;
+        OUTPUT:
+                RETVAL
+
+Uint8
+JoyButtonEventButton ( e )
+        SDL_Event *e
+        CODE:
+                RETVAL = e->jbutton.button;
+        OUTPUT:
+                RETVAL
+
+Uint8
+JoyButtonEventState ( e )
+        SDL_Event *e
+        CODE:
+                RETVAL = e->jbutton.state;
+        OUTPUT:
+                RETVAL
+       
+Uint8
+JoyHatEventWhich ( e )
+        SDL_Event *e
+        CODE:
+                RETVAL = e->jhat.which;
+        OUTPUT:
+                RETVAL
+
+Uint8
+JoyHatEventHat ( e )
+        SDL_Event *e
+        CODE:
+                RETVAL = e->jhat.hat;
+        OUTPUT:
+                RETVAL
+
+Uint8
+JoyHatEventValue ( e )
+        SDL_Event *e
+        CODE:
+                RETVAL = e->jhat.value;
+        OUTPUT:
+                RETVAL
+
+Uint8
+JoyBallEventWhich ( e )
+        SDL_Event *e
+        CODE: 
+                RETVAL = e->jball.which;
+        OUTPUT:
+                RETVAL
+
+Uint8
+JoyBallEventBall ( e )
+        SDL_Event *e
+        CODE:
+                RETVAL = e->jball.ball;
+        OUTPUT:
+                RETVAL
+
+Sint16
+JoyBallEventXrel ( e )
+        SDL_Event *e
+        CODE:
+                RETVAL = e->jball.xrel;
+        OUTPUT:
+                RETVAL
+
+Sint16
+JoyBallEventYrel ( e )
+        SDL_Event *e
+        CODE:
+                RETVAL = e->jball.yrel;
+        OUTPUT:
+                RETVAL
+
+void
+SetClipRect ( surface, rect )
+       SDL_Surface *surface
+       SDL_Rect *rect
+       CODE:
+               SDL_SetClipRect(surface,rect);
+       
+SDL_Rect*
+GetClipRect ( surface )
+       SDL_Surface *surface
+       CODE:
+               RETVAL = (SDL_Rect*) safemalloc(sizeof(SDL_Rect));
+               SDL_GetClipRect(surface,RETVAL);
+       OUTPUT:
+               RETVAL
+
+
+#ifdef HAVE_SDL_NET
+
+int
+NetInit ()
+       CODE:
+               RETVAL = SDLNet_Init();
+       OUTPUT:
+               RETVAL
+
+void
+NetQuit ()
+       CODE:
+               SDLNet_Quit();
+
+IPaddress*
+NetNewIPaddress ( host, port )
+       Uint32 host
+       Uint16 port
+       CODE:
+               RETVAL = (IPaddress*) safemalloc(sizeof(IPaddress));
+               RETVAL->host = host;
+               RETVAL->port = port;
+       OUTPUT:
+               RETVAL
+
+Uint32
+NetIPaddressHost ( ip )
+       IPaddress *ip
+       CODE:
+               RETVAL = ip->host;
+       OUTPUT:
+               RETVAL
+
+Uint16
+NetIPaddressPort ( ip )
+       IPaddress *ip
+       CODE:
+               RETVAL = ip->port;
+       OUTPUT:
+               RETVAL
+
+void
+NetFreeIPaddress ( ip )
+       IPaddress *ip
+       CODE:
+               safefree(ip);
+
+const char*
+NetResolveIP ( address )
+       IPaddress *address
+       CODE:
+               RETVAL = SDLNet_ResolveIP(address);
+       OUTPUT:
+               RETVAL
+
+int
+NetResolveHost ( address, host, port )
+       IPaddress *address
+       const char *host
+       Uint16 port
+       CODE:
+               RETVAL = SDLNet_ResolveHost(address,host,port);
+       OUTPUT:
+               RETVAL
+       
+TCPsocket
+NetTCPOpen ( ip )
+       IPaddress *ip
+       CODE:
+               RETVAL = SDLNet_TCP_Open(ip);
+       OUTPUT:
+               RETVAL
+
+TCPsocket
+NetTCPAccept ( server )
+       TCPsocket server
+       CODE:
+               RETVAL = SDLNet_TCP_Accept(server);
+       OUTPUT:
+               RETVAL
+
+IPaddress*
+NetTCPGetPeerAddress ( sock )
+       TCPsocket sock
+       CODE:
+               RETVAL = SDLNet_TCP_GetPeerAddress(sock);
+       OUTPUT:
+               RETVAL
+
+int
+NetTCPSend ( sock, data, len  )
+       TCPsocket sock
+       void *data
+       int len
+       CODE:
+               RETVAL = SDLNet_TCP_Send(sock,data,len);
+       OUTPUT:
+               RETVAL
+
+AV*
+NetTCPRecv ( sock, maxlen )
+       TCPsocket sock
+       int maxlen
+       CODE:
+               int status;
+               void *buffer;
+               buffer = safemalloc(maxlen);
+               RETVAL = newAV();
+               status = SDLNet_TCP_Recv(sock,buffer,maxlen);
+               av_push(RETVAL,newSViv(status));
+               av_push(RETVAL,newSVpvn((char*)buffer,maxlen));
+       OUTPUT:
+               RETVAL  
+       
+void
+NetTCPClose ( sock )
+       TCPsocket sock
+       CODE:
+               SDLNet_TCP_Close(sock);
+
+UDPpacket*
+NetAllocPacket ( size )
+       int size
+       CODE:
+               RETVAL = SDLNet_AllocPacket(size);
+       OUTPUT:
+               RETVAL
+
+UDPpacket**
+NetAllocPacketV ( howmany, size )
+       int howmany
+       int size
+       CODE:
+               RETVAL = SDLNet_AllocPacketV(howmany,size);
+       OUTPUT:
+               RETVAL
+
+int
+NetResizePacket ( packet, newsize )
+       UDPpacket *packet
+       int newsize
+       CODE:
+               RETVAL = SDLNet_ResizePacket(packet,newsize);
+       OUTPUT:
+               RETVAL
+
+void
+NetFreePacket ( packet )
+       UDPpacket *packet
+       CODE:
+               SDLNet_FreePacket(packet);
+
+void
+NetFreePacketV ( packet )
+       UDPpacket **packet
+       CODE:
+               SDLNet_FreePacketV(packet);
+
+UDPsocket
+NetUDPOpen ( port )
+       Uint16 port
+       CODE:
+               RETVAL = SDLNet_UDP_Open(port);
+       OUTPUT:
+               RETVAL
+
+int
+NetUDPBind ( sock, channel, address )
+       UDPsocket sock
+       int channel
+       IPaddress *address
+       CODE:
+               RETVAL = SDLNet_UDP_Bind(sock,channel,address);
+       OUTPUT:
+               RETVAL
+
+void
+NetUDPUnbind ( sock, channel )
+       UDPsocket sock
+       int channel
+       CODE:
+               SDLNet_UDP_Unbind(sock,channel);
+
+IPaddress*
+NetUDPGetPeerAddress ( sock, channel )
+       UDPsocket sock
+       int channel
+       CODE:
+               RETVAL = SDLNet_UDP_GetPeerAddress(sock,channel);
+       OUTPUT:
+               RETVAL
+
+int
+NetUDPSendV ( sock, packets, npackets )
+       UDPsocket sock
+       UDPpacket **packets
+       int npackets
+       CODE:
+               RETVAL = SDLNet_UDP_SendV(sock,packets,npackets);
+       OUTPUT:
+               RETVAL
+
+int
+NetUDPSend ( sock, channel, packet )
+       UDPsocket sock
+       int channel
+       UDPpacket *packet 
+       CODE:
+               RETVAL = SDLNet_UDP_Send(sock,channel,packet);
+       OUTPUT:
+               RETVAL
+
+int
+NetUDPRecvV ( sock, packets )
+       UDPsocket sock
+       UDPpacket **packets
+       CODE:
+               RETVAL = SDLNet_UDP_RecvV(sock,packets);
+       OUTPUT:
+               RETVAL
+
+int
+NetUDPRecv ( sock, packet )
+       UDPsocket sock
+       UDPpacket *packet
+       CODE:
+               RETVAL = SDLNet_UDP_Recv(sock,packet);
+       OUTPUT:
+               RETVAL
+
+void
+NetUDPClose ( sock )
+       UDPsocket sock
+       CODE:
+               SDLNet_UDP_Close(sock);
+
+SDLNet_SocketSet
+NetAllocSocketSet ( maxsockets )
+       int maxsockets
+       CODE:
+               RETVAL = SDLNet_AllocSocketSet(maxsockets);
+       OUTPUT:
+               RETVAL
+
+int
+NetTCP_AddSocket ( set, sock )
+       SDLNet_SocketSet set
+       TCPsocket sock
+       CODE:
+               RETVAL = SDLNet_TCP_AddSocket(set,sock);
+       OUTPUT:
+               RETVAL
+
+int
+NetUDP_AddSocket ( set, sock )
+       SDLNet_SocketSet set
+       UDPsocket sock
+       CODE:
+               RETVAL = SDLNet_UDP_AddSocket(set,sock);
+       OUTPUT:
+               RETVAL
+
+int
+NetTCP_DelSocket ( set, sock )
+       SDLNet_SocketSet set
+       TCPsocket sock
+       CODE:
+               RETVAL = SDLNet_TCP_DelSocket(set,sock);
+       OUTPUT:
+               RETVAL
+
+int
+NetUDP_DelSocket ( set, sock )
+       SDLNet_SocketSet set
+       UDPsocket sock
+       CODE:
+               RETVAL = SDLNet_UDP_DelSocket(set,sock);
+       OUTPUT:
+               RETVAL
+
+int
+NetCheckSockets ( set, timeout )
+       SDLNet_SocketSet set
+       Uint32 timeout
+       CODE:
+               RETVAL = SDLNet_CheckSockets(set,timeout);
+       OUTPUT:
+               RETVAL
+
+int
+NetSocketReady ( sock )
+       SDLNet_GenericSocket sock
+       CODE:
+               RETVAL = SDLNet_SocketReady(sock);
+       OUTPUT:
+               RETVAL
+
+void
+NetFreeSocketSet ( set )
+       SDLNet_SocketSet set
+       CODE:
+               SDLNet_FreeSocketSet(set);
+
+void
+NetWrite16 ( value, area )
+       Uint16 value
+       void *area
+       CODE:
+               SDLNet_Write16(value,area);
+
+void
+NetWrite32 ( value, area )
+       Uint32 value
+       void *area
+       CODE:
+               SDLNet_Write32(value,area);
+       
+Uint16
+NetRead16 ( area )
+       void *area
+       CODE:
+               RETVAL = SDLNet_Read16(area);
+       OUTPUT:
+               RETVAL
+
+Uint32
+NetRead32 ( area )
+       void *area
+       CODE:
+               RETVAL = SDLNet_Read32(area);
+       OUTPUT:
+               RETVAL
+
+#endif 
+
+#ifdef HAVE_SDL_TTF
+
+int
+TTFInit ()
+       CODE:
+               RETVAL = TTF_Init();
+       OUTPUT:
+               RETVAL
+
+void
+TTFQuit ()
+       CODE:
+               TTF_Quit();
+
+TTF_Font*
+TTFOpenFont ( file, ptsize )
+       char *file
+       int ptsize
+       CODE:
+               RETVAL = TTF_OpenFont(file,ptsize);
+       OUTPUT:
+               RETVAL
+
+int
+TTFGetFontStyle ( font )
+       TTF_Font *font
+       CODE:
+               RETVAL = TTF_GetFontStyle(font);
+       OUTPUT:
+               RETVAL
+
+void
+TTFSetFontStyle ( font, style )
+       TTF_Font *font
+       int style
+       CODE:
+               TTF_SetFontStyle(font,style);
+       
+int
+TTFFontHeight ( font )
+       TTF_Font *font
+       CODE:
+               RETVAL = TTF_FontHeight(font);
+       OUTPUT:
+               RETVAL
+
+int
+TTFFontAscent ( font )
+       TTF_Font *font
+       CODE:
+               RETVAL = TTF_FontAscent(font);
+       OUTPUT:
+               RETVAL
+
+int
+TTFFontDescent ( font )
+       TTF_Font *font
+       CODE:
+               RETVAL = TTF_FontDescent(font);
+       OUTPUT:
+               RETVAL
+
+int
+TTFFontLineSkip ( font )
+       TTF_Font *font
+       CODE:
+               RETVAL = TTF_FontLineSkip(font);
+       OUTPUT:
+               RETVAL
+
+AV*
+TTFGlyphMetrics ( font, ch )
+       TTF_Font *font
+       Uint16 ch
+       CODE:
+               int minx, miny, maxx, maxy, advance;
+               RETVAL = newAV();
+               TTF_GlyphMetrics(font, ch, &minx, &miny, &maxx, &maxy, &advance);
+               av_push(RETVAL,newSViv(minx));
+               av_push(RETVAL,newSViv(miny));
+               av_push(RETVAL,newSViv(maxx));
+               av_push(RETVAL,newSViv(maxy));
+               av_push(RETVAL,newSViv(advance));
+       OUTPUT:
+               RETVAL
+
+AV*
+TTFSizeText ( font, text )
+       TTF_Font *font
+       char *text
+       CODE:
+               int w,h;
+               RETVAL = newAV();
+               TTF_SizeText(font,text,&w,&h);
+               av_push(RETVAL,newSViv(w));
+               av_push(RETVAL,newSViv(h));
+       OUTPUT:
+               RETVAL
+
+AV*
+TTFSizeUTF8 ( font, text )
+       TTF_Font *font
+       char *text
+       CODE:
+               int w,h;
+               RETVAL = newAV();
+               TTF_SizeUTF8(font,text,&w,&h);
+               av_push(RETVAL,newSViv(w));
+               av_push(RETVAL,newSViv(h));
+       OUTPUT:
+               RETVAL
+
+AV*
+TTFSizeUNICODE ( font, text )
+       TTF_Font *font
+       const Uint16 *text
+       CODE:
+               int w,h;
+               RETVAL = newAV();
+               TTF_SizeUNICODE(font,text,&w,&h);
+               av_push(RETVAL,newSViv(w));
+               av_push(RETVAL,newSViv(h));
+       OUTPUT:
+               RETVAL
+
+SDL_Surface*
+TTFRenderTextSolid ( font, text, fg )
+       TTF_Font *font
+       char *text
+       SDL_Color *fg
+       CODE:
+               RETVAL = TTF_RenderText_Solid(font,text,*fg);
+       OUTPUT:
+               RETVAL
+
+SDL_Surface*
+TTFRenderUTF8Solid ( font, text, fg )
+       TTF_Font *font
+       char *text
+       SDL_Color *fg
+       CODE:
+               RETVAL = TTF_RenderUTF8_Solid(font,text,*fg);
+       OUTPUT:
+               RETVAL
+
+SDL_Surface*
+TTFRenderUNICODESolid ( font, text, fg )
+       TTF_Font *font
+       const Uint16 *text
+       SDL_Color *fg
+       CODE:
+               RETVAL = TTF_RenderUNICODE_Solid(font,text,*fg);
+       OUTPUT:
+               RETVAL
+
+SDL_Surface*
+TTFRenderGlyphSolid ( font, ch, fg )
+       TTF_Font *font
+       Uint16 ch
+       SDL_Color *fg
+       CODE:
+               RETVAL = TTF_RenderGlyph_Solid(font,ch,*fg);
+       OUTPUT:
+               RETVAL
+
+SDL_Surface*
+TTFRenderTextShaded ( font, text, fg, bg )
+       TTF_Font *font
+       char *text
+       SDL_Color *fg
+       SDL_Color *bg
+       CODE:
+               RETVAL = TTF_RenderText_Shaded(font,text,*fg,*bg);
+       OUTPUT:
+               RETVAL
+
+SDL_Surface*
+TTFRenderUTF8Shaded( font, text, fg, bg )
+       TTF_Font *font
+       char *text
+       SDL_Color *fg
+       SDL_Color *bg
+       CODE:
+               RETVAL = TTF_RenderUTF8_Shaded(font,text,*fg,*bg);
+       OUTPUT:
+               RETVAL
+
+SDL_Surface*
+TTFRenderUNICODEShaded( font, text, fg, bg )
+       TTF_Font *font
+       const Uint16 *text
+       SDL_Color *fg
+       SDL_Color *bg
+       CODE:
+               RETVAL = TTF_RenderUNICODE_Shaded(font,text,*fg,*bg);
+       OUTPUT:
+               RETVAL
+
+SDL_Surface*
+TTFRenderGlyphShaded ( font, ch, fg, bg )
+       TTF_Font *font
+       Uint16 ch
+       SDL_Color *fg
+       SDL_Color *bg
+       CODE:
+               RETVAL = TTF_RenderGlyph_Shaded(font,ch,*fg,*bg);
+       OUTPUT:
+               RETVAL
+
+SDL_Surface*
+TTFRenderTextBlended( font, text, fg )
+       TTF_Font *font
+       char *text
+       SDL_Color *fg
+       CODE:
+               RETVAL = TTF_RenderText_Blended(font,text,*fg);
+       OUTPUT:
+               RETVAL
+
+SDL_Surface*
+TTFRenderUTF8Blended( font, text, fg )
+       TTF_Font *font
+       char *text
+       SDL_Color *fg
+       CODE:
+               RETVAL = TTF_RenderUTF8_Blended(font,text,*fg);
+       OUTPUT:
+               RETVAL
+
+SDL_Surface*
+TTFRenderUNICODEBlended( font, text, fg )
+       TTF_Font *font
+       const Uint16 *text
+       SDL_Color *fg
+       CODE:
+               RETVAL = TTF_RenderUNICODE_Blended(font,text,*fg);
+       OUTPUT:
+               RETVAL
+
+SDL_Surface*
+TTFRenderGlyphBlended( font, ch, fg )
+       TTF_Font *font
+       Uint16 ch
+       SDL_Color *fg
+       CODE:
+               RETVAL = TTF_RenderGlyph_Blended(font,ch,*fg);
+       OUTPUT:
+               RETVAL
+
+void
+TTFCloseFont ( font )
+       TTF_Font *font
+       CODE:
+               TTF_CloseFont(font);
+
+SDL_Surface*
+TTFPutString ( font, mode, surface, x, y, fg, bg, text )
+       TTF_Font *font
+       int mode
+       SDL_Surface *surface
+       int x
+       int y
+       SDL_Color *fg
+       SDL_Color *bg
+       char *text
+       CODE:
+               SDL_Surface *img;
+               SDL_Rect dest;
+               int w,h;
+               dest.x = x;
+               dest.y = y;
+               RETVAL = NULL;
+               switch (mode) {
+                       case TEXT_SOLID:
+                               img = TTF_RenderText_Solid(font,text,*fg);
+                               TTF_SizeText(font,text,&w,&h);
+                               dest.w = w;
+                               dest.h = h;
+                               break;
+                       case TEXT_SHADED:
+                               img = TTF_RenderText_Shaded(font,text,*fg,*bg);
+                               TTF_SizeText(font,text,&w,&h);
+                               dest.w = w;
+                               dest.h = h;
+                               break;
+                       case TEXT_BLENDED:
+                               img = TTF_RenderText_Blended(font,text,*fg);
+                               TTF_SizeText(font,text,&w,&h);
+                               dest.w = w;
+                               dest.h = h;
+                               break;
+                       case UTF8_SOLID:
+                               img = TTF_RenderUTF8_Solid(font,text,*fg);
+                               TTF_SizeUTF8(font,text,&w,&h);
+                               dest.w = w;
+                               dest.h = h;
+                               break;
+                       case UTF8_SHADED:
+                               img = TTF_RenderUTF8_Shaded(font,text,*fg,*bg);
+                               TTF_SizeUTF8(font,text,&w,&h);
+                               dest.w = w;
+                               dest.h = h;
+                               break;
+                       case UTF8_BLENDED:
+                               img = TTF_RenderUTF8_Blended(font,text,*fg);
+                               TTF_SizeUTF8(font,text,&w,&h);
+                               dest.w = w;
+                               dest.h = h;
+                               break;
+                       case UNICODE_SOLID:
+                               img = TTF_RenderUNICODE_Solid(font,(Uint16*)text,*fg);
+                               TTF_SizeUNICODE(font,(Uint16*)text,&w,&h);
+                               dest.w = w;
+                               dest.h = h;
+                               break;
+                       case UNICODE_SHADED:
+                               img = TTF_RenderUNICODE_Shaded(font,(Uint16*)text,*fg,*bg);
+                               TTF_SizeUNICODE(font,(Uint16*)text,&w,&h);
+                               dest.w = w;
+                               dest.h = h;
+                               break;
+                       case UNICODE_BLENDED:
+                               img = TTF_RenderUNICODE_Blended(font,(Uint16*)text,*fg);
+                               TTF_SizeUNICODE(font,(Uint16*)text,&w,&h);
+                               dest.w = w;
+                               dest.h = h;
+                               break;
+                       default:
+                               img = TTF_RenderText_Shaded(font,text,*fg,*bg);
+                               TTF_SizeText(font,text,&w,&h);
+                               dest.w = w;
+                               dest.h = h;
+               }
+               if ( img && img->format && img->format->palette ) {
+                       SDL_Color *c = &img->format->palette->colors[0];
+                       Uint32 key = SDL_MapRGB( img->format, c->r, c->g, c->b );
+                       SDL_SetColorKey(img,SDL_SRCCOLORKEY,key );
+                       if (0 > SDL_BlitSurface(img,NULL,surface,&dest)) {
+                               SDL_FreeSurface(img);
+                               RETVAL = NULL;  
+                       } else {
+                               RETVAL = img;
+                       }
+               }
+       OUTPUT:
+               RETVAL
+
+#endif
+
+SDL_Overlay*
+CreateYUVOverlay ( width, height, format, display )
+       int width
+       int height
+       Uint32 format
+       SDL_Surface *display
+       CODE:
+               RETVAL = SDL_CreateYUVOverlay ( width, height, format, display );
+       OUTPUT:
+               RETVAL
+
+int
+LockYUVOverlay ( overlay )
+       SDL_Overlay *overlay
+       CODE:
+               RETVAL = SDL_LockYUVOverlay(overlay);
+       OUTPUT:
+               RETVAL
+
+void
+UnlockYUVOverlay ( overlay )
+        SDL_Overlay *overlay
+        CODE:
+                SDL_UnlockYUVOverlay(overlay);
+
+int
+DisplayYUVOverlay ( overlay, dstrect )
+       SDL_Overlay *overlay
+       SDL_Rect *dstrect
+       CODE:
+               RETVAL = SDL_DisplayYUVOverlay ( overlay, dstrect );
+       OUTPUT:
+               RETVAL
+
+void
+FreeYUVOverlay ( overlay )
+        SDL_Overlay *overlay
+        CODE:
+                SDL_FreeYUVOverlay ( overlay );
+
+Uint32
+OverlayFormat ( overlay, ... )
+       SDL_Overlay *overlay
+       CODE:
+               if ( items > 1 ) 
+                       overlay->format = SvIV(ST(1));
+               RETVAL = overlay->format;
+       OUTPUT:
+               RETVAL
+
+int 
+OverlayW ( overlay, ... )
+       SDL_Overlay *overlay
+       CODE:
+               if ( items > 1 ) 
+                       overlay->w = SvIV(ST(1));
+               RETVAL = overlay->w;
+       OUTPUT:
+               RETVAL
+
+int
+OverlayH ( overlay, ... )
+       SDL_Overlay *overlay
+       CODE:
+               if ( items > 1 )
+                       overlay->h = SvIV(ST(1));
+               RETVAL = overlay->h;
+       OUTPUT:
+               RETVAL 
+
+int
+OverlayPlanes ( overlay, ... )
+        SDL_Overlay *overlay
+        CODE:
+                if ( items > 1 )
+                        overlay->planes = SvIV(ST(1));
+                RETVAL = overlay->planes;
+        OUTPUT:
+                RETVAL
+
+Uint32
+OverlayHW ( overlay )
+       SDL_Overlay *overlay
+       CODE:
+               RETVAL = overlay->hw_overlay;
+       OUTPUT:
+               RETVAL
+
+Uint16*
+OverlayPitches ( overlay )
+       SDL_Overlay *overlay
+       CODE:
+               RETVAL = overlay->pitches;
+       OUTPUT:
+               RETVAL
+
+Uint8**
+OverlayPixels ( overlay )
+       SDL_Overlay *overlay
+       CODE:
+               RETVAL = overlay->pixels;
+       OUTPUT:
+               RETVAL
+
+int
+WMToggleFullScreen ( surface )
+       SDL_Surface *surface
+       CODE:
+               RETVAL = SDL_WM_ToggleFullScreen(surface);
+       OUTPUT:
+               RETVAL
+
+Uint32
+WMGrabInput ( mode )
+       Uint32 mode
+       CODE:
+               RETVAL = SDL_WM_GrabInput(mode);
+       OUTPUT:
+               RETVAL
+
+int
+WMIconifyWindow ()
+       CODE:
+               RETVAL = SDL_WM_IconifyWindow();
+       OUTPUT:
+               RETVAL
+
+int
+ResizeEventW ( e )
+       SDL_Event *e
+       CODE:
+               RETVAL = e->resize.w;
+       OUTPUT:
+               RETVAL
+
+int
+ResizeEventH ( e )
+       SDL_Event *e
+       CODE:
+               RETVAL = e->resize.h;
+       OUTPUT:
+               RETVAL
+
+char*
+AudioDriverName ()
+       CODE:
+               char name[32];
+               RETVAL = SDL_AudioDriverName(name,32);
+       OUTPUT:
+               RETVAL
+
+Uint32
+GetKeyState ( k )
+       SDLKey k
+       CODE:
+               if (k >= SDLK_LAST) Perl_croak (aTHX_ "Key out of range");      
+               RETVAL = SDL_GetKeyState(NULL)[k];
+       OUTPUT:
+               RETVAL
+
+#ifdef HAVE_SMPEG
+
+SMPEG_Info *
+NewSMPEGInfo()
+       CODE:   
+               RETVAL = (SMPEG_Info *) safemalloc (sizeof(SMPEG_Info));
+       OUTPUT:
+               RETVAL
+
+void
+FreeSMPEGInfo ( info )
+       SMPEG_Info *info
+       CODE:   
+               safefree(info);
+
+int
+SMPEGInfoHasAudio ( info )
+       SMPEG_Info* info
+       CODE:
+               RETVAL = info->has_audio;
+       OUTPUT:
+               RETVAL
+
+int
+SMPEGInfoHasVideo ( info )
+       SMPEG_Info* info
+       CODE:
+               RETVAL = info->has_video;
+       OUTPUT:
+               RETVAL
+
+int
+SMPEGInfoWidth ( info )
+       SMPEG_Info* info
+       CODE:
+               RETVAL = info->width;
+       OUTPUT:
+               RETVAL
+
+int
+SMPEGInfoHeight ( info )
+       SMPEG_Info* info
+       CODE:
+               RETVAL = info->height;
+       OUTPUT:
+               RETVAL
+
+int
+SMPEGInfoCurrentFrame ( info )
+       SMPEG_Info* info
+       CODE:
+               RETVAL = info->current_frame;
+       OUTPUT:
+               RETVAL
+
+double
+SMPEGInfoCurrentFPS ( info )
+       SMPEG_Info* info
+       CODE:
+               RETVAL = info->current_fps;
+       OUTPUT:
+               RETVAL
+
+int
+SMPEGInfoCurrentAudioFrame ( info )
+       SMPEG_Info* info
+       CODE:
+               RETVAL = info->audio_current_frame;
+       OUTPUT:
+               RETVAL
+
+int
+SMPEGInfoCurrentOffset ( info )
+       SMPEG_Info* info
+       CODE:
+               RETVAL = info->current_offset;
+       OUTPUT:
+               RETVAL
+
+int
+SMPEGInfoTotalSize ( info )
+       SMPEG_Info* info
+       CODE:
+               RETVAL = info->total_size;
+       OUTPUT:
+               RETVAL
+
+double
+SMPEGInfoCurrentTime ( info )
+       SMPEG_Info* info
+       CODE:
+               RETVAL = info->current_time;
+       OUTPUT:
+               RETVAL
+
+double
+SMPEGInfoTotalTime ( info )
+       SMPEG_Info* info
+       CODE:
+               RETVAL = info->total_time;
+       OUTPUT:
+               RETVAL
+
+char *
+SMPEGError ( mpeg )
+       SMPEG* mpeg
+       CODE:   
+               RETVAL = SMPEG_error(mpeg);
+       OUTPUT:
+               RETVAL
+
+SMPEG*
+NewSMPEG ( filename, info, use_audio )
+       char* filename
+       SMPEG_Info* info
+       int use_audio
+       CODE:   
+#ifdef HAVE_SDL_MIXER
+               RETVAL = SMPEG_new(filename,info,0);
+#else
+               RETVAL = SMPEG_new(filename,info,use_audio);
+#endif
+       OUTPUT:
+               RETVAL
+
+void
+FreeSMPEG ( mpeg )
+       SMPEG* mpeg
+       CODE:
+               SMPEG_delete(mpeg);
+
+void
+SMPEGEnableAudio ( mpeg , flag )
+       SMPEG* mpeg
+       int flag
+       CODE:   
+               SMPEG_enableaudio(mpeg,flag);
+#ifdef HAVE_SDL_MIXER
+               sdl_perl_use_smpeg_audio = flag;
+#endif
+
+void
+SMPEGEnableVideo ( mpeg , flag )
+       SMPEG* mpeg
+       int flag
+       CODE:   
+               SMPEG_enablevideo(mpeg,flag);
+
+void
+SMPEGSetVolume ( mpeg , volume )
+       SMPEG* mpeg
+       int volume
+       CODE:   
+               SMPEG_setvolume(mpeg,volume);
+
+void
+SMPEGSetDisplay ( mpeg, dest, surfLock )
+       SMPEG* mpeg
+       SDL_Surface* dest
+       SDL_mutex*  surfLock
+       CODE:
+               SMPEG_setdisplay(mpeg,dest,surfLock,NULL);
+
+void
+SMPEGScaleXY ( mpeg, w, h)
+       SMPEG* mpeg
+       int w
+       int h
+       CODE:
+               SMPEG_scaleXY(mpeg,w,h);
+
+void
+SMPEGScale ( mpeg, scale )
+       SMPEG* mpeg
+       int scale
+       CODE:
+               SMPEG_scale(mpeg,scale);
+
+void
+SMPEGPlay ( mpeg )
+       SMPEG* mpeg
+       CODE:
+                SDL_AudioSpec audiofmt;
+                Uint16 format;
+                int freq, channels;
+#ifdef HAVE_SDL_MIXER
+               if  (sdl_perl_use_smpeg_audio ) {
+                               SMPEG_enableaudio(mpeg, 0);
+                       Mix_QuerySpec(&freq, &format, &channels);
+                       audiofmt.format = format;
+                       audiofmt.freq = freq;
+                       audiofmt.channels = channels;
+                       SMPEG_actualSpec(mpeg, &audiofmt);
+                       Mix_HookMusic(SMPEG_playAudioSDL, mpeg);
+                       SMPEG_enableaudio(mpeg, 1);
+               }
+#endif
+               SMPEG_play(mpeg);
+
+SMPEGstatus
+SMPEGStatus ( mpeg )
+       SMPEG* mpeg
+       CODE:
+               RETVAL = SMPEG_status(mpeg);
+       OUTPUT:
+               RETVAL
+
+void
+SMPEGPause ( mpeg )
+       SMPEG* mpeg
+       CODE:
+               SMPEG_pause(mpeg);
+
+void
+SMPEGLoop ( mpeg, repeat )
+       SMPEG* mpeg
+       int repeat
+       CODE:
+               SMPEG_loop(mpeg,repeat);
+
+void
+SMPEGStop ( mpeg )
+       SMPEG* mpeg
+       CODE:
+               SMPEG_stop(mpeg);
+#ifdef HAVE_SDL_MIXER
+               Mix_HookMusic(NULL, NULL);
+#endif
+
+void
+SMPEGRewind ( mpeg )
+       SMPEG* mpeg
+       CODE:
+               SMPEG_rewind(mpeg);
+
+void
+SMPEGSeek ( mpeg, bytes )
+       SMPEG* mpeg
+       int bytes
+       CODE:
+               SMPEG_seek(mpeg,bytes);
+
+void
+SMPEGSkip ( mpeg, seconds )
+       SMPEG* mpeg
+       float seconds
+       CODE:
+               SMPEG_skip(mpeg,seconds);
+
+void
+SMPEGSetDisplayRegion ( mpeg, rect )
+       SMPEG* mpeg
+       SDL_Rect* rect
+       CODE:
+               SMPEG_setdisplayregion(mpeg,rect->x,rect->y,rect->w,rect->h);
+
+void
+SMPEGRenderFrame ( mpeg, frame )
+       SMPEG* mpeg
+       int frame
+       CODE:
+               SMPEG_renderFrame(mpeg,frame);
+
+SMPEG_Info *
+SMPEGGetInfo ( mpeg )
+       SMPEG* mpeg
+       CODE:
+               RETVAL = (SMPEG_Info *) safemalloc (sizeof(SMPEG_Info));
+               SMPEG_getinfo(mpeg,RETVAL);
+       OUTPUT:
+               RETVAL
+       
+
+#endif
+
+#ifdef HAVE_SDL_GFX
+
+SDL_Surface *
+GFXRotoZoom ( src, angle, zoom, smooth)
+       SDL_Surface * src
+       double angle
+       double zoom
+       int smooth
+       CODE:
+               RETVAL = rotozoomSurface( src, angle, zoom, smooth);
+       OUTPUT:
+               RETVAL
+
+SDL_Surface *
+GFXZoom ( src, zoomx, zoomy, smooth)
+       SDL_Surface *src
+       double zoomx
+       double zoomy
+       int smooth
+       CODE:
+               RETVAL = zoomSurface( src, zoomx, zoomy, smooth);
+       OUTPUT:
+               RETVAL
+
+int
+GFXPixelColor ( dst, x, y, color )
+       SDL_Surface* dst
+       Sint16 x
+       Sint16 y
+       Uint32 color
+       CODE:
+               RETVAL = pixelColor( dst, x, y, color);
+       OUTPUT:
+               RETVAL
+
+int
+GFXPixelRGBA ( dst, x, y, r, g, b, a )
+       SDL_Surface* dst
+       Sint16 x
+       Sint16 y
+       Uint8 r
+       Uint8 g
+       Uint8 b
+       Uint8 a
+       CODE:
+               RETVAL = pixelRGBA( dst, x, y, r, g, b, a );
+       OUTPUT:
+               RETVAL
+
+int
+GFXHlineColor ( dst, x1, x2, y, color )
+       SDL_Surface* dst
+       Sint16 x1
+       Sint16 x2
+       Sint16 y
+       Uint32 color
+       CODE:
+               RETVAL = hlineColor( dst, x1, x2, y, color );
+       OUTPUT:
+               RETVAL
+
+int
+GFXHlineRGBA ( dst, x1, x2, y, r, g, b, a )
+       SDL_Surface* dst
+       Sint16 x1
+       Sint16 x2
+       Sint16 y
+       Uint8 r
+       Uint8 g
+       Uint8 b
+       Uint8 a
+       CODE:
+               RETVAL = hlineRGBA( dst, x1, x2, y, r, g, b, a );
+       OUTPUT:
+               RETVAL
+
+int
+GFXVlineColor ( dst, x, y1, y2, color )
+       SDL_Surface* dst
+       Sint16 x
+       Sint16 y1
+       Sint16 y2
+       Uint32 color
+       CODE:
+               RETVAL = vlineColor( dst, x, y1, y2, color );
+       OUTPUT:
+               RETVAL
+
+int
+GFXVlineRGBA ( dst, x, y1, y2, r, g, b, a )
+       SDL_Surface* dst
+       Sint16 x
+       Sint16 y1
+       Sint16 y2
+       Uint8 r
+       Uint8 g
+       Uint8 b
+       Uint8 a
+       CODE:
+               RETVAL = vlineRGBA( dst, x, y1, y2, r, g, b, a );
+       OUTPUT:
+               RETVAL
+
+int
+GFXRectangleColor ( dst, x1, y1, x2, y2, color )
+       SDL_Surface* dst
+       Sint16 x1
+       Sint16 y1
+       Sint16 x2
+       Sint16 y2
+       Uint32 color
+       CODE:
+               RETVAL = rectangleColor( dst, x1, y1, x2, y2, color );
+       OUTPUT:
+               RETVAL
+
+int
+GFXRectangleRGBA ( dst, x1, y1, x2, y2, r, g, b, a )
+       SDL_Surface* dst
+       Sint16 x1
+       Sint16 y1
+       Sint16 x2
+       Sint16 y2
+       Uint8 r
+       Uint8 g
+       Uint8 b
+       Uint8 a
+       CODE:
+               RETVAL = rectangleRGBA( dst, x1, y1, x2, y2, r, g, b, a );
+       OUTPUT:
+               RETVAL
+
+int
+GFXBoxColor ( dst, x1, y1, x2, y2, color )
+       SDL_Surface* dst
+       Sint16 x1
+       Sint16 y1
+       Sint16 x2
+       Sint16 y2
+       Uint32 color
+       CODE:
+               RETVAL = boxColor( dst, x1, y1, x2, y2, color );
+       OUTPUT:
+               RETVAL
+
+int
+GFXBoxRGBA ( dst, x1, y1, x2, y2, r, g, b, a )
+       SDL_Surface* dst;
+       Sint16 x1
+       Sint16 y1
+       Sint16 x2
+       Sint16 y2
+       Uint8 r
+       Uint8 g
+       Uint8 b
+       Uint8 a
+       CODE:
+               RETVAL = boxRGBA( dst, x1, y1, x2, y2, r, g, b, a );
+       OUTPUT:
+               RETVAL
+
+int
+GFXLineColor ( dst, x1, y1, x2, y2, color )
+       SDL_Surface* dst
+       Sint16 x1
+       Sint16 y1
+       Sint16 x2
+       Sint16 y2
+       Uint32 color
+       CODE:
+               RETVAL = lineColor( dst, x1, y1, x2, y2, color );
+       OUTPUT:
+               RETVAL
+
+int
+GFXLineRGBA ( dst, x1, y1, x2, y2, r, g, b, a )
+       SDL_Surface* dst
+       Sint16 x1
+       Sint16 y1
+       Sint16 x2
+       Sint16 y2
+       Uint8 r
+       Uint8 g
+       Uint8 b
+       Uint8 a
+       CODE:
+               RETVAL = lineRGBA( dst, x1, y1, x2, y2, r, g, b, a );
+       OUTPUT:
+               RETVAL
+
+int
+GFXAalineColor ( dst, x1, y1, x2, y2, color )
+       SDL_Surface* dst
+       Sint16 x1
+       Sint16 y1
+       Sint16 x2
+       Sint16 y2
+       Uint32 color
+       CODE:
+               RETVAL = aalineColor( dst, x1, y1, x2, y2, color );
+       OUTPUT:
+               RETVAL
+
+int
+GFXAalineRGBA ( dst, x1, y1, x2, y2, r, g, b, a )
+       SDL_Surface* dst
+       Sint16 x1
+       Sint16 y1
+       Sint16 x2
+       Sint16 y2
+       Uint8 r
+       Uint8 g
+       Uint8 b
+       Uint8 a
+       CODE:
+               RETVAL = aalineRGBA( dst, x1, y1, x2, y2, r, g, b, a );
+       OUTPUT:
+               RETVAL
+
+int
+GFXCircleColor ( dst, x, y, r, color )
+       SDL_Surface* dst
+       Sint16 x
+       Sint16 y
+       Sint16 r
+       Uint32 color
+       CODE:
+               RETVAL = circleColor( dst, x, y, r, color );
+       OUTPUT:
+               RETVAL
+
+int
+GFXCircleRGBA ( dst, x, y, rad, r, g, b, a )
+       SDL_Surface* dst
+       Sint16 x
+       Sint16 y
+       Sint16 rad
+       Uint8 r
+       Uint8 g
+       Uint8 b
+       Uint8 a
+       CODE:
+               RETVAL = circleRGBA( dst, x, y, rad, r, g, b, a );
+       OUTPUT:
+               RETVAL
+
+int
+GFXAacircleColor ( dst, x, y, r, color )
+       SDL_Surface* dst
+       Sint16 x
+       Sint16 y
+       Sint16 r
+       Uint32 color
+       CODE:
+               RETVAL = aacircleColor( dst, x, y, r, color );
+       OUTPUT:
+               RETVAL
+
+int
+GFXAacircleRGBA ( dst, x, y, rad, r, g, b, a )
+       SDL_Surface* dst
+       Sint16 x
+       Sint16 y
+       Sint16 rad
+       Uint8 r
+       Uint8 g
+       Uint8 b
+       Uint8 a
+       CODE:
+               RETVAL = aacircleRGBA( dst, x, y, rad, r, g, b, a );
+       OUTPUT:
+               RETVAL
+
+int
+GFXFilledCircleColor ( dst, x, y, r, color )
+       SDL_Surface* dst
+       Sint16 x
+       Sint16 y
+       Sint16 r
+       Uint32 color
+       CODE:
+               RETVAL = filledCircleColor( dst, x, y, r, color );
+       OUTPUT:
+               RETVAL
+
+int
+GFXFilledCircleRGBA ( dst, x, y, rad, r, g, b, a )
+       SDL_Surface* dst
+       Sint16 x
+       Sint16 y
+       Sint16 rad
+       Uint8 r
+       Uint8 g
+       Uint8 b
+       Uint8 a
+       CODE:
+               RETVAL = filledCircleRGBA( dst, x, y, rad, r, g, b, a );
+       OUTPUT:
+               RETVAL
+
+int
+GFXEllipseColor ( dst, x, y, rx, ry, color )
+       SDL_Surface* dst
+       Sint16 x
+       Sint16 y
+       Sint16 rx
+       Sint16 ry
+       Uint32 color
+       CODE:
+               RETVAL = ellipseColor( dst, x, y, rx, ry, color );
+       OUTPUT:
+               RETVAL
+
+int
+GFXEllipseRGBA ( dst, x, y, rx, ry, r, g, b, a )
+       SDL_Surface* dst
+       Sint16 x
+       Sint16 y
+       Sint16  rx
+       Sint16 ry
+       Uint8 r
+       Uint8 g
+       Uint8 b
+       Uint8 a
+       CODE:
+               RETVAL = ellipseRGBA( dst, x, y, rx, ry, r, g, b, a );
+       OUTPUT:
+               RETVAL
+
+int
+GFXAaellipseColor ( dst, xc, yc, rx, ry, color )
+       SDL_Surface* dst
+       Sint16 xc
+       Sint16 yc
+       Sint16 rx
+       Sint16 ry
+       Uint32 color
+       CODE:
+               RETVAL = aaellipseColor( dst, xc, yc, rx, ry, color );
+       OUTPUT:
+               RETVAL
+
+int
+GFXAaellipseRGBA ( dst, x, y, rx, ry, r, g, b, a )
+       SDL_Surface* dst
+       Sint16 x
+       Sint16 y
+       Sint16 rx
+       Sint16 ry
+       Uint8 r
+       Uint8 g
+       Uint8 b
+       Uint8 a
+       CODE:
+               RETVAL = aaellipseRGBA( dst, x, y, rx, ry, r, g, b, a );
+       OUTPUT:
+               RETVAL
+
+int
+GFXFilledEllipseColor ( dst, x, y, rx, ry, color )
+       SDL_Surface* dst
+       Sint16 x
+       Sint16 y
+       Sint16 rx
+       Sint16 ry
+       Uint32 color
+       CODE:
+               RETVAL = filledEllipseColor( dst, x, y, rx, ry, color );
+       OUTPUT:
+               RETVAL
+
+int
+GFXFilledEllipseRGBA ( dst, x, y, rx, ry, r, g, b, a )
+       SDL_Surface* dst
+       Sint16 x
+       Sint16 y
+       Sint16 rx
+       Sint16 ry
+       Uint8 r
+       Uint8 g
+       Uint8 b
+       Uint8 a
+       CODE:
+               RETVAL = filledEllipseRGBA( dst, x, y, rx, ry, r, g, b, a );
+       OUTPUT:
+               RETVAL
+
+int
+GFXFilledPieColor ( dst, x, y, rad, start, end, color )
+       SDL_Surface* dst
+       Sint16 x
+       Sint16 y
+       Sint16 rad
+       Sint16 start
+       Sint16 end
+       Uint32 color
+       CODE:
+               RETVAL = filledPieColor( dst, x, y, rad, start, end, color );
+       OUTPUT:
+               RETVAL
+
+int
+GFXFilledPieRGBA ( dst, x, y, rad, start, end, r, g, b, a )
+       SDL_Surface* dst
+       Sint16 x
+       Sint16 y
+       Sint16 rad
+       Sint16 start
+       Sint16 end
+       Uint8 r
+       Uint8 g
+       Uint8 b
+       Uint8 a
+       CODE:
+               RETVAL = filledPieRGBA( dst, x, y, rad, start, end, r, g, b, a );
+       OUTPUT:
+               RETVAL
+
+int
+GFXPolygonColor ( dst, vx, vy, n, color )
+       SDL_Surface* dst
+       Sint16* vx
+       Sint16* vy
+       int n
+       Uint32 color;
+       CODE:
+               RETVAL = polygonColor( dst, vx, vy, n, color );
+       OUTPUT:
+               RETVAL
+
+int
+GFXPolygonRGBA ( dst, vx, vy, n, r, g, b, a )
+       SDL_Surface* dst
+       Sint16* vx
+       Sint16* vy
+       int n
+       Uint8 r
+       Uint8 g
+       Uint8 b
+       Uint8 a
+       CODE:
+               RETVAL = polygonRGBA( dst, vx, vy, n, r, g, b, a );
+       OUTPUT:
+               RETVAL
+
+int
+GFXAapolygonColor ( dst, vx, vy, n, color )
+       SDL_Surface* dst
+       Sint16* vx
+       Sint16* vy
+       int n
+       Uint32 color
+       CODE:
+               RETVAL = aapolygonColor( dst, vx, vy, n, color );
+       OUTPUT:
+               RETVAL
+
+int
+GFXAapolygonRGBA ( dst, vx, vy, n, r, g, b, a )
+       SDL_Surface* dst
+       Sint16* vx
+       Sint16* vy
+       int n
+       Uint8 r
+       Uint8 g
+       Uint8 b
+       Uint8 a
+       CODE:
+               RETVAL = aapolygonRGBA( dst, vx, vy, n, r, g, b, a );
+       OUTPUT:
+               RETVAL
+
+int
+GFXFilledPolygonColor ( dst, vx, vy, n, color )
+       SDL_Surface* dst
+       Sint16* vx
+       Sint16* vy
+       int n
+       int color
+       CODE:
+               RETVAL = filledPolygonColor( dst, vx, vy, n, color );
+       OUTPUT:
+               RETVAL
+
+int
+GFXFilledPolygonRGBA ( dst, vx, vy, n, r, g, b, a )
+       SDL_Surface* dst
+       Sint16* vx
+       Sint16* vy
+       int n
+       Uint8 r
+       Uint8 g
+       Uint8 b
+       Uint8 a
+       CODE:
+               RETVAL = filledPolygonRGBA( dst, vx, vy, n, r, g, b, a );
+       OUTPUT:
+               RETVAL
+
+int
+GFXCharacterColor ( dst, x, y, c, color )
+       SDL_Surface* dst
+       Sint16 x
+       Sint16 y
+       char c
+       Uint32 color
+       CODE:
+               RETVAL = characterColor( dst, x, y, c, color );
+       OUTPUT:
+               RETVAL
+
+int
+GFXCharacterRGBA ( dst, x, y, c, r, g, b, a )
+       SDL_Surface* dst
+       Sint16 x
+       Sint16 y
+       char c
+       Uint8 r
+       Uint8 g
+       Uint8 b
+       Uint8 a
+       CODE:
+               RETVAL = characterRGBA( dst, x, y, c, r, g, b, a );
+       OUTPUT:
+               RETVAL
+
+int
+GFXStringColor ( dst, x, y, c, color )
+       SDL_Surface* dst
+       Sint16 x
+       Sint16 y
+       char* c
+       Uint32 color
+       CODE:
+               RETVAL = stringColor( dst, x, y, c, color );
+       OUTPUT:
+               RETVAL
+
+int
+GFXStringRGBA ( dst, x, y, c, r, g, b, a )
+       SDL_Surface* dst
+       Sint16 x
+       Sint16 y
+       char* c
+       Uint8 r
+       Uint8 g
+       Uint8 b
+       Uint8 a
+       CODE:
+               RETVAL = stringRGBA( dst, x, y, c, r, g, b, a );
+       OUTPUT:
+               RETVAL
+
+#endif
+
+
+#ifdef HAVE_SDL_SVG
+
+SDL_svg_context *
+SVG_Load ( filename )
+       char* filename
+       CODE:
+               RETVAL = SVG_Load(filename);
+       OUTPUT:
+               RETVAL
+
+SDL_svg_context *
+SVG_LoadBuffer ( data, len )
+       char* data
+       int len
+       CODE:
+               RETVAL = SVG_LoadBuffer(data,len);
+       OUTPUT:
+               RETVAL
+
+int
+SVG_SetOffset ( source, xoff, yoff )
+       SDL_svg_context* source
+       double xoff
+       double yoff
+       CODE:
+               RETVAL = SVG_SetOffset(source,xoff,yoff);
+       OUTPUT:
+               RETVAL
+
+int
+SVG_SetScale ( source, xscale, yscale )
+       SDL_svg_context* source
+       double xscale
+       double yscale
+       CODE:
+               RETVAL = SVG_SetScale(source,xscale,yscale);
+       OUTPUT:
+               RETVAL
+
+int
+SVG_RenderToSurface ( source, x, y, dest )
+       SDL_svg_context* source
+       int x
+       int y
+       SDL_Surface* dest;
+       CODE:
+               RETVAL = SVG_RenderToSurface(source,x,y,dest);
+       OUTPUT:
+               RETVAL
+
+void
+SVG_Free ( source )
+       SDL_svg_context* source
+       CODE:
+               SVG_Free(source);       
+
+void
+SVG_Set_Flags ( source, flags )
+       SDL_svg_context* source
+       Uint32 flags
+       CODE:
+               SVG_Set_Flags(source,flags);
+
+float
+SVG_Width ( source )
+       SDL_svg_context* source
+       CODE:
+               RETVAL = SVG_Width(source);
+       OUTPUT:
+               RETVAL
+
+float
+SVG_HEIGHT ( source )
+       SDL_svg_context* source
+       CODE:
+               RETVAL = SVG_Height(source);
+       OUTPUT:
+               RETVAL
+
+void
+SVG_SetClipping ( source, minx, miny, maxx, maxy )
+       SDL_svg_context* source
+       int minx
+       int miny
+       int maxx
+       int maxy
+       CODE:
+               SVG_SetClipping(source,minx,miny,maxx,maxy);
+
+int
+SVG_Version ( )
+       CODE:
+               RETVAL = SVG_Version();
+       OUTPUT:
+               RETVAL
+
+
+#endif
+
+#ifdef HAVE_SDL_SOUND
+
+Uint16
+SoundAudioInfoFormat ( audioinfo )
+       Sound_AudioInfo* audioinfo
+       CODE:
+               RETVAL = audioinfo->format;
+       OUTPUT:
+               RETVAL
+
+Uint8
+SoundAudioInfoChannels ( audioinfo )
+       Sound_AudioInfo* audioinfo
+       CODE:
+               RETVAL = audioinfo->channels;
+       OUTPUT:
+               RETVAL
+
+Uint32
+SoundAudioInforate ( audioinfo )
+       Sound_AudioInfo* audioinfo
+       CODE:
+               RETVAL = audioinfo->rate;
+       OUTPUT:
+               RETVAL
+
+AV*
+SoundDecoderInfoExtensions ( decoderinfo )
+       Sound_DecoderInfo* decoderinfo
+       CODE:
+               const char **ext;
+               for ( ext = decoderinfo->extensions; *ext != NULL; ext++ ){
+                       av_push(RETVAL,newSVpv(*ext,0));
+               }
+       OUTPUT:
+               RETVAL
+
+const char*
+SoundDecoderInfoDescription ( decoderinfo )
+       Sound_DecoderInfo* decoderinfo
+       CODE:
+               RETVAL = decoderinfo->description;
+       OUTPUT:
+               RETVAL
+
+const char*
+SoundDecoderInfoAuthor ( decoderinfo )
+       Sound_DecoderInfo* decoderinfo
+       CODE:
+               RETVAL = decoderinfo->author;
+       OUTPUT:
+               RETVAL
+
+const char*
+SoundDecoderInfoUrl ( decoderinfo )
+       Sound_DecoderInfo* decoderinfo
+       CODE:
+               RETVAL = decoderinfo->url;
+       OUTPUT:
+               RETVAL
+
+const Sound_DecoderInfo*
+SoundSampleDecoder ( sample ) 
+       Sound_Sample* sample
+       CODE:
+               RETVAL = sample->decoder;
+       OUTPUT:
+               RETVAL
+
+Sound_AudioInfo* 
+SoundSampleDesired ( sample )
+       Sound_Sample* sample
+       CODE:
+               RETVAL = &sample->desired;
+       OUTPUT:
+               RETVAL
+
+Sound_AudioInfo*
+SoundSampleAcutal ( sample )
+       Sound_Sample* sample
+       CODE:
+               RETVAL = &sample->actual;
+       OUTPUT:
+               RETVAL
+
+char*
+SoundSampleBuffer ( sample )
+       Sound_Sample* sample
+       CODE:
+               RETVAL = sample->buffer;
+       OUTPUT:
+               RETVAL
+
+Uint32
+SoundSampleBufferSize ( sample )
+       Sound_Sample* sample
+       CODE:
+               RETVAL = sample->buffer_size;
+       OUTPUT:
+               RETVAL
+
+Uint32
+SoundSampleFlags ( sample )
+       Sound_Sample* sample
+       CODE:
+               RETVAL = (Uint32)sample->flags;
+       OUTPUT:
+               RETVAL
+
+int
+Sound_Init ( )
+       CODE:
+               RETVAL = Sound_Init();
+       OUTPUT:
+               RETVAL
+
+int
+Sound_Quit ( )
+       CODE:
+               RETVAL = Sound_Quit();
+       OUTPUT:
+               RETVAL
+
+AV*
+Sound_AvailableDecoders ( )
+       CODE:
+               RETVAL = newAV();
+               const Sound_DecoderInfo** sdi;
+               sdi = Sound_AvailableDecoders();
+               if (sdi != NULL)  {
+                       for (;*sdi != NULL; ++sdi) {
+                               av_push(RETVAL,sv_2mortal(newSViv(PTR2IV(*sdi))));
+                       }
+               }
+       OUTPUT:
+               RETVAL
+
+const char*
+Sound_GetError ( )
+       CODE:
+               RETVAL = Sound_GetError();
+       OUTPUT:
+               RETVAL
+
+void
+Sound_ClearError ( )
+       CODE:
+               Sound_ClearError();
+
+Sound_Sample*
+Sound_NewSample ( rw, ext, desired, buffsize )
+       SDL_RWops* rw
+       const char* ext
+       Sound_AudioInfo* desired
+       Uint32 buffsize
+       CODE:
+               RETVAL = Sound_NewSample(rw,ext,desired,buffsize);
+       OUTPUT:
+               RETVAL
+
+Sound_Sample*
+Sound_NewSampleFromMem ( data, size, ext, desired, buffsize )
+       const Uint8 *data
+       Uint32 size
+       const char* ext
+       Sound_AudioInfo* desired
+       Uint32 buffsize
+       CODE:
+               RETVAL = Sound_NewSampleFromMem(data,size,ext,desired,buffsize);
+       OUTPUT:
+               RETVAL
+
+Sound_Sample*
+Sound_NewSampleFromFile ( fname, desired, buffsize )
+       const char* fname
+       Sound_AudioInfo* desired
+       Uint32 buffsize
+       CODE:
+               RETVAL = Sound_NewSampleFromFile(fname,desired,buffsize);
+       OUTPUT:
+               RETVAL
+
+void
+Sound_FreeSample ( sample )
+       Sound_Sample* sample
+       CODE:
+               Sound_FreeSample(sample);
+
+Sint32
+Sound_GetDuration ( sample )
+       Sound_Sample* sample
+       CODE:
+               RETVAL = Sound_GetDuration(sample);
+       OUTPUT:
+               RETVAL
+
+int
+Sound_SetBufferSize ( sample, size )
+       Sound_Sample* sample
+       Uint32 size
+       CODE:
+               RETVAL = Sound_SetBufferSize(sample,size);
+       OUTPUT:
+               RETVAL
+
+Uint32
+Sound_Decode ( sample )
+       Sound_Sample* sample
+       CODE:
+               RETVAL = Sound_Decode(sample);
+       OUTPUT:
+               RETVAL
+
+Uint32
+Sound_DecodeAll ( sample ) 
+       Sound_Sample* sample
+       CODE:
+               RETVAL = Sound_DecodeAll(sample);
+       OUTPUT:
+               RETVAL
+
+int
+Sound_Rewind ( sample )
+       Sound_Sample* sample
+       CODE:
+               RETVAL = Sound_Rewind(sample);
+       OUTPUT:
+               RETVAL
+
+int
+Sound_Seek ( sample, ms )
+       Sound_Sample* sample
+       Uint32 ms
+       CODE:
+               RETVAL = Sound_Seek(sample,ms);
+       OUTPUT:
+               RETVAL
+
+#endif
+
+MODULE = SDL           PACKAGE = SDL
+PROTOTYPES : DISABLE
+
+
diff --git a/src/SDL/OpenGL.bs b/src/SDL/OpenGL.bs
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/src/SDL/OpenGL.c b/src/SDL/OpenGL.c
new file mode 100644 (file)
index 0000000..170bb2c
--- /dev/null
@@ -0,0 +1,4851 @@
+/*
+ * This file was generated automatically by xsubpp version 1.9508 from the
+ * contents of OpenGL.xs. Do not edit this file, edit OpenGL.xs instead.
+ *
+ *     ANY CHANGES MADE HERE WILL BE LOST!
+ *
+ */
+
+#line 1 "OpenGL.xs"
+//
+// OpenGL.xs
+//
+// Copyright (C) 2005 David J. Goehrig <dgoehrig@cpan.org>
+//
+// ------------------------------------------------------------------------------
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+// 
+// This library 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
+// Lesser General Public License for more details.
+// 
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+//
+// ------------------------------------------------------------------------------
+//
+// Please feel free to send questions, suggestions or improvements to:
+//
+//     David J. Goehrig
+//     dgoehrig@cpan.org
+//
+
+#include "EXTERN.h"
+#include "perl.h"
+#include "XSUB.h"
+
+#ifndef aTHX_
+#define aTHX_
+#endif
+
+#include <SDL.h>
+
+#include <gl.h>
+#include <glu.h>
+
+#ifdef USE_THREADS
+#define HAVE_TLS_CONTEXT
+#endif
+
+#ifndef GL_ALL_CLIENT_ATTRIB_BITS  
+#define GL_ALL_CLIENT_ATTRIB_BITS 0xFFFFFFF
+#endif /* GL_ALL_CLIENT_BITS */  
+
+#include "../defines.h"
+
+SV* sdl_perl_nurbs_error_hook;
+void
+sdl_perl_nurbs_error_callback ( GLenum errorCode )
+{
+       ENTER_TLS_CONTEXT
+       dSP;
+
+       ENTER;
+       SAVETMPS;
+       PUSHMARK(SP);
+       XPUSHs(sv_2mortal(newSViv(errorCode)));
+       PUTBACK;
+
+       call_sv(sdl_perl_nurbs_error_hook,G_VOID);
+       
+       FREETMPS;
+       LEAVE;
+       LEAVE_TLS_CONTEXT       
+}
+
+void
+sdl_perl_nurbs_being_callback ( GLenum type, void *cb )
+{
+       SV *cmd;
+       ENTER_TLS_CONTEXT
+       dSP;
+
+       cmd = (SV*)cb;
+
+       ENTER;
+       SAVETMPS;
+       PUSHMARK(SP);
+       XPUSHs(sv_2mortal(newSViv(type)));
+       PUTBACK;
+
+       call_sv(cmd,G_VOID);
+       
+       FREETMPS;
+       LEAVE;
+       LEAVE_TLS_CONTEXT       
+}
+
+void
+sdl_perl_nurbs_multi_callback ( GLfloat *vec, void *cb )
+{
+       SV *cmd;
+       ENTER_TLS_CONTEXT
+       dSP;
+
+       cmd = (SV*)cb;
+
+       ENTER;
+       SAVETMPS;
+       PUSHMARK(SP);
+       XPUSHs(sv_2mortal(newSViv(PTR2IV(vec))));
+       PUTBACK;
+
+       call_sv(cmd,G_VOID);
+       
+       FREETMPS;
+       LEAVE;
+       LEAVE_TLS_CONTEXT       
+}
+
+void
+sdl_perl_nurbs_end_callback ( void *cb )
+{
+       SV *cmd;
+       ENTER_TLS_CONTEXT
+
+       cmd = (SV*)cb;
+
+       ENTER;
+       SAVETMPS;
+
+       call_sv(cmd,G_VOID);
+       
+       FREETMPS;
+       LEAVE;
+       LEAVE_TLS_CONTEXT       
+}
+
+void
+sdl_perl_tess_end_callback ( void *cb )
+{
+       SV *cmd;
+        ENTER_TLS_CONTEXT
+       dSP;
+
+        cmd = (SV*)cb;
+
+        ENTER;
+        SAVETMPS;
+       PUSHMARK(SP);
+       XPUSHs(sv_2mortal(newSViv(GLU_TESS_BEGIN)));
+       PUTBACK;
+
+        call_sv(cmd,G_VOID);
+
+        FREETMPS;
+        LEAVE;
+        LEAVE_TLS_CONTEXT
+}
+
+void
+sdl_perl_tess_begin_callback ( GLenum type,  void *cb )
+{
+        SV *cmd;
+        ENTER_TLS_CONTEXT
+       dSP;
+
+        cmd = (SV*)cb;
+
+        ENTER;
+        SAVETMPS;
+       PUSHMARK(SP);
+       XPUSHs(sv_2mortal(newSViv(GLU_TESS_BEGIN)));
+       XPUSHs(sv_2mortal(newSViv(type)));
+       PUTBACK;
+
+        call_sv(cmd,G_VOID);
+
+        FREETMPS;
+        LEAVE;
+        LEAVE_TLS_CONTEXT
+}
+
+void
+sdl_perl_tess_error_callback ( GLenum type,  void *cb )
+{
+        SV *cmd;
+        ENTER_TLS_CONTEXT
+       dSP;
+
+        cmd = (SV*)cb;
+
+        ENTER;
+        SAVETMPS;
+        PUSHMARK(SP);
+        XPUSHs(sv_2mortal(newSViv(GLU_TESS_ERROR)));
+        XPUSHs(sv_2mortal(newSViv(type)));
+        PUTBACK;
+
+        call_sv(cmd,G_VOID);
+
+        FREETMPS;
+        LEAVE;
+        LEAVE_TLS_CONTEXT
+}
+
+void
+sdl_perl_tess_edge_flag_callback ( GLenum flag,  void *cb )
+{
+        SV *cmd;
+        ENTER_TLS_CONTEXT
+       dSP;
+
+        cmd = (SV*)cb;
+
+        ENTER;
+        SAVETMPS;
+        PUSHMARK(SP);
+       XPUSHs(sv_2mortal(newSViv(GLU_TESS_EDGE_FLAG)));
+        XPUSHs(sv_2mortal(newSViv(flag)));
+        PUTBACK;
+
+        call_sv(cmd,G_VOID);
+
+        FREETMPS;
+        LEAVE;
+        LEAVE_TLS_CONTEXT
+}
+
+void
+sdl_perl_tess_vertex_callback ( double *vd,  void *cb )
+{
+        SV *cmd;
+        ENTER_TLS_CONTEXT
+       dSP;
+
+        cmd = (SV*)cb;
+
+        ENTER;
+        SAVETMPS;
+        PUSHMARK(SP);
+       XPUSHs(sv_2mortal(newSViv(GLU_TESS_VERTEX)));
+        XPUSHs(sv_2mortal(newSVnv(vd[0])));
+        XPUSHs(sv_2mortal(newSVnv(vd[1])));
+        XPUSHs(sv_2mortal(newSVnv(vd[2])));
+        XPUSHs(sv_2mortal(newSVnv(vd[3])));
+        XPUSHs(sv_2mortal(newSVnv(vd[4])));
+        XPUSHs(sv_2mortal(newSVnv(vd[5])));
+        PUTBACK;
+
+        call_sv(cmd,G_VOID);
+
+        FREETMPS;
+        LEAVE;
+        LEAVE_TLS_CONTEXT
+}
+
+void
+sdl_perl_tess_combine_callback ( GLdouble coords[3], double *vd[4], GLfloat weight[4], 
+       GLdouble **out, void *cb )
+{
+        SV *cmd;
+       double *data;
+       int width;
+        ENTER_TLS_CONTEXT
+       dSP;
+
+        cmd = (SV*)cb;
+
+        ENTER;
+        SAVETMPS;
+        PUSHMARK(SP);
+       XPUSHs(sv_2mortal(newSViv(GLU_TESS_COMBINE)));
+       XPUSHs(sv_2mortal(newSVpvn((char*)coords,sizeof(GLdouble)*3)));
+       XPUSHs(sv_2mortal(newSVpvn((char*)vd,sizeof(GLdouble*)*4)));
+       XPUSHs(sv_2mortal(newSVpvn((char*)weight,sizeof(GLfloat)*4)));
+        PUTBACK;
+
+        if ( 1 != call_sv(cmd,G_SCALAR) ) {
+               Perl_croak(aTHX_ "sdl_perl_tess_combine_callback failed");
+       }
+
+       data = (double*)POPp;
+       width = (int)POPi;
+       *out = (double*)malloc(sizeof(double)*width);
+       memcpy(*out,data,sizeof(double)*width);
+
+        FREETMPS;
+        LEAVE;
+        LEAVE_TLS_CONTEXT
+}
+
+#line 299 "OpenGL.c"
+#ifdef HAVE_GL
+#define XSubPPtmpAAAA 1
+
+XS(XS_SDL__OpenGL_glClearColor); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_glClearColor)
+{
+    dXSARGS;
+    if (items != 4)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::glClearColor(r, g, b, a)");
+    {
+       double  r = (double)SvNV(ST(0));
+       double  g = (double)SvNV(ST(1));
+       double  b = (double)SvNV(ST(2));
+       double  a = (double)SvNV(ST(3));
+#line 301 "OpenGL.xs"
+               glClearColor((GLfloat)r,(GLfloat)g,(GLfloat)b,(GLfloat)a);
+#line 316 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL__OpenGL_glClearIndex); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_glClearIndex)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::glClearIndex(index)");
+    {
+       double  index = (double)SvNV(ST(0));
+#line 307 "OpenGL.xs"
+               glClearIndex(index);
+#line 331 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL__OpenGL_glClearDepth); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_glClearDepth)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::glClearDepth(depth)");
+    {
+       double  depth = (double)SvNV(ST(0));
+#line 313 "OpenGL.xs"
+               glClearDepth(depth);
+#line 346 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL__OpenGL_glClearStencil); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_glClearStencil)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::glClearStencil(s)");
+    {
+       int     s = (int)SvIV(ST(0));
+#line 319 "OpenGL.xs"
+               glClearStencil(s);
+#line 361 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL__OpenGL_glClearAccum); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_glClearAccum)
+{
+    dXSARGS;
+    if (items != 4)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::glClearAccum(r, g, b, a)");
+    {
+       double  r = (double)SvNV(ST(0));
+       double  g = (double)SvNV(ST(1));
+       double  b = (double)SvNV(ST(2));
+       double  a = (double)SvNV(ST(3));
+#line 328 "OpenGL.xs"
+               glClearAccum((GLfloat)r,(GLfloat)g,(GLfloat)b,(GLfloat)a);
+#line 379 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL__OpenGL_glClear); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_glClear)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::glClear(m)");
+    {
+       GLbitfield      m = (GLbitfield)SvIV(ST(0));
+#line 334 "OpenGL.xs"
+               glClear(m);
+#line 394 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL__OpenGL_glFlush); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_glFlush)
+{
+    dXSARGS;
+    if (items != 0)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::glFlush()");
+    {
+#line 339 "OpenGL.xs"
+               glFlush();
+#line 408 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL__OpenGL_glFinish); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_glFinish)
+{
+    dXSARGS;
+    if (items != 0)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::glFinish()");
+    {
+#line 344 "OpenGL.xs"
+               glFinish();
+#line 422 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL__OpenGL_glRect); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_glRect)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::glRect(r)");
+    {
+       SDL_Rect*       r = INT2PTR(SDL_Rect *,SvIV(ST(0)));
+#line 350 "OpenGL.xs"
+               glRecti(r->x,r->y,r->x+r->w,r->y+r->h);
+#line 437 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL__OpenGL_glVertex); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_glVertex)
+{
+    dXSARGS;
+    if (items < 2)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::glVertex(x, y, ...)");
+    {
+       double  x = (double)SvNV(ST(0));
+       double  y = (double)SvNV(ST(1));
+#line 357 "OpenGL.xs"
+               double z,w;
+               if ( items == 4 ) {
+                       w = SvNV(ST(3));
+                       z = SvNV(ST(2));
+                       glVertex4d(x,y,z,w);    
+               } else if ( items == 3 ) {
+                       z = SvNV(ST(2));
+                       glVertex3d(x,y,z);      
+               } else {
+                       glVertex2d(x,y);
+               }
+#line 463 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL__OpenGL_glBegin); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_glBegin)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::glBegin(mode)");
+    {
+       GLenum  mode = (GLenum)SvIV(ST(0));
+#line 373 "OpenGL.xs"
+               glBegin(mode);
+#line 478 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL__OpenGL_glEnd); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_glEnd)
+{
+    dXSARGS;
+    if (items != 0)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::glEnd()");
+    {
+#line 378 "OpenGL.xs"
+               glEnd();
+#line 492 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL__OpenGL_glEnable); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_glEnable)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::glEnable(cap)");
+    {
+       GLenum  cap = (GLenum)SvIV(ST(0));
+#line 384 "OpenGL.xs"
+               glEnable(cap);
+#line 507 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL__OpenGL_glDisable); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_glDisable)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::glDisable(cap)");
+    {
+       GLenum  cap = (GLenum)SvIV(ST(0));
+#line 390 "OpenGL.xs"
+               glDisable(cap);
+#line 522 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL__OpenGL_glGet); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_glGet)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::glGet(param)");
+    SP -= items;
+    {
+       GLenum  param = (GLenum)SvIV(ST(0));
+#line 396 "OpenGL.xs"
+        switch (param) {
+        case GL_EDGE_FLAG_ARRAY:
+        case GL_MAP1_TEXTURE_COORD_1:
+        case GL_LIGHT_MODEL_TWO_SIDE:
+        case GL_INDEX_LOGIC_OP:
+        case GL_PACK_ALIGNMENT:
+        case GL_CLIP_PLANE4:
+        case GL_TEXTURE_GEN_S:
+        case GL_MAP1_VERTEX_3:
+        case GL_LIGHT6:
+        case GL_LIGHT0:
+        case GL_NORMAL_ARRAY:
+        case GL_EDGE_FLAG:
+        case GL_INDEX_ARRAY:
+        case GL_AUTO_NORMAL:
+        case GL_POLYGON_OFFSET_FILL:
+        case GL_MAP1_TEXTURE_COORD_4:
+        case GL_FOG:
+        case GL_LIGHT2:
+        case GL_UNPACK_SWAP_BYTES:
+        case GL_RGBA_MODE:
+        case GL_POLYGON_OFFSET_POINT:
+        case GL_POINT_SMOOTH:
+        case GL_ALPHA_TEST:
+        case GL_MAP2_TEXTURE_COORD_4:
+        case GL_COLOR_ARRAY:
+        case GL_POLYGON_OFFSET_LINE:
+        case GL_MAP2_NORMAL:
+        case GL_MAP1_INDEX:
+        case GL_PACK_LSB_FIRST:
+        case GL_MAP1_TEXTURE_COORD_2:
+        case GL_MAP2_VERTEX_3:
+        case GL_MAP2_TEXTURE_COORD_2:
+        case GL_CULL_FACE:
+        case GL_DOUBLEBUFFER:
+        case GL_UNPACK_LSB_FIRST:
+        case GL_TEXTURE_COORD_ARRAY:
+        case GL_LIGHT1:
+        case GL_TEXTURE_GEN_Q:
+        case GL_MAP_STENCIL:
+        case GL_TEXTURE_1D:
+        case GL_LIGHT4:
+        case GL_LIGHTING:
+        case GL_LIGHT7:
+        case GL_MAP1_NORMAL:
+        case GL_CLIP_PLANE0:
+        case GL_TEXTURE_GEN_R:
+        case GL_PACK_SWAP_BYTES:
+        case GL_DEPTH_WRITEMASK:
+        case GL_COLOR_LOGIC_OP:
+        case GL_CLIP_PLANE5:
+        case GL_NORMALIZE:
+        case GL_TEXTURE_2D:
+        case GL_CLIP_PLANE3:
+        case GL_COLOR_MATERIAL:
+        case GL_BLEND:
+        case GL_CLIP_PLANE2:
+        case GL_MAP1_VERTEX_4:
+        case GL_DITHER:
+        case GL_CLIP_PLANE1:
+        case GL_MAP2_INDEX:
+        case GL_POLYGON_SMOOTH:
+        case GL_STEREO:
+        case GL_MAP2_COLOR_4:
+        case GL_LIGHT3:
+        case GL_VERTEX_ARRAY:
+        case GL_MAP1_TEXTURE_COORD_3:
+        case GL_STENCIL_TEST:
+        case GL_MAP2_TEXTURE_COORD_3:
+        case GL_TEXTURE_GEN_T:
+        case GL_LIGHT_MODEL_LOCAL_VIEWER:
+        case GL_LINE_SMOOTH:
+        case GL_MAP1_COLOR_4:
+        case GL_MAP2_TEXTURE_COORD_1:
+        case GL_CURRENT_RASTER_POSITION_VALID:
+        case GL_INDEX_MODE:
+        case GL_SCISSOR_TEST:
+        case GL_MAP_COLOR:
+        case GL_POLYGON_STIPPLE:
+        case GL_LIGHT5:
+        case GL_DEPTH_TEST:
+        case GL_LINE_STIPPLE:
+        case GL_MAP2_VERTEX_4:
+        {
+            GLboolean ret[1];
+            int i;
+            glGetBooleanv(param, ret);
+
+            for (i = 0; i < 1; i++) {
+                XPUSHs(sv_2mortal(newSViv(ret[i])));
+            }
+            break;
+        }
+        case GL_COLOR_WRITEMASK:
+        {
+            GLboolean ret[4];
+            int i;
+            glGetBooleanv(param, ret);
+
+            for (i = 0; i < 4; i++) {
+                XPUSHs(sv_2mortal(newSViv(ret[i])));
+            }
+            break;
+        }
+        case GL_ZOOM_Y:
+        case GL_ALPHA_TEST_REF:
+        case GL_POINT_SIZE_GRANULARITY:
+        case GL_CURRENT_RASTER_DISTANCE:
+        case GL_ALPHA_SCALE:
+        case GL_RED_BIAS:
+        case GL_DEPTH_BIAS:
+        case GL_FOG_DENSITY:
+        case GL_GREEN_BIAS:
+        case GL_DEPTH_CLEAR_VALUE:
+        case GL_ALPHA_BIAS:
+        case GL_FOG_END:
+        case GL_GREEN_SCALE:
+        case GL_BLUE_BIAS:
+        case GL_DEPTH_SCALE:
+        case GL_POINT_SIZE:
+        case GL_POLYGON_OFFSET_FACTOR:
+        case GL_ZOOM_X:
+        case GL_FOG_START:
+        case GL_POLYGON_OFFSET_UNITS:
+        case GL_LINE_WIDTH:
+        case GL_LINE_WIDTH_GRANULARITY:
+        case GL_BLUE_SCALE:
+        case GL_RED_SCALE:
+        {
+            GLdouble ret[1];
+            int i;
+            glGetDoublev(param, ret);
+
+            for (i = 0; i < 1; i++) {
+                XPUSHs(sv_2mortal(newSVnv(ret[i])));
+            }
+            break;
+        }
+        case GL_MODELVIEW_MATRIX:
+        case GL_TEXTURE_MATRIX:
+        case GL_PROJECTION_MATRIX:
+        {
+            GLdouble ret[16];
+            int i;
+            glGetDoublev(param, ret);
+
+            for (i = 0; i < 16; i++) {
+                XPUSHs(sv_2mortal(newSVnv(ret[i])));
+            }
+            break;
+        }
+        case GL_POINT_SIZE_RANGE:
+        case GL_LINE_WIDTH_RANGE:
+        case GL_MAP1_GRID_DOMAIN:
+        case GL_DEPTH_RANGE:
+        {
+            GLdouble ret[2];
+            int i;
+            glGetDoublev(param, ret);
+
+            for (i = 0; i < 2; i++) {
+                XPUSHs(sv_2mortal(newSVnv(ret[i])));
+            }
+            break;
+        }
+        case GL_CURRENT_NORMAL:
+        {
+            GLdouble ret[3];
+            int i;
+            glGetDoublev(param, ret);
+
+            for (i = 0; i < 3; i++) {
+                XPUSHs(sv_2mortal(newSVnv(ret[i])));
+            }
+            break;
+        }
+        case GL_FOG_COLOR:
+        case GL_MAP2_GRID_DOMAIN:
+        case GL_CURRENT_RASTER_POSITION:
+        case GL_CURRENT_COLOR:
+        case GL_LIGHT_MODEL_AMBIENT:
+        case GL_CURRENT_RASTER_TEXTURE_COORDS:
+        case GL_TEXTURE_ENV_COLOR:
+        case GL_CURRENT_RASTER_COLOR:
+        case GL_CURRENT_TEXTURE_COORDS:
+        case GL_COLOR_CLEAR_VALUE:
+        case GL_ACCUM_CLEAR_VALUE:
+        {
+            GLdouble ret[4];
+            int i;
+            glGetDoublev(param, ret);
+
+            for (i = 0; i < 4; i++) {
+                XPUSHs(sv_2mortal(newSVnv(ret[i])));
+            }
+            break;
+        }
+        case GL_CULL_FACE_MODE:
+        case GL_PIXEL_MAP_I_TO_A_SIZE:
+        case GL_PIXEL_MAP_A_TO_A_SIZE:
+        case GL_BLUE_BITS:
+        case GL_EDGE_FLAG_ARRAY_STRIDE:
+        case GL_RENDER_MODE:
+        case GL_FOG_MODE:
+        case GL_DEPTH_FUNC:
+        case GL_READ_BUFFER:
+        case GL_POINT_SMOOTH_HINT:
+        case GL_PACK_SKIP_PIXELS:
+        case GL_STENCIL_REF:
+        case GL_STENCIL_CLEAR_VALUE:
+        case GL_AUX_BUFFERS:
+        case GL_COLOR_MATERIAL_PARAMETER:
+        case GL_ACCUM_BLUE_BITS:
+        case GL_INDEX_SHIFT:
+        case GL_VERTEX_ARRAY_STRIDE:
+        case GL_STENCIL_PASS_DEPTH_PASS:
+        case GL_CLIENT_ATTRIB_STACK_DEPTH:
+        case GL_DRAW_BUFFER:
+        case GL_LINE_STIPPLE_REPEAT:
+        case GL_BLEND_SRC:
+        case GL_PIXEL_MAP_B_TO_B_SIZE:
+        case GL_MAX_PIXEL_MAP_TABLE:
+        case GL_MAX_TEXTURE_SIZE:
+        case GL_PIXEL_MAP_S_TO_S_SIZE:
+        case GL_LOGIC_OP_MODE:
+        case GL_DEPTH_BITS:
+        case GL_GREEN_BITS:
+        case GL_LINE_SMOOTH_HINT:
+        case GL_ALPHA_TEST_FUNC:
+        case GL_MAX_LIGHTS:
+        case GL_FOG_HINT:
+        case GL_MAX_NAME_STACK_DEPTH:
+        case GL_INDEX_ARRAY_TYPE:
+        case GL_TEXTURE_COORD_ARRAY_TYPE:
+        case GL_COLOR_ARRAY_TYPE:
+        case GL_MAX_LIST_NESTING:
+        case GL_STENCIL_WRITEMASK:
+        case GL_LIST_BASE:
+        case GL_ACCUM_ALPHA_BITS:
+        case GL_INDEX_ARRAY_STRIDE:
+        case GL_PIXEL_MAP_I_TO_B_SIZE:
+        case GL_INDEX_BITS:
+        case GL_STENCIL_FAIL:
+        case GL_UNPACK_ALIGNMENT:
+        case GL_STENCIL_PASS_DEPTH_FAIL:
+        case GL_ATTRIB_STACK_DEPTH:
+        case GL_PACK_SKIP_ROWS:
+        case GL_TEXTURE_STACK_DEPTH:
+        case GL_MATRIX_MODE:
+        case GL_COLOR_ARRAY_STRIDE:
+        case GL_LIST_MODE:
+        case GL_UNPACK_SKIP_PIXELS:
+        case GL_PIXEL_MAP_G_TO_G_SIZE:
+        case GL_VERTEX_ARRAY_TYPE:
+        case GL_RED_BITS:
+        case GL_MAX_CLIENT_ATTRIB_STACK_DEPTH:
+        case GL_INDEX_CLEAR_VALUE:
+        case GL_PIXEL_MAP_I_TO_G_SIZE:
+        case GL_ALPHA_BITS:
+        case GL_PIXEL_MAP_I_TO_R_SIZE:
+        case GL_COLOR_ARRAY_SIZE:
+        case GL_TEXTURE_COORD_ARRAY_SIZE:
+        case GL_MAP1_GRID_SEGMENTS:
+        case GL_VERTEX_ARRAY_SIZE:
+        case GL_PIXEL_MAP_R_TO_R_SIZE:
+        case GL_TEXTURE_COORD_ARRAY_STRIDE:
+        case GL_MODELVIEW_STACK_DEPTH:
+        case GL_MAX_TEXTURE_STACK_DEPTH:
+        case GL_PIXEL_MAP_I_TO_I_SIZE:
+        case GL_FOG_INDEX:
+        case GL_INDEX_WRITEMASK:
+        case GL_PACK_ROW_LENGTH:
+        case GL_CURRENT_INDEX:
+        case GL_STENCIL_VALUE_MASK:
+        case GL_UNPACK_SKIP_ROWS:
+        case GL_MAX_PROJECTION_STACK_DEPTH:
+        case GL_LIST_INDEX:
+        case GL_STENCIL_FUNC:
+        case GL_INDEX_OFFSET:
+        case GL_UNPACK_ROW_LENGTH:
+        case GL_COLOR_MATERIAL_FACE:
+        case GL_NORMAL_ARRAY_TYPE:
+        case GL_STENCIL_BITS:
+        case GL_PROJECTION_STACK_DEPTH:
+        case GL_CURRENT_RASTER_INDEX:
+        case GL_SHADE_MODEL:
+        case GL_TEXTURE_ENV_MODE:
+        case GL_NORMAL_ARRAY_STRIDE:
+        case GL_PERSPECTIVE_CORRECTION_HINT:
+        case GL_MAX_CLIP_PLANES:
+        case GL_MAX_MODELVIEW_STACK_DEPTH:
+        case GL_SUBPIXEL_BITS:
+        case GL_ACCUM_RED_BITS:
+        case GL_BLEND_DST:
+        case GL_FRONT_FACE:
+        case GL_MAX_EVAL_ORDER:
+        case GL_LINE_STIPPLE_PATTERN:
+        case GL_NAME_STACK_DEPTH:
+        case GL_MAX_ATTRIB_STACK_DEPTH:
+        case GL_POLYGON_SMOOTH_HINT:
+        case GL_ACCUM_GREEN_BITS:
+        {
+            GLint ret[1];
+            int i;
+            glGetIntegerv(param, ret);
+
+            for (i = 0; i < 1; i++) {
+                XPUSHs(sv_2mortal(newSViv(ret[i]))); 
+            }
+            break;
+        }
+        case GL_POLYGON_MODE:
+        case GL_MAX_VIEWPORT_DIMS:
+        case GL_MAP2_GRID_SEGMENTS:
+        {
+            GLint ret[2];
+            int i;
+            glGetIntegerv(param, ret);
+
+            for (i = 0; i < 2; i++) {
+                XPUSHs(sv_2mortal(newSViv(ret[i]))); 
+            }
+            break;
+        }
+        case GL_SCISSOR_BOX:
+        case GL_VIEWPORT:
+        {
+            GLint ret[4];
+            int i;
+            glGetIntegerv(param, ret);
+
+            for (i = 0; i < 4; i++) {
+                XPUSHs(sv_2mortal(newSViv(ret[i]))); 
+            }
+            break;
+        }
+        default:
+            croak("Unknown glGet parameter!");
+        }
+#line 876 "OpenGL.c"
+       PUTBACK;
+       return;
+    }
+}
+
+XS(XS_SDL__OpenGL_glIsEnabled); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_glIsEnabled)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::glIsEnabled(cap)");
+    {
+       Uint32  cap = (Uint32)SvUV(ST(0));
+       Uint32  RETVAL;
+       dXSTARG;
+#line 741 "OpenGL.xs"
+               RETVAL = glIsEnabled(cap);
+#line 894 "OpenGL.c"
+       XSprePUSH; PUSHu((UV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL__OpenGL_glPointSize); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_glPointSize)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::glPointSize(size)");
+    {
+       double  size = (double)SvNV(ST(0));
+#line 749 "OpenGL.xs"
+               glPointSize((GLfloat)size);
+#line 910 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL__OpenGL_glLineWidth); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_glLineWidth)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::glLineWidth(size)");
+    {
+       double  size = (double)SvNV(ST(0));
+#line 755 "OpenGL.xs"
+               glLineWidth((GLfloat)size);
+#line 925 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL__OpenGL_glLineStipple); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_glLineStipple)
+{
+    dXSARGS;
+    if (items != 2)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::glLineStipple(factor, pattern)");
+    {
+       Sint32  factor = (Sint32)SvIV(ST(0));
+       Uint16  pattern = (Uint16)SvUV(ST(1));
+#line 762 "OpenGL.xs"
+               glLineStipple(factor,pattern);
+#line 941 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL__OpenGL_glPolygonMode); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_glPolygonMode)
+{
+    dXSARGS;
+    if (items != 2)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::glPolygonMode(face, mode)");
+    {
+       GLenum  face = (GLenum)SvIV(ST(0));
+       GLenum  mode = (GLenum)SvIV(ST(1));
+#line 769 "OpenGL.xs"
+               glPolygonMode(face,mode);
+#line 957 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL__OpenGL_glFrontFace); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_glFrontFace)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::glFrontFace(mode)");
+    {
+       GLenum  mode = (GLenum)SvIV(ST(0));
+#line 775 "OpenGL.xs"
+               glFrontFace(mode);
+#line 972 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL__OpenGL_glCullFace); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_glCullFace)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::glCullFace(mode)");
+    {
+       GLenum  mode = (GLenum)SvIV(ST(0));
+#line 781 "OpenGL.xs"
+               glCullFace(mode);
+#line 987 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL__OpenGL_glPolygonStipple); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_glPolygonStipple)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::glPolygonStipple(mask)");
+    {
+       char *  mask = (char *)SvPV_nolen(ST(0));
+#line 787 "OpenGL.xs"
+               glPolygonStipple(mask);
+#line 1002 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL__OpenGL_glEdgeFlag); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_glEdgeFlag)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::glEdgeFlag(flag)");
+    {
+       GLenum  flag = (GLenum)SvIV(ST(0));
+#line 793 "OpenGL.xs"
+               glEdgeFlag(flag);
+#line 1017 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL__OpenGL_glNormal); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_glNormal)
+{
+    dXSARGS;
+    if (items != 3)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::glNormal(x, y, z)");
+    {
+       double  x = (double)SvNV(ST(0));
+       double  y = (double)SvNV(ST(1));
+       double  z = (double)SvNV(ST(2));
+#line 801 "OpenGL.xs"
+               glNormal3d(x,y,z);
+#line 1034 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL__OpenGL_glEnableClientState); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_glEnableClientState)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::glEnableClientState(array)");
+    {
+       GLenum  array = (GLenum)SvIV(ST(0));
+#line 807 "OpenGL.xs"
+               glEnableClientState(array);
+#line 1049 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL__OpenGL_glDisableClientState); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_glDisableClientState)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::glDisableClientState(array)");
+    {
+       GLenum  array = (GLenum)SvIV(ST(0));
+#line 813 "OpenGL.xs"
+               glDisableClientState(array);
+#line 1064 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL__OpenGL_glVertexPointer); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_glVertexPointer)
+{
+    dXSARGS;
+    if (items != 4)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::glVertexPointer(size, type, stride, pointer)");
+    {
+       int     size = (int)SvIV(ST(0));
+       GLenum  type = (GLenum)SvIV(ST(1));
+       Uint32  stride = (Uint32)SvUV(ST(2));
+       char *  pointer = (char *)SvPV_nolen(ST(3));
+#line 822 "OpenGL.xs"
+               glVertexPointer(size,type,stride,pointer);
+#line 1082 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL__OpenGL_glColorPointer); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_glColorPointer)
+{
+    dXSARGS;
+    if (items != 4)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::glColorPointer(size, type, stride, pointer)");
+    {
+       Sint32  size = (Sint32)SvIV(ST(0));
+       GLenum  type = (GLenum)SvIV(ST(1));
+       Uint32  stride = (Uint32)SvUV(ST(2));
+       char *  pointer = (char *)SvPV_nolen(ST(3));
+#line 831 "OpenGL.xs"
+               glColorPointer(size,type,stride,pointer);
+#line 1100 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL__OpenGL_glNormalPointer); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_glNormalPointer)
+{
+    dXSARGS;
+    if (items != 3)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::glNormalPointer(type, stride, pointer)");
+    {
+       GLenum  type = (GLenum)SvIV(ST(0));
+       Uint32  stride = (Uint32)SvUV(ST(1));
+       char *  pointer = (char *)SvPV_nolen(ST(2));
+#line 839 "OpenGL.xs"
+               glNormalPointer(type,stride,pointer);
+#line 1117 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL__OpenGL_glTexCoordPointer); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_glTexCoordPointer)
+{
+    dXSARGS;
+    if (items != 4)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::glTexCoordPointer(size, type, stride, pointer)");
+    {
+       Sint32  size = (Sint32)SvIV(ST(0));
+       GLenum  type = (GLenum)SvIV(ST(1));
+       Uint32  stride = (Uint32)SvUV(ST(2));
+       char *  pointer = (char *)SvPV_nolen(ST(3));
+#line 848 "OpenGL.xs"
+               glTexCoordPointer(size,type,stride,pointer);
+#line 1135 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL__OpenGL_glEdgeFlagPointer); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_glEdgeFlagPointer)
+{
+    dXSARGS;
+    if (items != 2)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::glEdgeFlagPointer(stride, pointer)");
+    {
+       Uint32  stride = (Uint32)SvUV(ST(0));
+       char *  pointer = (char *)SvPV_nolen(ST(1));
+#line 855 "OpenGL.xs"
+               glEdgeFlagPointer(stride,pointer);
+#line 1151 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL__OpenGL_glArrayElement); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_glArrayElement)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::glArrayElement(ith)");
+    {
+       Uint32  ith = (Uint32)SvUV(ST(0));
+#line 861 "OpenGL.xs"
+               glArrayElement(ith);
+#line 1166 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL__OpenGL_glDrawElements); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_glDrawElements)
+{
+    dXSARGS;
+    if (items != 4)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::glDrawElements(mode, count, type, indices)");
+    {
+       GLenum  mode = (GLenum)SvIV(ST(0));
+       Uint32  count = (Uint32)SvUV(ST(1));
+       GLenum  type = (GLenum)SvIV(ST(2));
+       char *  indices = (char *)SvPV_nolen(ST(3));
+#line 870 "OpenGL.xs"
+               glDrawElements( mode, count, type, indices);
+#line 1184 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL__OpenGL_glDrawRangeElements); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_glDrawRangeElements)
+{
+    dXSARGS;
+    if (items != 6)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::glDrawRangeElements(mode, start, end, count, type, indices)");
+    {
+       GLenum  mode = (GLenum)SvIV(ST(0));
+       Uint32  start = (Uint32)SvUV(ST(1));
+       Uint32  end = (Uint32)SvUV(ST(2));
+       Uint32  count = (Uint32)SvUV(ST(3));
+       GLenum  type = (GLenum)SvIV(ST(4));
+       char *  indices = (char *)SvPV_nolen(ST(5));
+#line 881 "OpenGL.xs"
+               glDrawRangeElements(mode,start,end,count,type,indices);
+#line 1204 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL__OpenGL_glDrawArrays); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_glDrawArrays)
+{
+    dXSARGS;
+    if (items != 3)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::glDrawArrays(mode, first, count)");
+    {
+       GLenum  mode = (GLenum)SvIV(ST(0));
+       Uint32  first = (Uint32)SvUV(ST(1));
+       Uint32  count = (Uint32)SvUV(ST(2));
+#line 889 "OpenGL.xs"
+               glDrawArrays(mode,first,count);
+#line 1221 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL__OpenGL_glInterleavedArrays); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_glInterleavedArrays)
+{
+    dXSARGS;
+    if (items != 3)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::glInterleavedArrays(format, stride, pointer)");
+    {
+       GLenum  format = (GLenum)SvIV(ST(0));
+       Uint32  stride = (Uint32)SvUV(ST(1));
+       char *  pointer = (char *)SvPV_nolen(ST(2));
+#line 897 "OpenGL.xs"
+               glInterleavedArrays(format,stride,pointer);
+#line 1238 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL__OpenGL_glPushAttrib); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_glPushAttrib)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::glPushAttrib(mask)");
+    {
+       GLbitfield      mask = (GLbitfield)SvIV(ST(0));
+#line 903 "OpenGL.xs"
+               glPushAttrib(mask);
+#line 1253 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL__OpenGL_glPopAttrib); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_glPopAttrib)
+{
+    dXSARGS;
+    if (items != 0)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::glPopAttrib()");
+    {
+#line 908 "OpenGL.xs"
+               glPopAttrib();
+#line 1267 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL__OpenGL_glPushClientAttrib); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_glPushClientAttrib)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::glPushClientAttrib(mask)");
+    {
+       GLbitfield      mask = (GLbitfield)SvIV(ST(0));
+#line 914 "OpenGL.xs"
+               glPushClientAttrib(mask);
+#line 1282 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL__OpenGL_glPopClientAttrib); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_glPopClientAttrib)
+{
+    dXSARGS;
+    if (items != 0)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::glPopClientAttrib()");
+    {
+#line 919 "OpenGL.xs"
+               glPopClientAttrib();
+#line 1296 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL__OpenGL_glMatrixMode); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_glMatrixMode)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::glMatrixMode(mode)");
+    {
+       GLenum  mode = (GLenum)SvIV(ST(0));
+#line 925 "OpenGL.xs"
+               glMatrixMode(mode);
+#line 1311 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL__OpenGL_glLoadIdentity); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_glLoadIdentity)
+{
+    dXSARGS;
+    if (items != 0)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::glLoadIdentity()");
+    {
+#line 930 "OpenGL.xs"
+               glLoadIdentity();
+#line 1325 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL__OpenGL_glLoadMatrix); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_glLoadMatrix)
+{
+    dXSARGS;
+    {
+#line 935 "OpenGL.xs"
+               int i;
+               double mat[16];
+               for ( i = 0; i < 16; i++ ) {
+                       mat[i] = (i < items  && SvNOK(ST(i)) ? SvNV(ST(i)) : 0.0 );
+               }
+               glLoadMatrixd(mat);
+#line 1342 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL__OpenGL_glMultMatrix); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_glMultMatrix)
+{
+    dXSARGS;
+    {
+#line 945 "OpenGL.xs"
+               int i;
+               double mat[16];
+               for ( i = 0; i < 16; i++ ) {
+                       mat[i] = (i < items  && SvNOK(ST(i)) ? SvNV(ST(i)) : 0.0 );
+               }
+               glMultMatrixd(mat);
+#line 1359 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL__OpenGL_glTranslate); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_glTranslate)
+{
+    dXSARGS;
+    if (items != 3)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::glTranslate(x, y, z)");
+    {
+       double  x = (double)SvNV(ST(0));
+       double  y = (double)SvNV(ST(1));
+       double  z = (double)SvNV(ST(2));
+#line 958 "OpenGL.xs"
+               glTranslated(x,y,z);
+#line 1376 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL__OpenGL_glRotate); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_glRotate)
+{
+    dXSARGS;
+    if (items != 4)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::glRotate(angle, x, y, z)");
+    {
+       double  angle = (double)SvNV(ST(0));
+       double  x = (double)SvNV(ST(1));
+       double  y = (double)SvNV(ST(2));
+       double  z = (double)SvNV(ST(3));
+#line 967 "OpenGL.xs"
+               glRotated(angle,x,y,z);
+#line 1394 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL__OpenGL_glScale); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_glScale)
+{
+    dXSARGS;
+    if (items != 3)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::glScale(x, y, z)");
+    {
+       double  x = (double)SvNV(ST(0));
+       double  y = (double)SvNV(ST(1));
+       double  z = (double)SvNV(ST(2));
+#line 975 "OpenGL.xs"
+               glScaled(x,y,z);
+#line 1411 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL__OpenGL_glFrustum); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_glFrustum)
+{
+    dXSARGS;
+    if (items != 6)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::glFrustum(left, right, bottom, top, n, f)");
+    {
+       double  left = (double)SvNV(ST(0));
+       double  right = (double)SvNV(ST(1));
+       double  bottom = (double)SvNV(ST(2));
+       double  top = (double)SvNV(ST(3));
+       double  n = (double)SvNV(ST(4));
+       double  f = (double)SvNV(ST(5));
+#line 986 "OpenGL.xs"
+               glFrustum(left,right,bottom,top,n,f);
+#line 1431 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL__OpenGL_glOrtho); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_glOrtho)
+{
+    dXSARGS;
+    if (items != 6)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::glOrtho(left, right, bottom, top, n, f)");
+    {
+       double  left = (double)SvNV(ST(0));
+       double  right = (double)SvNV(ST(1));
+       double  bottom = (double)SvNV(ST(2));
+       double  top = (double)SvNV(ST(3));
+       double  n = (double)SvNV(ST(4));
+       double  f = (double)SvNV(ST(5));
+#line 997 "OpenGL.xs"
+               glOrtho(left,right,bottom,top,n,f);
+#line 1451 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL__OpenGL_glViewport); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_glViewport)
+{
+    dXSARGS;
+    if (items != 4)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::glViewport(x, y, width, height)");
+    {
+       Sint32  x = (Sint32)SvIV(ST(0));
+       Sint32  y = (Sint32)SvIV(ST(1));
+       Uint32  width = (Uint32)SvUV(ST(2));
+       Uint32  height = (Uint32)SvUV(ST(3));
+#line 1006 "OpenGL.xs"
+               glViewport(x,y,width,height);
+#line 1469 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL__OpenGL_glDepthRange); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_glDepthRange)
+{
+    dXSARGS;
+    if (items != 2)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::glDepthRange(n, f)");
+    {
+       double  n = (double)SvNV(ST(0));
+       double  f = (double)SvNV(ST(1));
+#line 1013 "OpenGL.xs"
+               glDepthRange(n,f);
+#line 1485 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL__OpenGL_glPushMatrix); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_glPushMatrix)
+{
+    dXSARGS;
+    if (items != 0)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::glPushMatrix()");
+    {
+#line 1018 "OpenGL.xs"
+               glPushMatrix();
+#line 1499 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL__OpenGL_glPopMatrix); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_glPopMatrix)
+{
+    dXSARGS;
+    if (items != 0)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::glPopMatrix()");
+    {
+#line 1023 "OpenGL.xs"
+               glPopMatrix();
+#line 1513 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL__OpenGL_glClipPlane); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_glClipPlane)
+{
+    dXSARGS;
+    if (items < 1)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::glClipPlane(plane, ...)");
+    {
+       GLenum  plane = (GLenum)SvIV(ST(0));
+#line 1029 "OpenGL.xs"
+               double v[4];
+               int i;
+               for (i = 0; i < 4; i++ ) {
+                       v[i] = (i+1 < items && SvNOK(ST(i+1))) ? SvNV(ST(i+1)) : 0.0;
+               }
+               glClipPlane(plane,v);
+#line 1533 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL__OpenGL_glColor); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_glColor)
+{
+    dXSARGS;
+    if (items < 3)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::glColor(r, g, b, ...)");
+    {
+       double  r = (double)SvNV(ST(0));
+       double  g = (double)SvNV(ST(1));
+       double  b = (double)SvNV(ST(2));
+#line 1042 "OpenGL.xs"
+               if ( items == 4 ) {
+                       double a;
+                       a = SvNV(ST(3));
+                       glColor4d(r,g,b,a);
+               } else {
+                       glColor3d(r,g,b);       
+               }
+#line 1556 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL__OpenGL_glIndex); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_glIndex)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::glIndex(c)");
+    {
+       Uint32  c = (Uint32)SvUV(ST(0));
+#line 1054 "OpenGL.xs"
+               glIndexi(c);
+#line 1571 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL__OpenGL_glShadeModel); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_glShadeModel)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::glShadeModel(mode)");
+    {
+       GLenum  mode = (GLenum)SvIV(ST(0));
+#line 1060 "OpenGL.xs"
+               glShadeModel(mode);
+#line 1586 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL__OpenGL_glLight); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_glLight)
+{
+    dXSARGS;
+    if (items < 2)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::glLight(light, name, ...)");
+    {
+       GLenum  light = (GLenum)SvIV(ST(0));
+       GLenum  name = (GLenum)SvIV(ST(1));
+#line 1067 "OpenGL.xs"
+               int i;
+               if ( items == 6 ) {
+                       float v[4];     
+                       for ( i = 0; i < 4; i++ ) {
+                               v[i] = (SvNOK(ST(i+2))) ? SvNV(ST(i+2)) : 0.0;
+                       }
+                       glLightfv(light,name,v);        
+               } else if ( items == 5 ) {
+                       float v[3];
+                       for ( i = 0; i < 3; i++ ) {
+                               v[i] = (SvNOK(ST(i+2))) ? SvNV(ST(i+2)) : 0.0;
+                       }
+                       glLightfv(light,name,v);        
+               } else if ( items == 3 ) {
+                       float v;
+                       v = SvNV(ST(2));
+                       glLightf(light,name,v);
+               } else {
+                       Perl_croak(aTHX_ "SDL::OpenGL::Light invalid arguments");
+               }
+#line 1621 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL__OpenGL_glLightModel); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_glLightModel)
+{
+    dXSARGS;
+    if (items < 1)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::glLightModel(pname, ...)");
+    {
+       GLenum  pname = (GLenum)SvIV(ST(0));
+#line 1092 "OpenGL.xs"
+               GLfloat vec[4];
+               if ( pname == GL_LIGHT_MODEL_LOCAL_VIEWER ||
+                       pname == GL_LIGHT_MODEL_TWO_SIDE ||
+                       pname == GL_LIGHT_MODEL_COLOR_CONTROL ) {
+                       glLightModelf(pname,SvNV(ST(1)));
+               } else if ( pname == GL_LIGHT_MODEL_AMBIENT) {
+                       vec[0] = SvNV(ST(1));
+                       vec[1] = SvNV(ST(2));
+                       vec[2] = SvNV(ST(3));
+                       vec[3] = SvNV(ST(4));
+                       glLightModelfv(pname,vec);
+               } else {
+                       Perl_croak(aTHX_ "SDL::OpenGL::glLightModel unknown model %d",pname);
+               }
+#line 1649 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL__OpenGL_glMaterial); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_glMaterial)
+{
+    dXSARGS;
+    if (items < 2)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::glMaterial(face, name, ...)");
+    {
+       GLenum  face = (GLenum)SvIV(ST(0));
+       GLenum  name = (GLenum)SvIV(ST(1));
+#line 1112 "OpenGL.xs"
+               int i;
+               if ( items == 6 ) {
+                       float v[4];
+                       for ( i = 0; i < 4; i++ ) {
+                               v[i] = (SvNOK(ST(i+2))) ? SvNV(ST(i+2)) : 0.0;
+                       }
+                       glMaterialfv(face,name,v);
+               } else if ( items == 5 ) {
+                       float v[3];
+                       for ( i = 0; i < 4; i++ ) {
+                               v[i] = (SvNOK(ST(i+2))) ? SvNV(ST(i+2)) : 0.0;
+                       }
+                       glMaterialfv(face,name,v);
+               } else if ( items == 3 ) {      
+                       float v;
+                       v = SvNV(ST(2));
+                       glMaterialf(face,name,v);
+               } else {
+                       Perl_croak(aTHX_ "SDL::OpenGL::Material invalid arguments");
+               }
+#line 1684 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL__OpenGL_glColorMaterial); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_glColorMaterial)
+{
+    dXSARGS;
+    if (items != 2)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::glColorMaterial(face, mode)");
+    {
+       GLenum  face = (GLenum)SvIV(ST(0));
+       GLenum  mode = (GLenum)SvIV(ST(1));
+#line 1138 "OpenGL.xs"
+               glColorMaterial(face,mode);
+#line 1700 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL__OpenGL_glBlendFunc); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_glBlendFunc)
+{
+    dXSARGS;
+    if (items != 2)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::glBlendFunc(sfactor, dfactor)");
+    {
+       GLenum  sfactor = (GLenum)SvIV(ST(0));
+       GLenum  dfactor = (GLenum)SvIV(ST(1));
+#line 1145 "OpenGL.xs"
+               glBlendFunc(sfactor,dfactor);
+#line 1716 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL__OpenGL_glHint); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_glHint)
+{
+    dXSARGS;
+    if (items != 2)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::glHint(target, hint)");
+    {
+       GLenum  target = (GLenum)SvIV(ST(0));
+       GLenum  hint = (GLenum)SvIV(ST(1));
+#line 1153 "OpenGL.xs"
+               glHint(target,hint);    
+#line 1732 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL__OpenGL_glFog); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_glFog)
+{
+    dXSARGS;
+    if (items < 1)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::glFog(name, ...)");
+    {
+       GLenum  name = (GLenum)SvIV(ST(0));
+#line 1159 "OpenGL.xs"
+               if ( items == 5 )  {
+                       float v[4];
+                       v[0] = SvNV(ST(1));     
+                       v[1] = SvNV(ST(2));     
+                       v[2] = SvNV(ST(3));     
+                       v[3] = SvNV(ST(4));     
+                       glFogfv(name,v);
+               } else if ( items == 2 ) {
+                       float v;
+                       v = SvNV(ST(1));
+                       glFogf(name,v);
+               } else {
+                       Perl_croak(aTHX_ "SDL::OpenGL::Material invalid arguments");
+               }
+#line 1760 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL__OpenGL_glPolygonOffset); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_glPolygonOffset)
+{
+    dXSARGS;
+    if (items != 2)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::glPolygonOffset(factor, units)");
+    {
+       double  factor = (double)SvNV(ST(0));
+       double  units = (double)SvNV(ST(1));
+#line 1179 "OpenGL.xs"
+               glPolygonOffset(factor,units);
+#line 1776 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL__OpenGL_glGenLists); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_glGenLists)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::glGenLists(range)");
+    {
+       Uint32  range = (Uint32)SvUV(ST(0));
+       Uint32  RETVAL;
+       dXSTARG;
+#line 1185 "OpenGL.xs"
+               RETVAL = glGenLists(range);
+#line 1793 "OpenGL.c"
+       XSprePUSH; PUSHu((UV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL__OpenGL_glNewList); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_glNewList)
+{
+    dXSARGS;
+    if (items != 2)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::glNewList(list, mode)");
+    {
+       Uint32  list = (Uint32)SvUV(ST(0));
+       GLenum  mode = (GLenum)SvIV(ST(1));
+#line 1194 "OpenGL.xs"
+               glNewList(list,mode);
+#line 1810 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL__OpenGL_glEndList); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_glEndList)
+{
+    dXSARGS;
+    if (items != 0)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::glEndList()");
+    {
+#line 1199 "OpenGL.xs"
+               glEndList();
+#line 1824 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL__OpenGL_glDeleteLists); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_glDeleteLists)
+{
+    dXSARGS;
+    if (items != 2)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::glDeleteLists(base, count)");
+    {
+       Uint32  base = (Uint32)SvUV(ST(0));
+       Uint32  count = (Uint32)SvUV(ST(1));
+#line 1206 "OpenGL.xs"
+                glDeleteLists(base, count);
+#line 1840 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL__OpenGL_glCallList); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_glCallList)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::glCallList(list)");
+    {
+       Uint32  list = (Uint32)SvUV(ST(0));
+#line 1212 "OpenGL.xs"
+               glCallList(list);
+#line 1855 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL__OpenGL_glIsList); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_glIsList)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::glIsList(list)");
+    {
+       Uint32  list = (Uint32)SvUV(ST(0));
+       Uint32  RETVAL;
+       dXSTARG;
+#line 1218 "OpenGL.xs"
+               RETVAL = glIsList(list);
+#line 1872 "OpenGL.c"
+       XSprePUSH; PUSHu((UV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL__OpenGL_glListBase); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_glListBase)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::glListBase(base)");
+    {
+       Uint32  base = (Uint32)SvUV(ST(0));
+#line 1226 "OpenGL.xs"
+               glListBase(base);
+#line 1888 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL__OpenGL_glCallLists); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_glCallLists)
+{
+    dXSARGS;
+    {
+#line 1231 "OpenGL.xs"
+               int *i, j;      
+               if ( items > 0 ) {
+                       i = (int*)safemalloc(sizeof(int)* (items));
+                       for ( j = 0; j < items; j++ ) {
+                               i[j] = SvIV(ST(j));
+                       } 
+               } else {
+                       Perl_croak(aTHX_ "usage: SDL::OpenGL::CallLists(type,...)");
+               }
+               glCallLists(items, GL_INT, i);
+               safefree(i);
+#line 1910 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL__OpenGL_glCallListsString); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_glCallListsString)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::glCallListsString(string)");
+    {
+       SV*     string = ST(0);
+#line 1247 "OpenGL.xs"
+               char *str;
+               STRLEN len;
+               str = SvPV(string,len);
+               glCallLists(len,GL_BYTE,str);
+#line 1928 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL__OpenGL_glRasterPos); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_glRasterPos)
+{
+    dXSARGS;
+    if (items < 3)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::glRasterPos(x, y, z, ...)");
+    {
+       double  x = (double)SvNV(ST(0));
+       double  y = (double)SvNV(ST(1));
+       double  z = (double)SvNV(ST(2));
+#line 1258 "OpenGL.xs"
+               if ( items == 4 ) {
+                       double w = SvNV(ST(3));
+                       glRasterPos4d(x,y,z,w);
+               } else {
+                       glRasterPos3d(x,y,z);
+               }
+#line 1950 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL__OpenGL_glBitmap); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_glBitmap)
+{
+    dXSARGS;
+    if (items != 7)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::glBitmap(width, height, x1, y1, x2, y2, data)");
+    {
+       Uint32  width = (Uint32)SvUV(ST(0));
+       Uint32  height = (Uint32)SvUV(ST(1));
+       double  x1 = (double)SvNV(ST(2));
+       double  y1 = (double)SvNV(ST(3));
+       double  x2 = (double)SvNV(ST(4));
+       double  y2 = (double)SvNV(ST(5));
+       char *  data = (char *)SvPV_nolen(ST(6));
+#line 1275 "OpenGL.xs"
+               glBitmap(width,height,x1,y1,x2,y2,data);
+#line 1971 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL__OpenGL_glDrawPixels); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_glDrawPixels)
+{
+    dXSARGS;
+    if (items != 5)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::glDrawPixels(width, height, format, type, pixels)");
+    {
+       Uint32  width = (Uint32)SvUV(ST(0));
+       Uint32  height = (Uint32)SvUV(ST(1));
+       GLenum  format = (GLenum)SvIV(ST(2));
+       GLenum  type = (GLenum)SvIV(ST(3));
+       char *  pixels = (char *)SvPV_nolen(ST(4));
+#line 1285 "OpenGL.xs"
+               glDrawPixels(width,height,format,type,pixels);
+#line 1990 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL__OpenGL_glReadPixels); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_glReadPixels)
+{
+    dXSARGS;
+    if (items != 6)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::glReadPixels(x, y, width, height, format, type)");
+    {
+       Uint32  x = (Uint32)SvUV(ST(0));
+       Uint32  y = (Uint32)SvUV(ST(1));
+       Uint32  height = (Uint32)SvUV(ST(3));
+       Uint32  width = (Uint32)SvUV(ST(2));
+       GLenum  format = (GLenum)SvIV(ST(4));
+       GLenum  type = (GLenum)SvIV(ST(5));
+       SV *    RETVAL;
+#line 1297 "OpenGL.xs"
+                int len, size;
+                char *buf;
+                size = 1;       /* ALPHA, BLUE, GREEN or RED */
+                if (format == GL_BGR || format == GL_RGB) 
+                        size = 3;
+                if (format == GL_BGRA || format == GL_RGBA) 
+                        size = 4;
+                len = height * width * size;            /* in bytes */
+                RETVAL = newSV(len);                    /* alloc len+1 bytes */
+                SvPOK_on(RETVAL);                       /* make an PV */
+                buf = SvPVX(RETVAL);                    /* get ptr to buffer */
+                glReadPixels(x,y,width,height,format,type,buf);
+                SvCUR_set(RETVAL, len);                 /* set real length */
+#line 2023 "OpenGL.c"
+       ST(0) = RETVAL;
+       sv_2mortal(ST(0));
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL__OpenGL_glReadPixel); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_glReadPixel)
+{
+    dXSARGS;
+    if (items != 2)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::glReadPixel(x, y)");
+    {
+       Uint32  x = (Uint32)SvUV(ST(0));
+       Uint32  y = (Uint32)SvUV(ST(1));
+       AV *    RETVAL;
+#line 1318 "OpenGL.xs"
+                int rgba[4];    /* r,g,b,a */
+                int i;
+                glReadPixels(x,y,1,1,GL_RGBA,GL_UNSIGNED_INT,rgba);
+                RETVAL = newAV();
+                for ( i = 0; i < 4; i++ ) {
+                        av_push(RETVAL,newSViv(rgba[i]));
+                }
+#line 2048 "OpenGL.c"
+       ST(0) = newRV((SV*)RETVAL);
+       sv_2mortal(ST(0));
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL__OpenGL_glCopyPixels); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_glCopyPixels)
+{
+    dXSARGS;
+    if (items != 5)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::glCopyPixels(x, y, width, height, buffer)");
+    {
+       Sint32  x = (Sint32)SvIV(ST(0));
+       Sint32  y = (Sint32)SvIV(ST(1));
+       Uint32  width = (Uint32)SvUV(ST(2));
+       Uint32  height = (Uint32)SvUV(ST(3));
+       GLenum  buffer = (GLenum)SvIV(ST(4));
+#line 1336 "OpenGL.xs"
+               glCopyPixels(x,y,width,height,buffer);
+#line 2069 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL__OpenGL_glPixelStore); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_glPixelStore)
+{
+    dXSARGS;
+    if (items != 2)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::glPixelStore(name, param)");
+    {
+       Sint32  name = (Sint32)SvIV(ST(0));
+       double  param = (double)SvNV(ST(1));
+#line 1343 "OpenGL.xs"
+               glPixelStorei(name,param);
+#line 2085 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL__OpenGL_glPixelTransfer); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_glPixelTransfer)
+{
+    dXSARGS;
+    if (items < 1)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::glPixelTransfer(name, ...)");
+    {
+       GLenum  name = (GLenum)SvIV(ST(0));
+#line 1349 "OpenGL.xs"
+               switch ( name ) {
+                       case GL_MAP_COLOR:
+                       case GL_MAP_STENCIL:
+                       case GL_INDEX_SHIFT:
+                       case GL_INDEX_OFFSET:
+                               glPixelTransferi(name,SvIV(ST(1)));
+                               break;
+                       default:
+                               glPixelTransferf(name,SvNV(ST(1)));
+                               break;
+               }
+#line 2110 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL__OpenGL_glPixelMap); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_glPixelMap)
+{
+    dXSARGS;
+    if (items != 4)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::glPixelMap(type, map, mapsize, values)");
+    {
+       GLenum  type = (GLenum)SvIV(ST(0));
+       GLenum  map = (GLenum)SvIV(ST(1));
+       Sint32  mapsize = (Sint32)SvIV(ST(2));
+       char *  values = (char *)SvPV_nolen(ST(3));
+#line 1368 "OpenGL.xs"
+               switch (type) {
+                       case GL_UNSIGNED_INT: 
+                               glPixelMapuiv(map,mapsize,(GLint*)values);
+                               break;
+                       case GL_UNSIGNED_SHORT:
+                               glPixelMapusv(map,mapsize,(GLushort*)values);
+                               break;
+                       case GL_FLOAT:
+                               glPixelMapfv(map,mapsize,(GLfloat*)values);
+                               break;
+               }
+#line 2138 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL__OpenGL_glPixelZoom); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_glPixelZoom)
+{
+    dXSARGS;
+    if (items != 2)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::glPixelZoom(zoomx, zoomy)");
+    {
+       double  zoomx = (double)SvNV(ST(0));
+       double  zoomy = (double)SvNV(ST(1));
+#line 1385 "OpenGL.xs"
+               glPixelZoom(zoomx,zoomy);
+#line 2154 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+#ifdef GL_VERSION_1_3
+#define XSubPPtmpAAAB 1
+
+XS(XS_SDL__OpenGL_glColorTable); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_glColorTable)
+{
+    dXSARGS;
+    if (items != 6)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::glColorTable(target, internalFormat, width, format, type, data)");
+    {
+       GLenum  target = (GLenum)SvIV(ST(0));
+       GLenum  internalFormat = (GLenum)SvIV(ST(1));
+       Uint32  width = (Uint32)SvUV(ST(2));
+       GLenum  format = (GLenum)SvIV(ST(3));
+       GLenum  type = (GLenum)SvIV(ST(4));
+       char *  data = (char *)SvPV_nolen(ST(5));
+#line 1398 "OpenGL.xs"
+               glColorTable(target,internalFormat,width,format,type,data);
+#line 2177 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL__OpenGL_glColorTableParameter); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_glColorTableParameter)
+{
+    dXSARGS;
+    if (items != 6)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::glColorTableParameter(target, name, r, g, b, a)");
+    {
+       GLenum  target = (GLenum)SvIV(ST(0));
+       GLenum  name = (GLenum)SvIV(ST(1));
+       double  r = (double)SvNV(ST(2));
+       double  g = (double)SvNV(ST(3));
+       double  b = (double)SvNV(ST(4));
+       double  a = (double)SvNV(ST(5));
+#line 1409 "OpenGL.xs"
+               GLfloat vec[4];
+               vec[0] = r;
+               vec[1] = g;
+               vec[2] = b;
+               vec[3] = a;
+               glColorTableParameterfv(target,name,vec);
+#line 2202 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL__OpenGL_glCopyColorTable); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_glCopyColorTable)
+{
+    dXSARGS;
+    if (items != 5)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::glCopyColorTable(target, internalFormat, x, y, width)");
+    {
+       GLenum  target = (GLenum)SvIV(ST(0));
+       GLenum  internalFormat = (GLenum)SvIV(ST(1));
+       Sint32  x = (Sint32)SvIV(ST(2));
+       Sint32  y = (Sint32)SvIV(ST(3));
+       Uint32  width = (Uint32)SvUV(ST(4));
+#line 1424 "OpenGL.xs"
+               glCopyColorTable(target,internalFormat,x,y,width);
+#line 2221 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL__OpenGL_glColorSubTable); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_glColorSubTable)
+{
+    dXSARGS;
+    if (items != 6)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::glColorSubTable(target, start, count, format, type, data)");
+    {
+       Uint32  target = (Uint32)SvUV(ST(0));
+       Uint32  start = (Uint32)SvUV(ST(1));
+       Uint32  count = (Uint32)SvUV(ST(2));
+       Uint32  format = (Uint32)SvUV(ST(3));
+       Uint32  type = (Uint32)SvUV(ST(4));
+       char *  data = (char *)SvPV_nolen(ST(5));
+#line 1435 "OpenGL.xs"
+               glColorSubTable(target,start,count,format,type,data);
+#line 2241 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL__OpenGL_glCopyColorSubTable); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_glCopyColorSubTable)
+{
+    dXSARGS;
+    if (items != 5)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::glCopyColorSubTable(target, start, x, y, count)");
+    {
+       Uint32  target = (Uint32)SvUV(ST(0));
+       Uint32  start = (Uint32)SvUV(ST(1));
+       Sint32  x = (Sint32)SvIV(ST(2));
+       Sint32  y = (Sint32)SvIV(ST(3));
+       Uint32  count = (Uint32)SvUV(ST(4));
+#line 1445 "OpenGL.xs"
+               glCopyColorSubTable(target,start,x,y,count);
+#line 2260 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL__OpenGL_glConvolutionFilter2D); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_glConvolutionFilter2D)
+{
+    dXSARGS;
+    if (items != 7)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::glConvolutionFilter2D(target, internalFormat, width, height, format, type, image)");
+    {
+       Uint32  target = (Uint32)SvUV(ST(0));
+       Uint32  internalFormat = (Uint32)SvUV(ST(1));
+       Uint32  width = (Uint32)SvUV(ST(2));
+       Uint32  height = (Uint32)SvUV(ST(3));
+       Uint32  format = (Uint32)SvUV(ST(4));
+       Uint32  type = (Uint32)SvUV(ST(5));
+       char *  image = (char *)SvPV_nolen(ST(6));
+#line 1457 "OpenGL.xs"
+               glConvolutionFilter2D(target,internalFormat,width,height,format,type,image);
+#line 2281 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL__OpenGL_glCopyConvolutionFilter2D); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_glCopyConvolutionFilter2D)
+{
+    dXSARGS;
+    if (items != 6)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::glCopyConvolutionFilter2D(target, internalFormat, x, y, width, height)");
+    {
+       Uint32  target = (Uint32)SvUV(ST(0));
+       Uint32  internalFormat = (Uint32)SvUV(ST(1));
+       Sint32  x = (Sint32)SvIV(ST(2));
+       Sint32  y = (Sint32)SvIV(ST(3));
+       Uint32  width = (Uint32)SvUV(ST(4));
+       Uint32  height = (Uint32)SvUV(ST(5));
+#line 1468 "OpenGL.xs"
+               glCopyConvolutionFilter2D(target,internalFormat,x,y,width,height);
+#line 2301 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL__OpenGL_glSeparableFilter2D); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_glSeparableFilter2D)
+{
+    dXSARGS;
+    if (items != 8)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::glSeparableFilter2D(target, internalFormat, width, height, format, type, row, column)");
+    {
+       Uint32  target = (Uint32)SvUV(ST(0));
+       Uint32  internalFormat = (Uint32)SvUV(ST(1));
+       Uint32  width = (Uint32)SvUV(ST(2));
+       Uint32  height = (Uint32)SvUV(ST(3));
+       Uint32  format = (Uint32)SvUV(ST(4));
+       Uint32  type = (Uint32)SvUV(ST(5));
+       char *  row = (char *)SvPV_nolen(ST(6));
+       char *  column = (char *)SvPV_nolen(ST(7));
+#line 1481 "OpenGL.xs"
+               glSeparableFilter2D(target,internalFormat,width,height,format,type,row,column);
+#line 2323 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL__OpenGL_glConvolutionFilter1D); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_glConvolutionFilter1D)
+{
+    dXSARGS;
+    if (items != 6)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::glConvolutionFilter1D(target, internalFormat, width, format, type, image)");
+    {
+       Uint32  target = (Uint32)SvUV(ST(0));
+       Uint32  internalFormat = (Uint32)SvUV(ST(1));
+       Uint32  width = (Uint32)SvUV(ST(2));
+       Uint32  format = (Uint32)SvUV(ST(3));
+       Uint32  type = (Uint32)SvUV(ST(4));
+       char *  image = (char *)SvPV_nolen(ST(5));
+#line 1492 "OpenGL.xs"
+               glConvolutionFilter1D(target,internalFormat,width,format,type,image);
+#line 2343 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL__OpenGL_glCopyConvolutionFilter1D); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_glCopyConvolutionFilter1D)
+{
+    dXSARGS;
+    if (items != 5)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::glCopyConvolutionFilter1D(target, internalFormat, x, y, width)");
+    {
+       Uint32  target = (Uint32)SvUV(ST(0));
+       Uint32  internalFormat = (Uint32)SvUV(ST(1));
+       Sint32  x = (Sint32)SvIV(ST(2));
+       Sint32  y = (Sint32)SvIV(ST(3));
+       Uint32  width = (Uint32)SvUV(ST(4));
+#line 1502 "OpenGL.xs"
+               glCopyConvolutionFilter1D(target,internalFormat,x,y,width);
+#line 2362 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL__OpenGL_glConvolutionParameter); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_glConvolutionParameter)
+{
+    dXSARGS;
+    if (items < 2)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::glConvolutionParameter(target, pname, ...)");
+    {
+       Uint32  target = (Uint32)SvUV(ST(0));
+       Uint32  pname = (Uint32)SvUV(ST(1));
+#line 1509 "OpenGL.xs"
+               Uint32 pi;
+               GLfloat pv[4];
+               switch(pname) { 
+               case GL_CONVOLUTION_BORDER_MODE:
+                       if ( items != 3 ) 
+                               Perl_croak(aTHX_ "Usage: ConvolutionParameter(target,pname,...)");
+                       pi = SvIV(ST(2));
+                       glConvolutionParameteri(target,pname,pi);
+                       break;
+               case GL_CONVOLUTION_FILTER_SCALE:
+               case GL_CONVOLUTION_FILTER_BIAS:
+                       if ( items != 6 ) 
+                               Perl_croak(aTHX_ "Usage: ConvolutionParameter(target,pname,...)");
+                       pv[0] = (GLfloat)SvNV(ST(2));
+                       pv[1] = (GLfloat)SvNV(ST(3));
+                       pv[2] = (GLfloat)SvNV(ST(4));
+                       pv[3] = (GLfloat)SvNV(ST(5));
+                       glConvolutionParameterfv(target,pname,pv);
+                       break;
+               default:
+                       Perl_croak(aTHX_ "ConvolutionParameter invalid parameter");
+                       break;
+               }
+#line 2400 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL__OpenGL_glHistogram); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_glHistogram)
+{
+    dXSARGS;
+    if (items != 4)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::glHistogram(target, width, internalFormat, sink)");
+    {
+       Uint32  target = (Uint32)SvUV(ST(0));
+       Uint32  width = (Uint32)SvUV(ST(1));
+       Uint32  internalFormat = (Uint32)SvUV(ST(2));
+       GLboolean       sink = (unsigned char)SvUV(ST(3));
+#line 1540 "OpenGL.xs"
+               glHistogram(target,width,internalFormat,sink);
+#line 2418 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL__OpenGL_glGetHistogram); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_glGetHistogram)
+{
+    dXSARGS;
+    if (items != 5)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::glGetHistogram(target, reset, format, type, values)");
+    {
+       Uint32  target = (Uint32)SvUV(ST(0));
+       GLboolean       reset = (unsigned char)SvUV(ST(1));
+       Uint32  format = (Uint32)SvUV(ST(2));
+       Uint32  type = (Uint32)SvUV(ST(3));
+       char *  values = (char *)SvPV_nolen(ST(4));
+#line 1550 "OpenGL.xs"
+               glGetHistogram(target,reset,format,type,values);
+#line 2437 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL__OpenGL_glResetHistogram); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_glResetHistogram)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::glResetHistogram(target)");
+    {
+       Uint32  target = (Uint32)SvUV(ST(0));
+#line 1556 "OpenGL.xs"
+               glResetHistogram(target);
+#line 2452 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL__OpenGL_glMinmax); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_glMinmax)
+{
+    dXSARGS;
+    if (items != 3)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::glMinmax(target, internalFormat, sink)");
+    {
+       Uint32  target = (Uint32)SvUV(ST(0));
+       Uint32  internalFormat = (Uint32)SvUV(ST(1));
+       GLboolean       sink = (unsigned char)SvUV(ST(2));
+#line 1564 "OpenGL.xs"
+               glMinmax(target,internalFormat,sink);
+#line 2469 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL__OpenGL_glGetMinmax); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_glGetMinmax)
+{
+    dXSARGS;
+    if (items != 5)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::glGetMinmax(target, reset, format, type, values)");
+    {
+       Uint32  target = (Uint32)SvUV(ST(0));
+       GLboolean       reset = (unsigned char)SvUV(ST(1));
+       Uint32  format = (Uint32)SvUV(ST(2));
+       Uint32  type = (Uint32)SvUV(ST(3));
+       char *  values = (char *)SvPV_nolen(ST(4));
+#line 1574 "OpenGL.xs"
+               glGetMinmax(target,reset,format,type,values);
+#line 2488 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL__OpenGL_glResetMinmax); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_glResetMinmax)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::glResetMinmax(target)");
+    {
+       Uint32  target = (Uint32)SvUV(ST(0));
+#line 1580 "OpenGL.xs"
+               glResetMinmax(target);
+#line 2503 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL__OpenGL_glBlendEquation); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_glBlendEquation)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::glBlendEquation(mode)");
+    {
+       Uint32  mode = (Uint32)SvUV(ST(0));
+#line 1586 "OpenGL.xs"
+               glBlendEquation(mode);
+#line 2518 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+#endif // GL_VERSION_1_3
+XS(XS_SDL__OpenGL_glTexImage2D); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_glTexImage2D)
+{
+    dXSARGS;
+    if (items != 9)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::glTexImage2D(target, level, internalFormat, width, height, border, format, type, data)");
+    {
+       GLenum  target = (GLenum)SvIV(ST(0));
+       Sint32  level = (Sint32)SvIV(ST(1));
+       Sint32  internalFormat = (Sint32)SvIV(ST(2));
+       Uint32  width = (Uint32)SvUV(ST(3));
+       Uint32  height = (Uint32)SvUV(ST(4));
+       Sint32  border = (Sint32)SvIV(ST(5));
+       GLenum  format = (GLenum)SvIV(ST(6));
+       GLenum  type = (GLenum)SvIV(ST(7));
+       char *  data = (char *)SvPV_nolen(ST(8));
+#line 1602 "OpenGL.xs"
+               glTexImage2D(target,level,internalFormat,width,height,border,format,type,data);
+#line 2542 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL__OpenGL_glCopyTexImage2D); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_glCopyTexImage2D)
+{
+    dXSARGS;
+    if (items != 8)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::glCopyTexImage2D(target, level, internalFormat, x, y, width, height, border)");
+    {
+       GLenum  target = (GLenum)SvIV(ST(0));
+       Sint32  level = (Sint32)SvIV(ST(1));
+       Sint32  internalFormat = (Sint32)SvIV(ST(2));
+       Sint32  x = (Sint32)SvIV(ST(3));
+       Sint32  y = (Sint32)SvIV(ST(4));
+       Uint32  width = (Uint32)SvUV(ST(5));
+       Uint32  height = (Uint32)SvUV(ST(6));
+       Sint32  border = (Sint32)SvIV(ST(7));
+#line 1615 "OpenGL.xs"
+               glCopyTexImage2D(target,level,internalFormat,x,y,width,height,border);
+#line 2564 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL__OpenGL_glTexSubImage2D); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_glTexSubImage2D)
+{
+    dXSARGS;
+    if (items != 9)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::glTexSubImage2D(target, level, xoffset, yoffset, width, height, format, type, data)");
+    {
+       GLenum  target = (GLenum)SvIV(ST(0));
+       Sint32  level = (Sint32)SvIV(ST(1));
+       Sint32  xoffset = (Sint32)SvIV(ST(2));
+       Sint32  yoffset = (Sint32)SvIV(ST(3));
+       Uint32  width = (Uint32)SvUV(ST(4));
+       Uint32  height = (Uint32)SvUV(ST(5));
+       GLenum  format = (GLenum)SvIV(ST(6));
+       GLenum  type = (GLenum)SvIV(ST(7));
+       char *  data = (char *)SvPV_nolen(ST(8));
+#line 1629 "OpenGL.xs"
+               glTexSubImage2D(target,level,xoffset,yoffset,width,height,format,type,data);
+#line 2587 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL__OpenGL_glCopyTexSubImage2D); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_glCopyTexSubImage2D)
+{
+    dXSARGS;
+    if (items != 8)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::glCopyTexSubImage2D(target, level, xoffset, yoffset, x, y, width, height)");
+    {
+       GLenum  target = (GLenum)SvIV(ST(0));
+       Sint32  level = (Sint32)SvIV(ST(1));
+       Sint32  xoffset = (Sint32)SvIV(ST(2));
+       Sint32  yoffset = (Sint32)SvIV(ST(3));
+       Sint32  x = (Sint32)SvIV(ST(4));
+       Sint32  y = (Sint32)SvIV(ST(5));
+       Uint32  width = (Uint32)SvUV(ST(6));
+       Uint32  height = (Uint32)SvUV(ST(7));
+#line 1642 "OpenGL.xs"
+               glCopyTexSubImage2D(target,level,xoffset,yoffset,x,y,width,height);
+#line 2609 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL__OpenGL_glTexImage1D); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_glTexImage1D)
+{
+    dXSARGS;
+    if (items != 8)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::glTexImage1D(target, level, internalFormat, width, border, format, type, data)");
+    {
+       GLenum  target = (GLenum)SvIV(ST(0));
+       Sint32  level = (Sint32)SvIV(ST(1));
+       Sint32  internalFormat = (Sint32)SvIV(ST(2));
+       Uint32  width = (Uint32)SvUV(ST(3));
+       Sint32  border = (Sint32)SvIV(ST(4));
+       GLenum  format = (GLenum)SvIV(ST(5));
+       GLenum  type = (GLenum)SvIV(ST(6));
+       char *  data = (char *)SvPV_nolen(ST(7));
+#line 1655 "OpenGL.xs"
+               glTexImage1D(target,level,internalFormat,width,border,format,type,data);        
+#line 2631 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL__OpenGL_glTexSubImage1D); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_glTexSubImage1D)
+{
+    dXSARGS;
+    if (items != 7)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::glTexSubImage1D(target, level, xoffset, width, format, type, data)");
+    {
+       GLenum  target = (GLenum)SvIV(ST(0));
+       Sint32  level = (Sint32)SvIV(ST(1));
+       Sint32  xoffset = (Sint32)SvIV(ST(2));
+       Uint32  width = (Uint32)SvUV(ST(3));
+       GLenum  format = (GLenum)SvIV(ST(4));
+       GLenum  type = (GLenum)SvIV(ST(5));
+       char *  data = (char *)SvPV_nolen(ST(6));
+#line 1667 "OpenGL.xs"
+               glTexSubImage1D(target,level,xoffset,width,format,type,data);
+#line 2652 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL__OpenGL_glCopyTexImage1D); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_glCopyTexImage1D)
+{
+    dXSARGS;
+    if (items != 7)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::glCopyTexImage1D(target, level, internalFormat, x, y, width, border)");
+    {
+       GLenum  target = (GLenum)SvIV(ST(0));
+       Sint32  level = (Sint32)SvIV(ST(1));
+       Sint32  internalFormat = (Sint32)SvIV(ST(2));
+       Sint32  x = (Sint32)SvIV(ST(3));
+       Sint32  y = (Sint32)SvIV(ST(4));
+       Uint32  width = (Uint32)SvUV(ST(5));
+       Sint32  border = (Sint32)SvIV(ST(6));
+#line 1679 "OpenGL.xs"
+               glCopyTexImage1D(target,level,internalFormat,x,y,width,border);
+#line 2673 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL__OpenGL_glCopyTexSubImage1D); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_glCopyTexSubImage1D)
+{
+    dXSARGS;
+    if (items != 6)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::glCopyTexSubImage1D(target, level, xoffset, x, y, width)");
+    {
+       GLenum  target = (GLenum)SvIV(ST(0));
+       Sint32  level = (Sint32)SvIV(ST(1));
+       Sint32  xoffset = (Sint32)SvIV(ST(2));
+       Sint32  x = (Sint32)SvIV(ST(3));
+       Sint32  y = (Sint32)SvIV(ST(4));
+       Uint32  width = (Uint32)SvUV(ST(5));
+#line 1690 "OpenGL.xs"
+               glCopyTexSubImage1D(target,level,xoffset,x,y,width);
+#line 2693 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+#ifdef GL_VERSION_1_3
+#define XSubPPtmpAAAC 1
+
+XS(XS_SDL__OpenGL_glTexImage3D); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_glTexImage3D)
+{
+    dXSARGS;
+    if (items != 10)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::glTexImage3D(target, level, internalFormat, width, height, depth, border, format, type, data)");
+    {
+       GLenum  target = (GLenum)SvIV(ST(0));
+       Sint32  level = (Sint32)SvIV(ST(1));
+       Sint32  internalFormat = (Sint32)SvIV(ST(2));
+       Uint32  width = (Uint32)SvUV(ST(3));
+       Uint32  height = (Uint32)SvUV(ST(4));
+       Uint32  depth = (Uint32)SvUV(ST(5));
+       Sint32  border = (Sint32)SvIV(ST(6));
+       GLenum  format = (GLenum)SvIV(ST(7));
+       GLenum  type = (GLenum)SvIV(ST(8));
+       char *  data = (char *)SvPV_nolen(ST(9));
+#line 1707 "OpenGL.xs"
+               glTexImage3D(target,level,internalFormat,width,height,depth,border,format,type,data);
+#line 2720 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL__OpenGL_glTexSubImage3D); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_glTexSubImage3D)
+{
+    dXSARGS;
+    if (items != 11)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::glTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, data)");
+    {
+       GLenum  target = (GLenum)SvIV(ST(0));
+       Sint32  level = (Sint32)SvIV(ST(1));
+       Sint32  xoffset = (Sint32)SvIV(ST(2));
+       Sint32  yoffset = (Sint32)SvIV(ST(3));
+       Sint32  zoffset = (Sint32)SvIV(ST(4));
+       Uint32  width = (Uint32)SvUV(ST(5));
+       Uint32  height = (Uint32)SvUV(ST(6));
+       Uint32  depth = (Uint32)SvUV(ST(7));
+       GLenum  format = (GLenum)SvIV(ST(8));
+       GLenum  type = (GLenum)SvIV(ST(9));
+       char *  data = (char *)SvPV_nolen(ST(10));
+#line 1723 "OpenGL.xs"
+               glTexSubImage3D(target,level,xoffset,yoffset,zoffset,
+                       width,height,depth,format,type,data);
+#line 2746 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL__OpenGL_glCopyTexSubImage3D); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_glCopyTexSubImage3D)
+{
+    dXSARGS;
+    if (items != 9)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::glCopyTexSubImage3D(target, level, xoffset, yoffset, zoffset, x, y, width, height)");
+    {
+       GLenum  target = (GLenum)SvIV(ST(0));
+       Sint32  level = (Sint32)SvIV(ST(1));
+       Sint32  xoffset = (Sint32)SvIV(ST(2));
+       Sint32  yoffset = (Sint32)SvIV(ST(3));
+       Sint32  zoffset = (Sint32)SvIV(ST(4));
+       Sint32  x = (Sint32)SvIV(ST(5));
+       Sint32  y = (Sint32)SvIV(ST(6));
+       Uint32  width = (Uint32)SvUV(ST(7));
+       Uint32  height = (Uint32)SvUV(ST(8));
+#line 1738 "OpenGL.xs"
+               glCopyTexSubImage3D(target,level,xoffset,yoffset,zoffset,x,y,width,height);
+#line 2769 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+#endif // GL_VERSION_1_3
+XS(XS_SDL__OpenGL_glGenTextures); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_glGenTextures)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::glGenTextures(n)");
+    {
+       Uint32  n = (Uint32)SvUV(ST(0));
+       AV *    RETVAL;
+#line 1746 "OpenGL.xs"
+               GLsizei i;
+               GLuint* names;
+               names = (GLuint*)safemalloc(sizeof(GLuint)*n);
+               RETVAL = newAV();
+               glGenTextures(n,names);
+               for ( i = 0; i < n; i++ ) {
+                       av_push(RETVAL,newSViv(names[i]));
+               }
+               safefree(names);
+#line 2794 "OpenGL.c"
+       ST(0) = newRV((SV*)RETVAL);
+       sv_2mortal(ST(0));
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL__OpenGL_glIsTexture); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_glIsTexture)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::glIsTexture(texture)");
+    {
+       Uint32  texture = (Uint32)SvUV(ST(0));
+       GLboolean       RETVAL;
+       dXSTARG;
+#line 1762 "OpenGL.xs"
+               RETVAL = glIsTexture(texture);
+#line 2813 "OpenGL.c"
+       XSprePUSH; PUSHu((UV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL__OpenGL_glBindTexture); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_glBindTexture)
+{
+    dXSARGS;
+    if (items != 2)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::glBindTexture(target, texture)");
+    {
+       GLenum  target = (GLenum)SvIV(ST(0));
+       Uint32  texture = (Uint32)SvUV(ST(1));
+#line 1771 "OpenGL.xs"
+               glBindTexture(target,texture);
+#line 2830 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL__OpenGL_glDeleteTextures); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_glDeleteTextures)
+{
+    dXSARGS;
+    {
+#line 1776 "OpenGL.xs"
+               GLuint* textures;
+               int i;
+               textures = (GLuint*)safemalloc(sizeof(GLuint) * items);
+               if ( textures ) {
+                       for ( i = 0; i < items; i++ ) {
+                               textures[i] = SvIV(ST(i));      
+                       }
+               }
+               glDeleteTextures(items,textures);
+               safefree(textures);
+#line 2851 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL__OpenGL_glAreTexturesResident); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_glAreTexturesResident)
+{
+    dXSARGS;
+    {
+       AV *    RETVAL;
+#line 1790 "OpenGL.xs"
+               GLuint* textures;
+               GLboolean *homes;
+               int i;
+               RETVAL = newAV();
+               textures = (GLuint*)safemalloc(sizeof(GLuint) * items);
+               homes = (GLboolean*)safemalloc(sizeof(GLboolean) * items);
+               if ( textures ) {
+                       for ( i = 0; i < items; i++ ) {
+                               textures[i] = SvIV(ST(i));      
+                       }
+               }
+               if ( GL_FALSE != glAreTexturesResident(items,textures,homes)) {
+                       for (i = 0; i < items; i++ ) {
+                               av_push(RETVAL,newSViv(homes[i]));      
+                       }
+               }
+               safefree(homes);
+               safefree(textures);
+#line 2881 "OpenGL.c"
+       ST(0) = newRV((SV*)RETVAL);
+       sv_2mortal(ST(0));
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL__OpenGL_glPrioritizeTextures); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_glPrioritizeTextures)
+{
+    dXSARGS;
+    if (items != 3)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::glPrioritizeTextures(n, names, priorities)");
+    {
+       Uint32  n = (Uint32)SvUV(ST(0));
+       char *  names = (char *)SvPV_nolen(ST(1));
+       char *  priorities = (char *)SvPV_nolen(ST(2));
+#line 1817 "OpenGL.xs"
+               glPrioritizeTextures(n,(GLuint*)names,(const GLclampf *)priorities);
+#line 2900 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL__OpenGL_glTexEnv); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_glTexEnv)
+{
+    dXSARGS;
+    if (items < 2)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::glTexEnv(target, name, ...)");
+    {
+       GLenum  target = (GLenum)SvIV(ST(0));
+       GLenum  name = (GLenum)SvIV(ST(1));
+#line 1824 "OpenGL.xs"
+               float pv[4];
+               GLint p;        
+               switch(name) {
+                       case GL_TEXTURE_ENV_MODE:
+                               p = SvIV(ST(2));
+                               glTexEnvi(target,name,p);       
+                               break;
+                       case GL_TEXTURE_ENV_COLOR:
+                               pv[0] = SvNV(ST(2));
+                               pv[1] = SvNV(ST(3));
+                               pv[2] = SvNV(ST(4));
+                               pv[3] = SvNV(ST(5));
+                               glTexEnvfv(target,name,pv);
+                               break;
+               }
+#line 2930 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL__OpenGL_glTexCoord); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_glTexCoord)
+{
+    dXSARGS;
+    {
+#line 1843 "OpenGL.xs"
+               double s,t,r,q;
+               if ( items < 1 || items > 4 ) 
+                       Perl_croak (aTHX_ "usage: SDL::OpenGL::TexCoord(s,[t,[r,[q]]])");
+               s = t = r = 0.0;
+               q = 1.0;
+               switch(items) {
+                       case 4:
+                               q = SvNV(ST(3)); 
+                       case 3:
+                               r = SvNV(ST(2)); 
+                       case 2:
+                               t = SvNV(ST(1)); 
+                       case 1:
+                               s = SvNV(ST(0));        
+               }
+               glTexCoord4d(s,t,r,q);
+#line 2957 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL__OpenGL_glTexParameter); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_glTexParameter)
+{
+    dXSARGS;
+    if (items < 2)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::glTexParameter(target, name, ...)");
+    {
+       GLenum  target = (GLenum)SvIV(ST(0));
+       GLenum  name = (GLenum)SvIV(ST(1));
+#line 1865 "OpenGL.xs"
+               GLfloat pv[4];
+               GLint p;
+               switch (name) {
+                       case GL_TEXTURE_BORDER_COLOR:
+                               pv[0] = SvNV(ST(2));
+                               pv[1] = SvNV(ST(3));
+                               pv[2] = SvNV(ST(4));
+                               pv[3] = SvNV(ST(5));
+                               glTexParameterfv(target,name,pv);
+                               break;
+                       case GL_TEXTURE_PRIORITY:
+                       case GL_TEXTURE_MIN_LOD:
+                       case GL_TEXTURE_MAX_LOD:
+                               pv[0] = SvNV(ST(2));
+                               glTexParameterf(target,name,pv[0]);     
+                               break;
+                       case GL_TEXTURE_BASE_LEVEL:
+                       case GL_TEXTURE_MAX_LEVEL:
+                       default:
+                               p = SvIV(ST(2));        
+                               glTexParameteri(target,name,p);
+                               break;
+               }
+#line 2995 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL__OpenGL_glTexGen); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_glTexGen)
+{
+    dXSARGS;
+    if (items < 2)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::glTexGen(coord, name, ...)");
+    {
+       GLenum  coord = (GLenum)SvIV(ST(0));
+       GLenum  name = (GLenum)SvIV(ST(1));
+#line 1894 "OpenGL.xs"
+               GLdouble *pv;
+               GLint p;
+               int i;
+               switch (name) {
+                       case GL_TEXTURE_GEN_MODE:
+                               p = SvIV(ST(2));
+                               glTexGeni(coord,name,p);
+                               break;
+                       default:
+                               if ( items == 2 ) 
+                                       Perl_croak(aTHX_  "usage: glTexGen(coord,name,...)");
+                               pv = (GLdouble*)safemalloc(sizeof(GLdouble)*(items-2));
+                               for ( i = 0; i < items - 2; i++ ) {
+                                       pv[i] = SvNV(ST(i+2));  
+                               }
+                               glTexGendv(coord,name,pv);      
+                               safefree(pv);
+                               break;
+               }
+#line 3029 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+#ifdef GL_VERSION_1_3
+#define XSubPPtmpAAAD 1
+
+XS(XS_SDL__OpenGL_glActiveTextureARB); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_glActiveTextureARB)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::glActiveTextureARB(texUnit)");
+    {
+       GLenum  texUnit = (GLenum)SvIV(ST(0));
+#line 1920 "OpenGL.xs"
+               glActiveTextureARB(texUnit);
+#line 3047 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL__OpenGL_glMultiTexCoord); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_glMultiTexCoord)
+{
+    dXSARGS;
+    if (items < 1)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::glMultiTexCoord(texUnit, ...)");
+    {
+       Uint32  texUnit = (Uint32)SvUV(ST(0));
+#line 1926 "OpenGL.xs"
+               double s,t,r,q;
+               if ( items < 2 || items > 5 ) 
+                       Perl_croak (aTHX_ "usage: SDL::OpenGL::MultiTexCoord(tex,s,[t,[r,[q]]])");
+               s = t = r = 0.0;
+               q = 1.0;
+               switch(items) {
+                       case 5:
+                               q = SvNV(ST(3)); 
+                       case 4:
+                               r = SvNV(ST(2)); 
+                       case 3:
+                               t = SvNV(ST(1)); 
+                       case 2:
+                               s = SvNV(ST(0));        
+               }
+               glMultiTexCoord4dARB(texUnit,s,t,r,q);
+#line 3077 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+#endif // GL_VERSION_1_3
+XS(XS_SDL__OpenGL_glDrawBuffer); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_glDrawBuffer)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::glDrawBuffer(mode)");
+    {
+       GLenum  mode = (GLenum)SvIV(ST(0));
+#line 1949 "OpenGL.xs"
+               glDrawBuffer(mode);
+#line 3093 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL__OpenGL_glReadBuffer); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_glReadBuffer)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::glReadBuffer(mode)");
+    {
+       GLenum  mode = (GLenum)SvIV(ST(0));
+#line 1955 "OpenGL.xs"
+               glReadBuffer(mode);
+#line 3108 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL__OpenGL_glIndexMask); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_glIndexMask)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::glIndexMask(mask)");
+    {
+       Uint32  mask = (Uint32)SvUV(ST(0));
+#line 1961 "OpenGL.xs"
+               glIndexMask(mask);
+#line 3123 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL__OpenGL_glColorMask); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_glColorMask)
+{
+    dXSARGS;
+    if (items != 4)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::glColorMask(red, green, blue, alpha)");
+    {
+       GLboolean       red = (unsigned char)SvUV(ST(0));
+       GLboolean       green = (unsigned char)SvUV(ST(1));
+       GLboolean       blue = (unsigned char)SvUV(ST(2));
+       GLboolean       alpha = (unsigned char)SvUV(ST(3));
+#line 1970 "OpenGL.xs"
+               glColorMask(red,green,blue,alpha);
+#line 3141 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL__OpenGL_glDepthMask); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_glDepthMask)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::glDepthMask(flag)");
+    {
+       GLboolean       flag = (unsigned char)SvUV(ST(0));
+#line 1976 "OpenGL.xs"
+               glDepthMask(flag);
+#line 3156 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL__OpenGL_glStencilMask); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_glStencilMask)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::glStencilMask(mask)");
+    {
+       Uint32  mask = (Uint32)SvUV(ST(0));
+#line 1982 "OpenGL.xs"
+               glStencilMask(mask);
+#line 3171 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL__OpenGL_glScissor); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_glScissor)
+{
+    dXSARGS;
+    if (items != 4)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::glScissor(x, y, width, height)");
+    {
+       Sint32  x = (Sint32)SvIV(ST(0));
+       Sint32  y = (Sint32)SvIV(ST(1));
+       Uint32  width = (Uint32)SvUV(ST(2));
+       Uint32  height = (Uint32)SvUV(ST(3));
+#line 1991 "OpenGL.xs"
+               glScissor(x,y,width,height);
+#line 3189 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL__OpenGL_glAlphaFunc); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_glAlphaFunc)
+{
+    dXSARGS;
+    if (items != 2)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::glAlphaFunc(func, ref)");
+    {
+       GLenum  func = (GLenum)SvIV(ST(0));
+       double  ref = (double)SvNV(ST(1));
+#line 1998 "OpenGL.xs"
+               glAlphaFunc(func,ref);
+#line 3205 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL__OpenGL_glStencilFunc); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_glStencilFunc)
+{
+    dXSARGS;
+    if (items != 3)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::glStencilFunc(func, ref, mask)");
+    {
+       GLenum  func = (GLenum)SvIV(ST(0));
+       Sint32  ref = (Sint32)SvIV(ST(1));
+       Uint32  mask = (Uint32)SvUV(ST(2));
+#line 2006 "OpenGL.xs"
+               glStencilFunc(func,ref,mask);
+#line 3222 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL__OpenGL_glStencilOp); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_glStencilOp)
+{
+    dXSARGS;
+    if (items != 3)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::glStencilOp(fail, zfail, zpass)");
+    {
+       GLenum  fail = (GLenum)SvIV(ST(0));
+       GLenum  zfail = (GLenum)SvIV(ST(1));
+       GLenum  zpass = (GLenum)SvIV(ST(2));
+#line 2014 "OpenGL.xs"
+               glStencilOp(fail,zfail,zpass);
+#line 3239 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL__OpenGL_glDepthFunc); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_glDepthFunc)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::glDepthFunc(func)");
+    {
+       GLenum  func = (GLenum)SvIV(ST(0));
+#line 2020 "OpenGL.xs"
+               glDepthFunc(func);
+#line 3254 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL__OpenGL_glLogicOp); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_glLogicOp)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::glLogicOp(opcode)");
+    {
+       GLenum  opcode = (GLenum)SvIV(ST(0));
+#line 2026 "OpenGL.xs"
+               glLogicOp(opcode);
+#line 3269 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL__OpenGL_glAccum); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_glAccum)
+{
+    dXSARGS;
+    if (items != 2)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::glAccum(op, value)");
+    {
+       GLenum  op = (GLenum)SvIV(ST(0));
+       double  value = (double)SvNV(ST(1));
+#line 2033 "OpenGL.xs"
+               glAccum(op,value);
+#line 3285 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL__OpenGL_glMap1); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_glMap1)
+{
+    dXSARGS;
+    if (items != 6)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::glMap1(target, u1, u2, stride, order, points)");
+    {
+       GLenum  target = (GLenum)SvIV(ST(0));
+       double  u1 = (double)SvNV(ST(1));
+       double  u2 = (double)SvNV(ST(2));
+       Sint32  stride = (Sint32)SvIV(ST(3));
+       Sint32  order = (Sint32)SvIV(ST(4));
+       char *  points = (char *)SvPV_nolen(ST(5));
+#line 2044 "OpenGL.xs"
+               glMap1d(target,u1,u2,stride,order,(double*)points);
+#line 3305 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL__OpenGL_glEvalCoord1); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_glEvalCoord1)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::glEvalCoord1(u)");
+    {
+       double  u = (double)SvNV(ST(0));
+#line 2050 "OpenGL.xs"
+               glEvalCoord1d(u);       
+#line 3320 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL__OpenGL_glMapGrid1); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_glMapGrid1)
+{
+    dXSARGS;
+    if (items != 3)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::glMapGrid1(n, u1, u2)");
+    {
+       Sint32  n = (Sint32)SvIV(ST(0));
+       double  u1 = (double)SvNV(ST(1));
+       double  u2 = (double)SvNV(ST(2));
+#line 2058 "OpenGL.xs"
+               glMapGrid1d(n,u1,u2);
+#line 3337 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL__OpenGL_glEvalMesh1); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_glEvalMesh1)
+{
+    dXSARGS;
+    if (items != 3)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::glEvalMesh1(mode, p1, p2)");
+    {
+       GLenum  mode = (GLenum)SvIV(ST(0));
+       Sint32  p1 = (Sint32)SvIV(ST(1));
+       Sint32  p2 = (Sint32)SvIV(ST(2));
+#line 2066 "OpenGL.xs"
+               glEvalMesh1(mode,p1,p2);
+#line 3354 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL__OpenGL_glMap2); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_glMap2)
+{
+    dXSARGS;
+    if (items != 10)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::glMap2(target, u1, u2, ustride, uorder, v1, v2, vstride, vorder, points)");
+    {
+       GLenum  target = (GLenum)SvIV(ST(0));
+       double  u1 = (double)SvNV(ST(1));
+       double  u2 = (double)SvNV(ST(2));
+       Sint32  ustride = (Sint32)SvIV(ST(3));
+       Sint32  uorder = (Sint32)SvIV(ST(4));
+       double  v1 = (double)SvNV(ST(5));
+       double  v2 = (double)SvNV(ST(6));
+       Sint32  vstride = (Sint32)SvIV(ST(7));
+       Sint32  vorder = (Sint32)SvIV(ST(8));
+       char *  points = (char *)SvPV_nolen(ST(9));
+#line 2081 "OpenGL.xs"
+               glMap2d(target,u1,u2,ustride,uorder,v1,v2,vstride,vorder,(double*)points);
+#line 3378 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL__OpenGL_glEvalCoord2); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_glEvalCoord2)
+{
+    dXSARGS;
+    if (items != 2)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::glEvalCoord2(u, v)");
+    {
+       double  u = (double)SvNV(ST(0));
+       double  v = (double)SvNV(ST(1));
+#line 2088 "OpenGL.xs"
+               glEvalCoord2d(u,v);
+#line 3394 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL__OpenGL_glMapGrid2); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_glMapGrid2)
+{
+    dXSARGS;
+    if (items != 6)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::glMapGrid2(nu, u1, u2, nv, v1, v2)");
+    {
+       Sint32  nu = (Sint32)SvIV(ST(0));
+       double  u1 = (double)SvNV(ST(1));
+       double  u2 = (double)SvNV(ST(2));
+       Sint32  nv = (Sint32)SvIV(ST(3));
+       double  v1 = (double)SvNV(ST(4));
+       double  v2 = (double)SvNV(ST(5));
+#line 2099 "OpenGL.xs"
+               glMapGrid2d(nu,u1,u2,nv,v1,v2);
+#line 3414 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL__OpenGL_glEvalMesh2); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_glEvalMesh2)
+{
+    dXSARGS;
+    if (items != 5)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::glEvalMesh2(mode, i1, i2, j1, j2)");
+    {
+       GLenum  mode = (GLenum)SvIV(ST(0));
+       Sint32  i1 = (Sint32)SvIV(ST(1));
+       Sint32  i2 = (Sint32)SvIV(ST(2));
+       Sint32  j1 = (Sint32)SvIV(ST(3));
+       Sint32  j2 = (Sint32)SvIV(ST(4));
+#line 2109 "OpenGL.xs"
+               glEvalMesh2(mode,i1,i2,j1,j2);
+#line 3433 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL__OpenGL_glGetError); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_glGetError)
+{
+    dXSARGS;
+    if (items != 0)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::glGetError()");
+    {
+       GLenum  RETVAL;
+       dXSTARG;
+#line 2114 "OpenGL.xs"
+               RETVAL = glGetError();
+#line 3449 "OpenGL.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL__OpenGL_glRenderMode); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_glRenderMode)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::glRenderMode(mode)");
+    {
+       GLenum  mode = (GLenum)SvIV(ST(0));
+       GLint   RETVAL;
+       dXSTARG;
+#line 2122 "OpenGL.xs"
+               RETVAL = glRenderMode( mode );
+#line 3467 "OpenGL.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL__OpenGL_glInitNames); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_glInitNames)
+{
+    dXSARGS;
+    if (items != 0)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::glInitNames()");
+    {
+#line 2129 "OpenGL.xs"
+               glInitNames();
+#line 3482 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL__OpenGL_glPushName); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_glPushName)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::glPushName(name)");
+    {
+       GLuint  name = (GLuint)SvUV(ST(0));
+#line 2135 "OpenGL.xs"
+               glPushName(name);
+#line 3497 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL__OpenGL_glPopName); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_glPopName)
+{
+    dXSARGS;
+    if (items != 0)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::glPopName()");
+    {
+#line 2140 "OpenGL.xs"
+               glPopName();            
+#line 3511 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL__OpenGL_glLoadName); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_glLoadName)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::glLoadName(name)");
+    {
+       GLuint  name = (GLuint)SvUV(ST(0));
+#line 2146 "OpenGL.xs"
+               glLoadName(name);
+#line 3526 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL__OpenGL_glFeedbackBuffer); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_glFeedbackBuffer)
+{
+    dXSARGS;
+    if (items != 3)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::glFeedbackBuffer(size, type, buffer)");
+    {
+       GLuint  size = (GLuint)SvUV(ST(0));
+       GLenum  type = (GLenum)SvIV(ST(1));
+       float*  buffer = INT2PTR(float *,SvIV(ST(2)));
+#line 2154 "OpenGL.xs"
+               glFeedbackBuffer(size,type,buffer);             
+#line 3543 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL__OpenGL_glPassThrough); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_glPassThrough)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::glPassThrough(token)");
+    {
+       GLfloat token = (GLfloat)SvNV(ST(0));
+#line 2160 "OpenGL.xs"
+               glPassThrough(token);
+#line 3558 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+#endif
+#ifdef HAVE_GLU
+#define XSubPPtmpAAAE 1
+
+XS(XS_SDL__OpenGL_gluLookAt); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_gluLookAt)
+{
+    dXSARGS;
+    if (items != 9)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::gluLookAt(eyex, eyey, eyez, centerx, centery, centerz, upx, upy, upz)");
+    {
+       double  eyex = (double)SvNV(ST(0));
+       double  eyey = (double)SvNV(ST(1));
+       double  eyez = (double)SvNV(ST(2));
+       double  centerx = (double)SvNV(ST(3));
+       double  centery = (double)SvNV(ST(4));
+       double  centerz = (double)SvNV(ST(5));
+       double  upx = (double)SvNV(ST(6));
+       double  upy = (double)SvNV(ST(7));
+       double  upz = (double)SvNV(ST(8));
+#line 2179 "OpenGL.xs"
+               gluLookAt(eyex,eyey,eyez,centerx,centery,centerz,upx,upy,upz);
+#line 3585 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL__OpenGL_gluPerspective); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_gluPerspective)
+{
+    dXSARGS;
+    if (items != 4)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::gluPerspective(fovy, aspect, n, f)");
+    {
+       double  fovy = (double)SvNV(ST(0));
+       double  aspect = (double)SvNV(ST(1));
+       double  n = (double)SvNV(ST(2));
+       double  f = (double)SvNV(ST(3));
+#line 2188 "OpenGL.xs"
+               gluPerspective(fovy,aspect,n,f);
+#line 3603 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL__OpenGL_gluPickMatrix); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_gluPickMatrix)
+{
+    dXSARGS;
+    if (items != 5)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::gluPickMatrix(x, y, delx, dely, viewport)");
+    {
+       double  x = (double)SvNV(ST(0));
+       double  y = (double)SvNV(ST(1));
+       double  delx = (double)SvNV(ST(2));
+       double  dely = (double)SvNV(ST(3));
+       GLint*  viewport = INT2PTR(GLint *,SvIV(ST(4)));
+#line 2198 "OpenGL.xs"
+               gluPickMatrix(x,y,delx,dely,viewport);
+#line 3622 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL__OpenGL_gluOrtho2D); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_gluOrtho2D)
+{
+    dXSARGS;
+    if (items != 4)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::gluOrtho2D(left, right, bottom, top)");
+    {
+       double  left = (double)SvNV(ST(0));
+       double  right = (double)SvNV(ST(1));
+       double  bottom = (double)SvNV(ST(2));
+       double  top = (double)SvNV(ST(3));
+#line 2207 "OpenGL.xs"
+               gluOrtho2D(left,right,bottom,top);
+#line 3640 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL__OpenGL_gluScaleImage); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_gluScaleImage)
+{
+    dXSARGS;
+    if (items != 9)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::gluScaleImage(format, widthin, heightin, typein, datain, widthout, heightout, typeout, dataout)");
+    {
+       GLenum  format = (GLenum)SvIV(ST(0));
+       Uint32  widthin = (Uint32)SvUV(ST(1));
+       Uint32  heightin = (Uint32)SvUV(ST(2));
+       GLenum  typein = (GLenum)SvIV(ST(3));
+       char *  datain = (char *)SvPV_nolen(ST(4));
+       Uint32  widthout = (Uint32)SvUV(ST(5));
+       Uint32  heightout = (Uint32)SvUV(ST(6));
+       GLenum  typeout = (GLenum)SvIV(ST(7));
+       char *  dataout = (char *)SvPV_nolen(ST(8));
+       int     RETVAL;
+       dXSTARG;
+#line 2221 "OpenGL.xs"
+               RETVAL = gluScaleImage(format,widthin,heightin,typein,datain,
+                               widthout,heightout,typeout,dataout);
+#line 3666 "OpenGL.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL__OpenGL_gluBuild1DMipmaps); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_gluBuild1DMipmaps)
+{
+    dXSARGS;
+    if (items != 6)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::gluBuild1DMipmaps(target, internalFormat, width, format, type, data)");
+    {
+       GLenum  target = (GLenum)SvIV(ST(0));
+       Sint32  internalFormat = (Sint32)SvIV(ST(1));
+       Uint32  width = (Uint32)SvUV(ST(2));
+       GLenum  format = (GLenum)SvIV(ST(3));
+       GLenum  type = (GLenum)SvIV(ST(4));
+       char *  data = (char *)SvPV_nolen(ST(5));
+       int     RETVAL;
+       dXSTARG;
+#line 2235 "OpenGL.xs"
+               RETVAL = gluBuild1DMipmaps(target,internalFormat,width,format,type,data);
+#line 3689 "OpenGL.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL__OpenGL_gluBuild2DMipmaps); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_gluBuild2DMipmaps)
+{
+    dXSARGS;
+    if (items != 7)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::gluBuild2DMipmaps(target, internalFormat, width, height, format, type, data)");
+    {
+       GLenum  target = (GLenum)SvIV(ST(0));
+       Sint32  internalFormat = (Sint32)SvIV(ST(1));
+       Uint32  width = (Uint32)SvUV(ST(2));
+       Uint32  height = (Uint32)SvUV(ST(3));
+       GLenum  format = (GLenum)SvIV(ST(4));
+       GLenum  type = (GLenum)SvIV(ST(5));
+       char *  data = (char *)SvPV_nolen(ST(6));
+       int     RETVAL;
+       dXSTARG;
+#line 2249 "OpenGL.xs"
+               RETVAL = gluBuild2DMipmaps(target,internalFormat,width,height,format,type,data);
+#line 3713 "OpenGL.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+#if HAVE_GLU_VERSION >= 12
+#define XSubPPtmpAAAF 1
+
+XS(XS_SDL__OpenGL_gluBuild3DMipmaps); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_gluBuild3DMipmaps)
+{
+    dXSARGS;
+    if (items != 8)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::gluBuild3DMipmaps(target, internalFormat, width, height, depth, format, type, data)");
+    {
+       GLenum  target = (GLenum)SvIV(ST(0));
+       Sint32  internalFormat = (Sint32)SvIV(ST(1));
+       Uint32  width = (Uint32)SvUV(ST(2));
+       Uint32  height = (Uint32)SvUV(ST(3));
+       Uint32  depth = (Uint32)SvUV(ST(4));
+       GLenum  format = (GLenum)SvIV(ST(5));
+       GLenum  type = (GLenum)SvIV(ST(6));
+       char *  data = (char *)SvPV_nolen(ST(7));
+       int     RETVAL;
+       dXSTARG;
+#line 2266 "OpenGL.xs"
+               RETVAL = gluBuild3DMipmaps(target,internalFormat,width,height,depth,
+                               format,type,data);
+#line 3742 "OpenGL.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+#else
+#define XSubPPtmpAAAG 1
+
+XS(XS_SDL__OpenGL_gluBuild3DMipmaps); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_gluBuild3DMipmaps)
+{
+    dXSARGS;
+    if (items != 0)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::gluBuild3DMipmaps()");
+    {
+#line 2275 "OpenGL.xs"
+               Perl_croak (aTHX_ "SDL::OpenGL::Build3DMipmaps requires GLU 1.2");
+#line 3760 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+#endif
+#if HAVE_GLU_VERSION >= 12
+#define XSubPPtmpAAAH 1
+
+XS(XS_SDL__OpenGL_gluBuild1DMipmapLevels); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_gluBuild1DMipmapLevels)
+{
+    dXSARGS;
+    if (items != 9)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::gluBuild1DMipmapLevels(target, internalFormat, width, format, type, level, base, max, data)");
+    {
+       GLenum  target = (GLenum)SvIV(ST(0));
+       Sint32  internalFormat = (Sint32)SvIV(ST(1));
+       Uint32  width = (Uint32)SvUV(ST(2));
+       GLenum  format = (GLenum)SvIV(ST(3));
+       GLenum  type = (GLenum)SvIV(ST(4));
+       Sint32  level = (Sint32)SvIV(ST(5));
+       Sint32  base = (Sint32)SvIV(ST(6));
+       Sint32  max = (Sint32)SvIV(ST(7));
+       char *  data = (char *)SvPV_nolen(ST(8));
+       int     RETVAL;
+       dXSTARG;
+#line 2292 "OpenGL.xs"
+               RETVAL = gluBuild1DMipmapLevels(target,internalFormat,width,
+                               format,type,level,base,max,data);
+#line 3790 "OpenGL.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+#else
+#define XSubPPtmpAAAI 1
+
+XS(XS_SDL__OpenGL_gluBuild1DMipmapLevels); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_gluBuild1DMipmapLevels)
+{
+    dXSARGS;
+    if (items != 0)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::gluBuild1DMipmapLevels()");
+    {
+#line 2301 "OpenGL.xs"
+               Perl_croak(aTHX_ "SDL::OpenGL::Build1DMipmapLevels requires GLU 1.2");          
+#line 3808 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+#endif
+#if HAVE_GLU_VERSION >= 12
+#define XSubPPtmpAAAJ 1
+
+XS(XS_SDL__OpenGL_gluBuild2DMipmapLevels); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_gluBuild2DMipmapLevels)
+{
+    dXSARGS;
+    if (items != 10)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::gluBuild2DMipmapLevels(target, internalFormat, width, height, format, type, level, base, max, data)");
+    {
+       GLenum  target = (GLenum)SvIV(ST(0));
+       Sint32  internalFormat = (Sint32)SvIV(ST(1));
+       Uint32  width = (Uint32)SvUV(ST(2));
+       Uint32  height = (Uint32)SvUV(ST(3));
+       GLenum  format = (GLenum)SvIV(ST(4));
+       GLenum  type = (GLenum)SvIV(ST(5));
+       Sint32  level = (Sint32)SvIV(ST(6));
+       Sint32  base = (Sint32)SvIV(ST(7));
+       Sint32  max = (Sint32)SvIV(ST(8));
+       char *  data = (char *)SvPV_nolen(ST(9));
+       int     RETVAL;
+       dXSTARG;
+#line 2319 "OpenGL.xs"
+               RETVAL = gluBuild2DMipmapLevels(target,internalFormat,width,height,
+                               format,type,level,base,max,data);
+#line 3839 "OpenGL.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+#else
+#define XSubPPtmpAAAK 1
+
+XS(XS_SDL__OpenGL_gluBuild2DMipmapLevels); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_gluBuild2DMipmapLevels)
+{
+    dXSARGS;
+    if (items != 0)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::gluBuild2DMipmapLevels()");
+    {
+#line 2328 "OpenGL.xs"
+               Perl_croak(aTHX_ "SDL::OpenGL::Build2DMipmapLevels requires GLU 1.2");          
+#line 3857 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+#endif
+#if HAVE_GLU_VERSION >= 12
+#define XSubPPtmpAAAL 1
+
+XS(XS_SDL__OpenGL_gluBuild3DMipmapLevels); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_gluBuild3DMipmapLevels)
+{
+    dXSARGS;
+    if (items != 11)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::gluBuild3DMipmapLevels(target, internalFormat, width, height, depth, format, type, level, base, max, data)");
+    {
+       GLenum  target = (GLenum)SvIV(ST(0));
+       Sint32  internalFormat = (Sint32)SvIV(ST(1));
+       Uint32  width = (Uint32)SvUV(ST(2));
+       Uint32  height = (Uint32)SvUV(ST(3));
+       Uint32  depth = (Uint32)SvUV(ST(4));
+       GLenum  format = (GLenum)SvIV(ST(5));
+       GLenum  type = (GLenum)SvIV(ST(6));
+       Sint32  level = (Sint32)SvIV(ST(7));
+       Sint32  base = (Sint32)SvIV(ST(8));
+       Sint32  max = (Sint32)SvIV(ST(9));
+       char *  data = (char *)SvPV_nolen(ST(10));
+       int     RETVAL;
+       dXSTARG;
+#line 2347 "OpenGL.xs"
+               RETVAL = gluBuild3DMipmapLevels(target,internalFormat,width,height,depth,
+                               format,type,level,base,max,data);
+#line 3889 "OpenGL.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+#else
+#define XSubPPtmpAAAM 1
+
+XS(XS_SDL__OpenGL_gluBuild3DMipmapLevels); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_gluBuild3DMipmapLevels)
+{
+    dXSARGS;
+    if (items != 0)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::gluBuild3DMipmapLevels()");
+    {
+#line 2356 "OpenGL.xs"
+               Perl_croak(aTHX_ "SDL::OpenGL::Build3DMipmapLevels requires GLU 1.2");          
+#line 3907 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+#endif
+XS(XS_SDL__OpenGL_gluErrorString); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_gluErrorString)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::gluErrorString(code)");
+    {
+       GLenum  code = (GLenum)SvIV(ST(0));
+       char *  RETVAL;
+       dXSTARG;
+#line 2364 "OpenGL.xs"
+               RETVAL = (char*)gluErrorString(code);
+#line 3925 "OpenGL.c"
+       sv_setpv(TARG, RETVAL); XSprePUSH; PUSHTARG;
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL__OpenGL_gluNewNurbsRenderer); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_gluNewNurbsRenderer)
+{
+    dXSARGS;
+    if (items != 0)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::gluNewNurbsRenderer()");
+    {
+       GLUnurbsObj *   RETVAL;
+       dXSTARG;
+#line 2371 "OpenGL.xs"
+               RETVAL = gluNewNurbsRenderer();
+#line 3942 "OpenGL.c"
+       XSprePUSH; PUSHi(PTR2IV(RETVAL));
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL__OpenGL_gluDeleteNurbsRenderer); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_gluDeleteNurbsRenderer)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::gluDeleteNurbsRenderer(obj)");
+    {
+       GLUnurbsObj *   obj = INT2PTR(GLUnurbsObj *,SvIV(ST(0)));
+#line 2379 "OpenGL.xs"
+               gluDeleteNurbsRenderer(obj);
+#line 3958 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL__OpenGL_gluNurbsProperty); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_gluNurbsProperty)
+{
+    dXSARGS;
+    if (items != 3)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::gluNurbsProperty(obj, property, value)");
+    {
+       GLUnurbsObj *   obj = INT2PTR(GLUnurbsObj *,SvIV(ST(0)));
+       GLenum  property = (GLenum)SvIV(ST(1));
+       double  value = (double)SvNV(ST(2));
+#line 2387 "OpenGL.xs"
+               gluNurbsProperty(obj,property,(float)value);
+#line 3975 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL__OpenGL_gluLoadSamplingMatrices); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_gluLoadSamplingMatrices)
+{
+    dXSARGS;
+    if (items != 4)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::gluLoadSamplingMatrices(obj, mm, pm, vp)");
+    {
+       GLUnurbsObj *   obj = INT2PTR(GLUnurbsObj *,SvIV(ST(0)));
+       char *  mm = (char *)SvPV_nolen(ST(1));
+       char *  pm = (char *)SvPV_nolen(ST(2));
+       char *  vp = (char *)SvPV_nolen(ST(3));
+#line 2396 "OpenGL.xs"
+               gluLoadSamplingMatrices(obj,(GLfloat*)mm,(GLfloat*)pm,(GLint*)vp);
+#line 3993 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL__OpenGL_gluGetNurbsProperty); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_gluGetNurbsProperty)
+{
+    dXSARGS;
+    if (items != 2)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::gluGetNurbsProperty(obj, property)");
+    {
+       GLUnurbsObj *   obj = INT2PTR(GLUnurbsObj *,SvIV(ST(0)));
+       GLenum  property = (GLenum)SvIV(ST(1));
+       double  RETVAL;
+       dXSTARG;
+#line 2403 "OpenGL.xs"
+               float f;
+               gluGetNurbsProperty(obj,property,&f);
+               RETVAL = (double)f;
+#line 4013 "OpenGL.c"
+       XSprePUSH; PUSHn((double)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL__OpenGL_gluNurbsCallback); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_gluNurbsCallback)
+{
+    dXSARGS;
+    if (items != 3)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::gluNurbsCallback(obj, which, cb)");
+    {
+       GLUnurbsObj *   obj = INT2PTR(GLUnurbsObj *,SvIV(ST(0)));
+       GLenum  which = (GLenum)SvIV(ST(1));
+       SV *    cb = ST(2);
+#line 2415 "OpenGL.xs"
+               switch(which) {
+                       case GLU_ERROR:
+                               sdl_perl_nurbs_error_hook = cb;
+                               gluNurbsCallback(obj,GLU_ERROR,(GLvoid*)sdl_perl_nurbs_error_callback);
+                               break;
+#ifdef GLU_NURBS_BEGIN
+                       case GLU_NURBS_BEGIN:
+                       case GLU_NURBS_BEGIN_DATA:
+                               gluNurbsCallbackData(obj,(void*)cb);
+                               gluNurbsCallback(obj,GLU_NURBS_BEGIN_DATA,
+                                       (GLvoid*)sdl_perl_nurbs_being_callback);        
+                               break;
+                       case GLU_NURBS_TEXTURE_COORD:
+                       case GLU_NURBS_TEXTURE_COORD_DATA:
+                               gluNurbsCallbackData(obj,(void*)cb);
+                               gluNurbsCallback(obj,GLU_NURBS_TEXTURE_COORD_DATA,
+                                       (GLvoid*)sdl_perl_nurbs_multi_callback);        
+                               break;
+                       case GLU_NURBS_COLOR:
+                       case GLU_NURBS_COLOR_DATA:
+                               gluNurbsCallbackData(obj,(void*)cb);
+                               gluNurbsCallback(obj,GLU_NURBS_COLOR_DATA,
+                                       (GLvoid*)sdl_perl_nurbs_multi_callback);        
+                               break;
+                       case GLU_NURBS_NORMAL:
+                       case GLU_NURBS_NORMAL_DATA:
+                               gluNurbsCallbackData(obj,(void*)cb);
+                               gluNurbsCallback(obj,GLU_NURBS_NORMAL_DATA,
+                                       (GLvoid*)sdl_perl_nurbs_multi_callback);        
+                               break;
+                       case GLU_NURBS_VERTEX:
+                       case GLU_NURBS_VERTEX_DATA:
+                               gluNurbsCallbackData(obj,(void*)cb);
+                               gluNurbsCallback(obj,GLU_NURBS_VERTEX_DATA,
+                                       (GLvoid*)sdl_perl_nurbs_multi_callback);        
+                               break;
+                       case GLU_NURBS_END:
+                       case GLU_NURBS_END_DATA:
+                               gluNurbsCallbackData(obj,(void*)cb);
+                               gluNurbsCallback(obj,GLU_NURBS_END_DATA,
+                                       (GLvoid*)sdl_perl_nurbs_end_callback);  
+                               break;
+#endif
+                       default:
+                               Perl_croak(aTHX_ "SDL::OpenGL::NurbsCallback - invalid type");
+               }
+#line 4076 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL__OpenGL_gluNurbsCallbackData); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_gluNurbsCallbackData)
+{
+    dXSARGS;
+    if (items != 2)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::gluNurbsCallbackData(obj, cb)");
+    {
+       GLUnurbsObj *   obj = INT2PTR(GLUnurbsObj *,SvIV(ST(0)));
+       SV *    cb = ST(1);
+#line 2467 "OpenGL.xs"
+               gluNurbsCallbackData(obj,(void*)cb);
+#line 4092 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL__OpenGL_gluBeginSurface); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_gluBeginSurface)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::gluBeginSurface(obj)");
+    {
+       GLUnurbsObj *   obj = INT2PTR(GLUnurbsObj *,SvIV(ST(0)));
+#line 2473 "OpenGL.xs"
+               gluBeginSurface(obj);
+#line 4107 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL__OpenGL_gluEndSurface); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_gluEndSurface)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::gluEndSurface(obj)");
+    {
+       GLUnurbsObj *   obj = INT2PTR(GLUnurbsObj *,SvIV(ST(0)));
+#line 2479 "OpenGL.xs"
+               gluEndSurface(obj);
+#line 4122 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL__OpenGL_gluNurbsSurface); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_gluNurbsSurface)
+{
+    dXSARGS;
+    if (items != 11)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::gluNurbsSurface(obj, uknot_count, uknot, vknot_count, vknot, u_stride, v_stride, ctlarray, uorder, vorder, type)");
+    {
+       GLUnurbsObj *   obj = INT2PTR(GLUnurbsObj *,SvIV(ST(0)));
+       Sint32  uknot_count = (Sint32)SvIV(ST(1));
+       char *  uknot = (char *)SvPV_nolen(ST(2));
+       Sint32  vknot_count = (Sint32)SvIV(ST(3));
+       char *  vknot = (char *)SvPV_nolen(ST(4));
+       Sint32  u_stride = (Sint32)SvIV(ST(5));
+       Sint32  v_stride = (Sint32)SvIV(ST(6));
+       char *  ctlarray = (char *)SvPV_nolen(ST(7));
+       Sint32  uorder = (Sint32)SvIV(ST(8));
+       Sint32  vorder = (Sint32)SvIV(ST(9));
+       GLenum  type = (GLenum)SvIV(ST(10));
+#line 2495 "OpenGL.xs"
+               gluNurbsSurface(obj,uknot_count,(GLfloat*)uknot,vknot_count,(GLfloat*)vknot,
+                       u_stride,v_stride,(GLfloat*)ctlarray,uorder,vorder,type);
+#line 4148 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL__OpenGL_gluBeginCurve); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_gluBeginCurve)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::gluBeginCurve(obj)");
+    {
+       GLUnurbsObj *   obj = INT2PTR(GLUnurbsObj *,SvIV(ST(0)));
+#line 2502 "OpenGL.xs"
+               gluBeginCurve(obj);
+#line 4163 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL__OpenGL_gluEndCurve); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_gluEndCurve)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::gluEndCurve(obj)");
+    {
+       GLUnurbsObj *   obj = INT2PTR(GLUnurbsObj *,SvIV(ST(0)));
+#line 2508 "OpenGL.xs"
+               gluEndCurve(obj);
+#line 4178 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL__OpenGL_gluNurbsCurve); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_gluNurbsCurve)
+{
+    dXSARGS;
+    if (items != 7)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::gluNurbsCurve(obj, uknot_count, uknot, u_stride, ctlarray, uorder, type)");
+    {
+       GLUnurbsObj *   obj = INT2PTR(GLUnurbsObj *,SvIV(ST(0)));
+       Sint32  uknot_count = (Sint32)SvIV(ST(1));
+       char *  uknot = (char *)SvPV_nolen(ST(2));
+       Sint32  u_stride = (Sint32)SvIV(ST(3));
+       char *  ctlarray = (char *)SvPV_nolen(ST(4));
+       Sint32  uorder = (Sint32)SvIV(ST(5));
+       GLenum  type = (GLenum)SvIV(ST(6));
+#line 2520 "OpenGL.xs"
+               gluNurbsCurve(obj,uknot_count,(GLfloat*)uknot,u_stride,(GLfloat*)ctlarray,
+                       uorder,type);
+#line 4200 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL__OpenGL_gluBeginTrim); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_gluBeginTrim)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::gluBeginTrim(obj)");
+    {
+       GLUnurbsObj *   obj = INT2PTR(GLUnurbsObj *,SvIV(ST(0)));
+#line 2527 "OpenGL.xs"
+               gluBeginTrim(obj);
+#line 4215 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL__OpenGL_gluEndTrim); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_gluEndTrim)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::gluEndTrim(obj)");
+    {
+       GLUnurbsObj *   obj = INT2PTR(GLUnurbsObj *,SvIV(ST(0)));
+#line 2533 "OpenGL.xs"
+               gluEndTrim(obj);
+#line 4230 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL__OpenGL_gluPwlCurve); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_gluPwlCurve)
+{
+    dXSARGS;
+    if (items != 5)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::gluPwlCurve(obj, count, array, stride, type)");
+    {
+       GLUnurbsObj *   obj = INT2PTR(GLUnurbsObj *,SvIV(ST(0)));
+       Sint32  count = (Sint32)SvIV(ST(1));
+       char *  array = (char *)SvPV_nolen(ST(2));
+       Sint32  stride = (Sint32)SvIV(ST(3));
+       GLenum  type = (GLenum)SvIV(ST(4));
+#line 2543 "OpenGL.xs"
+               gluPwlCurve(obj,count,(GLfloat*)array,stride,type);
+#line 4249 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL__OpenGL_gluUnProject); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_gluUnProject)
+{
+    dXSARGS;
+    if (items != 6)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::gluUnProject(winx, winy, winz, mm, pm, vp)");
+    {
+       double  winx = (double)SvNV(ST(0));
+       double  winy = (double)SvNV(ST(1));
+       double  winz = (double)SvNV(ST(2));
+       char *  mm = (char *)SvPV_nolen(ST(3));
+       char *  pm = (char *)SvPV_nolen(ST(4));
+       char *  vp = (char *)SvPV_nolen(ST(5));
+       AV *    RETVAL;
+#line 2554 "OpenGL.xs"
+               GLdouble objx, objy, objz;
+               RETVAL = newAV();
+               av_push(RETVAL,newSViv(gluUnProject(winx,winy,winz,(GLdouble*)mm,
+                       (GLdouble*)pm,(GLint*)vp,&objx,&objy,&objz)));
+               av_push(RETVAL,newSVnv((double)objx));
+               av_push(RETVAL,newSVnv((double)objy));
+               av_push(RETVAL,newSVnv((double)objz));
+#line 4276 "OpenGL.c"
+       ST(0) = newRV((SV*)RETVAL);
+       sv_2mortal(ST(0));
+    }
+    XSRETURN(1);
+}
+
+#ifdef GL_VERSION_1_3
+#define XSubPPtmpAAAN 1
+
+XS(XS_SDL__OpenGL_gluUnProject4); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_gluUnProject4)
+{
+    dXSARGS;
+    if (items != 9)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::gluUnProject4(winx, winy, winz, clipw, mm, pm, vp, n, f)");
+    {
+       double  winx = (double)SvNV(ST(0));
+       double  winy = (double)SvNV(ST(1));
+       double  winz = (double)SvNV(ST(2));
+       double  clipw = (double)SvNV(ST(3));
+       char *  mm = (char *)SvPV_nolen(ST(4));
+       char *  pm = (char *)SvPV_nolen(ST(5));
+       char *  vp = (char *)SvPV_nolen(ST(6));
+       double  n = (double)SvNV(ST(7));
+       double  f = (double)SvNV(ST(8));
+       AV *    RETVAL;
+#line 2579 "OpenGL.xs"
+                GLdouble objx, objy, objz, objw;
+                RETVAL = newAV();
+                av_push(RETVAL,newSViv(gluUnProject4(winx,winy,winz,clipw,(GLdouble*)mm,
+                        (GLdouble*)pm,(GLint*)vp,(GLclampd)n,(GLclampd)f,
+                       &objx,&objy,&objz,&objw)));
+                av_push(RETVAL,newSVnv((double)objx));
+                av_push(RETVAL,newSVnv((double)objy));
+                av_push(RETVAL,newSVnv((double)objz));
+                av_push(RETVAL,newSVnv((double)objw));
+#line 4313 "OpenGL.c"
+       ST(0) = newRV((SV*)RETVAL);
+       sv_2mortal(ST(0));
+    }
+    XSRETURN(1);
+}
+
+#endif // GL_VERSION_1_3
+XS(XS_SDL__OpenGL_gluProject); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_gluProject)
+{
+    dXSARGS;
+    if (items != 6)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::gluProject(objx, objy, objz, mm, pm, vp)");
+    {
+       double  objx = (double)SvNV(ST(0));
+       double  objy = (double)SvNV(ST(1));
+       double  objz = (double)SvNV(ST(2));
+       char *  mm = (char *)SvPV_nolen(ST(3));
+       char *  pm = (char *)SvPV_nolen(ST(4));
+       char *  vp = (char *)SvPV_nolen(ST(5));
+       AV *    RETVAL;
+#line 2602 "OpenGL.xs"
+               GLdouble winx, winy, winz;
+               RETVAL = newAV();
+               av_push(RETVAL,newSViv(gluUnProject(objx,objy,objz,(GLdouble*)mm,
+                       (GLdouble*)pm,(GLint*)vp,&winx,&winy,&winz)));
+                av_push(RETVAL,newSVnv((double)winx));
+                av_push(RETVAL,newSVnv((double)winy));
+                av_push(RETVAL,newSVnv((double)winz));
+#line 4343 "OpenGL.c"
+       ST(0) = newRV((SV*)RETVAL);
+       sv_2mortal(ST(0));
+    }
+    XSRETURN(1);
+}
+
+#ifdef GL_VERSION_1_2
+#define XSubPPtmpAAAO 1
+
+XS(XS_SDL__OpenGL_gluNewTess); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_gluNewTess)
+{
+    dXSARGS;
+    if (items != 0)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::gluNewTess()");
+    {
+       GLUtesselator * RETVAL;
+       dXSTARG;
+#line 2617 "OpenGL.xs"
+               RETVAL = gluNewTess();
+#line 4364 "OpenGL.c"
+       XSprePUSH; PUSHi(PTR2IV(RETVAL));
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL__OpenGL_gluTessCallback); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_gluTessCallback)
+{
+    dXSARGS;
+    if (items != 2)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::gluTessCallback(tess, type)");
+    {
+       GLUtesselator * tess = INT2PTR(GLUtesselator *,SvIV(ST(0)));
+       GLenum  type = (GLenum)SvIV(ST(1));
+#line 2626 "OpenGL.xs"
+               switch(type) {
+                       case GLU_TESS_BEGIN:
+                       case GLU_TESS_BEGIN_DATA:
+                               gluTessCallback(tess,GLU_TESS_BEGIN_DATA,
+                                       (GLvoid*)sdl_perl_tess_begin_callback); 
+                               break;
+
+                       case GLU_TESS_EDGE_FLAG:
+                       case GLU_TESS_EDGE_FLAG_DATA:
+                               gluTessCallback(tess,GLU_TESS_EDGE_FLAG_DATA,
+                                       (GLvoid*)sdl_perl_tess_edge_flag_callback);     
+                               break;
+
+                       case GLU_TESS_VERTEX:
+                       case GLU_TESS_VERTEX_DATA:
+                               gluTessCallback(tess,GLU_TESS_VERTEX_DATA,
+                                       (GLvoid*)sdl_perl_tess_vertex_callback);        
+                               break;
+
+                       case GLU_TESS_END:
+                       case GLU_TESS_END_DATA:
+                               gluTessCallback(tess,GLU_TESS_END_DATA,
+                                       (GLvoid*)sdl_perl_tess_end_callback);   
+                               break;
+
+                       case GLU_TESS_COMBINE:
+                       case GLU_TESS_COMBINE_DATA:
+                               gluTessCallback(tess,GLU_TESS_COMBINE_DATA,
+                                       (GLvoid*)sdl_perl_tess_combine_callback);       
+                               break;
+
+                       case GLU_TESS_ERROR:
+                       case GLU_TESS_ERROR_DATA:
+                               gluTessCallback(tess,GLU_TESS_ERROR_DATA,
+                                       (GLvoid*)sdl_perl_tess_error_callback); 
+                               break;
+               }
+#line 4417 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL__OpenGL_gluTessProperty); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_gluTessProperty)
+{
+    dXSARGS;
+    if (items != 3)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::gluTessProperty(tessobj, property, value)");
+    {
+       GLUtesselator * tessobj = INT2PTR(GLUtesselator *,SvIV(ST(0)));
+       Uint32  property = (Uint32)SvUV(ST(1));
+       double  value = (double)SvNV(ST(2));
+#line 2670 "OpenGL.xs"
+               gluTessProperty(tessobj,property,value);
+#line 4434 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL__OpenGL_gluGetTessProperty); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_gluGetTessProperty)
+{
+    dXSARGS;
+    if (items != 2)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::gluGetTessProperty(tessobj, property)");
+    {
+       GLUtesselator * tessobj = INT2PTR(GLUtesselator *,SvIV(ST(0)));
+       Uint32  property = (Uint32)SvUV(ST(1));
+       double  RETVAL;
+       dXSTARG;
+#line 2677 "OpenGL.xs"
+               gluGetTessProperty(tessobj,property,&RETVAL);
+#line 4452 "OpenGL.c"
+       XSprePUSH; PUSHn((double)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL__OpenGL_gluTessNormal); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_gluTessNormal)
+{
+    dXSARGS;
+    if (items != 4)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::gluTessNormal(tessobj, x, y, z)");
+    {
+       GLUtesselator * tessobj = INT2PTR(GLUtesselator *,SvIV(ST(0)));
+       double  x = (double)SvNV(ST(1));
+       double  y = (double)SvNV(ST(2));
+       double  z = (double)SvNV(ST(3));
+#line 2688 "OpenGL.xs"
+               gluTessNormal(tessobj,x,y,z);
+#line 4471 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL__OpenGL_gluTessBeginPolygon); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_gluTessBeginPolygon)
+{
+    dXSARGS;
+    if (items != 2)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::gluTessBeginPolygon(tessobj, cb)");
+    {
+       GLUtesselator * tessobj = INT2PTR(GLUtesselator *,SvIV(ST(0)));
+       SV *    cb = ST(1);
+#line 2695 "OpenGL.xs"
+               gluTessBeginPolygon(tessobj,cb);
+#line 4487 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL__OpenGL_gluTessEndPolygon); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_gluTessEndPolygon)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::gluTessEndPolygon(tessobj)");
+    {
+       GLUtesselator * tessobj = INT2PTR(GLUtesselator *,SvIV(ST(0)));
+#line 2701 "OpenGL.xs"
+               gluTessEndPolygon(tessobj);
+#line 4502 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL__OpenGL_gluTessBeginContour); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_gluTessBeginContour)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::gluTessBeginContour(tessobj)");
+    {
+       GLUtesselator * tessobj = INT2PTR(GLUtesselator *,SvIV(ST(0)));
+#line 2707 "OpenGL.xs"
+               gluTessBeginContour(tessobj);
+#line 4517 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL__OpenGL_gluTessEndContour); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_gluTessEndContour)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::gluTessEndContour(tessobj)");
+    {
+       GLUtesselator * tessobj = INT2PTR(GLUtesselator *,SvIV(ST(0)));
+#line 2713 "OpenGL.xs"
+               gluTessEndContour(tessobj);
+#line 4532 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL__OpenGL_gluDeleteTess); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_gluDeleteTess)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::gluDeleteTess(tessobj)");
+    {
+       GLUtesselator * tessobj = INT2PTR(GLUtesselator *,SvIV(ST(0)));
+#line 2719 "OpenGL.xs"
+               gluDeleteTess(tessobj);
+#line 4547 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL__OpenGL_gluTessVertex); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__OpenGL_gluTessVertex)
+{
+    dXSARGS;
+    if (items != 3)
+       Perl_croak(aTHX_ "Usage: SDL::OpenGL::gluTessVertex(tessobj, coords, vd)");
+    {
+       GLUtesselator * tessobj = INT2PTR(GLUtesselator *,SvIV(ST(0)));
+       char *  coords = (char *)SvPV_nolen(ST(1));
+       char *  vd = (char *)SvPV_nolen(ST(2));
+#line 2727 "OpenGL.xs"
+               gluTessVertex(tessobj,(GLdouble*)coords,vd);
+#line 4564 "OpenGL.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+#endif
+#endif
+#ifdef __cplusplus
+extern "C"
+#endif
+XS(boot_SDL__OpenGL); /* prototype to pass -Wmissing-prototypes */
+XS(boot_SDL__OpenGL)
+{
+    dXSARGS;
+    char* file = __FILE__;
+
+    XS_VERSION_BOOTCHECK ;
+
+#if XSubPPtmpAAAA
+        newXS("SDL::OpenGL::glClearColor", XS_SDL__OpenGL_glClearColor, file);
+        newXS("SDL::OpenGL::glClearIndex", XS_SDL__OpenGL_glClearIndex, file);
+        newXS("SDL::OpenGL::glClearDepth", XS_SDL__OpenGL_glClearDepth, file);
+        newXS("SDL::OpenGL::glClearStencil", XS_SDL__OpenGL_glClearStencil, file);
+        newXS("SDL::OpenGL::glClearAccum", XS_SDL__OpenGL_glClearAccum, file);
+        newXS("SDL::OpenGL::glClear", XS_SDL__OpenGL_glClear, file);
+        newXS("SDL::OpenGL::glFlush", XS_SDL__OpenGL_glFlush, file);
+        newXS("SDL::OpenGL::glFinish", XS_SDL__OpenGL_glFinish, file);
+        newXS("SDL::OpenGL::glRect", XS_SDL__OpenGL_glRect, file);
+        newXS("SDL::OpenGL::glVertex", XS_SDL__OpenGL_glVertex, file);
+        newXS("SDL::OpenGL::glBegin", XS_SDL__OpenGL_glBegin, file);
+        newXS("SDL::OpenGL::glEnd", XS_SDL__OpenGL_glEnd, file);
+        newXS("SDL::OpenGL::glEnable", XS_SDL__OpenGL_glEnable, file);
+        newXS("SDL::OpenGL::glDisable", XS_SDL__OpenGL_glDisable, file);
+        newXS("SDL::OpenGL::glGet", XS_SDL__OpenGL_glGet, file);
+        newXS("SDL::OpenGL::glIsEnabled", XS_SDL__OpenGL_glIsEnabled, file);
+        newXS("SDL::OpenGL::glPointSize", XS_SDL__OpenGL_glPointSize, file);
+        newXS("SDL::OpenGL::glLineWidth", XS_SDL__OpenGL_glLineWidth, file);
+        newXS("SDL::OpenGL::glLineStipple", XS_SDL__OpenGL_glLineStipple, file);
+        newXS("SDL::OpenGL::glPolygonMode", XS_SDL__OpenGL_glPolygonMode, file);
+        newXS("SDL::OpenGL::glFrontFace", XS_SDL__OpenGL_glFrontFace, file);
+        newXS("SDL::OpenGL::glCullFace", XS_SDL__OpenGL_glCullFace, file);
+        newXS("SDL::OpenGL::glPolygonStipple", XS_SDL__OpenGL_glPolygonStipple, file);
+        newXS("SDL::OpenGL::glEdgeFlag", XS_SDL__OpenGL_glEdgeFlag, file);
+        newXS("SDL::OpenGL::glNormal", XS_SDL__OpenGL_glNormal, file);
+        newXS("SDL::OpenGL::glEnableClientState", XS_SDL__OpenGL_glEnableClientState, file);
+        newXS("SDL::OpenGL::glDisableClientState", XS_SDL__OpenGL_glDisableClientState, file);
+        newXS("SDL::OpenGL::glVertexPointer", XS_SDL__OpenGL_glVertexPointer, file);
+        newXS("SDL::OpenGL::glColorPointer", XS_SDL__OpenGL_glColorPointer, file);
+        newXS("SDL::OpenGL::glNormalPointer", XS_SDL__OpenGL_glNormalPointer, file);
+        newXS("SDL::OpenGL::glTexCoordPointer", XS_SDL__OpenGL_glTexCoordPointer, file);
+        newXS("SDL::OpenGL::glEdgeFlagPointer", XS_SDL__OpenGL_glEdgeFlagPointer, file);
+        newXS("SDL::OpenGL::glArrayElement", XS_SDL__OpenGL_glArrayElement, file);
+        newXS("SDL::OpenGL::glDrawElements", XS_SDL__OpenGL_glDrawElements, file);
+        newXS("SDL::OpenGL::glDrawRangeElements", XS_SDL__OpenGL_glDrawRangeElements, file);
+        newXS("SDL::OpenGL::glDrawArrays", XS_SDL__OpenGL_glDrawArrays, file);
+        newXS("SDL::OpenGL::glInterleavedArrays", XS_SDL__OpenGL_glInterleavedArrays, file);
+        newXS("SDL::OpenGL::glPushAttrib", XS_SDL__OpenGL_glPushAttrib, file);
+        newXS("SDL::OpenGL::glPopAttrib", XS_SDL__OpenGL_glPopAttrib, file);
+        newXS("SDL::OpenGL::glPushClientAttrib", XS_SDL__OpenGL_glPushClientAttrib, file);
+        newXS("SDL::OpenGL::glPopClientAttrib", XS_SDL__OpenGL_glPopClientAttrib, file);
+        newXS("SDL::OpenGL::glMatrixMode", XS_SDL__OpenGL_glMatrixMode, file);
+        newXS("SDL::OpenGL::glLoadIdentity", XS_SDL__OpenGL_glLoadIdentity, file);
+        newXS("SDL::OpenGL::glLoadMatrix", XS_SDL__OpenGL_glLoadMatrix, file);
+        newXS("SDL::OpenGL::glMultMatrix", XS_SDL__OpenGL_glMultMatrix, file);
+        newXS("SDL::OpenGL::glTranslate", XS_SDL__OpenGL_glTranslate, file);
+        newXS("SDL::OpenGL::glRotate", XS_SDL__OpenGL_glRotate, file);
+        newXS("SDL::OpenGL::glScale", XS_SDL__OpenGL_glScale, file);
+        newXS("SDL::OpenGL::glFrustum", XS_SDL__OpenGL_glFrustum, file);
+        newXS("SDL::OpenGL::glOrtho", XS_SDL__OpenGL_glOrtho, file);
+        newXS("SDL::OpenGL::glViewport", XS_SDL__OpenGL_glViewport, file);
+        newXS("SDL::OpenGL::glDepthRange", XS_SDL__OpenGL_glDepthRange, file);
+        newXS("SDL::OpenGL::glPushMatrix", XS_SDL__OpenGL_glPushMatrix, file);
+        newXS("SDL::OpenGL::glPopMatrix", XS_SDL__OpenGL_glPopMatrix, file);
+        newXS("SDL::OpenGL::glClipPlane", XS_SDL__OpenGL_glClipPlane, file);
+        newXS("SDL::OpenGL::glColor", XS_SDL__OpenGL_glColor, file);
+        newXS("SDL::OpenGL::glIndex", XS_SDL__OpenGL_glIndex, file);
+        newXS("SDL::OpenGL::glShadeModel", XS_SDL__OpenGL_glShadeModel, file);
+        newXS("SDL::OpenGL::glLight", XS_SDL__OpenGL_glLight, file);
+        newXS("SDL::OpenGL::glLightModel", XS_SDL__OpenGL_glLightModel, file);
+        newXS("SDL::OpenGL::glMaterial", XS_SDL__OpenGL_glMaterial, file);
+        newXS("SDL::OpenGL::glColorMaterial", XS_SDL__OpenGL_glColorMaterial, file);
+        newXS("SDL::OpenGL::glBlendFunc", XS_SDL__OpenGL_glBlendFunc, file);
+        newXS("SDL::OpenGL::glHint", XS_SDL__OpenGL_glHint, file);
+        newXS("SDL::OpenGL::glFog", XS_SDL__OpenGL_glFog, file);
+        newXS("SDL::OpenGL::glPolygonOffset", XS_SDL__OpenGL_glPolygonOffset, file);
+        newXS("SDL::OpenGL::glGenLists", XS_SDL__OpenGL_glGenLists, file);
+        newXS("SDL::OpenGL::glNewList", XS_SDL__OpenGL_glNewList, file);
+        newXS("SDL::OpenGL::glEndList", XS_SDL__OpenGL_glEndList, file);
+        newXS("SDL::OpenGL::glDeleteLists", XS_SDL__OpenGL_glDeleteLists, file);
+        newXS("SDL::OpenGL::glCallList", XS_SDL__OpenGL_glCallList, file);
+        newXS("SDL::OpenGL::glIsList", XS_SDL__OpenGL_glIsList, file);
+        newXS("SDL::OpenGL::glListBase", XS_SDL__OpenGL_glListBase, file);
+        newXS("SDL::OpenGL::glCallLists", XS_SDL__OpenGL_glCallLists, file);
+        newXS("SDL::OpenGL::glCallListsString", XS_SDL__OpenGL_glCallListsString, file);
+        newXS("SDL::OpenGL::glRasterPos", XS_SDL__OpenGL_glRasterPos, file);
+        newXS("SDL::OpenGL::glBitmap", XS_SDL__OpenGL_glBitmap, file);
+        newXS("SDL::OpenGL::glDrawPixels", XS_SDL__OpenGL_glDrawPixels, file);
+        newXS("SDL::OpenGL::glReadPixels", XS_SDL__OpenGL_glReadPixels, file);
+        newXS("SDL::OpenGL::glReadPixel", XS_SDL__OpenGL_glReadPixel, file);
+        newXS("SDL::OpenGL::glCopyPixels", XS_SDL__OpenGL_glCopyPixels, file);
+        newXS("SDL::OpenGL::glPixelStore", XS_SDL__OpenGL_glPixelStore, file);
+        newXS("SDL::OpenGL::glPixelTransfer", XS_SDL__OpenGL_glPixelTransfer, file);
+        newXS("SDL::OpenGL::glPixelMap", XS_SDL__OpenGL_glPixelMap, file);
+        newXS("SDL::OpenGL::glPixelZoom", XS_SDL__OpenGL_glPixelZoom, file);
+#if XSubPPtmpAAAB
+        newXS("SDL::OpenGL::glColorTable", XS_SDL__OpenGL_glColorTable, file);
+        newXS("SDL::OpenGL::glColorTableParameter", XS_SDL__OpenGL_glColorTableParameter, file);
+        newXS("SDL::OpenGL::glCopyColorTable", XS_SDL__OpenGL_glCopyColorTable, file);
+        newXS("SDL::OpenGL::glColorSubTable", XS_SDL__OpenGL_glColorSubTable, file);
+        newXS("SDL::OpenGL::glCopyColorSubTable", XS_SDL__OpenGL_glCopyColorSubTable, file);
+        newXS("SDL::OpenGL::glConvolutionFilter2D", XS_SDL__OpenGL_glConvolutionFilter2D, file);
+        newXS("SDL::OpenGL::glCopyConvolutionFilter2D", XS_SDL__OpenGL_glCopyConvolutionFilter2D, file);
+        newXS("SDL::OpenGL::glSeparableFilter2D", XS_SDL__OpenGL_glSeparableFilter2D, file);
+        newXS("SDL::OpenGL::glConvolutionFilter1D", XS_SDL__OpenGL_glConvolutionFilter1D, file);
+        newXS("SDL::OpenGL::glCopyConvolutionFilter1D", XS_SDL__OpenGL_glCopyConvolutionFilter1D, file);
+        newXS("SDL::OpenGL::glConvolutionParameter", XS_SDL__OpenGL_glConvolutionParameter, file);
+        newXS("SDL::OpenGL::glHistogram", XS_SDL__OpenGL_glHistogram, file);
+        newXS("SDL::OpenGL::glGetHistogram", XS_SDL__OpenGL_glGetHistogram, file);
+        newXS("SDL::OpenGL::glResetHistogram", XS_SDL__OpenGL_glResetHistogram, file);
+        newXS("SDL::OpenGL::glMinmax", XS_SDL__OpenGL_glMinmax, file);
+        newXS("SDL::OpenGL::glGetMinmax", XS_SDL__OpenGL_glGetMinmax, file);
+        newXS("SDL::OpenGL::glResetMinmax", XS_SDL__OpenGL_glResetMinmax, file);
+        newXS("SDL::OpenGL::glBlendEquation", XS_SDL__OpenGL_glBlendEquation, file);
+#endif
+        newXS("SDL::OpenGL::glTexImage2D", XS_SDL__OpenGL_glTexImage2D, file);
+        newXS("SDL::OpenGL::glCopyTexImage2D", XS_SDL__OpenGL_glCopyTexImage2D, file);
+        newXS("SDL::OpenGL::glTexSubImage2D", XS_SDL__OpenGL_glTexSubImage2D, file);
+        newXS("SDL::OpenGL::glCopyTexSubImage2D", XS_SDL__OpenGL_glCopyTexSubImage2D, file);
+        newXS("SDL::OpenGL::glTexImage1D", XS_SDL__OpenGL_glTexImage1D, file);
+        newXS("SDL::OpenGL::glTexSubImage1D", XS_SDL__OpenGL_glTexSubImage1D, file);
+        newXS("SDL::OpenGL::glCopyTexImage1D", XS_SDL__OpenGL_glCopyTexImage1D, file);
+        newXS("SDL::OpenGL::glCopyTexSubImage1D", XS_SDL__OpenGL_glCopyTexSubImage1D, file);
+#if XSubPPtmpAAAC
+        newXS("SDL::OpenGL::glTexImage3D", XS_SDL__OpenGL_glTexImage3D, file);
+        newXS("SDL::OpenGL::glTexSubImage3D", XS_SDL__OpenGL_glTexSubImage3D, file);
+        newXS("SDL::OpenGL::glCopyTexSubImage3D", XS_SDL__OpenGL_glCopyTexSubImage3D, file);
+#endif
+        newXS("SDL::OpenGL::glGenTextures", XS_SDL__OpenGL_glGenTextures, file);
+        newXS("SDL::OpenGL::glIsTexture", XS_SDL__OpenGL_glIsTexture, file);
+        newXS("SDL::OpenGL::glBindTexture", XS_SDL__OpenGL_glBindTexture, file);
+        newXS("SDL::OpenGL::glDeleteTextures", XS_SDL__OpenGL_glDeleteTextures, file);
+        newXS("SDL::OpenGL::glAreTexturesResident", XS_SDL__OpenGL_glAreTexturesResident, file);
+        newXS("SDL::OpenGL::glPrioritizeTextures", XS_SDL__OpenGL_glPrioritizeTextures, file);
+        newXS("SDL::OpenGL::glTexEnv", XS_SDL__OpenGL_glTexEnv, file);
+        newXS("SDL::OpenGL::glTexCoord", XS_SDL__OpenGL_glTexCoord, file);
+        newXS("SDL::OpenGL::glTexParameter", XS_SDL__OpenGL_glTexParameter, file);
+        newXS("SDL::OpenGL::glTexGen", XS_SDL__OpenGL_glTexGen, file);
+#if XSubPPtmpAAAD
+        newXS("SDL::OpenGL::glActiveTextureARB", XS_SDL__OpenGL_glActiveTextureARB, file);
+        newXS("SDL::OpenGL::glMultiTexCoord", XS_SDL__OpenGL_glMultiTexCoord, file);
+#endif
+        newXS("SDL::OpenGL::glDrawBuffer", XS_SDL__OpenGL_glDrawBuffer, file);
+        newXS("SDL::OpenGL::glReadBuffer", XS_SDL__OpenGL_glReadBuffer, file);
+        newXS("SDL::OpenGL::glIndexMask", XS_SDL__OpenGL_glIndexMask, file);
+        newXS("SDL::OpenGL::glColorMask", XS_SDL__OpenGL_glColorMask, file);
+        newXS("SDL::OpenGL::glDepthMask", XS_SDL__OpenGL_glDepthMask, file);
+        newXS("SDL::OpenGL::glStencilMask", XS_SDL__OpenGL_glStencilMask, file);
+        newXS("SDL::OpenGL::glScissor", XS_SDL__OpenGL_glScissor, file);
+        newXS("SDL::OpenGL::glAlphaFunc", XS_SDL__OpenGL_glAlphaFunc, file);
+        newXS("SDL::OpenGL::glStencilFunc", XS_SDL__OpenGL_glStencilFunc, file);
+        newXS("SDL::OpenGL::glStencilOp", XS_SDL__OpenGL_glStencilOp, file);
+        newXS("SDL::OpenGL::glDepthFunc", XS_SDL__OpenGL_glDepthFunc, file);
+        newXS("SDL::OpenGL::glLogicOp", XS_SDL__OpenGL_glLogicOp, file);
+        newXS("SDL::OpenGL::glAccum", XS_SDL__OpenGL_glAccum, file);
+        newXS("SDL::OpenGL::glMap1", XS_SDL__OpenGL_glMap1, file);
+        newXS("SDL::OpenGL::glEvalCoord1", XS_SDL__OpenGL_glEvalCoord1, file);
+        newXS("SDL::OpenGL::glMapGrid1", XS_SDL__OpenGL_glMapGrid1, file);
+        newXS("SDL::OpenGL::glEvalMesh1", XS_SDL__OpenGL_glEvalMesh1, file);
+        newXS("SDL::OpenGL::glMap2", XS_SDL__OpenGL_glMap2, file);
+        newXS("SDL::OpenGL::glEvalCoord2", XS_SDL__OpenGL_glEvalCoord2, file);
+        newXS("SDL::OpenGL::glMapGrid2", XS_SDL__OpenGL_glMapGrid2, file);
+        newXS("SDL::OpenGL::glEvalMesh2", XS_SDL__OpenGL_glEvalMesh2, file);
+        newXS("SDL::OpenGL::glGetError", XS_SDL__OpenGL_glGetError, file);
+        newXS("SDL::OpenGL::glRenderMode", XS_SDL__OpenGL_glRenderMode, file);
+        newXS("SDL::OpenGL::glInitNames", XS_SDL__OpenGL_glInitNames, file);
+        newXS("SDL::OpenGL::glPushName", XS_SDL__OpenGL_glPushName, file);
+        newXS("SDL::OpenGL::glPopName", XS_SDL__OpenGL_glPopName, file);
+        newXS("SDL::OpenGL::glLoadName", XS_SDL__OpenGL_glLoadName, file);
+        newXS("SDL::OpenGL::glFeedbackBuffer", XS_SDL__OpenGL_glFeedbackBuffer, file);
+        newXS("SDL::OpenGL::glPassThrough", XS_SDL__OpenGL_glPassThrough, file);
+#endif
+#if XSubPPtmpAAAE
+        newXS("SDL::OpenGL::gluLookAt", XS_SDL__OpenGL_gluLookAt, file);
+        newXS("SDL::OpenGL::gluPerspective", XS_SDL__OpenGL_gluPerspective, file);
+        newXS("SDL::OpenGL::gluPickMatrix", XS_SDL__OpenGL_gluPickMatrix, file);
+        newXS("SDL::OpenGL::gluOrtho2D", XS_SDL__OpenGL_gluOrtho2D, file);
+        newXS("SDL::OpenGL::gluScaleImage", XS_SDL__OpenGL_gluScaleImage, file);
+        newXS("SDL::OpenGL::gluBuild1DMipmaps", XS_SDL__OpenGL_gluBuild1DMipmaps, file);
+        newXS("SDL::OpenGL::gluBuild2DMipmaps", XS_SDL__OpenGL_gluBuild2DMipmaps, file);
+#if XSubPPtmpAAAF
+        newXS("SDL::OpenGL::gluBuild3DMipmaps", XS_SDL__OpenGL_gluBuild3DMipmaps, file);
+#endif
+#if XSubPPtmpAAAG
+        newXS("SDL::OpenGL::gluBuild3DMipmaps", XS_SDL__OpenGL_gluBuild3DMipmaps, file);
+#endif
+#if XSubPPtmpAAAH
+        newXS("SDL::OpenGL::gluBuild1DMipmapLevels", XS_SDL__OpenGL_gluBuild1DMipmapLevels, file);
+#endif
+#if XSubPPtmpAAAI
+        newXS("SDL::OpenGL::gluBuild1DMipmapLevels", XS_SDL__OpenGL_gluBuild1DMipmapLevels, file);
+#endif
+#if XSubPPtmpAAAJ
+        newXS("SDL::OpenGL::gluBuild2DMipmapLevels", XS_SDL__OpenGL_gluBuild2DMipmapLevels, file);
+#endif
+#if XSubPPtmpAAAK
+        newXS("SDL::OpenGL::gluBuild2DMipmapLevels", XS_SDL__OpenGL_gluBuild2DMipmapLevels, file);
+#endif
+#if XSubPPtmpAAAL
+        newXS("SDL::OpenGL::gluBuild3DMipmapLevels", XS_SDL__OpenGL_gluBuild3DMipmapLevels, file);
+#endif
+#if XSubPPtmpAAAM
+        newXS("SDL::OpenGL::gluBuild3DMipmapLevels", XS_SDL__OpenGL_gluBuild3DMipmapLevels, file);
+#endif
+        newXS("SDL::OpenGL::gluErrorString", XS_SDL__OpenGL_gluErrorString, file);
+        newXS("SDL::OpenGL::gluNewNurbsRenderer", XS_SDL__OpenGL_gluNewNurbsRenderer, file);
+        newXS("SDL::OpenGL::gluDeleteNurbsRenderer", XS_SDL__OpenGL_gluDeleteNurbsRenderer, file);
+        newXS("SDL::OpenGL::gluNurbsProperty", XS_SDL__OpenGL_gluNurbsProperty, file);
+        newXS("SDL::OpenGL::gluLoadSamplingMatrices", XS_SDL__OpenGL_gluLoadSamplingMatrices, file);
+        newXS("SDL::OpenGL::gluGetNurbsProperty", XS_SDL__OpenGL_gluGetNurbsProperty, file);
+        newXS("SDL::OpenGL::gluNurbsCallback", XS_SDL__OpenGL_gluNurbsCallback, file);
+        newXS("SDL::OpenGL::gluNurbsCallbackData", XS_SDL__OpenGL_gluNurbsCallbackData, file);
+        newXS("SDL::OpenGL::gluBeginSurface", XS_SDL__OpenGL_gluBeginSurface, file);
+        newXS("SDL::OpenGL::gluEndSurface", XS_SDL__OpenGL_gluEndSurface, file);
+        newXS("SDL::OpenGL::gluNurbsSurface", XS_SDL__OpenGL_gluNurbsSurface, file);
+        newXS("SDL::OpenGL::gluBeginCurve", XS_SDL__OpenGL_gluBeginCurve, file);
+        newXS("SDL::OpenGL::gluEndCurve", XS_SDL__OpenGL_gluEndCurve, file);
+        newXS("SDL::OpenGL::gluNurbsCurve", XS_SDL__OpenGL_gluNurbsCurve, file);
+        newXS("SDL::OpenGL::gluBeginTrim", XS_SDL__OpenGL_gluBeginTrim, file);
+        newXS("SDL::OpenGL::gluEndTrim", XS_SDL__OpenGL_gluEndTrim, file);
+        newXS("SDL::OpenGL::gluPwlCurve", XS_SDL__OpenGL_gluPwlCurve, file);
+        newXS("SDL::OpenGL::gluUnProject", XS_SDL__OpenGL_gluUnProject, file);
+#if XSubPPtmpAAAN
+        newXS("SDL::OpenGL::gluUnProject4", XS_SDL__OpenGL_gluUnProject4, file);
+#endif
+        newXS("SDL::OpenGL::gluProject", XS_SDL__OpenGL_gluProject, file);
+#if XSubPPtmpAAAO
+        newXS("SDL::OpenGL::gluNewTess", XS_SDL__OpenGL_gluNewTess, file);
+        newXS("SDL::OpenGL::gluTessCallback", XS_SDL__OpenGL_gluTessCallback, file);
+        newXS("SDL::OpenGL::gluTessProperty", XS_SDL__OpenGL_gluTessProperty, file);
+        newXS("SDL::OpenGL::gluGetTessProperty", XS_SDL__OpenGL_gluGetTessProperty, file);
+        newXS("SDL::OpenGL::gluTessNormal", XS_SDL__OpenGL_gluTessNormal, file);
+        newXS("SDL::OpenGL::gluTessBeginPolygon", XS_SDL__OpenGL_gluTessBeginPolygon, file);
+        newXS("SDL::OpenGL::gluTessEndPolygon", XS_SDL__OpenGL_gluTessEndPolygon, file);
+        newXS("SDL::OpenGL::gluTessBeginContour", XS_SDL__OpenGL_gluTessBeginContour, file);
+        newXS("SDL::OpenGL::gluTessEndContour", XS_SDL__OpenGL_gluTessEndContour, file);
+        newXS("SDL::OpenGL::gluDeleteTess", XS_SDL__OpenGL_gluDeleteTess, file);
+        newXS("SDL::OpenGL::gluTessVertex", XS_SDL__OpenGL_gluTessVertex, file);
+#endif
+#endif
+
+    /* Initialisation Section */
+
+#if XSubPPtmpAAAA
+#if XSubPPtmpAAAB
+#endif
+#if XSubPPtmpAAAC
+#endif
+#if XSubPPtmpAAAD
+#endif
+#endif
+#if XSubPPtmpAAAE
+#if XSubPPtmpAAAF
+#endif
+#if XSubPPtmpAAAG
+#endif
+#if XSubPPtmpAAAH
+#endif
+#if XSubPPtmpAAAI
+#endif
+#if XSubPPtmpAAAJ
+#endif
+#if XSubPPtmpAAAK
+#endif
+#if XSubPPtmpAAAL
+#endif
+#if XSubPPtmpAAAM
+#endif
+#if XSubPPtmpAAAN
+#endif
+#if XSubPPtmpAAAO
+#endif
+#endif
+#line 4846 "OpenGL.c"
+
+    /* End of Initialisation Section */
+
+    XSRETURN_YES;
+}
+
diff --git a/src/SDL/OpenGL.o b/src/SDL/OpenGL.o
new file mode 100644 (file)
index 0000000..a2dd124
Binary files /dev/null and b/src/SDL/OpenGL.o differ
diff --git a/src/SDL/OpenGL.xs b/src/SDL/OpenGL.xs
new file mode 100644 (file)
index 0000000..4c54228
--- /dev/null
@@ -0,0 +1,2732 @@
+//
+// OpenGL.xs
+//
+// Copyright (C) 2005 David J. Goehrig <dgoehrig@cpan.org>
+//
+// ------------------------------------------------------------------------------
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+// 
+// This library 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
+// Lesser General Public License for more details.
+// 
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+//
+// ------------------------------------------------------------------------------
+//
+// Please feel free to send questions, suggestions or improvements to:
+//
+//     David J. Goehrig
+//     dgoehrig@cpan.org
+//
+
+#include "EXTERN.h"
+#include "perl.h"
+#include "XSUB.h"
+
+#ifndef aTHX_
+#define aTHX_
+#endif
+
+#include <SDL.h>
+
+#include <gl.h>
+#include <glu.h>
+
+#ifdef USE_THREADS
+#define HAVE_TLS_CONTEXT
+#endif
+
+#ifndef GL_ALL_CLIENT_ATTRIB_BITS  
+#define GL_ALL_CLIENT_ATTRIB_BITS 0xFFFFFFF
+#endif /* GL_ALL_CLIENT_BITS */  
+
+#include "../defines.h"
+
+SV* sdl_perl_nurbs_error_hook;
+void
+sdl_perl_nurbs_error_callback ( GLenum errorCode )
+{
+       ENTER_TLS_CONTEXT
+       dSP;
+
+       ENTER;
+       SAVETMPS;
+       PUSHMARK(SP);
+       XPUSHs(sv_2mortal(newSViv(errorCode)));
+       PUTBACK;
+
+       call_sv(sdl_perl_nurbs_error_hook,G_VOID);
+       
+       FREETMPS;
+       LEAVE;
+       LEAVE_TLS_CONTEXT       
+}
+
+void
+sdl_perl_nurbs_being_callback ( GLenum type, void *cb )
+{
+       SV *cmd;
+       ENTER_TLS_CONTEXT
+       dSP;
+
+       cmd = (SV*)cb;
+
+       ENTER;
+       SAVETMPS;
+       PUSHMARK(SP);
+       XPUSHs(sv_2mortal(newSViv(type)));
+       PUTBACK;
+
+       call_sv(cmd,G_VOID);
+       
+       FREETMPS;
+       LEAVE;
+       LEAVE_TLS_CONTEXT       
+}
+
+void
+sdl_perl_nurbs_multi_callback ( GLfloat *vec, void *cb )
+{
+       SV *cmd;
+       ENTER_TLS_CONTEXT
+       dSP;
+
+       cmd = (SV*)cb;
+
+       ENTER;
+       SAVETMPS;
+       PUSHMARK(SP);
+       XPUSHs(sv_2mortal(newSViv(PTR2IV(vec))));
+       PUTBACK;
+
+       call_sv(cmd,G_VOID);
+       
+       FREETMPS;
+       LEAVE;
+       LEAVE_TLS_CONTEXT       
+}
+
+void
+sdl_perl_nurbs_end_callback ( void *cb )
+{
+       SV *cmd;
+       ENTER_TLS_CONTEXT
+
+       cmd = (SV*)cb;
+
+       ENTER;
+       SAVETMPS;
+
+       call_sv(cmd,G_VOID);
+       
+       FREETMPS;
+       LEAVE;
+       LEAVE_TLS_CONTEXT       
+}
+
+void
+sdl_perl_tess_end_callback ( void *cb )
+{
+       SV *cmd;
+        ENTER_TLS_CONTEXT
+       dSP;
+
+        cmd = (SV*)cb;
+
+        ENTER;
+        SAVETMPS;
+       PUSHMARK(SP);
+       XPUSHs(sv_2mortal(newSViv(GLU_TESS_BEGIN)));
+       PUTBACK;
+
+        call_sv(cmd,G_VOID);
+
+        FREETMPS;
+        LEAVE;
+        LEAVE_TLS_CONTEXT
+}
+
+void
+sdl_perl_tess_begin_callback ( GLenum type,  void *cb )
+{
+        SV *cmd;
+        ENTER_TLS_CONTEXT
+       dSP;
+
+        cmd = (SV*)cb;
+
+        ENTER;
+        SAVETMPS;
+       PUSHMARK(SP);
+       XPUSHs(sv_2mortal(newSViv(GLU_TESS_BEGIN)));
+       XPUSHs(sv_2mortal(newSViv(type)));
+       PUTBACK;
+
+        call_sv(cmd,G_VOID);
+
+        FREETMPS;
+        LEAVE;
+        LEAVE_TLS_CONTEXT
+}
+
+void
+sdl_perl_tess_error_callback ( GLenum type,  void *cb )
+{
+        SV *cmd;
+        ENTER_TLS_CONTEXT
+       dSP;
+
+        cmd = (SV*)cb;
+
+        ENTER;
+        SAVETMPS;
+        PUSHMARK(SP);
+        XPUSHs(sv_2mortal(newSViv(GLU_TESS_ERROR)));
+        XPUSHs(sv_2mortal(newSViv(type)));
+        PUTBACK;
+
+        call_sv(cmd,G_VOID);
+
+        FREETMPS;
+        LEAVE;
+        LEAVE_TLS_CONTEXT
+}
+
+void
+sdl_perl_tess_edge_flag_callback ( GLenum flag,  void *cb )
+{
+        SV *cmd;
+        ENTER_TLS_CONTEXT
+       dSP;
+
+        cmd = (SV*)cb;
+
+        ENTER;
+        SAVETMPS;
+        PUSHMARK(SP);
+       XPUSHs(sv_2mortal(newSViv(GLU_TESS_EDGE_FLAG)));
+        XPUSHs(sv_2mortal(newSViv(flag)));
+        PUTBACK;
+
+        call_sv(cmd,G_VOID);
+
+        FREETMPS;
+        LEAVE;
+        LEAVE_TLS_CONTEXT
+}
+
+void
+sdl_perl_tess_vertex_callback ( double *vd,  void *cb )
+{
+        SV *cmd;
+        ENTER_TLS_CONTEXT
+       dSP;
+
+        cmd = (SV*)cb;
+
+        ENTER;
+        SAVETMPS;
+        PUSHMARK(SP);
+       XPUSHs(sv_2mortal(newSViv(GLU_TESS_VERTEX)));
+        XPUSHs(sv_2mortal(newSVnv(vd[0])));
+        XPUSHs(sv_2mortal(newSVnv(vd[1])));
+        XPUSHs(sv_2mortal(newSVnv(vd[2])));
+        XPUSHs(sv_2mortal(newSVnv(vd[3])));
+        XPUSHs(sv_2mortal(newSVnv(vd[4])));
+        XPUSHs(sv_2mortal(newSVnv(vd[5])));
+        PUTBACK;
+
+        call_sv(cmd,G_VOID);
+
+        FREETMPS;
+        LEAVE;
+        LEAVE_TLS_CONTEXT
+}
+
+void
+sdl_perl_tess_combine_callback ( GLdouble coords[3], double *vd[4], GLfloat weight[4], 
+       GLdouble **out, void *cb )
+{
+        SV *cmd;
+       double *data;
+       int width;
+        ENTER_TLS_CONTEXT
+       dSP;
+
+        cmd = (SV*)cb;
+
+        ENTER;
+        SAVETMPS;
+        PUSHMARK(SP);
+       XPUSHs(sv_2mortal(newSViv(GLU_TESS_COMBINE)));
+       XPUSHs(sv_2mortal(newSVpvn((char*)coords,sizeof(GLdouble)*3)));
+       XPUSHs(sv_2mortal(newSVpvn((char*)vd,sizeof(GLdouble*)*4)));
+       XPUSHs(sv_2mortal(newSVpvn((char*)weight,sizeof(GLfloat)*4)));
+        PUTBACK;
+
+        if ( 1 != call_sv(cmd,G_SCALAR) ) {
+               Perl_croak(aTHX_ "sdl_perl_tess_combine_callback failed");
+       }
+
+       data = (double*)POPp;
+       width = (int)POPi;
+       *out = (double*)malloc(sizeof(double)*width);
+       memcpy(*out,data,sizeof(double)*width);
+
+        FREETMPS;
+        LEAVE;
+        LEAVE_TLS_CONTEXT
+}
+
+MODULE = SDL::OpenGL           PACKAGE = SDL::OpenGL
+PROTOTYPES : DISABLE
+
+#ifdef HAVE_GL
+
+void
+glClearColor ( r, g, b, a)
+       double r
+       double g
+       double b
+       double a
+       CODE:
+               glClearColor((GLfloat)r,(GLfloat)g,(GLfloat)b,(GLfloat)a);
+
+void
+glClearIndex ( index )
+       double index
+       CODE:
+               glClearIndex(index);
+
+void
+glClearDepth ( depth )
+       double depth
+       CODE:
+               glClearDepth(depth);
+
+void
+glClearStencil ( s )
+       int s
+       CODE:
+               glClearStencil(s);
+
+void
+glClearAccum ( r, g, b, a )
+       double r
+       double g
+       double b
+       double a
+       CODE:
+               glClearAccum((GLfloat)r,(GLfloat)g,(GLfloat)b,(GLfloat)a);
+
+void
+glClear ( m )
+       GLbitfield m
+       CODE:
+               glClear(m);
+
+void
+glFlush ()
+       CODE:
+               glFlush();
+
+void
+glFinish ()
+       CODE:
+               glFinish();
+
+void
+glRect ( r )
+       SDL_Rect* r
+       CODE:
+               glRecti(r->x,r->y,r->x+r->w,r->y+r->h);
+
+void
+glVertex ( x, y, ... )
+       double x
+       double y
+       CODE:
+               double z,w;
+               if ( items == 4 ) {
+                       w = SvNV(ST(3));
+                       z = SvNV(ST(2));
+                       glVertex4d(x,y,z,w);    
+               } else if ( items == 3 ) {
+                       z = SvNV(ST(2));
+                       glVertex3d(x,y,z);      
+               } else {
+                       glVertex2d(x,y);
+               }
+               
+void
+glBegin ( mode )
+       GLenum mode
+       CODE:
+               glBegin(mode);
+
+void
+glEnd ()
+       CODE:
+               glEnd();
+
+void
+glEnable ( cap )
+       GLenum cap
+       CODE:
+               glEnable(cap);
+
+void
+glDisable ( cap )
+       GLenum cap
+       CODE:
+               glDisable(cap);
+
+void 
+glGet ( param )
+        GLenum param
+    PPCODE:
+        switch (param) {
+        case GL_EDGE_FLAG_ARRAY:
+        case GL_MAP1_TEXTURE_COORD_1:
+        case GL_LIGHT_MODEL_TWO_SIDE:
+        case GL_INDEX_LOGIC_OP:
+        case GL_PACK_ALIGNMENT:
+        case GL_CLIP_PLANE4:
+        case GL_TEXTURE_GEN_S:
+        case GL_MAP1_VERTEX_3:
+        case GL_LIGHT6:
+        case GL_LIGHT0:
+        case GL_NORMAL_ARRAY:
+        case GL_EDGE_FLAG:
+        case GL_INDEX_ARRAY:
+        case GL_AUTO_NORMAL:
+        case GL_POLYGON_OFFSET_FILL:
+        case GL_MAP1_TEXTURE_COORD_4:
+        case GL_FOG:
+        case GL_LIGHT2:
+        case GL_UNPACK_SWAP_BYTES:
+        case GL_RGBA_MODE:
+        case GL_POLYGON_OFFSET_POINT:
+        case GL_POINT_SMOOTH:
+        case GL_ALPHA_TEST:
+        case GL_MAP2_TEXTURE_COORD_4:
+        case GL_COLOR_ARRAY:
+        case GL_POLYGON_OFFSET_LINE:
+        case GL_MAP2_NORMAL:
+        case GL_MAP1_INDEX:
+        case GL_PACK_LSB_FIRST:
+        case GL_MAP1_TEXTURE_COORD_2:
+        case GL_MAP2_VERTEX_3:
+        case GL_MAP2_TEXTURE_COORD_2:
+        case GL_CULL_FACE:
+        case GL_DOUBLEBUFFER:
+        case GL_UNPACK_LSB_FIRST:
+        case GL_TEXTURE_COORD_ARRAY:
+        case GL_LIGHT1:
+        case GL_TEXTURE_GEN_Q:
+        case GL_MAP_STENCIL:
+        case GL_TEXTURE_1D:
+        case GL_LIGHT4:
+        case GL_LIGHTING:
+        case GL_LIGHT7:
+        case GL_MAP1_NORMAL:
+        case GL_CLIP_PLANE0:
+        case GL_TEXTURE_GEN_R:
+        case GL_PACK_SWAP_BYTES:
+        case GL_DEPTH_WRITEMASK:
+        case GL_COLOR_LOGIC_OP:
+        case GL_CLIP_PLANE5:
+        case GL_NORMALIZE:
+        case GL_TEXTURE_2D:
+        case GL_CLIP_PLANE3:
+        case GL_COLOR_MATERIAL:
+        case GL_BLEND:
+        case GL_CLIP_PLANE2:
+        case GL_MAP1_VERTEX_4:
+        case GL_DITHER:
+        case GL_CLIP_PLANE1:
+        case GL_MAP2_INDEX:
+        case GL_POLYGON_SMOOTH:
+        case GL_STEREO:
+        case GL_MAP2_COLOR_4:
+        case GL_LIGHT3:
+        case GL_VERTEX_ARRAY:
+        case GL_MAP1_TEXTURE_COORD_3:
+        case GL_STENCIL_TEST:
+        case GL_MAP2_TEXTURE_COORD_3:
+        case GL_TEXTURE_GEN_T:
+        case GL_LIGHT_MODEL_LOCAL_VIEWER:
+        case GL_LINE_SMOOTH:
+        case GL_MAP1_COLOR_4:
+        case GL_MAP2_TEXTURE_COORD_1:
+        case GL_CURRENT_RASTER_POSITION_VALID:
+        case GL_INDEX_MODE:
+        case GL_SCISSOR_TEST:
+        case GL_MAP_COLOR:
+        case GL_POLYGON_STIPPLE:
+        case GL_LIGHT5:
+        case GL_DEPTH_TEST:
+        case GL_LINE_STIPPLE:
+        case GL_MAP2_VERTEX_4:
+        {
+            GLboolean ret[1];
+            int i;
+            glGetBooleanv(param, ret);
+
+            for (i = 0; i < 1; i++) {
+                XPUSHs(sv_2mortal(newSViv(ret[i])));
+            }
+            break;
+        }
+        case GL_COLOR_WRITEMASK:
+        {
+            GLboolean ret[4];
+            int i;
+            glGetBooleanv(param, ret);
+
+            for (i = 0; i < 4; i++) {
+                XPUSHs(sv_2mortal(newSViv(ret[i])));
+            }
+            break;
+        }
+        case GL_ZOOM_Y:
+        case GL_ALPHA_TEST_REF:
+        case GL_POINT_SIZE_GRANULARITY:
+        case GL_CURRENT_RASTER_DISTANCE:
+        case GL_ALPHA_SCALE:
+        case GL_RED_BIAS:
+        case GL_DEPTH_BIAS:
+        case GL_FOG_DENSITY:
+        case GL_GREEN_BIAS:
+        case GL_DEPTH_CLEAR_VALUE:
+        case GL_ALPHA_BIAS:
+        case GL_FOG_END:
+        case GL_GREEN_SCALE:
+        case GL_BLUE_BIAS:
+        case GL_DEPTH_SCALE:
+        case GL_POINT_SIZE:
+        case GL_POLYGON_OFFSET_FACTOR:
+        case GL_ZOOM_X:
+        case GL_FOG_START:
+        case GL_POLYGON_OFFSET_UNITS:
+        case GL_LINE_WIDTH:
+        case GL_LINE_WIDTH_GRANULARITY:
+        case GL_BLUE_SCALE:
+        case GL_RED_SCALE:
+        {
+            GLdouble ret[1];
+            int i;
+            glGetDoublev(param, ret);
+
+            for (i = 0; i < 1; i++) {
+                XPUSHs(sv_2mortal(newSVnv(ret[i])));
+            }
+            break;
+        }
+        case GL_MODELVIEW_MATRIX:
+        case GL_TEXTURE_MATRIX:
+        case GL_PROJECTION_MATRIX:
+        {
+            GLdouble ret[16];
+            int i;
+            glGetDoublev(param, ret);
+
+            for (i = 0; i < 16; i++) {
+                XPUSHs(sv_2mortal(newSVnv(ret[i])));
+            }
+            break;
+        }
+        case GL_POINT_SIZE_RANGE:
+        case GL_LINE_WIDTH_RANGE:
+        case GL_MAP1_GRID_DOMAIN:
+        case GL_DEPTH_RANGE:
+        {
+            GLdouble ret[2];
+            int i;
+            glGetDoublev(param, ret);
+
+            for (i = 0; i < 2; i++) {
+                XPUSHs(sv_2mortal(newSVnv(ret[i])));
+            }
+            break;
+        }
+        case GL_CURRENT_NORMAL:
+        {
+            GLdouble ret[3];
+            int i;
+            glGetDoublev(param, ret);
+
+            for (i = 0; i < 3; i++) {
+                XPUSHs(sv_2mortal(newSVnv(ret[i])));
+            }
+            break;
+        }
+        case GL_FOG_COLOR:
+        case GL_MAP2_GRID_DOMAIN:
+        case GL_CURRENT_RASTER_POSITION:
+        case GL_CURRENT_COLOR:
+        case GL_LIGHT_MODEL_AMBIENT:
+        case GL_CURRENT_RASTER_TEXTURE_COORDS:
+        case GL_TEXTURE_ENV_COLOR:
+        case GL_CURRENT_RASTER_COLOR:
+        case GL_CURRENT_TEXTURE_COORDS:
+        case GL_COLOR_CLEAR_VALUE:
+        case GL_ACCUM_CLEAR_VALUE:
+        {
+            GLdouble ret[4];
+            int i;
+            glGetDoublev(param, ret);
+
+            for (i = 0; i < 4; i++) {
+                XPUSHs(sv_2mortal(newSVnv(ret[i])));
+            }
+            break;
+        }
+        case GL_CULL_FACE_MODE:
+        case GL_PIXEL_MAP_I_TO_A_SIZE:
+        case GL_PIXEL_MAP_A_TO_A_SIZE:
+        case GL_BLUE_BITS:
+        case GL_EDGE_FLAG_ARRAY_STRIDE:
+        case GL_RENDER_MODE:
+        case GL_FOG_MODE:
+        case GL_DEPTH_FUNC:
+        case GL_READ_BUFFER:
+        case GL_POINT_SMOOTH_HINT:
+        case GL_PACK_SKIP_PIXELS:
+        case GL_STENCIL_REF:
+        case GL_STENCIL_CLEAR_VALUE:
+        case GL_AUX_BUFFERS:
+        case GL_COLOR_MATERIAL_PARAMETER:
+        case GL_ACCUM_BLUE_BITS:
+        case GL_INDEX_SHIFT:
+        case GL_VERTEX_ARRAY_STRIDE:
+        case GL_STENCIL_PASS_DEPTH_PASS:
+        case GL_CLIENT_ATTRIB_STACK_DEPTH:
+        case GL_DRAW_BUFFER:
+        case GL_LINE_STIPPLE_REPEAT:
+        case GL_BLEND_SRC:
+        case GL_PIXEL_MAP_B_TO_B_SIZE:
+        case GL_MAX_PIXEL_MAP_TABLE:
+        case GL_MAX_TEXTURE_SIZE:
+        case GL_PIXEL_MAP_S_TO_S_SIZE:
+        case GL_LOGIC_OP_MODE:
+        case GL_DEPTH_BITS:
+        case GL_GREEN_BITS:
+        case GL_LINE_SMOOTH_HINT:
+        case GL_ALPHA_TEST_FUNC:
+        case GL_MAX_LIGHTS:
+        case GL_FOG_HINT:
+        case GL_MAX_NAME_STACK_DEPTH:
+        case GL_INDEX_ARRAY_TYPE:
+        case GL_TEXTURE_COORD_ARRAY_TYPE:
+        case GL_COLOR_ARRAY_TYPE:
+        case GL_MAX_LIST_NESTING:
+        case GL_STENCIL_WRITEMASK:
+        case GL_LIST_BASE:
+        case GL_ACCUM_ALPHA_BITS:
+        case GL_INDEX_ARRAY_STRIDE:
+        case GL_PIXEL_MAP_I_TO_B_SIZE:
+        case GL_INDEX_BITS:
+        case GL_STENCIL_FAIL:
+        case GL_UNPACK_ALIGNMENT:
+        case GL_STENCIL_PASS_DEPTH_FAIL:
+        case GL_ATTRIB_STACK_DEPTH:
+        case GL_PACK_SKIP_ROWS:
+        case GL_TEXTURE_STACK_DEPTH:
+        case GL_MATRIX_MODE:
+        case GL_COLOR_ARRAY_STRIDE:
+        case GL_LIST_MODE:
+        case GL_UNPACK_SKIP_PIXELS:
+        case GL_PIXEL_MAP_G_TO_G_SIZE:
+        case GL_VERTEX_ARRAY_TYPE:
+        case GL_RED_BITS:
+        case GL_MAX_CLIENT_ATTRIB_STACK_DEPTH:
+        case GL_INDEX_CLEAR_VALUE:
+        case GL_PIXEL_MAP_I_TO_G_SIZE:
+        case GL_ALPHA_BITS:
+        case GL_PIXEL_MAP_I_TO_R_SIZE:
+        case GL_COLOR_ARRAY_SIZE:
+        case GL_TEXTURE_COORD_ARRAY_SIZE:
+        case GL_MAP1_GRID_SEGMENTS:
+        case GL_VERTEX_ARRAY_SIZE:
+        case GL_PIXEL_MAP_R_TO_R_SIZE:
+        case GL_TEXTURE_COORD_ARRAY_STRIDE:
+        case GL_MODELVIEW_STACK_DEPTH:
+        case GL_MAX_TEXTURE_STACK_DEPTH:
+        case GL_PIXEL_MAP_I_TO_I_SIZE:
+        case GL_FOG_INDEX:
+        case GL_INDEX_WRITEMASK:
+        case GL_PACK_ROW_LENGTH:
+        case GL_CURRENT_INDEX:
+        case GL_STENCIL_VALUE_MASK:
+        case GL_UNPACK_SKIP_ROWS:
+        case GL_MAX_PROJECTION_STACK_DEPTH:
+        case GL_LIST_INDEX:
+        case GL_STENCIL_FUNC:
+        case GL_INDEX_OFFSET:
+        case GL_UNPACK_ROW_LENGTH:
+        case GL_COLOR_MATERIAL_FACE:
+        case GL_NORMAL_ARRAY_TYPE:
+        case GL_STENCIL_BITS:
+        case GL_PROJECTION_STACK_DEPTH:
+        case GL_CURRENT_RASTER_INDEX:
+        case GL_SHADE_MODEL:
+        case GL_TEXTURE_ENV_MODE:
+        case GL_NORMAL_ARRAY_STRIDE:
+        case GL_PERSPECTIVE_CORRECTION_HINT:
+        case GL_MAX_CLIP_PLANES:
+        case GL_MAX_MODELVIEW_STACK_DEPTH:
+        case GL_SUBPIXEL_BITS:
+        case GL_ACCUM_RED_BITS:
+        case GL_BLEND_DST:
+        case GL_FRONT_FACE:
+        case GL_MAX_EVAL_ORDER:
+        case GL_LINE_STIPPLE_PATTERN:
+        case GL_NAME_STACK_DEPTH:
+        case GL_MAX_ATTRIB_STACK_DEPTH:
+        case GL_POLYGON_SMOOTH_HINT:
+        case GL_ACCUM_GREEN_BITS:
+        {
+            GLint ret[1];
+            int i;
+            glGetIntegerv(param, ret);
+
+            for (i = 0; i < 1; i++) {
+                XPUSHs(sv_2mortal(newSViv(ret[i]))); 
+            }
+            break;
+        }
+        case GL_POLYGON_MODE:
+        case GL_MAX_VIEWPORT_DIMS:
+        case GL_MAP2_GRID_SEGMENTS:
+        {
+            GLint ret[2];
+            int i;
+            glGetIntegerv(param, ret);
+
+            for (i = 0; i < 2; i++) {
+                XPUSHs(sv_2mortal(newSViv(ret[i]))); 
+            }
+            break;
+        }
+        case GL_SCISSOR_BOX:
+        case GL_VIEWPORT:
+        {
+            GLint ret[4];
+            int i;
+            glGetIntegerv(param, ret);
+
+            for (i = 0; i < 4; i++) {
+                XPUSHs(sv_2mortal(newSViv(ret[i]))); 
+            }
+            break;
+        }
+        default:
+            croak("Unknown glGet parameter!");
+        }
+
+
+Uint32
+glIsEnabled ( cap )
+       Uint32 cap
+       CODE:
+               RETVAL = glIsEnabled(cap);
+       OUTPUT:
+               RETVAL
+
+void
+glPointSize ( size )
+       double size
+       CODE:
+               glPointSize((GLfloat)size);
+
+void
+glLineWidth ( size )
+       double size
+       CODE:
+               glLineWidth((GLfloat)size);
+
+void
+glLineStipple ( factor, pattern )
+       Sint32 factor
+       Uint16 pattern
+       CODE:
+               glLineStipple(factor,pattern);
+
+void
+glPolygonMode ( face, mode )
+       GLenum face
+       GLenum mode
+       CODE:
+               glPolygonMode(face,mode);
+
+void
+glFrontFace ( mode )
+       GLenum mode
+       CODE:
+               glFrontFace(mode);
+
+void
+glCullFace ( mode )
+       GLenum mode
+       CODE:
+               glCullFace(mode);
+
+void
+glPolygonStipple ( mask )
+       char *mask
+       CODE:
+               glPolygonStipple(mask);
+
+void
+glEdgeFlag ( flag )
+       GLenum flag
+       CODE:
+               glEdgeFlag(flag);
+
+void
+glNormal ( x, y, z )
+       double x
+       double y
+       double z
+       CODE:
+               glNormal3d(x,y,z);
+
+void
+glEnableClientState ( array )
+       GLenum array
+       CODE:
+               glEnableClientState(array);
+
+void
+glDisableClientState ( array )
+       GLenum array
+       CODE:
+               glDisableClientState(array);
+
+void
+glVertexPointer ( size, type, stride, pointer)
+       int size
+       GLenum type
+       Uint32 stride
+       char *pointer
+       CODE:
+               glVertexPointer(size,type,stride,pointer);
+
+void
+glColorPointer ( size, type, stride, pointer )
+       Sint32 size
+       GLenum type
+       Uint32 stride
+       char *pointer
+       CODE:
+               glColorPointer(size,type,stride,pointer);
+
+void
+glNormalPointer ( type, stride, pointer )
+       GLenum type
+       Uint32 stride
+       char *pointer
+       CODE:
+               glNormalPointer(type,stride,pointer);
+
+void
+glTexCoordPointer ( size, type, stride, pointer )
+       Sint32 size
+       GLenum type
+       Uint32 stride
+       char *pointer
+       CODE:
+               glTexCoordPointer(size,type,stride,pointer);
+
+void
+glEdgeFlagPointer ( stride, pointer )
+       Uint32 stride
+       char *pointer
+       CODE:
+               glEdgeFlagPointer(stride,pointer);
+
+void
+glArrayElement ( ith )
+       Uint32 ith
+       CODE:
+               glArrayElement(ith);
+
+void
+glDrawElements ( mode, count, type, indices )
+       GLenum mode
+       Uint32 count
+       GLenum type
+       char *indices
+       CODE:
+               glDrawElements( mode, count, type, indices);
+
+void
+glDrawRangeElements ( mode, start, end, count, type, indices )
+       GLenum mode
+       Uint32 start
+       Uint32 end
+       Uint32 count
+       GLenum type
+       char *indices
+       CODE:
+               glDrawRangeElements(mode,start,end,count,type,indices);
+
+void
+glDrawArrays ( mode, first, count )
+       GLenum mode
+       Uint32 first
+       Uint32 count
+       CODE:
+               glDrawArrays(mode,first,count);
+
+void
+glInterleavedArrays ( format, stride, pointer )
+       GLenum format
+       Uint32 stride
+       char *pointer
+       CODE:
+               glInterleavedArrays(format,stride,pointer);
+
+void
+glPushAttrib ( mask )
+       GLbitfield mask
+       CODE:
+               glPushAttrib(mask);
+
+void
+glPopAttrib ()
+       CODE:
+               glPopAttrib();
+
+void
+glPushClientAttrib ( mask )
+       GLbitfield mask
+       CODE:
+               glPushClientAttrib(mask);
+
+void
+glPopClientAttrib ()
+       CODE:
+               glPopClientAttrib();
+
+void
+glMatrixMode ( mode )
+       GLenum mode
+       CODE:
+               glMatrixMode(mode);
+
+void
+glLoadIdentity ()
+       CODE:
+               glLoadIdentity();
+
+void
+glLoadMatrix (  ... )
+       CODE:
+               int i;
+               double mat[16];
+               for ( i = 0; i < 16; i++ ) {
+                       mat[i] = (i < items  && SvNOK(ST(i)) ? SvNV(ST(i)) : 0.0 );
+               }
+               glLoadMatrixd(mat);
+
+void
+glMultMatrix ( ... )
+       CODE:
+               int i;
+               double mat[16];
+               for ( i = 0; i < 16; i++ ) {
+                       mat[i] = (i < items  && SvNOK(ST(i)) ? SvNV(ST(i)) : 0.0 );
+               }
+               glMultMatrixd(mat);
+
+void
+glTranslate ( x, y, z )
+       double x
+       double y
+       double z
+       CODE:
+               glTranslated(x,y,z);
+
+void
+glRotate ( angle, x, y, z )
+       double angle
+       double x
+       double y
+       double z
+       CODE:
+               glRotated(angle,x,y,z);
+
+void
+glScale ( x, y, z )
+       double x
+       double y
+       double z
+       CODE:
+               glScaled(x,y,z);
+
+void
+glFrustum ( left, right, bottom, top, n, f )
+       double left
+       double right
+       double bottom
+       double top
+       double n
+       double f
+       CODE:
+               glFrustum(left,right,bottom,top,n,f);
+
+void
+glOrtho ( left, right, bottom, top, n, f )
+       double left
+       double right
+       double bottom
+       double top
+       double n
+       double f
+       CODE:
+               glOrtho(left,right,bottom,top,n,f);
+
+void
+glViewport ( x, y, width, height )
+       Sint32 x
+       Sint32 y
+       Uint32 width
+       Uint32 height
+       CODE:
+               glViewport(x,y,width,height);
+
+void
+glDepthRange ( n, f )
+       double n
+       double f
+       CODE:
+               glDepthRange(n,f);
+
+void
+glPushMatrix ()
+       CODE:
+               glPushMatrix();
+
+void
+glPopMatrix ()
+       CODE:
+               glPopMatrix();
+
+void
+glClipPlane ( plane, ... )
+       GLenum plane
+       CODE:
+               double v[4];
+               int i;
+               for (i = 0; i < 4; i++ ) {
+                       v[i] = (i+1 < items && SvNOK(ST(i+1))) ? SvNV(ST(i+1)) : 0.0;
+               }
+               glClipPlane(plane,v);
+       
+void
+glColor ( r, g, b, ... )
+       double r        
+       double g
+       double b        
+       CODE:
+               if ( items == 4 ) {
+                       double a;
+                       a = SvNV(ST(3));
+                       glColor4d(r,g,b,a);
+               } else {
+                       glColor3d(r,g,b);       
+               }
+
+void
+glIndex ( c )
+       Uint32 c
+       CODE:
+               glIndexi(c);
+
+void
+glShadeModel ( mode )
+       GLenum mode
+       CODE:
+               glShadeModel(mode);
+
+void
+glLight ( light, name, ... )
+       GLenum light
+       GLenum name
+       CODE:
+               int i;
+               if ( items == 6 ) {
+                       float v[4];     
+                       for ( i = 0; i < 4; i++ ) {
+                               v[i] = (SvNOK(ST(i+2))) ? SvNV(ST(i+2)) : 0.0;
+                       }
+                       glLightfv(light,name,v);        
+               } else if ( items == 5 ) {
+                       float v[3];
+                       for ( i = 0; i < 3; i++ ) {
+                               v[i] = (SvNOK(ST(i+2))) ? SvNV(ST(i+2)) : 0.0;
+                       }
+                       glLightfv(light,name,v);        
+               } else if ( items == 3 ) {
+                       float v;
+                       v = SvNV(ST(2));
+                       glLightf(light,name,v);
+               } else {
+                       Perl_croak(aTHX_ "SDL::OpenGL::Light invalid arguments");
+               }
+
+void 
+glLightModel ( pname, ... )
+       GLenum pname
+       CODE:
+               GLfloat vec[4];
+               if ( pname == GL_LIGHT_MODEL_LOCAL_VIEWER ||
+                       pname == GL_LIGHT_MODEL_TWO_SIDE ||
+                       pname == GL_LIGHT_MODEL_COLOR_CONTROL ) {
+                       glLightModelf(pname,SvNV(ST(1)));
+               } else if ( pname == GL_LIGHT_MODEL_AMBIENT) {
+                       vec[0] = SvNV(ST(1));
+                       vec[1] = SvNV(ST(2));
+                       vec[2] = SvNV(ST(3));
+                       vec[3] = SvNV(ST(4));
+                       glLightModelfv(pname,vec);
+               } else {
+                       Perl_croak(aTHX_ "SDL::OpenGL::glLightModel unknown model %d",pname);
+               }
+
+void
+glMaterial ( face, name, ... )
+       GLenum face
+       GLenum name
+       CODE:
+               int i;
+               if ( items == 6 ) {
+                       float v[4];
+                       for ( i = 0; i < 4; i++ ) {
+                               v[i] = (SvNOK(ST(i+2))) ? SvNV(ST(i+2)) : 0.0;
+                       }
+                       glMaterialfv(face,name,v);
+               } else if ( items == 5 ) {
+                       float v[3];
+                       for ( i = 0; i < 4; i++ ) {
+                               v[i] = (SvNOK(ST(i+2))) ? SvNV(ST(i+2)) : 0.0;
+                       }
+                       glMaterialfv(face,name,v);
+               } else if ( items == 3 ) {      
+                       float v;
+                       v = SvNV(ST(2));
+                       glMaterialf(face,name,v);
+               } else {
+                       Perl_croak(aTHX_ "SDL::OpenGL::Material invalid arguments");
+               }
+
+void
+glColorMaterial ( face, mode )
+       GLenum face
+       GLenum mode
+       CODE:
+               glColorMaterial(face,mode);
+
+void
+glBlendFunc ( sfactor, dfactor )
+       GLenum sfactor
+       GLenum dfactor
+       CODE:
+               glBlendFunc(sfactor,dfactor);
+
+
+void
+glHint ( target, hint )
+       GLenum target
+       GLenum hint
+       CODE:
+               glHint(target,hint);    
+
+void
+glFog ( name, ... )
+       GLenum name
+       CODE:
+               if ( items == 5 )  {
+                       float v[4];
+                       v[0] = SvNV(ST(1));     
+                       v[1] = SvNV(ST(2));     
+                       v[2] = SvNV(ST(3));     
+                       v[3] = SvNV(ST(4));     
+                       glFogfv(name,v);
+               } else if ( items == 2 ) {
+                       float v;
+                       v = SvNV(ST(1));
+                       glFogf(name,v);
+               } else {
+                       Perl_croak(aTHX_ "SDL::OpenGL::Material invalid arguments");
+               }
+
+void
+glPolygonOffset ( factor, units )
+       double factor
+       double units
+       CODE:
+               glPolygonOffset(factor,units);
+
+Uint32
+glGenLists ( range )
+       Uint32 range
+       CODE:
+               RETVAL = glGenLists(range);
+       OUTPUT:
+               RETVAL
+
+void
+glNewList ( list, mode )
+       Uint32 list
+       GLenum mode
+       CODE:
+               glNewList(list,mode);
+
+void
+glEndList ()
+       CODE:
+               glEndList();
+
+void
+glDeleteLists ( base, count )
+        Uint32 base
+        Uint32 count
+        CODE:
+                glDeleteLists(base, count);
+
+void
+glCallList ( list )
+       Uint32 list
+       CODE:
+               glCallList(list);
+
+Uint32
+glIsList ( list )
+       Uint32 list
+       CODE:
+               RETVAL = glIsList(list);
+       OUTPUT:
+               RETVAL
+
+void
+glListBase ( base )
+       Uint32 base
+       CODE:
+               glListBase(base);
+
+void
+glCallLists ( ... )
+       CODE:
+               int *i, j;      
+               if ( items > 0 ) {
+                       i = (int*)safemalloc(sizeof(int)* (items));
+                       for ( j = 0; j < items; j++ ) {
+                               i[j] = SvIV(ST(j));
+                       } 
+               } else {
+                       Perl_croak(aTHX_ "usage: SDL::OpenGL::CallLists(type,...)");
+               }
+               glCallLists(items, GL_INT, i);
+               safefree(i);
+
+void
+glCallListsString ( string )
+       SV* string
+       CODE:
+               char *str;
+               STRLEN len;
+               str = SvPV(string,len);
+               glCallLists(len,GL_BYTE,str);
+
+void
+glRasterPos ( x, y, z, ... )
+       double x
+       double y
+       double z
+       CODE:
+               if ( items == 4 ) {
+                       double w = SvNV(ST(3));
+                       glRasterPos4d(x,y,z,w);
+               } else {
+                       glRasterPos3d(x,y,z);
+               }
+
+void
+glBitmap ( width, height, x1, y1, x2, y2, data )
+       Uint32 width
+       Uint32 height
+       double x1
+       double y1
+       double x2
+       double y2
+       char *data
+       CODE:
+               glBitmap(width,height,x1,y1,x2,y2,data);
+
+void
+glDrawPixels ( width, height, format, type, pixels )
+       Uint32 width
+       Uint32 height
+       GLenum format
+       GLenum type
+       char *pixels
+       CODE:
+               glDrawPixels(width,height,format,type,pixels);
+
+
+SV*
+glReadPixels ( x, y, width, height, format, type )
+        Uint32 x
+        Uint32 y
+        Uint32 height
+        Uint32 width
+        GLenum format
+        GLenum type
+        CODE:
+                int len, size;
+                char *buf;
+                size = 1;       /* ALPHA, BLUE, GREEN or RED */
+                if (format == GL_BGR || format == GL_RGB) 
+                        size = 3;
+                if (format == GL_BGRA || format == GL_RGBA) 
+                        size = 4;
+                len = height * width * size;            /* in bytes */
+                RETVAL = newSV(len);                    /* alloc len+1 bytes */
+                SvPOK_on(RETVAL);                       /* make an PV */
+                buf = SvPVX(RETVAL);                    /* get ptr to buffer */
+                glReadPixels(x,y,width,height,format,type,buf);
+                SvCUR_set(RETVAL, len);                 /* set real length */
+        OUTPUT:
+                RETVAL
+                                                                                                                                                            
+AV*
+glReadPixel ( x, y )
+        Uint32 x
+        Uint32 y
+        CODE:
+                int rgba[4];    /* r,g,b,a */
+                int i;
+                glReadPixels(x,y,1,1,GL_RGBA,GL_UNSIGNED_INT,rgba);
+                RETVAL = newAV();
+                for ( i = 0; i < 4; i++ ) {
+                        av_push(RETVAL,newSViv(rgba[i]));
+                }
+        OUTPUT:
+                RETVAL
+
+void
+glCopyPixels ( x, y, width, height, buffer )
+       Sint32 x
+       Sint32 y
+       Uint32 width
+       Uint32 height
+       GLenum buffer
+       CODE:
+               glCopyPixels(x,y,width,height,buffer);
+
+void
+glPixelStore ( name, param )
+       Sint32 name
+       double param
+       CODE:
+               glPixelStorei(name,param);
+
+void
+glPixelTransfer ( name, ... )
+       GLenum name
+       CODE:
+               switch ( name ) {
+                       case GL_MAP_COLOR:
+                       case GL_MAP_STENCIL:
+                       case GL_INDEX_SHIFT:
+                       case GL_INDEX_OFFSET:
+                               glPixelTransferi(name,SvIV(ST(1)));
+                               break;
+                       default:
+                               glPixelTransferf(name,SvNV(ST(1)));
+                               break;
+               }
+
+void
+glPixelMap ( type, map, mapsize, values )
+       GLenum type
+       GLenum map
+       Sint32 mapsize
+       char *values
+       CODE:
+               switch (type) {
+                       case GL_UNSIGNED_INT: 
+                               glPixelMapuiv(map,mapsize,(GLint*)values);
+                               break;
+                       case GL_UNSIGNED_SHORT:
+                               glPixelMapusv(map,mapsize,(GLushort*)values);
+                               break;
+                       case GL_FLOAT:
+                               glPixelMapfv(map,mapsize,(GLfloat*)values);
+                               break;
+               }
+               
+void
+glPixelZoom ( zoomx, zoomy )
+       double zoomx
+       double zoomy
+       CODE:
+               glPixelZoom(zoomx,zoomy);
+
+#ifdef GL_VERSION_1_3
+
+void
+glColorTable ( target, internalFormat, width, format, type, data )
+       GLenum target 
+       GLenum internalFormat
+       Uint32 width
+       GLenum format
+       GLenum type
+       char *data
+       CODE:
+               glColorTable(target,internalFormat,width,format,type,data);
+
+void
+glColorTableParameter ( target, name, r, g, b, a)
+       GLenum target
+       GLenum name
+       double r
+       double g
+       double b
+       double a
+       CODE:
+               GLfloat vec[4];
+               vec[0] = r;
+               vec[1] = g;
+               vec[2] = b;
+               vec[3] = a;
+               glColorTableParameterfv(target,name,vec);
+
+void
+glCopyColorTable ( target, internalFormat, x, y, width )
+       GLenum target
+       GLenum internalFormat
+       Sint32 x
+       Sint32 y
+       Uint32 width
+       CODE:
+               glCopyColorTable(target,internalFormat,x,y,width);
+
+void
+glColorSubTable ( target, start, count, format, type, data )
+       Uint32 target
+       Uint32 start
+       Uint32 count
+       Uint32 format
+       Uint32 type
+       char *data
+       CODE:
+               glColorSubTable(target,start,count,format,type,data);
+
+void
+glCopyColorSubTable ( target, start, x, y, count )
+       Uint32 target
+       Uint32 start
+       Sint32 x
+       Sint32 y
+       Uint32 count
+       CODE:
+               glCopyColorSubTable(target,start,x,y,count);
+
+void
+glConvolutionFilter2D ( target, internalFormat, width, height, format, type, image )
+       Uint32 target
+       Uint32 internalFormat
+       Uint32 width
+       Uint32 height
+       Uint32 format
+       Uint32 type
+       char *image
+       CODE:
+               glConvolutionFilter2D(target,internalFormat,width,height,format,type,image);
+
+void
+glCopyConvolutionFilter2D ( target, internalFormat, x, y, width, height )
+       Uint32 target
+       Uint32 internalFormat
+       Sint32 x
+       Sint32 y
+       Uint32 width
+       Uint32 height
+       CODE:
+               glCopyConvolutionFilter2D(target,internalFormat,x,y,width,height);
+
+void
+glSeparableFilter2D ( target, internalFormat, width, height, format, type, row, column )
+       Uint32 target
+       Uint32 internalFormat
+       Uint32 width
+       Uint32 height
+       Uint32 format
+       Uint32 type
+       char *row
+       char *column
+       CODE:
+               glSeparableFilter2D(target,internalFormat,width,height,format,type,row,column);
+
+void
+glConvolutionFilter1D ( target, internalFormat, width, format, type, image )
+       Uint32 target
+       Uint32 internalFormat
+       Uint32 width
+       Uint32 format
+       Uint32 type
+       char *image
+       CODE:
+               glConvolutionFilter1D(target,internalFormat,width,format,type,image);
+
+void
+glCopyConvolutionFilter1D ( target, internalFormat, x, y, width )
+       Uint32 target
+       Uint32 internalFormat
+       Sint32 x
+       Sint32 y
+       Uint32 width
+       CODE:
+               glCopyConvolutionFilter1D(target,internalFormat,x,y,width);
+
+void
+glConvolutionParameter ( target, pname, ... )
+       Uint32 target
+       Uint32 pname
+       CODE:
+               Uint32 pi;
+               GLfloat pv[4];
+               switch(pname) { 
+               case GL_CONVOLUTION_BORDER_MODE:
+                       if ( items != 3 ) 
+                               Perl_croak(aTHX_ "Usage: ConvolutionParameter(target,pname,...)");
+                       pi = SvIV(ST(2));
+                       glConvolutionParameteri(target,pname,pi);
+                       break;
+               case GL_CONVOLUTION_FILTER_SCALE:
+               case GL_CONVOLUTION_FILTER_BIAS:
+                       if ( items != 6 ) 
+                               Perl_croak(aTHX_ "Usage: ConvolutionParameter(target,pname,...)");
+                       pv[0] = (GLfloat)SvNV(ST(2));
+                       pv[1] = (GLfloat)SvNV(ST(3));
+                       pv[2] = (GLfloat)SvNV(ST(4));
+                       pv[3] = (GLfloat)SvNV(ST(5));
+                       glConvolutionParameterfv(target,pname,pv);
+                       break;
+               default:
+                       Perl_croak(aTHX_ "ConvolutionParameter invalid parameter");
+                       break;
+               }
+
+void 
+glHistogram ( target, width, internalFormat, sink )
+       Uint32 target
+       Uint32 width
+       Uint32 internalFormat
+       GLboolean sink
+       CODE:
+               glHistogram(target,width,internalFormat,sink);
+
+void
+glGetHistogram ( target, reset, format, type, values )
+       Uint32 target 
+       GLboolean reset
+       Uint32 format
+       Uint32 type
+       char *values
+       CODE:
+               glGetHistogram(target,reset,format,type,values);
+
+void
+glResetHistogram ( target )
+       Uint32 target
+       CODE:
+               glResetHistogram(target);
+
+void
+glMinmax ( target, internalFormat, sink )
+       Uint32 target
+       Uint32 internalFormat
+       GLboolean sink
+       CODE:
+               glMinmax(target,internalFormat,sink);
+
+void
+glGetMinmax ( target, reset, format, type, values )
+       Uint32 target
+       GLboolean reset
+       Uint32 format
+       Uint32 type
+       char *values
+       CODE:
+               glGetMinmax(target,reset,format,type,values);
+
+void
+glResetMinmax ( target )
+       Uint32 target
+       CODE:
+               glResetMinmax(target);
+
+void
+glBlendEquation ( mode )
+       Uint32 mode
+       CODE:
+               glBlendEquation(mode);
+
+#endif // GL_VERSION_1_3
+
+void
+glTexImage2D ( target, level, internalFormat, width, height, border, format, type, data )
+       GLenum target
+       Sint32 level
+       Sint32 internalFormat
+       Uint32 width
+       Uint32 height
+       Sint32 border
+       GLenum format
+       GLenum type
+       char *data
+       CODE:
+               glTexImage2D(target,level,internalFormat,width,height,border,format,type,data);
+       
+void
+glCopyTexImage2D ( target, level, internalFormat, x, y, width, height, border )
+       GLenum target
+       Sint32 level
+       Sint32 internalFormat
+       Sint32 x
+       Sint32 y
+       Uint32 width
+       Uint32 height
+       Sint32 border
+       CODE:
+               glCopyTexImage2D(target,level,internalFormat,x,y,width,height,border);
+
+void
+glTexSubImage2D ( target, level, xoffset, yoffset, width, height, format, type, data )
+       GLenum target
+       Sint32 level
+       Sint32 xoffset
+       Sint32 yoffset
+       Uint32 width
+       Uint32 height
+       GLenum format
+       GLenum type
+       char *data      
+       CODE:
+               glTexSubImage2D(target,level,xoffset,yoffset,width,height,format,type,data);
+
+void
+glCopyTexSubImage2D ( target, level, xoffset, yoffset, x, y, width, height )
+       GLenum target
+       Sint32 level
+       Sint32 xoffset
+       Sint32 yoffset
+       Sint32 x
+       Sint32 y
+       Uint32 width
+       Uint32 height
+       CODE:
+               glCopyTexSubImage2D(target,level,xoffset,yoffset,x,y,width,height);
+
+void
+glTexImage1D ( target, level, internalFormat, width, border, format, type, data )
+       GLenum target
+       Sint32 level
+       Sint32 internalFormat
+       Uint32 width
+       Sint32 border
+       GLenum format
+       GLenum type
+       char *data      
+       CODE:
+               glTexImage1D(target,level,internalFormat,width,border,format,type,data);        
+
+void
+glTexSubImage1D ( target, level, xoffset, width, format, type, data )
+       GLenum target
+       Sint32 level
+       Sint32 xoffset 
+       Uint32 width
+       GLenum format
+       GLenum type
+       char *data      
+       CODE:
+               glTexSubImage1D(target,level,xoffset,width,format,type,data);
+
+void
+glCopyTexImage1D ( target, level, internalFormat, x, y, width, border )
+       GLenum target
+       Sint32 level
+       Sint32 internalFormat
+       Sint32 x
+       Sint32 y
+       Uint32 width
+       Sint32 border
+       CODE:
+               glCopyTexImage1D(target,level,internalFormat,x,y,width,border);
+
+void
+glCopyTexSubImage1D ( target, level, xoffset, x, y, width )
+       GLenum target
+       Sint32 level
+       Sint32 xoffset
+       Sint32 x
+       Sint32 y
+       Uint32 width
+       CODE:
+               glCopyTexSubImage1D(target,level,xoffset,x,y,width);
+
+#ifdef GL_VERSION_1_3
+
+void
+glTexImage3D ( target, level, internalFormat, width, height, depth, border, format, type, data )
+       GLenum target
+       Sint32 level
+       Sint32 internalFormat
+       Uint32 width
+       Uint32 height
+       Uint32 depth
+       Sint32 border
+       GLenum format
+       GLenum type
+       char *data
+       CODE:
+               glTexImage3D(target,level,internalFormat,width,height,depth,border,format,type,data);
+
+void
+glTexSubImage3D ( target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, data )
+       GLenum target
+       Sint32 level
+       Sint32 xoffset
+       Sint32 yoffset
+       Sint32 zoffset
+       Uint32 width
+       Uint32 height
+       Uint32 depth
+       GLenum format
+       GLenum type
+       char *data
+       CODE:
+               glTexSubImage3D(target,level,xoffset,yoffset,zoffset,
+                       width,height,depth,format,type,data);
+
+void
+glCopyTexSubImage3D ( target, level, xoffset, yoffset, zoffset, x, y, width, height )
+       GLenum target
+       Sint32 level
+       Sint32 xoffset
+       Sint32 yoffset
+       Sint32 zoffset
+       Sint32 x
+       Sint32 y
+       Uint32 width
+       Uint32 height
+       CODE:
+               glCopyTexSubImage3D(target,level,xoffset,yoffset,zoffset,x,y,width,height);
+
+#endif // GL_VERSION_1_3
+
+AV*
+glGenTextures ( n )
+       Uint32 n;
+       CODE:
+               GLsizei i;
+               GLuint* names;
+               names = (GLuint*)safemalloc(sizeof(GLuint)*n);
+               RETVAL = newAV();
+               glGenTextures(n,names);
+               for ( i = 0; i < n; i++ ) {
+                       av_push(RETVAL,newSViv(names[i]));
+               }
+               safefree(names);
+       OUTPUT:
+               RETVAL
+
+GLboolean
+glIsTexture ( texture )
+       Uint32 texture
+       CODE:
+               RETVAL = glIsTexture(texture);
+       OUTPUT:
+               RETVAL
+
+void
+glBindTexture ( target, texture )
+       GLenum target
+       Uint32 texture
+       CODE:
+               glBindTexture(target,texture);
+
+void
+glDeleteTextures ( ... )
+       CODE:
+               GLuint* textures;
+               int i;
+               textures = (GLuint*)safemalloc(sizeof(GLuint) * items);
+               if ( textures ) {
+                       for ( i = 0; i < items; i++ ) {
+                               textures[i] = SvIV(ST(i));      
+                       }
+               }
+               glDeleteTextures(items,textures);
+               safefree(textures);
+                        
+AV*
+glAreTexturesResident ( ... )
+       CODE:
+               GLuint* textures;
+               GLboolean *homes;
+               int i;
+               RETVAL = newAV();
+               textures = (GLuint*)safemalloc(sizeof(GLuint) * items);
+               homes = (GLboolean*)safemalloc(sizeof(GLboolean) * items);
+               if ( textures ) {
+                       for ( i = 0; i < items; i++ ) {
+                               textures[i] = SvIV(ST(i));      
+                       }
+               }
+               if ( GL_FALSE != glAreTexturesResident(items,textures,homes)) {
+                       for (i = 0; i < items; i++ ) {
+                               av_push(RETVAL,newSViv(homes[i]));      
+                       }
+               }
+               safefree(homes);
+               safefree(textures);
+       OUTPUT:
+               RETVAL
+
+void
+glPrioritizeTextures ( n, names, priorities )
+       Uint32 n
+       char *names
+       char *priorities
+       CODE:
+               glPrioritizeTextures(n,(GLuint*)names,(const GLclampf *)priorities);
+
+void
+glTexEnv ( target, name, ... )
+       GLenum target
+       GLenum name
+       CODE:
+               float pv[4];
+               GLint p;        
+               switch(name) {
+                       case GL_TEXTURE_ENV_MODE:
+                               p = SvIV(ST(2));
+                               glTexEnvi(target,name,p);       
+                               break;
+                       case GL_TEXTURE_ENV_COLOR:
+                               pv[0] = SvNV(ST(2));
+                               pv[1] = SvNV(ST(3));
+                               pv[2] = SvNV(ST(4));
+                               pv[3] = SvNV(ST(5));
+                               glTexEnvfv(target,name,pv);
+                               break;
+               }
+
+void
+glTexCoord ( ... )
+       CODE:
+               double s,t,r,q;
+               if ( items < 1 || items > 4 ) 
+                       Perl_croak (aTHX_ "usage: SDL::OpenGL::TexCoord(s,[t,[r,[q]]])");
+               s = t = r = 0.0;
+               q = 1.0;
+               switch(items) {
+                       case 4:
+                               q = SvNV(ST(3)); 
+                       case 3:
+                               r = SvNV(ST(2)); 
+                       case 2:
+                               t = SvNV(ST(1)); 
+                       case 1:
+                               s = SvNV(ST(0));        
+               }
+               glTexCoord4d(s,t,r,q);
+
+void
+glTexParameter ( target, name, ... )
+       GLenum target
+       GLenum name
+       CODE:
+               GLfloat pv[4];
+               GLint p;
+               switch (name) {
+                       case GL_TEXTURE_BORDER_COLOR:
+                               pv[0] = SvNV(ST(2));
+                               pv[1] = SvNV(ST(3));
+                               pv[2] = SvNV(ST(4));
+                               pv[3] = SvNV(ST(5));
+                               glTexParameterfv(target,name,pv);
+                               break;
+                       case GL_TEXTURE_PRIORITY:
+                       case GL_TEXTURE_MIN_LOD:
+                       case GL_TEXTURE_MAX_LOD:
+                               pv[0] = SvNV(ST(2));
+                               glTexParameterf(target,name,pv[0]);     
+                               break;
+                       case GL_TEXTURE_BASE_LEVEL:
+                       case GL_TEXTURE_MAX_LEVEL:
+                       default:
+                               p = SvIV(ST(2));        
+                               glTexParameteri(target,name,p);
+                               break;
+               }
+
+void
+glTexGen ( coord, name, ... )
+       GLenum coord
+       GLenum name     
+       CODE:
+               GLdouble *pv;
+               GLint p;
+               int i;
+               switch (name) {
+                       case GL_TEXTURE_GEN_MODE:
+                               p = SvIV(ST(2));
+                               glTexGeni(coord,name,p);
+                               break;
+                       default:
+                               if ( items == 2 ) 
+                                       Perl_croak(aTHX_  "usage: glTexGen(coord,name,...)");
+                               pv = (GLdouble*)safemalloc(sizeof(GLdouble)*(items-2));
+                               for ( i = 0; i < items - 2; i++ ) {
+                                       pv[i] = SvNV(ST(i+2));  
+                               }
+                               glTexGendv(coord,name,pv);      
+                               safefree(pv);
+                               break;
+               }
+
+#ifdef GL_VERSION_1_3
+
+void
+glActiveTextureARB ( texUnit )
+       GLenum texUnit
+       CODE:
+               glActiveTextureARB(texUnit);
+                               
+void
+glMultiTexCoord ( texUnit,  ... )
+       Uint32 texUnit
+       CODE:
+               double s,t,r,q;
+               if ( items < 2 || items > 5 ) 
+                       Perl_croak (aTHX_ "usage: SDL::OpenGL::MultiTexCoord(tex,s,[t,[r,[q]]])");
+               s = t = r = 0.0;
+               q = 1.0;
+               switch(items) {
+                       case 5:
+                               q = SvNV(ST(3)); 
+                       case 4:
+                               r = SvNV(ST(2)); 
+                       case 3:
+                               t = SvNV(ST(1)); 
+                       case 2:
+                               s = SvNV(ST(0));        
+               }
+               glMultiTexCoord4dARB(texUnit,s,t,r,q);
+
+#endif // GL_VERSION_1_3
+
+void
+glDrawBuffer ( mode )
+       GLenum mode
+       CODE:
+               glDrawBuffer(mode);
+
+void
+glReadBuffer ( mode )
+       GLenum mode
+       CODE:
+               glReadBuffer(mode);
+
+void
+glIndexMask ( mask )
+       Uint32 mask
+       CODE:
+               glIndexMask(mask);
+
+void
+glColorMask ( red, green, blue, alpha )
+       GLboolean red
+       GLboolean green 
+       GLboolean blue 
+       GLboolean alpha 
+       CODE:
+               glColorMask(red,green,blue,alpha);
+
+void
+glDepthMask ( flag )
+       GLboolean flag
+       CODE:
+               glDepthMask(flag);
+
+void
+glStencilMask ( mask )
+       Uint32 mask
+       CODE:
+               glStencilMask(mask);
+
+void
+glScissor ( x , y, width, height )
+       Sint32 x
+       Sint32 y
+       Uint32 width
+       Uint32 height 
+       CODE:
+               glScissor(x,y,width,height);
+
+void
+glAlphaFunc ( func, ref )
+       GLenum func
+       double ref
+       CODE:
+               glAlphaFunc(func,ref);
+
+void
+glStencilFunc ( func, ref, mask )
+       GLenum func
+       Sint32 ref
+       Uint32 mask
+       CODE:
+               glStencilFunc(func,ref,mask);
+
+void
+glStencilOp ( fail, zfail, zpass )
+       GLenum fail
+       GLenum zfail
+       GLenum zpass
+       CODE:
+               glStencilOp(fail,zfail,zpass);
+
+void
+glDepthFunc ( func )
+       GLenum func
+       CODE:
+               glDepthFunc(func);
+
+void
+glLogicOp ( opcode )
+       GLenum opcode
+       CODE:
+               glLogicOp(opcode);
+
+void
+glAccum ( op, value )
+       GLenum op
+       double value
+       CODE:
+               glAccum(op,value);
+
+void
+glMap1 ( target, u1, u2, stride, order, points )
+       GLenum target
+       double u1
+       double u2
+       Sint32 stride
+       Sint32 order
+       char *points
+       CODE:
+               glMap1d(target,u1,u2,stride,order,(double*)points);
+
+void
+glEvalCoord1 ( u )
+       double u
+       CODE:
+               glEvalCoord1d(u);       
+
+void
+glMapGrid1 ( n, u1, u2 )
+       Sint32 n
+       double u1
+       double u2
+       CODE:
+               glMapGrid1d(n,u1,u2);
+
+void
+glEvalMesh1 ( mode, p1, p2 )
+       GLenum mode
+       Sint32 p1
+       Sint32 p2
+       CODE:
+               glEvalMesh1(mode,p1,p2);
+
+void
+glMap2 ( target, u1, u2, ustride, uorder, v1, v2, vstride, vorder, points )
+       GLenum target
+       double u1
+       double u2
+       Sint32 ustride
+       Sint32 uorder
+       double v1
+       double v2
+       Sint32 vstride
+       Sint32 vorder
+       char *points
+       CODE:
+               glMap2d(target,u1,u2,ustride,uorder,v1,v2,vstride,vorder,(double*)points);
+
+void
+glEvalCoord2 ( u, v )
+       double u
+       double v
+       CODE:
+               glEvalCoord2d(u,v);
+
+void
+glMapGrid2 ( nu, u1, u2, nv, v1, v2 )
+       Sint32 nu
+       double u1
+       double u2
+       Sint32 nv
+       double v1
+       double v2
+       CODE:
+               glMapGrid2d(nu,u1,u2,nv,v1,v2);
+
+void
+glEvalMesh2 ( mode, i1, i2, j1, j2 )
+       GLenum mode
+       Sint32 i1
+       Sint32 i2
+       Sint32 j1
+       Sint32 j2
+       CODE:
+               glEvalMesh2(mode,i1,i2,j1,j2);
+
+GLenum
+glGetError ( )
+       CODE:
+               RETVAL = glGetError();
+       OUTPUT:
+               RETVAL
+
+GLint
+glRenderMode ( mode )
+       GLenum mode
+       CODE:
+               RETVAL = glRenderMode( mode );
+       OUTPUT:
+               RETVAL
+
+void
+glInitNames ( )
+       CODE:
+               glInitNames();
+
+void
+glPushName ( name )
+       GLuint name
+       CODE:
+               glPushName(name);
+
+void
+glPopName ( )
+       CODE:
+               glPopName();            
+
+void
+glLoadName ( name )
+       GLuint name
+       CODE:
+               glLoadName(name);
+       
+void
+glFeedbackBuffer ( size, type, buffer )
+       GLuint size
+       GLenum type
+       float* buffer
+       CODE:
+               glFeedbackBuffer(size,type,buffer);             
+
+void
+glPassThrough ( token )
+       GLfloat token
+       CODE:
+               glPassThrough(token);
+
+
+#endif
+
+#ifdef HAVE_GLU
+
+void
+gluLookAt ( eyex, eyey, eyez, centerx, centery, centerz, upx, upy, upz )
+       double eyex
+       double eyey
+       double eyez
+       double centerx
+       double centery
+       double centerz
+       double upx
+       double upy
+       double upz
+       CODE:
+               gluLookAt(eyex,eyey,eyez,centerx,centery,centerz,upx,upy,upz);
+
+void
+gluPerspective ( fovy, aspect, n, f )
+       double fovy
+       double aspect
+       double n
+       double f
+       CODE:
+               gluPerspective(fovy,aspect,n,f);
+
+void
+gluPickMatrix ( x, y, delx, dely, viewport )
+       double x
+       double y
+       double delx
+       double dely
+       GLint* viewport
+       CODE:
+               gluPickMatrix(x,y,delx,dely,viewport);
+
+void
+gluOrtho2D ( left, right, bottom, top )
+       double left
+       double right
+       double bottom
+       double top
+       CODE:
+               gluOrtho2D(left,right,bottom,top);
+
+int
+gluScaleImage ( format, widthin, heightin, typein, datain, widthout, heightout, typeout, dataout )
+       GLenum format
+       Uint32 widthin
+       Uint32 heightin
+       GLenum typein
+       char *datain
+       Uint32 widthout
+       Uint32 heightout
+       GLenum typeout
+       char *dataout
+       CODE:
+               RETVAL = gluScaleImage(format,widthin,heightin,typein,datain,
+                               widthout,heightout,typeout,dataout);
+       OUTPUT:
+               RETVAL
+
+int
+gluBuild1DMipmaps ( target, internalFormat, width, format, type, data )
+       GLenum target
+       Sint32 internalFormat
+       Uint32 width
+       GLenum format
+       GLenum type
+       char *data
+       CODE:
+               RETVAL = gluBuild1DMipmaps(target,internalFormat,width,format,type,data);
+       OUTPUT:
+               RETVAL
+
+int
+gluBuild2DMipmaps ( target, internalFormat, width, height, format, type, data )
+       GLenum target
+       Sint32 internalFormat
+       Uint32 width
+       Uint32 height 
+       GLenum format
+       GLenum type
+       char *data
+       CODE:
+               RETVAL = gluBuild2DMipmaps(target,internalFormat,width,height,format,type,data);
+       OUTPUT: 
+               RETVAL
+
+
+#if HAVE_GLU_VERSION >= 12
+int
+gluBuild3DMipmaps ( target, internalFormat, width, height, depth, format, type, data )
+       GLenum target
+       Sint32 internalFormat
+       Uint32 width
+       Uint32 height 
+       Uint32 depth 
+       GLenum format
+       GLenum type
+       char *data
+       CODE:
+               RETVAL = gluBuild3DMipmaps(target,internalFormat,width,height,depth,
+                               format,type,data);
+       OUTPUT: 
+               RETVAL
+
+#else
+void
+gluBuild3DMipmaps ( )
+       CODE:
+               Perl_croak (aTHX_ "SDL::OpenGL::Build3DMipmaps requires GLU 1.2");
+
+#endif
+
+#if HAVE_GLU_VERSION >= 12
+int
+gluBuild1DMipmapLevels ( target, internalFormat, width, format, type, level, base, max, data )
+       GLenum target
+       Sint32 internalFormat
+       Uint32 width
+       GLenum format
+       GLenum type
+       Sint32 level
+       Sint32 base
+       Sint32 max
+       char *data
+       CODE:
+               RETVAL = gluBuild1DMipmapLevels(target,internalFormat,width,
+                               format,type,level,base,max,data);
+       OUTPUT:
+               RETVAL
+
+#else
+void
+gluBuild1DMipmapLevels ()
+       CODE:
+               Perl_croak(aTHX_ "SDL::OpenGL::Build1DMipmapLevels requires GLU 1.2");          
+       
+#endif
+
+#if HAVE_GLU_VERSION >= 12
+int
+gluBuild2DMipmapLevels ( target, internalFormat, width, height, format, type, level, base, max, data )
+       GLenum target
+       Sint32 internalFormat
+       Uint32 width
+       Uint32 height 
+       GLenum format
+       GLenum type
+       Sint32 level
+       Sint32 base
+       Sint32 max
+       char *data
+       CODE:
+               RETVAL = gluBuild2DMipmapLevels(target,internalFormat,width,height,
+                               format,type,level,base,max,data);
+       OUTPUT:
+               RETVAL
+
+#else
+void
+gluBuild2DMipmapLevels ()
+       CODE:
+               Perl_croak(aTHX_ "SDL::OpenGL::Build2DMipmapLevels requires GLU 1.2");          
+
+#endif
+
+#if HAVE_GLU_VERSION >= 12
+int
+gluBuild3DMipmapLevels ( target, internalFormat, width, height, depth, format, type, level, base, max, data )
+       GLenum target
+       Sint32 internalFormat
+       Uint32 width
+       Uint32 height 
+       Uint32 depth 
+       GLenum format
+       GLenum type
+       Sint32 level
+       Sint32 base
+       Sint32 max
+       char *data
+       CODE:
+               RETVAL = gluBuild3DMipmapLevels(target,internalFormat,width,height,depth,
+                               format,type,level,base,max,data);
+       OUTPUT:
+               RETVAL
+
+#else
+void
+gluBuild3DMipmapLevels ()
+       CODE:
+               Perl_croak(aTHX_ "SDL::OpenGL::Build3DMipmapLevels requires GLU 1.2");          
+
+#endif
+
+char*
+gluErrorString ( code )
+       GLenum code
+       CODE:
+               RETVAL = (char*)gluErrorString(code);
+       OUTPUT:
+               RETVAL
+
+GLUnurbsObj*
+gluNewNurbsRenderer ()
+       CODE:
+               RETVAL = gluNewNurbsRenderer();
+       OUTPUT:
+               RETVAL
+
+void
+gluDeleteNurbsRenderer ( obj )
+       GLUnurbsObj *obj
+       CODE:
+               gluDeleteNurbsRenderer(obj);
+
+void
+gluNurbsProperty ( obj, property, value )
+       GLUnurbsObj *obj
+       GLenum property
+       double value
+       CODE:
+               gluNurbsProperty(obj,property,(float)value);
+
+void
+gluLoadSamplingMatrices ( obj, mm, pm, vp )
+       GLUnurbsObj *obj
+       char *mm
+       char *pm
+       char *vp
+       CODE:
+               gluLoadSamplingMatrices(obj,(GLfloat*)mm,(GLfloat*)pm,(GLint*)vp);
+
+double
+gluGetNurbsProperty ( obj, property )
+       GLUnurbsObj *obj
+       GLenum property
+       CODE:
+               float f;
+               gluGetNurbsProperty(obj,property,&f);
+               RETVAL = (double)f;
+       OUTPUT:
+               RETVAL
+
+void
+gluNurbsCallback ( obj, which, cb )
+       GLUnurbsObj *obj
+       GLenum which
+       SV *cb
+       CODE:
+               switch(which) {
+                       case GLU_ERROR:
+                               sdl_perl_nurbs_error_hook = cb;
+                               gluNurbsCallback(obj,GLU_ERROR,(GLvoid*)sdl_perl_nurbs_error_callback);
+                               break;
+#ifdef GLU_NURBS_BEGIN
+                       case GLU_NURBS_BEGIN:
+                       case GLU_NURBS_BEGIN_DATA:
+                               gluNurbsCallbackData(obj,(void*)cb);
+                               gluNurbsCallback(obj,GLU_NURBS_BEGIN_DATA,
+                                       (GLvoid*)sdl_perl_nurbs_being_callback);        
+                               break;
+                       case GLU_NURBS_TEXTURE_COORD:
+                       case GLU_NURBS_TEXTURE_COORD_DATA:
+                               gluNurbsCallbackData(obj,(void*)cb);
+                               gluNurbsCallback(obj,GLU_NURBS_TEXTURE_COORD_DATA,
+                                       (GLvoid*)sdl_perl_nurbs_multi_callback);        
+                               break;
+                       case GLU_NURBS_COLOR:
+                       case GLU_NURBS_COLOR_DATA:
+                               gluNurbsCallbackData(obj,(void*)cb);
+                               gluNurbsCallback(obj,GLU_NURBS_COLOR_DATA,
+                                       (GLvoid*)sdl_perl_nurbs_multi_callback);        
+                               break;
+                       case GLU_NURBS_NORMAL:
+                       case GLU_NURBS_NORMAL_DATA:
+                               gluNurbsCallbackData(obj,(void*)cb);
+                               gluNurbsCallback(obj,GLU_NURBS_NORMAL_DATA,
+                                       (GLvoid*)sdl_perl_nurbs_multi_callback);        
+                               break;
+                       case GLU_NURBS_VERTEX:
+                       case GLU_NURBS_VERTEX_DATA:
+                               gluNurbsCallbackData(obj,(void*)cb);
+                               gluNurbsCallback(obj,GLU_NURBS_VERTEX_DATA,
+                                       (GLvoid*)sdl_perl_nurbs_multi_callback);        
+                               break;
+                       case GLU_NURBS_END:
+                       case GLU_NURBS_END_DATA:
+                               gluNurbsCallbackData(obj,(void*)cb);
+                               gluNurbsCallback(obj,GLU_NURBS_END_DATA,
+                                       (GLvoid*)sdl_perl_nurbs_end_callback);  
+                               break;
+#endif
+                       default:
+                               Perl_croak(aTHX_ "SDL::OpenGL::NurbsCallback - invalid type");
+               }
+
+void
+gluNurbsCallbackData ( obj, cb )
+       GLUnurbsObj *obj
+       SV *cb
+       CODE:
+               gluNurbsCallbackData(obj,(void*)cb);
+
+void
+gluBeginSurface ( obj )
+       GLUnurbsObj *obj
+       CODE:
+               gluBeginSurface(obj);
+
+void
+gluEndSurface ( obj )
+       GLUnurbsObj *obj
+       CODE:
+               gluEndSurface(obj);
+       
+void
+gluNurbsSurface ( obj, uknot_count, uknot, vknot_count, vknot, u_stride, v_stride, ctlarray, uorder, vorder, type )
+       GLUnurbsObj *obj
+       Sint32 uknot_count
+       char *uknot
+       Sint32 vknot_count
+       char *vknot
+       Sint32 u_stride
+       Sint32 v_stride
+       char *ctlarray
+       Sint32 uorder
+       Sint32 vorder
+       GLenum type
+       CODE:
+               gluNurbsSurface(obj,uknot_count,(GLfloat*)uknot,vknot_count,(GLfloat*)vknot,
+                       u_stride,v_stride,(GLfloat*)ctlarray,uorder,vorder,type);
+
+void
+gluBeginCurve ( obj )
+       GLUnurbsObj *obj
+       CODE:
+               gluBeginCurve(obj);
+
+void
+gluEndCurve ( obj ) 
+       GLUnurbsObj *obj
+       CODE:
+               gluEndCurve(obj);
+
+void
+gluNurbsCurve ( obj, uknot_count, uknot, u_stride, ctlarray, uorder, type )
+       GLUnurbsObj *obj
+       Sint32 uknot_count
+       char *uknot
+       Sint32 u_stride
+       char *ctlarray
+       Sint32 uorder
+       GLenum type
+       CODE:
+               gluNurbsCurve(obj,uknot_count,(GLfloat*)uknot,u_stride,(GLfloat*)ctlarray,
+                       uorder,type);
+
+void
+gluBeginTrim ( obj )
+       GLUnurbsObj *obj
+       CODE:
+               gluBeginTrim(obj);
+
+void
+gluEndTrim ( obj )
+       GLUnurbsObj *obj
+       CODE:
+               gluEndTrim(obj);
+
+void
+gluPwlCurve ( obj, count, array, stride, type )        
+       GLUnurbsObj *obj
+       Sint32 count
+       char *array
+       Sint32 stride
+       GLenum type
+       CODE:
+               gluPwlCurve(obj,count,(GLfloat*)array,stride,type);
+
+AV*
+gluUnProject ( winx, winy, winz, mm, pm, vp )
+       double winx
+       double winy
+       double winz
+       char *mm
+       char *pm
+       char *vp
+       CODE:
+               GLdouble objx, objy, objz;
+               RETVAL = newAV();
+               av_push(RETVAL,newSViv(gluUnProject(winx,winy,winz,(GLdouble*)mm,
+                       (GLdouble*)pm,(GLint*)vp,&objx,&objy,&objz)));
+               av_push(RETVAL,newSVnv((double)objx));
+               av_push(RETVAL,newSVnv((double)objy));
+               av_push(RETVAL,newSVnv((double)objz));
+       OUTPUT:
+               RETVAL
+
+
+#ifdef GL_VERSION_1_3
+               
+AV*
+gluUnProject4 ( winx, winy, winz, clipw, mm, pm, vp, n, f )
+        double winx
+        double winy
+        double winz
+       double clipw
+        char *mm
+        char *pm
+        char *vp
+       double n
+       double f
+        CODE:
+                GLdouble objx, objy, objz, objw;
+                RETVAL = newAV();
+                av_push(RETVAL,newSViv(gluUnProject4(winx,winy,winz,clipw,(GLdouble*)mm,
+                        (GLdouble*)pm,(GLint*)vp,(GLclampd)n,(GLclampd)f,
+                       &objx,&objy,&objz,&objw)));
+                av_push(RETVAL,newSVnv((double)objx));
+                av_push(RETVAL,newSVnv((double)objy));
+                av_push(RETVAL,newSVnv((double)objz));
+                av_push(RETVAL,newSVnv((double)objw));
+        OUTPUT:
+                RETVAL
+
+#endif // GL_VERSION_1_3
+
+AV*
+gluProject ( objx, objy, objz, mm, pm, vp )
+       double objx
+       double objy
+       double objz
+       char *mm
+       char *pm
+       char *vp
+       CODE:
+               GLdouble winx, winy, winz;
+               RETVAL = newAV();
+               av_push(RETVAL,newSViv(gluUnProject(objx,objy,objz,(GLdouble*)mm,
+                       (GLdouble*)pm,(GLint*)vp,&winx,&winy,&winz)));
+                av_push(RETVAL,newSVnv((double)winx));
+                av_push(RETVAL,newSVnv((double)winy));
+                av_push(RETVAL,newSVnv((double)winz));
+       OUTPUT:
+               RETVAL
+
+#ifdef GL_VERSION_1_2
+
+GLUtesselator*
+gluNewTess ()
+       CODE:
+               RETVAL = gluNewTess();
+       OUTPUT:
+               RETVAL
+
+void
+gluTessCallback ( tess, type )
+       GLUtesselator *tess
+       GLenum type
+       CODE:
+               switch(type) {
+                       case GLU_TESS_BEGIN:
+                       case GLU_TESS_BEGIN_DATA:
+                               gluTessCallback(tess,GLU_TESS_BEGIN_DATA,
+                                       (GLvoid*)sdl_perl_tess_begin_callback); 
+                               break;
+       
+                       case GLU_TESS_EDGE_FLAG:
+                       case GLU_TESS_EDGE_FLAG_DATA:
+                               gluTessCallback(tess,GLU_TESS_EDGE_FLAG_DATA,
+                                       (GLvoid*)sdl_perl_tess_edge_flag_callback);     
+                               break;
+
+                       case GLU_TESS_VERTEX:
+                       case GLU_TESS_VERTEX_DATA:
+                               gluTessCallback(tess,GLU_TESS_VERTEX_DATA,
+                                       (GLvoid*)sdl_perl_tess_vertex_callback);        
+                               break;
+
+                       case GLU_TESS_END:
+                       case GLU_TESS_END_DATA:
+                               gluTessCallback(tess,GLU_TESS_END_DATA,
+                                       (GLvoid*)sdl_perl_tess_end_callback);   
+                               break;
+
+                       case GLU_TESS_COMBINE:
+                       case GLU_TESS_COMBINE_DATA:
+                               gluTessCallback(tess,GLU_TESS_COMBINE_DATA,
+                                       (GLvoid*)sdl_perl_tess_combine_callback);       
+                               break;
+
+                       case GLU_TESS_ERROR:
+                       case GLU_TESS_ERROR_DATA:
+                               gluTessCallback(tess,GLU_TESS_ERROR_DATA,
+                                       (GLvoid*)sdl_perl_tess_error_callback); 
+                               break;
+               }
+
+void
+gluTessProperty ( tessobj, property, value )
+       GLUtesselator *tessobj
+       Uint32 property
+       double value
+       CODE:
+               gluTessProperty(tessobj,property,value);
+
+double
+gluGetTessProperty ( tessobj, property )
+       GLUtesselator *tessobj
+       Uint32 property
+       CODE:
+               gluGetTessProperty(tessobj,property,&RETVAL);
+       OUTPUT:
+               RETVAL
+
+void
+gluTessNormal ( tessobj, x, y, z )
+       GLUtesselator *tessobj
+       double x
+       double y
+       double z
+       CODE:
+               gluTessNormal(tessobj,x,y,z);
+
+void
+gluTessBeginPolygon ( tessobj, cb )
+       GLUtesselator *tessobj
+       SV *cb
+       CODE:
+               gluTessBeginPolygon(tessobj,cb);
+
+void
+gluTessEndPolygon ( tessobj ) 
+       GLUtesselator *tessobj
+       CODE:
+               gluTessEndPolygon(tessobj);
+
+void
+gluTessBeginContour ( tessobj )
+       GLUtesselator *tessobj
+       CODE:
+               gluTessBeginContour(tessobj);
+
+void
+gluTessEndContour ( tessobj )
+       GLUtesselator *tessobj
+       CODE:
+               gluTessEndContour(tessobj);
+
+void
+gluDeleteTess ( tessobj )
+       GLUtesselator *tessobj
+       CODE:
+               gluDeleteTess(tessobj);
+
+void
+gluTessVertex ( tessobj, coords, vd ) 
+       GLUtesselator *tessobj
+       char *coords
+       char *vd
+       CODE:
+               gluTessVertex(tessobj,(GLdouble*)coords,vd);
+       
+#endif
+
+#endif
+
diff --git a/src/SDL/SFont.bs b/src/SDL/SFont.bs
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/src/SDL/SFont.c b/src/SDL/SFont.c
new file mode 100644 (file)
index 0000000..8e65891
--- /dev/null
@@ -0,0 +1,382 @@
+/*
+ * This file was generated automatically by xsubpp version 1.9508 from the
+ * contents of SFont.xs. Do not edit this file, edit SFont.xs instead.
+ *
+ *     ANY CHANGES MADE HERE WILL BE LOST!
+ *
+ */
+
+#line 1 "SFont.xs"
+//
+// SFont.xs
+//
+// Original SFont code Copyright (C) Karl Bartel 
+// Copyright (C) 2005 David J. Goehrig <dgoehrig@cpan.org>
+//
+// ------------------------------------------------------------------------------
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+// 
+// This library 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
+// Lesser General Public License for more details.
+// 
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+//
+// ------------------------------------------------------------------------------
+//
+// Please feel free to send questions, suggestions or improvements to:
+//
+//     David J. Goehrig
+//     dgoehrig@cpan.org
+//
+
+#include "EXTERN.h"
+#include "perl.h"
+#include "XSUB.h"
+
+#ifndef aTHX_
+#define aTHX_
+#endif
+
+#include <SDL.h>
+#include <string.h>
+#include <stdlib.h>
+
+#ifdef USE_THREADS
+#define HAVE_TLS_CONTEXT
+#endif
+
+#include "../defines.h"
+#include "../SFont.h"
+
+#ifdef HAVE_SDL_IMAGE
+#include <SDL_image.h>
+
+SFont_FontInfo InternalFont;
+Uint32 SFont_GetPixel(SDL_Surface *Surface, Sint32 X, Sint32 Y)
+{
+
+   Uint8  *bits;
+   Uint32 Bpp;
+   if (X<0) puts("SFONT ERROR: x too small in SFont_GetPixel. Report this to <karlb@gmx.net>");
+   if (X>=Surface->w) puts("SFONT ERROR: x too big in SFont_GetPixel. Report this to <karlb@gmx.net>");
+   
+   Bpp = Surface->format->BytesPerPixel;
+
+   bits = ((Uint8 *)Surface->pixels)+Y*Surface->pitch+X*Bpp;
+
+   // Get the pixel
+   switch(Bpp) {
+      case 1:
+         return *((Uint8 *)Surface->pixels + Y * Surface->pitch + X);
+         break;
+      case 2:
+         return *((Uint16 *)Surface->pixels + Y * Surface->pitch/2 + X);
+         break;
+      case 3: { // Format/endian independent 
+         Uint8 r, g, b;
+         r = *((bits)+Surface->format->Rshift/8);
+         g = *((bits)+Surface->format->Gshift/8);
+         b = *((bits)+Surface->format->Bshift/8);
+         return SDL_MapRGB(Surface->format, r, g, b);
+         }
+         break;
+      case 4:
+         return *((Uint32 *)Surface->pixels + Y * Surface->pitch/4 + X);
+         break;
+   }
+
+    return -1;
+}
+
+void SFont_InitFont2(SFont_FontInfo *Font)
+{
+    int x = 0, i = 0;
+
+    if ( Font->Surface==NULL ) {
+       printf("The font has not been loaded!\n");
+       exit(1);
+    }
+
+    if (SDL_MUSTLOCK(Font->Surface)) SDL_LockSurface(Font->Surface);
+
+    while ( x < Font->Surface->w ) {
+       if(SFont_GetPixel(Font->Surface,x,0)==SDL_MapRGB(Font->Surface->format,255,0,255)) { 
+           Font->CharPos[i++]=x;
+           while (( x < Font->Surface->w-1) && (SFont_GetPixel(Font->Surface,x,0)==SDL_MapRGB(Font->Surface->format,255,0,255)))
+               x++;
+           Font->CharPos[i++]=x;
+       }
+       x++;
+    }
+    if (SDL_MUSTLOCK(Font->Surface)) SDL_UnlockSurface(Font->Surface);
+
+    Font->h=Font->Surface->h;
+    SDL_SetColorKey(Font->Surface, SDL_SRCCOLORKEY, SFont_GetPixel(Font->Surface, 0, Font->Surface->h-1));
+}
+
+void SFont_InitFont(SDL_Surface *Font)
+{
+    InternalFont.Surface=Font;
+    SFont_InitFont2(&InternalFont);
+}
+
+void SFont_PutString2(SDL_Surface *Surface, SFont_FontInfo *Font, int x, int y, char *text)
+{
+    int ofs;
+    int i=0;
+    SDL_Rect srcrect,dstrect; 
+
+    while (text[i]!='\0') {
+        if (text[i]==' ') {
+            x+=Font->CharPos[2]-Font->CharPos[1];
+            i++;
+       }
+       else {
+//         printf("-%c- %c - %u\n",228,text[i],text[i]);
+           ofs=(text[i]-33)*2+1;
+//         printf("printing %c %d\n",text[i],ofs);
+            srcrect.w = dstrect.w = (Font->CharPos[ofs+2]+Font->CharPos[ofs+1])/2-(Font->CharPos[ofs]+Font->CharPos[ofs-1])/2;
+            srcrect.h = dstrect.h = Font->Surface->h-1;
+            srcrect.x = (Font->CharPos[ofs]+Font->CharPos[ofs-1])/2;
+            srcrect.y = 1;
+           dstrect.x = x-(float)(Font->CharPos[ofs]-Font->CharPos[ofs-1])/2;
+           dstrect.y = y;
+
+           SDL_BlitSurface( Font->Surface, &srcrect, Surface, &dstrect); 
+
+            x+=Font->CharPos[ofs+1]-Font->CharPos[ofs];
+            i++;
+        }
+    }
+}
+
+void SFont_PutString(SDL_Surface *Surface, int x, int y, char *text)
+{
+    SFont_PutString2(Surface, &InternalFont, x, y, text);
+}
+
+int SFont_TextWidth2(SFont_FontInfo *Font, char *text)
+{
+    int ofs=0;
+    int i=0,x=0;
+
+    while (text[i]!='\0') {
+        if (text[i]==' ') {
+            x+=Font->CharPos[2]-Font->CharPos[1];
+            i++;
+       }
+       else {
+           ofs=(text[i]-33)*2+1;
+            x+=Font->CharPos[ofs+1]-Font->CharPos[ofs];
+            i++;
+        }
+    }
+//    printf ("--%d\n",x);
+    return x;
+}
+
+int SFont_TextWidth(char *text)
+{
+    return SFont_TextWidth2(&InternalFont, text);
+}
+
+void SFont_XCenteredString2(SDL_Surface *Surface, SFont_FontInfo *Font, int y, char *text)
+{
+    SFont_PutString2(Surface, Font, Surface->w/2-SFont_TextWidth2(Font,text)/2, y, text);
+}
+
+void SFont_XCenteredString(SDL_Surface *Surface, int y, char *text)
+{
+    SFont_XCenteredString2(Surface, &InternalFont, y, text);
+}
+
+void SFont_InternalInput( SDL_Surface *Dest, SFont_FontInfo *Font, int x, int y, int PixelWidth, char *text)
+{
+    SDL_Event event;
+    int ch=-1,blink=0;
+    long blinktimer=0;
+    SDL_Surface *Back;
+    SDL_Rect rect;
+    int previous;
+//    int ofs=(text[0]-33)*2+1;
+//    int leftshift=(Font->CharPos[ofs]-Font->CharPos[ofs-1])/2;
+    
+    Back = SDL_AllocSurface(Dest->flags,
+                           Dest->w,
+                           Font->h,
+                           Dest->format->BitsPerPixel,
+                           Dest->format->Rmask,
+                           Dest->format->Gmask,
+                           Dest->format->Bmask, 0);
+    rect.x=0;
+    rect.y=y;
+    rect.w=Dest->w;
+    rect.h=Font->Surface->h;
+    SDL_BlitSurface(Dest, &rect, Back, NULL);
+    SFont_PutString2(Dest,Font,x,y,text);
+    SDL_UpdateRects(Dest, 1, &rect);
+        
+    // start input
+    previous=SDL_EnableUNICODE(1);
+    blinktimer=SDL_GetTicks();
+    while (ch!=SDLK_RETURN) {
+       if (event.type==SDL_KEYDOWN) {
+           ch=event.key.keysym.unicode;
+           if (((ch>31)||(ch=='\b')) && (ch<128)) {
+               if ((ch=='\b')&&(strlen(text)>0))
+                   text[strlen(text)-1]='\0';
+               else if (ch!='\b')
+                   sprintf(text,"%s%c",text,ch);
+               if (SFont_TextWidth2(Font,text)>PixelWidth) text[strlen(text)-1]='\0';
+               SDL_BlitSurface( Back, NULL, Dest, &rect);
+               SFont_PutString2(Dest, Font, x, y, text);
+               SDL_UpdateRects(Dest, 1, &rect);
+//             printf("%s ## %d\n",text,strlen(text));
+               SDL_WaitEvent(&event);
+           }
+       }
+       if (SDL_GetTicks()>blinktimer) {
+           blink=1-blink;
+           blinktimer=SDL_GetTicks()+500;
+           if (blink) {
+               SFont_PutString2(Dest, Font, x+SFont_TextWidth2(Font,text), y, "|");
+               SDL_UpdateRects(Dest, 1, &rect);
+//             SDL_UpdateRect(Dest, x+SFont_TextWidth2(Font,text), y, SFont_TextWidth2(Font,"|"), Font->Surface->h);
+           } else {
+               SDL_BlitSurface( Back, NULL, Dest, &rect);
+               SFont_PutString2(Dest, Font, x, y, text);
+               SDL_UpdateRects(Dest, 1, &rect);
+//             SDL_UpdateRect(Dest, x-(Font->CharPos[ofs]-Font->CharPos[ofs-1])/2, y, PixelWidth, Font->Surface->h);
+           }
+       }
+       SDL_Delay(1);
+       SDL_PollEvent(&event);
+    }
+    text[strlen(text)]='\0';
+    SDL_FreeSurface(Back);
+    SDL_EnableUNICODE(previous);  //restore the previous state
+}
+
+void SFont_Input2( SDL_Surface *Dest, SFont_FontInfo *Font, int x, int y, int PixelWidth, char *text)
+{
+    SFont_InternalInput( Dest, Font, x, y, PixelWidth,  text);
+}
+void SFont_Input( SDL_Surface *Dest, int x, int y, int PixelWidth, char *text)
+{
+    SFont_Input2( Dest, &InternalFont, x, y, PixelWidth, text);
+}
+
+#endif
+
+#line 280 "SFont.c"
+#ifdef HAVE_SDL_IMAGE
+#define XSubPPtmpAAAA 1
+
+XS(XS_SDL__SFont_NewFont); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__SFont_NewFont)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::SFont::NewFont(filename)");
+    {
+       char *  filename = (char *)SvPV_nolen(ST(0));
+       SDL_Surface *   RETVAL;
+       dXSTARG;
+#line 279 "SFont.xs"
+               RETVAL = IMG_Load(filename);
+               SFont_InitFont(RETVAL);
+#line 297 "SFont.c"
+       XSprePUSH; PUSHi(PTR2IV(RETVAL));
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL__SFont_UseFont); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__SFont_UseFont)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::SFont::UseFont(surface)");
+    {
+       SDL_Surface *   surface = INT2PTR(SDL_Surface *,SvIV(ST(0)));
+#line 288 "SFont.xs"
+               SFont_InitFont(surface);
+#line 313 "SFont.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL__SFont_PutString); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__SFont_PutString)
+{
+    dXSARGS;
+    if (items != 4)
+       Perl_croak(aTHX_ "Usage: SDL::SFont::PutString(surface, x, y, text)");
+    {
+       SDL_Surface *   surface = INT2PTR(SDL_Surface *,SvIV(ST(0)));
+       int     x = (int)SvIV(ST(1));
+       int     y = (int)SvIV(ST(2));
+       char *  text = (char *)SvPV_nolen(ST(3));
+#line 297 "SFont.xs"
+               SFont_PutString( surface, x, y, text );
+#line 331 "SFont.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL__SFont_TextWidth); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL__SFont_TextWidth)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::SFont::TextWidth(text)");
+    {
+       char *  text = (char *)SvPV_nolen(ST(0));
+       int     RETVAL;
+       dXSTARG;
+#line 303 "SFont.xs"
+                RETVAL = SFont_TextWidth(text);
+#line 348 "SFont.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+#endif
+#ifdef __cplusplus
+extern "C"
+#endif
+XS(boot_SDL__SFont); /* prototype to pass -Wmissing-prototypes */
+XS(boot_SDL__SFont)
+{
+    dXSARGS;
+    char* file = __FILE__;
+
+    XS_VERSION_BOOTCHECK ;
+
+#if XSubPPtmpAAAA
+        newXS("SDL::SFont::NewFont", XS_SDL__SFont_NewFont, file);
+        newXS("SDL::SFont::UseFont", XS_SDL__SFont_UseFont, file);
+        newXS("SDL::SFont::PutString", XS_SDL__SFont_PutString, file);
+        newXS("SDL::SFont::TextWidth", XS_SDL__SFont_TextWidth, file);
+#endif
+
+    /* Initialisation Section */
+
+#if XSubPPtmpAAAA
+#endif
+#line 377 "SFont.c"
+
+    /* End of Initialisation Section */
+
+    XSRETURN_YES;
+}
+
diff --git a/src/SDL/SFont.o b/src/SDL/SFont.o
new file mode 100644 (file)
index 0000000..318869e
Binary files /dev/null and b/src/SDL/SFont.o differ
diff --git a/src/SDL/SFont.xs b/src/SDL/SFont.xs
new file mode 100644 (file)
index 0000000..2bd9899
--- /dev/null
@@ -0,0 +1,308 @@
+//
+// SFont.xs
+//
+// Original SFont code Copyright (C) Karl Bartel 
+// Copyright (C) 2005 David J. Goehrig <dgoehrig@cpan.org>
+//
+// ------------------------------------------------------------------------------
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+// 
+// This library 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
+// Lesser General Public License for more details.
+// 
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+//
+// ------------------------------------------------------------------------------
+//
+// Please feel free to send questions, suggestions or improvements to:
+//
+//     David J. Goehrig
+//     dgoehrig@cpan.org
+//
+
+#include "EXTERN.h"
+#include "perl.h"
+#include "XSUB.h"
+
+#ifndef aTHX_
+#define aTHX_
+#endif
+
+#include <SDL.h>
+#include <string.h>
+#include <stdlib.h>
+
+#ifdef USE_THREADS
+#define HAVE_TLS_CONTEXT
+#endif
+
+#include "../defines.h"
+#include "../SFont.h"
+
+#ifdef HAVE_SDL_IMAGE
+#include <SDL_image.h>
+
+SFont_FontInfo InternalFont;
+Uint32 SFont_GetPixel(SDL_Surface *Surface, Sint32 X, Sint32 Y)
+{
+
+   Uint8  *bits;
+   Uint32 Bpp;
+   if (X<0) puts("SFONT ERROR: x too small in SFont_GetPixel. Report this to <karlb@gmx.net>");
+   if (X>=Surface->w) puts("SFONT ERROR: x too big in SFont_GetPixel. Report this to <karlb@gmx.net>");
+   
+   Bpp = Surface->format->BytesPerPixel;
+
+   bits = ((Uint8 *)Surface->pixels)+Y*Surface->pitch+X*Bpp;
+
+   // Get the pixel
+   switch(Bpp) {
+      case 1:
+         return *((Uint8 *)Surface->pixels + Y * Surface->pitch + X);
+         break;
+      case 2:
+         return *((Uint16 *)Surface->pixels + Y * Surface->pitch/2 + X);
+         break;
+      case 3: { // Format/endian independent 
+         Uint8 r, g, b;
+         r = *((bits)+Surface->format->Rshift/8);
+         g = *((bits)+Surface->format->Gshift/8);
+         b = *((bits)+Surface->format->Bshift/8);
+         return SDL_MapRGB(Surface->format, r, g, b);
+         }
+         break;
+      case 4:
+         return *((Uint32 *)Surface->pixels + Y * Surface->pitch/4 + X);
+         break;
+   }
+
+    return -1;
+}
+
+void SFont_InitFont2(SFont_FontInfo *Font)
+{
+    int x = 0, i = 0;
+
+    if ( Font->Surface==NULL ) {
+       printf("The font has not been loaded!\n");
+       exit(1);
+    }
+
+    if (SDL_MUSTLOCK(Font->Surface)) SDL_LockSurface(Font->Surface);
+
+    while ( x < Font->Surface->w ) {
+       if(SFont_GetPixel(Font->Surface,x,0)==SDL_MapRGB(Font->Surface->format,255,0,255)) { 
+           Font->CharPos[i++]=x;
+           while (( x < Font->Surface->w-1) && (SFont_GetPixel(Font->Surface,x,0)==SDL_MapRGB(Font->Surface->format,255,0,255)))
+               x++;
+           Font->CharPos[i++]=x;
+       }
+       x++;
+    }
+    if (SDL_MUSTLOCK(Font->Surface)) SDL_UnlockSurface(Font->Surface);
+
+    Font->h=Font->Surface->h;
+    SDL_SetColorKey(Font->Surface, SDL_SRCCOLORKEY, SFont_GetPixel(Font->Surface, 0, Font->Surface->h-1));
+}
+
+void SFont_InitFont(SDL_Surface *Font)
+{
+    InternalFont.Surface=Font;
+    SFont_InitFont2(&InternalFont);
+}
+
+void SFont_PutString2(SDL_Surface *Surface, SFont_FontInfo *Font, int x, int y, char *text)
+{
+    int ofs;
+    int i=0;
+    SDL_Rect srcrect,dstrect; 
+
+    while (text[i]!='\0') {
+        if (text[i]==' ') {
+            x+=Font->CharPos[2]-Font->CharPos[1];
+            i++;
+       }
+       else {
+//         printf("-%c- %c - %u\n",228,text[i],text[i]);
+           ofs=(text[i]-33)*2+1;
+//         printf("printing %c %d\n",text[i],ofs);
+            srcrect.w = dstrect.w = (Font->CharPos[ofs+2]+Font->CharPos[ofs+1])/2-(Font->CharPos[ofs]+Font->CharPos[ofs-1])/2;
+            srcrect.h = dstrect.h = Font->Surface->h-1;
+            srcrect.x = (Font->CharPos[ofs]+Font->CharPos[ofs-1])/2;
+            srcrect.y = 1;
+           dstrect.x = x-(float)(Font->CharPos[ofs]-Font->CharPos[ofs-1])/2;
+           dstrect.y = y;
+
+           SDL_BlitSurface( Font->Surface, &srcrect, Surface, &dstrect); 
+
+            x+=Font->CharPos[ofs+1]-Font->CharPos[ofs];
+            i++;
+        }
+    }
+}
+
+void SFont_PutString(SDL_Surface *Surface, int x, int y, char *text)
+{
+    SFont_PutString2(Surface, &InternalFont, x, y, text);
+}
+
+int SFont_TextWidth2(SFont_FontInfo *Font, char *text)
+{
+    int ofs=0;
+    int i=0,x=0;
+
+    while (text[i]!='\0') {
+        if (text[i]==' ') {
+            x+=Font->CharPos[2]-Font->CharPos[1];
+            i++;
+       }
+       else {
+           ofs=(text[i]-33)*2+1;
+            x+=Font->CharPos[ofs+1]-Font->CharPos[ofs];
+            i++;
+        }
+    }
+//    printf ("--%d\n",x);
+    return x;
+}
+
+int SFont_TextWidth(char *text)
+{
+    return SFont_TextWidth2(&InternalFont, text);
+}
+
+void SFont_XCenteredString2(SDL_Surface *Surface, SFont_FontInfo *Font, int y, char *text)
+{
+    SFont_PutString2(Surface, Font, Surface->w/2-SFont_TextWidth2(Font,text)/2, y, text);
+}
+
+void SFont_XCenteredString(SDL_Surface *Surface, int y, char *text)
+{
+    SFont_XCenteredString2(Surface, &InternalFont, y, text);
+}
+
+void SFont_InternalInput( SDL_Surface *Dest, SFont_FontInfo *Font, int x, int y, int PixelWidth, char *text)
+{
+    SDL_Event event;
+    int ch=-1,blink=0;
+    long blinktimer=0;
+    SDL_Surface *Back;
+    SDL_Rect rect;
+    int previous;
+//    int ofs=(text[0]-33)*2+1;
+//    int leftshift=(Font->CharPos[ofs]-Font->CharPos[ofs-1])/2;
+    
+    Back = SDL_AllocSurface(Dest->flags,
+                           Dest->w,
+                           Font->h,
+                           Dest->format->BitsPerPixel,
+                           Dest->format->Rmask,
+                           Dest->format->Gmask,
+                           Dest->format->Bmask, 0);
+    rect.x=0;
+    rect.y=y;
+    rect.w=Dest->w;
+    rect.h=Font->Surface->h;
+    SDL_BlitSurface(Dest, &rect, Back, NULL);
+    SFont_PutString2(Dest,Font,x,y,text);
+    SDL_UpdateRects(Dest, 1, &rect);
+        
+    // start input
+    previous=SDL_EnableUNICODE(1);
+    blinktimer=SDL_GetTicks();
+    while (ch!=SDLK_RETURN) {
+       if (event.type==SDL_KEYDOWN) {
+           ch=event.key.keysym.unicode;
+           if (((ch>31)||(ch=='\b')) && (ch<128)) {
+               if ((ch=='\b')&&(strlen(text)>0))
+                   text[strlen(text)-1]='\0';
+               else if (ch!='\b')
+                   sprintf(text,"%s%c",text,ch);
+               if (SFont_TextWidth2(Font,text)>PixelWidth) text[strlen(text)-1]='\0';
+               SDL_BlitSurface( Back, NULL, Dest, &rect);
+               SFont_PutString2(Dest, Font, x, y, text);
+               SDL_UpdateRects(Dest, 1, &rect);
+//             printf("%s ## %d\n",text,strlen(text));
+               SDL_WaitEvent(&event);
+           }
+       }
+       if (SDL_GetTicks()>blinktimer) {
+           blink=1-blink;
+           blinktimer=SDL_GetTicks()+500;
+           if (blink) {
+               SFont_PutString2(Dest, Font, x+SFont_TextWidth2(Font,text), y, "|");
+               SDL_UpdateRects(Dest, 1, &rect);
+//             SDL_UpdateRect(Dest, x+SFont_TextWidth2(Font,text), y, SFont_TextWidth2(Font,"|"), Font->Surface->h);
+           } else {
+               SDL_BlitSurface( Back, NULL, Dest, &rect);
+               SFont_PutString2(Dest, Font, x, y, text);
+               SDL_UpdateRects(Dest, 1, &rect);
+//             SDL_UpdateRect(Dest, x-(Font->CharPos[ofs]-Font->CharPos[ofs-1])/2, y, PixelWidth, Font->Surface->h);
+           }
+       }
+       SDL_Delay(1);
+       SDL_PollEvent(&event);
+    }
+    text[strlen(text)]='\0';
+    SDL_FreeSurface(Back);
+    SDL_EnableUNICODE(previous);  //restore the previous state
+}
+
+void SFont_Input2( SDL_Surface *Dest, SFont_FontInfo *Font, int x, int y, int PixelWidth, char *text)
+{
+    SFont_InternalInput( Dest, Font, x, y, PixelWidth,  text);
+}
+void SFont_Input( SDL_Surface *Dest, int x, int y, int PixelWidth, char *text)
+{
+    SFont_Input2( Dest, &InternalFont, x, y, PixelWidth, text);
+}
+
+#endif
+
+MODULE = SDL::SFont            PACKAGE = SDL::SFont
+PROTOTYPES : DISABLE
+
+#ifdef HAVE_SDL_IMAGE
+
+SDL_Surface *
+NewFont ( filename )
+       char *filename
+       CODE:
+               RETVAL = IMG_Load(filename);
+               SFont_InitFont(RETVAL);
+       OUTPUT:
+               RETVAL
+
+void
+UseFont ( surface )
+       SDL_Surface *surface
+       CODE:
+               SFont_InitFont(surface);
+
+void
+PutString ( surface, x, y, text )
+       SDL_Surface *surface
+       int x
+       int y
+       char *text
+       CODE:
+               SFont_PutString( surface, x, y, text );
+
+int
+TextWidth ( text )
+       char *text
+       CODE:
+                RETVAL = SFont_TextWidth(text);
+       OUTPUT:
+               RETVAL
+               
+
+#endif
diff --git a/src/SDL_perl.bs b/src/SDL_perl.bs
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/src/SDL_perl.c b/src/SDL_perl.c
new file mode 100644 (file)
index 0000000..28fbdfb
--- /dev/null
@@ -0,0 +1,9408 @@
+/*
+ * This file was generated automatically by xsubpp version 1.9508 from the
+ * contents of SDL_perl.xs. Do not edit this file, edit SDL_perl.xs instead.
+ *
+ *     ANY CHANGES MADE HERE WILL BE LOST!
+ *
+ */
+
+#line 1 "SDL_perl.xs"
+//
+// SDL.xs
+//
+// Copyright (C) 2005 David J. Goehrig <dgoehrig@cpan.org>
+//
+// ------------------------------------------------------------------------------
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+// 
+// This library 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
+// Lesser General Public License for more details.
+// 
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+//
+// ------------------------------------------------------------------------------
+//
+// Please feel free to send questions, suggestions or improvements to:
+//
+//     David J. Goehrig
+//     dgoehrig@cpan.org
+//
+
+#include "EXTERN.h"
+#include "perl.h"
+#include "XSUB.h"
+
+#ifndef aTHX_
+#define aTHX_
+#endif
+
+#include <SDL.h>
+
+#ifdef HAVE_GL
+#include <gl.h>
+#endif
+
+#ifdef HAVE_GLU
+#include <glu.h>
+#endif
+
+#ifdef HAVE_SDL_IMAGE
+#include <SDL_image.h>
+#endif 
+
+#ifdef HAVE_SDL_MIXER
+#include <SDL_mixer.h>
+void (*mix_music_finished_cv)();
+#endif
+
+#ifdef HAVE_SDL_SOUND
+#include <SDL_sound.h>
+#endif
+
+#ifdef HAVE_SDL_NET
+#include <SDL_net.h>
+#endif
+
+#ifdef HAVE_SDL_TTF
+#include <SDL_ttf.h>
+#define TEXT_SOLID     1
+#define TEXT_SHADED    2
+#define TEXT_BLENDED   4
+#define UTF8_SOLID     8
+#define UTF8_SHADED    16      
+#define UTF8_BLENDED   32
+#define UNICODE_SOLID  64
+#define UNICODE_SHADED 128
+#define UNICODE_BLENDED        256
+#endif
+
+#ifdef HAVE_SMPEG
+#include <smpeg/smpeg.h>
+#ifdef HAVE_SDL_MIXER
+static int sdl_perl_use_smpeg_audio = 0;
+#endif
+#endif
+
+#ifdef HAVE_SDL_GFX
+#include <SDL_rotozoom.h>
+#include <SDL_gfxPrimitives.h>
+#include <SDL_framerate.h>
+#include <SDL_imageFilter.h>
+#endif
+
+#ifdef HAVE_SDL_SVG
+#include <SDL_svg.h>
+#endif
+
+#ifdef USE_THREADS
+#define HAVE_TLS_CONTEXT
+#endif
+
+#include "defines.h"
+
+Uint32 
+sdl_perl_timer_callback ( Uint32 interval, void* param )
+{
+       Uint32 retval;
+       int back;
+       SV* cmd;
+       ENTER_TLS_CONTEXT
+       dSP;
+
+       cmd = (SV*)param;
+
+       ENTER;
+       SAVETMPS;
+       PUSHMARK(SP);
+       XPUSHs(sv_2mortal(newSViv(interval)));
+       PUTBACK;
+
+       if (0 != (back = call_sv(cmd,G_SCALAR))) {
+               SPAGAIN;
+               if (back != 1 ) Perl_croak (aTHX_ "Timer Callback failed!");
+               retval = POPi;  
+       } else {
+               Perl_croak(aTHX_ "Timer Callback failed!");
+       }
+
+       FREETMPS;
+       LEAVE;
+
+       LEAVE_TLS_CONTEXT
+       
+       return retval;
+}
+
+void
+sdl_perl_audio_callback ( void* data, Uint8 *stream, int len )
+{
+       SV *cmd;
+       ENTER_TLS_CONTEXT
+       dSP;
+
+       cmd = (SV*)data;
+
+       ENTER;
+       SAVETMPS;
+       PUSHMARK(SP);
+       XPUSHs(sv_2mortal(newSViv(PTR2IV(stream))));
+       XPUSHs(sv_2mortal(newSViv(len)));
+       PUTBACK;
+
+       call_sv(cmd,G_VOID|G_DISCARD);
+       
+       PUTBACK;
+       FREETMPS;
+       LEAVE;
+
+       LEAVE_TLS_CONTEXT       
+}
+
+#ifdef HAVE_SDL_MIXER
+
+void
+sdl_perl_music_callback ( void ) 
+{
+       SV *cmd;
+       ENTER_TLS_CONTEXT
+       dSP;
+
+       cmd = (SV*)Mix_GetMusicHookData();
+
+       ENTER;
+       SAVETMPS;
+       PUSHMARK(SP);
+       PUTBACK;
+       
+       call_sv(cmd,G_VOID|G_DISCARD);
+
+       PUTBACK;
+       FREETMPS;
+       LEAVE;
+
+       LEAVE_TLS_CONTEXT
+}
+
+void
+sdl_perl_music_finished_callback ( void )
+{
+       SV *cmd;
+       ENTER_TLS_CONTEXT
+       dSP;
+
+       cmd = (SV*)mix_music_finished_cv;
+       if ( cmd == NULL ) return;
+
+       ENTER;
+       SAVETMPS;
+       PUSHMARK(SP);
+       PUTBACK;
+       
+       call_sv(cmd,G_VOID|G_DISCARD);
+       
+       PUTBACK;
+       FREETMPS;
+       LEAVE;
+
+       LEAVE_TLS_CONTEXT
+}
+
+#endif
+
+#define INIT_NS_APPLICATION
+#define QUIT_NS_APPLICATION
+
+
+void
+sdl_perl_atexit (void)
+{
+       QUIT_NS_APPLICATION     
+       SDL_Quit();
+}
+
+void boot_SDL();
+void boot_SDL__OpenGL();
+
+XS(boot_SDL_perl)
+{
+       GET_TLS_CONTEXT
+       boot_SDL();
+}
+
+#line 241 "SDL_perl.c"
+XS(XS_SDL_GetError); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_GetError)
+{
+    dXSARGS;
+    if (items != 0)
+       Perl_croak(aTHX_ "Usage: SDL::GetError()");
+    {
+       char *  RETVAL;
+       dXSTARG;
+#line 237 "SDL_perl.xs"
+               RETVAL = SDL_GetError();
+#line 253 "SDL_perl.c"
+       sv_setpv(TARG, RETVAL); XSprePUSH; PUSHTARG;
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_Init); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_Init)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::Init(flags)");
+    {
+       Uint32  flags = (Uint32)SvUV(ST(0));
+       int     RETVAL;
+       dXSTARG;
+#line 245 "SDL_perl.xs"
+               INIT_NS_APPLICATION
+               RETVAL = SDL_Init(flags);
+#ifdef HAVE_TLS_CONTEXT
+               Perl_call_atexit(PERL_GET_CONTEXT, (void*)sdl_perl_atexit,0);
+#else
+               atexit(sdl_perl_atexit);
+#endif
+#line 277 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_InitSubSystem); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_InitSubSystem)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::InitSubSystem(flags)");
+    {
+       Uint32  flags = (Uint32)SvUV(ST(0));
+       int     RETVAL;
+       dXSTARG;
+#line 259 "SDL_perl.xs"
+               RETVAL = SDL_InitSubSystem(flags);
+#line 295 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_QuitSubSystem); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_QuitSubSystem)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::QuitSubSystem(flags)");
+    {
+       Uint32  flags = (Uint32)SvUV(ST(0));
+#line 267 "SDL_perl.xs"
+               SDL_QuitSubSystem(flags);
+#line 311 "SDL_perl.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL_Quit); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_Quit)
+{
+    dXSARGS;
+    if (items != 0)
+       Perl_croak(aTHX_ "Usage: SDL::Quit()");
+    {
+#line 272 "SDL_perl.xs"
+               QUIT_NS_APPLICATION
+               SDL_Quit();
+#line 326 "SDL_perl.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL_WasInit); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_WasInit)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::WasInit(flags)");
+    {
+       Uint32  flags = (Uint32)SvUV(ST(0));
+       int     RETVAL;
+       dXSTARG;
+#line 279 "SDL_perl.xs"
+               RETVAL = SDL_WasInit(flags);
+#line 343 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_Delay); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_Delay)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::Delay(ms)");
+    {
+       int     ms = (int)SvIV(ST(0));
+#line 287 "SDL_perl.xs"
+               SDL_Delay(ms);
+#line 359 "SDL_perl.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL_GetTicks); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_GetTicks)
+{
+    dXSARGS;
+    if (items != 0)
+       Perl_croak(aTHX_ "Usage: SDL::GetTicks()");
+    {
+       Uint32  RETVAL;
+       dXSTARG;
+#line 292 "SDL_perl.xs"
+               RETVAL = SDL_GetTicks();
+#line 375 "SDL_perl.c"
+       XSprePUSH; PUSHu((UV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_SetTimer); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_SetTimer)
+{
+    dXSARGS;
+    if (items != 2)
+       Perl_croak(aTHX_ "Usage: SDL::SetTimer(interval, callback)");
+    {
+       Uint32  interval = (Uint32)SvUV(ST(0));
+       SDL_TimerCallback       callback = INT2PTR(SDL_TimerCallback,SvIV(ST(1)));
+       int     RETVAL;
+       dXSTARG;
+#line 301 "SDL_perl.xs"
+               RETVAL = SDL_SetTimer(interval,callback);
+#line 394 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_AddTimer); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_AddTimer)
+{
+    dXSARGS;
+    if (items != 3)
+       Perl_croak(aTHX_ "Usage: SDL::AddTimer(interval, callback, param)");
+    {
+       Uint32  interval = (Uint32)SvUV(ST(0));
+       SDL_NewTimerCallback    callback = INT2PTR(SDL_NewTimerCallback,SvIV(ST(1)));
+       void *  param = INT2PTR(void *,SvIV(ST(2)));
+       SDL_TimerID     RETVAL;
+       dXSTARG;
+#line 311 "SDL_perl.xs"
+               RETVAL = SDL_AddTimer(interval,callback,param);
+#line 414 "SDL_perl.c"
+       XSprePUSH; PUSHi(PTR2IV(RETVAL));
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_PerlTimerCallback); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_PerlTimerCallback)
+{
+    dXSARGS;
+    if (items != 0)
+       Perl_croak(aTHX_ "Usage: SDL::PerlTimerCallback()");
+    {
+       SDL_NewTimerCallback    RETVAL;
+       dXSTARG;
+#line 318 "SDL_perl.xs"
+               RETVAL = sdl_perl_timer_callback;
+#line 431 "SDL_perl.c"
+       XSprePUSH; PUSHi(PTR2IV(RETVAL));
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_NewTimer); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_NewTimer)
+{
+    dXSARGS;
+    if (items != 2)
+       Perl_croak(aTHX_ "Usage: SDL::NewTimer(interval, cmd)");
+    {
+       Uint32  interval = (Uint32)SvUV(ST(0));
+       void *  cmd = INT2PTR(void *,SvIV(ST(1)));
+       SDL_TimerID     RETVAL;
+       dXSTARG;
+#line 327 "SDL_perl.xs"
+               RETVAL = SDL_AddTimer(interval,sdl_perl_timer_callback,cmd);
+#line 450 "SDL_perl.c"
+       XSprePUSH; PUSHi(PTR2IV(RETVAL));
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_RemoveTimer); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_RemoveTimer)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::RemoveTimer(id)");
+    {
+       SDL_TimerID     id = INT2PTR(SDL_TimerID,SvIV(ST(0)));
+       Uint32  RETVAL;
+       dXSTARG;
+#line 335 "SDL_perl.xs"
+               RETVAL = SDL_RemoveTimer(id);
+#line 468 "SDL_perl.c"
+       XSprePUSH; PUSHu((UV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_RWFromFile); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_RWFromFile)
+{
+    dXSARGS;
+    if (items != 2)
+       Perl_croak(aTHX_ "Usage: SDL::RWFromFile(file, mode)");
+    {
+       char*   file = (char *)SvPV_nolen(ST(0));
+       char *  mode = (char *)SvPV_nolen(ST(1));
+       SDL_RWops *     RETVAL;
+       dXSTARG;
+#line 344 "SDL_perl.xs"
+               RETVAL = SDL_RWFromFile(file,mode);
+#line 487 "SDL_perl.c"
+       XSprePUSH; PUSHi(PTR2IV(RETVAL));
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_RWFromFP); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_RWFromFP)
+{
+    dXSARGS;
+    if (items != 2)
+       Perl_croak(aTHX_ "Usage: SDL::RWFromFP(fp, autoclose)");
+    {
+       FILE*   fp = PerlIO_findFILE(IoIFP(sv_2io(ST(0))));
+       int     autoclose = (int)SvIV(ST(1));
+       SDL_RWops *     RETVAL;
+       dXSTARG;
+#line 353 "SDL_perl.xs"
+               RETVAL = SDL_RWFromFP(fp,autoclose);
+#line 506 "SDL_perl.c"
+       XSprePUSH; PUSHi(PTR2IV(RETVAL));
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_RWFromMem); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_RWFromMem)
+{
+    dXSARGS;
+    if (items != 2)
+       Perl_croak(aTHX_ "Usage: SDL::RWFromMem(mem, size)");
+    {
+       char*   mem = (char *)SvPV_nolen(ST(0));
+       int     size = (int)SvIV(ST(1));
+       SDL_RWops *     RETVAL;
+       dXSTARG;
+#line 362 "SDL_perl.xs"
+               RETVAL = SDL_RWFromMem((void*)mem,size);
+#line 525 "SDL_perl.c"
+       XSprePUSH; PUSHi(PTR2IV(RETVAL));
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_RWFromConstMem); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_RWFromConstMem)
+{
+    dXSARGS;
+    if (items != 2)
+       Perl_croak(aTHX_ "Usage: SDL::RWFromConstMem(mem, size)");
+    {
+       const char*     mem = (const char *)SvPV_nolen(ST(0));
+       int     size = (int)SvIV(ST(1));
+       SDL_RWops *     RETVAL;
+       dXSTARG;
+#line 371 "SDL_perl.xs"
+               RETVAL = SDL_RWFromConstMem((const void*)mem,size);
+#line 544 "SDL_perl.c"
+       XSprePUSH; PUSHi(PTR2IV(RETVAL));
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_AllocRW); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_AllocRW)
+{
+    dXSARGS;
+    if (items != 0)
+       Perl_croak(aTHX_ "Usage: SDL::AllocRW()");
+    {
+       SDL_RWops *     RETVAL;
+       dXSTARG;
+#line 378 "SDL_perl.xs"
+               RETVAL = SDL_AllocRW();
+#line 561 "SDL_perl.c"
+       XSprePUSH; PUSHi(PTR2IV(RETVAL));
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_FreeRW); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_FreeRW)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::FreeRW(rw)");
+    {
+       SDL_RWops*      rw = INT2PTR(SDL_RWops *,SvIV(ST(0)));
+#line 386 "SDL_perl.xs"
+               SDL_FreeRW(rw);
+#line 577 "SDL_perl.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL_RWseek); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_RWseek)
+{
+    dXSARGS;
+    if (items != 3)
+       Perl_croak(aTHX_ "Usage: SDL::RWseek(rw, off, whence)");
+    {
+       SDL_RWops*      rw = INT2PTR(SDL_RWops *,SvIV(ST(0)));
+       int     off = (int)SvIV(ST(1));
+       int     whence = (int)SvIV(ST(2));
+       int     RETVAL;
+       dXSTARG;
+#line 394 "SDL_perl.xs"
+               RETVAL = SDL_RWseek(rw,off,whence);
+#line 596 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_RWtell); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_RWtell)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::RWtell(rw)");
+    {
+       SDL_RWops*      rw = INT2PTR(SDL_RWops *,SvIV(ST(0)));
+       int     RETVAL;
+       dXSTARG;
+#line 402 "SDL_perl.xs"
+               RETVAL = SDL_RWtell(rw);
+#line 614 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_RWread); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_RWread)
+{
+    dXSARGS;
+    if (items != 4)
+       Perl_croak(aTHX_ "Usage: SDL::RWread(rw, mem, size, n)");
+    {
+       SDL_RWops*      rw = INT2PTR(SDL_RWops *,SvIV(ST(0)));
+       char*   mem = (char *)SvPV_nolen(ST(1));
+       int     size = (int)SvIV(ST(2));
+       int     n = (int)SvIV(ST(3));
+       int     RETVAL;
+       dXSTARG;
+#line 413 "SDL_perl.xs"
+               RETVAL = SDL_RWread(rw,mem,size,n);
+#line 635 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_RWwrite); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_RWwrite)
+{
+    dXSARGS;
+    if (items != 4)
+       Perl_croak(aTHX_ "Usage: SDL::RWwrite(rw, mem, size, n)");
+    {
+       SDL_RWops*      rw = INT2PTR(SDL_RWops *,SvIV(ST(0)));
+       char*   mem = (char *)SvPV_nolen(ST(1));
+       int     size = (int)SvIV(ST(2));
+       int     n = (int)SvIV(ST(3));
+       int     RETVAL;
+       dXSTARG;
+#line 424 "SDL_perl.xs"
+               RETVAL = SDL_RWwrite(rw,mem,size,n);
+#line 656 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_RWclose); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_RWclose)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::RWclose(rw)");
+    {
+       SDL_RWops*      rw = INT2PTR(SDL_RWops *,SvIV(ST(0)));
+       int     RETVAL;
+       dXSTARG;
+#line 432 "SDL_perl.xs"
+               RETVAL = SDL_RWclose(rw);
+#line 674 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_CDNumDrives); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_CDNumDrives)
+{
+    dXSARGS;
+    if (items != 0)
+       Perl_croak(aTHX_ "Usage: SDL::CDNumDrives()");
+    {
+       int     RETVAL;
+       dXSTARG;
+#line 439 "SDL_perl.xs"
+               RETVAL = SDL_CDNumDrives();
+#line 691 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_CDName); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_CDName)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::CDName(drive)");
+    {
+       int     drive = (int)SvIV(ST(0));
+       char *  RETVAL;
+       dXSTARG;
+#line 447 "SDL_perl.xs"
+               RETVAL = strdup(SDL_CDName(drive));
+#line 709 "SDL_perl.c"
+       sv_setpv(TARG, RETVAL); XSprePUSH; PUSHTARG;
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_CDOpen); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_CDOpen)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::CDOpen(drive)");
+    {
+       int     drive = (int)SvIV(ST(0));
+       SDL_CD *        RETVAL;
+       dXSTARG;
+#line 455 "SDL_perl.xs"
+               RETVAL = SDL_CDOpen(drive);
+#line 727 "SDL_perl.c"
+       XSprePUSH; PUSHi(PTR2IV(RETVAL));
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_CDTrackId); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_CDTrackId)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::CDTrackId(track)");
+    {
+       SDL_CDtrack *   track = INT2PTR(SDL_CDtrack *,SvIV(ST(0)));
+       Uint8   RETVAL;
+       dXSTARG;
+#line 463 "SDL_perl.xs"
+               RETVAL = track->id;
+#line 745 "SDL_perl.c"
+       XSprePUSH; PUSHu((UV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_CDTrackType); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_CDTrackType)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::CDTrackType(track)");
+    {
+       SDL_CDtrack *   track = INT2PTR(SDL_CDtrack *,SvIV(ST(0)));
+       Uint8   RETVAL;
+       dXSTARG;
+#line 471 "SDL_perl.xs"
+               RETVAL = track->type;
+#line 763 "SDL_perl.c"
+       XSprePUSH; PUSHu((UV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_CDTrackLength); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_CDTrackLength)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::CDTrackLength(track)");
+    {
+       SDL_CDtrack *   track = INT2PTR(SDL_CDtrack *,SvIV(ST(0)));
+       Uint16  RETVAL;
+       dXSTARG;
+#line 479 "SDL_perl.xs"
+               RETVAL = track->length;
+#line 781 "SDL_perl.c"
+       XSprePUSH; PUSHu((UV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_CDTrackOffset); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_CDTrackOffset)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::CDTrackOffset(track)");
+    {
+       SDL_CDtrack *   track = INT2PTR(SDL_CDtrack *,SvIV(ST(0)));
+       Uint32  RETVAL;
+       dXSTARG;
+#line 487 "SDL_perl.xs"
+               RETVAL = track->offset;
+#line 799 "SDL_perl.c"
+       XSprePUSH; PUSHu((UV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_CDStatus); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_CDStatus)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::CDStatus(cd)");
+    {
+       SDL_CD *        cd = INT2PTR(SDL_CD *,SvIV(ST(0)));
+       Uint32  RETVAL;
+       dXSTARG;
+#line 495 "SDL_perl.xs"
+               RETVAL = SDL_CDStatus(cd);
+#line 817 "SDL_perl.c"
+       XSprePUSH; PUSHu((UV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_CDPlayTracks); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_CDPlayTracks)
+{
+    dXSARGS;
+    if (items != 5)
+       Perl_croak(aTHX_ "Usage: SDL::CDPlayTracks(cd, start_track, ntracks, start_frame, nframes)");
+    {
+       SDL_CD *        cd = INT2PTR(SDL_CD *,SvIV(ST(0)));
+       int     start_track = (int)SvIV(ST(1));
+       int     ntracks = (int)SvIV(ST(2));
+       int     start_frame = (int)SvIV(ST(3));
+       int     nframes = (int)SvIV(ST(4));
+       int     RETVAL;
+       dXSTARG;
+#line 507 "SDL_perl.xs"
+               RETVAL = SDL_CDPlayTracks(cd,start_track,start_frame,ntracks,nframes);
+#line 839 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_CDPlay); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_CDPlay)
+{
+    dXSARGS;
+    if (items != 3)
+       Perl_croak(aTHX_ "Usage: SDL::CDPlay(cd, start, length)");
+    {
+       SDL_CD *        cd = INT2PTR(SDL_CD *,SvIV(ST(0)));
+       int     start = (int)SvIV(ST(1));
+       int     length = (int)SvIV(ST(2));
+       int     RETVAL;
+       dXSTARG;
+#line 517 "SDL_perl.xs"
+               RETVAL = SDL_CDPlay(cd,start,length);
+#line 859 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_CDPause); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_CDPause)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::CDPause(cd)");
+    {
+       SDL_CD *        cd = INT2PTR(SDL_CD *,SvIV(ST(0)));
+       int     RETVAL;
+       dXSTARG;
+#line 525 "SDL_perl.xs"
+               RETVAL = SDL_CDPause(cd);
+#line 877 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_CDResume); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_CDResume)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::CDResume(cd)");
+    {
+       SDL_CD *        cd = INT2PTR(SDL_CD *,SvIV(ST(0)));
+       int     RETVAL;
+       dXSTARG;
+#line 533 "SDL_perl.xs"
+               RETVAL = SDL_CDResume(cd);
+#line 895 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_CDStop); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_CDStop)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::CDStop(cd)");
+    {
+       SDL_CD *        cd = INT2PTR(SDL_CD *,SvIV(ST(0)));
+       int     RETVAL;
+       dXSTARG;
+#line 541 "SDL_perl.xs"
+               RETVAL = SDL_CDStop(cd);
+#line 913 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_CDEject); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_CDEject)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::CDEject(cd)");
+    {
+       SDL_CD *        cd = INT2PTR(SDL_CD *,SvIV(ST(0)));
+       int     RETVAL;
+       dXSTARG;
+#line 549 "SDL_perl.xs"
+               RETVAL = SDL_CDEject(cd);
+#line 931 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_CDClose); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_CDClose)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::CDClose(cd)");
+    {
+       SDL_CD *        cd = INT2PTR(SDL_CD *,SvIV(ST(0)));
+#line 557 "SDL_perl.xs"
+               SDL_CDClose(cd);
+#line 947 "SDL_perl.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL_CDId); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_CDId)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::CDId(cd)");
+    {
+       SDL_CD *        cd = INT2PTR(SDL_CD *,SvIV(ST(0)));
+       int     RETVAL;
+       dXSTARG;
+#line 563 "SDL_perl.xs"
+               RETVAL = cd->id;
+#line 964 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_CDNumTracks); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_CDNumTracks)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::CDNumTracks(cd)");
+    {
+       SDL_CD *        cd = INT2PTR(SDL_CD *,SvIV(ST(0)));
+       int     RETVAL;
+       dXSTARG;
+#line 571 "SDL_perl.xs"
+               RETVAL = cd->numtracks;
+#line 982 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_CDCurTrack); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_CDCurTrack)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::CDCurTrack(cd)");
+    {
+       SDL_CD *        cd = INT2PTR(SDL_CD *,SvIV(ST(0)));
+       int     RETVAL;
+       dXSTARG;
+#line 579 "SDL_perl.xs"
+               RETVAL = cd->cur_track;
+#line 1000 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_CDCurFrame); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_CDCurFrame)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::CDCurFrame(cd)");
+    {
+       SDL_CD *        cd = INT2PTR(SDL_CD *,SvIV(ST(0)));
+       int     RETVAL;
+       dXSTARG;
+#line 587 "SDL_perl.xs"
+               RETVAL = cd->cur_frame;
+#line 1018 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_CDTrack); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_CDTrack)
+{
+    dXSARGS;
+    if (items != 2)
+       Perl_croak(aTHX_ "Usage: SDL::CDTrack(cd, number)");
+    {
+       SDL_CD *        cd = INT2PTR(SDL_CD *,SvIV(ST(0)));
+       int     number = (int)SvIV(ST(1));
+       SDL_CDtrack *   RETVAL;
+       dXSTARG;
+#line 596 "SDL_perl.xs"
+               RETVAL = (SDL_CDtrack *)(cd->track + number);
+#line 1037 "SDL_perl.c"
+       XSprePUSH; PUSHi(PTR2IV(RETVAL));
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_PumpEvents); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_PumpEvents)
+{
+    dXSARGS;
+    if (items != 0)
+       Perl_croak(aTHX_ "Usage: SDL::PumpEvents()");
+    {
+#line 603 "SDL_perl.xs"
+               SDL_PumpEvents();
+#line 1052 "SDL_perl.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL_PushEvent); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_PushEvent)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::PushEvent(e)");
+    {
+       SDL_Event *     e = INT2PTR(SDL_Event *,SvIV(ST(0)));
+       int     RETVAL;
+       dXSTARG;
+#line 609 "SDL_perl.xs"
+               RETVAL = SDL_PushEvent( e );
+#line 1069 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_NewEvent); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_NewEvent)
+{
+    dXSARGS;
+    if (items != 0)
+       Perl_croak(aTHX_ "Usage: SDL::NewEvent()");
+    {
+       SDL_Event *     RETVAL;
+       dXSTARG;
+#line 616 "SDL_perl.xs"
+               RETVAL = (SDL_Event *) safemalloc (sizeof(SDL_Event));
+#line 1086 "SDL_perl.c"
+       XSprePUSH; PUSHi(PTR2IV(RETVAL));
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_FreeEvent); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_FreeEvent)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::FreeEvent(e)");
+    {
+       SDL_Event *     e = INT2PTR(SDL_Event *,SvIV(ST(0)));
+#line 624 "SDL_perl.xs"
+               safefree(e);
+#line 1102 "SDL_perl.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL_PollEvent); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_PollEvent)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::PollEvent(e)");
+    {
+       SDL_Event *     e = INT2PTR(SDL_Event *,SvIV(ST(0)));
+       int     RETVAL;
+       dXSTARG;
+#line 630 "SDL_perl.xs"
+               RETVAL = SDL_PollEvent(e);
+#line 1119 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_WaitEvent); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_WaitEvent)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::WaitEvent(e)");
+    {
+       SDL_Event *     e = INT2PTR(SDL_Event *,SvIV(ST(0)));
+       int     RETVAL;
+       dXSTARG;
+#line 638 "SDL_perl.xs"
+               RETVAL = SDL_WaitEvent(e);
+#line 1137 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_EventState); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_EventState)
+{
+    dXSARGS;
+    if (items != 2)
+       Perl_croak(aTHX_ "Usage: SDL::EventState(type, state)");
+    {
+       Uint8   type = (unsigned char)SvUV(ST(0));
+       int     state = (int)SvIV(ST(1));
+       Uint8   RETVAL;
+       dXSTARG;
+#line 647 "SDL_perl.xs"
+               RETVAL = SDL_EventState(type,state);
+#line 1156 "SDL_perl.c"
+       XSprePUSH; PUSHu((UV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_EventType); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_EventType)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::EventType(e)");
+    {
+       SDL_Event *     e = INT2PTR(SDL_Event *,SvIV(ST(0)));
+       Uint8   RETVAL;
+       dXSTARG;
+#line 655 "SDL_perl.xs"
+               RETVAL = e->type;
+#line 1174 "SDL_perl.c"
+       XSprePUSH; PUSHu((UV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_SetEventType); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_SetEventType)
+{
+    dXSARGS;
+    if (items != 2)
+       Perl_croak(aTHX_ "Usage: SDL::SetEventType(e, type)");
+    {
+       SDL_Event *     e = INT2PTR(SDL_Event *,SvIV(ST(0)));
+       Uint8   type = (unsigned char)SvUV(ST(1));
+       Uint8   RETVAL;
+       dXSTARG;
+#line 664 "SDL_perl.xs"
+               RETVAL = e->type;
+               e->type = type;
+#line 1194 "SDL_perl.c"
+       XSprePUSH; PUSHu((UV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_ActiveEventGain); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_ActiveEventGain)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::ActiveEventGain(e)");
+    {
+       SDL_Event *     e = INT2PTR(SDL_Event *,SvIV(ST(0)));
+       Uint8   RETVAL;
+       dXSTARG;
+#line 673 "SDL_perl.xs"
+               RETVAL = e->active.gain;
+#line 1212 "SDL_perl.c"
+       XSprePUSH; PUSHu((UV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_ActiveEventState); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_ActiveEventState)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::ActiveEventState(e)");
+    {
+       SDL_Event *     e = INT2PTR(SDL_Event *,SvIV(ST(0)));
+       Uint8   RETVAL;
+       dXSTARG;
+#line 681 "SDL_perl.xs"
+               RETVAL = e->active.state;
+#line 1230 "SDL_perl.c"
+       XSprePUSH; PUSHu((UV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_KeyEventState); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_KeyEventState)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::KeyEventState(e)");
+    {
+       SDL_Event *     e = INT2PTR(SDL_Event *,SvIV(ST(0)));
+       Uint8   RETVAL;
+       dXSTARG;
+#line 689 "SDL_perl.xs"
+               RETVAL = e->key.state;
+#line 1248 "SDL_perl.c"
+       XSprePUSH; PUSHu((UV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_KeyEventSym); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_KeyEventSym)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::KeyEventSym(e)");
+    {
+       SDL_Event *     e = INT2PTR(SDL_Event *,SvIV(ST(0)));
+       int     RETVAL;
+       dXSTARG;
+#line 697 "SDL_perl.xs"
+               RETVAL = e->key.keysym.sym;
+#line 1266 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_KeyEventMod); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_KeyEventMod)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::KeyEventMod(e)");
+    {
+       SDL_Event *     e = INT2PTR(SDL_Event *,SvIV(ST(0)));
+       int     RETVAL;
+       dXSTARG;
+#line 705 "SDL_perl.xs"
+               RETVAL = e->key.keysym.mod;
+#line 1284 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_KeyEventUnicode); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_KeyEventUnicode)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::KeyEventUnicode(e)");
+    {
+       SDL_Event *     e = INT2PTR(SDL_Event *,SvIV(ST(0)));
+       Uint16  RETVAL;
+       dXSTARG;
+#line 713 "SDL_perl.xs"
+               RETVAL = e->key.keysym.unicode;
+#line 1302 "SDL_perl.c"
+       XSprePUSH; PUSHu((UV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_KeyEventScanCode); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_KeyEventScanCode)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::KeyEventScanCode(e)");
+    {
+       SDL_Event *     e = INT2PTR(SDL_Event *,SvIV(ST(0)));
+       Uint8   RETVAL;
+       dXSTARG;
+#line 721 "SDL_perl.xs"
+               RETVAL = e->key.keysym.scancode;
+#line 1320 "SDL_perl.c"
+       XSprePUSH; PUSHu((UV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_MouseMotionState); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_MouseMotionState)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::MouseMotionState(e)");
+    {
+       SDL_Event *     e = INT2PTR(SDL_Event *,SvIV(ST(0)));
+       Uint8   RETVAL;
+       dXSTARG;
+#line 729 "SDL_perl.xs"
+               RETVAL = e->motion.state;
+#line 1338 "SDL_perl.c"
+       XSprePUSH; PUSHu((UV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_MouseMotionX); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_MouseMotionX)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::MouseMotionX(e)");
+    {
+       SDL_Event *     e = INT2PTR(SDL_Event *,SvIV(ST(0)));
+       Uint16  RETVAL;
+       dXSTARG;
+#line 737 "SDL_perl.xs"
+               RETVAL = e->motion.x;
+#line 1356 "SDL_perl.c"
+       XSprePUSH; PUSHu((UV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_MouseMotionY); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_MouseMotionY)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::MouseMotionY(e)");
+    {
+       SDL_Event *     e = INT2PTR(SDL_Event *,SvIV(ST(0)));
+       Uint16  RETVAL;
+       dXSTARG;
+#line 745 "SDL_perl.xs"
+               RETVAL = e->motion.y;
+#line 1374 "SDL_perl.c"
+       XSprePUSH; PUSHu((UV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_MouseMotionXrel); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_MouseMotionXrel)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::MouseMotionXrel(e)");
+    {
+       SDL_Event *     e = INT2PTR(SDL_Event *,SvIV(ST(0)));
+       Sint16  RETVAL;
+       dXSTARG;
+#line 753 "SDL_perl.xs"
+               RETVAL = e->motion.xrel;
+#line 1392 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_MouseMotionYrel); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_MouseMotionYrel)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::MouseMotionYrel(e)");
+    {
+       SDL_Event *     e = INT2PTR(SDL_Event *,SvIV(ST(0)));
+       Sint16  RETVAL;
+       dXSTARG;
+#line 761 "SDL_perl.xs"
+               RETVAL = e->motion.yrel;
+#line 1410 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_MouseButtonState); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_MouseButtonState)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::MouseButtonState(e)");
+    {
+       SDL_Event *     e = INT2PTR(SDL_Event *,SvIV(ST(0)));
+       Uint8   RETVAL;
+       dXSTARG;
+#line 769 "SDL_perl.xs"
+               RETVAL = e->button.state;
+#line 1428 "SDL_perl.c"
+       XSprePUSH; PUSHu((UV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_MouseButton); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_MouseButton)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::MouseButton(e)");
+    {
+       SDL_Event *     e = INT2PTR(SDL_Event *,SvIV(ST(0)));
+       Uint8   RETVAL;
+       dXSTARG;
+#line 777 "SDL_perl.xs"
+               RETVAL = e->button.button;
+#line 1446 "SDL_perl.c"
+       XSprePUSH; PUSHu((UV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_MouseButtonX); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_MouseButtonX)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::MouseButtonX(e)");
+    {
+       SDL_Event *     e = INT2PTR(SDL_Event *,SvIV(ST(0)));
+       Uint16  RETVAL;
+       dXSTARG;
+#line 785 "SDL_perl.xs"
+               RETVAL = e->button.x;
+#line 1464 "SDL_perl.c"
+       XSprePUSH; PUSHu((UV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_MouseButtonY); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_MouseButtonY)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::MouseButtonY(e)");
+    {
+       SDL_Event *     e = INT2PTR(SDL_Event *,SvIV(ST(0)));
+       Uint16  RETVAL;
+       dXSTARG;
+#line 793 "SDL_perl.xs"
+               RETVAL = e->button.y;
+#line 1482 "SDL_perl.c"
+       XSprePUSH; PUSHu((UV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_SysWMEventMsg); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_SysWMEventMsg)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::SysWMEventMsg(e)");
+    {
+       SDL_Event *     e = INT2PTR(SDL_Event *,SvIV(ST(0)));
+       SDL_SysWMmsg *  RETVAL;
+       dXSTARG;
+#line 801 "SDL_perl.xs"
+               RETVAL = e->syswm.msg;
+#line 1500 "SDL_perl.c"
+       XSprePUSH; PUSHi(PTR2IV(RETVAL));
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_EnableUnicode); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_EnableUnicode)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::EnableUnicode(enable)");
+    {
+       int     enable = (int)SvIV(ST(0));
+       int     RETVAL;
+       dXSTARG;
+#line 809 "SDL_perl.xs"
+               RETVAL = SDL_EnableUNICODE(enable);
+#line 1518 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_EnableKeyRepeat); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_EnableKeyRepeat)
+{
+    dXSARGS;
+    if (items != 2)
+       Perl_croak(aTHX_ "Usage: SDL::EnableKeyRepeat(delay, interval)");
+    {
+       int     delay = (int)SvIV(ST(0));
+       int     interval = (int)SvIV(ST(1));
+#line 818 "SDL_perl.xs"
+               SDL_EnableKeyRepeat(delay,interval);
+#line 1535 "SDL_perl.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL_GetModState); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_GetModState)
+{
+    dXSARGS;
+    if (items != 0)
+       Perl_croak(aTHX_ "Usage: SDL::GetModState()");
+    {
+       Uint32  RETVAL;
+       dXSTARG;
+#line 823 "SDL_perl.xs"
+               RETVAL = SDL_GetModState();
+#line 1551 "SDL_perl.c"
+       XSprePUSH; PUSHu((UV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_SetModState); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_SetModState)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::SetModState(state)");
+    {
+       Uint32  state = (Uint32)SvUV(ST(0));
+#line 831 "SDL_perl.xs"
+               SDL_SetModState(state);
+#line 1567 "SDL_perl.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL_GetKeyName); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_GetKeyName)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::GetKeyName(sym)");
+    {
+       int     sym = (int)SvIV(ST(0));
+       char *  RETVAL;
+       dXSTARG;
+#line 837 "SDL_perl.xs"
+               RETVAL = SDL_GetKeyName(sym);
+#line 1584 "SDL_perl.c"
+       sv_setpv(TARG, RETVAL); XSprePUSH; PUSHTARG;
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_CreateRGBSurface); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_CreateRGBSurface)
+{
+    dXSARGS;
+    if (items != 8)
+       Perl_croak(aTHX_ "Usage: SDL::CreateRGBSurface(flags, width, height, depth, Rmask, Gmask, Bmask, Amask)");
+    {
+       Uint32  flags = (Uint32)SvUV(ST(0));
+       int     width = (int)SvIV(ST(1));
+       int     height = (int)SvIV(ST(2));
+       int     depth = (int)SvIV(ST(3));
+       Uint32  Rmask = (Uint32)SvUV(ST(4));
+       Uint32  Gmask = (Uint32)SvUV(ST(5));
+       Uint32  Bmask = (Uint32)SvUV(ST(6));
+       Uint32  Amask = (Uint32)SvUV(ST(7));
+       SDL_Surface *   RETVAL;
+       dXSTARG;
+#line 852 "SDL_perl.xs"
+               RETVAL = SDL_CreateRGBSurface ( flags, width, height,
+                               depth, Rmask, Gmask, Bmask, Amask );
+#line 1610 "SDL_perl.c"
+       XSprePUSH; PUSHi(PTR2IV(RETVAL));
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_CreateRGBSurfaceFrom); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_CreateRGBSurfaceFrom)
+{
+    dXSARGS;
+    if (items != 9)
+       Perl_croak(aTHX_ "Usage: SDL::CreateRGBSurfaceFrom(pixels, width, height, depth, pitch, Rmask, Gmask, Bmask, Amask)");
+    {
+       char *  pixels = (char *)SvPV_nolen(ST(0));
+       int     width = (int)SvIV(ST(1));
+       int     height = (int)SvIV(ST(2));
+       int     depth = (int)SvIV(ST(3));
+       int     pitch = (int)SvIV(ST(4));
+       Uint32  Rmask = (Uint32)SvUV(ST(5));
+       Uint32  Gmask = (Uint32)SvUV(ST(6));
+       Uint32  Bmask = (Uint32)SvUV(ST(7));
+       Uint32  Amask = (Uint32)SvUV(ST(8));
+       SDL_Surface *   RETVAL;
+       dXSTARG;
+#line 870 "SDL_perl.xs"
+               Uint8* pixeldata;
+               Uint32 len = pitch * height;
+               New(0,pixeldata,len,Uint8);
+               Copy(pixels,pixeldata,len,Uint8);
+               RETVAL = SDL_CreateRGBSurfaceFrom ( pixeldata, width, height,
+                               depth, pitch, Rmask, Gmask, Bmask, Amask );
+#line 1641 "SDL_perl.c"
+       XSprePUSH; PUSHi(PTR2IV(RETVAL));
+    }
+    XSRETURN(1);
+}
+
+#ifdef HAVE_SDL_IMAGE
+#define XSubPPtmpAAAA 1
+
+XS(XS_SDL_IMGLoad); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_IMGLoad)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::IMGLoad(fname)");
+    {
+       char *  fname = (char *)SvPV_nolen(ST(0));
+       SDL_Surface *   RETVAL;
+       dXSTARG;
+#line 885 "SDL_perl.xs"
+               RETVAL = IMG_Load(fname);
+#line 1662 "SDL_perl.c"
+       XSprePUSH; PUSHi(PTR2IV(RETVAL));
+    }
+    XSRETURN(1);
+}
+
+#endif
+XS(XS_SDL_SurfaceCopy); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_SurfaceCopy)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::SurfaceCopy(surface)");
+    {
+       SDL_Surface *   surface = INT2PTR(SDL_Surface *,SvIV(ST(0)));
+       SDL_Surface *   RETVAL;
+       dXSTARG;
+#line 895 "SDL_perl.xs"
+               Uint8* pixels;
+               Uint32 size = surface->pitch * surface->h;
+               New(0,pixels,size,Uint8);
+               Copy(surface->pixels,pixels,size,Uint8);
+               RETVAL = SDL_CreateRGBSurfaceFrom(pixels,surface->w,surface->h,
+                       surface->format->BitsPerPixel, surface->pitch,
+                       surface->format->Rmask, surface->format->Gmask,
+                       surface->format->Bmask, surface->format->Amask);
+#line 1688 "SDL_perl.c"
+       XSprePUSH; PUSHi(PTR2IV(RETVAL));
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_FreeSurface); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_FreeSurface)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::FreeSurface(surface)");
+    {
+       SDL_Surface *   surface = INT2PTR(SDL_Surface *,SvIV(ST(0)));
+#line 910 "SDL_perl.xs"
+               if (surface) {
+                       Uint8* pixels = surface->pixels;
+                       Uint32 flags = surface->flags;
+                       SDL_FreeSurface(surface);
+                       if (flags & SDL_PREALLOC)
+                               Safefree(pixels);
+               }
+#line 1710 "SDL_perl.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL_SurfaceFlags); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_SurfaceFlags)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::SurfaceFlags(surface)");
+    {
+       SDL_Surface *   surface = INT2PTR(SDL_Surface *,SvIV(ST(0)));
+       Uint32  RETVAL;
+       dXSTARG;
+#line 922 "SDL_perl.xs"
+               RETVAL = surface->flags;
+#line 1727 "SDL_perl.c"
+       XSprePUSH; PUSHu((UV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_SurfacePalette); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_SurfacePalette)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::SurfacePalette(surface)");
+    {
+       SDL_Surface *   surface = INT2PTR(SDL_Surface *,SvIV(ST(0)));
+       SDL_Palette *   RETVAL;
+       dXSTARG;
+#line 930 "SDL_perl.xs"
+               RETVAL = surface->format->palette;
+#line 1745 "SDL_perl.c"
+       XSprePUSH; PUSHi(PTR2IV(RETVAL));
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_SurfaceBitsPerPixel); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_SurfaceBitsPerPixel)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::SurfaceBitsPerPixel(surface)");
+    {
+       SDL_Surface *   surface = INT2PTR(SDL_Surface *,SvIV(ST(0)));
+       Uint8   RETVAL;
+       dXSTARG;
+#line 938 "SDL_perl.xs"
+               RETVAL = surface->format->BitsPerPixel;
+#line 1763 "SDL_perl.c"
+       XSprePUSH; PUSHu((UV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_SurfaceBytesPerPixel); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_SurfaceBytesPerPixel)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::SurfaceBytesPerPixel(surface)");
+    {
+       SDL_Surface *   surface = INT2PTR(SDL_Surface *,SvIV(ST(0)));
+       Uint8   RETVAL;
+       dXSTARG;
+#line 946 "SDL_perl.xs"
+               RETVAL = surface->format->BytesPerPixel;
+#line 1781 "SDL_perl.c"
+       XSprePUSH; PUSHu((UV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_SurfaceRshift); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_SurfaceRshift)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::SurfaceRshift(surface)");
+    {
+       SDL_Surface *   surface = INT2PTR(SDL_Surface *,SvIV(ST(0)));
+       Uint8   RETVAL;
+       dXSTARG;
+#line 954 "SDL_perl.xs"
+               RETVAL = surface->format->Rshift;
+#line 1799 "SDL_perl.c"
+       XSprePUSH; PUSHu((UV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_SurfaceGshift); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_SurfaceGshift)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::SurfaceGshift(surface)");
+    {
+       SDL_Surface *   surface = INT2PTR(SDL_Surface *,SvIV(ST(0)));
+       Uint8   RETVAL;
+       dXSTARG;
+#line 962 "SDL_perl.xs"
+               RETVAL = surface->format->Gshift;
+#line 1817 "SDL_perl.c"
+       XSprePUSH; PUSHu((UV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_SurfaceBshift); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_SurfaceBshift)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::SurfaceBshift(surface)");
+    {
+       SDL_Surface *   surface = INT2PTR(SDL_Surface *,SvIV(ST(0)));
+       Uint8   RETVAL;
+       dXSTARG;
+#line 970 "SDL_perl.xs"
+               RETVAL = surface->format->Bshift;
+#line 1835 "SDL_perl.c"
+       XSprePUSH; PUSHu((UV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_SurfaceAshift); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_SurfaceAshift)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::SurfaceAshift(surface)");
+    {
+       SDL_Surface *   surface = INT2PTR(SDL_Surface *,SvIV(ST(0)));
+       Uint8   RETVAL;
+       dXSTARG;
+#line 978 "SDL_perl.xs"
+               RETVAL = surface->format->Ashift;
+#line 1853 "SDL_perl.c"
+       XSprePUSH; PUSHu((UV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_SurfaceRmask); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_SurfaceRmask)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::SurfaceRmask(surface)");
+    {
+       SDL_Surface *   surface = INT2PTR(SDL_Surface *,SvIV(ST(0)));
+       Uint32  RETVAL;
+       dXSTARG;
+#line 986 "SDL_perl.xs"
+               RETVAL = surface->format->Rmask;
+#line 1871 "SDL_perl.c"
+       XSprePUSH; PUSHu((UV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_SurfaceGmask); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_SurfaceGmask)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::SurfaceGmask(surface)");
+    {
+       SDL_Surface *   surface = INT2PTR(SDL_Surface *,SvIV(ST(0)));
+       Uint32  RETVAL;
+       dXSTARG;
+#line 994 "SDL_perl.xs"
+               RETVAL = surface->format->Gmask;
+#line 1889 "SDL_perl.c"
+       XSprePUSH; PUSHu((UV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_SurfaceBmask); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_SurfaceBmask)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::SurfaceBmask(surface)");
+    {
+       SDL_Surface *   surface = INT2PTR(SDL_Surface *,SvIV(ST(0)));
+       Uint32  RETVAL;
+       dXSTARG;
+#line 1002 "SDL_perl.xs"
+               RETVAL = surface->format->Bmask;
+#line 1907 "SDL_perl.c"
+       XSprePUSH; PUSHu((UV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_SurfaceAmask); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_SurfaceAmask)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::SurfaceAmask(surface)");
+    {
+       SDL_Surface *   surface = INT2PTR(SDL_Surface *,SvIV(ST(0)));
+       Uint32  RETVAL;
+       dXSTARG;
+#line 1010 "SDL_perl.xs"
+               RETVAL = surface->format->Amask;
+#line 1925 "SDL_perl.c"
+       XSprePUSH; PUSHu((UV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_SurfaceColorKey); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_SurfaceColorKey)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::SurfaceColorKey(surface)");
+    {
+       SDL_Surface *   surface = INT2PTR(SDL_Surface *,SvIV(ST(0)));
+       Uint32  RETVAL;
+       dXSTARG;
+#line 1018 "SDL_perl.xs"
+               RETVAL = surface->format->colorkey;
+#line 1943 "SDL_perl.c"
+       XSprePUSH; PUSHu((UV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_SurfaceAlpha); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_SurfaceAlpha)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::SurfaceAlpha(surface)");
+    {
+       SDL_Surface *   surface = INT2PTR(SDL_Surface *,SvIV(ST(0)));
+       Uint32  RETVAL;
+       dXSTARG;
+#line 1026 "SDL_perl.xs"
+               RETVAL = surface->format->alpha;
+#line 1961 "SDL_perl.c"
+       XSprePUSH; PUSHu((UV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_SurfaceW); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_SurfaceW)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::SurfaceW(surface)");
+    {
+       SDL_Surface *   surface = INT2PTR(SDL_Surface *,SvIV(ST(0)));
+       int     RETVAL;
+       dXSTARG;
+#line 1034 "SDL_perl.xs"
+               RETVAL = surface->w;
+#line 1979 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_SurfaceH); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_SurfaceH)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::SurfaceH(surface)");
+    {
+       SDL_Surface *   surface = INT2PTR(SDL_Surface *,SvIV(ST(0)));
+       int     RETVAL;
+       dXSTARG;
+#line 1042 "SDL_perl.xs"
+               RETVAL = surface->h;
+#line 1997 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_SurfacePitch); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_SurfacePitch)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::SurfacePitch(surface)");
+    {
+       SDL_Surface *   surface = INT2PTR(SDL_Surface *,SvIV(ST(0)));
+       Uint16  RETVAL;
+       dXSTARG;
+#line 1050 "SDL_perl.xs"
+               RETVAL = surface->pitch;
+#line 2015 "SDL_perl.c"
+       XSprePUSH; PUSHu((UV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_SurfacePixels); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_SurfacePixels)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::SurfacePixels(surface)");
+    {
+       SDL_Surface *   surface = INT2PTR(SDL_Surface *,SvIV(ST(0)));
+       SV *    RETVAL;
+#line 1058 "SDL_perl.xs"
+               RETVAL = newSVpvn(surface->pixels,surface->pitch*surface->h);
+#line 2032 "SDL_perl.c"
+       ST(0) = RETVAL;
+       sv_2mortal(ST(0));
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_SurfacePixel); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_SurfacePixel)
+{
+    dXSARGS;
+    if (items < 3)
+       Perl_croak(aTHX_ "Usage: SDL::SurfacePixel(surface, x, y, ...)");
+    {
+       SDL_Surface *   surface = INT2PTR(SDL_Surface *,SvIV(ST(0)));
+       Sint32  x = (Sint32)SvIV(ST(1));
+       Sint32  y = (Sint32)SvIV(ST(2));
+       SDL_Color *     RETVAL;
+       dXSTARG;
+#line 1068 "SDL_perl.xs"
+               SDL_Color* color;
+               int pix,index;
+               Uint8 r,g,b,a;
+               int bpp = surface->format->BytesPerPixel;
+               Uint8* p = (Uint8*)surface->pixels + bpp*x + surface->pitch*y;
+               if ( items < 3 || items > 4 ) 
+                       Perl_croak(aTHX_ "usage: SDL::SurfacePixel(surface,x,y,[color])");
+               if ( items == 4) {
+                       color = (SDL_Color*)SvIV(ST(3));
+                       pix = SDL_MapRGB(surface->format,color->r,color->g,color->b);
+                       switch(bpp) {
+                               case 1:
+                                       *(Uint8*)p = pix;
+                                       break;
+                               case 2:
+                                       *(Uint16*)p = pix;
+                                       break;
+                               case 3:
+                                       if (SDL_BYTEORDER == SDL_BIG_ENDIAN) {
+                                               p[0] = (pix >> 16) & 0xff;
+                                               p[1] = (pix >> 8) & 0xff;
+                                               p[2] = pix & 0xff;
+                                       } else {
+                                               p[0] = pix & 0xff;
+                                               p[1] = (pix >> 8) & 0xff;
+                                               p[2] = (pix >> 16) & 0xff;
+                                       }
+                                       break;
+                               case 4:
+                                       *(Uint32*)p = pix;
+                                       break;
+                       }
+               }
+               RETVAL = (SDL_Color *) safemalloc(sizeof(SDL_Color));
+               switch(bpp) {
+                       case 1:
+                               index = *(Uint8*)p;
+                               memcpy(RETVAL,&surface->format->palette[index],sizeof(SDL_Color));
+                               break;
+                       case 2:
+                               pix = *(Uint16*)p;
+                               SDL_GetRGB(pix,surface->format,&r,&g,&b);
+                               RETVAL->r = r;
+                               RETVAL->g = g;
+                               RETVAL->b = b;
+                               break;
+                       case 3:
+                       case 4:
+                               pix = *(Uint32*)p;
+                               SDL_GetRGB(pix,surface->format,&r,&g,&b);
+                               RETVAL->r = r;
+                               RETVAL->g = g;
+                               RETVAL->b = b;
+                               break;
+               }
+#line 2107 "SDL_perl.c"
+       XSprePUSH; PUSHi(PTR2IV(RETVAL));
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_MUSTLOCK); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_MUSTLOCK)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::MUSTLOCK(surface)");
+    {
+       SDL_Surface *   surface = INT2PTR(SDL_Surface *,SvIV(ST(0)));
+       int     RETVAL;
+       dXSTARG;
+#line 1130 "SDL_perl.xs"
+               RETVAL = SDL_MUSTLOCK(surface);
+#line 2125 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_SurfaceLock); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_SurfaceLock)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::SurfaceLock(surface)");
+    {
+       SDL_Surface *   surface = INT2PTR(SDL_Surface *,SvIV(ST(0)));
+       int     RETVAL;
+       dXSTARG;
+#line 1138 "SDL_perl.xs"
+               RETVAL = SDL_LockSurface(surface);
+#line 2143 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_SurfaceUnlock); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_SurfaceUnlock)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::SurfaceUnlock(surface)");
+    {
+       SDL_Surface *   surface = INT2PTR(SDL_Surface *,SvIV(ST(0)));
+#line 1146 "SDL_perl.xs"
+               SDL_UnlockSurface(surface);
+#line 2159 "SDL_perl.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL_GetVideoSurface); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_GetVideoSurface)
+{
+    dXSARGS;
+    if (items != 0)
+       Perl_croak(aTHX_ "Usage: SDL::GetVideoSurface()");
+    {
+       SDL_Surface *   RETVAL;
+       dXSTARG;
+#line 1151 "SDL_perl.xs"
+               RETVAL = SDL_GetVideoSurface();
+#line 2175 "SDL_perl.c"
+       XSprePUSH; PUSHi(PTR2IV(RETVAL));
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_VideoInfo); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_VideoInfo)
+{
+    dXSARGS;
+    if (items != 0)
+       Perl_croak(aTHX_ "Usage: SDL::VideoInfo()");
+    {
+       HV *    RETVAL;
+#line 1159 "SDL_perl.xs"
+               HV *hv;
+               SDL_VideoInfo *info;
+               info = (SDL_VideoInfo *) safemalloc ( sizeof(SDL_VideoInfo));
+               memcpy(info,SDL_GetVideoInfo(),sizeof(SDL_VideoInfo));
+               hv = newHV();
+               hv_store(hv,"hw_available",strlen("hw_available"),
+                       newSViv(info->hw_available),0);
+               hv_store(hv,"wm_available",strlen("wm_available"),
+                       newSViv(info->wm_available),0);
+               hv_store(hv,"blit_hw",strlen("blit_hw"),
+                       newSViv(info->blit_hw),0);
+               hv_store(hv,"blit_hw_CC",strlen("blit_hw_CC"),
+                       newSViv(info->blit_hw_CC),0);
+               hv_store(hv,"blit_hw_A",strlen("blit_hw_A"),
+                       newSViv(info->blit_hw_A),0);
+               hv_store(hv,"blit_sw",strlen("blit_sw"),
+                       newSViv(info->blit_sw),0);
+               hv_store(hv,"blit_sw_CC",strlen("blit_sw_CC"),
+                       newSViv(info->blit_sw_CC),0);
+               hv_store(hv,"blit_sw_A",strlen("blit_sw_A"),
+                       newSViv(info->blit_sw_A),0);
+               hv_store(hv,"blit_fill",strlen("blit_fill"),
+                       newSViv(info->blit_fill),0);
+               hv_store(hv,"video_mem",strlen("video_mem"),
+                       newSViv(info->video_mem),0);
+               RETVAL = hv;
+#line 2216 "SDL_perl.c"
+       ST(0) = newRV((SV*)RETVAL);
+       sv_2mortal(ST(0));
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_NewRect); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_NewRect)
+{
+    dXSARGS;
+    if (items != 4)
+       Perl_croak(aTHX_ "Usage: SDL::NewRect(x, y, w, h)");
+    {
+       Sint16  x = (Sint16)SvIV(ST(0));
+       Sint16  y = (Sint16)SvIV(ST(1));
+       Uint16  w = (Uint16)SvUV(ST(2));
+       Uint16  h = (Uint16)SvUV(ST(3));
+       SDL_Rect *      RETVAL;
+       dXSTARG;
+#line 1195 "SDL_perl.xs"
+               RETVAL = (SDL_Rect *) safemalloc (sizeof(SDL_Rect));
+               RETVAL->x = x;
+               RETVAL->y = y;
+               RETVAL->w = w;
+               RETVAL->h = h;
+#line 2242 "SDL_perl.c"
+       XSprePUSH; PUSHi(PTR2IV(RETVAL));
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_FreeRect); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_FreeRect)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::FreeRect(rect)");
+    {
+       SDL_Rect *      rect = INT2PTR(SDL_Rect *,SvIV(ST(0)));
+#line 1207 "SDL_perl.xs"
+               safefree(rect);
+#line 2258 "SDL_perl.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL_RectX); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_RectX)
+{
+    dXSARGS;
+    if (items < 1)
+       Perl_croak(aTHX_ "Usage: SDL::RectX(rect, ...)");
+    {
+       SDL_Rect *      rect = INT2PTR(SDL_Rect *,SvIV(ST(0)));
+       Sint16  RETVAL;
+       dXSTARG;
+#line 1213 "SDL_perl.xs"
+               if (items > 1 ) rect->x = SvIV(ST(1)); 
+               RETVAL = rect->x;
+#line 2276 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_RectY); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_RectY)
+{
+    dXSARGS;
+    if (items < 1)
+       Perl_croak(aTHX_ "Usage: SDL::RectY(rect, ...)");
+    {
+       SDL_Rect *      rect = INT2PTR(SDL_Rect *,SvIV(ST(0)));
+       Sint16  RETVAL;
+       dXSTARG;
+#line 1222 "SDL_perl.xs"
+               if (items > 1 ) rect->y = SvIV(ST(1)); 
+               RETVAL = rect->y;
+#line 2295 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_RectW); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_RectW)
+{
+    dXSARGS;
+    if (items < 1)
+       Perl_croak(aTHX_ "Usage: SDL::RectW(rect, ...)");
+    {
+       SDL_Rect *      rect = INT2PTR(SDL_Rect *,SvIV(ST(0)));
+       Uint16  RETVAL;
+       dXSTARG;
+#line 1231 "SDL_perl.xs"
+               if (items > 1 ) rect->w = SvIV(ST(1)); 
+               RETVAL = rect->w;
+#line 2314 "SDL_perl.c"
+       XSprePUSH; PUSHu((UV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_RectH); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_RectH)
+{
+    dXSARGS;
+    if (items < 1)
+       Perl_croak(aTHX_ "Usage: SDL::RectH(rect, ...)");
+    {
+       SDL_Rect *      rect = INT2PTR(SDL_Rect *,SvIV(ST(0)));
+       Uint16  RETVAL;
+       dXSTARG;
+#line 1240 "SDL_perl.xs"
+               if (items > 1 ) rect->h = SvIV(ST(1)); 
+               RETVAL = rect->h;
+#line 2333 "SDL_perl.c"
+       XSprePUSH; PUSHu((UV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_ListModes); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_ListModes)
+{
+    dXSARGS;
+    if (items != 2)
+       Perl_croak(aTHX_ "Usage: SDL::ListModes(format, flags)");
+    {
+       Uint32  flags = (Uint32)SvUV(ST(1));
+       SDL_PixelFormat *       format = INT2PTR(SDL_PixelFormat *,SvIV(ST(0)));
+       AV *    RETVAL;
+#line 1250 "SDL_perl.xs"
+               SDL_Rect **mode;
+               RETVAL = newAV();
+               mode = SDL_ListModes(format,flags);
+               if (mode == (SDL_Rect**)-1 ) {
+                       av_push(RETVAL,newSVpv("all",0));
+               } else if (! mode ) {
+                       av_push(RETVAL,newSVpv("none",0));
+               } else {
+                       for (;*mode;mode++) {
+                               av_push(RETVAL,newSViv(PTR2IV(*mode)));
+                       }
+               }
+#line 2362 "SDL_perl.c"
+       ST(0) = newRV((SV*)RETVAL);
+       sv_2mortal(ST(0));
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_NewColor); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_NewColor)
+{
+    dXSARGS;
+    if (items != 3)
+       Perl_croak(aTHX_ "Usage: SDL::NewColor(r, g, b)");
+    {
+       Uint8   r = (unsigned char)SvUV(ST(0));
+       Uint8   g = (unsigned char)SvUV(ST(1));
+       Uint8   b = (unsigned char)SvUV(ST(2));
+       SDL_Color *     RETVAL;
+       dXSTARG;
+#line 1272 "SDL_perl.xs"
+               RETVAL = (SDL_Color *) safemalloc(sizeof(SDL_Color));
+               RETVAL->r = r;
+               RETVAL->g = g;
+               RETVAL->b = b;
+#line 2386 "SDL_perl.c"
+       XSprePUSH; PUSHi(PTR2IV(RETVAL));
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_ColorR); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_ColorR)
+{
+    dXSARGS;
+    if (items < 1)
+       Perl_croak(aTHX_ "Usage: SDL::ColorR(color, ...)");
+    {
+       SDL_Color *     color = INT2PTR(SDL_Color *,SvIV(ST(0)));
+       Uint8   RETVAL;
+       dXSTARG;
+#line 1283 "SDL_perl.xs"
+               if (items > 1 ) color->r = SvIV(ST(1)); 
+               RETVAL = color->r;
+#line 2405 "SDL_perl.c"
+       XSprePUSH; PUSHu((UV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_ColorG); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_ColorG)
+{
+    dXSARGS;
+    if (items < 1)
+       Perl_croak(aTHX_ "Usage: SDL::ColorG(color, ...)");
+    {
+       SDL_Color *     color = INT2PTR(SDL_Color *,SvIV(ST(0)));
+       Uint8   RETVAL;
+       dXSTARG;
+#line 1292 "SDL_perl.xs"
+               if (items > 1 ) color->g = SvIV(ST(1)); 
+               RETVAL = color->g;
+#line 2424 "SDL_perl.c"
+       XSprePUSH; PUSHu((UV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_ColorB); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_ColorB)
+{
+    dXSARGS;
+    if (items < 1)
+       Perl_croak(aTHX_ "Usage: SDL::ColorB(color, ...)");
+    {
+       SDL_Color *     color = INT2PTR(SDL_Color *,SvIV(ST(0)));
+       Uint8   RETVAL;
+       dXSTARG;
+#line 1301 "SDL_perl.xs"
+               if (items > 1 ) color->b = SvIV(ST(1)); 
+               RETVAL = color->b;
+#line 2443 "SDL_perl.c"
+       XSprePUSH; PUSHu((UV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_FreeColor); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_FreeColor)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::FreeColor(color)");
+    {
+       SDL_Color *     color = INT2PTR(SDL_Color *,SvIV(ST(0)));
+#line 1310 "SDL_perl.xs"
+               return; safefree(color);
+#line 2459 "SDL_perl.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL_NewPalette); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_NewPalette)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::NewPalette(number)");
+    {
+       int     number = (int)SvIV(ST(0));
+       SDL_Palette *   RETVAL;
+       dXSTARG;
+#line 1316 "SDL_perl.xs"
+               RETVAL = (SDL_Palette *)safemalloc(sizeof(SDL_Palette));
+               RETVAL->colors = (SDL_Color *)safemalloc(number * 
+                                               sizeof(SDL_Color));
+               RETVAL->ncolors = number;
+#line 2479 "SDL_perl.c"
+       XSprePUSH; PUSHi(PTR2IV(RETVAL));
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_PaletteNColors); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_PaletteNColors)
+{
+    dXSARGS;
+    if (items < 1)
+       Perl_croak(aTHX_ "Usage: SDL::PaletteNColors(palette, ...)");
+    {
+       SDL_Palette *   palette = INT2PTR(SDL_Palette *,SvIV(ST(0)));
+       int     RETVAL;
+       dXSTARG;
+#line 1327 "SDL_perl.xs"
+               if ( items > 1 ) palette->ncolors = SvIV(ST(1));
+               RETVAL = palette->ncolors;
+#line 2498 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_PaletteColors); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_PaletteColors)
+{
+    dXSARGS;
+    if (items < 2)
+       Perl_croak(aTHX_ "Usage: SDL::PaletteColors(palette, index, ...)");
+    {
+       SDL_Palette *   palette = INT2PTR(SDL_Palette *,SvIV(ST(0)));
+       int     index = (int)SvIV(ST(1));
+       SDL_Color *     RETVAL;
+       dXSTARG;
+#line 1337 "SDL_perl.xs"
+               if ( items > 2 ) {
+                       palette->colors[index].r = SvUV(ST(2)); 
+                       palette->colors[index].g = SvUV(ST(3)); 
+                       palette->colors[index].b = SvUV(ST(4)); 
+               }
+               RETVAL = (SDL_Color *)(palette->colors + index);
+#line 2522 "SDL_perl.c"
+       XSprePUSH; PUSHi(PTR2IV(RETVAL));
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_VideoModeOK); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_VideoModeOK)
+{
+    dXSARGS;
+    if (items != 4)
+       Perl_croak(aTHX_ "Usage: SDL::VideoModeOK(width, height, bpp, flags)");
+    {
+       int     width = (int)SvIV(ST(0));
+       int     height = (int)SvIV(ST(1));
+       int     bpp = (int)SvIV(ST(2));
+       Uint32  flags = (Uint32)SvUV(ST(3));
+       int     RETVAL;
+       dXSTARG;
+#line 1353 "SDL_perl.xs"
+               RETVAL = SDL_VideoModeOK(width,height,bpp,flags);
+#line 2543 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_SetVideoMode); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_SetVideoMode)
+{
+    dXSARGS;
+    if (items != 4)
+       Perl_croak(aTHX_ "Usage: SDL::SetVideoMode(width, height, bpp, flags)");
+    {
+       int     width = (int)SvIV(ST(0));
+       int     height = (int)SvIV(ST(1));
+       int     bpp = (int)SvIV(ST(2));
+       Uint32  flags = (Uint32)SvUV(ST(3));
+       SDL_Surface *   RETVAL;
+       dXSTARG;
+#line 1364 "SDL_perl.xs"
+               RETVAL = SDL_SetVideoMode(width,height,bpp,flags);
+#line 2564 "SDL_perl.c"
+       XSprePUSH; PUSHi(PTR2IV(RETVAL));
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_UpdateRect); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_UpdateRect)
+{
+    dXSARGS;
+    if (items != 5)
+       Perl_croak(aTHX_ "Usage: SDL::UpdateRect(surface, x, y, w, h)");
+    {
+       SDL_Surface *   surface = INT2PTR(SDL_Surface *,SvIV(ST(0)));
+       int     x = (int)SvIV(ST(1));
+       int     y = (int)SvIV(ST(2));
+       int     w = (int)SvIV(ST(3));
+       int     h = (int)SvIV(ST(4));
+#line 1376 "SDL_perl.xs"
+               SDL_UpdateRect(surface,x,y,w,h);
+#line 2584 "SDL_perl.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL_UpdateRects); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_UpdateRects)
+{
+    dXSARGS;
+    if (items < 1)
+       Perl_croak(aTHX_ "Usage: SDL::UpdateRects(surface, ...)");
+    {
+       SDL_Surface *   surface = INT2PTR(SDL_Surface *,SvIV(ST(0)));
+#line 1382 "SDL_perl.xs"
+               SDL_Rect *rects, *temp;
+               int num_rects,i;
+               if ( items < 2 ) return;
+               num_rects = items - 1;  
+               rects = (SDL_Rect *)safemalloc(sizeof(SDL_Rect)*items);
+               for(i=0;i<num_rects;i++) {
+                       temp = (SDL_Rect *)SvIV(ST(i+1));
+                       rects[i].x = temp->x;
+                       rects[i].y = temp->y;
+                       rects[i].w = temp->w;
+                       rects[i].h = temp->h;
+               } 
+               SDL_UpdateRects(surface,num_rects,rects);
+               safefree(rects);
+#line 2612 "SDL_perl.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL_Flip); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_Flip)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::Flip(surface)");
+    {
+       SDL_Surface *   surface = INT2PTR(SDL_Surface *,SvIV(ST(0)));
+       int     RETVAL;
+       dXSTARG;
+#line 1401 "SDL_perl.xs"
+               RETVAL = SDL_Flip(surface);
+#line 2629 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_SetColors); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_SetColors)
+{
+    dXSARGS;
+    if (items < 2)
+       Perl_croak(aTHX_ "Usage: SDL::SetColors(surface, start, ...)");
+    {
+       SDL_Surface *   surface = INT2PTR(SDL_Surface *,SvIV(ST(0)));
+       int     start = (int)SvIV(ST(1));
+       int     RETVAL;
+       dXSTARG;
+#line 1410 "SDL_perl.xs"
+               SDL_Color *colors,*temp;
+               int i, length;
+               if ( items < 3 ) { RETVAL = 0;  goto all_done; }
+               length = items - 2;
+               colors = (SDL_Color *)safemalloc(sizeof(SDL_Color)*(length+1));
+               for ( i = 0; i < length ; i++ ) {
+                       temp = (SDL_Color *)SvIV(ST(i+2));
+                       colors[i].r = temp->r;
+                       colors[i].g = temp->g;
+                       colors[i].b = temp->b;
+               }
+               RETVAL = SDL_SetColors(surface, colors, start, length );
+               safefree(colors);
+all_done:
+#line 2661 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_MapRGB); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_MapRGB)
+{
+    dXSARGS;
+    if (items != 4)
+       Perl_croak(aTHX_ "Usage: SDL::MapRGB(surface, r, g, b)");
+    {
+       SDL_Surface *   surface = INT2PTR(SDL_Surface *,SvIV(ST(0)));
+       Uint8   r = (unsigned char)SvUV(ST(1));
+       Uint8   g = (unsigned char)SvUV(ST(2));
+       Uint8   b = (unsigned char)SvUV(ST(3));
+       Uint32  RETVAL;
+       dXSTARG;
+#line 1434 "SDL_perl.xs"
+               RETVAL = SDL_MapRGB(surface->format,r,g,b);
+#line 2682 "SDL_perl.c"
+       XSprePUSH; PUSHu((UV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_MapRGBA); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_MapRGBA)
+{
+    dXSARGS;
+    if (items != 5)
+       Perl_croak(aTHX_ "Usage: SDL::MapRGBA(surface, r, g, b, a)");
+    {
+       SDL_Surface *   surface = INT2PTR(SDL_Surface *,SvIV(ST(0)));
+       Uint8   r = (unsigned char)SvUV(ST(1));
+       Uint8   g = (unsigned char)SvUV(ST(2));
+       Uint8   b = (unsigned char)SvUV(ST(3));
+       Uint8   a = (unsigned char)SvUV(ST(4));
+       Uint32  RETVAL;
+       dXSTARG;
+#line 1446 "SDL_perl.xs"
+               RETVAL = SDL_MapRGBA(surface->format,r,g,b,a);
+#line 2704 "SDL_perl.c"
+       XSprePUSH; PUSHu((UV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_GetRGB); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_GetRGB)
+{
+    dXSARGS;
+    if (items != 2)
+       Perl_croak(aTHX_ "Usage: SDL::GetRGB(surface, pixel)");
+    {
+       SDL_Surface *   surface = INT2PTR(SDL_Surface *,SvIV(ST(0)));
+       Uint32  pixel = (Uint32)SvUV(ST(1));
+       AV *    RETVAL;
+#line 1455 "SDL_perl.xs"
+               Uint8 r,g,b;
+               SDL_GetRGB(pixel,surface->format,&r,&g,&b);
+               RETVAL = newAV();
+               av_push(RETVAL,newSViv(r));
+               av_push(RETVAL,newSViv(g));
+               av_push(RETVAL,newSViv(b));
+#line 2727 "SDL_perl.c"
+       ST(0) = newRV((SV*)RETVAL);
+       sv_2mortal(ST(0));
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_GetRGBA); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_GetRGBA)
+{
+    dXSARGS;
+    if (items != 2)
+       Perl_croak(aTHX_ "Usage: SDL::GetRGBA(surface, pixel)");
+    {
+       SDL_Surface *   surface = INT2PTR(SDL_Surface *,SvIV(ST(0)));
+       Uint32  pixel = (Uint32)SvUV(ST(1));
+       AV *    RETVAL;
+#line 1469 "SDL_perl.xs"
+               Uint8 r,g,b,a;
+               SDL_GetRGBA(pixel,surface->format,&r,&g,&b,&a);
+               RETVAL = newAV();
+               av_push(RETVAL,newSViv(r));
+               av_push(RETVAL,newSViv(g));
+               av_push(RETVAL,newSViv(b));
+               av_push(RETVAL,newSViv(a));
+#line 2752 "SDL_perl.c"
+       ST(0) = newRV((SV*)RETVAL);
+       sv_2mortal(ST(0));
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_SaveBMP); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_SaveBMP)
+{
+    dXSARGS;
+    if (items != 2)
+       Perl_croak(aTHX_ "Usage: SDL::SaveBMP(surface, filename)");
+    {
+       SDL_Surface *   surface = INT2PTR(SDL_Surface *,SvIV(ST(0)));
+       char *  filename = (char *)SvPV_nolen(ST(1));
+       int     RETVAL;
+       dXSTARG;
+#line 1484 "SDL_perl.xs"
+               RETVAL = SDL_SaveBMP(surface,filename);
+#line 2772 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_SetColorKey); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_SetColorKey)
+{
+    dXSARGS;
+    if (items != 3)
+       Perl_croak(aTHX_ "Usage: SDL::SetColorKey(surface, flag, key)");
+    {
+       SDL_Surface *   surface = INT2PTR(SDL_Surface *,SvIV(ST(0)));
+       Uint32  flag = (Uint32)SvUV(ST(1));
+       SDL_Color *     key = INT2PTR(SDL_Color *,SvIV(ST(2)));
+       int     RETVAL;
+       dXSTARG;
+#line 1494 "SDL_perl.xs"
+               Uint32 pixel = SDL_MapRGB(surface->format,key->r,key->g,key->b);
+               RETVAL = SDL_SetColorKey(surface,flag,pixel);
+#line 2793 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_SetAlpha); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_SetAlpha)
+{
+    dXSARGS;
+    if (items != 3)
+       Perl_croak(aTHX_ "Usage: SDL::SetAlpha(surface, flag, alpha)");
+    {
+       SDL_Surface *   surface = INT2PTR(SDL_Surface *,SvIV(ST(0)));
+       Uint32  flag = (Uint32)SvUV(ST(1));
+       Uint8   alpha = (unsigned char)SvUV(ST(2));
+       int     RETVAL;
+       dXSTARG;
+#line 1505 "SDL_perl.xs"
+               RETVAL = SDL_SetAlpha(surface,flag,alpha);
+#line 2813 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_DisplayFormat); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_DisplayFormat)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::DisplayFormat(surface)");
+    {
+       SDL_Surface *   surface = INT2PTR(SDL_Surface *,SvIV(ST(0)));
+       SDL_Surface *   RETVAL;
+       dXSTARG;
+#line 1513 "SDL_perl.xs"
+               RETVAL = SDL_DisplayFormat(surface);
+#line 2831 "SDL_perl.c"
+       XSprePUSH; PUSHi(PTR2IV(RETVAL));
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_DisplayFormatAlpha); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_DisplayFormatAlpha)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::DisplayFormatAlpha(surface)");
+    {
+       SDL_Surface *   surface = INT2PTR(SDL_Surface *,SvIV(ST(0)));
+       SDL_Surface *   RETVAL;
+       dXSTARG;
+#line 1521 "SDL_perl.xs"
+               RETVAL = SDL_DisplayFormatAlpha(surface);
+#line 2849 "SDL_perl.c"
+       XSprePUSH; PUSHi(PTR2IV(RETVAL));
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_ConvertRGB); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_ConvertRGB)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::ConvertRGB(surface)");
+    {
+       SDL_Surface *   surface = INT2PTR(SDL_Surface *,SvIV(ST(0)));
+       SDL_Surface *   RETVAL;
+       dXSTARG;
+#line 1529 "SDL_perl.xs"
+               SDL_PixelFormat fmt;
+               fmt.palette = NULL;
+               fmt.BitsPerPixel = 24;
+               fmt.BytesPerPixel = 3;
+               fmt.Rmask = 0x000000ff;
+               fmt.Gmask = 0x0000ff00;
+               fmt.Bmask = 0x00ff0000;
+               fmt.Amask = 0x00000000;
+               fmt.Rloss = 0;
+               fmt.Gloss = 0;
+               fmt.Bloss = 0;
+               fmt.Aloss = 0;
+               fmt.Rshift = 0;
+               fmt.Gshift = 8;
+               fmt.Bshift = 16;
+               fmt.Ashift = 24;
+               fmt.colorkey = 0;
+               fmt.alpha = 0;
+               RETVAL = SDL_ConvertSurface(surface,&fmt,surface->flags);
+#line 2885 "SDL_perl.c"
+       XSprePUSH; PUSHi(PTR2IV(RETVAL));
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_ConvertRGBA); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_ConvertRGBA)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::ConvertRGBA(surface)");
+    {
+       SDL_Surface *   surface = INT2PTR(SDL_Surface *,SvIV(ST(0)));
+       SDL_Surface *   RETVAL;
+       dXSTARG;
+#line 1555 "SDL_perl.xs"
+               SDL_PixelFormat fmt;
+               fmt.palette = NULL;
+               fmt.BitsPerPixel = 32;
+               fmt.BytesPerPixel = 4;
+               fmt.Rmask = 0x000000ff;
+               fmt.Gmask = 0x0000ff00;
+               fmt.Bmask = 0x00ff0000;
+               fmt.Amask = 0xff000000;
+               fmt.Rloss = 0;
+               fmt.Gloss = 0;
+               fmt.Bloss = 0;
+               fmt.Aloss = 0;
+               fmt.Rshift = 0;
+               fmt.Gshift = 8;
+               fmt.Bshift = 16;
+               fmt.Ashift = 24;
+               fmt.colorkey = 0;
+               fmt.alpha = 0;
+               RETVAL = SDL_ConvertSurface(surface,&fmt,surface->flags);
+#line 2921 "SDL_perl.c"
+       XSprePUSH; PUSHi(PTR2IV(RETVAL));
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_BlitSurface); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_BlitSurface)
+{
+    dXSARGS;
+    if (items != 4)
+       Perl_croak(aTHX_ "Usage: SDL::BlitSurface(src, src_rect, dest, dest_rect)");
+    {
+       SDL_Surface *   src = INT2PTR(SDL_Surface *,SvIV(ST(0)));
+       SDL_Rect *      src_rect = INT2PTR(SDL_Rect *,SvIV(ST(1)));
+       SDL_Surface *   dest = INT2PTR(SDL_Surface *,SvIV(ST(2)));
+       SDL_Rect *      dest_rect = INT2PTR(SDL_Rect *,SvIV(ST(3)));
+       int     RETVAL;
+       dXSTARG;
+#line 1584 "SDL_perl.xs"
+               RETVAL = SDL_BlitSurface(src,src_rect,dest,dest_rect);
+#line 2942 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_FillRect); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_FillRect)
+{
+    dXSARGS;
+    if (items != 3)
+       Perl_croak(aTHX_ "Usage: SDL::FillRect(dest, dest_rect, color)");
+    {
+       SDL_Surface *   dest = INT2PTR(SDL_Surface *,SvIV(ST(0)));
+       SDL_Rect *      dest_rect = INT2PTR(SDL_Rect *,SvIV(ST(1)));
+       SDL_Color *     color = INT2PTR(SDL_Color *,SvIV(ST(2)));
+       int     RETVAL;
+       dXSTARG;
+#line 1594 "SDL_perl.xs"
+               Uint32 pixel = SDL_MapRGB(dest->format,color->r,color->g,color->b);
+               RETVAL = SDL_FillRect(dest,dest_rect,pixel);
+#line 2963 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_GetAppState); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_GetAppState)
+{
+    dXSARGS;
+    if (items != 0)
+       Perl_croak(aTHX_ "Usage: SDL::GetAppState()");
+    {
+       Uint8   RETVAL;
+       dXSTARG;
+#line 1602 "SDL_perl.xs"
+               RETVAL = SDL_GetAppState();
+#line 2980 "SDL_perl.c"
+       XSprePUSH; PUSHu((UV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_WMSetCaption); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_WMSetCaption)
+{
+    dXSARGS;
+    if (items != 2)
+       Perl_croak(aTHX_ "Usage: SDL::WMSetCaption(title, icon)");
+    {
+       char *  title = (char *)SvPV_nolen(ST(0));
+       char *  icon = (char *)SvPV_nolen(ST(1));
+#line 1612 "SDL_perl.xs"
+               SDL_WM_SetCaption(title,icon);
+#line 2997 "SDL_perl.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL_WMGetCaption); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_WMGetCaption)
+{
+    dXSARGS;
+    if (items != 0)
+       Perl_croak(aTHX_ "Usage: SDL::WMGetCaption()");
+    {
+       AV *    RETVAL;
+#line 1617 "SDL_perl.xs"
+               char *title,*icon;
+               SDL_WM_GetCaption(&title,&icon);
+               RETVAL = newAV();
+               av_push(RETVAL,newSVpv(title,0));
+               av_push(RETVAL,newSVpv(icon,0));
+#line 3016 "SDL_perl.c"
+       ST(0) = newRV((SV*)RETVAL);
+       sv_2mortal(ST(0));
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_WMSetIcon); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_WMSetIcon)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::WMSetIcon(icon)");
+    {
+       SDL_Surface *   icon = INT2PTR(SDL_Surface *,SvIV(ST(0)));
+#line 1629 "SDL_perl.xs"
+               SDL_WM_SetIcon(icon,NULL);
+#line 3033 "SDL_perl.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL_WarpMouse); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_WarpMouse)
+{
+    dXSARGS;
+    if (items != 2)
+       Perl_croak(aTHX_ "Usage: SDL::WarpMouse(x, y)");
+    {
+       Uint16  x = (Uint16)SvUV(ST(0));
+       Uint16  y = (Uint16)SvUV(ST(1));
+#line 1636 "SDL_perl.xs"
+               SDL_WarpMouse(x,y);
+#line 3049 "SDL_perl.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL_GetMouseState); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_GetMouseState)
+{
+    dXSARGS;
+    if (items != 0)
+       Perl_croak(aTHX_ "Usage: SDL::GetMouseState()");
+    {
+       AV *    RETVAL;
+#line 1641 "SDL_perl.xs"
+               Uint8 mask;
+               int x;
+               int y;
+               mask = SDL_GetMouseState(&x,&y);
+               RETVAL = newAV();
+               av_push(RETVAL,newSViv(mask));
+               av_push(RETVAL,newSViv(x));
+               av_push(RETVAL,newSViv(y));
+#line 3071 "SDL_perl.c"
+       ST(0) = newRV((SV*)RETVAL);
+       sv_2mortal(ST(0));
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_GetRelativeMouseState); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_GetRelativeMouseState)
+{
+    dXSARGS;
+    if (items != 0)
+       Perl_croak(aTHX_ "Usage: SDL::GetRelativeMouseState()");
+    {
+       AV *    RETVAL;
+#line 1655 "SDL_perl.xs"
+               Uint8 mask;
+               int x;
+               int y;
+               mask = SDL_GetRelativeMouseState(&x,&y);
+               RETVAL = newAV();
+               av_push(RETVAL,newSViv(mask));
+               av_push(RETVAL,newSViv(x));
+               av_push(RETVAL,newSViv(y));
+#line 3095 "SDL_perl.c"
+       ST(0) = newRV((SV*)RETVAL);
+       sv_2mortal(ST(0));
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_NewCursor); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_NewCursor)
+{
+    dXSARGS;
+    if (items != 4)
+       Perl_croak(aTHX_ "Usage: SDL::NewCursor(data, mask, x, y)");
+    {
+       SDL_Surface *   data = INT2PTR(SDL_Surface *,SvIV(ST(0)));
+       SDL_Surface *   mask = INT2PTR(SDL_Surface *,SvIV(ST(1)));
+       int     x = (int)SvIV(ST(2));
+       int     y = (int)SvIV(ST(3));
+       SDL_Cursor *    RETVAL;
+       dXSTARG;
+#line 1673 "SDL_perl.xs"
+               RETVAL = SDL_CreateCursor((Uint8*)data->pixels,
+                               (Uint8*)mask->pixels,data->w,data->h,x,y);
+#line 3118 "SDL_perl.c"
+       XSprePUSH; PUSHi(PTR2IV(RETVAL));
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_FreeCursor); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_FreeCursor)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::FreeCursor(cursor)");
+    {
+       SDL_Cursor *    cursor = INT2PTR(SDL_Cursor *,SvIV(ST(0)));
+#line 1682 "SDL_perl.xs"
+               SDL_FreeCursor(cursor);
+#line 3134 "SDL_perl.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL_SetCursor); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_SetCursor)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::SetCursor(cursor)");
+    {
+       SDL_Cursor *    cursor = INT2PTR(SDL_Cursor *,SvIV(ST(0)));
+#line 1688 "SDL_perl.xs"
+               SDL_SetCursor(cursor);
+#line 3149 "SDL_perl.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL_GetCursor); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_GetCursor)
+{
+    dXSARGS;
+    if (items != 0)
+       Perl_croak(aTHX_ "Usage: SDL::GetCursor()");
+    {
+       SDL_Cursor *    RETVAL;
+       dXSTARG;
+#line 1693 "SDL_perl.xs"
+               RETVAL = SDL_GetCursor();
+#line 3165 "SDL_perl.c"
+       XSprePUSH; PUSHi(PTR2IV(RETVAL));
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_ShowCursor); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_ShowCursor)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::ShowCursor(toggle)");
+    {
+       int     toggle = (int)SvIV(ST(0));
+       int     RETVAL;
+       dXSTARG;
+#line 1701 "SDL_perl.xs"
+               RETVAL = SDL_ShowCursor(toggle);
+#line 3183 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_NewAudioSpec); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_NewAudioSpec)
+{
+    dXSARGS;
+    if (items != 4)
+       Perl_croak(aTHX_ "Usage: SDL::NewAudioSpec(freq, format, channels, samples)");
+    {
+       int     freq = (int)SvIV(ST(0));
+       Uint16  format = (Uint16)SvUV(ST(1));
+       Uint8   channels = (unsigned char)SvUV(ST(2));
+       Uint16  samples = (Uint16)SvUV(ST(3));
+       SDL_AudioSpec * RETVAL;
+       dXSTARG;
+#line 1712 "SDL_perl.xs"
+               RETVAL = (SDL_AudioSpec *)safemalloc(sizeof(SDL_AudioSpec));
+               RETVAL->freq = freq;
+               RETVAL->format = format;
+               RETVAL->channels = channels;
+               RETVAL->samples = samples;
+#line 3208 "SDL_perl.c"
+       XSprePUSH; PUSHi(PTR2IV(RETVAL));
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_FreeAudioSpec); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_FreeAudioSpec)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::FreeAudioSpec(spec)");
+    {
+       SDL_AudioSpec * spec = INT2PTR(SDL_AudioSpec *,SvIV(ST(0)));
+#line 1724 "SDL_perl.xs"
+               safefree(spec);
+#line 3224 "SDL_perl.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL_NewAudioCVT); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_NewAudioCVT)
+{
+    dXSARGS;
+    if (items != 6)
+       Perl_croak(aTHX_ "Usage: SDL::NewAudioCVT(src_format, src_channels, src_rate, dst_format, dst_channels, dst_rate)");
+    {
+       Uint16  src_format = (Uint16)SvUV(ST(0));
+       Uint8   src_channels = (unsigned char)SvUV(ST(1));
+       int     src_rate = (int)SvIV(ST(2));
+       Uint16  dst_format = (Uint16)SvUV(ST(3));
+       Uint8   dst_channels = (unsigned char)SvUV(ST(4));
+       int     dst_rate = (int)SvIV(ST(5));
+       SDL_AudioCVT *  RETVAL;
+       dXSTARG;
+#line 1735 "SDL_perl.xs"
+               RETVAL = (SDL_AudioCVT *)safemalloc(sizeof(SDL_AudioCVT));
+               if (SDL_BuildAudioCVT(RETVAL,src_format, src_channels, src_rate,
+                       dst_format, dst_channels, dst_rate)) { 
+                       safefree(RETVAL); RETVAL = NULL; }
+#line 3249 "SDL_perl.c"
+       XSprePUSH; PUSHi(PTR2IV(RETVAL));
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_FreeAudioCVT); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_FreeAudioCVT)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::FreeAudioCVT(cvt)");
+    {
+       SDL_AudioCVT *  cvt = INT2PTR(SDL_AudioCVT *,SvIV(ST(0)));
+#line 1746 "SDL_perl.xs"
+               safefree(cvt);
+#line 3265 "SDL_perl.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL_ConvertAudioData); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_ConvertAudioData)
+{
+    dXSARGS;
+    if (items != 3)
+       Perl_croak(aTHX_ "Usage: SDL::ConvertAudioData(cvt, data, len)");
+    {
+       SDL_AudioCVT *  cvt = INT2PTR(SDL_AudioCVT *,SvIV(ST(0)));
+       Uint8 * data = INT2PTR(Uint8 *,SvIV(ST(1)));
+       int     len = (int)SvIV(ST(2));
+       int     RETVAL;
+       dXSTARG;
+#line 1754 "SDL_perl.xs"
+               cvt->len = len;
+               cvt->buf = (Uint8*) safemalloc(cvt->len*cvt->len_mult);
+               memcpy(cvt->buf,data,cvt->len);
+               RETVAL = SDL_ConvertAudio(cvt);
+#line 3287 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_OpenAudio); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_OpenAudio)
+{
+    dXSARGS;
+    if (items != 2)
+       Perl_croak(aTHX_ "Usage: SDL::OpenAudio(spec, callback)");
+    {
+       SDL_AudioSpec * spec = INT2PTR(SDL_AudioSpec *,SvIV(ST(0)));
+       SV*     callback = ST(1);
+       int     RETVAL;
+       dXSTARG;
+#line 1766 "SDL_perl.xs"
+               spec->userdata = (void*)callback;
+               spec->callback = sdl_perl_audio_callback;
+               RETVAL = SDL_OpenAudio(spec,NULL);
+#line 3308 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_GetAudioStatus); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_GetAudioStatus)
+{
+    dXSARGS;
+    if (items != 0)
+       Perl_croak(aTHX_ "Usage: SDL::GetAudioStatus()");
+    {
+       Uint32  RETVAL;
+       dXSTARG;
+#line 1775 "SDL_perl.xs"
+               RETVAL = SDL_GetAudioStatus ();
+#line 3325 "SDL_perl.c"
+       XSprePUSH; PUSHu((UV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_PauseAudio); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_PauseAudio)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::PauseAudio(p_on)");
+    {
+       int     p_on = (int)SvIV(ST(0));
+#line 1783 "SDL_perl.xs"
+               SDL_PauseAudio(p_on);
+#line 3341 "SDL_perl.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL_LockAudio); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_LockAudio)
+{
+    dXSARGS;
+    if (items != 0)
+       Perl_croak(aTHX_ "Usage: SDL::LockAudio()");
+    {
+#line 1788 "SDL_perl.xs"
+               SDL_LockAudio();
+#line 3355 "SDL_perl.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL_UnlockAudio); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_UnlockAudio)
+{
+    dXSARGS;
+    if (items != 0)
+       Perl_croak(aTHX_ "Usage: SDL::UnlockAudio()");
+    {
+#line 1793 "SDL_perl.xs"
+               SDL_UnlockAudio();
+#line 3369 "SDL_perl.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL_CloseAudio); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_CloseAudio)
+{
+    dXSARGS;
+    if (items != 0)
+       Perl_croak(aTHX_ "Usage: SDL::CloseAudio()");
+    {
+#line 1798 "SDL_perl.xs"
+               SDL_CloseAudio();
+#line 3383 "SDL_perl.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL_FreeWAV); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_FreeWAV)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::FreeWAV(buf)");
+    {
+       Uint8 * buf = INT2PTR(Uint8 *,SvIV(ST(0)));
+#line 1804 "SDL_perl.xs"
+               SDL_FreeWAV(buf);
+#line 3398 "SDL_perl.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL_LoadWAV); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_LoadWAV)
+{
+    dXSARGS;
+    if (items != 2)
+       Perl_croak(aTHX_ "Usage: SDL::LoadWAV(filename, spec)");
+    {
+       char *  filename = (char *)SvPV_nolen(ST(0));
+       SDL_AudioSpec * spec = INT2PTR(SDL_AudioSpec *,SvIV(ST(1)));
+       AV *    RETVAL;
+#line 1811 "SDL_perl.xs"
+               SDL_AudioSpec *temp;
+               Uint8 *buf;
+               Uint32 len;
+
+               RETVAL = newAV();
+               temp = SDL_LoadWAV(filename,spec,&buf,&len);
+               if ( ! temp ) goto error;
+               av_push(RETVAL,newSViv(PTR2IV(temp)));
+               av_push(RETVAL,newSViv(PTR2IV(buf)));
+               av_push(RETVAL,newSViv(len));
+error:
+#line 3425 "SDL_perl.c"
+       ST(0) = newRV((SV*)RETVAL);
+       sv_2mortal(ST(0));
+    }
+    XSRETURN(1);
+}
+
+#ifdef HAVE_SDL_MIXER
+#define XSubPPtmpAAAB 1
+
+XS(XS_SDL_MixAudio); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_MixAudio)
+{
+    dXSARGS;
+    if (items != 4)
+       Perl_croak(aTHX_ "Usage: SDL::MixAudio(dst, src, len, volume)");
+    {
+       Uint8 * dst = INT2PTR(Uint8 *,SvIV(ST(0)));
+       Uint8 * src = INT2PTR(Uint8 *,SvIV(ST(1)));
+       Uint32  len = (Uint32)SvUV(ST(2));
+       int     volume = (int)SvIV(ST(3));
+#line 1834 "SDL_perl.xs"
+               SDL_MixAudio(dst,src,len,volume);
+#line 3448 "SDL_perl.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL_MixOpenAudio); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_MixOpenAudio)
+{
+    dXSARGS;
+    if (items != 4)
+       Perl_croak(aTHX_ "Usage: SDL::MixOpenAudio(frequency, format, channels, chunksize)");
+    {
+       int     frequency = (int)SvIV(ST(0));
+       Uint16  format = (Uint16)SvUV(ST(1));
+       int     channels = (int)SvIV(ST(2));
+       int     chunksize = (int)SvIV(ST(3));
+       int     RETVAL;
+       dXSTARG;
+#line 1843 "SDL_perl.xs"
+               RETVAL = Mix_OpenAudio(frequency, format, channels, chunksize);
+#line 3468 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_MixAllocateChannels); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_MixAllocateChannels)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::MixAllocateChannels(number)");
+    {
+       int     number = (int)SvIV(ST(0));
+       int     RETVAL;
+       dXSTARG;
+#line 1851 "SDL_perl.xs"
+               RETVAL = Mix_AllocateChannels(number);
+#line 3486 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_MixQuerySpec); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_MixQuerySpec)
+{
+    dXSARGS;
+    if (items != 0)
+       Perl_croak(aTHX_ "Usage: SDL::MixQuerySpec()");
+    {
+       AV *    RETVAL;
+#line 1858 "SDL_perl.xs"
+               int freq, channels, status;
+               Uint16 format;
+               status = Mix_QuerySpec(&freq,&format,&channels);
+               RETVAL = newAV();
+               av_push(RETVAL,newSViv(status));
+               av_push(RETVAL,newSViv(freq));
+               av_push(RETVAL,newSViv(format));
+               av_push(RETVAL,newSViv(channels));
+#line 3509 "SDL_perl.c"
+       ST(0) = newRV((SV*)RETVAL);
+       sv_2mortal(ST(0));
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_MixLoadWAV); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_MixLoadWAV)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::MixLoadWAV(filename)");
+    {
+       char *  filename = (char *)SvPV_nolen(ST(0));
+       Mix_Chunk *     RETVAL;
+       dXSTARG;
+#line 1873 "SDL_perl.xs"
+               RETVAL = Mix_LoadWAV(filename);
+#line 3528 "SDL_perl.c"
+       XSprePUSH; PUSHi(PTR2IV(RETVAL));
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_MixLoadMusic); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_MixLoadMusic)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::MixLoadMusic(filename)");
+    {
+       char *  filename = (char *)SvPV_nolen(ST(0));
+       Mix_Music *     RETVAL;
+       dXSTARG;
+#line 1881 "SDL_perl.xs"
+               RETVAL = Mix_LoadMUS(filename);
+#line 3546 "SDL_perl.c"
+       XSprePUSH; PUSHi(PTR2IV(RETVAL));
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_MixQuickLoadWAV); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_MixQuickLoadWAV)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::MixQuickLoadWAV(buf)");
+    {
+       Uint8 * buf = INT2PTR(Uint8 *,SvIV(ST(0)));
+       Mix_Chunk *     RETVAL;
+       dXSTARG;
+#line 1889 "SDL_perl.xs"
+               RETVAL = Mix_QuickLoad_WAV(buf);
+#line 3564 "SDL_perl.c"
+       XSprePUSH; PUSHi(PTR2IV(RETVAL));
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_MixFreeChunk); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_MixFreeChunk)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::MixFreeChunk(chunk)");
+    {
+       Mix_Chunk *     chunk = INT2PTR(Mix_Chunk *,SvIV(ST(0)));
+#line 1897 "SDL_perl.xs"
+               Mix_FreeChunk(chunk);
+#line 3580 "SDL_perl.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL_MixFreeMusic); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_MixFreeMusic)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::MixFreeMusic(music)");
+    {
+       Mix_Music *     music = INT2PTR(Mix_Music *,SvIV(ST(0)));
+#line 1903 "SDL_perl.xs"
+               Mix_FreeMusic(music);
+#line 3595 "SDL_perl.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL_MixSetPostMixCallback); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_MixSetPostMixCallback)
+{
+    dXSARGS;
+    if (items != 2)
+       Perl_croak(aTHX_ "Usage: SDL::MixSetPostMixCallback(func, arg)");
+    {
+       void *  func = INT2PTR(void *,SvIV(ST(0)));
+       void *  arg = INT2PTR(void *,SvIV(ST(1)));
+#line 1910 "SDL_perl.xs"
+               Mix_SetPostMix(func,arg);
+#line 3611 "SDL_perl.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL_PerlMixMusicHook); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_PerlMixMusicHook)
+{
+    dXSARGS;
+    if (items != 0)
+       Perl_croak(aTHX_ "Usage: SDL::PerlMixMusicHook()");
+    {
+       void *  RETVAL;
+       dXSTARG;
+#line 1915 "SDL_perl.xs"
+               RETVAL = sdl_perl_music_callback;
+#line 3627 "SDL_perl.c"
+       XSprePUSH; PUSHi(PTR2IV(RETVAL));
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_MixSetMusicHook); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_MixSetMusicHook)
+{
+    dXSARGS;
+    if (items != 2)
+       Perl_croak(aTHX_ "Usage: SDL::MixSetMusicHook(func, arg)");
+    {
+       void *  func = INT2PTR(void *,SvIV(ST(0)));
+       void *  arg = INT2PTR(void *,SvIV(ST(1)));
+#line 1924 "SDL_perl.xs"
+               Mix_HookMusic(func,arg);
+#line 3644 "SDL_perl.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL_MixSetMusicFinishedHook); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_MixSetMusicFinishedHook)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::MixSetMusicFinishedHook(func)");
+    {
+       void *  func = INT2PTR(void *,SvIV(ST(0)));
+#line 1930 "SDL_perl.xs"
+               mix_music_finished_cv = func;
+               Mix_HookMusicFinished(sdl_perl_music_finished_callback);
+#line 3660 "SDL_perl.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL_MixGetMusicHookData); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_MixGetMusicHookData)
+{
+    dXSARGS;
+    if (items != 0)
+       Perl_croak(aTHX_ "Usage: SDL::MixGetMusicHookData()");
+    {
+       void *  RETVAL;
+       dXSTARG;
+#line 1936 "SDL_perl.xs"
+               RETVAL = Mix_GetMusicHookData();
+#line 3676 "SDL_perl.c"
+       XSprePUSH; PUSHi(PTR2IV(RETVAL));
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_MixReverseChannels); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_MixReverseChannels)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::MixReverseChannels(number)");
+    {
+       int     number = (int)SvIV(ST(0));
+       int     RETVAL;
+       dXSTARG;
+#line 1944 "SDL_perl.xs"
+               RETVAL = Mix_ReserveChannels ( number );
+#line 3694 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_MixGroupChannel); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_MixGroupChannel)
+{
+    dXSARGS;
+    if (items != 2)
+       Perl_croak(aTHX_ "Usage: SDL::MixGroupChannel(which, tag)");
+    {
+       int     which = (int)SvIV(ST(0));
+       int     tag = (int)SvIV(ST(1));
+       int     RETVAL;
+       dXSTARG;
+#line 1953 "SDL_perl.xs"
+               RETVAL = Mix_GroupChannel(which,tag);
+#line 3713 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_MixGroupChannels); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_MixGroupChannels)
+{
+    dXSARGS;
+    if (items != 3)
+       Perl_croak(aTHX_ "Usage: SDL::MixGroupChannels(from, to, tag)");
+    {
+       int     from = (int)SvIV(ST(0));
+       int     to = (int)SvIV(ST(1));
+       int     tag = (int)SvIV(ST(2));
+       int     RETVAL;
+       dXSTARG;
+#line 1963 "SDL_perl.xs"
+               RETVAL = Mix_GroupChannels(from,to,tag);
+#line 3733 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_MixGroupAvailable); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_MixGroupAvailable)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::MixGroupAvailable(tag)");
+    {
+       int     tag = (int)SvIV(ST(0));
+       int     RETVAL;
+       dXSTARG;
+#line 1971 "SDL_perl.xs"
+               RETVAL = Mix_GroupAvailable(tag);
+#line 3751 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_MixGroupCount); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_MixGroupCount)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::MixGroupCount(tag)");
+    {
+       int     tag = (int)SvIV(ST(0));
+       int     RETVAL;
+       dXSTARG;
+#line 1979 "SDL_perl.xs"
+               RETVAL = Mix_GroupCount(tag);
+#line 3769 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_MixGroupOldest); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_MixGroupOldest)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::MixGroupOldest(tag)");
+    {
+       int     tag = (int)SvIV(ST(0));
+       int     RETVAL;
+       dXSTARG;
+#line 1987 "SDL_perl.xs"
+               RETVAL = Mix_GroupOldest(tag);
+#line 3787 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_MixGroupNewer); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_MixGroupNewer)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::MixGroupNewer(tag)");
+    {
+       int     tag = (int)SvIV(ST(0));
+       int     RETVAL;
+       dXSTARG;
+#line 1995 "SDL_perl.xs"
+               RETVAL = Mix_GroupNewer(tag);
+#line 3805 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_MixPlayChannel); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_MixPlayChannel)
+{
+    dXSARGS;
+    if (items != 3)
+       Perl_croak(aTHX_ "Usage: SDL::MixPlayChannel(channel, chunk, loops)");
+    {
+       int     channel = (int)SvIV(ST(0));
+       Mix_Chunk *     chunk = INT2PTR(Mix_Chunk *,SvIV(ST(1)));
+       int     loops = (int)SvIV(ST(2));
+       int     RETVAL;
+       dXSTARG;
+#line 2005 "SDL_perl.xs"
+               RETVAL = Mix_PlayChannel(channel,chunk,loops);
+#line 3825 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_MixPlayChannelTimed); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_MixPlayChannelTimed)
+{
+    dXSARGS;
+    if (items != 4)
+       Perl_croak(aTHX_ "Usage: SDL::MixPlayChannelTimed(channel, chunk, loops, ticks)");
+    {
+       int     channel = (int)SvIV(ST(0));
+       Mix_Chunk *     chunk = INT2PTR(Mix_Chunk *,SvIV(ST(1)));
+       int     loops = (int)SvIV(ST(2));
+       int     ticks = (int)SvIV(ST(3));
+       int     RETVAL;
+       dXSTARG;
+#line 2016 "SDL_perl.xs"
+               RETVAL = Mix_PlayChannelTimed(channel,chunk,loops,ticks);
+#line 3846 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_MixPlayMusic); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_MixPlayMusic)
+{
+    dXSARGS;
+    if (items != 2)
+       Perl_croak(aTHX_ "Usage: SDL::MixPlayMusic(music, loops)");
+    {
+       Mix_Music *     music = INT2PTR(Mix_Music *,SvIV(ST(0)));
+       int     loops = (int)SvIV(ST(1));
+       int     RETVAL;
+       dXSTARG;
+#line 2025 "SDL_perl.xs"
+               RETVAL = Mix_PlayMusic(music,loops);
+#line 3865 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_MixFadeInChannel); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_MixFadeInChannel)
+{
+    dXSARGS;
+    if (items != 4)
+       Perl_croak(aTHX_ "Usage: SDL::MixFadeInChannel(channel, chunk, loops, ms)");
+    {
+       int     channel = (int)SvIV(ST(0));
+       Mix_Chunk *     chunk = INT2PTR(Mix_Chunk *,SvIV(ST(1)));
+       int     loops = (int)SvIV(ST(2));
+       int     ms = (int)SvIV(ST(3));
+       int     RETVAL;
+       dXSTARG;
+#line 2036 "SDL_perl.xs"
+               RETVAL = Mix_FadeInChannel(channel,chunk,loops,ms);
+#line 3886 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_MixFadeInChannelTimed); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_MixFadeInChannelTimed)
+{
+    dXSARGS;
+    if (items != 5)
+       Perl_croak(aTHX_ "Usage: SDL::MixFadeInChannelTimed(channel, chunk, loops, ms, ticks)");
+    {
+       int     channel = (int)SvIV(ST(0));
+       Mix_Chunk *     chunk = INT2PTR(Mix_Chunk *,SvIV(ST(1)));
+       int     loops = (int)SvIV(ST(2));
+       int     ticks = (int)SvIV(ST(4));
+       int     ms = (int)SvIV(ST(3));
+       int     RETVAL;
+       dXSTARG;
+#line 2048 "SDL_perl.xs"
+               RETVAL = Mix_FadeInChannelTimed(channel,chunk,loops,ms,ticks);
+#line 3908 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_MixFadeInMusic); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_MixFadeInMusic)
+{
+    dXSARGS;
+    if (items != 3)
+       Perl_croak(aTHX_ "Usage: SDL::MixFadeInMusic(music, loops, ms)");
+    {
+       Mix_Music *     music = INT2PTR(Mix_Music *,SvIV(ST(0)));
+       int     loops = (int)SvIV(ST(1));
+       int     ms = (int)SvIV(ST(2));
+       int     RETVAL;
+       dXSTARG;
+#line 2058 "SDL_perl.xs"
+               RETVAL = Mix_FadeInMusic(music,loops,ms);
+#line 3928 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_MixVolume); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_MixVolume)
+{
+    dXSARGS;
+    if (items != 2)
+       Perl_croak(aTHX_ "Usage: SDL::MixVolume(channel, volume)");
+    {
+       int     channel = (int)SvIV(ST(0));
+       int     volume = (int)SvIV(ST(1));
+       int     RETVAL;
+       dXSTARG;
+#line 2067 "SDL_perl.xs"
+               RETVAL = Mix_Volume(channel,volume);
+#line 3947 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_MixVolumeChunk); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_MixVolumeChunk)
+{
+    dXSARGS;
+    if (items != 2)
+       Perl_croak(aTHX_ "Usage: SDL::MixVolumeChunk(chunk, volume)");
+    {
+       Mix_Chunk *     chunk = INT2PTR(Mix_Chunk *,SvIV(ST(0)));
+       int     volume = (int)SvIV(ST(1));
+       int     RETVAL;
+       dXSTARG;
+#line 2076 "SDL_perl.xs"
+               RETVAL = Mix_VolumeChunk(chunk,volume);
+#line 3966 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_MixVolumeMusic); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_MixVolumeMusic)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::MixVolumeMusic(volume)");
+    {
+       int     volume = (int)SvIV(ST(0));
+       int     RETVAL;
+       dXSTARG;
+#line 2084 "SDL_perl.xs"
+               RETVAL = Mix_VolumeMusic(volume);
+#line 3984 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_MixHaltChannel); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_MixHaltChannel)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::MixHaltChannel(channel)");
+    {
+       int     channel = (int)SvIV(ST(0));
+       int     RETVAL;
+       dXSTARG;
+#line 2092 "SDL_perl.xs"
+               RETVAL = Mix_HaltChannel(channel);
+#line 4002 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_MixHaltGroup); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_MixHaltGroup)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::MixHaltGroup(tag)");
+    {
+       int     tag = (int)SvIV(ST(0));
+       int     RETVAL;
+       dXSTARG;
+#line 2100 "SDL_perl.xs"
+               RETVAL = Mix_HaltGroup(tag);
+#line 4020 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_MixHaltMusic); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_MixHaltMusic)
+{
+    dXSARGS;
+    if (items != 0)
+       Perl_croak(aTHX_ "Usage: SDL::MixHaltMusic()");
+    {
+       int     RETVAL;
+       dXSTARG;
+#line 2107 "SDL_perl.xs"
+               RETVAL = Mix_HaltMusic();
+#line 4037 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_MixExpireChannel); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_MixExpireChannel)
+{
+    dXSARGS;
+    if (items != 2)
+       Perl_croak(aTHX_ "Usage: SDL::MixExpireChannel(channel, ticks)");
+    {
+       int     channel = (int)SvIV(ST(0));
+       int     ticks = (int)SvIV(ST(1));
+       int     RETVAL;
+       dXSTARG;
+#line 2116 "SDL_perl.xs"
+               RETVAL = Mix_ExpireChannel ( channel,ticks);
+#line 4056 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_MixFadeOutChannel); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_MixFadeOutChannel)
+{
+    dXSARGS;
+    if (items != 2)
+       Perl_croak(aTHX_ "Usage: SDL::MixFadeOutChannel(which, ms)");
+    {
+       int     which = (int)SvIV(ST(0));
+       int     ms = (int)SvIV(ST(1));
+       int     RETVAL;
+       dXSTARG;
+#line 2125 "SDL_perl.xs"
+               RETVAL = Mix_FadeOutChannel(which,ms);
+#line 4075 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_MixFadeOutGroup); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_MixFadeOutGroup)
+{
+    dXSARGS;
+    if (items != 2)
+       Perl_croak(aTHX_ "Usage: SDL::MixFadeOutGroup(which, ms)");
+    {
+       int     which = (int)SvIV(ST(0));
+       int     ms = (int)SvIV(ST(1));
+       int     RETVAL;
+       dXSTARG;
+#line 2134 "SDL_perl.xs"
+               RETVAL = Mix_FadeOutGroup(which,ms);
+#line 4094 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_MixFadeOutMusic); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_MixFadeOutMusic)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::MixFadeOutMusic(ms)");
+    {
+       int     ms = (int)SvIV(ST(0));
+       int     RETVAL;
+       dXSTARG;
+#line 2142 "SDL_perl.xs"
+               RETVAL = Mix_FadeOutMusic(ms);
+#line 4112 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_MixFadingMusic); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_MixFadingMusic)
+{
+    dXSARGS;
+    if (items != 0)
+       Perl_croak(aTHX_ "Usage: SDL::MixFadingMusic()");
+    {
+       Mix_Fading      RETVAL;
+       dXSTARG;
+#line 2149 "SDL_perl.xs"
+               RETVAL = Mix_FadingMusic();
+#line 4129 "SDL_perl.c"
+       XSprePUSH; PUSHu((UV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_MixFadingChannel); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_MixFadingChannel)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::MixFadingChannel(which)");
+    {
+       int     which = (int)SvIV(ST(0));
+       Mix_Fading      RETVAL;
+       dXSTARG;
+#line 2157 "SDL_perl.xs"
+               RETVAL = Mix_FadingChannel(which);
+#line 4147 "SDL_perl.c"
+       XSprePUSH; PUSHu((UV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_MixPause); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_MixPause)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::MixPause(channel)");
+    {
+       int     channel = (int)SvIV(ST(0));
+#line 2165 "SDL_perl.xs"
+               Mix_Pause(channel);
+#line 4163 "SDL_perl.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL_MixResume); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_MixResume)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::MixResume(channel)");
+    {
+       int     channel = (int)SvIV(ST(0));
+#line 2171 "SDL_perl.xs"
+               Mix_Resume(channel);
+#line 4178 "SDL_perl.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL_MixPaused); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_MixPaused)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::MixPaused(channel)");
+    {
+       int     channel = (int)SvIV(ST(0));
+       int     RETVAL;
+       dXSTARG;
+#line 2177 "SDL_perl.xs"
+               RETVAL = Mix_Paused(channel);
+#line 4195 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_MixPauseMusic); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_MixPauseMusic)
+{
+    dXSARGS;
+    if (items != 0)
+       Perl_croak(aTHX_ "Usage: SDL::MixPauseMusic()");
+    {
+#line 2184 "SDL_perl.xs"
+               Mix_PauseMusic();
+#line 4210 "SDL_perl.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL_MixResumeMusic); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_MixResumeMusic)
+{
+    dXSARGS;
+    if (items != 0)
+       Perl_croak(aTHX_ "Usage: SDL::MixResumeMusic()");
+    {
+#line 2189 "SDL_perl.xs"
+               Mix_ResumeMusic();
+#line 4224 "SDL_perl.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL_MixRewindMusic); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_MixRewindMusic)
+{
+    dXSARGS;
+    if (items != 0)
+       Perl_croak(aTHX_ "Usage: SDL::MixRewindMusic()");
+    {
+#line 2194 "SDL_perl.xs"
+               Mix_RewindMusic();
+#line 4238 "SDL_perl.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL_MixPausedMusic); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_MixPausedMusic)
+{
+    dXSARGS;
+    if (items != 0)
+       Perl_croak(aTHX_ "Usage: SDL::MixPausedMusic()");
+    {
+       int     RETVAL;
+       dXSTARG;
+#line 2199 "SDL_perl.xs"
+               RETVAL = Mix_PausedMusic();
+#line 4254 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_MixPlaying); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_MixPlaying)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::MixPlaying(channel)");
+    {
+       int     channel = (int)SvIV(ST(0));
+       int     RETVAL;
+       dXSTARG;
+#line 2207 "SDL_perl.xs"
+               RETVAL = Mix_Playing(channel);
+#line 4272 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_MixPlayingMusic); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_MixPlayingMusic)
+{
+    dXSARGS;
+    if (items != 0)
+       Perl_croak(aTHX_ "Usage: SDL::MixPlayingMusic()");
+    {
+       int     RETVAL;
+       dXSTARG;
+#line 2214 "SDL_perl.xs"
+               RETVAL = Mix_PlayingMusic();
+#line 4289 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_MixCloseAudio); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_MixCloseAudio)
+{
+    dXSARGS;
+    if (items != 0)
+       Perl_croak(aTHX_ "Usage: SDL::MixCloseAudio()");
+    {
+#line 2222 "SDL_perl.xs"
+               Mix_CloseAudio();
+#line 4304 "SDL_perl.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+#endif
+XS(XS_SDL_GLLoadLibrary); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_GLLoadLibrary)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::GLLoadLibrary(path)");
+    {
+       char *  path = (char *)SvPV_nolen(ST(0));
+       int     RETVAL;
+       dXSTARG;
+#line 2230 "SDL_perl.xs"
+               RETVAL = SDL_GL_LoadLibrary(path);
+#line 4322 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_GLGetProcAddress); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_GLGetProcAddress)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::GLGetProcAddress(proc)");
+    {
+       char *  proc = (char *)SvPV_nolen(ST(0));
+       void *  RETVAL;
+       dXSTARG;
+#line 2238 "SDL_perl.xs"
+               RETVAL = SDL_GL_GetProcAddress(proc);
+#line 4340 "SDL_perl.c"
+       XSprePUSH; PUSHi(PTR2IV(RETVAL));
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_GLSetAttribute); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_GLSetAttribute)
+{
+    dXSARGS;
+    if (items != 2)
+       Perl_croak(aTHX_ "Usage: SDL::GLSetAttribute(attr, value)");
+    {
+       int     attr = (int)SvIV(ST(0));
+       int     value = (int)SvIV(ST(1));
+       int     RETVAL;
+       dXSTARG;
+#line 2247 "SDL_perl.xs"
+               RETVAL = SDL_GL_SetAttribute(attr, value);
+#line 4359 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_GLGetAttribute); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_GLGetAttribute)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::GLGetAttribute(attr)");
+    {
+       int     attr = (int)SvIV(ST(0));
+       AV *    RETVAL;
+#line 2255 "SDL_perl.xs"
+               int value;
+               RETVAL = newAV();
+               av_push(RETVAL,newSViv(SDL_GL_GetAttribute(attr, &value)));
+               av_push(RETVAL,newSViv(value));
+#line 4379 "SDL_perl.c"
+       ST(0) = newRV((SV*)RETVAL);
+       sv_2mortal(ST(0));
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_GLSwapBuffers); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_GLSwapBuffers)
+{
+    dXSARGS;
+    if (items != 0)
+       Perl_croak(aTHX_ "Usage: SDL::GLSwapBuffers()");
+    {
+#line 2265 "SDL_perl.xs"
+               SDL_GL_SwapBuffers ();
+#line 4395 "SDL_perl.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL_BigEndian); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_BigEndian)
+{
+    dXSARGS;
+    if (items != 0)
+       Perl_croak(aTHX_ "Usage: SDL::BigEndian()");
+    {
+       int     RETVAL;
+       dXSTARG;
+#line 2271 "SDL_perl.xs"
+               RETVAL = (SDL_BYTEORDER == SDL_BIG_ENDIAN);
+#line 4411 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_NumJoysticks); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_NumJoysticks)
+{
+    dXSARGS;
+    if (items != 0)
+       Perl_croak(aTHX_ "Usage: SDL::NumJoysticks()");
+    {
+       int     RETVAL;
+       dXSTARG;
+#line 2278 "SDL_perl.xs"
+               RETVAL = SDL_NumJoysticks();
+#line 4428 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_JoystickName); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_JoystickName)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::JoystickName(index)");
+    {
+       int     index = (int)SvIV(ST(0));
+       char *  RETVAL;
+       dXSTARG;
+#line 2286 "SDL_perl.xs"
+               RETVAL = (char*)SDL_JoystickName(index);
+#line 4446 "SDL_perl.c"
+       sv_setpv(TARG, RETVAL); XSprePUSH; PUSHTARG;
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_JoystickOpen); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_JoystickOpen)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::JoystickOpen(index)");
+    {
+       int     index = (int)SvIV(ST(0));
+       SDL_Joystick *  RETVAL;
+       dXSTARG;
+#line 2294 "SDL_perl.xs"
+               RETVAL = SDL_JoystickOpen(index);
+#line 4464 "SDL_perl.c"
+       XSprePUSH; PUSHi(PTR2IV(RETVAL));
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_JoystickOpened); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_JoystickOpened)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::JoystickOpened(index)");
+    {
+       int     index = (int)SvIV(ST(0));
+       int     RETVAL;
+       dXSTARG;
+#line 2302 "SDL_perl.xs"
+               RETVAL = SDL_JoystickOpened(index);
+#line 4482 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_JoystickIndex); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_JoystickIndex)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::JoystickIndex(joystick)");
+    {
+       SDL_Joystick *  joystick = INT2PTR(SDL_Joystick *,SvIV(ST(0)));
+       int     RETVAL;
+       dXSTARG;
+#line 2310 "SDL_perl.xs"
+               RETVAL = SDL_JoystickIndex(joystick);
+#line 4500 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_JoystickNumAxes); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_JoystickNumAxes)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::JoystickNumAxes(joystick)");
+    {
+       SDL_Joystick *  joystick = INT2PTR(SDL_Joystick *,SvIV(ST(0)));
+       int     RETVAL;
+       dXSTARG;
+#line 2318 "SDL_perl.xs"
+               RETVAL = SDL_JoystickNumAxes(joystick);
+#line 4518 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_JoystickNumBalls); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_JoystickNumBalls)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::JoystickNumBalls(joystick)");
+    {
+       SDL_Joystick *  joystick = INT2PTR(SDL_Joystick *,SvIV(ST(0)));
+       int     RETVAL;
+       dXSTARG;
+#line 2326 "SDL_perl.xs"
+               RETVAL = SDL_JoystickNumBalls(joystick);
+#line 4536 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_JoystickNumHats); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_JoystickNumHats)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::JoystickNumHats(joystick)");
+    {
+       SDL_Joystick *  joystick = INT2PTR(SDL_Joystick *,SvIV(ST(0)));
+       int     RETVAL;
+       dXSTARG;
+#line 2334 "SDL_perl.xs"
+               RETVAL = SDL_JoystickNumHats(joystick);
+#line 4554 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_JoystickNumButtons); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_JoystickNumButtons)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::JoystickNumButtons(joystick)");
+    {
+       SDL_Joystick *  joystick = INT2PTR(SDL_Joystick *,SvIV(ST(0)));
+       int     RETVAL;
+       dXSTARG;
+#line 2342 "SDL_perl.xs"
+               RETVAL = SDL_JoystickNumButtons(joystick);
+#line 4572 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_JoystickUpdate); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_JoystickUpdate)
+{
+    dXSARGS;
+    if (items != 0)
+       Perl_croak(aTHX_ "Usage: SDL::JoystickUpdate()");
+    {
+#line 2349 "SDL_perl.xs"
+               SDL_JoystickUpdate();
+#line 4587 "SDL_perl.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL_JoystickGetAxis); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_JoystickGetAxis)
+{
+    dXSARGS;
+    if (items != 2)
+       Perl_croak(aTHX_ "Usage: SDL::JoystickGetAxis(joystick, axis)");
+    {
+       SDL_Joystick *  joystick = INT2PTR(SDL_Joystick *,SvIV(ST(0)));
+       int     axis = (int)SvIV(ST(1));
+       Sint16  RETVAL;
+       dXSTARG;
+#line 2356 "SDL_perl.xs"
+               RETVAL = SDL_JoystickGetAxis(joystick,axis);
+#line 4605 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_JoystickGetHat); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_JoystickGetHat)
+{
+    dXSARGS;
+    if (items != 2)
+       Perl_croak(aTHX_ "Usage: SDL::JoystickGetHat(joystick, hat)");
+    {
+       SDL_Joystick *  joystick = INT2PTR(SDL_Joystick *,SvIV(ST(0)));
+       int     hat = (int)SvIV(ST(1));
+       Uint8   RETVAL;
+       dXSTARG;
+#line 2365 "SDL_perl.xs"
+               RETVAL = SDL_JoystickGetHat(joystick,hat);
+#line 4624 "SDL_perl.c"
+       XSprePUSH; PUSHu((UV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_JoystickGetButton); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_JoystickGetButton)
+{
+    dXSARGS;
+    if (items != 2)
+       Perl_croak(aTHX_ "Usage: SDL::JoystickGetButton(joystick, button)");
+    {
+       SDL_Joystick *  joystick = INT2PTR(SDL_Joystick *,SvIV(ST(0)));
+       int     button = (int)SvIV(ST(1));
+       Uint8   RETVAL;
+       dXSTARG;
+#line 2374 "SDL_perl.xs"
+               RETVAL = SDL_JoystickGetButton(joystick,button);
+#line 4643 "SDL_perl.c"
+       XSprePUSH; PUSHu((UV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_JoystickGetBall); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_JoystickGetBall)
+{
+    dXSARGS;
+    if (items != 2)
+       Perl_croak(aTHX_ "Usage: SDL::JoystickGetBall(joystick, ball)");
+    {
+       SDL_Joystick *  joystick = INT2PTR(SDL_Joystick *,SvIV(ST(0)));
+       int     ball = (int)SvIV(ST(1));
+       AV *    RETVAL;
+#line 2383 "SDL_perl.xs"
+               int success,dx,dy;
+               success = SDL_JoystickGetBall(joystick,ball,&dx,&dy);
+               RETVAL = newAV();
+               av_push(RETVAL,newSViv(success));
+               av_push(RETVAL,newSViv(dx));
+               av_push(RETVAL,newSViv(dy));
+#line 4666 "SDL_perl.c"
+       ST(0) = newRV((SV*)RETVAL);
+       sv_2mortal(ST(0));
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_JoystickClose); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_JoystickClose)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::JoystickClose(joystick)");
+    {
+       SDL_Joystick *  joystick = INT2PTR(SDL_Joystick *,SvIV(ST(0)));
+#line 2396 "SDL_perl.xs"
+               SDL_JoystickClose(joystick);
+#line 4683 "SDL_perl.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL_JoyAxisEventWhich); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_JoyAxisEventWhich)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::JoyAxisEventWhich(e)");
+    {
+       SDL_Event *     e = INT2PTR(SDL_Event *,SvIV(ST(0)));
+       Sint16  RETVAL;
+       dXSTARG;
+#line 2402 "SDL_perl.xs"
+               RETVAL = e->jaxis.which;
+#line 4700 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_JoyAxisEventAxis); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_JoyAxisEventAxis)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::JoyAxisEventAxis(e)");
+    {
+       SDL_Event *     e = INT2PTR(SDL_Event *,SvIV(ST(0)));
+       Uint8   RETVAL;
+       dXSTARG;
+#line 2410 "SDL_perl.xs"
+                RETVAL = e->jaxis.axis;
+#line 4718 "SDL_perl.c"
+       XSprePUSH; PUSHu((UV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_JoyAxisEventValue); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_JoyAxisEventValue)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::JoyAxisEventValue(e)");
+    {
+       SDL_Event *     e = INT2PTR(SDL_Event *,SvIV(ST(0)));
+       Uint8   RETVAL;
+       dXSTARG;
+#line 2418 "SDL_perl.xs"
+                RETVAL = e->jaxis.value;
+#line 4736 "SDL_perl.c"
+       XSprePUSH; PUSHu((UV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_JoyButtonEventWhich); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_JoyButtonEventWhich)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::JoyButtonEventWhich(e)");
+    {
+       SDL_Event *     e = INT2PTR(SDL_Event *,SvIV(ST(0)));
+       Uint8   RETVAL;
+       dXSTARG;
+#line 2426 "SDL_perl.xs"
+                RETVAL = e->jbutton.which;
+#line 4754 "SDL_perl.c"
+       XSprePUSH; PUSHu((UV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_JoyButtonEventButton); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_JoyButtonEventButton)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::JoyButtonEventButton(e)");
+    {
+       SDL_Event *     e = INT2PTR(SDL_Event *,SvIV(ST(0)));
+       Uint8   RETVAL;
+       dXSTARG;
+#line 2434 "SDL_perl.xs"
+                RETVAL = e->jbutton.button;
+#line 4772 "SDL_perl.c"
+       XSprePUSH; PUSHu((UV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_JoyButtonEventState); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_JoyButtonEventState)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::JoyButtonEventState(e)");
+    {
+       SDL_Event *     e = INT2PTR(SDL_Event *,SvIV(ST(0)));
+       Uint8   RETVAL;
+       dXSTARG;
+#line 2442 "SDL_perl.xs"
+                RETVAL = e->jbutton.state;
+#line 4790 "SDL_perl.c"
+       XSprePUSH; PUSHu((UV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_JoyHatEventWhich); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_JoyHatEventWhich)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::JoyHatEventWhich(e)");
+    {
+       SDL_Event *     e = INT2PTR(SDL_Event *,SvIV(ST(0)));
+       Uint8   RETVAL;
+       dXSTARG;
+#line 2450 "SDL_perl.xs"
+                RETVAL = e->jhat.which;
+#line 4808 "SDL_perl.c"
+       XSprePUSH; PUSHu((UV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_JoyHatEventHat); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_JoyHatEventHat)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::JoyHatEventHat(e)");
+    {
+       SDL_Event *     e = INT2PTR(SDL_Event *,SvIV(ST(0)));
+       Uint8   RETVAL;
+       dXSTARG;
+#line 2458 "SDL_perl.xs"
+                RETVAL = e->jhat.hat;
+#line 4826 "SDL_perl.c"
+       XSprePUSH; PUSHu((UV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_JoyHatEventValue); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_JoyHatEventValue)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::JoyHatEventValue(e)");
+    {
+       SDL_Event *     e = INT2PTR(SDL_Event *,SvIV(ST(0)));
+       Uint8   RETVAL;
+       dXSTARG;
+#line 2466 "SDL_perl.xs"
+                RETVAL = e->jhat.value;
+#line 4844 "SDL_perl.c"
+       XSprePUSH; PUSHu((UV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_JoyBallEventWhich); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_JoyBallEventWhich)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::JoyBallEventWhich(e)");
+    {
+       SDL_Event *     e = INT2PTR(SDL_Event *,SvIV(ST(0)));
+       Uint8   RETVAL;
+       dXSTARG;
+#line 2474 "SDL_perl.xs"
+                RETVAL = e->jball.which;
+#line 4862 "SDL_perl.c"
+       XSprePUSH; PUSHu((UV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_JoyBallEventBall); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_JoyBallEventBall)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::JoyBallEventBall(e)");
+    {
+       SDL_Event *     e = INT2PTR(SDL_Event *,SvIV(ST(0)));
+       Uint8   RETVAL;
+       dXSTARG;
+#line 2482 "SDL_perl.xs"
+                RETVAL = e->jball.ball;
+#line 4880 "SDL_perl.c"
+       XSprePUSH; PUSHu((UV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_JoyBallEventXrel); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_JoyBallEventXrel)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::JoyBallEventXrel(e)");
+    {
+       SDL_Event *     e = INT2PTR(SDL_Event *,SvIV(ST(0)));
+       Sint16  RETVAL;
+       dXSTARG;
+#line 2490 "SDL_perl.xs"
+                RETVAL = e->jball.xrel;
+#line 4898 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_JoyBallEventYrel); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_JoyBallEventYrel)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::JoyBallEventYrel(e)");
+    {
+       SDL_Event *     e = INT2PTR(SDL_Event *,SvIV(ST(0)));
+       Sint16  RETVAL;
+       dXSTARG;
+#line 2498 "SDL_perl.xs"
+                RETVAL = e->jball.yrel;
+#line 4916 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_SetClipRect); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_SetClipRect)
+{
+    dXSARGS;
+    if (items != 2)
+       Perl_croak(aTHX_ "Usage: SDL::SetClipRect(surface, rect)");
+    {
+       SDL_Surface *   surface = INT2PTR(SDL_Surface *,SvIV(ST(0)));
+       SDL_Rect *      rect = INT2PTR(SDL_Rect *,SvIV(ST(1)));
+#line 2507 "SDL_perl.xs"
+               SDL_SetClipRect(surface,rect);
+#line 4933 "SDL_perl.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL_GetClipRect); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_GetClipRect)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::GetClipRect(surface)");
+    {
+       SDL_Surface *   surface = INT2PTR(SDL_Surface *,SvIV(ST(0)));
+       SDL_Rect *      RETVAL;
+       dXSTARG;
+#line 2513 "SDL_perl.xs"
+               RETVAL = (SDL_Rect*) safemalloc(sizeof(SDL_Rect));
+               SDL_GetClipRect(surface,RETVAL);
+#line 4951 "SDL_perl.c"
+       XSprePUSH; PUSHi(PTR2IV(RETVAL));
+    }
+    XSRETURN(1);
+}
+
+#ifdef HAVE_SDL_NET
+#define XSubPPtmpAAAC 1
+
+XS(XS_SDL_NetInit); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_NetInit)
+{
+    dXSARGS;
+    if (items != 0)
+       Perl_croak(aTHX_ "Usage: SDL::NetInit()");
+    {
+       int     RETVAL;
+       dXSTARG;
+#line 2524 "SDL_perl.xs"
+               RETVAL = SDLNet_Init();
+#line 4971 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_NetQuit); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_NetQuit)
+{
+    dXSARGS;
+    if (items != 0)
+       Perl_croak(aTHX_ "Usage: SDL::NetQuit()");
+    {
+#line 2531 "SDL_perl.xs"
+               SDLNet_Quit();
+#line 4986 "SDL_perl.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL_NetNewIPaddress); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_NetNewIPaddress)
+{
+    dXSARGS;
+    if (items != 2)
+       Perl_croak(aTHX_ "Usage: SDL::NetNewIPaddress(host, port)");
+    {
+       Uint32  host = (Uint32)SvUV(ST(0));
+       Uint16  port = (Uint16)SvUV(ST(1));
+       IPaddress *     RETVAL;
+       dXSTARG;
+#line 2538 "SDL_perl.xs"
+               RETVAL = (IPaddress*) safemalloc(sizeof(IPaddress));
+               RETVAL->host = host;
+               RETVAL->port = port;
+#line 5006 "SDL_perl.c"
+       XSprePUSH; PUSHi(PTR2IV(RETVAL));
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_NetIPaddressHost); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_NetIPaddressHost)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::NetIPaddressHost(ip)");
+    {
+       IPaddress *     ip = INT2PTR(IPaddress *,SvIV(ST(0)));
+       Uint32  RETVAL;
+       dXSTARG;
+#line 2548 "SDL_perl.xs"
+               RETVAL = ip->host;
+#line 5024 "SDL_perl.c"
+       XSprePUSH; PUSHu((UV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_NetIPaddressPort); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_NetIPaddressPort)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::NetIPaddressPort(ip)");
+    {
+       IPaddress *     ip = INT2PTR(IPaddress *,SvIV(ST(0)));
+       Uint16  RETVAL;
+       dXSTARG;
+#line 2556 "SDL_perl.xs"
+               RETVAL = ip->port;
+#line 5042 "SDL_perl.c"
+       XSprePUSH; PUSHu((UV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_NetFreeIPaddress); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_NetFreeIPaddress)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::NetFreeIPaddress(ip)");
+    {
+       IPaddress *     ip = INT2PTR(IPaddress *,SvIV(ST(0)));
+#line 2564 "SDL_perl.xs"
+               safefree(ip);
+#line 5058 "SDL_perl.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL_NetResolveIP); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_NetResolveIP)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::NetResolveIP(address)");
+    {
+       IPaddress *     address = INT2PTR(IPaddress *,SvIV(ST(0)));
+       const char *    RETVAL;
+       dXSTARG;
+#line 2570 "SDL_perl.xs"
+               RETVAL = SDLNet_ResolveIP(address);
+#line 5075 "SDL_perl.c"
+       sv_setpv(TARG, RETVAL); XSprePUSH; PUSHTARG;
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_NetResolveHost); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_NetResolveHost)
+{
+    dXSARGS;
+    if (items != 3)
+       Perl_croak(aTHX_ "Usage: SDL::NetResolveHost(address, host, port)");
+    {
+       IPaddress *     address = INT2PTR(IPaddress *,SvIV(ST(0)));
+       const char *    host = (const char *)SvPV_nolen(ST(1));
+       Uint16  port = (Uint16)SvUV(ST(2));
+       int     RETVAL;
+       dXSTARG;
+#line 2580 "SDL_perl.xs"
+               RETVAL = SDLNet_ResolveHost(address,host,port);
+#line 5095 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_NetTCPOpen); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_NetTCPOpen)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::NetTCPOpen(ip)");
+    {
+       IPaddress *     ip = INT2PTR(IPaddress *,SvIV(ST(0)));
+       TCPsocket       RETVAL;
+       dXSTARG;
+#line 2588 "SDL_perl.xs"
+               RETVAL = SDLNet_TCP_Open(ip);
+#line 5113 "SDL_perl.c"
+       XSprePUSH; PUSHi(PTR2IV(RETVAL));
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_NetTCPAccept); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_NetTCPAccept)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::NetTCPAccept(server)");
+    {
+       TCPsocket       server = INT2PTR(TCPsocket,SvIV(ST(0)));
+       TCPsocket       RETVAL;
+       dXSTARG;
+#line 2596 "SDL_perl.xs"
+               RETVAL = SDLNet_TCP_Accept(server);
+#line 5131 "SDL_perl.c"
+       XSprePUSH; PUSHi(PTR2IV(RETVAL));
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_NetTCPGetPeerAddress); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_NetTCPGetPeerAddress)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::NetTCPGetPeerAddress(sock)");
+    {
+       TCPsocket       sock = INT2PTR(TCPsocket,SvIV(ST(0)));
+       IPaddress *     RETVAL;
+       dXSTARG;
+#line 2604 "SDL_perl.xs"
+               RETVAL = SDLNet_TCP_GetPeerAddress(sock);
+#line 5149 "SDL_perl.c"
+       XSprePUSH; PUSHi(PTR2IV(RETVAL));
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_NetTCPSend); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_NetTCPSend)
+{
+    dXSARGS;
+    if (items != 3)
+       Perl_croak(aTHX_ "Usage: SDL::NetTCPSend(sock, data, len)");
+    {
+       TCPsocket       sock = INT2PTR(TCPsocket,SvIV(ST(0)));
+       void *  data = INT2PTR(void *,SvIV(ST(1)));
+       int     len = (int)SvIV(ST(2));
+       int     RETVAL;
+       dXSTARG;
+#line 2614 "SDL_perl.xs"
+               RETVAL = SDLNet_TCP_Send(sock,data,len);
+#line 5169 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_NetTCPRecv); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_NetTCPRecv)
+{
+    dXSARGS;
+    if (items != 2)
+       Perl_croak(aTHX_ "Usage: SDL::NetTCPRecv(sock, maxlen)");
+    {
+       TCPsocket       sock = INT2PTR(TCPsocket,SvIV(ST(0)));
+       int     maxlen = (int)SvIV(ST(1));
+       AV *    RETVAL;
+#line 2623 "SDL_perl.xs"
+               int status;
+               void *buffer;
+               buffer = safemalloc(maxlen);
+               RETVAL = newAV();
+               status = SDLNet_TCP_Recv(sock,buffer,maxlen);
+               av_push(RETVAL,newSViv(status));
+               av_push(RETVAL,newSVpvn((char*)buffer,maxlen));
+#line 5193 "SDL_perl.c"
+       ST(0) = newRV((SV*)RETVAL);
+       sv_2mortal(ST(0));
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_NetTCPClose); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_NetTCPClose)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::NetTCPClose(sock)");
+    {
+       TCPsocket       sock = INT2PTR(TCPsocket,SvIV(ST(0)));
+#line 2637 "SDL_perl.xs"
+               SDLNet_TCP_Close(sock);
+#line 5210 "SDL_perl.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL_NetAllocPacket); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_NetAllocPacket)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::NetAllocPacket(size)");
+    {
+       int     size = (int)SvIV(ST(0));
+       UDPpacket *     RETVAL;
+       dXSTARG;
+#line 2643 "SDL_perl.xs"
+               RETVAL = SDLNet_AllocPacket(size);
+#line 5227 "SDL_perl.c"
+       XSprePUSH; PUSHi(PTR2IV(RETVAL));
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_NetAllocPacketV); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_NetAllocPacketV)
+{
+    dXSARGS;
+    if (items != 2)
+       Perl_croak(aTHX_ "Usage: SDL::NetAllocPacketV(howmany, size)");
+    {
+       int     howmany = (int)SvIV(ST(0));
+       int     size = (int)SvIV(ST(1));
+       UDPpacket **    RETVAL;
+       dXSTARG;
+#line 2652 "SDL_perl.xs"
+               RETVAL = SDLNet_AllocPacketV(howmany,size);
+#line 5246 "SDL_perl.c"
+       XSprePUSH; PUSHi(PTR2IV(RETVAL));
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_NetResizePacket); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_NetResizePacket)
+{
+    dXSARGS;
+    if (items != 2)
+       Perl_croak(aTHX_ "Usage: SDL::NetResizePacket(packet, newsize)");
+    {
+       UDPpacket *     packet = INT2PTR(UDPpacket *,SvIV(ST(0)));
+       int     newsize = (int)SvIV(ST(1));
+       int     RETVAL;
+       dXSTARG;
+#line 2661 "SDL_perl.xs"
+               RETVAL = SDLNet_ResizePacket(packet,newsize);
+#line 5265 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_NetFreePacket); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_NetFreePacket)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::NetFreePacket(packet)");
+    {
+       UDPpacket *     packet = INT2PTR(UDPpacket *,SvIV(ST(0)));
+#line 2669 "SDL_perl.xs"
+               SDLNet_FreePacket(packet);
+#line 5281 "SDL_perl.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL_NetFreePacketV); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_NetFreePacketV)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::NetFreePacketV(packet)");
+    {
+       UDPpacket **    packet = INT2PTR(UDPpacket **,SvIV(ST(0)));
+#line 2675 "SDL_perl.xs"
+               SDLNet_FreePacketV(packet);
+#line 5296 "SDL_perl.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL_NetUDPOpen); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_NetUDPOpen)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::NetUDPOpen(port)");
+    {
+       Uint16  port = (Uint16)SvUV(ST(0));
+       UDPsocket       RETVAL;
+       dXSTARG;
+#line 2681 "SDL_perl.xs"
+               RETVAL = SDLNet_UDP_Open(port);
+#line 5313 "SDL_perl.c"
+       XSprePUSH; PUSHi(PTR2IV(RETVAL));
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_NetUDPBind); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_NetUDPBind)
+{
+    dXSARGS;
+    if (items != 3)
+       Perl_croak(aTHX_ "Usage: SDL::NetUDPBind(sock, channel, address)");
+    {
+       UDPsocket       sock = INT2PTR(UDPsocket,SvIV(ST(0)));
+       int     channel = (int)SvIV(ST(1));
+       IPaddress *     address = INT2PTR(IPaddress *,SvIV(ST(2)));
+       int     RETVAL;
+       dXSTARG;
+#line 2691 "SDL_perl.xs"
+               RETVAL = SDLNet_UDP_Bind(sock,channel,address);
+#line 5333 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_NetUDPUnbind); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_NetUDPUnbind)
+{
+    dXSARGS;
+    if (items != 2)
+       Perl_croak(aTHX_ "Usage: SDL::NetUDPUnbind(sock, channel)");
+    {
+       UDPsocket       sock = INT2PTR(UDPsocket,SvIV(ST(0)));
+       int     channel = (int)SvIV(ST(1));
+#line 2700 "SDL_perl.xs"
+               SDLNet_UDP_Unbind(sock,channel);
+#line 5350 "SDL_perl.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL_NetUDPGetPeerAddress); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_NetUDPGetPeerAddress)
+{
+    dXSARGS;
+    if (items != 2)
+       Perl_croak(aTHX_ "Usage: SDL::NetUDPGetPeerAddress(sock, channel)");
+    {
+       UDPsocket       sock = INT2PTR(UDPsocket,SvIV(ST(0)));
+       int     channel = (int)SvIV(ST(1));
+       IPaddress *     RETVAL;
+       dXSTARG;
+#line 2707 "SDL_perl.xs"
+               RETVAL = SDLNet_UDP_GetPeerAddress(sock,channel);
+#line 5368 "SDL_perl.c"
+       XSprePUSH; PUSHi(PTR2IV(RETVAL));
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_NetUDPSendV); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_NetUDPSendV)
+{
+    dXSARGS;
+    if (items != 3)
+       Perl_croak(aTHX_ "Usage: SDL::NetUDPSendV(sock, packets, npackets)");
+    {
+       UDPsocket       sock = INT2PTR(UDPsocket,SvIV(ST(0)));
+       UDPpacket **    packets = INT2PTR(UDPpacket **,SvIV(ST(1)));
+       int     npackets = (int)SvIV(ST(2));
+       int     RETVAL;
+       dXSTARG;
+#line 2717 "SDL_perl.xs"
+               RETVAL = SDLNet_UDP_SendV(sock,packets,npackets);
+#line 5388 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_NetUDPSend); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_NetUDPSend)
+{
+    dXSARGS;
+    if (items != 3)
+       Perl_croak(aTHX_ "Usage: SDL::NetUDPSend(sock, channel, packet)");
+    {
+       UDPsocket       sock = INT2PTR(UDPsocket,SvIV(ST(0)));
+       int     channel = (int)SvIV(ST(1));
+       UDPpacket *     packet = INT2PTR(UDPpacket *,SvIV(ST(2)));
+       int     RETVAL;
+       dXSTARG;
+#line 2727 "SDL_perl.xs"
+               RETVAL = SDLNet_UDP_Send(sock,channel,packet);
+#line 5408 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_NetUDPRecvV); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_NetUDPRecvV)
+{
+    dXSARGS;
+    if (items != 2)
+       Perl_croak(aTHX_ "Usage: SDL::NetUDPRecvV(sock, packets)");
+    {
+       UDPsocket       sock = INT2PTR(UDPsocket,SvIV(ST(0)));
+       UDPpacket **    packets = INT2PTR(UDPpacket **,SvIV(ST(1)));
+       int     RETVAL;
+       dXSTARG;
+#line 2736 "SDL_perl.xs"
+               RETVAL = SDLNet_UDP_RecvV(sock,packets);
+#line 5427 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_NetUDPRecv); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_NetUDPRecv)
+{
+    dXSARGS;
+    if (items != 2)
+       Perl_croak(aTHX_ "Usage: SDL::NetUDPRecv(sock, packet)");
+    {
+       UDPsocket       sock = INT2PTR(UDPsocket,SvIV(ST(0)));
+       UDPpacket *     packet = INT2PTR(UDPpacket *,SvIV(ST(1)));
+       int     RETVAL;
+       dXSTARG;
+#line 2745 "SDL_perl.xs"
+               RETVAL = SDLNet_UDP_Recv(sock,packet);
+#line 5446 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_NetUDPClose); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_NetUDPClose)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::NetUDPClose(sock)");
+    {
+       UDPsocket       sock = INT2PTR(UDPsocket,SvIV(ST(0)));
+#line 2753 "SDL_perl.xs"
+               SDLNet_UDP_Close(sock);
+#line 5462 "SDL_perl.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL_NetAllocSocketSet); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_NetAllocSocketSet)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::NetAllocSocketSet(maxsockets)");
+    {
+       int     maxsockets = (int)SvIV(ST(0));
+       SDLNet_SocketSet        RETVAL;
+       dXSTARG;
+#line 2759 "SDL_perl.xs"
+               RETVAL = SDLNet_AllocSocketSet(maxsockets);
+#line 5479 "SDL_perl.c"
+       XSprePUSH; PUSHi(PTR2IV(RETVAL));
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_NetTCP_AddSocket); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_NetTCP_AddSocket)
+{
+    dXSARGS;
+    if (items != 2)
+       Perl_croak(aTHX_ "Usage: SDL::NetTCP_AddSocket(set, sock)");
+    {
+       SDLNet_SocketSet        set = INT2PTR(SDLNet_SocketSet,SvIV(ST(0)));
+       TCPsocket       sock = INT2PTR(TCPsocket,SvIV(ST(1)));
+       int     RETVAL;
+       dXSTARG;
+#line 2768 "SDL_perl.xs"
+               RETVAL = SDLNet_TCP_AddSocket(set,sock);
+#line 5498 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_NetUDP_AddSocket); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_NetUDP_AddSocket)
+{
+    dXSARGS;
+    if (items != 2)
+       Perl_croak(aTHX_ "Usage: SDL::NetUDP_AddSocket(set, sock)");
+    {
+       SDLNet_SocketSet        set = INT2PTR(SDLNet_SocketSet,SvIV(ST(0)));
+       UDPsocket       sock = INT2PTR(UDPsocket,SvIV(ST(1)));
+       int     RETVAL;
+       dXSTARG;
+#line 2777 "SDL_perl.xs"
+               RETVAL = SDLNet_UDP_AddSocket(set,sock);
+#line 5517 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_NetTCP_DelSocket); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_NetTCP_DelSocket)
+{
+    dXSARGS;
+    if (items != 2)
+       Perl_croak(aTHX_ "Usage: SDL::NetTCP_DelSocket(set, sock)");
+    {
+       SDLNet_SocketSet        set = INT2PTR(SDLNet_SocketSet,SvIV(ST(0)));
+       TCPsocket       sock = INT2PTR(TCPsocket,SvIV(ST(1)));
+       int     RETVAL;
+       dXSTARG;
+#line 2786 "SDL_perl.xs"
+               RETVAL = SDLNet_TCP_DelSocket(set,sock);
+#line 5536 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_NetUDP_DelSocket); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_NetUDP_DelSocket)
+{
+    dXSARGS;
+    if (items != 2)
+       Perl_croak(aTHX_ "Usage: SDL::NetUDP_DelSocket(set, sock)");
+    {
+       SDLNet_SocketSet        set = INT2PTR(SDLNet_SocketSet,SvIV(ST(0)));
+       UDPsocket       sock = INT2PTR(UDPsocket,SvIV(ST(1)));
+       int     RETVAL;
+       dXSTARG;
+#line 2795 "SDL_perl.xs"
+               RETVAL = SDLNet_UDP_DelSocket(set,sock);
+#line 5555 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_NetCheckSockets); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_NetCheckSockets)
+{
+    dXSARGS;
+    if (items != 2)
+       Perl_croak(aTHX_ "Usage: SDL::NetCheckSockets(set, timeout)");
+    {
+       SDLNet_SocketSet        set = INT2PTR(SDLNet_SocketSet,SvIV(ST(0)));
+       Uint32  timeout = (Uint32)SvUV(ST(1));
+       int     RETVAL;
+       dXSTARG;
+#line 2804 "SDL_perl.xs"
+               RETVAL = SDLNet_CheckSockets(set,timeout);
+#line 5574 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_NetSocketReady); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_NetSocketReady)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::NetSocketReady(sock)");
+    {
+       SDLNet_GenericSocket    sock = INT2PTR(SDLNet_GenericSocket,SvIV(ST(0)));
+       int     RETVAL;
+       dXSTARG;
+#line 2812 "SDL_perl.xs"
+               RETVAL = SDLNet_SocketReady(sock);
+#line 5592 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_NetFreeSocketSet); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_NetFreeSocketSet)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::NetFreeSocketSet(set)");
+    {
+       SDLNet_SocketSet        set = INT2PTR(SDLNet_SocketSet,SvIV(ST(0)));
+#line 2820 "SDL_perl.xs"
+               SDLNet_FreeSocketSet(set);
+#line 5608 "SDL_perl.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL_NetWrite16); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_NetWrite16)
+{
+    dXSARGS;
+    if (items != 2)
+       Perl_croak(aTHX_ "Usage: SDL::NetWrite16(value, area)");
+    {
+       Uint16  value = (Uint16)SvUV(ST(0));
+       void *  area = INT2PTR(void *,SvIV(ST(1)));
+#line 2827 "SDL_perl.xs"
+               SDLNet_Write16(value,area);
+#line 5624 "SDL_perl.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL_NetWrite32); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_NetWrite32)
+{
+    dXSARGS;
+    if (items != 2)
+       Perl_croak(aTHX_ "Usage: SDL::NetWrite32(value, area)");
+    {
+       Uint32  value = (Uint32)SvUV(ST(0));
+       void *  area = INT2PTR(void *,SvIV(ST(1)));
+#line 2834 "SDL_perl.xs"
+               SDLNet_Write32(value,area);
+#line 5640 "SDL_perl.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL_NetRead16); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_NetRead16)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::NetRead16(area)");
+    {
+       void *  area = INT2PTR(void *,SvIV(ST(0)));
+       Uint16  RETVAL;
+       dXSTARG;
+#line 2840 "SDL_perl.xs"
+               RETVAL = SDLNet_Read16(area);
+#line 5657 "SDL_perl.c"
+       XSprePUSH; PUSHu((UV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_NetRead32); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_NetRead32)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::NetRead32(area)");
+    {
+       void *  area = INT2PTR(void *,SvIV(ST(0)));
+       Uint32  RETVAL;
+       dXSTARG;
+#line 2848 "SDL_perl.xs"
+               RETVAL = SDLNet_Read32(area);
+#line 5675 "SDL_perl.c"
+       XSprePUSH; PUSHu((UV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+#endif 
+#ifdef HAVE_SDL_TTF
+#define XSubPPtmpAAAD 1
+
+XS(XS_SDL_TTFInit); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_TTFInit)
+{
+    dXSARGS;
+    if (items != 0)
+       Perl_croak(aTHX_ "Usage: SDL::TTFInit()");
+    {
+       int     RETVAL;
+       dXSTARG;
+#line 2859 "SDL_perl.xs"
+               RETVAL = TTF_Init();
+#line 5696 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_TTFQuit); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_TTFQuit)
+{
+    dXSARGS;
+    if (items != 0)
+       Perl_croak(aTHX_ "Usage: SDL::TTFQuit()");
+    {
+#line 2866 "SDL_perl.xs"
+               TTF_Quit();
+#line 5711 "SDL_perl.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL_TTFOpenFont); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_TTFOpenFont)
+{
+    dXSARGS;
+    if (items != 2)
+       Perl_croak(aTHX_ "Usage: SDL::TTFOpenFont(file, ptsize)");
+    {
+       char *  file = (char *)SvPV_nolen(ST(0));
+       int     ptsize = (int)SvIV(ST(1));
+       TTF_Font *      RETVAL;
+       dXSTARG;
+#line 2873 "SDL_perl.xs"
+               RETVAL = TTF_OpenFont(file,ptsize);
+#line 5729 "SDL_perl.c"
+       XSprePUSH; PUSHi(PTR2IV(RETVAL));
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_TTFGetFontStyle); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_TTFGetFontStyle)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::TTFGetFontStyle(font)");
+    {
+       TTF_Font *      font = INT2PTR(TTF_Font *,SvIV(ST(0)));
+       int     RETVAL;
+       dXSTARG;
+#line 2881 "SDL_perl.xs"
+               RETVAL = TTF_GetFontStyle(font);
+#line 5747 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_TTFSetFontStyle); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_TTFSetFontStyle)
+{
+    dXSARGS;
+    if (items != 2)
+       Perl_croak(aTHX_ "Usage: SDL::TTFSetFontStyle(font, style)");
+    {
+       TTF_Font *      font = INT2PTR(TTF_Font *,SvIV(ST(0)));
+       int     style = (int)SvIV(ST(1));
+#line 2890 "SDL_perl.xs"
+               TTF_SetFontStyle(font,style);
+#line 5764 "SDL_perl.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL_TTFFontHeight); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_TTFFontHeight)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::TTFFontHeight(font)");
+    {
+       TTF_Font *      font = INT2PTR(TTF_Font *,SvIV(ST(0)));
+       int     RETVAL;
+       dXSTARG;
+#line 2896 "SDL_perl.xs"
+               RETVAL = TTF_FontHeight(font);
+#line 5781 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_TTFFontAscent); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_TTFFontAscent)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::TTFFontAscent(font)");
+    {
+       TTF_Font *      font = INT2PTR(TTF_Font *,SvIV(ST(0)));
+       int     RETVAL;
+       dXSTARG;
+#line 2904 "SDL_perl.xs"
+               RETVAL = TTF_FontAscent(font);
+#line 5799 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_TTFFontDescent); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_TTFFontDescent)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::TTFFontDescent(font)");
+    {
+       TTF_Font *      font = INT2PTR(TTF_Font *,SvIV(ST(0)));
+       int     RETVAL;
+       dXSTARG;
+#line 2912 "SDL_perl.xs"
+               RETVAL = TTF_FontDescent(font);
+#line 5817 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_TTFFontLineSkip); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_TTFFontLineSkip)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::TTFFontLineSkip(font)");
+    {
+       TTF_Font *      font = INT2PTR(TTF_Font *,SvIV(ST(0)));
+       int     RETVAL;
+       dXSTARG;
+#line 2920 "SDL_perl.xs"
+               RETVAL = TTF_FontLineSkip(font);
+#line 5835 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_TTFGlyphMetrics); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_TTFGlyphMetrics)
+{
+    dXSARGS;
+    if (items != 2)
+       Perl_croak(aTHX_ "Usage: SDL::TTFGlyphMetrics(font, ch)");
+    {
+       TTF_Font *      font = INT2PTR(TTF_Font *,SvIV(ST(0)));
+       Uint16  ch = (Uint16)SvUV(ST(1));
+       AV *    RETVAL;
+#line 2929 "SDL_perl.xs"
+               int minx, miny, maxx, maxy, advance;
+               RETVAL = newAV();
+               TTF_GlyphMetrics(font, ch, &minx, &miny, &maxx, &maxy, &advance);
+               av_push(RETVAL,newSViv(minx));
+               av_push(RETVAL,newSViv(miny));
+               av_push(RETVAL,newSViv(maxx));
+               av_push(RETVAL,newSViv(maxy));
+               av_push(RETVAL,newSViv(advance));
+#line 5860 "SDL_perl.c"
+       ST(0) = newRV((SV*)RETVAL);
+       sv_2mortal(ST(0));
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_TTFSizeText); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_TTFSizeText)
+{
+    dXSARGS;
+    if (items != 2)
+       Perl_croak(aTHX_ "Usage: SDL::TTFSizeText(font, text)");
+    {
+       TTF_Font *      font = INT2PTR(TTF_Font *,SvIV(ST(0)));
+       char *  text = (char *)SvPV_nolen(ST(1));
+       AV *    RETVAL;
+#line 2945 "SDL_perl.xs"
+               int w,h;
+               RETVAL = newAV();
+               TTF_SizeText(font,text,&w,&h);
+               av_push(RETVAL,newSViv(w));
+               av_push(RETVAL,newSViv(h));
+#line 5883 "SDL_perl.c"
+       ST(0) = newRV((SV*)RETVAL);
+       sv_2mortal(ST(0));
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_TTFSizeUTF8); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_TTFSizeUTF8)
+{
+    dXSARGS;
+    if (items != 2)
+       Perl_croak(aTHX_ "Usage: SDL::TTFSizeUTF8(font, text)");
+    {
+       TTF_Font *      font = INT2PTR(TTF_Font *,SvIV(ST(0)));
+       char *  text = (char *)SvPV_nolen(ST(1));
+       AV *    RETVAL;
+#line 2958 "SDL_perl.xs"
+               int w,h;
+               RETVAL = newAV();
+               TTF_SizeUTF8(font,text,&w,&h);
+               av_push(RETVAL,newSViv(w));
+               av_push(RETVAL,newSViv(h));
+#line 5906 "SDL_perl.c"
+       ST(0) = newRV((SV*)RETVAL);
+       sv_2mortal(ST(0));
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_TTFSizeUNICODE); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_TTFSizeUNICODE)
+{
+    dXSARGS;
+    if (items != 2)
+       Perl_croak(aTHX_ "Usage: SDL::TTFSizeUNICODE(font, text)");
+    {
+       TTF_Font *      font = INT2PTR(TTF_Font *,SvIV(ST(0)));
+       const Uint16 *  text = INT2PTR(const Uint16 *,SvIV(ST(1)));
+       AV *    RETVAL;
+#line 2971 "SDL_perl.xs"
+               int w,h;
+               RETVAL = newAV();
+               TTF_SizeUNICODE(font,text,&w,&h);
+               av_push(RETVAL,newSViv(w));
+               av_push(RETVAL,newSViv(h));
+#line 5929 "SDL_perl.c"
+       ST(0) = newRV((SV*)RETVAL);
+       sv_2mortal(ST(0));
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_TTFRenderTextSolid); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_TTFRenderTextSolid)
+{
+    dXSARGS;
+    if (items != 3)
+       Perl_croak(aTHX_ "Usage: SDL::TTFRenderTextSolid(font, text, fg)");
+    {
+       TTF_Font *      font = INT2PTR(TTF_Font *,SvIV(ST(0)));
+       char *  text = (char *)SvPV_nolen(ST(1));
+       SDL_Color *     fg = INT2PTR(SDL_Color *,SvIV(ST(2)));
+       SDL_Surface *   RETVAL;
+       dXSTARG;
+#line 2985 "SDL_perl.xs"
+               RETVAL = TTF_RenderText_Solid(font,text,*fg);
+#line 5950 "SDL_perl.c"
+       XSprePUSH; PUSHi(PTR2IV(RETVAL));
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_TTFRenderUTF8Solid); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_TTFRenderUTF8Solid)
+{
+    dXSARGS;
+    if (items != 3)
+       Perl_croak(aTHX_ "Usage: SDL::TTFRenderUTF8Solid(font, text, fg)");
+    {
+       TTF_Font *      font = INT2PTR(TTF_Font *,SvIV(ST(0)));
+       char *  text = (char *)SvPV_nolen(ST(1));
+       SDL_Color *     fg = INT2PTR(SDL_Color *,SvIV(ST(2)));
+       SDL_Surface *   RETVAL;
+       dXSTARG;
+#line 2995 "SDL_perl.xs"
+               RETVAL = TTF_RenderUTF8_Solid(font,text,*fg);
+#line 5970 "SDL_perl.c"
+       XSprePUSH; PUSHi(PTR2IV(RETVAL));
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_TTFRenderUNICODESolid); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_TTFRenderUNICODESolid)
+{
+    dXSARGS;
+    if (items != 3)
+       Perl_croak(aTHX_ "Usage: SDL::TTFRenderUNICODESolid(font, text, fg)");
+    {
+       TTF_Font *      font = INT2PTR(TTF_Font *,SvIV(ST(0)));
+       const Uint16 *  text = INT2PTR(const Uint16 *,SvIV(ST(1)));
+       SDL_Color *     fg = INT2PTR(SDL_Color *,SvIV(ST(2)));
+       SDL_Surface *   RETVAL;
+       dXSTARG;
+#line 3005 "SDL_perl.xs"
+               RETVAL = TTF_RenderUNICODE_Solid(font,text,*fg);
+#line 5990 "SDL_perl.c"
+       XSprePUSH; PUSHi(PTR2IV(RETVAL));
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_TTFRenderGlyphSolid); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_TTFRenderGlyphSolid)
+{
+    dXSARGS;
+    if (items != 3)
+       Perl_croak(aTHX_ "Usage: SDL::TTFRenderGlyphSolid(font, ch, fg)");
+    {
+       TTF_Font *      font = INT2PTR(TTF_Font *,SvIV(ST(0)));
+       Uint16  ch = (Uint16)SvUV(ST(1));
+       SDL_Color *     fg = INT2PTR(SDL_Color *,SvIV(ST(2)));
+       SDL_Surface *   RETVAL;
+       dXSTARG;
+#line 3015 "SDL_perl.xs"
+               RETVAL = TTF_RenderGlyph_Solid(font,ch,*fg);
+#line 6010 "SDL_perl.c"
+       XSprePUSH; PUSHi(PTR2IV(RETVAL));
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_TTFRenderTextShaded); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_TTFRenderTextShaded)
+{
+    dXSARGS;
+    if (items != 4)
+       Perl_croak(aTHX_ "Usage: SDL::TTFRenderTextShaded(font, text, fg, bg)");
+    {
+       TTF_Font *      font = INT2PTR(TTF_Font *,SvIV(ST(0)));
+       char *  text = (char *)SvPV_nolen(ST(1));
+       SDL_Color *     fg = INT2PTR(SDL_Color *,SvIV(ST(2)));
+       SDL_Color *     bg = INT2PTR(SDL_Color *,SvIV(ST(3)));
+       SDL_Surface *   RETVAL;
+       dXSTARG;
+#line 3026 "SDL_perl.xs"
+               RETVAL = TTF_RenderText_Shaded(font,text,*fg,*bg);
+#line 6031 "SDL_perl.c"
+       XSprePUSH; PUSHi(PTR2IV(RETVAL));
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_TTFRenderUTF8Shaded); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_TTFRenderUTF8Shaded)
+{
+    dXSARGS;
+    if (items != 4)
+       Perl_croak(aTHX_ "Usage: SDL::TTFRenderUTF8Shaded(font, text, fg, bg)");
+    {
+       TTF_Font *      font = INT2PTR(TTF_Font *,SvIV(ST(0)));
+       char *  text = (char *)SvPV_nolen(ST(1));
+       SDL_Color *     fg = INT2PTR(SDL_Color *,SvIV(ST(2)));
+       SDL_Color *     bg = INT2PTR(SDL_Color *,SvIV(ST(3)));
+       SDL_Surface *   RETVAL;
+       dXSTARG;
+#line 3037 "SDL_perl.xs"
+               RETVAL = TTF_RenderUTF8_Shaded(font,text,*fg,*bg);
+#line 6052 "SDL_perl.c"
+       XSprePUSH; PUSHi(PTR2IV(RETVAL));
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_TTFRenderUNICODEShaded); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_TTFRenderUNICODEShaded)
+{
+    dXSARGS;
+    if (items != 4)
+       Perl_croak(aTHX_ "Usage: SDL::TTFRenderUNICODEShaded(font, text, fg, bg)");
+    {
+       TTF_Font *      font = INT2PTR(TTF_Font *,SvIV(ST(0)));
+       const Uint16 *  text = INT2PTR(const Uint16 *,SvIV(ST(1)));
+       SDL_Color *     fg = INT2PTR(SDL_Color *,SvIV(ST(2)));
+       SDL_Color *     bg = INT2PTR(SDL_Color *,SvIV(ST(3)));
+       SDL_Surface *   RETVAL;
+       dXSTARG;
+#line 3048 "SDL_perl.xs"
+               RETVAL = TTF_RenderUNICODE_Shaded(font,text,*fg,*bg);
+#line 6073 "SDL_perl.c"
+       XSprePUSH; PUSHi(PTR2IV(RETVAL));
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_TTFRenderGlyphShaded); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_TTFRenderGlyphShaded)
+{
+    dXSARGS;
+    if (items != 4)
+       Perl_croak(aTHX_ "Usage: SDL::TTFRenderGlyphShaded(font, ch, fg, bg)");
+    {
+       TTF_Font *      font = INT2PTR(TTF_Font *,SvIV(ST(0)));
+       Uint16  ch = (Uint16)SvUV(ST(1));
+       SDL_Color *     fg = INT2PTR(SDL_Color *,SvIV(ST(2)));
+       SDL_Color *     bg = INT2PTR(SDL_Color *,SvIV(ST(3)));
+       SDL_Surface *   RETVAL;
+       dXSTARG;
+#line 3059 "SDL_perl.xs"
+               RETVAL = TTF_RenderGlyph_Shaded(font,ch,*fg,*bg);
+#line 6094 "SDL_perl.c"
+       XSprePUSH; PUSHi(PTR2IV(RETVAL));
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_TTFRenderTextBlended); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_TTFRenderTextBlended)
+{
+    dXSARGS;
+    if (items != 3)
+       Perl_croak(aTHX_ "Usage: SDL::TTFRenderTextBlended(font, text, fg)");
+    {
+       TTF_Font *      font = INT2PTR(TTF_Font *,SvIV(ST(0)));
+       char *  text = (char *)SvPV_nolen(ST(1));
+       SDL_Color *     fg = INT2PTR(SDL_Color *,SvIV(ST(2)));
+       SDL_Surface *   RETVAL;
+       dXSTARG;
+#line 3069 "SDL_perl.xs"
+               RETVAL = TTF_RenderText_Blended(font,text,*fg);
+#line 6114 "SDL_perl.c"
+       XSprePUSH; PUSHi(PTR2IV(RETVAL));
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_TTFRenderUTF8Blended); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_TTFRenderUTF8Blended)
+{
+    dXSARGS;
+    if (items != 3)
+       Perl_croak(aTHX_ "Usage: SDL::TTFRenderUTF8Blended(font, text, fg)");
+    {
+       TTF_Font *      font = INT2PTR(TTF_Font *,SvIV(ST(0)));
+       char *  text = (char *)SvPV_nolen(ST(1));
+       SDL_Color *     fg = INT2PTR(SDL_Color *,SvIV(ST(2)));
+       SDL_Surface *   RETVAL;
+       dXSTARG;
+#line 3079 "SDL_perl.xs"
+               RETVAL = TTF_RenderUTF8_Blended(font,text,*fg);
+#line 6134 "SDL_perl.c"
+       XSprePUSH; PUSHi(PTR2IV(RETVAL));
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_TTFRenderUNICODEBlended); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_TTFRenderUNICODEBlended)
+{
+    dXSARGS;
+    if (items != 3)
+       Perl_croak(aTHX_ "Usage: SDL::TTFRenderUNICODEBlended(font, text, fg)");
+    {
+       TTF_Font *      font = INT2PTR(TTF_Font *,SvIV(ST(0)));
+       const Uint16 *  text = INT2PTR(const Uint16 *,SvIV(ST(1)));
+       SDL_Color *     fg = INT2PTR(SDL_Color *,SvIV(ST(2)));
+       SDL_Surface *   RETVAL;
+       dXSTARG;
+#line 3089 "SDL_perl.xs"
+               RETVAL = TTF_RenderUNICODE_Blended(font,text,*fg);
+#line 6154 "SDL_perl.c"
+       XSprePUSH; PUSHi(PTR2IV(RETVAL));
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_TTFRenderGlyphBlended); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_TTFRenderGlyphBlended)
+{
+    dXSARGS;
+    if (items != 3)
+       Perl_croak(aTHX_ "Usage: SDL::TTFRenderGlyphBlended(font, ch, fg)");
+    {
+       TTF_Font *      font = INT2PTR(TTF_Font *,SvIV(ST(0)));
+       Uint16  ch = (Uint16)SvUV(ST(1));
+       SDL_Color *     fg = INT2PTR(SDL_Color *,SvIV(ST(2)));
+       SDL_Surface *   RETVAL;
+       dXSTARG;
+#line 3099 "SDL_perl.xs"
+               RETVAL = TTF_RenderGlyph_Blended(font,ch,*fg);
+#line 6174 "SDL_perl.c"
+       XSprePUSH; PUSHi(PTR2IV(RETVAL));
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_TTFCloseFont); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_TTFCloseFont)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::TTFCloseFont(font)");
+    {
+       TTF_Font *      font = INT2PTR(TTF_Font *,SvIV(ST(0)));
+#line 3107 "SDL_perl.xs"
+               TTF_CloseFont(font);
+#line 6190 "SDL_perl.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL_TTFPutString); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_TTFPutString)
+{
+    dXSARGS;
+    if (items != 8)
+       Perl_croak(aTHX_ "Usage: SDL::TTFPutString(font, mode, surface, x, y, fg, bg, text)");
+    {
+       TTF_Font *      font = INT2PTR(TTF_Font *,SvIV(ST(0)));
+       int     mode = (int)SvIV(ST(1));
+       SDL_Surface *   surface = INT2PTR(SDL_Surface *,SvIV(ST(2)));
+       int     x = (int)SvIV(ST(3));
+       int     y = (int)SvIV(ST(4));
+       SDL_Color *     fg = INT2PTR(SDL_Color *,SvIV(ST(5)));
+       SDL_Color *     bg = INT2PTR(SDL_Color *,SvIV(ST(6)));
+       char *  text = (char *)SvPV_nolen(ST(7));
+       SDL_Surface *   RETVAL;
+       dXSTARG;
+#line 3120 "SDL_perl.xs"
+               SDL_Surface *img;
+               SDL_Rect dest;
+               int w,h;
+               dest.x = x;
+               dest.y = y;
+               RETVAL = NULL;
+               switch (mode) {
+                       case TEXT_SOLID:
+                               img = TTF_RenderText_Solid(font,text,*fg);
+                               TTF_SizeText(font,text,&w,&h);
+                               dest.w = w;
+                               dest.h = h;
+                               break;
+                       case TEXT_SHADED:
+                               img = TTF_RenderText_Shaded(font,text,*fg,*bg);
+                               TTF_SizeText(font,text,&w,&h);
+                               dest.w = w;
+                               dest.h = h;
+                               break;
+                       case TEXT_BLENDED:
+                               img = TTF_RenderText_Blended(font,text,*fg);
+                               TTF_SizeText(font,text,&w,&h);
+                               dest.w = w;
+                               dest.h = h;
+                               break;
+                       case UTF8_SOLID:
+                               img = TTF_RenderUTF8_Solid(font,text,*fg);
+                               TTF_SizeUTF8(font,text,&w,&h);
+                               dest.w = w;
+                               dest.h = h;
+                               break;
+                       case UTF8_SHADED:
+                               img = TTF_RenderUTF8_Shaded(font,text,*fg,*bg);
+                               TTF_SizeUTF8(font,text,&w,&h);
+                               dest.w = w;
+                               dest.h = h;
+                               break;
+                       case UTF8_BLENDED:
+                               img = TTF_RenderUTF8_Blended(font,text,*fg);
+                               TTF_SizeUTF8(font,text,&w,&h);
+                               dest.w = w;
+                               dest.h = h;
+                               break;
+                       case UNICODE_SOLID:
+                               img = TTF_RenderUNICODE_Solid(font,(Uint16*)text,*fg);
+                               TTF_SizeUNICODE(font,(Uint16*)text,&w,&h);
+                               dest.w = w;
+                               dest.h = h;
+                               break;
+                       case UNICODE_SHADED:
+                               img = TTF_RenderUNICODE_Shaded(font,(Uint16*)text,*fg,*bg);
+                               TTF_SizeUNICODE(font,(Uint16*)text,&w,&h);
+                               dest.w = w;
+                               dest.h = h;
+                               break;
+                       case UNICODE_BLENDED:
+                               img = TTF_RenderUNICODE_Blended(font,(Uint16*)text,*fg);
+                               TTF_SizeUNICODE(font,(Uint16*)text,&w,&h);
+                               dest.w = w;
+                               dest.h = h;
+                               break;
+                       default:
+                               img = TTF_RenderText_Shaded(font,text,*fg,*bg);
+                               TTF_SizeText(font,text,&w,&h);
+                               dest.w = w;
+                               dest.h = h;
+               }
+               if ( img && img->format && img->format->palette ) {
+                       SDL_Color *c = &img->format->palette->colors[0];
+                       Uint32 key = SDL_MapRGB( img->format, c->r, c->g, c->b );
+                       SDL_SetColorKey(img,SDL_SRCCOLORKEY,key );
+                       if (0 > SDL_BlitSurface(img,NULL,surface,&dest)) {
+                               SDL_FreeSurface(img);
+                               RETVAL = NULL;  
+                       } else {
+                               RETVAL = img;
+                       }
+               }
+#line 6291 "SDL_perl.c"
+       XSprePUSH; PUSHi(PTR2IV(RETVAL));
+    }
+    XSRETURN(1);
+}
+
+#endif
+XS(XS_SDL_CreateYUVOverlay); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_CreateYUVOverlay)
+{
+    dXSARGS;
+    if (items != 4)
+       Perl_croak(aTHX_ "Usage: SDL::CreateYUVOverlay(width, height, format, display)");
+    {
+       int     width = (int)SvIV(ST(0));
+       int     height = (int)SvIV(ST(1));
+       Uint32  format = (Uint32)SvUV(ST(2));
+       SDL_Surface *   display = INT2PTR(SDL_Surface *,SvIV(ST(3)));
+       SDL_Overlay *   RETVAL;
+       dXSTARG;
+#line 3210 "SDL_perl.xs"
+               RETVAL = SDL_CreateYUVOverlay ( width, height, format, display );
+#line 6313 "SDL_perl.c"
+       XSprePUSH; PUSHi(PTR2IV(RETVAL));
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_LockYUVOverlay); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_LockYUVOverlay)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::LockYUVOverlay(overlay)");
+    {
+       SDL_Overlay *   overlay = INT2PTR(SDL_Overlay *,SvIV(ST(0)));
+       int     RETVAL;
+       dXSTARG;
+#line 3218 "SDL_perl.xs"
+               RETVAL = SDL_LockYUVOverlay(overlay);
+#line 6331 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_UnlockYUVOverlay); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_UnlockYUVOverlay)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::UnlockYUVOverlay(overlay)");
+    {
+       SDL_Overlay *   overlay = INT2PTR(SDL_Overlay *,SvIV(ST(0)));
+#line 3226 "SDL_perl.xs"
+                SDL_UnlockYUVOverlay(overlay);
+#line 6347 "SDL_perl.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL_DisplayYUVOverlay); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_DisplayYUVOverlay)
+{
+    dXSARGS;
+    if (items != 2)
+       Perl_croak(aTHX_ "Usage: SDL::DisplayYUVOverlay(overlay, dstrect)");
+    {
+       SDL_Overlay *   overlay = INT2PTR(SDL_Overlay *,SvIV(ST(0)));
+       SDL_Rect *      dstrect = INT2PTR(SDL_Rect *,SvIV(ST(1)));
+       int     RETVAL;
+       dXSTARG;
+#line 3233 "SDL_perl.xs"
+               RETVAL = SDL_DisplayYUVOverlay ( overlay, dstrect );
+#line 6365 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_FreeYUVOverlay); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_FreeYUVOverlay)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::FreeYUVOverlay(overlay)");
+    {
+       SDL_Overlay *   overlay = INT2PTR(SDL_Overlay *,SvIV(ST(0)));
+#line 3241 "SDL_perl.xs"
+                SDL_FreeYUVOverlay ( overlay );
+#line 6381 "SDL_perl.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL_OverlayFormat); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_OverlayFormat)
+{
+    dXSARGS;
+    if (items < 1)
+       Perl_croak(aTHX_ "Usage: SDL::OverlayFormat(overlay, ...)");
+    {
+       SDL_Overlay *   overlay = INT2PTR(SDL_Overlay *,SvIV(ST(0)));
+       Uint32  RETVAL;
+       dXSTARG;
+#line 3247 "SDL_perl.xs"
+               if ( items > 1 ) 
+                       overlay->format = SvIV(ST(1));
+               RETVAL = overlay->format;
+#line 6400 "SDL_perl.c"
+       XSprePUSH; PUSHu((UV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_OverlayW); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_OverlayW)
+{
+    dXSARGS;
+    if (items < 1)
+       Perl_croak(aTHX_ "Usage: SDL::OverlayW(overlay, ...)");
+    {
+       SDL_Overlay *   overlay = INT2PTR(SDL_Overlay *,SvIV(ST(0)));
+       int     RETVAL;
+       dXSTARG;
+#line 3257 "SDL_perl.xs"
+               if ( items > 1 ) 
+                       overlay->w = SvIV(ST(1));
+               RETVAL = overlay->w;
+#line 6420 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_OverlayH); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_OverlayH)
+{
+    dXSARGS;
+    if (items < 1)
+       Perl_croak(aTHX_ "Usage: SDL::OverlayH(overlay, ...)");
+    {
+       SDL_Overlay *   overlay = INT2PTR(SDL_Overlay *,SvIV(ST(0)));
+       int     RETVAL;
+       dXSTARG;
+#line 3267 "SDL_perl.xs"
+               if ( items > 1 )
+                       overlay->h = SvIV(ST(1));
+               RETVAL = overlay->h;
+#line 6440 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_OverlayPlanes); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_OverlayPlanes)
+{
+    dXSARGS;
+    if (items < 1)
+       Perl_croak(aTHX_ "Usage: SDL::OverlayPlanes(overlay, ...)");
+    {
+       SDL_Overlay *   overlay = INT2PTR(SDL_Overlay *,SvIV(ST(0)));
+       int     RETVAL;
+       dXSTARG;
+#line 3277 "SDL_perl.xs"
+                if ( items > 1 )
+                        overlay->planes = SvIV(ST(1));
+                RETVAL = overlay->planes;
+#line 6460 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_OverlayHW); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_OverlayHW)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::OverlayHW(overlay)");
+    {
+       SDL_Overlay *   overlay = INT2PTR(SDL_Overlay *,SvIV(ST(0)));
+       Uint32  RETVAL;
+       dXSTARG;
+#line 3287 "SDL_perl.xs"
+               RETVAL = overlay->hw_overlay;
+#line 6478 "SDL_perl.c"
+       XSprePUSH; PUSHu((UV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_OverlayPitches); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_OverlayPitches)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::OverlayPitches(overlay)");
+    {
+       SDL_Overlay *   overlay = INT2PTR(SDL_Overlay *,SvIV(ST(0)));
+       Uint16 *        RETVAL;
+       dXSTARG;
+#line 3295 "SDL_perl.xs"
+               RETVAL = overlay->pitches;
+#line 6496 "SDL_perl.c"
+       XSprePUSH; PUSHi(PTR2IV(RETVAL));
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_OverlayPixels); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_OverlayPixels)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::OverlayPixels(overlay)");
+    {
+       SDL_Overlay *   overlay = INT2PTR(SDL_Overlay *,SvIV(ST(0)));
+       Uint8 **        RETVAL;
+       dXSTARG;
+#line 3303 "SDL_perl.xs"
+               RETVAL = overlay->pixels;
+#line 6514 "SDL_perl.c"
+       XSprePUSH; PUSHi(PTR2IV(RETVAL));
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_WMToggleFullScreen); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_WMToggleFullScreen)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::WMToggleFullScreen(surface)");
+    {
+       SDL_Surface *   surface = INT2PTR(SDL_Surface *,SvIV(ST(0)));
+       int     RETVAL;
+       dXSTARG;
+#line 3311 "SDL_perl.xs"
+               RETVAL = SDL_WM_ToggleFullScreen(surface);
+#line 6532 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_WMGrabInput); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_WMGrabInput)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::WMGrabInput(mode)");
+    {
+       Uint32  mode = (Uint32)SvUV(ST(0));
+       Uint32  RETVAL;
+       dXSTARG;
+#line 3319 "SDL_perl.xs"
+               RETVAL = SDL_WM_GrabInput(mode);
+#line 6550 "SDL_perl.c"
+       XSprePUSH; PUSHu((UV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_WMIconifyWindow); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_WMIconifyWindow)
+{
+    dXSARGS;
+    if (items != 0)
+       Perl_croak(aTHX_ "Usage: SDL::WMIconifyWindow()");
+    {
+       int     RETVAL;
+       dXSTARG;
+#line 3326 "SDL_perl.xs"
+               RETVAL = SDL_WM_IconifyWindow();
+#line 6567 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_ResizeEventW); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_ResizeEventW)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::ResizeEventW(e)");
+    {
+       SDL_Event *     e = INT2PTR(SDL_Event *,SvIV(ST(0)));
+       int     RETVAL;
+       dXSTARG;
+#line 3334 "SDL_perl.xs"
+               RETVAL = e->resize.w;
+#line 6585 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_ResizeEventH); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_ResizeEventH)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::ResizeEventH(e)");
+    {
+       SDL_Event *     e = INT2PTR(SDL_Event *,SvIV(ST(0)));
+       int     RETVAL;
+       dXSTARG;
+#line 3342 "SDL_perl.xs"
+               RETVAL = e->resize.h;
+#line 6603 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_AudioDriverName); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_AudioDriverName)
+{
+    dXSARGS;
+    if (items != 0)
+       Perl_croak(aTHX_ "Usage: SDL::AudioDriverName()");
+    {
+       char *  RETVAL;
+       dXSTARG;
+#line 3349 "SDL_perl.xs"
+               char name[32];
+               RETVAL = SDL_AudioDriverName(name,32);
+#line 6621 "SDL_perl.c"
+       sv_setpv(TARG, RETVAL); XSprePUSH; PUSHTARG;
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_GetKeyState); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_GetKeyState)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::GetKeyState(k)");
+    {
+       SDLKey  k = (SDLKey)SvUV(ST(0));
+       Uint32  RETVAL;
+       dXSTARG;
+#line 3358 "SDL_perl.xs"
+               if (k >= SDLK_LAST) Perl_croak (aTHX_ "Key out of range");      
+               RETVAL = SDL_GetKeyState(NULL)[k];
+#line 6640 "SDL_perl.c"
+       XSprePUSH; PUSHu((UV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+#ifdef HAVE_SMPEG
+#define XSubPPtmpAAAE 1
+
+XS(XS_SDL_NewSMPEGInfo); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_NewSMPEGInfo)
+{
+    dXSARGS;
+    if (items != 0)
+       Perl_croak(aTHX_ "Usage: SDL::NewSMPEGInfo()");
+    {
+       SMPEG_Info *    RETVAL;
+       dXSTARG;
+#line 3368 "SDL_perl.xs"
+               RETVAL = (SMPEG_Info *) safemalloc (sizeof(SMPEG_Info));
+#line 6660 "SDL_perl.c"
+       XSprePUSH; PUSHi(PTR2IV(RETVAL));
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_FreeSMPEGInfo); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_FreeSMPEGInfo)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::FreeSMPEGInfo(info)");
+    {
+       SMPEG_Info *    info = INT2PTR(SMPEG_Info *,SvIV(ST(0)));
+#line 3376 "SDL_perl.xs"
+               safefree(info);
+#line 6676 "SDL_perl.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL_SMPEGInfoHasAudio); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_SMPEGInfoHasAudio)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::SMPEGInfoHasAudio(info)");
+    {
+       SMPEG_Info*     info = INT2PTR(SMPEG_Info *,SvIV(ST(0)));
+       int     RETVAL;
+       dXSTARG;
+#line 3382 "SDL_perl.xs"
+               RETVAL = info->has_audio;
+#line 6693 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_SMPEGInfoHasVideo); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_SMPEGInfoHasVideo)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::SMPEGInfoHasVideo(info)");
+    {
+       SMPEG_Info*     info = INT2PTR(SMPEG_Info *,SvIV(ST(0)));
+       int     RETVAL;
+       dXSTARG;
+#line 3390 "SDL_perl.xs"
+               RETVAL = info->has_video;
+#line 6711 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_SMPEGInfoWidth); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_SMPEGInfoWidth)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::SMPEGInfoWidth(info)");
+    {
+       SMPEG_Info*     info = INT2PTR(SMPEG_Info *,SvIV(ST(0)));
+       int     RETVAL;
+       dXSTARG;
+#line 3398 "SDL_perl.xs"
+               RETVAL = info->width;
+#line 6729 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_SMPEGInfoHeight); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_SMPEGInfoHeight)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::SMPEGInfoHeight(info)");
+    {
+       SMPEG_Info*     info = INT2PTR(SMPEG_Info *,SvIV(ST(0)));
+       int     RETVAL;
+       dXSTARG;
+#line 3406 "SDL_perl.xs"
+               RETVAL = info->height;
+#line 6747 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_SMPEGInfoCurrentFrame); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_SMPEGInfoCurrentFrame)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::SMPEGInfoCurrentFrame(info)");
+    {
+       SMPEG_Info*     info = INT2PTR(SMPEG_Info *,SvIV(ST(0)));
+       int     RETVAL;
+       dXSTARG;
+#line 3414 "SDL_perl.xs"
+               RETVAL = info->current_frame;
+#line 6765 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_SMPEGInfoCurrentFPS); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_SMPEGInfoCurrentFPS)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::SMPEGInfoCurrentFPS(info)");
+    {
+       SMPEG_Info*     info = INT2PTR(SMPEG_Info *,SvIV(ST(0)));
+       double  RETVAL;
+       dXSTARG;
+#line 3422 "SDL_perl.xs"
+               RETVAL = info->current_fps;
+#line 6783 "SDL_perl.c"
+       XSprePUSH; PUSHn((double)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_SMPEGInfoCurrentAudioFrame); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_SMPEGInfoCurrentAudioFrame)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::SMPEGInfoCurrentAudioFrame(info)");
+    {
+       SMPEG_Info*     info = INT2PTR(SMPEG_Info *,SvIV(ST(0)));
+       int     RETVAL;
+       dXSTARG;
+#line 3430 "SDL_perl.xs"
+               RETVAL = info->audio_current_frame;
+#line 6801 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_SMPEGInfoCurrentOffset); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_SMPEGInfoCurrentOffset)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::SMPEGInfoCurrentOffset(info)");
+    {
+       SMPEG_Info*     info = INT2PTR(SMPEG_Info *,SvIV(ST(0)));
+       int     RETVAL;
+       dXSTARG;
+#line 3438 "SDL_perl.xs"
+               RETVAL = info->current_offset;
+#line 6819 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_SMPEGInfoTotalSize); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_SMPEGInfoTotalSize)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::SMPEGInfoTotalSize(info)");
+    {
+       SMPEG_Info*     info = INT2PTR(SMPEG_Info *,SvIV(ST(0)));
+       int     RETVAL;
+       dXSTARG;
+#line 3446 "SDL_perl.xs"
+               RETVAL = info->total_size;
+#line 6837 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_SMPEGInfoCurrentTime); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_SMPEGInfoCurrentTime)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::SMPEGInfoCurrentTime(info)");
+    {
+       SMPEG_Info*     info = INT2PTR(SMPEG_Info *,SvIV(ST(0)));
+       double  RETVAL;
+       dXSTARG;
+#line 3454 "SDL_perl.xs"
+               RETVAL = info->current_time;
+#line 6855 "SDL_perl.c"
+       XSprePUSH; PUSHn((double)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_SMPEGInfoTotalTime); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_SMPEGInfoTotalTime)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::SMPEGInfoTotalTime(info)");
+    {
+       SMPEG_Info*     info = INT2PTR(SMPEG_Info *,SvIV(ST(0)));
+       double  RETVAL;
+       dXSTARG;
+#line 3462 "SDL_perl.xs"
+               RETVAL = info->total_time;
+#line 6873 "SDL_perl.c"
+       XSprePUSH; PUSHn((double)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_SMPEGError); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_SMPEGError)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::SMPEGError(mpeg)");
+    {
+       SMPEG*  mpeg = INT2PTR(SMPEG *,SvIV(ST(0)));
+       char *  RETVAL;
+       dXSTARG;
+#line 3470 "SDL_perl.xs"
+               RETVAL = SMPEG_error(mpeg);
+#line 6891 "SDL_perl.c"
+       sv_setpv(TARG, RETVAL); XSprePUSH; PUSHTARG;
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_NewSMPEG); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_NewSMPEG)
+{
+    dXSARGS;
+    if (items != 3)
+       Perl_croak(aTHX_ "Usage: SDL::NewSMPEG(filename, info, use_audio)");
+    {
+       char*   filename = (char *)SvPV_nolen(ST(0));
+       SMPEG_Info*     info = INT2PTR(SMPEG_Info *,SvIV(ST(1)));
+       int     use_audio = (int)SvIV(ST(2));
+       SMPEG * RETVAL;
+       dXSTARG;
+#line 3480 "SDL_perl.xs"
+#ifdef HAVE_SDL_MIXER
+               RETVAL = SMPEG_new(filename,info,0);
+#else
+               RETVAL = SMPEG_new(filename,info,use_audio);
+#endif
+#line 6915 "SDL_perl.c"
+       XSprePUSH; PUSHi(PTR2IV(RETVAL));
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_FreeSMPEG); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_FreeSMPEG)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::FreeSMPEG(mpeg)");
+    {
+       SMPEG*  mpeg = INT2PTR(SMPEG *,SvIV(ST(0)));
+#line 3492 "SDL_perl.xs"
+               SMPEG_delete(mpeg);
+#line 6931 "SDL_perl.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL_SMPEGEnableAudio); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_SMPEGEnableAudio)
+{
+    dXSARGS;
+    if (items != 2)
+       Perl_croak(aTHX_ "Usage: SDL::SMPEGEnableAudio(mpeg, flag)");
+    {
+       SMPEG*  mpeg = INT2PTR(SMPEG *,SvIV(ST(0)));
+       int     flag = (int)SvIV(ST(1));
+#line 3499 "SDL_perl.xs"
+               SMPEG_enableaudio(mpeg,flag);
+#ifdef HAVE_SDL_MIXER
+               sdl_perl_use_smpeg_audio = flag;
+#endif
+#line 6950 "SDL_perl.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL_SMPEGEnableVideo); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_SMPEGEnableVideo)
+{
+    dXSARGS;
+    if (items != 2)
+       Perl_croak(aTHX_ "Usage: SDL::SMPEGEnableVideo(mpeg, flag)");
+    {
+       SMPEG*  mpeg = INT2PTR(SMPEG *,SvIV(ST(0)));
+       int     flag = (int)SvIV(ST(1));
+#line 3509 "SDL_perl.xs"
+               SMPEG_enablevideo(mpeg,flag);
+#line 6966 "SDL_perl.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL_SMPEGSetVolume); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_SMPEGSetVolume)
+{
+    dXSARGS;
+    if (items != 2)
+       Perl_croak(aTHX_ "Usage: SDL::SMPEGSetVolume(mpeg, volume)");
+    {
+       SMPEG*  mpeg = INT2PTR(SMPEG *,SvIV(ST(0)));
+       int     volume = (int)SvIV(ST(1));
+#line 3516 "SDL_perl.xs"
+               SMPEG_setvolume(mpeg,volume);
+#line 6982 "SDL_perl.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL_SMPEGSetDisplay); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_SMPEGSetDisplay)
+{
+    dXSARGS;
+    if (items != 3)
+       Perl_croak(aTHX_ "Usage: SDL::SMPEGSetDisplay(mpeg, dest, surfLock)");
+    {
+       SMPEG*  mpeg = INT2PTR(SMPEG *,SvIV(ST(0)));
+       SDL_Surface*    dest = INT2PTR(SDL_Surface *,SvIV(ST(1)));
+       SDL_mutex*      surfLock = INT2PTR(SDL_mutex *,SvIV(ST(2)));
+#line 3524 "SDL_perl.xs"
+               SMPEG_setdisplay(mpeg,dest,surfLock,NULL);
+#line 6999 "SDL_perl.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL_SMPEGScaleXY); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_SMPEGScaleXY)
+{
+    dXSARGS;
+    if (items != 3)
+       Perl_croak(aTHX_ "Usage: SDL::SMPEGScaleXY(mpeg, w, h)");
+    {
+       SMPEG*  mpeg = INT2PTR(SMPEG *,SvIV(ST(0)));
+       int     w = (int)SvIV(ST(1));
+       int     h = (int)SvIV(ST(2));
+#line 3532 "SDL_perl.xs"
+               SMPEG_scaleXY(mpeg,w,h);
+#line 7016 "SDL_perl.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL_SMPEGScale); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_SMPEGScale)
+{
+    dXSARGS;
+    if (items != 2)
+       Perl_croak(aTHX_ "Usage: SDL::SMPEGScale(mpeg, scale)");
+    {
+       SMPEG*  mpeg = INT2PTR(SMPEG *,SvIV(ST(0)));
+       int     scale = (int)SvIV(ST(1));
+#line 3539 "SDL_perl.xs"
+               SMPEG_scale(mpeg,scale);
+#line 7032 "SDL_perl.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL_SMPEGPlay); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_SMPEGPlay)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::SMPEGPlay(mpeg)");
+    {
+       SMPEG*  mpeg = INT2PTR(SMPEG *,SvIV(ST(0)));
+#line 3545 "SDL_perl.xs"
+                SDL_AudioSpec audiofmt;
+                Uint16 format;
+                int freq, channels;
+#ifdef HAVE_SDL_MIXER
+               if  (sdl_perl_use_smpeg_audio ) {
+                               SMPEG_enableaudio(mpeg, 0);
+                       Mix_QuerySpec(&freq, &format, &channels);
+                       audiofmt.format = format;
+                       audiofmt.freq = freq;
+                       audiofmt.channels = channels;
+                       SMPEG_actualSpec(mpeg, &audiofmt);
+                       Mix_HookMusic(SMPEG_playAudioSDL, mpeg);
+                       SMPEG_enableaudio(mpeg, 1);
+               }
+#endif
+               SMPEG_play(mpeg);
+#line 7062 "SDL_perl.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL_SMPEGStatus); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_SMPEGStatus)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::SMPEGStatus(mpeg)");
+    {
+       SMPEG*  mpeg = INT2PTR(SMPEG *,SvIV(ST(0)));
+       SMPEGstatus     RETVAL;
+       dXSTARG;
+#line 3566 "SDL_perl.xs"
+               RETVAL = SMPEG_status(mpeg);
+#line 7079 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_SMPEGPause); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_SMPEGPause)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::SMPEGPause(mpeg)");
+    {
+       SMPEG*  mpeg = INT2PTR(SMPEG *,SvIV(ST(0)));
+#line 3574 "SDL_perl.xs"
+               SMPEG_pause(mpeg);
+#line 7095 "SDL_perl.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL_SMPEGLoop); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_SMPEGLoop)
+{
+    dXSARGS;
+    if (items != 2)
+       Perl_croak(aTHX_ "Usage: SDL::SMPEGLoop(mpeg, repeat)");
+    {
+       SMPEG*  mpeg = INT2PTR(SMPEG *,SvIV(ST(0)));
+       int     repeat = (int)SvIV(ST(1));
+#line 3581 "SDL_perl.xs"
+               SMPEG_loop(mpeg,repeat);
+#line 7111 "SDL_perl.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL_SMPEGStop); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_SMPEGStop)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::SMPEGStop(mpeg)");
+    {
+       SMPEG*  mpeg = INT2PTR(SMPEG *,SvIV(ST(0)));
+#line 3587 "SDL_perl.xs"
+               SMPEG_stop(mpeg);
+#ifdef HAVE_SDL_MIXER
+               Mix_HookMusic(NULL, NULL);
+#endif
+#line 7129 "SDL_perl.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL_SMPEGRewind); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_SMPEGRewind)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::SMPEGRewind(mpeg)");
+    {
+       SMPEG*  mpeg = INT2PTR(SMPEG *,SvIV(ST(0)));
+#line 3596 "SDL_perl.xs"
+               SMPEG_rewind(mpeg);
+#line 7144 "SDL_perl.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL_SMPEGSeek); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_SMPEGSeek)
+{
+    dXSARGS;
+    if (items != 2)
+       Perl_croak(aTHX_ "Usage: SDL::SMPEGSeek(mpeg, bytes)");
+    {
+       SMPEG*  mpeg = INT2PTR(SMPEG *,SvIV(ST(0)));
+       int     bytes = (int)SvIV(ST(1));
+#line 3603 "SDL_perl.xs"
+               SMPEG_seek(mpeg,bytes);
+#line 7160 "SDL_perl.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL_SMPEGSkip); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_SMPEGSkip)
+{
+    dXSARGS;
+    if (items != 2)
+       Perl_croak(aTHX_ "Usage: SDL::SMPEGSkip(mpeg, seconds)");
+    {
+       SMPEG*  mpeg = INT2PTR(SMPEG *,SvIV(ST(0)));
+       float   seconds = (float)SvNV(ST(1));
+#line 3610 "SDL_perl.xs"
+               SMPEG_skip(mpeg,seconds);
+#line 7176 "SDL_perl.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL_SMPEGSetDisplayRegion); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_SMPEGSetDisplayRegion)
+{
+    dXSARGS;
+    if (items != 2)
+       Perl_croak(aTHX_ "Usage: SDL::SMPEGSetDisplayRegion(mpeg, rect)");
+    {
+       SMPEG*  mpeg = INT2PTR(SMPEG *,SvIV(ST(0)));
+       SDL_Rect*       rect = INT2PTR(SDL_Rect *,SvIV(ST(1)));
+#line 3617 "SDL_perl.xs"
+               SMPEG_setdisplayregion(mpeg,rect->x,rect->y,rect->w,rect->h);
+#line 7192 "SDL_perl.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL_SMPEGRenderFrame); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_SMPEGRenderFrame)
+{
+    dXSARGS;
+    if (items != 2)
+       Perl_croak(aTHX_ "Usage: SDL::SMPEGRenderFrame(mpeg, frame)");
+    {
+       SMPEG*  mpeg = INT2PTR(SMPEG *,SvIV(ST(0)));
+       int     frame = (int)SvIV(ST(1));
+#line 3624 "SDL_perl.xs"
+               SMPEG_renderFrame(mpeg,frame);
+#line 7208 "SDL_perl.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL_SMPEGGetInfo); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_SMPEGGetInfo)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::SMPEGGetInfo(mpeg)");
+    {
+       SMPEG*  mpeg = INT2PTR(SMPEG *,SvIV(ST(0)));
+       SMPEG_Info *    RETVAL;
+       dXSTARG;
+#line 3630 "SDL_perl.xs"
+               RETVAL = (SMPEG_Info *) safemalloc (sizeof(SMPEG_Info));
+               SMPEG_getinfo(mpeg,RETVAL);
+#line 7226 "SDL_perl.c"
+       XSprePUSH; PUSHi(PTR2IV(RETVAL));
+    }
+    XSRETURN(1);
+}
+
+#endif
+#ifdef HAVE_SDL_GFX
+#define XSubPPtmpAAAF 1
+
+XS(XS_SDL_GFXRotoZoom); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_GFXRotoZoom)
+{
+    dXSARGS;
+    if (items != 4)
+       Perl_croak(aTHX_ "Usage: SDL::GFXRotoZoom(src, angle, zoom, smooth)");
+    {
+       SDL_Surface *   src = INT2PTR(SDL_Surface *,SvIV(ST(0)));
+       double  angle = (double)SvNV(ST(1));
+       double  zoom = (double)SvNV(ST(2));
+       int     smooth = (int)SvIV(ST(3));
+       SDL_Surface *   RETVAL;
+       dXSTARG;
+#line 3647 "SDL_perl.xs"
+               RETVAL = rotozoomSurface( src, angle, zoom, smooth);
+#line 7251 "SDL_perl.c"
+       XSprePUSH; PUSHi(PTR2IV(RETVAL));
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_GFXZoom); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_GFXZoom)
+{
+    dXSARGS;
+    if (items != 4)
+       Perl_croak(aTHX_ "Usage: SDL::GFXZoom(src, zoomx, zoomy, smooth)");
+    {
+       SDL_Surface *   src = INT2PTR(SDL_Surface *,SvIV(ST(0)));
+       double  zoomx = (double)SvNV(ST(1));
+       double  zoomy = (double)SvNV(ST(2));
+       int     smooth = (int)SvIV(ST(3));
+       SDL_Surface *   RETVAL;
+       dXSTARG;
+#line 3658 "SDL_perl.xs"
+               RETVAL = zoomSurface( src, zoomx, zoomy, smooth);
+#line 7272 "SDL_perl.c"
+       XSprePUSH; PUSHi(PTR2IV(RETVAL));
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_GFXPixelColor); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_GFXPixelColor)
+{
+    dXSARGS;
+    if (items != 4)
+       Perl_croak(aTHX_ "Usage: SDL::GFXPixelColor(dst, x, y, color)");
+    {
+       SDL_Surface*    dst = INT2PTR(SDL_Surface *,SvIV(ST(0)));
+       Sint16  x = (Sint16)SvIV(ST(1));
+       Sint16  y = (Sint16)SvIV(ST(2));
+       Uint32  color = (Uint32)SvUV(ST(3));
+       int     RETVAL;
+       dXSTARG;
+#line 3669 "SDL_perl.xs"
+               RETVAL = pixelColor( dst, x, y, color);
+#line 7293 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_GFXPixelRGBA); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_GFXPixelRGBA)
+{
+    dXSARGS;
+    if (items != 7)
+       Perl_croak(aTHX_ "Usage: SDL::GFXPixelRGBA(dst, x, y, r, g, b, a)");
+    {
+       SDL_Surface*    dst = INT2PTR(SDL_Surface *,SvIV(ST(0)));
+       Sint16  x = (Sint16)SvIV(ST(1));
+       Sint16  y = (Sint16)SvIV(ST(2));
+       Uint8   r = (unsigned char)SvUV(ST(3));
+       Uint8   g = (unsigned char)SvUV(ST(4));
+       Uint8   b = (unsigned char)SvUV(ST(5));
+       Uint8   a = (unsigned char)SvUV(ST(6));
+       int     RETVAL;
+       dXSTARG;
+#line 3683 "SDL_perl.xs"
+               RETVAL = pixelRGBA( dst, x, y, r, g, b, a );
+#line 7317 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_GFXHlineColor); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_GFXHlineColor)
+{
+    dXSARGS;
+    if (items != 5)
+       Perl_croak(aTHX_ "Usage: SDL::GFXHlineColor(dst, x1, x2, y, color)");
+    {
+       SDL_Surface*    dst = INT2PTR(SDL_Surface *,SvIV(ST(0)));
+       Sint16  x1 = (Sint16)SvIV(ST(1));
+       Sint16  x2 = (Sint16)SvIV(ST(2));
+       Sint16  y = (Sint16)SvIV(ST(3));
+       Uint32  color = (Uint32)SvUV(ST(4));
+       int     RETVAL;
+       dXSTARG;
+#line 3695 "SDL_perl.xs"
+               RETVAL = hlineColor( dst, x1, x2, y, color );
+#line 7339 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_GFXHlineRGBA); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_GFXHlineRGBA)
+{
+    dXSARGS;
+    if (items != 8)
+       Perl_croak(aTHX_ "Usage: SDL::GFXHlineRGBA(dst, x1, x2, y, r, g, b, a)");
+    {
+       SDL_Surface*    dst = INT2PTR(SDL_Surface *,SvIV(ST(0)));
+       Sint16  x1 = (Sint16)SvIV(ST(1));
+       Sint16  x2 = (Sint16)SvIV(ST(2));
+       Sint16  y = (Sint16)SvIV(ST(3));
+       Uint8   r = (unsigned char)SvUV(ST(4));
+       Uint8   g = (unsigned char)SvUV(ST(5));
+       Uint8   b = (unsigned char)SvUV(ST(6));
+       Uint8   a = (unsigned char)SvUV(ST(7));
+       int     RETVAL;
+       dXSTARG;
+#line 3710 "SDL_perl.xs"
+               RETVAL = hlineRGBA( dst, x1, x2, y, r, g, b, a );
+#line 7364 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_GFXVlineColor); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_GFXVlineColor)
+{
+    dXSARGS;
+    if (items != 5)
+       Perl_croak(aTHX_ "Usage: SDL::GFXVlineColor(dst, x, y1, y2, color)");
+    {
+       SDL_Surface*    dst = INT2PTR(SDL_Surface *,SvIV(ST(0)));
+       Sint16  x = (Sint16)SvIV(ST(1));
+       Sint16  y1 = (Sint16)SvIV(ST(2));
+       Sint16  y2 = (Sint16)SvIV(ST(3));
+       Uint32  color = (Uint32)SvUV(ST(4));
+       int     RETVAL;
+       dXSTARG;
+#line 3722 "SDL_perl.xs"
+               RETVAL = vlineColor( dst, x, y1, y2, color );
+#line 7386 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_GFXVlineRGBA); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_GFXVlineRGBA)
+{
+    dXSARGS;
+    if (items != 8)
+       Perl_croak(aTHX_ "Usage: SDL::GFXVlineRGBA(dst, x, y1, y2, r, g, b, a)");
+    {
+       SDL_Surface*    dst = INT2PTR(SDL_Surface *,SvIV(ST(0)));
+       Sint16  x = (Sint16)SvIV(ST(1));
+       Sint16  y1 = (Sint16)SvIV(ST(2));
+       Sint16  y2 = (Sint16)SvIV(ST(3));
+       Uint8   r = (unsigned char)SvUV(ST(4));
+       Uint8   g = (unsigned char)SvUV(ST(5));
+       Uint8   b = (unsigned char)SvUV(ST(6));
+       Uint8   a = (unsigned char)SvUV(ST(7));
+       int     RETVAL;
+       dXSTARG;
+#line 3737 "SDL_perl.xs"
+               RETVAL = vlineRGBA( dst, x, y1, y2, r, g, b, a );
+#line 7411 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_GFXRectangleColor); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_GFXRectangleColor)
+{
+    dXSARGS;
+    if (items != 6)
+       Perl_croak(aTHX_ "Usage: SDL::GFXRectangleColor(dst, x1, y1, x2, y2, color)");
+    {
+       SDL_Surface*    dst = INT2PTR(SDL_Surface *,SvIV(ST(0)));
+       Sint16  x1 = (Sint16)SvIV(ST(1));
+       Sint16  y1 = (Sint16)SvIV(ST(2));
+       Sint16  x2 = (Sint16)SvIV(ST(3));
+       Sint16  y2 = (Sint16)SvIV(ST(4));
+       Uint32  color = (Uint32)SvUV(ST(5));
+       int     RETVAL;
+       dXSTARG;
+#line 3750 "SDL_perl.xs"
+               RETVAL = rectangleColor( dst, x1, y1, x2, y2, color );
+#line 7434 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_GFXRectangleRGBA); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_GFXRectangleRGBA)
+{
+    dXSARGS;
+    if (items != 9)
+       Perl_croak(aTHX_ "Usage: SDL::GFXRectangleRGBA(dst, x1, y1, x2, y2, r, g, b, a)");
+    {
+       SDL_Surface*    dst = INT2PTR(SDL_Surface *,SvIV(ST(0)));
+       Sint16  x1 = (Sint16)SvIV(ST(1));
+       Sint16  y1 = (Sint16)SvIV(ST(2));
+       Sint16  x2 = (Sint16)SvIV(ST(3));
+       Sint16  y2 = (Sint16)SvIV(ST(4));
+       Uint8   r = (unsigned char)SvUV(ST(5));
+       Uint8   g = (unsigned char)SvUV(ST(6));
+       Uint8   b = (unsigned char)SvUV(ST(7));
+       Uint8   a = (unsigned char)SvUV(ST(8));
+       int     RETVAL;
+       dXSTARG;
+#line 3766 "SDL_perl.xs"
+               RETVAL = rectangleRGBA( dst, x1, y1, x2, y2, r, g, b, a );
+#line 7460 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_GFXBoxColor); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_GFXBoxColor)
+{
+    dXSARGS;
+    if (items != 6)
+       Perl_croak(aTHX_ "Usage: SDL::GFXBoxColor(dst, x1, y1, x2, y2, color)");
+    {
+       SDL_Surface*    dst = INT2PTR(SDL_Surface *,SvIV(ST(0)));
+       Sint16  x1 = (Sint16)SvIV(ST(1));
+       Sint16  y1 = (Sint16)SvIV(ST(2));
+       Sint16  x2 = (Sint16)SvIV(ST(3));
+       Sint16  y2 = (Sint16)SvIV(ST(4));
+       Uint32  color = (Uint32)SvUV(ST(5));
+       int     RETVAL;
+       dXSTARG;
+#line 3779 "SDL_perl.xs"
+               RETVAL = boxColor( dst, x1, y1, x2, y2, color );
+#line 7483 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_GFXBoxRGBA); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_GFXBoxRGBA)
+{
+    dXSARGS;
+    if (items != 9)
+       Perl_croak(aTHX_ "Usage: SDL::GFXBoxRGBA(dst, x1, y1, x2, y2, r, g, b, a)");
+    {
+       SDL_Surface*    dst = INT2PTR(SDL_Surface *,SvIV(ST(0)));
+       Sint16  x1 = (Sint16)SvIV(ST(1));
+       Sint16  y1 = (Sint16)SvIV(ST(2));
+       Sint16  x2 = (Sint16)SvIV(ST(3));
+       Sint16  y2 = (Sint16)SvIV(ST(4));
+       Uint8   r = (unsigned char)SvUV(ST(5));
+       Uint8   g = (unsigned char)SvUV(ST(6));
+       Uint8   b = (unsigned char)SvUV(ST(7));
+       Uint8   a = (unsigned char)SvUV(ST(8));
+       int     RETVAL;
+       dXSTARG;
+#line 3795 "SDL_perl.xs"
+               RETVAL = boxRGBA( dst, x1, y1, x2, y2, r, g, b, a );
+#line 7509 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_GFXLineColor); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_GFXLineColor)
+{
+    dXSARGS;
+    if (items != 6)
+       Perl_croak(aTHX_ "Usage: SDL::GFXLineColor(dst, x1, y1, x2, y2, color)");
+    {
+       SDL_Surface*    dst = INT2PTR(SDL_Surface *,SvIV(ST(0)));
+       Sint16  x1 = (Sint16)SvIV(ST(1));
+       Sint16  y1 = (Sint16)SvIV(ST(2));
+       Sint16  x2 = (Sint16)SvIV(ST(3));
+       Sint16  y2 = (Sint16)SvIV(ST(4));
+       Uint32  color = (Uint32)SvUV(ST(5));
+       int     RETVAL;
+       dXSTARG;
+#line 3808 "SDL_perl.xs"
+               RETVAL = lineColor( dst, x1, y1, x2, y2, color );
+#line 7532 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_GFXLineRGBA); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_GFXLineRGBA)
+{
+    dXSARGS;
+    if (items != 9)
+       Perl_croak(aTHX_ "Usage: SDL::GFXLineRGBA(dst, x1, y1, x2, y2, r, g, b, a)");
+    {
+       SDL_Surface*    dst = INT2PTR(SDL_Surface *,SvIV(ST(0)));
+       Sint16  x1 = (Sint16)SvIV(ST(1));
+       Sint16  y1 = (Sint16)SvIV(ST(2));
+       Sint16  x2 = (Sint16)SvIV(ST(3));
+       Sint16  y2 = (Sint16)SvIV(ST(4));
+       Uint8   r = (unsigned char)SvUV(ST(5));
+       Uint8   g = (unsigned char)SvUV(ST(6));
+       Uint8   b = (unsigned char)SvUV(ST(7));
+       Uint8   a = (unsigned char)SvUV(ST(8));
+       int     RETVAL;
+       dXSTARG;
+#line 3824 "SDL_perl.xs"
+               RETVAL = lineRGBA( dst, x1, y1, x2, y2, r, g, b, a );
+#line 7558 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_GFXAalineColor); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_GFXAalineColor)
+{
+    dXSARGS;
+    if (items != 6)
+       Perl_croak(aTHX_ "Usage: SDL::GFXAalineColor(dst, x1, y1, x2, y2, color)");
+    {
+       SDL_Surface*    dst = INT2PTR(SDL_Surface *,SvIV(ST(0)));
+       Sint16  x1 = (Sint16)SvIV(ST(1));
+       Sint16  y1 = (Sint16)SvIV(ST(2));
+       Sint16  x2 = (Sint16)SvIV(ST(3));
+       Sint16  y2 = (Sint16)SvIV(ST(4));
+       Uint32  color = (Uint32)SvUV(ST(5));
+       int     RETVAL;
+       dXSTARG;
+#line 3837 "SDL_perl.xs"
+               RETVAL = aalineColor( dst, x1, y1, x2, y2, color );
+#line 7581 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_GFXAalineRGBA); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_GFXAalineRGBA)
+{
+    dXSARGS;
+    if (items != 9)
+       Perl_croak(aTHX_ "Usage: SDL::GFXAalineRGBA(dst, x1, y1, x2, y2, r, g, b, a)");
+    {
+       SDL_Surface*    dst = INT2PTR(SDL_Surface *,SvIV(ST(0)));
+       Sint16  x1 = (Sint16)SvIV(ST(1));
+       Sint16  y1 = (Sint16)SvIV(ST(2));
+       Sint16  x2 = (Sint16)SvIV(ST(3));
+       Sint16  y2 = (Sint16)SvIV(ST(4));
+       Uint8   r = (unsigned char)SvUV(ST(5));
+       Uint8   g = (unsigned char)SvUV(ST(6));
+       Uint8   b = (unsigned char)SvUV(ST(7));
+       Uint8   a = (unsigned char)SvUV(ST(8));
+       int     RETVAL;
+       dXSTARG;
+#line 3853 "SDL_perl.xs"
+               RETVAL = aalineRGBA( dst, x1, y1, x2, y2, r, g, b, a );
+#line 7607 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_GFXCircleColor); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_GFXCircleColor)
+{
+    dXSARGS;
+    if (items != 5)
+       Perl_croak(aTHX_ "Usage: SDL::GFXCircleColor(dst, x, y, r, color)");
+    {
+       SDL_Surface*    dst = INT2PTR(SDL_Surface *,SvIV(ST(0)));
+       Sint16  x = (Sint16)SvIV(ST(1));
+       Sint16  y = (Sint16)SvIV(ST(2));
+       Sint16  r = (Sint16)SvIV(ST(3));
+       Uint32  color = (Uint32)SvUV(ST(4));
+       int     RETVAL;
+       dXSTARG;
+#line 3865 "SDL_perl.xs"
+               RETVAL = circleColor( dst, x, y, r, color );
+#line 7629 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_GFXCircleRGBA); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_GFXCircleRGBA)
+{
+    dXSARGS;
+    if (items != 8)
+       Perl_croak(aTHX_ "Usage: SDL::GFXCircleRGBA(dst, x, y, rad, r, g, b, a)");
+    {
+       SDL_Surface*    dst = INT2PTR(SDL_Surface *,SvIV(ST(0)));
+       Sint16  x = (Sint16)SvIV(ST(1));
+       Sint16  y = (Sint16)SvIV(ST(2));
+       Sint16  rad = (Sint16)SvIV(ST(3));
+       Uint8   r = (unsigned char)SvUV(ST(4));
+       Uint8   g = (unsigned char)SvUV(ST(5));
+       Uint8   b = (unsigned char)SvUV(ST(6));
+       Uint8   a = (unsigned char)SvUV(ST(7));
+       int     RETVAL;
+       dXSTARG;
+#line 3880 "SDL_perl.xs"
+               RETVAL = circleRGBA( dst, x, y, rad, r, g, b, a );
+#line 7654 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_GFXAacircleColor); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_GFXAacircleColor)
+{
+    dXSARGS;
+    if (items != 5)
+       Perl_croak(aTHX_ "Usage: SDL::GFXAacircleColor(dst, x, y, r, color)");
+    {
+       SDL_Surface*    dst = INT2PTR(SDL_Surface *,SvIV(ST(0)));
+       Sint16  x = (Sint16)SvIV(ST(1));
+       Sint16  y = (Sint16)SvIV(ST(2));
+       Sint16  r = (Sint16)SvIV(ST(3));
+       Uint32  color = (Uint32)SvUV(ST(4));
+       int     RETVAL;
+       dXSTARG;
+#line 3892 "SDL_perl.xs"
+               RETVAL = aacircleColor( dst, x, y, r, color );
+#line 7676 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_GFXAacircleRGBA); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_GFXAacircleRGBA)
+{
+    dXSARGS;
+    if (items != 8)
+       Perl_croak(aTHX_ "Usage: SDL::GFXAacircleRGBA(dst, x, y, rad, r, g, b, a)");
+    {
+       SDL_Surface*    dst = INT2PTR(SDL_Surface *,SvIV(ST(0)));
+       Sint16  x = (Sint16)SvIV(ST(1));
+       Sint16  y = (Sint16)SvIV(ST(2));
+       Sint16  rad = (Sint16)SvIV(ST(3));
+       Uint8   r = (unsigned char)SvUV(ST(4));
+       Uint8   g = (unsigned char)SvUV(ST(5));
+       Uint8   b = (unsigned char)SvUV(ST(6));
+       Uint8   a = (unsigned char)SvUV(ST(7));
+       int     RETVAL;
+       dXSTARG;
+#line 3907 "SDL_perl.xs"
+               RETVAL = aacircleRGBA( dst, x, y, rad, r, g, b, a );
+#line 7701 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_GFXFilledCircleColor); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_GFXFilledCircleColor)
+{
+    dXSARGS;
+    if (items != 5)
+       Perl_croak(aTHX_ "Usage: SDL::GFXFilledCircleColor(dst, x, y, r, color)");
+    {
+       SDL_Surface*    dst = INT2PTR(SDL_Surface *,SvIV(ST(0)));
+       Sint16  x = (Sint16)SvIV(ST(1));
+       Sint16  y = (Sint16)SvIV(ST(2));
+       Sint16  r = (Sint16)SvIV(ST(3));
+       Uint32  color = (Uint32)SvUV(ST(4));
+       int     RETVAL;
+       dXSTARG;
+#line 3919 "SDL_perl.xs"
+               RETVAL = filledCircleColor( dst, x, y, r, color );
+#line 7723 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_GFXFilledCircleRGBA); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_GFXFilledCircleRGBA)
+{
+    dXSARGS;
+    if (items != 8)
+       Perl_croak(aTHX_ "Usage: SDL::GFXFilledCircleRGBA(dst, x, y, rad, r, g, b, a)");
+    {
+       SDL_Surface*    dst = INT2PTR(SDL_Surface *,SvIV(ST(0)));
+       Sint16  x = (Sint16)SvIV(ST(1));
+       Sint16  y = (Sint16)SvIV(ST(2));
+       Sint16  rad = (Sint16)SvIV(ST(3));
+       Uint8   r = (unsigned char)SvUV(ST(4));
+       Uint8   g = (unsigned char)SvUV(ST(5));
+       Uint8   b = (unsigned char)SvUV(ST(6));
+       Uint8   a = (unsigned char)SvUV(ST(7));
+       int     RETVAL;
+       dXSTARG;
+#line 3934 "SDL_perl.xs"
+               RETVAL = filledCircleRGBA( dst, x, y, rad, r, g, b, a );
+#line 7748 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_GFXEllipseColor); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_GFXEllipseColor)
+{
+    dXSARGS;
+    if (items != 6)
+       Perl_croak(aTHX_ "Usage: SDL::GFXEllipseColor(dst, x, y, rx, ry, color)");
+    {
+       SDL_Surface*    dst = INT2PTR(SDL_Surface *,SvIV(ST(0)));
+       Sint16  x = (Sint16)SvIV(ST(1));
+       Sint16  y = (Sint16)SvIV(ST(2));
+       Sint16  rx = (Sint16)SvIV(ST(3));
+       Sint16  ry = (Sint16)SvIV(ST(4));
+       Uint32  color = (Uint32)SvUV(ST(5));
+       int     RETVAL;
+       dXSTARG;
+#line 3947 "SDL_perl.xs"
+               RETVAL = ellipseColor( dst, x, y, rx, ry, color );
+#line 7771 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_GFXEllipseRGBA); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_GFXEllipseRGBA)
+{
+    dXSARGS;
+    if (items != 9)
+       Perl_croak(aTHX_ "Usage: SDL::GFXEllipseRGBA(dst, x, y, rx, ry, r, g, b, a)");
+    {
+       SDL_Surface*    dst = INT2PTR(SDL_Surface *,SvIV(ST(0)));
+       Sint16  x = (Sint16)SvIV(ST(1));
+       Sint16  y = (Sint16)SvIV(ST(2));
+       Sint16  rx = (Sint16)SvIV(ST(3));
+       Sint16  ry = (Sint16)SvIV(ST(4));
+       Uint8   r = (unsigned char)SvUV(ST(5));
+       Uint8   g = (unsigned char)SvUV(ST(6));
+       Uint8   b = (unsigned char)SvUV(ST(7));
+       Uint8   a = (unsigned char)SvUV(ST(8));
+       int     RETVAL;
+       dXSTARG;
+#line 3963 "SDL_perl.xs"
+               RETVAL = ellipseRGBA( dst, x, y, rx, ry, r, g, b, a );
+#line 7797 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_GFXAaellipseColor); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_GFXAaellipseColor)
+{
+    dXSARGS;
+    if (items != 6)
+       Perl_croak(aTHX_ "Usage: SDL::GFXAaellipseColor(dst, xc, yc, rx, ry, color)");
+    {
+       SDL_Surface*    dst = INT2PTR(SDL_Surface *,SvIV(ST(0)));
+       Sint16  xc = (Sint16)SvIV(ST(1));
+       Sint16  yc = (Sint16)SvIV(ST(2));
+       Sint16  rx = (Sint16)SvIV(ST(3));
+       Sint16  ry = (Sint16)SvIV(ST(4));
+       Uint32  color = (Uint32)SvUV(ST(5));
+       int     RETVAL;
+       dXSTARG;
+#line 3976 "SDL_perl.xs"
+               RETVAL = aaellipseColor( dst, xc, yc, rx, ry, color );
+#line 7820 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_GFXAaellipseRGBA); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_GFXAaellipseRGBA)
+{
+    dXSARGS;
+    if (items != 9)
+       Perl_croak(aTHX_ "Usage: SDL::GFXAaellipseRGBA(dst, x, y, rx, ry, r, g, b, a)");
+    {
+       SDL_Surface*    dst = INT2PTR(SDL_Surface *,SvIV(ST(0)));
+       Sint16  x = (Sint16)SvIV(ST(1));
+       Sint16  y = (Sint16)SvIV(ST(2));
+       Sint16  rx = (Sint16)SvIV(ST(3));
+       Sint16  ry = (Sint16)SvIV(ST(4));
+       Uint8   r = (unsigned char)SvUV(ST(5));
+       Uint8   g = (unsigned char)SvUV(ST(6));
+       Uint8   b = (unsigned char)SvUV(ST(7));
+       Uint8   a = (unsigned char)SvUV(ST(8));
+       int     RETVAL;
+       dXSTARG;
+#line 3992 "SDL_perl.xs"
+               RETVAL = aaellipseRGBA( dst, x, y, rx, ry, r, g, b, a );
+#line 7846 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_GFXFilledEllipseColor); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_GFXFilledEllipseColor)
+{
+    dXSARGS;
+    if (items != 6)
+       Perl_croak(aTHX_ "Usage: SDL::GFXFilledEllipseColor(dst, x, y, rx, ry, color)");
+    {
+       SDL_Surface*    dst = INT2PTR(SDL_Surface *,SvIV(ST(0)));
+       Sint16  x = (Sint16)SvIV(ST(1));
+       Sint16  y = (Sint16)SvIV(ST(2));
+       Sint16  rx = (Sint16)SvIV(ST(3));
+       Sint16  ry = (Sint16)SvIV(ST(4));
+       Uint32  color = (Uint32)SvUV(ST(5));
+       int     RETVAL;
+       dXSTARG;
+#line 4005 "SDL_perl.xs"
+               RETVAL = filledEllipseColor( dst, x, y, rx, ry, color );
+#line 7869 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_GFXFilledEllipseRGBA); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_GFXFilledEllipseRGBA)
+{
+    dXSARGS;
+    if (items != 9)
+       Perl_croak(aTHX_ "Usage: SDL::GFXFilledEllipseRGBA(dst, x, y, rx, ry, r, g, b, a)");
+    {
+       SDL_Surface*    dst = INT2PTR(SDL_Surface *,SvIV(ST(0)));
+       Sint16  x = (Sint16)SvIV(ST(1));
+       Sint16  y = (Sint16)SvIV(ST(2));
+       Sint16  rx = (Sint16)SvIV(ST(3));
+       Sint16  ry = (Sint16)SvIV(ST(4));
+       Uint8   r = (unsigned char)SvUV(ST(5));
+       Uint8   g = (unsigned char)SvUV(ST(6));
+       Uint8   b = (unsigned char)SvUV(ST(7));
+       Uint8   a = (unsigned char)SvUV(ST(8));
+       int     RETVAL;
+       dXSTARG;
+#line 4021 "SDL_perl.xs"
+               RETVAL = filledEllipseRGBA( dst, x, y, rx, ry, r, g, b, a );
+#line 7895 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_GFXFilledPieColor); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_GFXFilledPieColor)
+{
+    dXSARGS;
+    if (items != 7)
+       Perl_croak(aTHX_ "Usage: SDL::GFXFilledPieColor(dst, x, y, rad, start, end, color)");
+    {
+       SDL_Surface*    dst = INT2PTR(SDL_Surface *,SvIV(ST(0)));
+       Sint16  x = (Sint16)SvIV(ST(1));
+       Sint16  y = (Sint16)SvIV(ST(2));
+       Sint16  rad = (Sint16)SvIV(ST(3));
+       Sint16  start = (Sint16)SvIV(ST(4));
+       Sint16  end = (Sint16)SvIV(ST(5));
+       Uint32  color = (Uint32)SvUV(ST(6));
+       int     RETVAL;
+       dXSTARG;
+#line 4035 "SDL_perl.xs"
+               RETVAL = filledPieColor( dst, x, y, rad, start, end, color );
+#line 7919 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_GFXFilledPieRGBA); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_GFXFilledPieRGBA)
+{
+    dXSARGS;
+    if (items != 10)
+       Perl_croak(aTHX_ "Usage: SDL::GFXFilledPieRGBA(dst, x, y, rad, start, end, r, g, b, a)");
+    {
+       SDL_Surface*    dst = INT2PTR(SDL_Surface *,SvIV(ST(0)));
+       Sint16  x = (Sint16)SvIV(ST(1));
+       Sint16  y = (Sint16)SvIV(ST(2));
+       Sint16  rad = (Sint16)SvIV(ST(3));
+       Sint16  start = (Sint16)SvIV(ST(4));
+       Sint16  end = (Sint16)SvIV(ST(5));
+       Uint8   r = (unsigned char)SvUV(ST(6));
+       Uint8   g = (unsigned char)SvUV(ST(7));
+       Uint8   b = (unsigned char)SvUV(ST(8));
+       Uint8   a = (unsigned char)SvUV(ST(9));
+       int     RETVAL;
+       dXSTARG;
+#line 4052 "SDL_perl.xs"
+               RETVAL = filledPieRGBA( dst, x, y, rad, start, end, r, g, b, a );
+#line 7946 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_GFXPolygonColor); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_GFXPolygonColor)
+{
+    dXSARGS;
+    if (items != 5)
+       Perl_croak(aTHX_ "Usage: SDL::GFXPolygonColor(dst, vx, vy, n, color)");
+    {
+       SDL_Surface*    dst = INT2PTR(SDL_Surface *,SvIV(ST(0)));
+       Sint16* vx = INT2PTR(Sint16 *,SvIV(ST(1)));
+       Sint16* vy = INT2PTR(Sint16 *,SvIV(ST(2)));
+       int     n = (int)SvIV(ST(3));
+       Uint32  color = (Uint32)SvUV(ST(4));
+       int     RETVAL;
+       dXSTARG;
+#line 4064 "SDL_perl.xs"
+               RETVAL = polygonColor( dst, vx, vy, n, color );
+#line 7968 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_GFXPolygonRGBA); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_GFXPolygonRGBA)
+{
+    dXSARGS;
+    if (items != 8)
+       Perl_croak(aTHX_ "Usage: SDL::GFXPolygonRGBA(dst, vx, vy, n, r, g, b, a)");
+    {
+       SDL_Surface*    dst = INT2PTR(SDL_Surface *,SvIV(ST(0)));
+       Sint16* vx = INT2PTR(Sint16 *,SvIV(ST(1)));
+       Sint16* vy = INT2PTR(Sint16 *,SvIV(ST(2)));
+       int     n = (int)SvIV(ST(3));
+       Uint8   r = (unsigned char)SvUV(ST(4));
+       Uint8   g = (unsigned char)SvUV(ST(5));
+       Uint8   b = (unsigned char)SvUV(ST(6));
+       Uint8   a = (unsigned char)SvUV(ST(7));
+       int     RETVAL;
+       dXSTARG;
+#line 4079 "SDL_perl.xs"
+               RETVAL = polygonRGBA( dst, vx, vy, n, r, g, b, a );
+#line 7993 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_GFXAapolygonColor); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_GFXAapolygonColor)
+{
+    dXSARGS;
+    if (items != 5)
+       Perl_croak(aTHX_ "Usage: SDL::GFXAapolygonColor(dst, vx, vy, n, color)");
+    {
+       SDL_Surface*    dst = INT2PTR(SDL_Surface *,SvIV(ST(0)));
+       Sint16* vx = INT2PTR(Sint16 *,SvIV(ST(1)));
+       Sint16* vy = INT2PTR(Sint16 *,SvIV(ST(2)));
+       int     n = (int)SvIV(ST(3));
+       Uint32  color = (Uint32)SvUV(ST(4));
+       int     RETVAL;
+       dXSTARG;
+#line 4091 "SDL_perl.xs"
+               RETVAL = aapolygonColor( dst, vx, vy, n, color );
+#line 8015 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_GFXAapolygonRGBA); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_GFXAapolygonRGBA)
+{
+    dXSARGS;
+    if (items != 8)
+       Perl_croak(aTHX_ "Usage: SDL::GFXAapolygonRGBA(dst, vx, vy, n, r, g, b, a)");
+    {
+       SDL_Surface*    dst = INT2PTR(SDL_Surface *,SvIV(ST(0)));
+       Sint16* vx = INT2PTR(Sint16 *,SvIV(ST(1)));
+       Sint16* vy = INT2PTR(Sint16 *,SvIV(ST(2)));
+       int     n = (int)SvIV(ST(3));
+       Uint8   r = (unsigned char)SvUV(ST(4));
+       Uint8   g = (unsigned char)SvUV(ST(5));
+       Uint8   b = (unsigned char)SvUV(ST(6));
+       Uint8   a = (unsigned char)SvUV(ST(7));
+       int     RETVAL;
+       dXSTARG;
+#line 4106 "SDL_perl.xs"
+               RETVAL = aapolygonRGBA( dst, vx, vy, n, r, g, b, a );
+#line 8040 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_GFXFilledPolygonColor); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_GFXFilledPolygonColor)
+{
+    dXSARGS;
+    if (items != 5)
+       Perl_croak(aTHX_ "Usage: SDL::GFXFilledPolygonColor(dst, vx, vy, n, color)");
+    {
+       SDL_Surface*    dst = INT2PTR(SDL_Surface *,SvIV(ST(0)));
+       Sint16* vx = INT2PTR(Sint16 *,SvIV(ST(1)));
+       Sint16* vy = INT2PTR(Sint16 *,SvIV(ST(2)));
+       int     n = (int)SvIV(ST(3));
+       int     color = (int)SvIV(ST(4));
+       int     RETVAL;
+       dXSTARG;
+#line 4118 "SDL_perl.xs"
+               RETVAL = filledPolygonColor( dst, vx, vy, n, color );
+#line 8062 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_GFXFilledPolygonRGBA); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_GFXFilledPolygonRGBA)
+{
+    dXSARGS;
+    if (items != 8)
+       Perl_croak(aTHX_ "Usage: SDL::GFXFilledPolygonRGBA(dst, vx, vy, n, r, g, b, a)");
+    {
+       SDL_Surface*    dst = INT2PTR(SDL_Surface *,SvIV(ST(0)));
+       Sint16* vx = INT2PTR(Sint16 *,SvIV(ST(1)));
+       Sint16* vy = INT2PTR(Sint16 *,SvIV(ST(2)));
+       int     n = (int)SvIV(ST(3));
+       Uint8   r = (unsigned char)SvUV(ST(4));
+       Uint8   g = (unsigned char)SvUV(ST(5));
+       Uint8   b = (unsigned char)SvUV(ST(6));
+       Uint8   a = (unsigned char)SvUV(ST(7));
+       int     RETVAL;
+       dXSTARG;
+#line 4133 "SDL_perl.xs"
+               RETVAL = filledPolygonRGBA( dst, vx, vy, n, r, g, b, a );
+#line 8087 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_GFXCharacterColor); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_GFXCharacterColor)
+{
+    dXSARGS;
+    if (items != 5)
+       Perl_croak(aTHX_ "Usage: SDL::GFXCharacterColor(dst, x, y, c, color)");
+    {
+       SDL_Surface*    dst = INT2PTR(SDL_Surface *,SvIV(ST(0)));
+       Sint16  x = (Sint16)SvIV(ST(1));
+       Sint16  y = (Sint16)SvIV(ST(2));
+       char    c = (char)*SvPV_nolen(ST(3));
+       Uint32  color = (Uint32)SvUV(ST(4));
+       int     RETVAL;
+       dXSTARG;
+#line 4145 "SDL_perl.xs"
+               RETVAL = characterColor( dst, x, y, c, color );
+#line 8109 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_GFXCharacterRGBA); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_GFXCharacterRGBA)
+{
+    dXSARGS;
+    if (items != 8)
+       Perl_croak(aTHX_ "Usage: SDL::GFXCharacterRGBA(dst, x, y, c, r, g, b, a)");
+    {
+       SDL_Surface*    dst = INT2PTR(SDL_Surface *,SvIV(ST(0)));
+       Sint16  x = (Sint16)SvIV(ST(1));
+       Sint16  y = (Sint16)SvIV(ST(2));
+       char    c = (char)*SvPV_nolen(ST(3));
+       Uint8   r = (unsigned char)SvUV(ST(4));
+       Uint8   g = (unsigned char)SvUV(ST(5));
+       Uint8   b = (unsigned char)SvUV(ST(6));
+       Uint8   a = (unsigned char)SvUV(ST(7));
+       int     RETVAL;
+       dXSTARG;
+#line 4160 "SDL_perl.xs"
+               RETVAL = characterRGBA( dst, x, y, c, r, g, b, a );
+#line 8134 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_GFXStringColor); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_GFXStringColor)
+{
+    dXSARGS;
+    if (items != 5)
+       Perl_croak(aTHX_ "Usage: SDL::GFXStringColor(dst, x, y, c, color)");
+    {
+       SDL_Surface*    dst = INT2PTR(SDL_Surface *,SvIV(ST(0)));
+       Sint16  x = (Sint16)SvIV(ST(1));
+       Sint16  y = (Sint16)SvIV(ST(2));
+       char*   c = (char *)SvPV_nolen(ST(3));
+       Uint32  color = (Uint32)SvUV(ST(4));
+       int     RETVAL;
+       dXSTARG;
+#line 4172 "SDL_perl.xs"
+               RETVAL = stringColor( dst, x, y, c, color );
+#line 8156 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_GFXStringRGBA); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_GFXStringRGBA)
+{
+    dXSARGS;
+    if (items != 8)
+       Perl_croak(aTHX_ "Usage: SDL::GFXStringRGBA(dst, x, y, c, r, g, b, a)");
+    {
+       SDL_Surface*    dst = INT2PTR(SDL_Surface *,SvIV(ST(0)));
+       Sint16  x = (Sint16)SvIV(ST(1));
+       Sint16  y = (Sint16)SvIV(ST(2));
+       char*   c = (char *)SvPV_nolen(ST(3));
+       Uint8   r = (unsigned char)SvUV(ST(4));
+       Uint8   g = (unsigned char)SvUV(ST(5));
+       Uint8   b = (unsigned char)SvUV(ST(6));
+       Uint8   a = (unsigned char)SvUV(ST(7));
+       int     RETVAL;
+       dXSTARG;
+#line 4187 "SDL_perl.xs"
+               RETVAL = stringRGBA( dst, x, y, c, r, g, b, a );
+#line 8181 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+#endif
+#ifdef HAVE_SDL_SVG
+#define XSubPPtmpAAAG 1
+
+XS(XS_SDL_SVG_Load); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_SVG_Load)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::SVG_Load(filename)");
+    {
+       char*   filename = (char *)SvPV_nolen(ST(0));
+       SDL_svg_context *       RETVAL;
+       dXSTARG;
+#line 4200 "SDL_perl.xs"
+               RETVAL = SVG_Load(filename);
+#line 8203 "SDL_perl.c"
+       XSprePUSH; PUSHi(PTR2IV(RETVAL));
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_SVG_LoadBuffer); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_SVG_LoadBuffer)
+{
+    dXSARGS;
+    if (items != 2)
+       Perl_croak(aTHX_ "Usage: SDL::SVG_LoadBuffer(data, len)");
+    {
+       char*   data = (char *)SvPV_nolen(ST(0));
+       int     len = (int)SvIV(ST(1));
+       SDL_svg_context *       RETVAL;
+       dXSTARG;
+#line 4209 "SDL_perl.xs"
+               RETVAL = SVG_LoadBuffer(data,len);
+#line 8222 "SDL_perl.c"
+       XSprePUSH; PUSHi(PTR2IV(RETVAL));
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_SVG_SetOffset); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_SVG_SetOffset)
+{
+    dXSARGS;
+    if (items != 3)
+       Perl_croak(aTHX_ "Usage: SDL::SVG_SetOffset(source, xoff, yoff)");
+    {
+       SDL_svg_context*        source = INT2PTR(SDL_svg_context *,SvIV(ST(0)));
+       double  xoff = (double)SvNV(ST(1));
+       double  yoff = (double)SvNV(ST(2));
+       int     RETVAL;
+       dXSTARG;
+#line 4219 "SDL_perl.xs"
+               RETVAL = SVG_SetOffset(source,xoff,yoff);
+#line 8242 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_SVG_SetScale); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_SVG_SetScale)
+{
+    dXSARGS;
+    if (items != 3)
+       Perl_croak(aTHX_ "Usage: SDL::SVG_SetScale(source, xscale, yscale)");
+    {
+       SDL_svg_context*        source = INT2PTR(SDL_svg_context *,SvIV(ST(0)));
+       double  xscale = (double)SvNV(ST(1));
+       double  yscale = (double)SvNV(ST(2));
+       int     RETVAL;
+       dXSTARG;
+#line 4229 "SDL_perl.xs"
+               RETVAL = SVG_SetScale(source,xscale,yscale);
+#line 8262 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_SVG_RenderToSurface); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_SVG_RenderToSurface)
+{
+    dXSARGS;
+    if (items != 4)
+       Perl_croak(aTHX_ "Usage: SDL::SVG_RenderToSurface(source, x, y, dest)");
+    {
+       SDL_svg_context*        source = INT2PTR(SDL_svg_context *,SvIV(ST(0)));
+       int     x = (int)SvIV(ST(1));
+       int     y = (int)SvIV(ST(2));
+       SDL_Surface*    dest = INT2PTR(SDL_Surface *,SvIV(ST(3)));
+       int     RETVAL;
+       dXSTARG;
+#line 4240 "SDL_perl.xs"
+               RETVAL = SVG_RenderToSurface(source,x,y,dest);
+#line 8283 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_SVG_Free); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_SVG_Free)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::SVG_Free(source)");
+    {
+       SDL_svg_context*        source = INT2PTR(SDL_svg_context *,SvIV(ST(0)));
+#line 4248 "SDL_perl.xs"
+               SVG_Free(source);       
+#line 8299 "SDL_perl.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL_SVG_Set_Flags); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_SVG_Set_Flags)
+{
+    dXSARGS;
+    if (items != 2)
+       Perl_croak(aTHX_ "Usage: SDL::SVG_Set_Flags(source, flags)");
+    {
+       SDL_svg_context*        source = INT2PTR(SDL_svg_context *,SvIV(ST(0)));
+       Uint32  flags = (Uint32)SvUV(ST(1));
+#line 4255 "SDL_perl.xs"
+               SVG_Set_Flags(source,flags);
+#line 8315 "SDL_perl.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL_SVG_Width); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_SVG_Width)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::SVG_Width(source)");
+    {
+       SDL_svg_context*        source = INT2PTR(SDL_svg_context *,SvIV(ST(0)));
+       float   RETVAL;
+       dXSTARG;
+#line 4261 "SDL_perl.xs"
+               RETVAL = SVG_Width(source);
+#line 8332 "SDL_perl.c"
+       XSprePUSH; PUSHn((double)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_SVG_HEIGHT); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_SVG_HEIGHT)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::SVG_HEIGHT(source)");
+    {
+       SDL_svg_context*        source = INT2PTR(SDL_svg_context *,SvIV(ST(0)));
+       float   RETVAL;
+       dXSTARG;
+#line 4269 "SDL_perl.xs"
+               RETVAL = SVG_Height(source);
+#line 8350 "SDL_perl.c"
+       XSprePUSH; PUSHn((double)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_SVG_SetClipping); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_SVG_SetClipping)
+{
+    dXSARGS;
+    if (items != 5)
+       Perl_croak(aTHX_ "Usage: SDL::SVG_SetClipping(source, minx, miny, maxx, maxy)");
+    {
+       SDL_svg_context*        source = INT2PTR(SDL_svg_context *,SvIV(ST(0)));
+       int     minx = (int)SvIV(ST(1));
+       int     miny = (int)SvIV(ST(2));
+       int     maxx = (int)SvIV(ST(3));
+       int     maxy = (int)SvIV(ST(4));
+#line 4281 "SDL_perl.xs"
+               SVG_SetClipping(source,minx,miny,maxx,maxy);
+#line 8370 "SDL_perl.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL_SVG_Version); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_SVG_Version)
+{
+    dXSARGS;
+    if (items != 0)
+       Perl_croak(aTHX_ "Usage: SDL::SVG_Version()");
+    {
+       int     RETVAL;
+       dXSTARG;
+#line 4286 "SDL_perl.xs"
+               RETVAL = SVG_Version();
+#line 8386 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+#endif
+#ifdef HAVE_SDL_SOUND
+#define XSubPPtmpAAAH 1
+
+XS(XS_SDL_SoundAudioInfoFormat); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_SoundAudioInfoFormat)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::SoundAudioInfoFormat(audioinfo)");
+    {
+       Sound_AudioInfo*        audioinfo = INT2PTR(Sound_AudioInfo *,SvIV(ST(0)));
+       Uint16  RETVAL;
+       dXSTARG;
+#line 4299 "SDL_perl.xs"
+               RETVAL = audioinfo->format;
+#line 8408 "SDL_perl.c"
+       XSprePUSH; PUSHu((UV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_SoundAudioInfoChannels); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_SoundAudioInfoChannels)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::SoundAudioInfoChannels(audioinfo)");
+    {
+       Sound_AudioInfo*        audioinfo = INT2PTR(Sound_AudioInfo *,SvIV(ST(0)));
+       Uint8   RETVAL;
+       dXSTARG;
+#line 4307 "SDL_perl.xs"
+               RETVAL = audioinfo->channels;
+#line 8426 "SDL_perl.c"
+       XSprePUSH; PUSHu((UV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_SoundAudioInforate); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_SoundAudioInforate)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::SoundAudioInforate(audioinfo)");
+    {
+       Sound_AudioInfo*        audioinfo = INT2PTR(Sound_AudioInfo *,SvIV(ST(0)));
+       Uint32  RETVAL;
+       dXSTARG;
+#line 4315 "SDL_perl.xs"
+               RETVAL = audioinfo->rate;
+#line 8444 "SDL_perl.c"
+       XSprePUSH; PUSHu((UV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_SoundDecoderInfoExtensions); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_SoundDecoderInfoExtensions)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::SoundDecoderInfoExtensions(decoderinfo)");
+    {
+       Sound_DecoderInfo*      decoderinfo = INT2PTR(Sound_DecoderInfo *,SvIV(ST(0)));
+       AV *    RETVAL;
+#line 4323 "SDL_perl.xs"
+               const char **ext;
+               for ( ext = decoderinfo->extensions; *ext != NULL; ext++ ){
+                       av_push(RETVAL,newSVpv(*ext,0));
+               }
+#line 8464 "SDL_perl.c"
+       ST(0) = newRV((SV*)RETVAL);
+       sv_2mortal(ST(0));
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_SoundDecoderInfoDescription); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_SoundDecoderInfoDescription)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::SoundDecoderInfoDescription(decoderinfo)");
+    {
+       Sound_DecoderInfo*      decoderinfo = INT2PTR(Sound_DecoderInfo *,SvIV(ST(0)));
+       const char *    RETVAL;
+       dXSTARG;
+#line 4334 "SDL_perl.xs"
+               RETVAL = decoderinfo->description;
+#line 8483 "SDL_perl.c"
+       sv_setpv(TARG, RETVAL); XSprePUSH; PUSHTARG;
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_SoundDecoderInfoAuthor); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_SoundDecoderInfoAuthor)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::SoundDecoderInfoAuthor(decoderinfo)");
+    {
+       Sound_DecoderInfo*      decoderinfo = INT2PTR(Sound_DecoderInfo *,SvIV(ST(0)));
+       const char *    RETVAL;
+       dXSTARG;
+#line 4342 "SDL_perl.xs"
+               RETVAL = decoderinfo->author;
+#line 8501 "SDL_perl.c"
+       sv_setpv(TARG, RETVAL); XSprePUSH; PUSHTARG;
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_SoundDecoderInfoUrl); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_SoundDecoderInfoUrl)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::SoundDecoderInfoUrl(decoderinfo)");
+    {
+       Sound_DecoderInfo*      decoderinfo = INT2PTR(Sound_DecoderInfo *,SvIV(ST(0)));
+       const char *    RETVAL;
+       dXSTARG;
+#line 4350 "SDL_perl.xs"
+               RETVAL = decoderinfo->url;
+#line 8519 "SDL_perl.c"
+       sv_setpv(TARG, RETVAL); XSprePUSH; PUSHTARG;
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_SoundSampleDecoder); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_SoundSampleDecoder)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::SoundSampleDecoder(sample)");
+    {
+       Sound_Sample*   sample = INT2PTR(Sound_Sample *,SvIV(ST(0)));
+       const Sound_DecoderInfo *       RETVAL;
+       dXSTARG;
+#line 4358 "SDL_perl.xs"
+               RETVAL = sample->decoder;
+#line 8537 "SDL_perl.c"
+       XSprePUSH; PUSHi(PTR2IV(RETVAL));
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_SoundSampleDesired); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_SoundSampleDesired)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::SoundSampleDesired(sample)");
+    {
+       Sound_Sample*   sample = INT2PTR(Sound_Sample *,SvIV(ST(0)));
+       Sound_AudioInfo *       RETVAL;
+       dXSTARG;
+#line 4366 "SDL_perl.xs"
+               RETVAL = &sample->desired;
+#line 8555 "SDL_perl.c"
+       XSprePUSH; PUSHi(PTR2IV(RETVAL));
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_SoundSampleAcutal); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_SoundSampleAcutal)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::SoundSampleAcutal(sample)");
+    {
+       Sound_Sample*   sample = INT2PTR(Sound_Sample *,SvIV(ST(0)));
+       Sound_AudioInfo *       RETVAL;
+       dXSTARG;
+#line 4374 "SDL_perl.xs"
+               RETVAL = &sample->actual;
+#line 8573 "SDL_perl.c"
+       XSprePUSH; PUSHi(PTR2IV(RETVAL));
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_SoundSampleBuffer); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_SoundSampleBuffer)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::SoundSampleBuffer(sample)");
+    {
+       Sound_Sample*   sample = INT2PTR(Sound_Sample *,SvIV(ST(0)));
+       char *  RETVAL;
+       dXSTARG;
+#line 4382 "SDL_perl.xs"
+               RETVAL = sample->buffer;
+#line 8591 "SDL_perl.c"
+       sv_setpv(TARG, RETVAL); XSprePUSH; PUSHTARG;
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_SoundSampleBufferSize); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_SoundSampleBufferSize)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::SoundSampleBufferSize(sample)");
+    {
+       Sound_Sample*   sample = INT2PTR(Sound_Sample *,SvIV(ST(0)));
+       Uint32  RETVAL;
+       dXSTARG;
+#line 4390 "SDL_perl.xs"
+               RETVAL = sample->buffer_size;
+#line 8609 "SDL_perl.c"
+       XSprePUSH; PUSHu((UV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_SoundSampleFlags); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_SoundSampleFlags)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::SoundSampleFlags(sample)");
+    {
+       Sound_Sample*   sample = INT2PTR(Sound_Sample *,SvIV(ST(0)));
+       Uint32  RETVAL;
+       dXSTARG;
+#line 4398 "SDL_perl.xs"
+               RETVAL = (Uint32)sample->flags;
+#line 8627 "SDL_perl.c"
+       XSprePUSH; PUSHu((UV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_Sound_Init); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_Sound_Init)
+{
+    dXSARGS;
+    if (items != 0)
+       Perl_croak(aTHX_ "Usage: SDL::Sound_Init()");
+    {
+       int     RETVAL;
+       dXSTARG;
+#line 4405 "SDL_perl.xs"
+               RETVAL = Sound_Init();
+#line 8644 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_Sound_Quit); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_Sound_Quit)
+{
+    dXSARGS;
+    if (items != 0)
+       Perl_croak(aTHX_ "Usage: SDL::Sound_Quit()");
+    {
+       int     RETVAL;
+       dXSTARG;
+#line 4412 "SDL_perl.xs"
+               RETVAL = Sound_Quit();
+#line 8661 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_Sound_AvailableDecoders); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_Sound_AvailableDecoders)
+{
+    dXSARGS;
+    if (items != 0)
+       Perl_croak(aTHX_ "Usage: SDL::Sound_AvailableDecoders()");
+    {
+       AV *    RETVAL;
+#line 4419 "SDL_perl.xs"
+               RETVAL = newAV();
+               const Sound_DecoderInfo** sdi;
+               sdi = Sound_AvailableDecoders();
+               if (sdi != NULL)  {
+                       for (;*sdi != NULL; ++sdi) {
+                               av_push(RETVAL,sv_2mortal(newSViv(PTR2IV(*sdi))));
+                       }
+               }
+#line 8684 "SDL_perl.c"
+       ST(0) = newRV((SV*)RETVAL);
+       sv_2mortal(ST(0));
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_Sound_GetError); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_Sound_GetError)
+{
+    dXSARGS;
+    if (items != 0)
+       Perl_croak(aTHX_ "Usage: SDL::Sound_GetError()");
+    {
+       const char *    RETVAL;
+       dXSTARG;
+#line 4433 "SDL_perl.xs"
+               RETVAL = Sound_GetError();
+#line 8702 "SDL_perl.c"
+       sv_setpv(TARG, RETVAL); XSprePUSH; PUSHTARG;
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_Sound_ClearError); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_Sound_ClearError)
+{
+    dXSARGS;
+    if (items != 0)
+       Perl_croak(aTHX_ "Usage: SDL::Sound_ClearError()");
+    {
+#line 4440 "SDL_perl.xs"
+               Sound_ClearError();
+#line 8717 "SDL_perl.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL_Sound_NewSample); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_Sound_NewSample)
+{
+    dXSARGS;
+    if (items != 4)
+       Perl_croak(aTHX_ "Usage: SDL::Sound_NewSample(rw, ext, desired, buffsize)");
+    {
+       SDL_RWops*      rw = INT2PTR(SDL_RWops *,SvIV(ST(0)));
+       const char*     ext = (const char *)SvPV_nolen(ST(1));
+       Sound_AudioInfo*        desired = INT2PTR(Sound_AudioInfo *,SvIV(ST(2)));
+       Uint32  buffsize = (Uint32)SvUV(ST(3));
+       Sound_Sample *  RETVAL;
+       dXSTARG;
+#line 4449 "SDL_perl.xs"
+               RETVAL = Sound_NewSample(rw,ext,desired,buffsize);
+#line 8737 "SDL_perl.c"
+       XSprePUSH; PUSHi(PTR2IV(RETVAL));
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_Sound_NewSampleFromMem); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_Sound_NewSampleFromMem)
+{
+    dXSARGS;
+    if (items != 5)
+       Perl_croak(aTHX_ "Usage: SDL::Sound_NewSampleFromMem(data, size, ext, desired, buffsize)");
+    {
+       const Uint8 *   data = INT2PTR(const Uint8 *,SvIV(ST(0)));
+       Uint32  size = (Uint32)SvUV(ST(1));
+       const char*     ext = (const char *)SvPV_nolen(ST(2));
+       Sound_AudioInfo*        desired = INT2PTR(Sound_AudioInfo *,SvIV(ST(3)));
+       Uint32  buffsize = (Uint32)SvUV(ST(4));
+       Sound_Sample *  RETVAL;
+       dXSTARG;
+#line 4461 "SDL_perl.xs"
+               RETVAL = Sound_NewSampleFromMem(data,size,ext,desired,buffsize);
+#line 8759 "SDL_perl.c"
+       XSprePUSH; PUSHi(PTR2IV(RETVAL));
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_Sound_NewSampleFromFile); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_Sound_NewSampleFromFile)
+{
+    dXSARGS;
+    if (items != 3)
+       Perl_croak(aTHX_ "Usage: SDL::Sound_NewSampleFromFile(fname, desired, buffsize)");
+    {
+       const char*     fname = (const char *)SvPV_nolen(ST(0));
+       Sound_AudioInfo*        desired = INT2PTR(Sound_AudioInfo *,SvIV(ST(1)));
+       Uint32  buffsize = (Uint32)SvUV(ST(2));
+       Sound_Sample *  RETVAL;
+       dXSTARG;
+#line 4471 "SDL_perl.xs"
+               RETVAL = Sound_NewSampleFromFile(fname,desired,buffsize);
+#line 8779 "SDL_perl.c"
+       XSprePUSH; PUSHi(PTR2IV(RETVAL));
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_Sound_FreeSample); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_Sound_FreeSample)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::Sound_FreeSample(sample)");
+    {
+       Sound_Sample*   sample = INT2PTR(Sound_Sample *,SvIV(ST(0)));
+#line 4479 "SDL_perl.xs"
+               Sound_FreeSample(sample);
+#line 8795 "SDL_perl.c"
+    }
+    XSRETURN_EMPTY;
+}
+
+XS(XS_SDL_Sound_GetDuration); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_Sound_GetDuration)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::Sound_GetDuration(sample)");
+    {
+       Sound_Sample*   sample = INT2PTR(Sound_Sample *,SvIV(ST(0)));
+       Sint32  RETVAL;
+       dXSTARG;
+#line 4485 "SDL_perl.xs"
+               RETVAL = Sound_GetDuration(sample);
+#line 8812 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_Sound_SetBufferSize); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_Sound_SetBufferSize)
+{
+    dXSARGS;
+    if (items != 2)
+       Perl_croak(aTHX_ "Usage: SDL::Sound_SetBufferSize(sample, size)");
+    {
+       Sound_Sample*   sample = INT2PTR(Sound_Sample *,SvIV(ST(0)));
+       Uint32  size = (Uint32)SvUV(ST(1));
+       int     RETVAL;
+       dXSTARG;
+#line 4494 "SDL_perl.xs"
+               RETVAL = Sound_SetBufferSize(sample,size);
+#line 8831 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_Sound_Decode); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_Sound_Decode)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::Sound_Decode(sample)");
+    {
+       Sound_Sample*   sample = INT2PTR(Sound_Sample *,SvIV(ST(0)));
+       Uint32  RETVAL;
+       dXSTARG;
+#line 4502 "SDL_perl.xs"
+               RETVAL = Sound_Decode(sample);
+#line 8849 "SDL_perl.c"
+       XSprePUSH; PUSHu((UV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_Sound_DecodeAll); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_Sound_DecodeAll)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::Sound_DecodeAll(sample)");
+    {
+       Sound_Sample*   sample = INT2PTR(Sound_Sample *,SvIV(ST(0)));
+       Uint32  RETVAL;
+       dXSTARG;
+#line 4510 "SDL_perl.xs"
+               RETVAL = Sound_DecodeAll(sample);
+#line 8867 "SDL_perl.c"
+       XSprePUSH; PUSHu((UV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_Sound_Rewind); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_Sound_Rewind)
+{
+    dXSARGS;
+    if (items != 1)
+       Perl_croak(aTHX_ "Usage: SDL::Sound_Rewind(sample)");
+    {
+       Sound_Sample*   sample = INT2PTR(Sound_Sample *,SvIV(ST(0)));
+       int     RETVAL;
+       dXSTARG;
+#line 4518 "SDL_perl.xs"
+               RETVAL = Sound_Rewind(sample);
+#line 8885 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+XS(XS_SDL_Sound_Seek); /* prototype to pass -Wmissing-prototypes */
+XS(XS_SDL_Sound_Seek)
+{
+    dXSARGS;
+    if (items != 2)
+       Perl_croak(aTHX_ "Usage: SDL::Sound_Seek(sample, ms)");
+    {
+       Sound_Sample*   sample = INT2PTR(Sound_Sample *,SvIV(ST(0)));
+       Uint32  ms = (Uint32)SvUV(ST(1));
+       int     RETVAL;
+       dXSTARG;
+#line 4527 "SDL_perl.xs"
+               RETVAL = Sound_Seek(sample,ms);
+#line 8904 "SDL_perl.c"
+       XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+#endif
+#ifdef __cplusplus
+extern "C"
+#endif
+XS(boot_SDL); /* prototype to pass -Wmissing-prototypes */
+XS(boot_SDL)
+{
+    dXSARGS;
+    char* file = __FILE__;
+
+    XS_VERSION_BOOTCHECK ;
+
+        newXS("SDL::GetError", XS_SDL_GetError, file);
+        newXS("SDL::Init", XS_SDL_Init, file);
+        newXS("SDL::InitSubSystem", XS_SDL_InitSubSystem, file);
+        newXS("SDL::QuitSubSystem", XS_SDL_QuitSubSystem, file);
+        newXS("SDL::Quit", XS_SDL_Quit, file);
+        newXS("SDL::WasInit", XS_SDL_WasInit, file);
+        newXS("SDL::Delay", XS_SDL_Delay, file);
+        newXS("SDL::GetTicks", XS_SDL_GetTicks, file);
+        newXS("SDL::SetTimer", XS_SDL_SetTimer, file);
+        newXS("SDL::AddTimer", XS_SDL_AddTimer, file);
+        newXS("SDL::PerlTimerCallback", XS_SDL_PerlTimerCallback, file);
+        newXS("SDL::NewTimer", XS_SDL_NewTimer, file);
+        newXS("SDL::RemoveTimer", XS_SDL_RemoveTimer, file);
+        newXS("SDL::RWFromFile", XS_SDL_RWFromFile, file);
+        newXS("SDL::RWFromFP", XS_SDL_RWFromFP, file);
+        newXS("SDL::RWFromMem", XS_SDL_RWFromMem, file);
+        newXS("SDL::RWFromConstMem", XS_SDL_RWFromConstMem, file);
+        newXS("SDL::AllocRW", XS_SDL_AllocRW, file);
+        newXS("SDL::FreeRW", XS_SDL_FreeRW, file);
+        newXS("SDL::RWseek", XS_SDL_RWseek, file);
+        newXS("SDL::RWtell", XS_SDL_RWtell, file);
+        newXS("SDL::RWread", XS_SDL_RWread, file);
+        newXS("SDL::RWwrite", XS_SDL_RWwrite, file);
+        newXS("SDL::RWclose", XS_SDL_RWclose, file);
+        newXS("SDL::CDNumDrives", XS_SDL_CDNumDrives, file);
+        newXS("SDL::CDName", XS_SDL_CDName, file);
+        newXS("SDL::CDOpen", XS_SDL_CDOpen, file);
+        newXS("SDL::CDTrackId", XS_SDL_CDTrackId, file);
+        newXS("SDL::CDTrackType", XS_SDL_CDTrackType, file);
+        newXS("SDL::CDTrackLength", XS_SDL_CDTrackLength, file);
+        newXS("SDL::CDTrackOffset", XS_SDL_CDTrackOffset, file);
+        newXS("SDL::CDStatus", XS_SDL_CDStatus, file);
+        newXS("SDL::CDPlayTracks", XS_SDL_CDPlayTracks, file);
+        newXS("SDL::CDPlay", XS_SDL_CDPlay, file);
+        newXS("SDL::CDPause", XS_SDL_CDPause, file);
+        newXS("SDL::CDResume", XS_SDL_CDResume, file);
+        newXS("SDL::CDStop", XS_SDL_CDStop, file);
+        newXS("SDL::CDEject", XS_SDL_CDEject, file);
+        newXS("SDL::CDClose", XS_SDL_CDClose, file);
+        newXS("SDL::CDId", XS_SDL_CDId, file);
+        newXS("SDL::CDNumTracks", XS_SDL_CDNumTracks, file);
+        newXS("SDL::CDCurTrack", XS_SDL_CDCurTrack, file);
+        newXS("SDL::CDCurFrame", XS_SDL_CDCurFrame, file);
+        newXS("SDL::CDTrack", XS_SDL_CDTrack, file);
+        newXS("SDL::PumpEvents", XS_SDL_PumpEvents, file);
+        newXS("SDL::PushEvent", XS_SDL_PushEvent, file);
+        newXS("SDL::NewEvent", XS_SDL_NewEvent, file);
+        newXS("SDL::FreeEvent", XS_SDL_FreeEvent, file);
+        newXS("SDL::PollEvent", XS_SDL_PollEvent, file);
+        newXS("SDL::WaitEvent", XS_SDL_WaitEvent, file);
+        newXS("SDL::EventState", XS_SDL_EventState, file);
+        newXS("SDL::EventType", XS_SDL_EventType, file);
+        newXS("SDL::SetEventType", XS_SDL_SetEventType, file);
+        newXS("SDL::ActiveEventGain", XS_SDL_ActiveEventGain, file);
+        newXS("SDL::ActiveEventState", XS_SDL_ActiveEventState, file);
+        newXS("SDL::KeyEventState", XS_SDL_KeyEventState, file);
+        newXS("SDL::KeyEventSym", XS_SDL_KeyEventSym, file);
+        newXS("SDL::KeyEventMod", XS_SDL_KeyEventMod, file);
+        newXS("SDL::KeyEventUnicode", XS_SDL_KeyEventUnicode, file);
+        newXS("SDL::KeyEventScanCode", XS_SDL_KeyEventScanCode, file);
+        newXS("SDL::MouseMotionState", XS_SDL_MouseMotionState, file);
+        newXS("SDL::MouseMotionX", XS_SDL_MouseMotionX, file);
+        newXS("SDL::MouseMotionY", XS_SDL_MouseMotionY, file);
+        newXS("SDL::MouseMotionXrel", XS_SDL_MouseMotionXrel, file);
+        newXS("SDL::MouseMotionYrel", XS_SDL_MouseMotionYrel, file);
+        newXS("SDL::MouseButtonState", XS_SDL_MouseButtonState, file);
+        newXS("SDL::MouseButton", XS_SDL_MouseButton, file);
+        newXS("SDL::MouseButtonX", XS_SDL_MouseButtonX, file);
+        newXS("SDL::MouseButtonY", XS_SDL_MouseButtonY, file);
+        newXS("SDL::SysWMEventMsg", XS_SDL_SysWMEventMsg, file);
+        newXS("SDL::EnableUnicode", XS_SDL_EnableUnicode, file);
+        newXS("SDL::EnableKeyRepeat", XS_SDL_EnableKeyRepeat, file);
+        newXS("SDL::GetModState", XS_SDL_GetModState, file);
+        newXS("SDL::SetModState", XS_SDL_SetModState, file);
+        newXS("SDL::GetKeyName", XS_SDL_GetKeyName, file);
+        newXS("SDL::CreateRGBSurface", XS_SDL_CreateRGBSurface, file);
+        newXS("SDL::CreateRGBSurfaceFrom", XS_SDL_CreateRGBSurfaceFrom, file);
+#if XSubPPtmpAAAA
+        newXS("SDL::IMGLoad", XS_SDL_IMGLoad, file);
+#endif
+        newXS("SDL::SurfaceCopy", XS_SDL_SurfaceCopy, file);
+        newXS("SDL::FreeSurface", XS_SDL_FreeSurface, file);
+        newXS("SDL::SurfaceFlags", XS_SDL_SurfaceFlags, file);
+        newXS("SDL::SurfacePalette", XS_SDL_SurfacePalette, file);
+        newXS("SDL::SurfaceBitsPerPixel", XS_SDL_SurfaceBitsPerPixel, file);
+        newXS("SDL::SurfaceBytesPerPixel", XS_SDL_SurfaceBytesPerPixel, file);
+        newXS("SDL::SurfaceRshift", XS_SDL_SurfaceRshift, file);
+        newXS("SDL::SurfaceGshift", XS_SDL_SurfaceGshift, file);
+        newXS("SDL::SurfaceBshift", XS_SDL_SurfaceBshift, file);
+        newXS("SDL::SurfaceAshift", XS_SDL_SurfaceAshift, file);
+        newXS("SDL::SurfaceRmask", XS_SDL_SurfaceRmask, file);
+        newXS("SDL::SurfaceGmask", XS_SDL_SurfaceGmask, file);
+        newXS("SDL::SurfaceBmask", XS_SDL_SurfaceBmask, file);
+        newXS("SDL::SurfaceAmask", XS_SDL_SurfaceAmask, file);
+        newXS("SDL::SurfaceColorKey", XS_SDL_SurfaceColorKey, file);
+        newXS("SDL::SurfaceAlpha", XS_SDL_SurfaceAlpha, file);
+        newXS("SDL::SurfaceW", XS_SDL_SurfaceW, file);
+        newXS("SDL::SurfaceH", XS_SDL_SurfaceH, file);
+        newXS("SDL::SurfacePitch", XS_SDL_SurfacePitch, file);
+        newXS("SDL::SurfacePixels", XS_SDL_SurfacePixels, file);
+        newXS("SDL::SurfacePixel", XS_SDL_SurfacePixel, file);
+        newXS("SDL::MUSTLOCK", XS_SDL_MUSTLOCK, file);
+        newXS("SDL::SurfaceLock", XS_SDL_SurfaceLock, file);
+        newXS("SDL::SurfaceUnlock", XS_SDL_SurfaceUnlock, file);
+        newXS("SDL::GetVideoSurface", XS_SDL_GetVideoSurface, file);
+        newXS("SDL::VideoInfo", XS_SDL_VideoInfo, file);
+        newXS("SDL::NewRect", XS_SDL_NewRect, file);
+        newXS("SDL::FreeRect", XS_SDL_FreeRect, file);
+        newXS("SDL::RectX", XS_SDL_RectX, file);
+        newXS("SDL::RectY", XS_SDL_RectY, file);
+        newXS("SDL::RectW", XS_SDL_RectW, file);
+        newXS("SDL::RectH", XS_SDL_RectH, file);
+        newXS("SDL::ListModes", XS_SDL_ListModes, file);
+        newXS("SDL::NewColor", XS_SDL_NewColor, file);
+        newXS("SDL::ColorR", XS_SDL_ColorR, file);
+        newXS("SDL::ColorG", XS_SDL_ColorG, file);
+        newXS("SDL::ColorB", XS_SDL_ColorB, file);
+        newXS("SDL::FreeColor", XS_SDL_FreeColor, file);
+        newXS("SDL::NewPalette", XS_SDL_NewPalette, file);
+        newXS("SDL::PaletteNColors", XS_SDL_PaletteNColors, file);
+        newXS("SDL::PaletteColors", XS_SDL_PaletteColors, file);
+        newXS("SDL::VideoModeOK", XS_SDL_VideoModeOK, file);
+        newXS("SDL::SetVideoMode", XS_SDL_SetVideoMode, file);
+        newXS("SDL::UpdateRect", XS_SDL_UpdateRect, file);
+        newXS("SDL::UpdateRects", XS_SDL_UpdateRects, file);
+        newXS("SDL::Flip", XS_SDL_Flip, file);
+        newXS("SDL::SetColors", XS_SDL_SetColors, file);
+        newXS("SDL::MapRGB", XS_SDL_MapRGB, file);
+        newXS("SDL::MapRGBA", XS_SDL_MapRGBA, file);
+        newXS("SDL::GetRGB", XS_SDL_GetRGB, file);
+        newXS("SDL::GetRGBA", XS_SDL_GetRGBA, file);
+        newXS("SDL::SaveBMP", XS_SDL_SaveBMP, file);
+        newXS("SDL::SetColorKey", XS_SDL_SetColorKey, file);
+        newXS("SDL::SetAlpha", XS_SDL_SetAlpha, file);
+        newXS("SDL::DisplayFormat", XS_SDL_DisplayFormat, file);
+        newXS("SDL::DisplayFormatAlpha", XS_SDL_DisplayFormatAlpha, file);
+        newXS("SDL::ConvertRGB", XS_SDL_ConvertRGB, file);
+        newXS("SDL::ConvertRGBA", XS_SDL_ConvertRGBA, file);
+        newXS("SDL::BlitSurface", XS_SDL_BlitSurface, file);
+        newXS("SDL::FillRect", XS_SDL_FillRect, file);
+        newXS("SDL::GetAppState", XS_SDL_GetAppState, file);
+        newXS("SDL::WMSetCaption", XS_SDL_WMSetCaption, file);
+        newXS("SDL::WMGetCaption", XS_SDL_WMGetCaption, file);
+        newXS("SDL::WMSetIcon", XS_SDL_WMSetIcon, file);
+        newXS("SDL::WarpMouse", XS_SDL_WarpMouse, file);
+        newXS("SDL::GetMouseState", XS_SDL_GetMouseState, file);
+        newXS("SDL::GetRelativeMouseState", XS_SDL_GetRelativeMouseState, file);
+        newXS("SDL::NewCursor", XS_SDL_NewCursor, file);
+        newXS("SDL::FreeCursor", XS_SDL_FreeCursor, file);
+        newXS("SDL::SetCursor", XS_SDL_SetCursor, file);
+        newXS("SDL::GetCursor", XS_SDL_GetCursor, file);
+        newXS("SDL::ShowCursor", XS_SDL_ShowCursor, file);
+        newXS("SDL::NewAudioSpec", XS_SDL_NewAudioSpec, file);
+        newXS("SDL::FreeAudioSpec", XS_SDL_FreeAudioSpec, file);
+        newXS("SDL::NewAudioCVT", XS_SDL_NewAudioCVT, file);
+        newXS("SDL::FreeAudioCVT", XS_SDL_FreeAudioCVT, file);
+        newXS("SDL::ConvertAudioData", XS_SDL_ConvertAudioData, file);
+        newXS("SDL::OpenAudio", XS_SDL_OpenAudio, file);
+        newXS("SDL::GetAudioStatus", XS_SDL_GetAudioStatus, file);
+        newXS("SDL::PauseAudio", XS_SDL_PauseAudio, file);
+        newXS("SDL::LockAudio", XS_SDL_LockAudio, file);
+        newXS("SDL::UnlockAudio", XS_SDL_UnlockAudio, file);
+        newXS("SDL::CloseAudio", XS_SDL_CloseAudio, file);
+        newXS("SDL::FreeWAV", XS_SDL_FreeWAV, file);
+        newXS("SDL::LoadWAV", XS_SDL_LoadWAV, file);
+#if XSubPPtmpAAAB
+        newXS("SDL::MixAudio", XS_SDL_MixAudio, file);
+        newXS("SDL::MixOpenAudio", XS_SDL_MixOpenAudio, file);
+        newXS("SDL::MixAllocateChannels", XS_SDL_MixAllocateChannels, file);
+        newXS("SDL::MixQuerySpec", XS_SDL_MixQuerySpec, file);
+        newXS("SDL::MixLoadWAV", XS_SDL_MixLoadWAV, file);
+        newXS("SDL::MixLoadMusic", XS_SDL_MixLoadMusic, file);
+        newXS("SDL::MixQuickLoadWAV", XS_SDL_MixQuickLoadWAV, file);
+        newXS("SDL::MixFreeChunk", XS_SDL_MixFreeChunk, file);
+        newXS("SDL::MixFreeMusic", XS_SDL_MixFreeMusic, file);
+        newXS("SDL::MixSetPostMixCallback", XS_SDL_MixSetPostMixCallback, file);
+        newXS("SDL::PerlMixMusicHook", XS_SDL_PerlMixMusicHook, file);
+        newXS("SDL::MixSetMusicHook", XS_SDL_MixSetMusicHook, file);
+        newXS("SDL::MixSetMusicFinishedHook", XS_SDL_MixSetMusicFinishedHook, file);
+        newXS("SDL::MixGetMusicHookData", XS_SDL_MixGetMusicHookData, file);
+        newXS("SDL::MixReverseChannels", XS_SDL_MixReverseChannels, file);
+        newXS("SDL::MixGroupChannel", XS_SDL_MixGroupChannel, file);
+        newXS("SDL::MixGroupChannels", XS_SDL_MixGroupChannels, file);
+        newXS("SDL::MixGroupAvailable", XS_SDL_MixGroupAvailable, file);
+        newXS("SDL::MixGroupCount", XS_SDL_MixGroupCount, file);
+        newXS("SDL::MixGroupOldest", XS_SDL_MixGroupOldest, file);
+        newXS("SDL::MixGroupNewer", XS_SDL_MixGroupNewer, file);
+        newXS("SDL::MixPlayChannel", XS_SDL_MixPlayChannel, file);
+        newXS("SDL::MixPlayChannelTimed", XS_SDL_MixPlayChannelTimed, file);
+        newXS("SDL::MixPlayMusic", XS_SDL_MixPlayMusic, file);
+        newXS("SDL::MixFadeInChannel", XS_SDL_MixFadeInChannel, file);
+        newXS("SDL::MixFadeInChannelTimed", XS_SDL_MixFadeInChannelTimed, file);
+        newXS("SDL::MixFadeInMusic", XS_SDL_MixFadeInMusic, file);
+        newXS("SDL::MixVolume", XS_SDL_MixVolume, file);
+        newXS("SDL::MixVolumeChunk", XS_SDL_MixVolumeChunk, file);
+        newXS("SDL::MixVolumeMusic", XS_SDL_MixVolumeMusic, file);
+        newXS("SDL::MixHaltChannel", XS_SDL_MixHaltChannel, file);
+        newXS("SDL::MixHaltGroup", XS_SDL_MixHaltGroup, file);
+        newXS("SDL::MixHaltMusic", XS_SDL_MixHaltMusic, file);
+        newXS("SDL::MixExpireChannel", XS_SDL_MixExpireChannel, file);
+        newXS("SDL::MixFadeOutChannel", XS_SDL_MixFadeOutChannel, file);
+        newXS("SDL::MixFadeOutGroup", XS_SDL_MixFadeOutGroup, file);
+        newXS("SDL::MixFadeOutMusic", XS_SDL_MixFadeOutMusic, file);
+        newXS("SDL::MixFadingMusic", XS_SDL_MixFadingMusic, file);
+        newXS("SDL::MixFadingChannel", XS_SDL_MixFadingChannel, file);
+        newXS("SDL::MixPause", XS_SDL_MixPause, file);
+        newXS("SDL::MixResume", XS_SDL_MixResume, file);
+        newXS("SDL::MixPaused", XS_SDL_MixPaused, file);
+        newXS("SDL::MixPauseMusic", XS_SDL_MixPauseMusic, file);
+        newXS("SDL::MixResumeMusic", XS_SDL_MixResumeMusic, file);
+        newXS("SDL::MixRewindMusic", XS_SDL_MixRewindMusic, file);
+        newXS("SDL::MixPausedMusic", XS_SDL_MixPausedMusic, file);
+        newXS("SDL::MixPlaying", XS_SDL_MixPlaying, file);
+        newXS("SDL::MixPlayingMusic", XS_SDL_MixPlayingMusic, file);
+        newXS("SDL::MixCloseAudio", XS_SDL_MixCloseAudio, file);
+#endif
+        newXS("SDL::GLLoadLibrary", XS_SDL_GLLoadLibrary, file);
+        newXS("SDL::GLGetProcAddress", XS_SDL_GLGetProcAddress, file);
+        newXS("SDL::GLSetAttribute", XS_SDL_GLSetAttribute, file);
+        newXS("SDL::GLGetAttribute", XS_SDL_GLGetAttribute, file);
+        newXS("SDL::GLSwapBuffers", XS_SDL_GLSwapBuffers, file);
+        newXS("SDL::BigEndian", XS_SDL_BigEndian, file);
+        newXS("SDL::NumJoysticks", XS_SDL_NumJoysticks, file);
+        newXS("SDL::JoystickName", XS_SDL_JoystickName, file);
+        newXS("SDL::JoystickOpen", XS_SDL_JoystickOpen, file);
+        newXS("SDL::JoystickOpened", XS_SDL_JoystickOpened, file);
+        newXS("SDL::JoystickIndex", XS_SDL_JoystickIndex, file);
+        newXS("SDL::JoystickNumAxes", XS_SDL_JoystickNumAxes, file);
+        newXS("SDL::JoystickNumBalls", XS_SDL_JoystickNumBalls, file);
+        newXS("SDL::JoystickNumHats", XS_SDL_JoystickNumHats, file);
+        newXS("SDL::JoystickNumButtons", XS_SDL_JoystickNumButtons, file);
+        newXS("SDL::JoystickUpdate", XS_SDL_JoystickUpdate, file);
+        newXS("SDL::JoystickGetAxis", XS_SDL_JoystickGetAxis, file);
+        newXS("SDL::JoystickGetHat", XS_SDL_JoystickGetHat, file);
+        newXS("SDL::JoystickGetButton", XS_SDL_JoystickGetButton, file);
+        newXS("SDL::JoystickGetBall", XS_SDL_JoystickGetBall, file);
+        newXS("SDL::JoystickClose", XS_SDL_JoystickClose, file);
+        newXS("SDL::JoyAxisEventWhich", XS_SDL_JoyAxisEventWhich, file);
+        newXS("SDL::JoyAxisEventAxis", XS_SDL_JoyAxisEventAxis, file);
+        newXS("SDL::JoyAxisEventValue", XS_SDL_JoyAxisEventValue, file);
+        newXS("SDL::JoyButtonEventWhich", XS_SDL_JoyButtonEventWhich, file);
+        newXS("SDL::JoyButtonEventButton", XS_SDL_JoyButtonEventButton, file);
+        newXS("SDL::JoyButtonEventState", XS_SDL_JoyButtonEventState, file);
+        newXS("SDL::JoyHatEventWhich", XS_SDL_JoyHatEventWhich, file);
+        newXS("SDL::JoyHatEventHat", XS_SDL_JoyHatEventHat, file);
+        newXS("SDL::JoyHatEventValue", XS_SDL_JoyHatEventValue, file);
+        newXS("SDL::JoyBallEventWhich", XS_SDL_JoyBallEventWhich, file);
+        newXS("SDL::JoyBallEventBall", XS_SDL_JoyBallEventBall, file);
+        newXS("SDL::JoyBallEventXrel", XS_SDL_JoyBallEventXrel, file);
+        newXS("SDL::JoyBallEventYrel", XS_SDL_JoyBallEventYrel, file);
+        newXS("SDL::SetClipRect", XS_SDL_SetClipRect, file);
+        newXS("SDL::GetClipRect", XS_SDL_GetClipRect, file);
+#if XSubPPtmpAAAC
+        newXS("SDL::NetInit", XS_SDL_NetInit, file);
+        newXS("SDL::NetQuit", XS_SDL_NetQuit, file);
+        newXS("SDL::NetNewIPaddress", XS_SDL_NetNewIPaddress, file);
+        newXS("SDL::NetIPaddressHost", XS_SDL_NetIPaddressHost, file);
+        newXS("SDL::NetIPaddressPort", XS_SDL_NetIPaddressPort, file);
+        newXS("SDL::NetFreeIPaddress", XS_SDL_NetFreeIPaddress, file);
+        newXS("SDL::NetResolveIP", XS_SDL_NetResolveIP, file);
+        newXS("SDL::NetResolveHost", XS_SDL_NetResolveHost, file);
+        newXS("SDL::NetTCPOpen", XS_SDL_NetTCPOpen, file);
+        newXS("SDL::NetTCPAccept", XS_SDL_NetTCPAccept, file);
+        newXS("SDL::NetTCPGetPeerAddress", XS_SDL_NetTCPGetPeerAddress, file);
+        newXS("SDL::NetTCPSend", XS_SDL_NetTCPSend, file);
+        newXS("SDL::NetTCPRecv", XS_SDL_NetTCPRecv, file);
+        newXS("SDL::NetTCPClose", XS_SDL_NetTCPClose, file);
+        newXS("SDL::NetAllocPacket", XS_SDL_NetAllocPacket, file);
+        newXS("SDL::NetAllocPacketV", XS_SDL_NetAllocPacketV, file);
+        newXS("SDL::NetResizePacket", XS_SDL_NetResizePacket, file);
+        newXS("SDL::NetFreePacket", XS_SDL_NetFreePacket, file);
+        newXS("SDL::NetFreePacketV", XS_SDL_NetFreePacketV, file);
+        newXS("SDL::NetUDPOpen", XS_SDL_NetUDPOpen, file);
+        newXS("SDL::NetUDPBind", XS_SDL_NetUDPBind, file);
+        newXS("SDL::NetUDPUnbind", XS_SDL_NetUDPUnbind, file);
+        newXS("SDL::NetUDPGetPeerAddress", XS_SDL_NetUDPGetPeerAddress, file);
+        newXS("SDL::NetUDPSendV", XS_SDL_NetUDPSendV, file);
+        newXS("SDL::NetUDPSend", XS_SDL_NetUDPSend, file);
+        newXS("SDL::NetUDPRecvV", XS_SDL_NetUDPRecvV, file);
+        newXS("SDL::NetUDPRecv", XS_SDL_NetUDPRecv, file);
+        newXS("SDL::NetUDPClose", XS_SDL_NetUDPClose, file);
+        newXS("SDL::NetAllocSocketSet", XS_SDL_NetAllocSocketSet, file);
+        newXS("SDL::NetTCP_AddSocket", XS_SDL_NetTCP_AddSocket, file);
+        newXS("SDL::NetUDP_AddSocket", XS_SDL_NetUDP_AddSocket, file);
+        newXS("SDL::NetTCP_DelSocket", XS_SDL_NetTCP_DelSocket, file);
+        newXS("SDL::NetUDP_DelSocket", XS_SDL_NetUDP_DelSocket, file);
+        newXS("SDL::NetCheckSockets", XS_SDL_NetCheckSockets, file);
+        newXS("SDL::NetSocketReady", XS_SDL_NetSocketReady, file);
+        newXS("SDL::NetFreeSocketSet", XS_SDL_NetFreeSocketSet, file);
+        newXS("SDL::NetWrite16", XS_SDL_NetWrite16, file);
+        newXS("SDL::NetWrite32", XS_SDL_NetWrite32, file);
+        newXS("SDL::NetRead16", XS_SDL_NetRead16, file);
+        newXS("SDL::NetRead32", XS_SDL_NetRead32, file);
+#endif
+#if XSubPPtmpAAAD
+        newXS("SDL::TTFInit", XS_SDL_TTFInit, file);
+        newXS("SDL::TTFQuit", XS_SDL_TTFQuit, file);
+        newXS("SDL::TTFOpenFont", XS_SDL_TTFOpenFont, file);
+        newXS("SDL::TTFGetFontStyle", XS_SDL_TTFGetFontStyle, file);
+        newXS("SDL::TTFSetFontStyle", XS_SDL_TTFSetFontStyle, file);
+        newXS("SDL::TTFFontHeight", XS_SDL_TTFFontHeight, file);
+        newXS("SDL::TTFFontAscent", XS_SDL_TTFFontAscent, file);
+        newXS("SDL::TTFFontDescent", XS_SDL_TTFFontDescent, file);
+        newXS("SDL::TTFFontLineSkip", XS_SDL_TTFFontLineSkip, file);
+        newXS("SDL::TTFGlyphMetrics", XS_SDL_TTFGlyphMetrics, file);
+        newXS("SDL::TTFSizeText", XS_SDL_TTFSizeText, file);
+        newXS("SDL::TTFSizeUTF8", XS_SDL_TTFSizeUTF8, file);
+        newXS("SDL::TTFSizeUNICODE", XS_SDL_TTFSizeUNICODE, file);
+        newXS("SDL::TTFRenderTextSolid", XS_SDL_TTFRenderTextSolid, file);
+        newXS("SDL::TTFRenderUTF8Solid", XS_SDL_TTFRenderUTF8Solid, file);
+        newXS("SDL::TTFRenderUNICODESolid", XS_SDL_TTFRenderUNICODESolid, file);
+        newXS("SDL::TTFRenderGlyphSolid", XS_SDL_TTFRenderGlyphSolid, file);
+        newXS("SDL::TTFRenderTextShaded", XS_SDL_TTFRenderTextShaded, file);
+        newXS("SDL::TTFRenderUTF8Shaded", XS_SDL_TTFRenderUTF8Shaded, file);
+        newXS("SDL::TTFRenderUNICODEShaded", XS_SDL_TTFRenderUNICODEShaded, file);
+        newXS("SDL::TTFRenderGlyphShaded", XS_SDL_TTFRenderGlyphShaded, file);
+        newXS("SDL::TTFRenderTextBlended", XS_SDL_TTFRenderTextBlended, file);
+        newXS("SDL::TTFRenderUTF8Blended", XS_SDL_TTFRenderUTF8Blended, file);
+        newXS("SDL::TTFRenderUNICODEBlended", XS_SDL_TTFRenderUNICODEBlended, file);
+        newXS("SDL::TTFRenderGlyphBlended", XS_SDL_TTFRenderGlyphBlended, file);
+        newXS("SDL::TTFCloseFont", XS_SDL_TTFCloseFont, file);
+        newXS("SDL::TTFPutString", XS_SDL_TTFPutString, file);
+#endif
+        newXS("SDL::CreateYUVOverlay", XS_SDL_CreateYUVOverlay, file);
+        newXS("SDL::LockYUVOverlay", XS_SDL_LockYUVOverlay, file);
+        newXS("SDL::UnlockYUVOverlay", XS_SDL_UnlockYUVOverlay, file);
+        newXS("SDL::DisplayYUVOverlay", XS_SDL_DisplayYUVOverlay, file);
+        newXS("SDL::FreeYUVOverlay", XS_SDL_FreeYUVOverlay, file);
+        newXS("SDL::OverlayFormat", XS_SDL_OverlayFormat, file);
+        newXS("SDL::OverlayW", XS_SDL_OverlayW, file);
+        newXS("SDL::OverlayH", XS_SDL_OverlayH, file);
+        newXS("SDL::OverlayPlanes", XS_SDL_OverlayPlanes, file);
+        newXS("SDL::OverlayHW", XS_SDL_OverlayHW, file);
+        newXS("SDL::OverlayPitches", XS_SDL_OverlayPitches, file);
+        newXS("SDL::OverlayPixels", XS_SDL_OverlayPixels, file);
+        newXS("SDL::WMToggleFullScreen", XS_SDL_WMToggleFullScreen, file);
+        newXS("SDL::WMGrabInput", XS_SDL_WMGrabInput, file);
+        newXS("SDL::WMIconifyWindow", XS_SDL_WMIconifyWindow, file);
+        newXS("SDL::ResizeEventW", XS_SDL_ResizeEventW, file);
+        newXS("SDL::ResizeEventH", XS_SDL_ResizeEventH, file);
+        newXS("SDL::AudioDriverName", XS_SDL_AudioDriverName, file);
+        newXS("SDL::GetKeyState", XS_SDL_GetKeyState, file);
+#if XSubPPtmpAAAE
+        newXS("SDL::NewSMPEGInfo", XS_SDL_NewSMPEGInfo, file);
+        newXS("SDL::FreeSMPEGInfo", XS_SDL_FreeSMPEGInfo, file);
+        newXS("SDL::SMPEGInfoHasAudio", XS_SDL_SMPEGInfoHasAudio, file);
+        newXS("SDL::SMPEGInfoHasVideo", XS_SDL_SMPEGInfoHasVideo, file);
+        newXS("SDL::SMPEGInfoWidth", XS_SDL_SMPEGInfoWidth, file);
+        newXS("SDL::SMPEGInfoHeight", XS_SDL_SMPEGInfoHeight, file);
+        newXS("SDL::SMPEGInfoCurrentFrame", XS_SDL_SMPEGInfoCurrentFrame, file);
+        newXS("SDL::SMPEGInfoCurrentFPS", XS_SDL_SMPEGInfoCurrentFPS, file);
+        newXS("SDL::SMPEGInfoCurrentAudioFrame", XS_SDL_SMPEGInfoCurrentAudioFrame, file);
+        newXS("SDL::SMPEGInfoCurrentOffset", XS_SDL_SMPEGInfoCurrentOffset, file);
+        newXS("SDL::SMPEGInfoTotalSize", XS_SDL_SMPEGInfoTotalSize, file);
+        newXS("SDL::SMPEGInfoCurrentTime", XS_SDL_SMPEGInfoCurrentTime, file);
+        newXS("SDL::SMPEGInfoTotalTime", XS_SDL_SMPEGInfoTotalTime, file);
+        newXS("SDL::SMPEGError", XS_SDL_SMPEGError, file);
+        newXS("SDL::NewSMPEG", XS_SDL_NewSMPEG, file);
+        newXS("SDL::FreeSMPEG", XS_SDL_FreeSMPEG, file);
+        newXS("SDL::SMPEGEnableAudio", XS_SDL_SMPEGEnableAudio, file);
+        newXS("SDL::SMPEGEnableVideo", XS_SDL_SMPEGEnableVideo, file);
+        newXS("SDL::SMPEGSetVolume", XS_SDL_SMPEGSetVolume, file);
+        newXS("SDL::SMPEGSetDisplay", XS_SDL_SMPEGSetDisplay, file);
+        newXS("SDL::SMPEGScaleXY", XS_SDL_SMPEGScaleXY, file);
+        newXS("SDL::SMPEGScale", XS_SDL_SMPEGScale, file);
+        newXS("SDL::SMPEGPlay", XS_SDL_SMPEGPlay, file);
+        newXS("SDL::SMPEGStatus", XS_SDL_SMPEGStatus, file);
+        newXS("SDL::SMPEGPause", XS_SDL_SMPEGPause, file);
+        newXS("SDL::SMPEGLoop", XS_SDL_SMPEGLoop, file);
+        newXS("SDL::SMPEGStop", XS_SDL_SMPEGStop, file);
+        newXS("SDL::SMPEGRewind", XS_SDL_SMPEGRewind, file);
+        newXS("SDL::SMPEGSeek", XS_SDL_SMPEGSeek, file);
+        newXS("SDL::SMPEGSkip", XS_SDL_SMPEGSkip, file);
+        newXS("SDL::SMPEGSetDisplayRegion", XS_SDL_SMPEGSetDisplayRegion, file);
+        newXS("SDL::SMPEGRenderFrame", XS_SDL_SMPEGRenderFrame, file);
+        newXS("SDL::SMPEGGetInfo", XS_SDL_SMPEGGetInfo, file);
+#endif
+#if XSubPPtmpAAAF
+        newXS("SDL::GFXRotoZoom", XS_SDL_GFXRotoZoom, file);
+        newXS("SDL::GFXZoom", XS_SDL_GFXZoom, file);
+        newXS("SDL::GFXPixelColor", XS_SDL_GFXPixelColor, file);
+        newXS("SDL::GFXPixelRGBA", XS_SDL_GFXPixelRGBA, file);
+        newXS("SDL::GFXHlineColor", XS_SDL_GFXHlineColor, file);
+        newXS("SDL::GFXHlineRGBA", XS_SDL_GFXHlineRGBA, file);
+        newXS("SDL::GFXVlineColor", XS_SDL_GFXVlineColor, file);
+        newXS("SDL::GFXVlineRGBA", XS_SDL_GFXVlineRGBA, file);
+        newXS("SDL::GFXRectangleColor", XS_SDL_GFXRectangleColor, file);
+        newXS("SDL::GFXRectangleRGBA", XS_SDL_GFXRectangleRGBA, file);
+        newXS("SDL::GFXBoxColor", XS_SDL_GFXBoxColor, file);
+        newXS("SDL::GFXBoxRGBA", XS_SDL_GFXBoxRGBA, file);
+        newXS("SDL::GFXLineColor", XS_SDL_GFXLineColor, file);
+        newXS("SDL::GFXLineRGBA", XS_SDL_GFXLineRGBA, file);
+        newXS("SDL::GFXAalineColor", XS_SDL_GFXAalineColor, file);
+        newXS("SDL::GFXAalineRGBA", XS_SDL_GFXAalineRGBA, file);
+        newXS("SDL::GFXCircleColor", XS_SDL_GFXCircleColor, file);
+        newXS("SDL::GFXCircleRGBA", XS_SDL_GFXCircleRGBA, file);
+        newXS("SDL::GFXAacircleColor", XS_SDL_GFXAacircleColor, file);
+        newXS("SDL::GFXAacircleRGBA", XS_SDL_GFXAacircleRGBA, file);
+        newXS("SDL::GFXFilledCircleColor", XS_SDL_GFXFilledCircleColor, file);
+        newXS("SDL::GFXFilledCircleRGBA", XS_SDL_GFXFilledCircleRGBA, file);
+        newXS("SDL::GFXEllipseColor", XS_SDL_GFXEllipseColor, file);
+        newXS("SDL::GFXEllipseRGBA", XS_SDL_GFXEllipseRGBA, file);
+        newXS("SDL::GFXAaellipseColor", XS_SDL_GFXAaellipseColor, file);
+        newXS("SDL::GFXAaellipseRGBA", XS_SDL_GFXAaellipseRGBA, file);
+        newXS("SDL::GFXFilledEllipseColor", XS_SDL_GFXFilledEllipseColor, file);
+        newXS("SDL::GFXFilledEllipseRGBA", XS_SDL_GFXFilledEllipseRGBA, file);
+        newXS("SDL::GFXFilledPieColor", XS_SDL_GFXFilledPieColor, file);
+        newXS("SDL::GFXFilledPieRGBA", XS_SDL_GFXFilledPieRGBA, file);
+        newXS("SDL::GFXPolygonColor", XS_SDL_GFXPolygonColor, file);
+        newXS("SDL::GFXPolygonRGBA", XS_SDL_GFXPolygonRGBA, file);
+        newXS("SDL::GFXAapolygonColor", XS_SDL_GFXAapolygonColor, file);
+        newXS("SDL::GFXAapolygonRGBA", XS_SDL_GFXAapolygonRGBA, file);
+        newXS("SDL::GFXFilledPolygonColor", XS_SDL_GFXFilledPolygonColor, file);
+        newXS("SDL::GFXFilledPolygonRGBA", XS_SDL_GFXFilledPolygonRGBA, file);
+        newXS("SDL::GFXCharacterColor", XS_SDL_GFXCharacterColor, file);
+        newXS("SDL::GFXCharacterRGBA", XS_SDL_GFXCharacterRGBA, file);
+        newXS("SDL::GFXStringColor", XS_SDL_GFXStringColor, file);
+        newXS("SDL::GFXStringRGBA", XS_SDL_GFXStringRGBA, file);
+#endif
+#if XSubPPtmpAAAG
+        newXS("SDL::SVG_Load", XS_SDL_SVG_Load, file);
+        newXS("SDL::SVG_LoadBuffer", XS_SDL_SVG_LoadBuffer, file);
+        newXS("SDL::SVG_SetOffset", XS_SDL_SVG_SetOffset, file);
+        newXS("SDL::SVG_SetScale", XS_SDL_SVG_SetScale, file);
+        newXS("SDL::SVG_RenderToSurface", XS_SDL_SVG_RenderToSurface, file);
+        newXS("SDL::SVG_Free", XS_SDL_SVG_Free, file);
+        newXS("SDL::SVG_Set_Flags", XS_SDL_SVG_Set_Flags, file);
+        newXS("SDL::SVG_Width", XS_SDL_SVG_Width, file);
+        newXS("SDL::SVG_HEIGHT", XS_SDL_SVG_HEIGHT, file);
+        newXS("SDL::SVG_SetClipping", XS_SDL_SVG_SetClipping, file);
+        newXS("SDL::SVG_Version", XS_SDL_SVG_Version, file);
+#endif
+#if XSubPPtmpAAAH
+        newXS("SDL::SoundAudioInfoFormat", XS_SDL_SoundAudioInfoFormat, file);
+        newXS("SDL::SoundAudioInfoChannels", XS_SDL_SoundAudioInfoChannels, file);
+        newXS("SDL::SoundAudioInforate", XS_SDL_SoundAudioInforate, file);
+        newXS("SDL::SoundDecoderInfoExtensions", XS_SDL_SoundDecoderInfoExtensions, file);
+        newXS("SDL::SoundDecoderInfoDescription", XS_SDL_SoundDecoderInfoDescription, file);
+        newXS("SDL::SoundDecoderInfoAuthor", XS_SDL_SoundDecoderInfoAuthor, file);
+        newXS("SDL::SoundDecoderInfoUrl", XS_SDL_SoundDecoderInfoUrl, file);
+        newXS("SDL::SoundSampleDecoder", XS_SDL_SoundSampleDecoder, file);
+        newXS("SDL::SoundSampleDesired", XS_SDL_SoundSampleDesired, file);
+        newXS("SDL::SoundSampleAcutal", XS_SDL_SoundSampleAcutal, file);
+        newXS("SDL::SoundSampleBuffer", XS_SDL_SoundSampleBuffer, file);
+        newXS("SDL::SoundSampleBufferSize", XS_SDL_SoundSampleBufferSize, file);
+        newXS("SDL::SoundSampleFlags", XS_SDL_SoundSampleFlags, file);
+        newXS("SDL::Sound_Init", XS_SDL_Sound_Init, file);
+        newXS("SDL::Sound_Quit", XS_SDL_Sound_Quit, file);
+        newXS("SDL::Sound_AvailableDecoders", XS_SDL_Sound_AvailableDecoders, file);
+        newXS("SDL::Sound_GetError", XS_SDL_Sound_GetError, file);
+        newXS("SDL::Sound_ClearError", XS_SDL_Sound_ClearError, file);
+        newXS("SDL::Sound_NewSample", XS_SDL_Sound_NewSample, file);
+        newXS("SDL::Sound_NewSampleFromMem", XS_SDL_Sound_NewSampleFromMem, file);
+        newXS("SDL::Sound_NewSampleFromFile", XS_SDL_Sound_NewSampleFromFile, file);
+        newXS("SDL::Sound_FreeSample", XS_SDL_Sound_FreeSample, file);
+        newXS("SDL::Sound_GetDuration", XS_SDL_Sound_GetDuration, file);
+        newXS("SDL::Sound_SetBufferSize", XS_SDL_Sound_SetBufferSize, file);
+        newXS("SDL::Sound_Decode", XS_SDL_Sound_Decode, file);
+        newXS("SDL::Sound_DecodeAll", XS_SDL_Sound_DecodeAll, file);
+        newXS("SDL::Sound_Rewind", XS_SDL_Sound_Rewind, file);
+        newXS("SDL::Sound_Seek", XS_SDL_Sound_Seek, file);
+#endif
+
+    /* Initialisation Section */
+
+#if XSubPPtmpAAAA
+#endif
+#if XSubPPtmpAAAB
+#endif
+#if XSubPPtmpAAAC
+#endif
+#if XSubPPtmpAAAD
+#endif
+#if XSubPPtmpAAAE
+#endif
+#if XSubPPtmpAAAF
+#endif
+#if XSubPPtmpAAAG
+#endif
+#if XSubPPtmpAAAH
+#endif
+#line 9403 "SDL_perl.c"
+
+    /* End of Initialisation Section */
+
+    XSRETURN_YES;
+}
+
diff --git a/src/SDL_perl.o b/src/SDL_perl.o
new file mode 100644 (file)
index 0000000..80ece95
Binary files /dev/null and b/src/SDL_perl.o differ
diff --git a/src/SDL_perl.xs b/src/SDL_perl.xs
new file mode 100644 (file)
index 0000000..c327e5e
--- /dev/null
@@ -0,0 +1,4536 @@
+//
+// SDL.xs
+//
+// Copyright (C) 2005 David J. Goehrig <dgoehrig@cpan.org>
+//
+// ------------------------------------------------------------------------------
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+// 
+// This library 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
+// Lesser General Public License for more details.
+// 
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+//
+// ------------------------------------------------------------------------------
+//
+// Please feel free to send questions, suggestions or improvements to:
+//
+//     David J. Goehrig
+//     dgoehrig@cpan.org
+//
+
+#include "EXTERN.h"
+#include "perl.h"
+#include "XSUB.h"
+
+#ifndef aTHX_
+#define aTHX_
+#endif
+
+#include <SDL.h>
+
+#ifdef HAVE_GL
+#include <gl.h>
+#endif
+
+#ifdef HAVE_GLU
+#include <glu.h>
+#endif
+
+#ifdef HAVE_SDL_IMAGE
+#include <SDL_image.h>
+#endif 
+
+#ifdef HAVE_SDL_MIXER
+#include <SDL_mixer.h>
+void (*mix_music_finished_cv)();
+#endif
+
+#ifdef HAVE_SDL_SOUND
+#include <SDL_sound.h>
+#endif
+
+#ifdef HAVE_SDL_NET
+#include <SDL_net.h>
+#endif
+
+#ifdef HAVE_SDL_TTF
+#include <SDL_ttf.h>
+#define TEXT_SOLID     1
+#define TEXT_SHADED    2
+#define TEXT_BLENDED   4
+#define UTF8_SOLID     8
+#define UTF8_SHADED    16      
+#define UTF8_BLENDED   32
+#define UNICODE_SOLID  64
+#define UNICODE_SHADED 128
+#define UNICODE_BLENDED        256
+#endif
+
+#ifdef HAVE_SMPEG
+#include <smpeg/smpeg.h>
+#ifdef HAVE_SDL_MIXER
+static int sdl_perl_use_smpeg_audio = 0;
+#endif
+#endif
+
+#ifdef HAVE_SDL_GFX
+#include <SDL_rotozoom.h>
+#include <SDL_gfxPrimitives.h>
+#include <SDL_framerate.h>
+#include <SDL_imageFilter.h>
+#endif
+
+#ifdef HAVE_SDL_SVG
+#include <SDL_svg.h>
+#endif
+
+#ifdef USE_THREADS
+#define HAVE_TLS_CONTEXT
+#endif
+
+#include "defines.h"
+
+Uint32 
+sdl_perl_timer_callback ( Uint32 interval, void* param )
+{
+       Uint32 retval;
+       int back;
+       SV* cmd;
+       ENTER_TLS_CONTEXT
+       dSP;
+
+       cmd = (SV*)param;
+
+       ENTER;
+       SAVETMPS;
+       PUSHMARK(SP);
+       XPUSHs(sv_2mortal(newSViv(interval)));
+       PUTBACK;
+
+       if (0 != (back = call_sv(cmd,G_SCALAR))) {
+               SPAGAIN;
+               if (back != 1 ) Perl_croak (aTHX_ "Timer Callback failed!");
+               retval = POPi;  
+       } else {
+               Perl_croak(aTHX_ "Timer Callback failed!");
+       }
+
+       FREETMPS;
+       LEAVE;
+
+       LEAVE_TLS_CONTEXT
+       
+       return retval;
+}
+
+void
+sdl_perl_audio_callback ( void* data, Uint8 *stream, int len )
+{
+       SV *cmd;
+       ENTER_TLS_CONTEXT
+       dSP;
+
+       cmd = (SV*)data;
+
+       ENTER;
+       SAVETMPS;
+       PUSHMARK(SP);
+       XPUSHs(sv_2mortal(newSViv(PTR2IV(stream))));
+       XPUSHs(sv_2mortal(newSViv(len)));
+       PUTBACK;
+
+       call_sv(cmd,G_VOID|G_DISCARD);
+       
+       PUTBACK;
+       FREETMPS;
+       LEAVE;
+
+       LEAVE_TLS_CONTEXT       
+}
+
+#ifdef HAVE_SDL_MIXER
+
+void
+sdl_perl_music_callback ( void ) 
+{
+       SV *cmd;
+       ENTER_TLS_CONTEXT
+       dSP;
+
+       cmd = (SV*)Mix_GetMusicHookData();
+
+       ENTER;
+       SAVETMPS;
+       PUSHMARK(SP);
+       PUTBACK;
+       
+       call_sv(cmd,G_VOID|G_DISCARD);
+
+       PUTBACK;
+       FREETMPS;
+       LEAVE;
+
+       LEAVE_TLS_CONTEXT
+}
+
+void
+sdl_perl_music_finished_callback ( void )
+{
+       SV *cmd;
+       ENTER_TLS_CONTEXT
+       dSP;
+
+       cmd = (SV*)mix_music_finished_cv;
+       if ( cmd == NULL ) return;
+
+       ENTER;
+       SAVETMPS;
+       PUSHMARK(SP);
+       PUTBACK;
+       
+       call_sv(cmd,G_VOID|G_DISCARD);
+       
+       PUTBACK;
+       FREETMPS;
+       LEAVE;
+
+       LEAVE_TLS_CONTEXT
+}
+
+#endif
+
+#define INIT_NS_APPLICATION
+#define QUIT_NS_APPLICATION
+
+
+void
+sdl_perl_atexit (void)
+{
+       QUIT_NS_APPLICATION     
+       SDL_Quit();
+}
+
+void boot_SDL();
+void boot_SDL__OpenGL();
+
+XS(boot_SDL_perl)
+{
+       GET_TLS_CONTEXT
+       boot_SDL();
+}
+
+MODULE = SDL_perl      PACKAGE = SDL
+PROTOTYPES : DISABLE
+
+char *
+GetError ()
+       CODE:
+               RETVAL = SDL_GetError();
+       OUTPUT:
+               RETVAL
+
+int
+Init ( flags )
+       Uint32 flags
+       CODE:
+               INIT_NS_APPLICATION
+               RETVAL = SDL_Init(flags);
+#ifdef HAVE_TLS_CONTEXT
+               Perl_call_atexit(PERL_GET_CONTEXT, (void*)sdl_perl_atexit,0);
+#else
+               atexit(sdl_perl_atexit);
+#endif
+       OUTPUT:
+               RETVAL
+
+int
+InitSubSystem ( flags )
+       Uint32 flags
+       CODE:
+               RETVAL = SDL_InitSubSystem(flags);
+       OUTPUT:
+               RETVAL
+
+void
+QuitSubSystem ( flags )
+       Uint32 flags
+       CODE:
+               SDL_QuitSubSystem(flags);
+
+void
+Quit ()
+       CODE:
+               QUIT_NS_APPLICATION
+               SDL_Quit();
+
+int
+WasInit ( flags )
+       Uint32 flags
+       CODE:
+               RETVAL = SDL_WasInit(flags);
+       OUTPUT:
+               RETVAL
+
+void
+Delay ( ms )
+       int ms
+       CODE:
+               SDL_Delay(ms);
+
+Uint32
+GetTicks ()
+       CODE:
+               RETVAL = SDL_GetTicks();
+       OUTPUT:
+               RETVAL
+
+int
+SetTimer ( interval, callback )
+       Uint32 interval
+       SDL_TimerCallback callback
+       CODE:
+               RETVAL = SDL_SetTimer(interval,callback);
+       OUTPUT:
+               RETVAL
+
+SDL_TimerID
+AddTimer ( interval, callback, param )
+       Uint32 interval
+       SDL_NewTimerCallback callback
+       void *param
+       CODE:
+               RETVAL = SDL_AddTimer(interval,callback,param);
+       OUTPUT:
+               RETVAL
+
+SDL_NewTimerCallback
+PerlTimerCallback ()
+       CODE:
+               RETVAL = sdl_perl_timer_callback;
+       OUTPUT:
+               RETVAL  
+
+SDL_TimerID
+NewTimer ( interval, cmd )
+       Uint32 interval
+       void *cmd
+       CODE:
+               RETVAL = SDL_AddTimer(interval,sdl_perl_timer_callback,cmd);
+       OUTPUT:
+               RETVAL
+
+Uint32
+RemoveTimer ( id )
+       SDL_TimerID id
+       CODE:
+               RETVAL = SDL_RemoveTimer(id);
+       OUTPUT:
+               RETVAL
+
+SDL_RWops*
+RWFromFile ( file, mode )
+       char* file
+       char * mode
+       CODE:
+               RETVAL = SDL_RWFromFile(file,mode);
+       OUTPUT:
+               RETVAL
+
+SDL_RWops*
+RWFromFP ( fp, autoclose )
+       FILE* fp
+       int autoclose
+       CODE:
+               RETVAL = SDL_RWFromFP(fp,autoclose);
+       OUTPUT:
+               RETVAL
+
+SDL_RWops*
+RWFromMem ( mem, size )
+       char* mem
+       int size
+       CODE:
+               RETVAL = SDL_RWFromMem((void*)mem,size);
+       OUTPUT:
+               RETVAL
+
+SDL_RWops*
+RWFromConstMem ( mem, size )
+       const char* mem
+       int size
+       CODE:
+               RETVAL = SDL_RWFromConstMem((const void*)mem,size);
+       OUTPUT:
+               RETVAL
+
+SDL_RWops*
+AllocRW ()
+       CODE:
+               RETVAL = SDL_AllocRW();
+       OUTPUT:
+               RETVAL
+
+void
+FreeRW ( rw )
+       SDL_RWops* rw
+       CODE:
+               SDL_FreeRW(rw);
+
+int
+RWseek ( rw, off, whence )
+       SDL_RWops* rw
+       int off
+       int whence
+       CODE:
+               RETVAL = SDL_RWseek(rw,off,whence);
+       OUTPUT:
+               RETVAL
+
+int
+RWtell ( rw )
+       SDL_RWops* rw
+       CODE:
+               RETVAL = SDL_RWtell(rw);
+       OUTPUT:
+               RETVAL
+
+int
+RWread ( rw, mem, size, n )
+       SDL_RWops* rw
+       char* mem
+       int size
+       int n
+       CODE:
+               RETVAL = SDL_RWread(rw,mem,size,n);
+       OUTPUT:
+               RETVAL
+
+int
+RWwrite ( rw, mem, size, n )
+       SDL_RWops* rw
+       char* mem
+       int size
+       int n
+       CODE:
+               RETVAL = SDL_RWwrite(rw,mem,size,n);
+       OUTPUT:
+               RETVAL
+
+int
+RWclose ( rw )
+       SDL_RWops* rw
+       CODE:
+               RETVAL = SDL_RWclose(rw);
+       OUTPUT:
+               RETVAL
+
+int
+CDNumDrives ()
+       CODE:
+               RETVAL = SDL_CDNumDrives();
+       OUTPUT:
+               RETVAL
+
+char *
+CDName ( drive )
+       int drive
+       CODE:
+               RETVAL = strdup(SDL_CDName(drive));
+       OUTPUT:
+               RETVAL
+
+SDL_CD *
+CDOpen ( drive )
+       int drive
+       CODE:
+               RETVAL = SDL_CDOpen(drive);
+       OUTPUT:
+               RETVAL
+
+Uint8
+CDTrackId ( track )
+       SDL_CDtrack *track
+       CODE:
+               RETVAL = track->id;
+       OUTPUT:
+               RETVAL
+
+Uint8
+CDTrackType ( track )
+       SDL_CDtrack *track
+       CODE:
+               RETVAL = track->type;
+       OUTPUT:
+               RETVAL
+
+Uint16
+CDTrackLength ( track )
+       SDL_CDtrack *track
+       CODE:
+               RETVAL = track->length;
+       OUTPUT:
+               RETVAL
+
+Uint32
+CDTrackOffset ( track )
+       SDL_CDtrack *track
+       CODE:
+               RETVAL = track->offset;
+       OUTPUT: 
+               RETVAL
+
+Uint32
+CDStatus ( cd )
+       SDL_CD *cd 
+       CODE:
+               RETVAL = SDL_CDStatus(cd);
+       OUTPUT:
+               RETVAL
+
+int
+CDPlayTracks ( cd, start_track, ntracks, start_frame, nframes )
+       SDL_CD *cd
+       int start_track
+       int ntracks
+       int start_frame
+       int nframes
+       CODE:
+               RETVAL = SDL_CDPlayTracks(cd,start_track,start_frame,ntracks,nframes);
+       OUTPUT:
+               RETVAL
+
+int
+CDPlay ( cd, start, length )
+       SDL_CD *cd
+       int start
+       int length
+       CODE:
+               RETVAL = SDL_CDPlay(cd,start,length);
+       OUTPUT:
+               RETVAL
+
+int
+CDPause ( cd )
+       SDL_CD *cd
+       CODE:
+               RETVAL = SDL_CDPause(cd);
+       OUTPUT:
+               RETVAL
+
+int
+CDResume ( cd )
+       SDL_CD *cd
+       CODE:
+               RETVAL = SDL_CDResume(cd);
+       OUTPUT:
+               RETVAL
+
+int
+CDStop ( cd )
+       SDL_CD *cd
+       CODE:
+               RETVAL = SDL_CDStop(cd);
+       OUTPUT:
+               RETVAL
+
+int
+CDEject ( cd )
+       SDL_CD *cd
+       CODE:
+               RETVAL = SDL_CDEject(cd);
+       OUTPUT:
+               RETVAL
+
+void
+CDClose ( cd )
+       SDL_CD *cd
+       CODE:
+               SDL_CDClose(cd);
+       
+int
+CDId ( cd )
+       SDL_CD *cd
+       CODE:
+               RETVAL = cd->id;
+       OUTPUT: 
+               RETVAL
+
+int
+CDNumTracks ( cd )
+       SDL_CD *cd
+       CODE:
+               RETVAL = cd->numtracks;
+       OUTPUT:
+               RETVAL
+
+int
+CDCurTrack ( cd )
+       SDL_CD *cd
+       CODE:
+               RETVAL = cd->cur_track;
+       OUTPUT:
+               RETVAL
+
+int
+CDCurFrame ( cd )
+       SDL_CD *cd
+       CODE:
+               RETVAL = cd->cur_frame;
+       OUTPUT:
+               RETVAL
+
+SDL_CDtrack *
+CDTrack ( cd, number )
+       SDL_CD *cd
+       int number
+       CODE:
+               RETVAL = (SDL_CDtrack *)(cd->track + number);
+       OUTPUT:
+               RETVAL
+
+void
+PumpEvents ()
+       CODE:
+               SDL_PumpEvents();
+
+int
+PushEvent( e )
+       SDL_Event *e
+       CODE:
+               RETVAL = SDL_PushEvent( e );
+       OUTPUT:
+               RETVAL
+
+SDL_Event *
+NewEvent ()
+       CODE:   
+               RETVAL = (SDL_Event *) safemalloc (sizeof(SDL_Event));
+       OUTPUT:
+               RETVAL
+
+void
+FreeEvent ( e )
+       SDL_Event *e
+       CODE:
+               safefree(e);
+
+int
+PollEvent ( e )
+       SDL_Event *e
+       CODE:
+               RETVAL = SDL_PollEvent(e);
+       OUTPUT:
+               RETVAL
+
+int
+WaitEvent ( e )
+       SDL_Event *e
+       CODE:
+               RETVAL = SDL_WaitEvent(e);
+       OUTPUT:
+               RETVAL
+
+Uint8
+EventState ( type, state )
+       Uint8 type
+       int state
+       CODE:
+               RETVAL = SDL_EventState(type,state);
+       OUTPUT:
+               RETVAL 
+
+Uint8
+EventType ( e )
+       SDL_Event *e
+       CODE:
+               RETVAL = e->type;
+       OUTPUT:
+               RETVAL
+
+Uint8
+SetEventType ( e, type )
+       SDL_Event *e
+       Uint8 type
+       CODE:
+               RETVAL = e->type;
+               e->type = type;
+       OUTPUT:
+               RETVAL
+
+Uint8
+ActiveEventGain ( e )
+       SDL_Event *e
+       CODE:
+               RETVAL = e->active.gain;
+       OUTPUT: 
+               RETVAL
+
+Uint8
+ActiveEventState ( e )
+       SDL_Event *e
+       CODE:
+               RETVAL = e->active.state;
+       OUTPUT:
+               RETVAL
+
+Uint8
+KeyEventState( e )
+       SDL_Event *e
+       CODE:
+               RETVAL = e->key.state;
+       OUTPUT:
+               RETVAL
+
+int
+KeyEventSym ( e )
+       SDL_Event *e
+       CODE:
+               RETVAL = e->key.keysym.sym;
+       OUTPUT:
+               RETVAL
+
+int 
+KeyEventMod ( e )
+       SDL_Event *e
+       CODE:
+               RETVAL = e->key.keysym.mod;
+       OUTPUT:
+               RETVAL
+
+Uint16
+KeyEventUnicode ( e )
+       SDL_Event *e
+       CODE:
+               RETVAL = e->key.keysym.unicode;
+       OUTPUT:
+               RETVAL
+
+Uint8
+KeyEventScanCode ( e )
+       SDL_Event *e
+       CODE:
+               RETVAL = e->key.keysym.scancode;
+       OUTPUT:
+               RETVAL
+
+Uint8
+MouseMotionState ( e )
+       SDL_Event *e
+       CODE:
+               RETVAL = e->motion.state;
+       OUTPUT: 
+               RETVAL
+
+Uint16
+MouseMotionX ( e )
+       SDL_Event *e
+       CODE:
+               RETVAL = e->motion.x;
+       OUTPUT:
+               RETVAL
+
+Uint16
+MouseMotionY ( e )
+       SDL_Event *e
+       CODE:
+               RETVAL = e->motion.y;
+       OUTPUT:
+               RETVAL
+
+Sint16
+MouseMotionXrel( e )
+       SDL_Event *e
+       CODE:
+               RETVAL = e->motion.xrel;
+       OUTPUT:
+               RETVAL
+
+Sint16
+MouseMotionYrel ( e )
+       SDL_Event *e
+       CODE:
+               RETVAL = e->motion.yrel;
+       OUTPUT:
+               RETVAL
+
+Uint8
+MouseButtonState ( e )
+       SDL_Event *e
+       CODE:
+               RETVAL = e->button.state;
+       OUTPUT:
+               RETVAL
+
+Uint8
+MouseButton ( e )
+       SDL_Event *e
+       CODE:
+               RETVAL = e->button.button;
+       OUTPUT:
+               RETVAL
+
+Uint16
+MouseButtonX ( e )
+       SDL_Event *e
+       CODE:
+               RETVAL = e->button.x;
+       OUTPUT:
+               RETVAL
+
+Uint16
+MouseButtonY ( e )
+       SDL_Event *e
+       CODE:
+               RETVAL = e->button.y;
+       OUTPUT:
+               RETVAL
+
+SDL_SysWMmsg *
+SysWMEventMsg ( e )
+       SDL_Event *e
+       CODE:
+               RETVAL = e->syswm.msg;
+       OUTPUT:
+               RETVAL
+
+int
+EnableUnicode ( enable )
+       int enable
+       CODE:
+               RETVAL = SDL_EnableUNICODE(enable);
+       OUTPUT:
+               RETVAL
+
+void
+EnableKeyRepeat ( delay, interval )
+       int delay
+       int interval
+       CODE:
+               SDL_EnableKeyRepeat(delay,interval);
+
+Uint32
+GetModState ()
+       CODE:
+               RETVAL = SDL_GetModState();
+       OUTPUT:
+               RETVAL
+
+void
+SetModState ( state )
+       Uint32 state
+       CODE:
+               SDL_SetModState(state);
+
+char *
+GetKeyName ( sym )
+       int sym
+       CODE:
+               RETVAL = SDL_GetKeyName(sym);
+       OUTPUT:
+               RETVAL
+
+SDL_Surface *
+CreateRGBSurface (flags, width, height, depth, Rmask, Gmask, Bmask, Amask )
+       Uint32 flags
+       int width
+       int height
+       int depth
+       Uint32 Rmask
+       Uint32 Gmask
+       Uint32 Bmask
+       Uint32 Amask
+       CODE:
+               RETVAL = SDL_CreateRGBSurface ( flags, width, height,
+                               depth, Rmask, Gmask, Bmask, Amask );
+       OUTPUT: 
+               RETVAL
+
+
+SDL_Surface *
+CreateRGBSurfaceFrom (pixels, width, height, depth, pitch, Rmask, Gmask, Bmask, Amask )
+       char *pixels
+       int width
+       int height
+       int depth
+       int pitch
+       Uint32 Rmask
+       Uint32 Gmask
+       Uint32 Bmask
+       Uint32 Amask
+       CODE:
+               Uint8* pixeldata;
+               Uint32 len = pitch * height;
+               New(0,pixeldata,len,Uint8);
+               Copy(pixels,pixeldata,len,Uint8);
+               RETVAL = SDL_CreateRGBSurfaceFrom ( pixeldata, width, height,
+                               depth, pitch, Rmask, Gmask, Bmask, Amask );
+       OUTPUT: 
+               RETVAL
+
+#ifdef HAVE_SDL_IMAGE
+
+SDL_Surface *
+IMGLoad ( fname )
+       char *fname
+       CODE:
+               RETVAL = IMG_Load(fname);
+       OUTPUT:
+               RETVAL
+
+#endif
+
+SDL_Surface*
+SurfaceCopy ( surface )
+       SDL_Surface *surface
+       CODE:
+               Uint8* pixels;
+               Uint32 size = surface->pitch * surface->h;
+               New(0,pixels,size,Uint8);
+               Copy(surface->pixels,pixels,size,Uint8);
+               RETVAL = SDL_CreateRGBSurfaceFrom(pixels,surface->w,surface->h,
+                       surface->format->BitsPerPixel, surface->pitch,
+                       surface->format->Rmask, surface->format->Gmask,
+                       surface->format->Bmask, surface->format->Amask);
+       OUTPUT:
+               RETVAL
+
+void
+FreeSurface ( surface )
+       SDL_Surface *surface
+       CODE:
+               if (surface) {
+                       Uint8* pixels = surface->pixels;
+                       Uint32 flags = surface->flags;
+                       SDL_FreeSurface(surface);
+                       if (flags & SDL_PREALLOC)
+                               Safefree(pixels);
+               }
+       
+Uint32
+SurfaceFlags ( surface )
+       SDL_Surface *surface
+       CODE:
+               RETVAL = surface->flags;
+       OUTPUT:
+               RETVAL
+
+SDL_Palette *
+SurfacePalette ( surface )
+       SDL_Surface *surface
+       CODE:
+               RETVAL = surface->format->palette;
+       OUTPUT:
+               RETVAL
+
+Uint8
+SurfaceBitsPerPixel ( surface )
+       SDL_Surface *surface
+       CODE:
+               RETVAL = surface->format->BitsPerPixel;
+       OUTPUT:
+               RETVAL
+
+Uint8
+SurfaceBytesPerPixel ( surface )
+       SDL_Surface *surface
+       CODE:   
+               RETVAL = surface->format->BytesPerPixel;
+       OUTPUT:
+               RETVAL
+
+Uint8
+SurfaceRshift ( surface )
+       SDL_Surface *surface
+       CODE:
+               RETVAL = surface->format->Rshift;
+       OUTPUT:
+               RETVAL
+
+Uint8
+SurfaceGshift ( surface )
+       SDL_Surface *surface
+       CODE:
+               RETVAL = surface->format->Gshift;
+       OUTPUT:
+               RETVAL
+
+Uint8
+SurfaceBshift ( surface )
+       SDL_Surface *surface
+       CODE:
+               RETVAL = surface->format->Bshift;
+       OUTPUT:
+               RETVAL
+
+Uint8
+SurfaceAshift ( surface )
+       SDL_Surface *surface
+       CODE:
+               RETVAL = surface->format->Ashift;
+       OUTPUT:
+               RETVAL
+
+Uint32
+SurfaceRmask( surface )
+       SDL_Surface *surface
+       CODE:
+               RETVAL = surface->format->Rmask;
+       OUTPUT:
+               RETVAL
+
+Uint32
+SurfaceGmask ( surface )
+       SDL_Surface *surface
+       CODE:
+               RETVAL = surface->format->Gmask;
+       OUTPUT:
+               RETVAL
+
+Uint32
+SurfaceBmask ( surface )
+       SDL_Surface *surface
+       CODE:
+               RETVAL = surface->format->Bmask;
+       OUTPUT:
+               RETVAL
+
+Uint32
+SurfaceAmask ( surface )
+       SDL_Surface *surface
+       CODE:
+               RETVAL = surface->format->Amask;
+       OUTPUT:
+               RETVAL
+
+Uint32
+SurfaceColorKey ( surface )
+       SDL_Surface *surface
+       CODE:
+               RETVAL = surface->format->colorkey;
+       OUTPUT:
+               RETVAL
+
+Uint32
+SurfaceAlpha( surface )
+       SDL_Surface *surface
+       CODE:
+               RETVAL = surface->format->alpha;
+       OUTPUT:
+               RETVAL
+
+int
+SurfaceW ( surface )
+       SDL_Surface *surface
+       CODE:   
+               RETVAL = surface->w;
+       OUTPUT:
+               RETVAL
+
+int
+SurfaceH ( surface )
+       SDL_Surface *surface
+       CODE:   
+               RETVAL = surface->h;
+       OUTPUT:
+               RETVAL
+
+Uint16
+SurfacePitch ( surface )
+       SDL_Surface *surface
+       CODE:   
+               RETVAL = surface->pitch;
+       OUTPUT:
+               RETVAL
+
+SV*
+SurfacePixels ( surface )
+       SDL_Surface *surface
+       CODE:   
+               RETVAL = newSVpvn(surface->pixels,surface->pitch*surface->h);
+       OUTPUT:
+               RETVAL
+
+SDL_Color*
+SurfacePixel ( surface, x, y, ... )
+       SDL_Surface *surface
+       Sint32 x
+       Sint32 y
+       CODE:
+               SDL_Color* color;
+               int pix,index;
+               Uint8 r,g,b,a;
+               int bpp = surface->format->BytesPerPixel;
+               Uint8* p = (Uint8*)surface->pixels + bpp*x + surface->pitch*y;
+               if ( items < 3 || items > 4 ) 
+                       Perl_croak(aTHX_ "usage: SDL::SurfacePixel(surface,x,y,[color])");
+               if ( items == 4) {
+                       color = (SDL_Color*)SvIV(ST(3));
+                       pix = SDL_MapRGB(surface->format,color->r,color->g,color->b);
+                       switch(bpp) {
+                               case 1:
+                                       *(Uint8*)p = pix;
+                                       break;
+                               case 2:
+                                       *(Uint16*)p = pix;
+                                       break;
+                               case 3:
+                                       if (SDL_BYTEORDER == SDL_BIG_ENDIAN) {
+                                               p[0] = (pix >> 16) & 0xff;
+                                               p[1] = (pix >> 8) & 0xff;
+                                               p[2] = pix & 0xff;
+                                       } else {
+                                               p[0] = pix & 0xff;
+                                               p[1] = (pix >> 8) & 0xff;
+                                               p[2] = (pix >> 16) & 0xff;
+                                       }
+                                       break;
+                               case 4:
+                                       *(Uint32*)p = pix;
+                                       break;
+                       }
+               }
+               RETVAL = (SDL_Color *) safemalloc(sizeof(SDL_Color));
+               switch(bpp) {
+                       case 1:
+                               index = *(Uint8*)p;
+                               memcpy(RETVAL,&surface->format->palette[index],sizeof(SDL_Color));
+                               break;
+                       case 2:
+                               pix = *(Uint16*)p;
+                               SDL_GetRGB(pix,surface->format,&r,&g,&b);
+                               RETVAL->r = r;
+                               RETVAL->g = g;
+                               RETVAL->b = b;
+                               break;
+                       case 3:
+                       case 4:
+                               pix = *(Uint32*)p;
+                               SDL_GetRGB(pix,surface->format,&r,&g,&b);
+                               RETVAL->r = r;
+                               RETVAL->g = g;
+                               RETVAL->b = b;
+                               break;
+               }
+       OUTPUT:
+               RETVAL
+
+int
+MUSTLOCK ( surface )
+       SDL_Surface *surface
+       CODE:
+               RETVAL = SDL_MUSTLOCK(surface);
+       OUTPUT:
+               RETVAL          
+
+int
+SurfaceLock ( surface )
+       SDL_Surface *surface
+       CODE:
+               RETVAL = SDL_LockSurface(surface);
+       OUTPUT:
+               RETVAL
+
+void
+SurfaceUnlock ( surface )
+       SDL_Surface *surface
+       CODE:
+               SDL_UnlockSurface(surface);
+
+SDL_Surface *
+GetVideoSurface ()
+       CODE:
+               RETVAL = SDL_GetVideoSurface();
+       OUTPUT:
+               RETVAL
+
+
+HV *
+VideoInfo ()
+       CODE:
+               HV *hv;
+               SDL_VideoInfo *info;
+               info = (SDL_VideoInfo *) safemalloc ( sizeof(SDL_VideoInfo));
+               memcpy(info,SDL_GetVideoInfo(),sizeof(SDL_VideoInfo));
+               hv = newHV();
+               hv_store(hv,"hw_available",strlen("hw_available"),
+                       newSViv(info->hw_available),0);
+               hv_store(hv,"wm_available",strlen("wm_available"),
+                       newSViv(info->wm_available),0);
+               hv_store(hv,"blit_hw",strlen("blit_hw"),
+                       newSViv(info->blit_hw),0);
+               hv_store(hv,"blit_hw_CC",strlen("blit_hw_CC"),
+                       newSViv(info->blit_hw_CC),0);
+               hv_store(hv,"blit_hw_A",strlen("blit_hw_A"),
+                       newSViv(info->blit_hw_A),0);
+               hv_store(hv,"blit_sw",strlen("blit_sw"),
+                       newSViv(info->blit_sw),0);
+               hv_store(hv,"blit_sw_CC",strlen("blit_sw_CC"),
+                       newSViv(info->blit_sw_CC),0);
+               hv_store(hv,"blit_sw_A",strlen("blit_sw_A"),
+                       newSViv(info->blit_sw_A),0);
+               hv_store(hv,"blit_fill",strlen("blit_fill"),
+                       newSViv(info->blit_fill),0);
+               hv_store(hv,"video_mem",strlen("video_mem"),
+                       newSViv(info->video_mem),0);
+               RETVAL = hv;
+       OUTPUT:
+               RETVAL
+
+SDL_Rect *
+NewRect ( x, y, w, h )
+       Sint16 x
+       Sint16 y
+       Uint16 w
+       Uint16 h
+       CODE:
+               RETVAL = (SDL_Rect *) safemalloc (sizeof(SDL_Rect));
+               RETVAL->x = x;
+               RETVAL->y = y;
+               RETVAL->w = w;
+               RETVAL->h = h;
+       OUTPUT:
+               RETVAL
+
+void
+FreeRect ( rect )
+       SDL_Rect *rect
+       CODE:
+               safefree(rect);
+
+Sint16
+RectX ( rect, ... )
+       SDL_Rect *rect
+       CODE:
+               if (items > 1 ) rect->x = SvIV(ST(1)); 
+               RETVAL = rect->x;
+       OUTPUT:
+               RETVAL
+
+Sint16
+RectY ( rect, ... )
+       SDL_Rect *rect
+       CODE:
+               if (items > 1 ) rect->y = SvIV(ST(1)); 
+               RETVAL = rect->y;
+       OUTPUT:
+               RETVAL
+
+Uint16
+RectW ( rect, ... )
+       SDL_Rect *rect
+       CODE:
+               if (items > 1 ) rect->w = SvIV(ST(1)); 
+               RETVAL = rect->w;
+       OUTPUT:
+               RETVAL
+
+Uint16
+RectH ( rect, ... )
+       SDL_Rect *rect
+       CODE:
+               if (items > 1 ) rect->h = SvIV(ST(1)); 
+               RETVAL = rect->h;
+       OUTPUT:
+               RETVAL
+
+AV*
+ListModes ( format, flags )
+       Uint32 flags
+       SDL_PixelFormat *format
+       CODE:
+               SDL_Rect **mode;
+               RETVAL = newAV();
+               mode = SDL_ListModes(format,flags);
+               if (mode == (SDL_Rect**)-1 ) {
+                       av_push(RETVAL,newSVpv("all",0));
+               } else if (! mode ) {
+                       av_push(RETVAL,newSVpv("none",0));
+               } else {
+                       for (;*mode;mode++) {
+                               av_push(RETVAL,newSViv(PTR2IV(*mode)));
+                       }
+               }
+       OUTPUT:
+               RETVAL
+
+
+SDL_Color *
+NewColor ( r, g, b )
+       Uint8 r
+       Uint8 g
+       Uint8 b
+       CODE:
+               RETVAL = (SDL_Color *) safemalloc(sizeof(SDL_Color));
+               RETVAL->r = r;
+               RETVAL->g = g;
+               RETVAL->b = b;
+       OUTPUT:
+               RETVAL
+
+Uint8
+ColorR ( color, ... )
+       SDL_Color *color
+       CODE:
+               if (items > 1 ) color->r = SvIV(ST(1)); 
+               RETVAL = color->r;
+       OUTPUT:
+               RETVAL
+
+Uint8
+ColorG ( color, ... )
+       SDL_Color *color
+       CODE:
+               if (items > 1 ) color->g = SvIV(ST(1)); 
+               RETVAL = color->g;
+       OUTPUT:
+               RETVAL
+
+Uint8
+ColorB ( color, ... )
+       SDL_Color *color
+       CODE:
+               if (items > 1 ) color->b = SvIV(ST(1)); 
+               RETVAL = color->b;
+       OUTPUT:
+               RETVAL
+
+void
+FreeColor ( color )
+       SDL_Color *color
+       CODE:
+               return; safefree(color);
+
+SDL_Palette *
+NewPalette ( number )
+       int number
+       CODE:
+               RETVAL = (SDL_Palette *)safemalloc(sizeof(SDL_Palette));
+               RETVAL->colors = (SDL_Color *)safemalloc(number * 
+                                               sizeof(SDL_Color));
+               RETVAL->ncolors = number;
+       OUTPUT:
+               RETVAL
+
+int
+PaletteNColors ( palette, ... )
+       SDL_Palette *palette
+       CODE:
+               if ( items > 1 ) palette->ncolors = SvIV(ST(1));
+               RETVAL = palette->ncolors;
+       OUTPUT:
+               RETVAL
+
+SDL_Color *
+PaletteColors ( palette, index, ... )
+       SDL_Palette *palette
+       int index
+       CODE:
+               if ( items > 2 ) {
+                       palette->colors[index].r = SvUV(ST(2)); 
+                       palette->colors[index].g = SvUV(ST(3)); 
+                       palette->colors[index].b = SvUV(ST(4)); 
+               }
+               RETVAL = (SDL_Color *)(palette->colors + index);
+       OUTPUT:
+               RETVAL
+
+int
+VideoModeOK ( width, height, bpp, flags )
+       int width
+       int height
+       int bpp
+       Uint32 flags
+       CODE:
+               RETVAL = SDL_VideoModeOK(width,height,bpp,flags);
+       OUTPUT:
+               RETVAL
+
+SDL_Surface *
+SetVideoMode ( width, height, bpp, flags )
+       int width
+       int height
+       int bpp
+       Uint32 flags
+       CODE:
+               RETVAL = SDL_SetVideoMode(width,height,bpp,flags);
+       OUTPUT:
+               RETVAL
+
+void
+UpdateRect ( surface, x, y, w ,h )
+       SDL_Surface *surface
+       int x
+       int y
+       int w
+       int h
+       CODE:
+               SDL_UpdateRect(surface,x,y,w,h);
+
+void
+UpdateRects ( surface, ... )
+       SDL_Surface *surface
+       CODE:
+               SDL_Rect *rects, *temp;
+               int num_rects,i;
+               if ( items < 2 ) return;
+               num_rects = items - 1;  
+               rects = (SDL_Rect *)safemalloc(sizeof(SDL_Rect)*items);
+               for(i=0;i<num_rects;i++) {
+                       temp = (SDL_Rect *)SvIV(ST(i+1));
+                       rects[i].x = temp->x;
+                       rects[i].y = temp->y;
+                       rects[i].w = temp->w;
+                       rects[i].h = temp->h;
+               } 
+               SDL_UpdateRects(surface,num_rects,rects);
+               safefree(rects);
+
+int
+Flip ( surface )
+       SDL_Surface *surface
+       CODE:
+               RETVAL = SDL_Flip(surface);
+       OUTPUT:
+               RETVAL
+
+int
+SetColors ( surface, start, ... )
+       SDL_Surface *surface
+       int start
+       CODE:
+               SDL_Color *colors,*temp;
+               int i, length;
+               if ( items < 3 ) { RETVAL = 0;  goto all_done; }
+               length = items - 2;
+               colors = (SDL_Color *)safemalloc(sizeof(SDL_Color)*(length+1));
+               for ( i = 0; i < length ; i++ ) {
+                       temp = (SDL_Color *)SvIV(ST(i+2));
+                       colors[i].r = temp->r;
+                       colors[i].g = temp->g;
+                       colors[i].b = temp->b;
+               }
+               RETVAL = SDL_SetColors(surface, colors, start, length );
+               safefree(colors);
+all_done:
+       OUTPUT: 
+               RETVAL
+
+Uint32
+MapRGB ( surface, r, g, b )
+       SDL_Surface *surface
+       Uint8 r
+       Uint8 g
+       Uint8 b
+       CODE:
+               RETVAL = SDL_MapRGB(surface->format,r,g,b);
+       OUTPUT:
+               RETVAL
+
+Uint32
+MapRGBA ( surface, r, g, b, a )
+       SDL_Surface *surface
+       Uint8 r
+       Uint8 g
+       Uint8 b
+       Uint8 a
+       CODE:
+               RETVAL = SDL_MapRGBA(surface->format,r,g,b,a);
+       OUTPUT:
+               RETVAL
+
+AV *
+GetRGB ( surface, pixel )
+       SDL_Surface *surface
+       Uint32 pixel
+       CODE:
+               Uint8 r,g,b;
+               SDL_GetRGB(pixel,surface->format,&r,&g,&b);
+               RETVAL = newAV();
+               av_push(RETVAL,newSViv(r));
+               av_push(RETVAL,newSViv(g));
+               av_push(RETVAL,newSViv(b));
+       OUTPUT:
+               RETVAL
+
+AV *
+GetRGBA ( surface, pixel )
+       SDL_Surface *surface
+       Uint32 pixel
+       CODE:
+               Uint8 r,g,b,a;
+               SDL_GetRGBA(pixel,surface->format,&r,&g,&b,&a);
+               RETVAL = newAV();
+               av_push(RETVAL,newSViv(r));
+               av_push(RETVAL,newSViv(g));
+               av_push(RETVAL,newSViv(b));
+               av_push(RETVAL,newSViv(a));
+       OUTPUT:
+               RETVAL
+
+int
+SaveBMP ( surface, filename )
+       SDL_Surface *surface
+       char *filename
+       CODE:
+               RETVAL = SDL_SaveBMP(surface,filename);
+       OUTPUT:
+               RETVAL  
+
+int
+SetColorKey ( surface, flag, key )
+       SDL_Surface *surface
+       Uint32 flag
+       SDL_Color *key
+       CODE:
+               Uint32 pixel = SDL_MapRGB(surface->format,key->r,key->g,key->b);
+               RETVAL = SDL_SetColorKey(surface,flag,pixel);
+       OUTPUT:
+               RETVAL
+
+int
+SetAlpha ( surface, flag, alpha )
+       SDL_Surface *surface
+       Uint32 flag
+       Uint8 alpha
+       CODE:
+               RETVAL = SDL_SetAlpha(surface,flag,alpha);
+       OUTPUT:
+               RETVAL
+
+SDL_Surface *
+DisplayFormat ( surface )
+       SDL_Surface *surface
+       CODE:
+               RETVAL = SDL_DisplayFormat(surface);
+       OUTPUT:
+               RETVAL
+
+SDL_Surface*
+DisplayFormatAlpha ( surface )
+       SDL_Surface *surface
+       CODE:
+               RETVAL = SDL_DisplayFormatAlpha(surface);
+       OUTPUT:
+               RETVAL
+
+SDL_Surface*
+ConvertRGB ( surface )
+       SDL_Surface * surface
+       CODE:
+               SDL_PixelFormat fmt;
+               fmt.palette = NULL;
+               fmt.BitsPerPixel = 24;
+               fmt.BytesPerPixel = 3;
+               fmt.Rmask = 0x000000ff;
+               fmt.Gmask = 0x0000ff00;
+               fmt.Bmask = 0x00ff0000;
+               fmt.Amask = 0x00000000;
+               fmt.Rloss = 0;
+               fmt.Gloss = 0;
+               fmt.Bloss = 0;
+               fmt.Aloss = 0;
+               fmt.Rshift = 0;
+               fmt.Gshift = 8;
+               fmt.Bshift = 16;
+               fmt.Ashift = 24;
+               fmt.colorkey = 0;
+               fmt.alpha = 0;
+               RETVAL = SDL_ConvertSurface(surface,&fmt,surface->flags);
+       OUTPUT:
+               RETVAL
+
+SDL_Surface* 
+ConvertRGBA ( surface )
+       SDL_Surface * surface
+       CODE:
+               SDL_PixelFormat fmt;
+               fmt.palette = NULL;
+               fmt.BitsPerPixel = 32;
+               fmt.BytesPerPixel = 4;
+               fmt.Rmask = 0x000000ff;
+               fmt.Gmask = 0x0000ff00;
+               fmt.Bmask = 0x00ff0000;
+               fmt.Amask = 0xff000000;
+               fmt.Rloss = 0;
+               fmt.Gloss = 0;
+               fmt.Bloss = 0;
+               fmt.Aloss = 0;
+               fmt.Rshift = 0;
+               fmt.Gshift = 8;
+               fmt.Bshift = 16;
+               fmt.Ashift = 24;
+               fmt.colorkey = 0;
+               fmt.alpha = 0;
+               RETVAL = SDL_ConvertSurface(surface,&fmt,surface->flags);
+       OUTPUT:
+               RETVAL
+
+int
+BlitSurface ( src, src_rect, dest, dest_rect )
+       SDL_Surface *src
+       SDL_Rect *src_rect
+       SDL_Surface *dest
+       SDL_Rect *dest_rect
+       CODE:
+               RETVAL = SDL_BlitSurface(src,src_rect,dest,dest_rect);
+       OUTPUT:
+               RETVAL
+
+int
+FillRect ( dest, dest_rect, color )
+       SDL_Surface *dest
+       SDL_Rect *dest_rect
+       SDL_Color *color
+       CODE:
+               Uint32 pixel = SDL_MapRGB(dest->format,color->r,color->g,color->b);
+               RETVAL = SDL_FillRect(dest,dest_rect,pixel);
+       OUTPUT:
+               RETVAL
+
+Uint8
+GetAppState ()
+       CODE:
+               RETVAL = SDL_GetAppState();
+       OUTPUT:
+               RETVAL
+
+
+void
+WMSetCaption ( title, icon )
+       char *title
+       char *icon
+       CODE:
+               SDL_WM_SetCaption(title,icon);
+
+AV *
+WMGetCaption ()
+       CODE:
+               char *title,*icon;
+               SDL_WM_GetCaption(&title,&icon);
+               RETVAL = newAV();
+               av_push(RETVAL,newSVpv(title,0));
+               av_push(RETVAL,newSVpv(icon,0));
+       OUTPUT:
+               RETVAL
+
+void
+WMSetIcon ( icon )
+       SDL_Surface *icon
+       CODE:
+               SDL_WM_SetIcon(icon,NULL);
+
+void
+WarpMouse ( x, y )
+       Uint16 x
+       Uint16 y
+       CODE:
+               SDL_WarpMouse(x,y);
+
+AV*
+GetMouseState ()
+       CODE:
+               Uint8 mask;
+               int x;
+               int y;
+               mask = SDL_GetMouseState(&x,&y);
+               RETVAL = newAV();
+               av_push(RETVAL,newSViv(mask));
+               av_push(RETVAL,newSViv(x));
+               av_push(RETVAL,newSViv(y));
+       OUTPUT:
+               RETVAL  
+
+AV*
+GetRelativeMouseState ()
+       CODE:
+               Uint8 mask;
+               int x;
+               int y;
+               mask = SDL_GetRelativeMouseState(&x,&y);
+               RETVAL = newAV();
+               av_push(RETVAL,newSViv(mask));
+               av_push(RETVAL,newSViv(x));
+               av_push(RETVAL,newSViv(y));
+       OUTPUT:
+               RETVAL  
+
+SDL_Cursor *
+NewCursor ( data, mask, x ,y )
+       SDL_Surface *data
+       SDL_Surface *mask
+       int x
+       int y
+       CODE:
+               RETVAL = SDL_CreateCursor((Uint8*)data->pixels,
+                               (Uint8*)mask->pixels,data->w,data->h,x,y);
+       OUTPUT:
+               RETVAL
+
+void
+FreeCursor ( cursor )
+       SDL_Cursor *cursor
+       CODE:
+               SDL_FreeCursor(cursor);
+
+void
+SetCursor ( cursor )
+       SDL_Cursor *cursor
+       CODE:
+               SDL_SetCursor(cursor);
+
+SDL_Cursor *
+GetCursor ()
+       CODE:
+               RETVAL = SDL_GetCursor();
+       OUTPUT:
+               RETVAL
+
+int
+ShowCursor ( toggle )
+       int toggle
+       CODE:
+               RETVAL = SDL_ShowCursor(toggle);
+       OUTPUT: 
+               RETVAL
+
+SDL_AudioSpec *
+NewAudioSpec ( freq, format, channels, samples )
+       int freq
+       Uint16 format
+       Uint8 channels
+       Uint16 samples
+       CODE:
+               RETVAL = (SDL_AudioSpec *)safemalloc(sizeof(SDL_AudioSpec));
+               RETVAL->freq = freq;
+               RETVAL->format = format;
+               RETVAL->channels = channels;
+               RETVAL->samples = samples;
+       OUTPUT:
+               RETVAL
+
+void
+FreeAudioSpec ( spec )
+       SDL_AudioSpec *spec
+       CODE:
+               safefree(spec);
+
+SDL_AudioCVT *
+NewAudioCVT ( src_format, src_channels, src_rate, dst_format, dst_channels, dst_rate)
+       Uint16 src_format
+       Uint8 src_channels
+       int src_rate
+       Uint16 dst_format
+       Uint8 dst_channels
+       int dst_rate
+       CODE:
+               RETVAL = (SDL_AudioCVT *)safemalloc(sizeof(SDL_AudioCVT));
+               if (SDL_BuildAudioCVT(RETVAL,src_format, src_channels, src_rate,
+                       dst_format, dst_channels, dst_rate)) { 
+                       safefree(RETVAL); RETVAL = NULL; }
+       OUTPUT:
+               RETVAL
+
+void
+FreeAudioCVT ( cvt )
+       SDL_AudioCVT *cvt
+       CODE:
+               safefree(cvt);
+
+int
+ConvertAudioData ( cvt, data, len )
+       SDL_AudioCVT *cvt
+       Uint8 *data
+       int len
+       CODE:
+               cvt->len = len;
+               cvt->buf = (Uint8*) safemalloc(cvt->len*cvt->len_mult);
+               memcpy(cvt->buf,data,cvt->len);
+               RETVAL = SDL_ConvertAudio(cvt);
+       OUTPUT:
+               RETVAL                  
+
+int
+OpenAudio ( spec, callback )
+       SDL_AudioSpec *spec
+       SV* callback
+       CODE:
+               spec->userdata = (void*)callback;
+               spec->callback = sdl_perl_audio_callback;
+               RETVAL = SDL_OpenAudio(spec,NULL);
+       OUTPUT:
+               RETVAL
+
+Uint32
+GetAudioStatus ()
+       CODE:
+               RETVAL = SDL_GetAudioStatus ();
+       OUTPUT:
+               RETVAL
+
+void
+PauseAudio ( p_on )
+       int p_on
+       CODE:
+               SDL_PauseAudio(p_on);
+       
+void
+LockAudio ()
+       CODE:
+               SDL_LockAudio();
+
+void
+UnlockAudio ()
+       CODE:
+               SDL_UnlockAudio();
+
+void
+CloseAudio ()
+       CODE:
+               SDL_CloseAudio();
+
+void
+FreeWAV ( buf )
+       Uint8 *buf
+       CODE:
+               SDL_FreeWAV(buf);
+
+AV *
+LoadWAV ( filename, spec )
+       char *filename
+       SDL_AudioSpec *spec
+       CODE:
+               SDL_AudioSpec *temp;
+               Uint8 *buf;
+               Uint32 len;
+
+               RETVAL = newAV();
+               temp = SDL_LoadWAV(filename,spec,&buf,&len);
+               if ( ! temp ) goto error;
+               av_push(RETVAL,newSViv(PTR2IV(temp)));
+               av_push(RETVAL,newSViv(PTR2IV(buf)));
+               av_push(RETVAL,newSViv(len));
+error:
+       OUTPUT:
+               RETVAL
+       
+#ifdef HAVE_SDL_MIXER
+
+void
+MixAudio ( dst, src, len, volume )
+       Uint8 *dst
+       Uint8 *src
+       Uint32 len
+       int volume
+       CODE:
+               SDL_MixAudio(dst,src,len,volume);
+
+int
+MixOpenAudio ( frequency, format, channels, chunksize )
+       int frequency
+       Uint16 format
+       int channels
+       int chunksize   
+       CODE:
+               RETVAL = Mix_OpenAudio(frequency, format, channels, chunksize);
+       OUTPUT:
+               RETVAL
+
+int
+MixAllocateChannels ( number )
+       int number
+       CODE:
+               RETVAL = Mix_AllocateChannels(number);
+       OUTPUT:
+               RETVAL
+
+AV *
+MixQuerySpec ()
+       CODE:
+               int freq, channels, status;
+               Uint16 format;
+               status = Mix_QuerySpec(&freq,&format,&channels);
+               RETVAL = newAV();
+               av_push(RETVAL,newSViv(status));
+               av_push(RETVAL,newSViv(freq));
+               av_push(RETVAL,newSViv(format));
+               av_push(RETVAL,newSViv(channels));
+       OUTPUT:
+               RETVAL
+
+Mix_Chunk *
+MixLoadWAV ( filename )
+       char *filename
+       CODE:
+               RETVAL = Mix_LoadWAV(filename);
+       OUTPUT:
+               RETVAL
+
+Mix_Music *
+MixLoadMusic ( filename )
+       char *filename
+       CODE:
+               RETVAL = Mix_LoadMUS(filename);
+       OUTPUT:
+               RETVAL
+
+Mix_Chunk *
+MixQuickLoadWAV ( buf )
+       Uint8 *buf
+       CODE:
+               RETVAL = Mix_QuickLoad_WAV(buf);
+       OUTPUT:
+               RETVAL
+
+void
+MixFreeChunk( chunk )
+       Mix_Chunk *chunk
+       CODE:
+               Mix_FreeChunk(chunk);
+
+void
+MixFreeMusic ( music )
+       Mix_Music *music
+       CODE:
+               Mix_FreeMusic(music);
+
+void
+MixSetPostMixCallback ( func, arg )
+       void *func
+       void *arg
+       CODE:
+               Mix_SetPostMix(func,arg);
+
+void*
+PerlMixMusicHook ()
+       CODE:
+               RETVAL = sdl_perl_music_callback;
+       OUTPUT:
+               RETVAL
+
+void
+MixSetMusicHook ( func, arg )
+       void *func
+       void *arg
+       CODE:
+               Mix_HookMusic(func,arg);
+
+void
+MixSetMusicFinishedHook ( func )
+       void *func
+       CODE:
+               mix_music_finished_cv = func;
+               Mix_HookMusicFinished(sdl_perl_music_finished_callback);
+
+void *
+MixGetMusicHookData ()
+       CODE:
+               RETVAL = Mix_GetMusicHookData();
+       OUTPUT:
+               RETVAL
+
+int
+MixReverseChannels ( number )
+       int number
+       CODE:
+               RETVAL = Mix_ReserveChannels ( number );
+       OUTPUT:
+               RETVAL
+
+int
+MixGroupChannel ( which, tag )
+       int which
+       int tag
+       CODE:
+               RETVAL = Mix_GroupChannel(which,tag);
+       OUTPUT:
+               RETVAL
+
+int
+MixGroupChannels ( from, to, tag )
+       int from
+       int to
+       int tag
+       CODE:
+               RETVAL = Mix_GroupChannels(from,to,tag);
+       OUTPUT:
+               RETVAL
+
+int
+MixGroupAvailable ( tag )
+       int tag
+       CODE:
+               RETVAL = Mix_GroupAvailable(tag);
+       OUTPUT:
+               RETVAL
+
+int
+MixGroupCount ( tag )
+       int tag
+       CODE:
+               RETVAL = Mix_GroupCount(tag);
+       OUTPUT:
+               RETVAL
+
+int
+MixGroupOldest ( tag )
+       int tag
+       CODE:
+               RETVAL = Mix_GroupOldest(tag);
+       OUTPUT:
+               RETVAL
+
+int
+MixGroupNewer ( tag )
+       int tag
+       CODE:
+               RETVAL = Mix_GroupNewer(tag);
+       OUTPUT:
+               RETVAL
+
+int
+MixPlayChannel ( channel, chunk, loops )
+       int channel
+       Mix_Chunk *chunk
+       int loops
+       CODE:
+               RETVAL = Mix_PlayChannel(channel,chunk,loops);
+       OUTPUT:
+               RETVAL
+
+int
+MixPlayChannelTimed ( channel, chunk, loops, ticks )
+       int channel
+       Mix_Chunk *chunk
+       int loops
+       int ticks
+       CODE:
+               RETVAL = Mix_PlayChannelTimed(channel,chunk,loops,ticks);
+       OUTPUT:
+               RETVAL
+
+int
+MixPlayMusic ( music, loops )
+       Mix_Music *music
+       int loops
+       CODE:
+               RETVAL = Mix_PlayMusic(music,loops);
+       OUTPUT:
+               RETVAL
+
+int
+MixFadeInChannel ( channel, chunk, loops, ms )
+       int channel
+       Mix_Chunk *chunk
+       int loops
+       int ms
+       CODE:
+               RETVAL = Mix_FadeInChannel(channel,chunk,loops,ms);
+       OUTPUT:
+               RETVAL
+
+int
+MixFadeInChannelTimed ( channel, chunk, loops, ms, ticks )
+       int channel
+       Mix_Chunk *chunk
+       int loops
+       int ticks
+       int ms
+       CODE:
+               RETVAL = Mix_FadeInChannelTimed(channel,chunk,loops,ms,ticks);
+       OUTPUT:
+               RETVAL
+
+int
+MixFadeInMusic ( music, loops, ms )
+       Mix_Music *music
+       int loops
+       int ms
+       CODE:
+               RETVAL = Mix_FadeInMusic(music,loops,ms);
+       OUTPUT:
+               RETVAL
+
+int
+MixVolume ( channel, volume )
+       int channel
+       int volume
+       CODE:   
+               RETVAL = Mix_Volume(channel,volume);
+       OUTPUT:
+               RETVAL
+
+int
+MixVolumeChunk ( chunk, volume )
+       Mix_Chunk *chunk
+       int volume
+       CODE:
+               RETVAL = Mix_VolumeChunk(chunk,volume);
+       OUTPUT:
+               RETVAL
+
+int
+MixVolumeMusic ( volume )
+       int volume
+       CODE:
+               RETVAL = Mix_VolumeMusic(volume);
+       OUTPUT:
+               RETVAL
+
+int
+MixHaltChannel ( channel )
+       int channel
+       CODE:
+               RETVAL = Mix_HaltChannel(channel);
+       OUTPUT:
+               RETVAL
+
+int
+MixHaltGroup ( tag )
+       int tag
+       CODE:
+               RETVAL = Mix_HaltGroup(tag);
+       OUTPUT:
+               RETVAL
+
+int
+MixHaltMusic ()
+       CODE:
+               RETVAL = Mix_HaltMusic();
+       OUTPUT:
+               RETVAL
+
+int
+MixExpireChannel ( channel, ticks )
+       int channel
+       int ticks
+       CODE:
+               RETVAL = Mix_ExpireChannel ( channel,ticks);
+       OUTPUT:
+               RETVAL
+
+int
+MixFadeOutChannel ( which, ms )
+       int which
+       int ms
+       CODE:
+               RETVAL = Mix_FadeOutChannel(which,ms);
+       OUTPUT:
+               RETVAL
+
+int
+MixFadeOutGroup ( which, ms )
+       int which
+       int ms
+       CODE:
+               RETVAL = Mix_FadeOutGroup(which,ms);
+       OUTPUT:
+               RETVAL
+
+int
+MixFadeOutMusic ( ms )
+       int ms
+       CODE:
+               RETVAL = Mix_FadeOutMusic(ms);
+       OUTPUT:
+               RETVAL
+
+Mix_Fading
+MixFadingMusic()
+       CODE:
+               RETVAL = Mix_FadingMusic();
+       OUTPUT:
+               RETVAL
+
+Mix_Fading
+MixFadingChannel( which )
+       int which
+       CODE:
+               RETVAL = Mix_FadingChannel(which);
+       OUTPUT:
+               RETVAL
+
+void
+MixPause ( channel )
+       int channel
+       CODE:
+               Mix_Pause(channel);
+
+void
+MixResume ( channel )
+       int channel
+       CODE:
+               Mix_Resume(channel);
+
+int
+MixPaused ( channel )
+       int channel
+       CODE:
+               RETVAL = Mix_Paused(channel);
+       OUTPUT:
+               RETVAL
+
+void
+MixPauseMusic ()
+       CODE:
+               Mix_PauseMusic();
+
+void
+MixResumeMusic ()
+       CODE:
+               Mix_ResumeMusic();
+
+void
+MixRewindMusic ()
+       CODE:
+               Mix_RewindMusic();
+
+int
+MixPausedMusic ()
+       CODE:
+               RETVAL = Mix_PausedMusic();
+       OUTPUT:
+               RETVAL
+
+int
+MixPlaying( channel )
+       int channel     
+       CODE:
+               RETVAL = Mix_Playing(channel);
+       OUTPUT:
+               RETVAL
+
+int
+MixPlayingMusic()
+       CODE:
+               RETVAL = Mix_PlayingMusic();
+       OUTPUT:
+               RETVAL
+
+
+void
+MixCloseAudio ()
+       CODE:
+               Mix_CloseAudio();
+
+#endif
+
+int
+GLLoadLibrary ( path )
+       char *path
+       CODE:
+               RETVAL = SDL_GL_LoadLibrary(path);
+       OUTPUT:
+               RETVAL
+
+void*
+GLGetProcAddress ( proc )
+       char *proc
+       CODE:
+               RETVAL = SDL_GL_GetProcAddress(proc);
+       OUTPUT:
+               RETVAL
+
+int
+GLSetAttribute ( attr,  value )
+       int        attr
+       int        value
+       CODE:
+               RETVAL = SDL_GL_SetAttribute(attr, value);
+       OUTPUT:
+               RETVAL
+
+AV *
+GLGetAttribute ( attr )
+       int        attr
+       CODE:
+               int value;
+               RETVAL = newAV();
+               av_push(RETVAL,newSViv(SDL_GL_GetAttribute(attr, &value)));
+               av_push(RETVAL,newSViv(value));
+       OUTPUT:
+               RETVAL
+
+void
+GLSwapBuffers ()
+       CODE:
+               SDL_GL_SwapBuffers ();
+
+
+int
+BigEndian ()
+       CODE:
+               RETVAL = (SDL_BYTEORDER == SDL_BIG_ENDIAN);
+       OUTPUT:
+               RETVAL
+
+int
+NumJoysticks ()
+       CODE:
+               RETVAL = SDL_NumJoysticks();
+       OUTPUT:
+               RETVAL
+
+char *
+JoystickName ( index )
+       int index
+       CODE:
+               RETVAL = (char*)SDL_JoystickName(index);
+       OUTPUT:
+               RETVAL
+
+SDL_Joystick *
+JoystickOpen ( index ) 
+       int index
+       CODE:
+               RETVAL = SDL_JoystickOpen(index);
+       OUTPUT:
+               RETVAL
+
+int
+JoystickOpened ( index )
+       int index
+       CODE:
+               RETVAL = SDL_JoystickOpened(index);
+       OUTPUT:
+               RETVAL
+
+int
+JoystickIndex ( joystick )
+       SDL_Joystick *joystick
+       CODE:
+               RETVAL = SDL_JoystickIndex(joystick);
+       OUTPUT:
+               RETVAL
+
+int
+JoystickNumAxes ( joystick )
+       SDL_Joystick *joystick
+       CODE:
+               RETVAL = SDL_JoystickNumAxes(joystick);
+       OUTPUT:
+               RETVAL
+
+int
+JoystickNumBalls ( joystick )
+       SDL_Joystick *joystick
+       CODE:
+               RETVAL = SDL_JoystickNumBalls(joystick);
+       OUTPUT:
+               RETVAL
+
+int
+JoystickNumHats ( joystick )
+       SDL_Joystick *joystick
+       CODE:
+               RETVAL = SDL_JoystickNumHats(joystick);
+       OUTPUT:
+               RETVAL
+
+int
+JoystickNumButtons ( joystick )
+       SDL_Joystick *joystick
+       CODE:
+               RETVAL = SDL_JoystickNumButtons(joystick);
+       OUTPUT:
+               RETVAL
+
+void
+JoystickUpdate ()
+       CODE:
+               SDL_JoystickUpdate();
+
+Sint16
+JoystickGetAxis ( joystick, axis )
+       SDL_Joystick *joystick
+       int axis
+       CODE:
+               RETVAL = SDL_JoystickGetAxis(joystick,axis);
+       OUTPUT:
+               RETVAL
+
+Uint8
+JoystickGetHat ( joystick, hat )
+       SDL_Joystick *joystick
+       int hat 
+       CODE:
+               RETVAL = SDL_JoystickGetHat(joystick,hat);
+       OUTPUT:
+               RETVAL
+
+Uint8
+JoystickGetButton ( joystick, button)
+       SDL_Joystick *joystick
+       int button 
+       CODE:
+               RETVAL = SDL_JoystickGetButton(joystick,button);
+       OUTPUT:
+               RETVAL
+
+AV *
+JoystickGetBall ( joystick, ball )
+       SDL_Joystick *joystick
+       int ball 
+       CODE:
+               int success,dx,dy;
+               success = SDL_JoystickGetBall(joystick,ball,&dx,&dy);
+               RETVAL = newAV();
+               av_push(RETVAL,newSViv(success));
+               av_push(RETVAL,newSViv(dx));
+               av_push(RETVAL,newSViv(dy));
+       OUTPUT:
+               RETVAL  
+
+void
+JoystickClose ( joystick )
+       SDL_Joystick *joystick
+       CODE:
+               SDL_JoystickClose(joystick);
+
+Sint16
+JoyAxisEventWhich ( e )
+       SDL_Event *e
+       CODE:
+               RETVAL = e->jaxis.which;
+       OUTPUT:
+               RETVAL
+
+Uint8
+JoyAxisEventAxis ( e )
+        SDL_Event *e
+        CODE:
+                RETVAL = e->jaxis.axis;
+        OUTPUT:
+                RETVAL
+
+Uint8
+JoyAxisEventValue ( e )
+        SDL_Event *e
+        CODE:
+                RETVAL = e->jaxis.value;
+        OUTPUT:
+                RETVAL
+
+Uint8
+JoyButtonEventWhich ( e )
+        SDL_Event *e
+        CODE:
+                RETVAL = e->jbutton.which;
+        OUTPUT:
+                RETVAL
+
+Uint8
+JoyButtonEventButton ( e )
+        SDL_Event *e
+        CODE:
+                RETVAL = e->jbutton.button;
+        OUTPUT:
+                RETVAL
+
+Uint8
+JoyButtonEventState ( e )
+        SDL_Event *e
+        CODE:
+                RETVAL = e->jbutton.state;
+        OUTPUT:
+                RETVAL
+       
+Uint8
+JoyHatEventWhich ( e )
+        SDL_Event *e
+        CODE:
+                RETVAL = e->jhat.which;
+        OUTPUT:
+                RETVAL
+
+Uint8
+JoyHatEventHat ( e )
+        SDL_Event *e
+        CODE:
+                RETVAL = e->jhat.hat;
+        OUTPUT:
+                RETVAL
+
+Uint8
+JoyHatEventValue ( e )
+        SDL_Event *e
+        CODE:
+                RETVAL = e->jhat.value;
+        OUTPUT:
+                RETVAL
+
+Uint8
+JoyBallEventWhich ( e )
+        SDL_Event *e
+        CODE: 
+                RETVAL = e->jball.which;
+        OUTPUT:
+                RETVAL
+
+Uint8
+JoyBallEventBall ( e )
+        SDL_Event *e
+        CODE:
+                RETVAL = e->jball.ball;
+        OUTPUT:
+                RETVAL
+
+Sint16
+JoyBallEventXrel ( e )
+        SDL_Event *e
+        CODE:
+                RETVAL = e->jball.xrel;
+        OUTPUT:
+                RETVAL
+
+Sint16
+JoyBallEventYrel ( e )
+        SDL_Event *e
+        CODE:
+                RETVAL = e->jball.yrel;
+        OUTPUT:
+                RETVAL
+
+void
+SetClipRect ( surface, rect )
+       SDL_Surface *surface
+       SDL_Rect *rect
+       CODE:
+               SDL_SetClipRect(surface,rect);
+       
+SDL_Rect*
+GetClipRect ( surface )
+       SDL_Surface *surface
+       CODE:
+               RETVAL = (SDL_Rect*) safemalloc(sizeof(SDL_Rect));
+               SDL_GetClipRect(surface,RETVAL);
+       OUTPUT:
+               RETVAL
+
+
+#ifdef HAVE_SDL_NET
+
+int
+NetInit ()
+       CODE:
+               RETVAL = SDLNet_Init();
+       OUTPUT:
+               RETVAL
+
+void
+NetQuit ()
+       CODE:
+               SDLNet_Quit();
+
+IPaddress*
+NetNewIPaddress ( host, port )
+       Uint32 host
+       Uint16 port
+       CODE:
+               RETVAL = (IPaddress*) safemalloc(sizeof(IPaddress));
+               RETVAL->host = host;
+               RETVAL->port = port;
+       OUTPUT:
+               RETVAL
+
+Uint32
+NetIPaddressHost ( ip )
+       IPaddress *ip
+       CODE:
+               RETVAL = ip->host;
+       OUTPUT:
+               RETVAL
+
+Uint16
+NetIPaddressPort ( ip )
+       IPaddress *ip
+       CODE:
+               RETVAL = ip->port;
+       OUTPUT:
+               RETVAL
+
+void
+NetFreeIPaddress ( ip )
+       IPaddress *ip
+       CODE:
+               safefree(ip);
+
+const char*
+NetResolveIP ( address )
+       IPaddress *address
+       CODE:
+               RETVAL = SDLNet_ResolveIP(address);
+       OUTPUT:
+               RETVAL
+
+int
+NetResolveHost ( address, host, port )
+       IPaddress *address
+       const char *host
+       Uint16 port
+       CODE:
+               RETVAL = SDLNet_ResolveHost(address,host,port);
+       OUTPUT:
+               RETVAL
+       
+TCPsocket
+NetTCPOpen ( ip )
+       IPaddress *ip
+       CODE:
+               RETVAL = SDLNet_TCP_Open(ip);
+       OUTPUT:
+               RETVAL
+
+TCPsocket
+NetTCPAccept ( server )
+       TCPsocket server
+       CODE:
+               RETVAL = SDLNet_TCP_Accept(server);
+       OUTPUT:
+               RETVAL
+
+IPaddress*
+NetTCPGetPeerAddress ( sock )
+       TCPsocket sock
+       CODE:
+               RETVAL = SDLNet_TCP_GetPeerAddress(sock);
+       OUTPUT:
+               RETVAL
+
+int
+NetTCPSend ( sock, data, len  )
+       TCPsocket sock
+       void *data
+       int len
+       CODE:
+               RETVAL = SDLNet_TCP_Send(sock,data,len);
+       OUTPUT:
+               RETVAL
+
+AV*
+NetTCPRecv ( sock, maxlen )
+       TCPsocket sock
+       int maxlen
+       CODE:
+               int status;
+               void *buffer;
+               buffer = safemalloc(maxlen);
+               RETVAL = newAV();
+               status = SDLNet_TCP_Recv(sock,buffer,maxlen);
+               av_push(RETVAL,newSViv(status));
+               av_push(RETVAL,newSVpvn((char*)buffer,maxlen));
+       OUTPUT:
+               RETVAL  
+       
+void
+NetTCPClose ( sock )
+       TCPsocket sock
+       CODE:
+               SDLNet_TCP_Close(sock);
+
+UDPpacket*
+NetAllocPacket ( size )
+       int size
+       CODE:
+               RETVAL = SDLNet_AllocPacket(size);
+       OUTPUT:
+               RETVAL
+
+UDPpacket**
+NetAllocPacketV ( howmany, size )
+       int howmany
+       int size
+       CODE:
+               RETVAL = SDLNet_AllocPacketV(howmany,size);
+       OUTPUT:
+               RETVAL
+
+int
+NetResizePacket ( packet, newsize )
+       UDPpacket *packet
+       int newsize
+       CODE:
+               RETVAL = SDLNet_ResizePacket(packet,newsize);
+       OUTPUT:
+               RETVAL
+
+void
+NetFreePacket ( packet )
+       UDPpacket *packet
+       CODE:
+               SDLNet_FreePacket(packet);
+
+void
+NetFreePacketV ( packet )
+       UDPpacket **packet
+       CODE:
+               SDLNet_FreePacketV(packet);
+
+UDPsocket
+NetUDPOpen ( port )
+       Uint16 port
+       CODE:
+               RETVAL = SDLNet_UDP_Open(port);
+       OUTPUT:
+               RETVAL
+
+int
+NetUDPBind ( sock, channel, address )
+       UDPsocket sock
+       int channel
+       IPaddress *address
+       CODE:
+               RETVAL = SDLNet_UDP_Bind(sock,channel,address);
+       OUTPUT:
+               RETVAL
+
+void
+NetUDPUnbind ( sock, channel )
+       UDPsocket sock
+       int channel
+       CODE:
+               SDLNet_UDP_Unbind(sock,channel);
+
+IPaddress*
+NetUDPGetPeerAddress ( sock, channel )
+       UDPsocket sock
+       int channel
+       CODE:
+               RETVAL = SDLNet_UDP_GetPeerAddress(sock,channel);
+       OUTPUT:
+               RETVAL
+
+int
+NetUDPSendV ( sock, packets, npackets )
+       UDPsocket sock
+       UDPpacket **packets
+       int npackets
+       CODE:
+               RETVAL = SDLNet_UDP_SendV(sock,packets,npackets);
+       OUTPUT:
+               RETVAL
+
+int
+NetUDPSend ( sock, channel, packet )
+       UDPsocket sock
+       int channel
+       UDPpacket *packet 
+       CODE:
+               RETVAL = SDLNet_UDP_Send(sock,channel,packet);
+       OUTPUT:
+               RETVAL
+
+int
+NetUDPRecvV ( sock, packets )
+       UDPsocket sock
+       UDPpacket **packets
+       CODE:
+               RETVAL = SDLNet_UDP_RecvV(sock,packets);
+       OUTPUT:
+               RETVAL
+
+int
+NetUDPRecv ( sock, packet )
+       UDPsocket sock
+       UDPpacket *packet
+       CODE:
+               RETVAL = SDLNet_UDP_Recv(sock,packet);
+       OUTPUT:
+               RETVAL
+
+void
+NetUDPClose ( sock )
+       UDPsocket sock
+       CODE:
+               SDLNet_UDP_Close(sock);
+
+SDLNet_SocketSet
+NetAllocSocketSet ( maxsockets )
+       int maxsockets
+       CODE:
+               RETVAL = SDLNet_AllocSocketSet(maxsockets);
+       OUTPUT:
+               RETVAL
+
+int
+NetTCP_AddSocket ( set, sock )
+       SDLNet_SocketSet set
+       TCPsocket sock
+       CODE:
+               RETVAL = SDLNet_TCP_AddSocket(set,sock);
+       OUTPUT:
+               RETVAL
+
+int
+NetUDP_AddSocket ( set, sock )
+       SDLNet_SocketSet set
+       UDPsocket sock
+       CODE:
+               RETVAL = SDLNet_UDP_AddSocket(set,sock);
+       OUTPUT:
+               RETVAL
+
+int
+NetTCP_DelSocket ( set, sock )
+       SDLNet_SocketSet set
+       TCPsocket sock
+       CODE:
+               RETVAL = SDLNet_TCP_DelSocket(set,sock);
+       OUTPUT:
+               RETVAL
+
+int
+NetUDP_DelSocket ( set, sock )
+       SDLNet_SocketSet set
+       UDPsocket sock
+       CODE:
+               RETVAL = SDLNet_UDP_DelSocket(set,sock);
+       OUTPUT:
+               RETVAL
+
+int
+NetCheckSockets ( set, timeout )
+       SDLNet_SocketSet set
+       Uint32 timeout
+       CODE:
+               RETVAL = SDLNet_CheckSockets(set,timeout);
+       OUTPUT:
+               RETVAL
+
+int
+NetSocketReady ( sock )
+       SDLNet_GenericSocket sock
+       CODE:
+               RETVAL = SDLNet_SocketReady(sock);
+       OUTPUT:
+               RETVAL
+
+void
+NetFreeSocketSet ( set )
+       SDLNet_SocketSet set
+       CODE:
+               SDLNet_FreeSocketSet(set);
+
+void
+NetWrite16 ( value, area )
+       Uint16 value
+       void *area
+       CODE:
+               SDLNet_Write16(value,area);
+
+void
+NetWrite32 ( value, area )
+       Uint32 value
+       void *area
+       CODE:
+               SDLNet_Write32(value,area);
+       
+Uint16
+NetRead16 ( area )
+       void *area
+       CODE:
+               RETVAL = SDLNet_Read16(area);
+       OUTPUT:
+               RETVAL
+
+Uint32
+NetRead32 ( area )
+       void *area
+       CODE:
+               RETVAL = SDLNet_Read32(area);
+       OUTPUT:
+               RETVAL
+
+#endif 
+
+#ifdef HAVE_SDL_TTF
+
+int
+TTFInit ()
+       CODE:
+               RETVAL = TTF_Init();
+       OUTPUT:
+               RETVAL
+
+void
+TTFQuit ()
+       CODE:
+               TTF_Quit();
+
+TTF_Font*
+TTFOpenFont ( file, ptsize )
+       char *file
+       int ptsize
+       CODE:
+               RETVAL = TTF_OpenFont(file,ptsize);
+       OUTPUT:
+               RETVAL
+
+int
+TTFGetFontStyle ( font )
+       TTF_Font *font
+       CODE:
+               RETVAL = TTF_GetFontStyle(font);
+       OUTPUT:
+               RETVAL
+
+void
+TTFSetFontStyle ( font, style )
+       TTF_Font *font
+       int style
+       CODE:
+               TTF_SetFontStyle(font,style);
+       
+int
+TTFFontHeight ( font )
+       TTF_Font *font
+       CODE:
+               RETVAL = TTF_FontHeight(font);
+       OUTPUT:
+               RETVAL
+
+int
+TTFFontAscent ( font )
+       TTF_Font *font
+       CODE:
+               RETVAL = TTF_FontAscent(font);
+       OUTPUT:
+               RETVAL
+
+int
+TTFFontDescent ( font )
+       TTF_Font *font
+       CODE:
+               RETVAL = TTF_FontDescent(font);
+       OUTPUT:
+               RETVAL
+
+int
+TTFFontLineSkip ( font )
+       TTF_Font *font
+       CODE:
+               RETVAL = TTF_FontLineSkip(font);
+       OUTPUT:
+               RETVAL
+
+AV*
+TTFGlyphMetrics ( font, ch )
+       TTF_Font *font
+       Uint16 ch
+       CODE:
+               int minx, miny, maxx, maxy, advance;
+               RETVAL = newAV();
+               TTF_GlyphMetrics(font, ch, &minx, &miny, &maxx, &maxy, &advance);
+               av_push(RETVAL,newSViv(minx));
+               av_push(RETVAL,newSViv(miny));
+               av_push(RETVAL,newSViv(maxx));
+               av_push(RETVAL,newSViv(maxy));
+               av_push(RETVAL,newSViv(advance));
+       OUTPUT:
+               RETVAL
+
+AV*
+TTFSizeText ( font, text )
+       TTF_Font *font
+       char *text
+       CODE:
+               int w,h;
+               RETVAL = newAV();
+               TTF_SizeText(font,text,&w,&h);
+               av_push(RETVAL,newSViv(w));
+               av_push(RETVAL,newSViv(h));
+       OUTPUT:
+               RETVAL
+
+AV*
+TTFSizeUTF8 ( font, text )
+       TTF_Font *font
+       char *text
+       CODE:
+               int w,h;
+               RETVAL = newAV();
+               TTF_SizeUTF8(font,text,&w,&h);
+               av_push(RETVAL,newSViv(w));
+               av_push(RETVAL,newSViv(h));
+       OUTPUT:
+               RETVAL
+
+AV*
+TTFSizeUNICODE ( font, text )
+       TTF_Font *font
+       const Uint16 *text
+       CODE:
+               int w,h;
+               RETVAL = newAV();
+               TTF_SizeUNICODE(font,text,&w,&h);
+               av_push(RETVAL,newSViv(w));
+               av_push(RETVAL,newSViv(h));
+       OUTPUT:
+               RETVAL
+
+SDL_Surface*
+TTFRenderTextSolid ( font, text, fg )
+       TTF_Font *font
+       char *text
+       SDL_Color *fg
+       CODE:
+               RETVAL = TTF_RenderText_Solid(font,text,*fg);
+       OUTPUT:
+               RETVAL
+
+SDL_Surface*
+TTFRenderUTF8Solid ( font, text, fg )
+       TTF_Font *font
+       char *text
+       SDL_Color *fg
+       CODE:
+               RETVAL = TTF_RenderUTF8_Solid(font,text,*fg);
+       OUTPUT:
+               RETVAL
+
+SDL_Surface*
+TTFRenderUNICODESolid ( font, text, fg )
+       TTF_Font *font
+       const Uint16 *text
+       SDL_Color *fg
+       CODE:
+               RETVAL = TTF_RenderUNICODE_Solid(font,text,*fg);
+       OUTPUT:
+               RETVAL
+
+SDL_Surface*
+TTFRenderGlyphSolid ( font, ch, fg )
+       TTF_Font *font
+       Uint16 ch
+       SDL_Color *fg
+       CODE:
+               RETVAL = TTF_RenderGlyph_Solid(font,ch,*fg);
+       OUTPUT:
+               RETVAL
+
+SDL_Surface*
+TTFRenderTextShaded ( font, text, fg, bg )
+       TTF_Font *font
+       char *text
+       SDL_Color *fg
+       SDL_Color *bg
+       CODE:
+               RETVAL = TTF_RenderText_Shaded(font,text,*fg,*bg);
+       OUTPUT:
+               RETVAL
+
+SDL_Surface*
+TTFRenderUTF8Shaded( font, text, fg, bg )
+       TTF_Font *font
+       char *text
+       SDL_Color *fg
+       SDL_Color *bg
+       CODE:
+               RETVAL = TTF_RenderUTF8_Shaded(font,text,*fg,*bg);
+       OUTPUT:
+               RETVAL
+
+SDL_Surface*
+TTFRenderUNICODEShaded( font, text, fg, bg )
+       TTF_Font *font
+       const Uint16 *text
+       SDL_Color *fg
+       SDL_Color *bg
+       CODE:
+               RETVAL = TTF_RenderUNICODE_Shaded(font,text,*fg,*bg);
+       OUTPUT:
+               RETVAL
+
+SDL_Surface*
+TTFRenderGlyphShaded ( font, ch, fg, bg )
+       TTF_Font *font
+       Uint16 ch
+       SDL_Color *fg
+       SDL_Color *bg
+       CODE:
+               RETVAL = TTF_RenderGlyph_Shaded(font,ch,*fg,*bg);
+       OUTPUT:
+               RETVAL
+
+SDL_Surface*
+TTFRenderTextBlended( font, text, fg )
+       TTF_Font *font
+       char *text
+       SDL_Color *fg
+       CODE:
+               RETVAL = TTF_RenderText_Blended(font,text,*fg);
+       OUTPUT:
+               RETVAL
+
+SDL_Surface*
+TTFRenderUTF8Blended( font, text, fg )
+       TTF_Font *font
+       char *text
+       SDL_Color *fg
+       CODE:
+               RETVAL = TTF_RenderUTF8_Blended(font,text,*fg);
+       OUTPUT:
+               RETVAL
+
+SDL_Surface*
+TTFRenderUNICODEBlended( font, text, fg )
+       TTF_Font *font
+       const Uint16 *text
+       SDL_Color *fg
+       CODE:
+               RETVAL = TTF_RenderUNICODE_Blended(font,text,*fg);
+       OUTPUT:
+               RETVAL
+
+SDL_Surface*
+TTFRenderGlyphBlended( font, ch, fg )
+       TTF_Font *font
+       Uint16 ch
+       SDL_Color *fg
+       CODE:
+               RETVAL = TTF_RenderGlyph_Blended(font,ch,*fg);
+       OUTPUT:
+               RETVAL
+
+void
+TTFCloseFont ( font )
+       TTF_Font *font
+       CODE:
+               TTF_CloseFont(font);
+
+SDL_Surface*
+TTFPutString ( font, mode, surface, x, y, fg, bg, text )
+       TTF_Font *font
+       int mode
+       SDL_Surface *surface
+       int x
+       int y
+       SDL_Color *fg
+       SDL_Color *bg
+       char *text
+       CODE:
+               SDL_Surface *img;
+               SDL_Rect dest;
+               int w,h;
+               dest.x = x;
+               dest.y = y;
+               RETVAL = NULL;
+               switch (mode) {
+                       case TEXT_SOLID:
+                               img = TTF_RenderText_Solid(font,text,*fg);
+                               TTF_SizeText(font,text,&w,&h);
+                               dest.w = w;
+                               dest.h = h;
+                               break;
+                       case TEXT_SHADED:
+                               img = TTF_RenderText_Shaded(font,text,*fg,*bg);
+                               TTF_SizeText(font,text,&w,&h);
+                               dest.w = w;
+                               dest.h = h;
+                               break;
+                       case TEXT_BLENDED:
+                               img = TTF_RenderText_Blended(font,text,*fg);
+                               TTF_SizeText(font,text,&w,&h);
+                               dest.w = w;
+                               dest.h = h;
+                               break;
+                       case UTF8_SOLID:
+                               img = TTF_RenderUTF8_Solid(font,text,*fg);
+                               TTF_SizeUTF8(font,text,&w,&h);
+                               dest.w = w;
+                               dest.h = h;
+                               break;
+                       case UTF8_SHADED:
+                               img = TTF_RenderUTF8_Shaded(font,text,*fg,*bg);
+                               TTF_SizeUTF8(font,text,&w,&h);
+                               dest.w = w;
+                               dest.h = h;
+                               break;
+                       case UTF8_BLENDED:
+                               img = TTF_RenderUTF8_Blended(font,text,*fg);
+                               TTF_SizeUTF8(font,text,&w,&h);
+                               dest.w = w;
+                               dest.h = h;
+                               break;
+                       case UNICODE_SOLID:
+                               img = TTF_RenderUNICODE_Solid(font,(Uint16*)text,*fg);
+                               TTF_SizeUNICODE(font,(Uint16*)text,&w,&h);
+                               dest.w = w;
+                               dest.h = h;
+                               break;
+                       case UNICODE_SHADED:
+                               img = TTF_RenderUNICODE_Shaded(font,(Uint16*)text,*fg,*bg);
+                               TTF_SizeUNICODE(font,(Uint16*)text,&w,&h);
+                               dest.w = w;
+                               dest.h = h;
+                               break;
+                       case UNICODE_BLENDED:
+                               img = TTF_RenderUNICODE_Blended(font,(Uint16*)text,*fg);
+                               TTF_SizeUNICODE(font,(Uint16*)text,&w,&h);
+                               dest.w = w;
+                               dest.h = h;
+                               break;
+                       default:
+                               img = TTF_RenderText_Shaded(font,text,*fg,*bg);
+                               TTF_SizeText(font,text,&w,&h);
+                               dest.w = w;
+                               dest.h = h;
+               }
+               if ( img && img->format && img->format->palette ) {
+                       SDL_Color *c = &img->format->palette->colors[0];
+                       Uint32 key = SDL_MapRGB( img->format, c->r, c->g, c->b );
+                       SDL_SetColorKey(img,SDL_SRCCOLORKEY,key );
+                       if (0 > SDL_BlitSurface(img,NULL,surface,&dest)) {
+                               SDL_FreeSurface(img);
+                               RETVAL = NULL;  
+                       } else {
+                               RETVAL = img;
+                       }
+               }
+       OUTPUT:
+               RETVAL
+
+#endif
+
+SDL_Overlay*
+CreateYUVOverlay ( width, height, format, display )
+       int width
+       int height
+       Uint32 format
+       SDL_Surface *display
+       CODE:
+               RETVAL = SDL_CreateYUVOverlay ( width, height, format, display );
+       OUTPUT:
+               RETVAL
+
+int
+LockYUVOverlay ( overlay )
+       SDL_Overlay *overlay
+       CODE:
+               RETVAL = SDL_LockYUVOverlay(overlay);
+       OUTPUT:
+               RETVAL
+
+void
+UnlockYUVOverlay ( overlay )
+        SDL_Overlay *overlay
+        CODE:
+                SDL_UnlockYUVOverlay(overlay);
+
+int
+DisplayYUVOverlay ( overlay, dstrect )
+       SDL_Overlay *overlay
+       SDL_Rect *dstrect
+       CODE:
+               RETVAL = SDL_DisplayYUVOverlay ( overlay, dstrect );
+       OUTPUT:
+               RETVAL
+
+void
+FreeYUVOverlay ( overlay )
+        SDL_Overlay *overlay
+        CODE:
+                SDL_FreeYUVOverlay ( overlay );
+
+Uint32
+OverlayFormat ( overlay, ... )
+       SDL_Overlay *overlay
+       CODE:
+               if ( items > 1 ) 
+                       overlay->format = SvIV(ST(1));
+               RETVAL = overlay->format;
+       OUTPUT:
+               RETVAL
+
+int 
+OverlayW ( overlay, ... )
+       SDL_Overlay *overlay
+       CODE:
+               if ( items > 1 ) 
+                       overlay->w = SvIV(ST(1));
+               RETVAL = overlay->w;
+       OUTPUT:
+               RETVAL
+
+int
+OverlayH ( overlay, ... )
+       SDL_Overlay *overlay
+       CODE:
+               if ( items > 1 )
+                       overlay->h = SvIV(ST(1));
+               RETVAL = overlay->h;
+       OUTPUT:
+               RETVAL 
+
+int
+OverlayPlanes ( overlay, ... )
+        SDL_Overlay *overlay
+        CODE:
+                if ( items > 1 )
+                        overlay->planes = SvIV(ST(1));
+                RETVAL = overlay->planes;
+        OUTPUT:
+                RETVAL
+
+Uint32
+OverlayHW ( overlay )
+       SDL_Overlay *overlay
+       CODE:
+               RETVAL = overlay->hw_overlay;
+       OUTPUT:
+               RETVAL
+
+Uint16*
+OverlayPitches ( overlay )
+       SDL_Overlay *overlay
+       CODE:
+               RETVAL = overlay->pitches;
+       OUTPUT:
+               RETVAL
+
+Uint8**
+OverlayPixels ( overlay )
+       SDL_Overlay *overlay
+       CODE:
+               RETVAL = overlay->pixels;
+       OUTPUT:
+               RETVAL
+
+int
+WMToggleFullScreen ( surface )
+       SDL_Surface *surface
+       CODE:
+               RETVAL = SDL_WM_ToggleFullScreen(surface);
+       OUTPUT:
+               RETVAL
+
+Uint32
+WMGrabInput ( mode )
+       Uint32 mode
+       CODE:
+               RETVAL = SDL_WM_GrabInput(mode);
+       OUTPUT:
+               RETVAL
+
+int
+WMIconifyWindow ()
+       CODE:
+               RETVAL = SDL_WM_IconifyWindow();
+       OUTPUT:
+               RETVAL
+
+int
+ResizeEventW ( e )
+       SDL_Event *e
+       CODE:
+               RETVAL = e->resize.w;
+       OUTPUT:
+               RETVAL
+
+int
+ResizeEventH ( e )
+       SDL_Event *e
+       CODE:
+               RETVAL = e->resize.h;
+       OUTPUT:
+               RETVAL
+
+char*
+AudioDriverName ()
+       CODE:
+               char name[32];
+               RETVAL = SDL_AudioDriverName(name,32);
+       OUTPUT:
+               RETVAL
+
+Uint32
+GetKeyState ( k )
+       SDLKey k
+       CODE:
+               if (k >= SDLK_LAST) Perl_croak (aTHX_ "Key out of range");      
+               RETVAL = SDL_GetKeyState(NULL)[k];
+       OUTPUT:
+               RETVAL
+
+#ifdef HAVE_SMPEG
+
+SMPEG_Info *
+NewSMPEGInfo()
+       CODE:   
+               RETVAL = (SMPEG_Info *) safemalloc (sizeof(SMPEG_Info));
+       OUTPUT:
+               RETVAL
+
+void
+FreeSMPEGInfo ( info )
+       SMPEG_Info *info
+       CODE:   
+               safefree(info);
+
+int
+SMPEGInfoHasAudio ( info )
+       SMPEG_Info* info
+       CODE:
+               RETVAL = info->has_audio;
+       OUTPUT:
+               RETVAL
+
+int
+SMPEGInfoHasVideo ( info )
+       SMPEG_Info* info
+       CODE:
+               RETVAL = info->has_video;
+       OUTPUT:
+               RETVAL
+
+int
+SMPEGInfoWidth ( info )
+       SMPEG_Info* info
+       CODE:
+               RETVAL = info->width;
+       OUTPUT:
+               RETVAL
+
+int
+SMPEGInfoHeight ( info )
+       SMPEG_Info* info
+       CODE:
+               RETVAL = info->height;
+       OUTPUT:
+               RETVAL
+
+int
+SMPEGInfoCurrentFrame ( info )
+       SMPEG_Info* info
+       CODE:
+               RETVAL = info->current_frame;
+       OUTPUT:
+               RETVAL
+
+double
+SMPEGInfoCurrentFPS ( info )
+       SMPEG_Info* info
+       CODE:
+               RETVAL = info->current_fps;
+       OUTPUT:
+               RETVAL
+
+int
+SMPEGInfoCurrentAudioFrame ( info )
+       SMPEG_Info* info
+       CODE:
+               RETVAL = info->audio_current_frame;
+       OUTPUT:
+               RETVAL
+
+int
+SMPEGInfoCurrentOffset ( info )
+       SMPEG_Info* info
+       CODE:
+               RETVAL = info->current_offset;
+       OUTPUT:
+               RETVAL
+
+int
+SMPEGInfoTotalSize ( info )
+       SMPEG_Info* info
+       CODE:
+               RETVAL = info->total_size;
+       OUTPUT:
+               RETVAL
+
+double
+SMPEGInfoCurrentTime ( info )
+       SMPEG_Info* info
+       CODE:
+               RETVAL = info->current_time;
+       OUTPUT:
+               RETVAL
+
+double
+SMPEGInfoTotalTime ( info )
+       SMPEG_Info* info
+       CODE:
+               RETVAL = info->total_time;
+       OUTPUT:
+               RETVAL
+
+char *
+SMPEGError ( mpeg )
+       SMPEG* mpeg
+       CODE:   
+               RETVAL = SMPEG_error(mpeg);
+       OUTPUT:
+               RETVAL
+
+SMPEG*
+NewSMPEG ( filename, info, use_audio )
+       char* filename
+       SMPEG_Info* info
+       int use_audio
+       CODE:   
+#ifdef HAVE_SDL_MIXER
+               RETVAL = SMPEG_new(filename,info,0);
+#else
+               RETVAL = SMPEG_new(filename,info,use_audio);
+#endif
+       OUTPUT:
+               RETVAL
+
+void
+FreeSMPEG ( mpeg )
+       SMPEG* mpeg
+       CODE:
+               SMPEG_delete(mpeg);
+
+void
+SMPEGEnableAudio ( mpeg , flag )
+       SMPEG* mpeg
+       int flag
+       CODE:   
+               SMPEG_enableaudio(mpeg,flag);
+#ifdef HAVE_SDL_MIXER
+               sdl_perl_use_smpeg_audio = flag;
+#endif
+
+void
+SMPEGEnableVideo ( mpeg , flag )
+       SMPEG* mpeg
+       int flag
+       CODE:   
+               SMPEG_enablevideo(mpeg,flag);
+
+void
+SMPEGSetVolume ( mpeg , volume )
+       SMPEG* mpeg
+       int volume
+       CODE:   
+               SMPEG_setvolume(mpeg,volume);
+
+void
+SMPEGSetDisplay ( mpeg, dest, surfLock )
+       SMPEG* mpeg
+       SDL_Surface* dest
+       SDL_mutex*  surfLock
+       CODE:
+               SMPEG_setdisplay(mpeg,dest,surfLock,NULL);
+
+void
+SMPEGScaleXY ( mpeg, w, h)
+       SMPEG* mpeg
+       int w
+       int h
+       CODE:
+               SMPEG_scaleXY(mpeg,w,h);
+
+void
+SMPEGScale ( mpeg, scale )
+       SMPEG* mpeg
+       int scale
+       CODE:
+               SMPEG_scale(mpeg,scale);
+
+void
+SMPEGPlay ( mpeg )
+       SMPEG* mpeg
+       CODE:
+                SDL_AudioSpec audiofmt;
+                Uint16 format;
+                int freq, channels;
+#ifdef HAVE_SDL_MIXER
+               if  (sdl_perl_use_smpeg_audio ) {
+                               SMPEG_enableaudio(mpeg, 0);
+                       Mix_QuerySpec(&freq, &format, &channels);
+                       audiofmt.format = format;
+                       audiofmt.freq = freq;
+                       audiofmt.channels = channels;
+                       SMPEG_actualSpec(mpeg, &audiofmt);
+                       Mix_HookMusic(SMPEG_playAudioSDL, mpeg);
+                       SMPEG_enableaudio(mpeg, 1);
+               }
+#endif
+               SMPEG_play(mpeg);
+
+SMPEGstatus
+SMPEGStatus ( mpeg )
+       SMPEG* mpeg
+       CODE:
+               RETVAL = SMPEG_status(mpeg);
+       OUTPUT:
+               RETVAL
+
+void
+SMPEGPause ( mpeg )
+       SMPEG* mpeg
+       CODE:
+               SMPEG_pause(mpeg);
+
+void
+SMPEGLoop ( mpeg, repeat )
+       SMPEG* mpeg
+       int repeat
+       CODE:
+               SMPEG_loop(mpeg,repeat);
+
+void
+SMPEGStop ( mpeg )
+       SMPEG* mpeg
+       CODE:
+               SMPEG_stop(mpeg);
+#ifdef HAVE_SDL_MIXER
+               Mix_HookMusic(NULL, NULL);
+#endif
+
+void
+SMPEGRewind ( mpeg )
+       SMPEG* mpeg
+       CODE:
+               SMPEG_rewind(mpeg);
+
+void
+SMPEGSeek ( mpeg, bytes )
+       SMPEG* mpeg
+       int bytes
+       CODE:
+               SMPEG_seek(mpeg,bytes);
+
+void
+SMPEGSkip ( mpeg, seconds )
+       SMPEG* mpeg
+       float seconds
+       CODE:
+               SMPEG_skip(mpeg,seconds);
+
+void
+SMPEGSetDisplayRegion ( mpeg, rect )
+       SMPEG* mpeg
+       SDL_Rect* rect
+       CODE:
+               SMPEG_setdisplayregion(mpeg,rect->x,rect->y,rect->w,rect->h);
+
+void
+SMPEGRenderFrame ( mpeg, frame )
+       SMPEG* mpeg
+       int frame
+       CODE:
+               SMPEG_renderFrame(mpeg,frame);
+
+SMPEG_Info *
+SMPEGGetInfo ( mpeg )
+       SMPEG* mpeg
+       CODE:
+               RETVAL = (SMPEG_Info *) safemalloc (sizeof(SMPEG_Info));
+               SMPEG_getinfo(mpeg,RETVAL);
+       OUTPUT:
+               RETVAL
+       
+
+#endif
+
+#ifdef HAVE_SDL_GFX
+
+SDL_Surface *
+GFXRotoZoom ( src, angle, zoom, smooth)
+       SDL_Surface * src
+       double angle
+       double zoom
+       int smooth
+       CODE:
+               RETVAL = rotozoomSurface( src, angle, zoom, smooth);
+       OUTPUT:
+               RETVAL
+
+SDL_Surface *
+GFXZoom ( src, zoomx, zoomy, smooth)
+       SDL_Surface *src
+       double zoomx
+       double zoomy
+       int smooth
+       CODE:
+               RETVAL = zoomSurface( src, zoomx, zoomy, smooth);
+       OUTPUT:
+               RETVAL
+
+int
+GFXPixelColor ( dst, x, y, color )
+       SDL_Surface* dst
+       Sint16 x
+       Sint16 y
+       Uint32 color
+       CODE:
+               RETVAL = pixelColor( dst, x, y, color);
+       OUTPUT:
+               RETVAL
+
+int
+GFXPixelRGBA ( dst, x, y, r, g, b, a )
+       SDL_Surface* dst
+       Sint16 x
+       Sint16 y
+       Uint8 r
+       Uint8 g
+       Uint8 b
+       Uint8 a
+       CODE:
+               RETVAL = pixelRGBA( dst, x, y, r, g, b, a );
+       OUTPUT:
+               RETVAL
+
+int
+GFXHlineColor ( dst, x1, x2, y, color )
+       SDL_Surface* dst
+       Sint16 x1
+       Sint16 x2
+       Sint16 y
+       Uint32 color
+       CODE:
+               RETVAL = hlineColor( dst, x1, x2, y, color );
+       OUTPUT:
+               RETVAL
+
+int
+GFXHlineRGBA ( dst, x1, x2, y, r, g, b, a )
+       SDL_Surface* dst
+       Sint16 x1
+       Sint16 x2
+       Sint16 y
+       Uint8 r
+       Uint8 g
+       Uint8 b
+       Uint8 a
+       CODE:
+               RETVAL = hlineRGBA( dst, x1, x2, y, r, g, b, a );
+       OUTPUT:
+               RETVAL
+
+int
+GFXVlineColor ( dst, x, y1, y2, color )
+       SDL_Surface* dst
+       Sint16 x
+       Sint16 y1
+       Sint16 y2
+       Uint32 color
+       CODE:
+               RETVAL = vlineColor( dst, x, y1, y2, color );
+       OUTPUT:
+               RETVAL
+
+int
+GFXVlineRGBA ( dst, x, y1, y2, r, g, b, a )
+       SDL_Surface* dst
+       Sint16 x
+       Sint16 y1
+       Sint16 y2
+       Uint8 r
+       Uint8 g
+       Uint8 b
+       Uint8 a
+       CODE:
+               RETVAL = vlineRGBA( dst, x, y1, y2, r, g, b, a );
+       OUTPUT:
+               RETVAL
+
+int
+GFXRectangleColor ( dst, x1, y1, x2, y2, color )
+       SDL_Surface* dst
+       Sint16 x1
+       Sint16 y1
+       Sint16 x2
+       Sint16 y2
+       Uint32 color
+       CODE:
+               RETVAL = rectangleColor( dst, x1, y1, x2, y2, color );
+       OUTPUT:
+               RETVAL
+
+int
+GFXRectangleRGBA ( dst, x1, y1, x2, y2, r, g, b, a )
+       SDL_Surface* dst
+       Sint16 x1
+       Sint16 y1
+       Sint16 x2
+       Sint16 y2
+       Uint8 r
+       Uint8 g
+       Uint8 b
+       Uint8 a
+       CODE:
+               RETVAL = rectangleRGBA( dst, x1, y1, x2, y2, r, g, b, a );
+       OUTPUT:
+               RETVAL
+
+int
+GFXBoxColor ( dst, x1, y1, x2, y2, color )
+       SDL_Surface* dst
+       Sint16 x1
+       Sint16 y1
+       Sint16 x2
+       Sint16 y2
+       Uint32 color
+       CODE:
+               RETVAL = boxColor( dst, x1, y1, x2, y2, color );
+       OUTPUT:
+               RETVAL
+
+int
+GFXBoxRGBA ( dst, x1, y1, x2, y2, r, g, b, a )
+       SDL_Surface* dst;
+       Sint16 x1
+       Sint16 y1
+       Sint16 x2
+       Sint16 y2
+       Uint8 r
+       Uint8 g
+       Uint8 b
+       Uint8 a
+       CODE:
+               RETVAL = boxRGBA( dst, x1, y1, x2, y2, r, g, b, a );
+       OUTPUT:
+               RETVAL
+
+int
+GFXLineColor ( dst, x1, y1, x2, y2, color )
+       SDL_Surface* dst
+       Sint16 x1
+       Sint16 y1
+       Sint16 x2
+       Sint16 y2
+       Uint32 color
+       CODE:
+               RETVAL = lineColor( dst, x1, y1, x2, y2, color );
+       OUTPUT:
+               RETVAL
+
+int
+GFXLineRGBA ( dst, x1, y1, x2, y2, r, g, b, a )
+       SDL_Surface* dst
+       Sint16 x1
+       Sint16 y1
+       Sint16 x2
+       Sint16 y2
+       Uint8 r
+       Uint8 g
+       Uint8 b
+       Uint8 a
+       CODE:
+               RETVAL = lineRGBA( dst, x1, y1, x2, y2, r, g, b, a );
+       OUTPUT:
+               RETVAL
+
+int
+GFXAalineColor ( dst, x1, y1, x2, y2, color )
+       SDL_Surface* dst
+       Sint16 x1
+       Sint16 y1
+       Sint16 x2
+       Sint16 y2
+       Uint32 color
+       CODE:
+               RETVAL = aalineColor( dst, x1, y1, x2, y2, color );
+       OUTPUT:
+               RETVAL
+
+int
+GFXAalineRGBA ( dst, x1, y1, x2, y2, r, g, b, a )
+       SDL_Surface* dst
+       Sint16 x1
+       Sint16 y1
+       Sint16 x2
+       Sint16 y2
+       Uint8 r
+       Uint8 g
+       Uint8 b
+       Uint8 a
+       CODE:
+               RETVAL = aalineRGBA( dst, x1, y1, x2, y2, r, g, b, a );
+       OUTPUT:
+               RETVAL
+
+int
+GFXCircleColor ( dst, x, y, r, color )
+       SDL_Surface* dst
+       Sint16 x
+       Sint16 y
+       Sint16 r
+       Uint32 color
+       CODE:
+               RETVAL = circleColor( dst, x, y, r, color );
+       OUTPUT:
+               RETVAL
+
+int
+GFXCircleRGBA ( dst, x, y, rad, r, g, b, a )
+       SDL_Surface* dst
+       Sint16 x
+       Sint16 y
+       Sint16 rad
+       Uint8 r
+       Uint8 g
+       Uint8 b
+       Uint8 a
+       CODE:
+               RETVAL = circleRGBA( dst, x, y, rad, r, g, b, a );
+       OUTPUT:
+               RETVAL
+
+int
+GFXAacircleColor ( dst, x, y, r, color )
+       SDL_Surface* dst
+       Sint16 x
+       Sint16 y
+       Sint16 r
+       Uint32 color
+       CODE:
+               RETVAL = aacircleColor( dst, x, y, r, color );
+       OUTPUT:
+               RETVAL
+
+int
+GFXAacircleRGBA ( dst, x, y, rad, r, g, b, a )
+       SDL_Surface* dst
+       Sint16 x
+       Sint16 y
+       Sint16 rad
+       Uint8 r
+       Uint8 g
+       Uint8 b
+       Uint8 a
+       CODE:
+               RETVAL = aacircleRGBA( dst, x, y, rad, r, g, b, a );
+       OUTPUT:
+               RETVAL
+
+int
+GFXFilledCircleColor ( dst, x, y, r, color )
+       SDL_Surface* dst
+       Sint16 x
+       Sint16 y
+       Sint16 r
+       Uint32 color
+       CODE:
+               RETVAL = filledCircleColor( dst, x, y, r, color );
+       OUTPUT:
+               RETVAL
+
+int
+GFXFilledCircleRGBA ( dst, x, y, rad, r, g, b, a )
+       SDL_Surface* dst
+       Sint16 x
+       Sint16 y
+       Sint16 rad
+       Uint8 r
+       Uint8 g
+       Uint8 b
+       Uint8 a
+       CODE:
+               RETVAL = filledCircleRGBA( dst, x, y, rad, r, g, b, a );
+       OUTPUT:
+               RETVAL
+
+int
+GFXEllipseColor ( dst, x, y, rx, ry, color )
+       SDL_Surface* dst
+       Sint16 x
+       Sint16 y
+       Sint16 rx
+       Sint16 ry
+       Uint32 color
+       CODE:
+               RETVAL = ellipseColor( dst, x, y, rx, ry, color );
+       OUTPUT:
+               RETVAL
+
+int
+GFXEllipseRGBA ( dst, x, y, rx, ry, r, g, b, a )
+       SDL_Surface* dst
+       Sint16 x
+       Sint16 y
+       Sint16  rx
+       Sint16 ry
+       Uint8 r
+       Uint8 g
+       Uint8 b
+       Uint8 a
+       CODE:
+               RETVAL = ellipseRGBA( dst, x, y, rx, ry, r, g, b, a );
+       OUTPUT:
+               RETVAL
+
+int
+GFXAaellipseColor ( dst, xc, yc, rx, ry, color )
+       SDL_Surface* dst
+       Sint16 xc
+       Sint16 yc
+       Sint16 rx
+       Sint16 ry
+       Uint32 color
+       CODE:
+               RETVAL = aaellipseColor( dst, xc, yc, rx, ry, color );
+       OUTPUT:
+               RETVAL
+
+int
+GFXAaellipseRGBA ( dst, x, y, rx, ry, r, g, b, a )
+       SDL_Surface* dst
+       Sint16 x
+       Sint16 y
+       Sint16 rx
+       Sint16 ry
+       Uint8 r
+       Uint8 g
+       Uint8 b
+       Uint8 a
+       CODE:
+               RETVAL = aaellipseRGBA( dst, x, y, rx, ry, r, g, b, a );
+       OUTPUT:
+               RETVAL
+
+int
+GFXFilledEllipseColor ( dst, x, y, rx, ry, color )
+       SDL_Surface* dst
+       Sint16 x
+       Sint16 y
+       Sint16 rx
+       Sint16 ry
+       Uint32 color
+       CODE:
+               RETVAL = filledEllipseColor( dst, x, y, rx, ry, color );
+       OUTPUT:
+               RETVAL
+
+int
+GFXFilledEllipseRGBA ( dst, x, y, rx, ry, r, g, b, a )
+       SDL_Surface* dst
+       Sint16 x
+       Sint16 y
+       Sint16 rx
+       Sint16 ry
+       Uint8 r
+       Uint8 g
+       Uint8 b
+       Uint8 a
+       CODE:
+               RETVAL = filledEllipseRGBA( dst, x, y, rx, ry, r, g, b, a );
+       OUTPUT:
+               RETVAL
+
+int
+GFXFilledPieColor ( dst, x, y, rad, start, end, color )
+       SDL_Surface* dst
+       Sint16 x
+       Sint16 y
+       Sint16 rad
+       Sint16 start
+       Sint16 end
+       Uint32 color
+       CODE:
+               RETVAL = filledPieColor( dst, x, y, rad, start, end, color );
+       OUTPUT:
+               RETVAL
+
+int
+GFXFilledPieRGBA ( dst, x, y, rad, start, end, r, g, b, a )
+       SDL_Surface* dst
+       Sint16 x
+       Sint16 y
+       Sint16 rad
+       Sint16 start
+       Sint16 end
+       Uint8 r
+       Uint8 g
+       Uint8 b
+       Uint8 a
+       CODE:
+               RETVAL = filledPieRGBA( dst, x, y, rad, start, end, r, g, b, a );
+       OUTPUT:
+               RETVAL
+
+int
+GFXPolygonColor ( dst, vx, vy, n, color )
+       SDL_Surface* dst
+       Sint16* vx
+       Sint16* vy
+       int n
+       Uint32 color;
+       CODE:
+               RETVAL = polygonColor( dst, vx, vy, n, color );
+       OUTPUT:
+               RETVAL
+
+int
+GFXPolygonRGBA ( dst, vx, vy, n, r, g, b, a )
+       SDL_Surface* dst
+       Sint16* vx
+       Sint16* vy
+       int n
+       Uint8 r
+       Uint8 g
+       Uint8 b
+       Uint8 a
+       CODE:
+               RETVAL = polygonRGBA( dst, vx, vy, n, r, g, b, a );
+       OUTPUT:
+               RETVAL
+
+int
+GFXAapolygonColor ( dst, vx, vy, n, color )
+       SDL_Surface* dst
+       Sint16* vx
+       Sint16* vy
+       int n
+       Uint32 color
+       CODE:
+               RETVAL = aapolygonColor( dst, vx, vy, n, color );
+       OUTPUT:
+               RETVAL
+
+int
+GFXAapolygonRGBA ( dst, vx, vy, n, r, g, b, a )
+       SDL_Surface* dst
+       Sint16* vx
+       Sint16* vy
+       int n
+       Uint8 r
+       Uint8 g
+       Uint8 b
+       Uint8 a
+       CODE:
+               RETVAL = aapolygonRGBA( dst, vx, vy, n, r, g, b, a );
+       OUTPUT:
+               RETVAL
+
+int
+GFXFilledPolygonColor ( dst, vx, vy, n, color )
+       SDL_Surface* dst
+       Sint16* vx
+       Sint16* vy
+       int n
+       int color
+       CODE:
+               RETVAL = filledPolygonColor( dst, vx, vy, n, color );
+       OUTPUT:
+               RETVAL
+
+int
+GFXFilledPolygonRGBA ( dst, vx, vy, n, r, g, b, a )
+       SDL_Surface* dst
+       Sint16* vx
+       Sint16* vy
+       int n
+       Uint8 r
+       Uint8 g
+       Uint8 b
+       Uint8 a
+       CODE:
+               RETVAL = filledPolygonRGBA( dst, vx, vy, n, r, g, b, a );
+       OUTPUT:
+               RETVAL
+
+int
+GFXCharacterColor ( dst, x, y, c, color )
+       SDL_Surface* dst
+       Sint16 x
+       Sint16 y
+       char c
+       Uint32 color
+       CODE:
+               RETVAL = characterColor( dst, x, y, c, color );
+       OUTPUT:
+               RETVAL
+
+int
+GFXCharacterRGBA ( dst, x, y, c, r, g, b, a )
+       SDL_Surface* dst
+       Sint16 x
+       Sint16 y
+       char c
+       Uint8 r
+       Uint8 g
+       Uint8 b
+       Uint8 a
+       CODE:
+               RETVAL = characterRGBA( dst, x, y, c, r, g, b, a );
+       OUTPUT:
+               RETVAL
+
+int
+GFXStringColor ( dst, x, y, c, color )
+       SDL_Surface* dst
+       Sint16 x
+       Sint16 y
+       char* c
+       Uint32 color
+       CODE:
+               RETVAL = stringColor( dst, x, y, c, color );
+       OUTPUT:
+               RETVAL
+
+int
+GFXStringRGBA ( dst, x, y, c, r, g, b, a )
+       SDL_Surface* dst
+       Sint16 x
+       Sint16 y
+       char* c
+       Uint8 r
+       Uint8 g
+       Uint8 b
+       Uint8 a
+       CODE:
+               RETVAL = stringRGBA( dst, x, y, c, r, g, b, a );
+       OUTPUT:
+               RETVAL
+
+#endif
+
+
+#ifdef HAVE_SDL_SVG
+
+SDL_svg_context *
+SVG_Load ( filename )
+       char* filename
+       CODE:
+               RETVAL = SVG_Load(filename);
+       OUTPUT:
+               RETVAL
+
+SDL_svg_context *
+SVG_LoadBuffer ( data, len )
+       char* data
+       int len
+       CODE:
+               RETVAL = SVG_LoadBuffer(data,len);
+       OUTPUT:
+               RETVAL
+
+int
+SVG_SetOffset ( source, xoff, yoff )
+       SDL_svg_context* source
+       double xoff
+       double yoff
+       CODE:
+               RETVAL = SVG_SetOffset(source,xoff,yoff);
+       OUTPUT:
+               RETVAL
+
+int
+SVG_SetScale ( source, xscale, yscale )
+       SDL_svg_context* source
+       double xscale
+       double yscale
+       CODE:
+               RETVAL = SVG_SetScale(source,xscale,yscale);
+       OUTPUT:
+               RETVAL
+
+int
+SVG_RenderToSurface ( source, x, y, dest )
+       SDL_svg_context* source
+       int x
+       int y
+       SDL_Surface* dest;
+       CODE:
+               RETVAL = SVG_RenderToSurface(source,x,y,dest);
+       OUTPUT:
+               RETVAL
+
+void
+SVG_Free ( source )
+       SDL_svg_context* source
+       CODE:
+               SVG_Free(source);       
+
+void
+SVG_Set_Flags ( source, flags )
+       SDL_svg_context* source
+       Uint32 flags
+       CODE:
+               SVG_Set_Flags(source,flags);
+
+float
+SVG_Width ( source )
+       SDL_svg_context* source
+       CODE:
+               RETVAL = SVG_Width(source);
+       OUTPUT:
+               RETVAL
+
+float
+SVG_HEIGHT ( source )
+       SDL_svg_context* source
+       CODE:
+               RETVAL = SVG_Height(source);
+       OUTPUT:
+               RETVAL
+
+void
+SVG_SetClipping ( source, minx, miny, maxx, maxy )
+       SDL_svg_context* source
+       int minx
+       int miny
+       int maxx
+       int maxy
+       CODE:
+               SVG_SetClipping(source,minx,miny,maxx,maxy);
+
+int
+SVG_Version ( )
+       CODE:
+               RETVAL = SVG_Version();
+       OUTPUT:
+               RETVAL
+
+
+#endif
+
+#ifdef HAVE_SDL_SOUND
+
+Uint16
+SoundAudioInfoFormat ( audioinfo )
+       Sound_AudioInfo* audioinfo
+       CODE:
+               RETVAL = audioinfo->format;
+       OUTPUT:
+               RETVAL
+
+Uint8
+SoundAudioInfoChannels ( audioinfo )
+       Sound_AudioInfo* audioinfo
+       CODE:
+               RETVAL = audioinfo->channels;
+       OUTPUT:
+               RETVAL
+
+Uint32
+SoundAudioInforate ( audioinfo )
+       Sound_AudioInfo* audioinfo
+       CODE:
+               RETVAL = audioinfo->rate;
+       OUTPUT:
+               RETVAL
+
+AV*
+SoundDecoderInfoExtensions ( decoderinfo )
+       Sound_DecoderInfo* decoderinfo
+       CODE:
+               const char **ext;
+               for ( ext = decoderinfo->extensions; *ext != NULL; ext++ ){
+                       av_push(RETVAL,newSVpv(*ext,0));
+               }
+       OUTPUT:
+               RETVAL
+
+const char*
+SoundDecoderInfoDescription ( decoderinfo )
+       Sound_DecoderInfo* decoderinfo
+       CODE:
+               RETVAL = decoderinfo->description;
+       OUTPUT:
+               RETVAL
+
+const char*
+SoundDecoderInfoAuthor ( decoderinfo )
+       Sound_DecoderInfo* decoderinfo
+       CODE:
+               RETVAL = decoderinfo->author;
+       OUTPUT:
+               RETVAL
+
+const char*
+SoundDecoderInfoUrl ( decoderinfo )
+       Sound_DecoderInfo* decoderinfo
+       CODE:
+               RETVAL = decoderinfo->url;
+       OUTPUT:
+               RETVAL
+
+const Sound_DecoderInfo*
+SoundSampleDecoder ( sample ) 
+       Sound_Sample* sample
+       CODE:
+               RETVAL = sample->decoder;
+       OUTPUT:
+               RETVAL
+
+Sound_AudioInfo* 
+SoundSampleDesired ( sample )
+       Sound_Sample* sample
+       CODE:
+               RETVAL = &sample->desired;
+       OUTPUT:
+               RETVAL
+
+Sound_AudioInfo*
+SoundSampleAcutal ( sample )
+       Sound_Sample* sample
+       CODE:
+               RETVAL = &sample->actual;
+       OUTPUT:
+               RETVAL
+
+char*
+SoundSampleBuffer ( sample )
+       Sound_Sample* sample
+       CODE:
+               RETVAL = sample->buffer;
+       OUTPUT:
+               RETVAL
+
+Uint32
+SoundSampleBufferSize ( sample )
+       Sound_Sample* sample
+       CODE:
+               RETVAL = sample->buffer_size;
+       OUTPUT:
+               RETVAL
+
+Uint32
+SoundSampleFlags ( sample )
+       Sound_Sample* sample
+       CODE:
+               RETVAL = (Uint32)sample->flags;
+       OUTPUT:
+               RETVAL
+
+int
+Sound_Init ( )
+       CODE:
+               RETVAL = Sound_Init();
+       OUTPUT:
+               RETVAL
+
+int
+Sound_Quit ( )
+       CODE:
+               RETVAL = Sound_Quit();
+       OUTPUT:
+               RETVAL
+
+AV*
+Sound_AvailableDecoders ( )
+       CODE:
+               RETVAL = newAV();
+               const Sound_DecoderInfo** sdi;
+               sdi = Sound_AvailableDecoders();
+               if (sdi != NULL)  {
+                       for (;*sdi != NULL; ++sdi) {
+                               av_push(RETVAL,sv_2mortal(newSViv(PTR2IV(*sdi))));
+                       }
+               }
+       OUTPUT:
+               RETVAL
+
+const char*
+Sound_GetError ( )
+       CODE:
+               RETVAL = Sound_GetError();
+       OUTPUT:
+               RETVAL
+
+void
+Sound_ClearError ( )
+       CODE:
+               Sound_ClearError();
+
+Sound_Sample*
+Sound_NewSample ( rw, ext, desired, buffsize )
+       SDL_RWops* rw
+       const char* ext
+       Sound_AudioInfo* desired
+       Uint32 buffsize
+       CODE:
+               RETVAL = Sound_NewSample(rw,ext,desired,buffsize);
+       OUTPUT:
+               RETVAL
+
+Sound_Sample*
+Sound_NewSampleFromMem ( data, size, ext, desired, buffsize )
+       const Uint8 *data
+       Uint32 size
+       const char* ext
+       Sound_AudioInfo* desired
+       Uint32 buffsize
+       CODE:
+               RETVAL = Sound_NewSampleFromMem(data,size,ext,desired,buffsize);
+       OUTPUT:
+               RETVAL
+
+Sound_Sample*
+Sound_NewSampleFromFile ( fname, desired, buffsize )
+       const char* fname
+       Sound_AudioInfo* desired
+       Uint32 buffsize
+       CODE:
+               RETVAL = Sound_NewSampleFromFile(fname,desired,buffsize);
+       OUTPUT:
+               RETVAL
+
+void
+Sound_FreeSample ( sample )
+       Sound_Sample* sample
+       CODE:
+               Sound_FreeSample(sample);
+
+Sint32
+Sound_GetDuration ( sample )
+       Sound_Sample* sample
+       CODE:
+               RETVAL = Sound_GetDuration(sample);
+       OUTPUT:
+               RETVAL
+
+int
+Sound_SetBufferSize ( sample, size )
+       Sound_Sample* sample
+       Uint32 size
+       CODE:
+               RETVAL = Sound_SetBufferSize(sample,size);
+       OUTPUT:
+               RETVAL
+
+Uint32
+Sound_Decode ( sample )
+       Sound_Sample* sample
+       CODE:
+               RETVAL = Sound_Decode(sample);
+       OUTPUT:
+               RETVAL
+
+Uint32
+Sound_DecodeAll ( sample ) 
+       Sound_Sample* sample
+       CODE:
+               RETVAL = Sound_DecodeAll(sample);
+       OUTPUT:
+               RETVAL
+
+int
+Sound_Rewind ( sample )
+       Sound_Sample* sample
+       CODE:
+               RETVAL = Sound_Rewind(sample);
+       OUTPUT:
+               RETVAL
+
+int
+Sound_Seek ( sample, ms )
+       Sound_Sample* sample
+       Uint32 ms
+       CODE:
+               RETVAL = Sound_Seek(sample,ms);
+       OUTPUT:
+               RETVAL
+
+#endif
+
+MODULE = SDL           PACKAGE = SDL
+PROTOTYPES : DISABLE
+
+
diff --git a/src/SFont.h b/src/SFont.h
new file mode 100644 (file)
index 0000000..1c9025f
--- /dev/null
@@ -0,0 +1,79 @@
+//
+// SFont.h
+//
+// Original SFont code Copyright (C) Karl Bartel 
+// Copyright (C) 2005 David J. Goehrig <dgoehrig@cpan.org>
+//
+// ------------------------------------------------------------------------------
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+// 
+// This library 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
+// Lesser General Public License for more details.
+// 
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+//
+// ------------------------------------------------------------------------------
+//
+// Please feel free to send questions, suggestions or improvements to:
+//
+//     David J. Goehrig
+//     dgoehrig@cpan.org
+//
+
+#include "SDL.h"
+
+#ifdef __cplusplus 
+extern "C" {
+#endif
+
+// Delcare one variable of this type for each font you are using.
+// To load the fonts, load the font image into YourFont->Surface
+// and call InitFont( YourFont );
+typedef struct {
+       SDL_Surface *Surface;   
+       int CharPos[512];
+       int h;
+} SFont_FontInfo;
+
+// Initializes the font
+// Font: this contains the suface with the font.
+//       The font must be loaded before using this function.
+void InitFont (SDL_Surface *Font);
+void InitFont2(SFont_FontInfo *Font);
+
+// Blits a string to a surface
+// Destination: the suface you want to blit to
+// text: a string containing the text you want to blit.
+void PutString (SDL_Surface *Surface, int x, int y, char *text);
+void PutString2(SDL_Surface *Surface, SFont_FontInfo *Font, int x, int y, char *text);
+
+// Returns the width of "text" in pixels
+#ifdef MACOSX
+int SFont_TextWidth(char *text);
+int SFont_TextWidth2(SFont_FontInfo *Font, char *text);
+#else
+int TextWidth(char *text);
+int TextWidth2(SFont_FontInfo *Font, char *text);
+#endif
+
+// Blits a string to with centered x position
+void XCenteredString (SDL_Surface *Surface, int y, char *text);
+void XCenteredString2(SDL_Surface *Surface, SFont_FontInfo *Font, int y, char *text);
+
+// Allows the user to enter text
+// Width: What is the maximum width of the text (in pixels)
+// text: This string contains the text which was entered by the user
+void SFont_Input ( SDL_Surface *Destination, int x, int y, int Width, char *text);
+void SFont_Input2( SDL_Surface *Destination, SFont_FontInfo *Font, int x, int y, int Width, char *text);
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/src/SFont.xs b/src/SFont.xs
new file mode 100644 (file)
index 0000000..2bd9899
--- /dev/null
@@ -0,0 +1,308 @@
+//
+// SFont.xs
+//
+// Original SFont code Copyright (C) Karl Bartel 
+// Copyright (C) 2005 David J. Goehrig <dgoehrig@cpan.org>
+//
+// ------------------------------------------------------------------------------
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+// 
+// This library 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
+// Lesser General Public License for more details.
+// 
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+//
+// ------------------------------------------------------------------------------
+//
+// Please feel free to send questions, suggestions or improvements to:
+//
+//     David J. Goehrig
+//     dgoehrig@cpan.org
+//
+
+#include "EXTERN.h"
+#include "perl.h"
+#include "XSUB.h"
+
+#ifndef aTHX_
+#define aTHX_
+#endif
+
+#include <SDL.h>
+#include <string.h>
+#include <stdlib.h>
+
+#ifdef USE_THREADS
+#define HAVE_TLS_CONTEXT
+#endif
+
+#include "../defines.h"
+#include "../SFont.h"
+
+#ifdef HAVE_SDL_IMAGE
+#include <SDL_image.h>
+
+SFont_FontInfo InternalFont;
+Uint32 SFont_GetPixel(SDL_Surface *Surface, Sint32 X, Sint32 Y)
+{
+
+   Uint8  *bits;
+   Uint32 Bpp;
+   if (X<0) puts("SFONT ERROR: x too small in SFont_GetPixel. Report this to <karlb@gmx.net>");
+   if (X>=Surface->w) puts("SFONT ERROR: x too big in SFont_GetPixel. Report this to <karlb@gmx.net>");
+   
+   Bpp = Surface->format->BytesPerPixel;
+
+   bits = ((Uint8 *)Surface->pixels)+Y*Surface->pitch+X*Bpp;
+
+   // Get the pixel
+   switch(Bpp) {
+      case 1:
+         return *((Uint8 *)Surface->pixels + Y * Surface->pitch + X);
+         break;
+      case 2:
+         return *((Uint16 *)Surface->pixels + Y * Surface->pitch/2 + X);
+         break;
+      case 3: { // Format/endian independent 
+         Uint8 r, g, b;
+         r = *((bits)+Surface->format->Rshift/8);
+         g = *((bits)+Surface->format->Gshift/8);
+         b = *((bits)+Surface->format->Bshift/8);
+         return SDL_MapRGB(Surface->format, r, g, b);
+         }
+         break;
+      case 4:
+         return *((Uint32 *)Surface->pixels + Y * Surface->pitch/4 + X);
+         break;
+   }
+
+    return -1;
+}
+
+void SFont_InitFont2(SFont_FontInfo *Font)
+{
+    int x = 0, i = 0;
+
+    if ( Font->Surface==NULL ) {
+       printf("The font has not been loaded!\n");
+       exit(1);
+    }
+
+    if (SDL_MUSTLOCK(Font->Surface)) SDL_LockSurface(Font->Surface);
+
+    while ( x < Font->Surface->w ) {
+       if(SFont_GetPixel(Font->Surface,x,0)==SDL_MapRGB(Font->Surface->format,255,0,255)) { 
+           Font->CharPos[i++]=x;
+           while (( x < Font->Surface->w-1) && (SFont_GetPixel(Font->Surface,x,0)==SDL_MapRGB(Font->Surface->format,255,0,255)))
+               x++;
+           Font->CharPos[i++]=x;
+       }
+       x++;
+    }
+    if (SDL_MUSTLOCK(Font->Surface)) SDL_UnlockSurface(Font->Surface);
+
+    Font->h=Font->Surface->h;
+    SDL_SetColorKey(Font->Surface, SDL_SRCCOLORKEY, SFont_GetPixel(Font->Surface, 0, Font->Surface->h-1));
+}
+
+void SFont_InitFont(SDL_Surface *Font)
+{
+    InternalFont.Surface=Font;
+    SFont_InitFont2(&InternalFont);
+}
+
+void SFont_PutString2(SDL_Surface *Surface, SFont_FontInfo *Font, int x, int y, char *text)
+{
+    int ofs;
+    int i=0;
+    SDL_Rect srcrect,dstrect; 
+
+    while (text[i]!='\0') {
+        if (text[i]==' ') {
+            x+=Font->CharPos[2]-Font->CharPos[1];
+            i++;
+       }
+       else {
+//         printf("-%c- %c - %u\n",228,text[i],text[i]);
+           ofs=(text[i]-33)*2+1;
+//         printf("printing %c %d\n",text[i],ofs);
+            srcrect.w = dstrect.w = (Font->CharPos[ofs+2]+Font->CharPos[ofs+1])/2-(Font->CharPos[ofs]+Font->CharPos[ofs-1])/2;
+            srcrect.h = dstrect.h = Font->Surface->h-1;
+            srcrect.x = (Font->CharPos[ofs]+Font->CharPos[ofs-1])/2;
+            srcrect.y = 1;
+           dstrect.x = x-(float)(Font->CharPos[ofs]-Font->CharPos[ofs-1])/2;
+           dstrect.y = y;
+
+           SDL_BlitSurface( Font->Surface, &srcrect, Surface, &dstrect); 
+
+            x+=Font->CharPos[ofs+1]-Font->CharPos[ofs];
+            i++;
+        }
+    }
+}
+
+void SFont_PutString(SDL_Surface *Surface, int x, int y, char *text)
+{
+    SFont_PutString2(Surface, &InternalFont, x, y, text);
+}
+
+int SFont_TextWidth2(SFont_FontInfo *Font, char *text)
+{
+    int ofs=0;
+    int i=0,x=0;
+
+    while (text[i]!='\0') {
+        if (text[i]==' ') {
+            x+=Font->CharPos[2]-Font->CharPos[1];
+            i++;
+       }
+       else {
+           ofs=(text[i]-33)*2+1;
+            x+=Font->CharPos[ofs+1]-Font->CharPos[ofs];
+            i++;
+        }
+    }
+//    printf ("--%d\n",x);
+    return x;
+}
+
+int SFont_TextWidth(char *text)
+{
+    return SFont_TextWidth2(&InternalFont, text);
+}
+
+void SFont_XCenteredString2(SDL_Surface *Surface, SFont_FontInfo *Font, int y, char *text)
+{
+    SFont_PutString2(Surface, Font, Surface->w/2-SFont_TextWidth2(Font,text)/2, y, text);
+}
+
+void SFont_XCenteredString(SDL_Surface *Surface, int y, char *text)
+{
+    SFont_XCenteredString2(Surface, &InternalFont, y, text);
+}
+
+void SFont_InternalInput( SDL_Surface *Dest, SFont_FontInfo *Font, int x, int y, int PixelWidth, char *text)
+{
+    SDL_Event event;
+    int ch=-1,blink=0;
+    long blinktimer=0;
+    SDL_Surface *Back;
+    SDL_Rect rect;
+    int previous;
+//    int ofs=(text[0]-33)*2+1;
+//    int leftshift=(Font->CharPos[ofs]-Font->CharPos[ofs-1])/2;
+    
+    Back = SDL_AllocSurface(Dest->flags,
+                           Dest->w,
+                           Font->h,
+                           Dest->format->BitsPerPixel,
+                           Dest->format->Rmask,
+                           Dest->format->Gmask,
+                           Dest->format->Bmask, 0);
+    rect.x=0;
+    rect.y=y;
+    rect.w=Dest->w;
+    rect.h=Font->Surface->h;
+    SDL_BlitSurface(Dest, &rect, Back, NULL);
+    SFont_PutString2(Dest,Font,x,y,text);
+    SDL_UpdateRects(Dest, 1, &rect);
+        
+    // start input
+    previous=SDL_EnableUNICODE(1);
+    blinktimer=SDL_GetTicks();
+    while (ch!=SDLK_RETURN) {
+       if (event.type==SDL_KEYDOWN) {
+           ch=event.key.keysym.unicode;
+           if (((ch>31)||(ch=='\b')) && (ch<128)) {
+               if ((ch=='\b')&&(strlen(text)>0))
+                   text[strlen(text)-1]='\0';
+               else if (ch!='\b')
+                   sprintf(text,"%s%c",text,ch);
+               if (SFont_TextWidth2(Font,text)>PixelWidth) text[strlen(text)-1]='\0';
+               SDL_BlitSurface( Back, NULL, Dest, &rect);
+               SFont_PutString2(Dest, Font, x, y, text);
+               SDL_UpdateRects(Dest, 1, &rect);
+//             printf("%s ## %d\n",text,strlen(text));
+               SDL_WaitEvent(&event);
+           }
+       }
+       if (SDL_GetTicks()>blinktimer) {
+           blink=1-blink;
+           blinktimer=SDL_GetTicks()+500;
+           if (blink) {
+               SFont_PutString2(Dest, Font, x+SFont_TextWidth2(Font,text), y, "|");
+               SDL_UpdateRects(Dest, 1, &rect);
+//             SDL_UpdateRect(Dest, x+SFont_TextWidth2(Font,text), y, SFont_TextWidth2(Font,"|"), Font->Surface->h);
+           } else {
+               SDL_BlitSurface( Back, NULL, Dest, &rect);
+               SFont_PutString2(Dest, Font, x, y, text);
+               SDL_UpdateRects(Dest, 1, &rect);
+//             SDL_UpdateRect(Dest, x-(Font->CharPos[ofs]-Font->CharPos[ofs-1])/2, y, PixelWidth, Font->Surface->h);
+           }
+       }
+       SDL_Delay(1);
+       SDL_PollEvent(&event);
+    }
+    text[strlen(text)]='\0';
+    SDL_FreeSurface(Back);
+    SDL_EnableUNICODE(previous);  //restore the previous state
+}
+
+void SFont_Input2( SDL_Surface *Dest, SFont_FontInfo *Font, int x, int y, int PixelWidth, char *text)
+{
+    SFont_InternalInput( Dest, Font, x, y, PixelWidth,  text);
+}
+void SFont_Input( SDL_Surface *Dest, int x, int y, int PixelWidth, char *text)
+{
+    SFont_Input2( Dest, &InternalFont, x, y, PixelWidth, text);
+}
+
+#endif
+
+MODULE = SDL::SFont            PACKAGE = SDL::SFont
+PROTOTYPES : DISABLE
+
+#ifdef HAVE_SDL_IMAGE
+
+SDL_Surface *
+NewFont ( filename )
+       char *filename
+       CODE:
+               RETVAL = IMG_Load(filename);
+               SFont_InitFont(RETVAL);
+       OUTPUT:
+               RETVAL
+
+void
+UseFont ( surface )
+       SDL_Surface *surface
+       CODE:
+               SFont_InitFont(surface);
+
+void
+PutString ( surface, x, y, text )
+       SDL_Surface *surface
+       int x
+       int y
+       char *text
+       CODE:
+               SFont_PutString( surface, x, y, text );
+
+int
+TextWidth ( text )
+       char *text
+       CODE:
+                RETVAL = SFont_TextWidth(text);
+       OUTPUT:
+               RETVAL
+               
+
+#endif
diff --git a/src/defines.h b/src/defines.h
new file mode 100644 (file)
index 0000000..5303315
--- /dev/null
@@ -0,0 +1,49 @@
+//
+// defines.h
+//
+// Copyright (C) 2005 David J. Goehrig <dgoehrig@cpan.org>
+//
+// ------------------------------------------------------------------------------
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+// 
+// This library 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
+// Lesser General Public License for more details.
+// 
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+//
+// ------------------------------------------------------------------------------
+//
+// Please feel free to send questions, suggestions or improvements to:
+//
+//     David J. Goehrig
+//     dgoehrig@cpan.org
+//
+
+#ifndef SDL_PERL_DEFINES_H
+#define SDL_PERL_DEFINES_H
+
+#ifdef HAVE_TLS_CONTEXT
+PerlInterpreter *parent_perl = NULL;
+extern PerlInterpreter *parent_perl;
+#define GET_TLS_CONTEXT parent_perl =  PERL_GET_CONTEXT;
+#define ENTER_TLS_CONTEXT \
+        PerlInterpreter *current_perl = PERL_GET_CONTEXT; \
+               PERL_SET_CONTEXT(parent_perl); { \
+                                       PerlInterpreter *my_perl = parent_perl;
+#define LEAVE_TLS_CONTEXT \
+                                               } PERL_SET_CONTEXT(current_perl);
+#else
+#define GET_TLS_CONTEXT         /* TLS context not enabled */
+#define ENTER_TLS_CONTEXT       /* TLS context not enabled */
+#define LEAVE_TLS_CONTEXT       /* TLS context not enabled */
+#endif
+
+#endif
diff --git a/src/support/darwin_support.h b/src/support/darwin_support.h
new file mode 100644 (file)
index 0000000..cd4d3b8
--- /dev/null
@@ -0,0 +1,3 @@
+void init_ns_application();
+void quit_ns_application();
+
diff --git a/src/support/darwin_support.m b/src/support/darwin_support.m
new file mode 100644 (file)
index 0000000..9766fe8
--- /dev/null
@@ -0,0 +1,60 @@
+#include <Foundation/Foundation.h>
+#include <AppKit/AppKit.h>
+#include <setjmp.h>
+
+@interface perl_SDLMain : NSObject
+@end
+
+@interface SDLApplication : NSApplication
+@end
+
+static jmp_buf jmpbuf;
+
+@implementation perl_SDLMain
+
+- (void) applicationDidFinishLaunching: (NSNotification *) note
+{
+       fprintf(stderr,"Finished launching\n");
+//     longjmp(jmpbuf,1);
+}
+
+@end
+
+extern void setApplicationMenu(void);
+extern void setupWindowMenu(void);
+
+static NSAutoreleasePool* pool = NULL;
+static perl_SDLMain* perl_sdlMain = NULL;
+
+
+void
+init_ns_application()
+{
+       // Allocate pool so Cocoa can refcount
+       pool = [[NSAutoreleasePool alloc] init];
+
+       // Create the application
+       [SDLApplication sharedApplication];
+
+       [NSApp setMainMenu: [[NSMenu alloc] init]];
+//     setApplicationMenu();
+//     setupWindowMenu();
+
+       perl_sdlMain = [[perl_SDLMain alloc] init];
+       [NSApp setDelegate: perl_sdlMain];
+
+//     fprintf(stderr,"Calling [NSapp run]\n");
+//     if (0 == setjmp(jmpbuf)) {
+               [NSApp run];
+//     } else {
+//             fprintf(stderr, "Returned from that nasty [NSApp run]");
+//     }
+}
+
+void
+quit_ns_application()
+{
+       [perl_sdlMain release];
+       [pool release];
+}
+
diff --git a/src/support/win32.c b/src/support/win32.c
new file mode 100644 (file)
index 0000000..ceb4699
--- /dev/null
@@ -0,0 +1,8 @@
+
+
+#ifdef MSWIN32
+int dummy()
+{
+       return 0;
+}
+#endif
diff --git a/t/apppm.t b/t/apppm.t
new file mode 100644 (file)
index 0000000..c577511
--- /dev/null
+++ b/t/apppm.t
@@ -0,0 +1,58 @@
+#!/usr/bin/perl -w
+#
+# Copyright (C) 2003 Tels
+# Copyright (C) 2004 David J. Goehrig
+#
+# ------------------------------------------------------------------------------
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+# 
+# This library 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
+# Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+#
+# ------------------------------------------------------------------------------
+#
+# Please feel free to send questions, suggestions or improvements to:
+#
+#      David J. Goehrig
+#      dgoehrig\@cpan.org
+#
+#
+# basic testing of SDL::App
+
+BEGIN {
+       unshift @INC, 'blib/lib','blib/arch';
+}
+
+use strict;
+use SDL::Config;
+
+use Test::More;
+
+plan ( tests => 2 );
+
+use_ok( 'SDL::App' ); 
+  
+can_ok ('SDL::App', qw/
+       new 
+       resize 
+       title 
+       delay
+       ticks 
+       error 
+       warp 
+       fullscreen 
+       iconify 
+       grab_input 
+       loop
+       sync 
+       attribute /);
diff --git a/t/cdrompm.t b/t/cdrompm.t
new file mode 100644 (file)
index 0000000..5c8c212
--- /dev/null
@@ -0,0 +1,59 @@
+#!/usr/bin/perl -w
+#
+# Copyright (C) 2003 Tels
+# Copyright (C) 2004 David J. Goehrig
+#
+# ------------------------------------------------------------------------------
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+# 
+# This library 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
+# Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+#
+# ------------------------------------------------------------------------------
+#
+# Please feel free to send questions, suggestions or improvements to:
+#
+#      David J. Goehrig
+#      dgoehrig\@cpan.org
+#
+#
+# basic testing of SDL::Cdrom
+
+BEGIN {
+       unshift @INC, 'blib/lib','blib/arch';
+}
+
+use strict;
+
+use Test::More;
+
+plan ( tests => 3 );
+
+use_ok( 'SDL::Cdrom' ); 
+  
+can_ok ('main', qw/ CD_NUM_DRIVES /);
+
+can_ok ('SDL::Cdrom', qw/
+       new
+       name
+       status
+       play
+       pause
+       resume
+       stop
+       eject
+       id
+       num_tracks
+       track
+       current
+       current_frame /);
diff --git a/t/colorpm.t b/t/colorpm.t
new file mode 100644 (file)
index 0000000..67dba94
--- /dev/null
@@ -0,0 +1,66 @@
+#!/usr/bin/perl -w
+#
+# Copyright (C) 2003 Tels
+# Copyright (C) 2004 David J. Goehrig
+#
+# Copyright (C) 2005 David J. Goehrig <dgoehrig\@cpan.org>
+#
+# ------------------------------------------------------------------------------
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+# 
+# This library 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
+# Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+#
+# ------------------------------------------------------------------------------
+#
+# Please feel free to send questions, suggestions or improvements to:
+#
+#      David J. Goehrig
+#      dgoehrig\@cpan.org
+#
+#
+# basic testing of SDL::Color
+
+BEGIN {
+       unshift @INC, 'blib/lib','blib/arch';
+}
+
+use strict;
+
+use Test::More;
+
+plan ( tests => 10 );
+
+use_ok( 'SDL::Color' ); 
+  
+can_ok ('SDL::Color', qw/
+       new 
+       r 
+       g 
+       b 
+       pixel /);
+
+# some basic tests:
+
+my $color = SDL::Color->new();
+is (ref($color), 'SDL::Color', 'new was ok');
+is ($color->r(),0, 'r is 0');
+is ($color->g(),0, 'g is 0');
+is ($color->b(),0, 'b is 0');
+
+$color = SDL::Color->new( -r => 0xff, -g => 0xff, -b => 0xff);
+is (ref($color), 'SDL::Color', 'new was ok');
+is ($color->r(),255, 'r is 255');
+is ($color->g(),255, 'g is 255');
+is ($color->b(),255, 'b is 255');
+
diff --git a/t/cursorpm.t b/t/cursorpm.t
new file mode 100644 (file)
index 0000000..f6f4283
--- /dev/null
@@ -0,0 +1,52 @@
+#!/usr/bin/perl -w
+#
+# Copyright (C) 2003 Tels
+# Copyright (C) 2004 David J. Goehrig
+#
+# Copyright (C) 2005 David J. Goehrig <dgoehrig\@cpan.org>
+#
+# ------------------------------------------------------------------------------
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+# 
+# This library 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
+# Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+#
+# ------------------------------------------------------------------------------
+#
+# Please feel free to send questions, suggestions or improvements to:
+#
+#      David J. Goehrig
+#      dgoehrig\@cpan.org
+#
+#
+# basic testing of SDL::Cursor
+
+BEGIN {
+       unshift @INC, 'blib/lib','blib/arch';
+}
+
+use strict;
+
+use Test::More;
+
+plan ( tests => 2 );
+
+use_ok( 'SDL::Cursor' ); 
+  
+can_ok ('SDL::Cursor', qw/
+       new 
+       warp 
+       use 
+       get 
+       show /);
+
diff --git a/t/eventpm.t b/t/eventpm.t
new file mode 100644 (file)
index 0000000..3dca888
--- /dev/null
@@ -0,0 +1,74 @@
+#!/usr/bin/perl -w
+#
+# Copyright (C) 2003 Tels
+# Copyright (C) 2004 David J. Goehrig
+#
+# Copyright (C) 2005 David J. Goehrig <dgoehrig\@cpan.org>
+#
+# ------------------------------------------------------------------------------
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+# 
+# This library 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
+# Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+#
+# ------------------------------------------------------------------------------
+#
+# Please feel free to send questions, suggestions or improvements to:
+#
+#      David J. Goehrig
+#      dgoehrig\@cpan.org
+#
+#
+# basic testing of SDL::Event
+
+BEGIN {
+       unshift @INC, 'blib/lib','blib/arch';
+}
+
+use strict;
+
+use Test::More;
+
+plan ( tests => 2 );
+
+use_ok( 'SDL::Event' ); 
+  
+can_ok ('SDL::Event', qw/
+       new 
+       type 
+       pump 
+       poll 
+       wait 
+       set 
+       set_unicode 
+       set_key_repeat
+       active_gain 
+       active_state 
+       key_state 
+       key_sym 
+       key_name 
+       key_mod
+       key_unicode 
+       key_scancode 
+       motion_state
+       motion_x 
+       motion_y 
+       motion_xrel 
+       motion_yrel
+       button 
+       button_state 
+       button_x 
+       button_y /);
+
+
+
diff --git a/t/fontpm.t b/t/fontpm.t
new file mode 100644 (file)
index 0000000..db1d7b8
--- /dev/null
@@ -0,0 +1,53 @@
+#!/usr/bin/perl -w
+#
+# Copyright (C) 2003 Tels
+# Copyright (C) 2004 David J. Goehrig
+#
+# Copyright (C) 2005 David J. Goehrig <dgoehrig\@cpan.org>
+#
+# ------------------------------------------------------------------------------
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+# 
+# This library 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
+# Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+#
+# ------------------------------------------------------------------------------
+#
+# Please feel free to send questions, suggestions or improvements to:
+#
+#      David J. Goehrig
+#      dgoehrig\@cpan.org
+#
+#
+# basic testing of SDL::Font
+
+BEGIN {
+       unshift @INC, 'blib/lib','blib/arch';
+}
+
+use strict;
+use SDL::Config;
+
+use Test::More;
+
+if ( SDL::Config->has('SDL_image') ) {
+       plan ( tests => 2 );
+} else {
+       plan ( skip_all => 'SDL_image support not compiled' );
+}
+
+use_ok( 'SDL::Font' ); 
+  
+can_ok ('SDL::Font', qw/ new use /);
+
+
diff --git a/t/mixerpm.t b/t/mixerpm.t
new file mode 100644 (file)
index 0000000..0ad5dbe
--- /dev/null
@@ -0,0 +1,93 @@
+#!/usr/bin/perl -w
+#
+# Copyright (C) 2003 Tels
+# Copyright (C) 2004 David J. Goehrig
+#
+# Copyright (C) 2005 David J. Goehrig <dgoehrig\@cpan.org>
+#
+# ------------------------------------------------------------------------------
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+# 
+# This library 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
+# Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+#
+# ------------------------------------------------------------------------------
+#
+# Please feel free to send questions, suggestions or improvements to:
+#
+#      David J. Goehrig
+#      dgoehrig\@cpan.org
+#
+#
+# basic testing of SDL::Mixer
+
+BEGIN {
+       unshift @INC, 'blib/lib','blib/arch';
+}
+
+use strict;
+use SDL;
+use SDL::Config;
+
+use Test::More;
+
+if ( SDL::Config->has('SDL_mixer') ) {
+       plan ( tests => 3 );
+} else {
+       plan ( skip_all => 'SDL_mixer support not compiled' );
+}
+
+use_ok( 'SDL::Mixer' ); 
+  
+can_ok ('SDL::Mixer', qw/
+       new
+       query_spec
+       reserve_channels
+       allocate_channels
+       group_channel
+       group_channels
+       group_available
+       group_count
+       group_oldest
+       group_newer
+       play_channel
+       play_music
+       fade_in_channel
+       fade_in_music
+       channel_volume
+       music_volume
+       halt_channel
+       halt_group
+       halt_music
+       channel_expire
+       fade_out_channel
+       fade_out_group
+       fade_out_music
+       fading_music
+       fading_channel
+       pause
+       resume
+       paused
+       pause_music
+       resume_music
+       rewind_music
+       music_paused
+       playing
+       playing_music
+       /);
+
+# these are exported by default, so main:: should know them:
+SDL::Init(SDL_INIT_AUDIO);
+my $mixer = SDL::Mixer->new();
+isa_ok($mixer, 'SDL::Mixer');
+
diff --git a/t/mpegpm.t b/t/mpegpm.t
new file mode 100644 (file)
index 0000000..348a31c
--- /dev/null
@@ -0,0 +1,66 @@
+#!/usr/bin/perl -w
+#
+# Copyright (C) 2003 Tels
+# Copyright (C) 2004 David J. Goehrig
+#
+# Copyright (C) 2005 David J. Goehrig <dgoehrig\@cpan.org>
+#
+# ------------------------------------------------------------------------------
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+# 
+# This library 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
+# Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+#
+# ------------------------------------------------------------------------------
+#
+# Please feel free to send questions, suggestions or improvements to:
+#
+#      David J. Goehrig
+#      dgoehrig\@cpan.org
+#
+#
+# basic testing of SDL::MPEG
+
+BEGIN {
+       unshift @INC, 'blib/lib','blib/arch';
+}
+
+use strict;
+use SDL::Config;
+
+use Test::More;
+
+if ( SDL::Config->has('smpeg') && SDL::Config->has('SDL_mixer') ) {
+       plan ( tests => 2 );
+} else {
+       plan ( skip_all => 
+               ( SDL::Config->has('smpeg') ? '' : ' smpeg support not compiled')  .
+               ( SDL::Config->has('SDL_mixer') ? '' : ' SDL_mixer support not compiled') );
+}
+
+use_ok( 'SDL::MPEG' ); 
+  
+can_ok ('SDL::MPEG', qw/
+       new 
+       has_audio 
+       has_video 
+       width 
+       height 
+       size 
+       offset 
+       frame            
+       fps 
+       time 
+       length /);
+
+
diff --git a/t/musicpm.t b/t/musicpm.t
new file mode 100644 (file)
index 0000000..a5ca6c6
--- /dev/null
@@ -0,0 +1,51 @@
+#!/usr/bin/perl -w
+#
+# Copyright (C) 2003 Tels
+# Copyright (C) 2004 David J. Goehrig
+#
+# Copyright (C) 2005 David J. Goehrig <dgoehrig\@cpan.org>
+#
+# ------------------------------------------------------------------------------
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+# 
+# This library 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
+# Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+#
+# ------------------------------------------------------------------------------
+#
+# Please feel free to send questions, suggestions or improvements to:
+#
+#      David J. Goehrig
+#      dgoehrig\@cpan.org
+#
+#
+# basic testing of SDL::Music
+
+BEGIN {
+       unshift @INC, 'blib/lib','blib/arch';
+}
+
+use strict;
+use SDL::Config;
+
+use Test::More;
+
+plan ( tests => 2 );
+
+use_ok( 'SDL::Music' ); 
+  
+can_ok ('SDL::Music', qw/
+       new
+       /);
+
+
diff --git a/t/opengl.t b/t/opengl.t
new file mode 100644 (file)
index 0000000..9c19e96
--- /dev/null
@@ -0,0 +1,93 @@
+#!/usr/bin/perl -w
+#
+# Copyright (C) 2003 Tels
+# Copyright (C) 2004 David J. Goehrig
+#
+# Copyright (C) 2005 David J. Goehrig <dgoehrig\@cpan.org>
+#
+# ------------------------------------------------------------------------------
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+# 
+# This library 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
+# Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+#
+# ------------------------------------------------------------------------------
+#
+# Please feel free to send questions, suggestions or improvements to:
+#
+#      David J. Goehrig
+#      dgoehrig\@cpan.org
+#
+#
+# basic testing of SDL::OpenGL
+
+BEGIN {
+       unshift @INC, 'blib/lib','blib/arch';
+}
+
+use strict;
+use SDL::Config;
+
+use Test::More;
+
+if ( SDL::Config->has('GL') && SDL::Config->has('GLU') ) {
+               plan ( tests => 3 );
+} else {
+       plan ( skip_all => 'OpenGL support not compiled' );
+}
+
+use_ok('SDL::OpenGL');
+
+can_ok('main', qw/
+       glBegin
+       glClear
+       glClearColor
+       glColor
+       glCullFace
+       glEnable
+       glEnd
+       glEvalCoord1
+       glEvalCoord2
+       glEvalMesh2
+       glFrontFace
+       glFrustum 
+       glGet
+       glLight
+       glLoadIdentity
+       glMap1
+       glMap2
+       glMapGrid2
+       glMaterial
+       glMatrixMode
+       glPointSize
+       glPopMatrix
+       glPushMatrix
+       glRotate
+       glScale
+       glShadeModel
+       glTranslate
+       glVertex
+       glVertex
+       glViewport /);
+
+can_ok('main',qw/
+       gluPerspective
+       gluBeginSurface
+       gluBeginTrim
+       gluEndSurface
+       gluEndTrim
+       gluNewNurbsRenderer 
+       gluNurbsCurve
+       gluNurbsProperty
+       gluNurbsSurface
+       gluPwlCurve /);
diff --git a/t/palettepm.t b/t/palettepm.t
new file mode 100644 (file)
index 0000000..3cc9cfc
--- /dev/null
@@ -0,0 +1,53 @@
+#!/usr/bin/perl -w
+#
+# Copyright (C) 2003 Tels
+# Copyright (C) 2004 David J. Goehrig
+#
+# Copyright (C) 2005 David J. Goehrig <dgoehrig\@cpan.org>
+#
+# ------------------------------------------------------------------------------
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+# 
+# This library 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
+# Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+#
+# ------------------------------------------------------------------------------
+#
+# Please feel free to send questions, suggestions or improvements to:
+#
+#      David J. Goehrig
+#      dgoehrig\@cpan.org
+#
+#
+# basic testing of SDL::Palette
+
+BEGIN {
+       unshift @INC, 'blib/lib','blib/arch';
+}
+
+use strict;
+
+use Test::More;
+
+plan ( tests => 2 );
+
+use_ok( 'SDL::Palette' ); 
+  
+can_ok ('SDL::Palette', qw/
+       new
+       size
+       red 
+       green 
+       blue 
+       color /);
+
diff --git a/t/rectpm.t b/t/rectpm.t
new file mode 100644 (file)
index 0000000..422f64a
--- /dev/null
@@ -0,0 +1,73 @@
+#!/usr/bin/perl -w
+#
+# Copyright (C) 2003 Tels
+# Copyright (C) 2004 David J. Goehrig
+#
+# Copyright (C) 2005 David J. Goehrig <dgoehrig\@cpan.org>
+#
+# ------------------------------------------------------------------------------
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+# 
+# This library 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
+# Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+#
+# ------------------------------------------------------------------------------
+#
+# Please feel free to send questions, suggestions or improvements to:
+#
+#      David J. Goehrig
+#      dgoehrig\@cpan.org
+#
+#
+# basic testing of SDL::Rect
+
+BEGIN {
+       unshift @INC, 'blib/lib','blib/arch';
+}
+
+use strict;
+
+use Test::More;
+
+plan ( tests => 15 );
+
+use_ok( 'SDL::Rect' ); 
+  
+can_ok ('SDL::Rect', qw/
+       new
+       x 
+       y 
+       width 
+       height /);
+
+my $rect = SDL::Rect->new();
+
+# creating with defaults
+is (ref($rect),'SDL::Rect','new went ok');
+is ($rect->x(), 0, 'x is 0');
+is ($rect->y(), 0, 'y is 0');
+is ($rect->width(), 0, 'w is 0');
+is ($rect->height(), 0, 'h is 0');
+
+# set and get at the same time
+is ($rect->x(12), 12, 'x is now 12');
+is ($rect->y(123), 123, 'y is now 12');
+is ($rect->width(45), 45, 'w is now 45');
+is ($rect->height(67), 67, 'h is now 67');
+
+# get alone
+is ($rect->x(), 12, 'x is 12');
+is ($rect->y(), 123, 'y is 12');
+is ($rect->width(), 45, 'w is 45');
+is ($rect->height(), 67, 'h is 67');
+
diff --git a/t/sdlpm.t b/t/sdlpm.t
new file mode 100644 (file)
index 0000000..9545b02
--- /dev/null
+++ b/t/sdlpm.t
@@ -0,0 +1,56 @@
+#!/usr/bin/perl -w
+#
+# Copyright (C) 2003 Tels
+# Copyright (C) 2004 David J. Goehrig
+#
+# Copyright (C) 2005 David J. Goehrig <dgoehrig\@cpan.org>
+#
+# ------------------------------------------------------------------------------
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+# 
+# This library 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
+# Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+#
+# ------------------------------------------------------------------------------
+#
+# Please feel free to send questions, suggestions or improvements to:
+#
+#      David J. Goehrig
+#      dgoehrig\@cpan.org
+#
+#
+# basic testing of SDL
+
+BEGIN {
+       unshift @INC, 'blib/lib','blib/arch';
+}
+
+use strict;
+use SDL::Config;
+
+use Test::More;
+
+plan ( tests => 9 );
+
+use_ok( 'SDL' ); 
+  
+can_ok ('SDL', qw/in verify/);
+
+is (SDL::in('foo','bar'), 0, "foo isn't in ('bar')");
+is (SDL::in('foo','foo'), 1, "foo is in ('foo')");
+is (SDL::in('foo','foo','bar'), 1, "foo is in ('foo','bar')");
+is (SDL::in('foo','foo','bar','foo'), 1, "foo is once in ('foo','bar','foo')");
+is (SDL::in('foo','fab','bar'), 0, "foo isn't in ('fab','bar')");
+is (SDL::in('foo','fab',undef,'bar'), 0, "foo isn't in ('fab',undef,'bar')");
+is (SDL::in('foo','fab',undef,'foo'), 1, "foo is in ('fab',undef,'foo')");
+
diff --git a/t/soundpm.t b/t/soundpm.t
new file mode 100644 (file)
index 0000000..b63c397
--- /dev/null
@@ -0,0 +1,51 @@
+#!/usr/bin/perl -w
+#
+# Copyright (C) 2003 Tels
+# Copyright (C) 2004 David J. Goehrig
+#
+# Copyright (C) 2005 David J. Goehrig <dgoehrig\@cpan.org>
+#
+# ------------------------------------------------------------------------------
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+# 
+# This library 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
+# Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+#
+# ------------------------------------------------------------------------------
+#
+# Please feel free to send questions, suggestions or improvements to:
+#
+#      David J. Goehrig
+#      dgoehrig\@cpan.org
+#
+#
+# basic testing of SDL::Sound
+
+BEGIN {
+       unshift @INC, 'blib/lib','blib/arch';
+}
+
+use strict;
+use SDL::Config;
+
+use Test::More;
+
+plan ( tests => 2 );
+
+use_ok( 'SDL::Sound' ); 
+
+can_ok ('SDL::Sound', qw/
+       new 
+       volume
+       /);
+
diff --git a/t/surfacepm.t b/t/surfacepm.t
new file mode 100644 (file)
index 0000000..9e698b3
--- /dev/null
@@ -0,0 +1,113 @@
+#!/usr/bin/perl -w
+#
+# Copyright (C) 2003 Tels
+# Copyright (C) 2004 David J. Goehrig
+#
+# Copyright (C) 2005 David J. Goehrig <dgoehrig\@cpan.org>
+#
+# ------------------------------------------------------------------------------
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+# 
+# This library 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
+# Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+#
+# ------------------------------------------------------------------------------
+#
+# Please feel free to send questions, suggestions or improvements to:
+#
+#      David J. Goehrig
+#      dgoehrig\@cpan.org
+#
+#
+# basic testing of SDL::Surface
+
+BEGIN {
+       unshift @INC, 'blib/lib','blib/arch';
+}
+
+use strict;
+
+use Test::More;
+
+plan ( tests => 3 );
+
+use_ok( 'SDL::Surface' ); 
+  
+can_ok ('SDL::Surface', qw/
+       new
+       flags
+       palette
+       bpp
+       bytes_per_pixel
+       Rshift
+       Gshift
+       Bshift
+       Ashift
+       Rmask
+       Bmask
+       Gmask
+       Amask
+       color_key
+       alpha
+       width
+       height
+       pitch
+       pixels
+       pixel
+       fill
+       lockp
+       lock
+       unlock
+       update
+       flip
+       blit
+       set_colors
+       set_color_key
+       set_alpha
+       display_format
+       rgb
+       rgba
+       print
+       save_bmp
+       video_info /);
+
+my $surface = SDL::Surface->new();
+
+isa_ok($surface,'SDL::Surface');
+
+#
+# Copyright (C) 2005 David J. Goehrig <dgoehrig\@cpan.org>
+#
+# ------------------------------------------------------------------------------
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+# 
+# This library 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
+# Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+#
+# ------------------------------------------------------------------------------
+#
+# Please feel free to send questions, suggestions or improvements to:
+#
+#      David J. Goehrig
+#      dgoehrig\@cpan.org
+#
diff --git a/t/timerpm.t b/t/timerpm.t
new file mode 100644 (file)
index 0000000..3e3624b
--- /dev/null
@@ -0,0 +1,62 @@
+#!/usr/bin/perl -w
+#
+# Copyright (C) 2003 Tels
+# Copyright (C) 2004 David J. Goehrig
+#
+# Copyright (C) 2005 David J. Goehrig <dgoehrig\@cpan.org>
+#
+# ------------------------------------------------------------------------------
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+# 
+# This library 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
+# Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+#
+# ------------------------------------------------------------------------------
+#
+# Please feel free to send questions, suggestions or improvements to:
+#
+#      David J. Goehrig
+#      dgoehrig\@cpan.org
+#
+#
+# basic testing of SDL::Timer
+
+BEGIN {
+       unshift @INC, 'blib/lib','blib/arch';
+}
+
+use strict;
+use SDL;
+use SDL::Config;
+
+use Test::More;
+
+plan ( tests => 4 );
+
+use_ok( 'SDL::Timer' ); 
+  
+can_ok ('SDL::Timer', qw/
+       new run stop
+       /);
+
+my $fired = 0;
+
+SDL::Init(SDL_INIT_TIMER);
+
+my $timer = new SDL::Timer 
+       sub { $fired++ }, -delay => 30, -times => 1;
+
+isa_ok($timer, 'SDL::Timer');
+
+SDL::Delay(100);
+is ($fired, 1,'timer fired once');
diff --git a/t/toolfontpm.t b/t/toolfontpm.t
new file mode 100644 (file)
index 0000000..e7efa73
--- /dev/null
@@ -0,0 +1,62 @@
+#!/usr/bin/perl -w
+#
+# Copyright (C) 2003 Tels
+# Copyright (C) 2004 David J. Goehrig
+#
+# Copyright (C) 2005 David J. Goehrig <dgoehrig\@cpan.org>
+#
+# ------------------------------------------------------------------------------
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+# 
+# This library 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
+# Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+#
+# ------------------------------------------------------------------------------
+#
+# Please feel free to send questions, suggestions or improvements to:
+#
+#      David J. Goehrig
+#      dgoehrig\@cpan.org
+#
+#
+# basic testing of SDL::Tool::Font
+
+BEGIN {
+       unshift @INC, 'blib/lib','blib/arch';
+}
+
+use strict;
+use SDL::Config;
+
+use Test::More;
+
+if ( SDL::Config->has('SDL_image') 
+       && SDL::Config->has('SDL_ttf') ) {
+       plan ( tests => 2 );
+} else {
+       plan ( skip_all => 
+               ( SDL::Config->has('SDL_image') 
+                       ? '' 
+                       : ' SDL_image support not compiled')
+               . ( SDL::Config->has('SDL_ttf') 
+                       ? ''
+                       : ' SDL_ttf support not compiled'));
+}
+
+use_ok( 'SDL::Tool::Font' ); 
+  
+can_ok ('SDL::Tool::Font', qw/
+       new 
+       print
+       /);
+
diff --git a/t/toolgraphicpm.t b/t/toolgraphicpm.t
new file mode 100644 (file)
index 0000000..36dc0f7
--- /dev/null
@@ -0,0 +1,57 @@
+#!/usr/bin/perl -w
+#
+# Copyright (C) 2003 Tels
+# Copyright (C) 2004 David J. Goehrig
+#
+# Copyright (C) 2005 David J. Goehrig <dgoehrig\@cpan.org>
+#
+# ------------------------------------------------------------------------------
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+# 
+# This library 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
+# Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+#
+# ------------------------------------------------------------------------------
+#
+# Please feel free to send questions, suggestions or improvements to:
+#
+#      David J. Goehrig
+#      dgoehrig\@cpan.org
+#
+#
+# basic testing of SDL::Tool::Graphic
+
+BEGIN {
+       unshift @INC, 'blib/lib','blib/arch';
+}
+
+use strict;
+use SDL::Config;
+
+use Test::More;
+
+if ( SDL::Config->has('SDL_gfx') ) {
+       plan ( tests => 3 );
+} else {
+       plan ( skip_all => 'SDL_gfx support not compiled' );
+}
+
+use_ok( 'SDL::Tool::Graphic' ); 
+  
+can_ok ('SDL::Tool::Graphic', qw/
+       new zoom rotoZoom
+       /);
+
+my $gtool = SDL::Tool::Graphic->new();
+isa_ok ($gtool, 'SDL::Tool::Graphic');
+
diff --git a/t/ttfontpm.t b/t/ttfontpm.t
new file mode 100644 (file)
index 0000000..823bea9
--- /dev/null
@@ -0,0 +1,70 @@
+#!/usr/bin/perl -w
+#
+# Copyright (C) 2003 Tels
+# Copyright (C) 2004 David J. Goehrig
+#
+# Copyright (C) 2005 David J. Goehrig <dgoehrig\@cpan.org>
+#
+# ------------------------------------------------------------------------------
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+# 
+# This library 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
+# Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+#
+# ------------------------------------------------------------------------------
+#
+# Please feel free to send questions, suggestions or improvements to:
+#
+#      David J. Goehrig
+#      dgoehrig\@cpan.org
+#
+#
+# basic testing of SDL::TTFont
+
+BEGIN {
+       unshift @INC, 'blib/lib','blib/arch';
+}
+
+use strict;
+use SDL::Config;
+
+use Test::More;
+
+if ( SDL::Config->has('SDL_ttf') ) {
+       plan ( tests => 2 );
+} else {
+       plan ( skip_all => 'SDL_ttf support not compiled' );
+}
+
+use_ok( 'SDL::TTFont' ); 
+  
+can_ok ('SDL::TTFont', qw/
+       new 
+       print 
+       width 
+       height
+       ascent 
+       descent 
+       normal 
+       bold 
+       italic 
+       underline
+       text_shaded 
+       text_solid 
+       text_blended 
+       utf8_shaded 
+       utf8_solid 
+       utf8_blended 
+       unicode_shaded 
+       unicode_solid 
+       unicode_blended /);
diff --git a/t/videopm.t b/t/videopm.t
new file mode 100644 (file)
index 0000000..31d40d6
--- /dev/null
@@ -0,0 +1,73 @@
+#!/usr/bin/perl -w
+#
+# Copyright (C) 2003 Tels
+# Copyright (C) 2004 David J. Goehrig
+#
+# Copyright (C) 2005 David J. Goehrig <dgoehrig\@cpan.org>
+#
+# ------------------------------------------------------------------------------
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+# 
+# This library 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
+# Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+#
+# ------------------------------------------------------------------------------
+#
+# Please feel free to send questions, suggestions or improvements to:
+#
+#      David J. Goehrig
+#      dgoehrig\@cpan.org
+#
+#
+# basic testing of SDL::VIDEO
+
+BEGIN {
+       unshift @INC, 'blib/lib','blib/arch';
+}
+
+use strict;
+use SDL::Config;
+
+use Test::More;
+
+if ( SDL::Config->has('smpeg') && SDL::Config->has('SDL_mixer') ) {
+       plan ( tests => 2 );
+} else {
+       plan ( skip_all => 
+               ( SDL::Config->has('smpeg') ? '' : ' smpeg support not compiled')  .
+               ( SDL::Config->has('SDL_mixer') ? '' : ' SDL_mixer support not compiled') );
+}
+
+use_ok( 'SDL::Video' ); 
+  
+can_ok ('SDL::Video', qw/
+       new
+       error
+       audio
+       video
+       volume
+       display
+       scale
+       play
+       pause
+       stop
+       rewind
+       seek
+       skip
+       loop
+       region
+       frame
+       info
+       status /);
+
+
diff --git a/test/64encode.pl b/test/64encode.pl
new file mode 100644 (file)
index 0000000..c9eea82
--- /dev/null
@@ -0,0 +1,9 @@
+#!/usr/bin/perl
+
+use MIME::Base64 qw/ encode_base64 /;
+
+open FILE, "< $ARGV[0]" or die "$!\n";
+
+while (read FILE, $buf, 60*57) {
+       print encode_base64($buf);
+}
diff --git a/test/OpenGL/.DS_Store b/test/OpenGL/.DS_Store
new file mode 100644 (file)
index 0000000..5b88d05
Binary files /dev/null and b/test/OpenGL/.DS_Store differ
diff --git a/test/OpenGL/README b/test/OpenGL/README
new file mode 100644 (file)
index 0000000..12ff39e
--- /dev/null
@@ -0,0 +1,37 @@
+README
+
+These scripts are intended to demonstrate how 
+the SDLperl OpenGL API can be used.  
+
+Due to the high level nature of the perl language,
+much of the OpenGL API's complexity has been
+reduced to a lowest common denominator, that is 
+to say, real numbers.
+
+Given the overhead of perl itself, hardware accleration
+is pretty much mandatory for good performance.  That
+said, perl and good hardware acceleration go hand in
+hand like fine wine and delicious cheese.
+
+Descriptions:
+
+test1.pl       Basic Triangle and Square
+test2.pl       3D Cube example
+test3.pl       Bezier Curve example
+test4.pl       Bezier Surface (wireframe & solid)
+test5.pl       Nurbs Surfaces, Curves, and Trims
+
+The tutorial directory contains SDL_perl specific 
+adaptations of Jeff Molofee's OpenGL tutorial examples.
+The original tutorials and accompanying C programs
+can be found at http://nehe.gamedev.net
+
+tutorial/lesson02.pl   Basic Triangle and Square
+tutorial/lesson03.pl   Color Triangle and Square
+tutorial/lesson04.pl   Rotating Triangle and Square
+tutorial/lesson05.pl   Rotating Pyramid and Cube
+tutorial/lesson06.pl   Rotating Textured Cube
+tutorial/lesson07.pl   Lighting and Filters Cube
+tutorial/lesson08.pl   Blending (aka transperancy) Cube
+
+
diff --git a/test/OpenGL/test1.sdlpl b/test/OpenGL/test1.sdlpl
new file mode 100644 (file)
index 0000000..a9ff01d
--- /dev/null
@@ -0,0 +1,122 @@
+#!/usr/bin/env perl
+#
+# test1.pl
+#
+# Copyright (C) 2005 David J. Goehrig <dgoehrig@cpan.org>
+#
+# ------------------------------------------------------------------------------
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+# 
+# This library 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
+# Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+#
+# ------------------------------------------------------------------------------
+#
+# Please feel free to send questions, suggestions or improvements to:
+#
+#      David J. Goehrig
+#      dgoehrig@cpan.org
+#
+
+use strict;
+use SDL;
+use SDL::App;
+use SDL::Surface;
+use SDL::Event;
+use SDL::OpenGL;
+use SDL::OpenGL::Constants;
+
+#for ( keys %main:: ) {
+#      print "$_\n";
+#}
+
+print "Starting $0\n";
+
+my $app = new SDL::App -w => 800, -h => 600, -d => 16, -gl => 1;
+
+print "Initializing OpenGL settings\n";
+printf "%-24s%s\n", "GL_RED_SIZE ", $app->attribute( SDL_GL_RED_SIZE() );
+printf "%-24s%s\n", "GL_GREEN_SIZE ", $app->attribute( SDL_GL_GREEN_SIZE());
+printf "%-24s%s\n", "GL_BLUE_SIZE ", $app->attribute( SDL_GL_BLUE_SIZE() );
+printf "%-24s%s\n", "GL_DEPTH_SIZE ", $app->attribute( SDL_GL_DEPTH_SIZE() );
+printf "%-24s%s\n", "GL_DOUBLEBUFFER ", $app->attribute( SDL_GL_DOUBLEBUFFER() );
+
+sub DrawScene {
+
+       glClear( GL_DEPTH_BUFFER_BIT() 
+               | GL_COLOR_BUFFER_BIT());
+
+       glLoadIdentity();
+
+       glTranslate(-1.5,0,-6);
+       
+       glColor(1,1,1);
+
+       glBegin(GL_TRIANGLES());
+               glColor(1,0,0) if (@_);
+               glVertex(0,1,0);
+               glColor(0,1,0) if (@_);
+               glVertex(-1,-1,0);
+               glColor(0,0,1) if (@_);
+               glVertex(1,-1,0);
+       glEnd();
+
+       glTranslate(3,0,0);
+
+       glBegin(GL_QUADS());
+               glColor(1,0,0) if (@_);
+               glVertex(-1,1,0);
+               glColor(0,1,0) if (@_);
+               glVertex(1,1,0);
+               glColor(0,0,1) if (@_);
+               glVertex(1,-1,0);
+               glColor(1,1,0) if (@_);
+               glVertex(-1,-1,0);
+       glEnd();
+}
+
+sub DrawColorScene {
+       DrawScene 'with color';
+}
+
+sub InitView {
+       glViewport(0,0,800,600);
+
+       glMatrixMode(GL_PROJECTION());
+       glLoadIdentity();
+
+       if ( @_ ) {
+               gluPerspective(45.0,4/3,0.1,100.0);
+       } else {
+               glFrustum(-0.1,0.1,-0.075,0.075,0.175,100.0);
+       }
+
+       glMatrixMode(GL_MODELVIEW());
+       glLoadIdentity();
+}
+
+InitView();
+
+DrawScene();
+
+$app->sync();
+
+my $toggle = 1;
+
+$app->loop( { 
+       SDL_QUIT() => sub { exit(0); },
+       SDL_KEYDOWN() => sub {  $toggle = ($toggle) ? 0 : 1; 
+                               ($toggle) ? DrawScene() : DrawColorScene(); 
+                               $app->sync();
+                               },
+       } );
diff --git a/test/OpenGL/test2.sdlpl b/test/OpenGL/test2.sdlpl
new file mode 100644 (file)
index 0000000..9461793
--- /dev/null
@@ -0,0 +1,181 @@
+#!/usr/bin/env perl
+#
+# test2.pl
+#
+# Copyright (C) 2005 David J. Goehrig <dgoehrig@cpan.org>
+#
+# ------------------------------------------------------------------------------
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+# 
+# This library 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
+# Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+#
+# ------------------------------------------------------------------------------
+#
+# Please feel free to send questions, suggestions or improvements to:
+#
+#      David J. Goehrig
+#      dgoehrig@cpan.org
+#
+
+use SDL;
+use SDL::App;
+use SDL::Surface;
+use SDL::Event;
+use SDL::OpenGL;
+
+package SDL::OpenGL::Cube;
+use SDL;
+use SDL::OpenGL;
+
+my $vertex_array = pack "d24", 
+       -0.5,-0.5,-0.5, 0.5,-0.5,-0.5, 0.5,0.5,-0.5, -0.5,0.5,-0.5, # back
+       -0.5,-0.5,0.5,  0.5,-0.5,0.5,  0.5,0.5,0.5,  -0.5,0.5,0.5 ;  # front
+
+my $indicies = pack "C24",     
+                       4,5,6,7,        # front
+                       1,2,6,5,        # right
+                       0,1,5,4,        # bottom
+                       0,3,2,1,        # back
+                       0,4,7,3,        # left
+                       2,3,7,6;        # top
+
+sub new {
+       my $proto = shift;
+       my $class = ref($proto) || $proto;
+       my $self = {};
+       bless $self,$class;
+       $self;
+}
+
+sub draw {
+       my ($self) = @_;
+       $self->color();
+       glEnableClientState(SDL::GL_VERTEX_ARRAY());
+       glVertexPointer(3,SDL::GL_DOUBLE(),0,$vertex_array);
+       glDrawElements(SDL::GL_QUADS(), 24, SDL::GL_UNSIGNED_BYTE(), $indicies);
+}
+
+sub color {
+       my ($self,@colors) = @_;
+
+       if (@colors) {
+               $$self{colored} = 1;
+               die "SDL::OpenGL::Cube::color requires 24 floating point color values\n"
+                       unless (scalar(@colors) == 24);
+               $$self{-colors} = pack "f24",@colors;
+       }
+
+       if ($$self{colored}) {
+               glEnableClientState(SDL::GL_COLOR_ARRAY);
+               glColorPointer(3,SDL::GL_FLOAT,0,$$self{-colors});
+       } else {
+               glDisableClientState(SDL::GL_COLOR_ARRAY);
+       }
+}
+
+
+1;
+
+
+$delay = $ARGV[0] || 5;
+
+print "Starting $0\n";
+
+my $app = new SDL::App -w => 800, -h => 600, -d => 16, -gl =>1;
+
+print "Initializing OpenGL settings\n";
+printf "%-24s%s\n", "GL_RED_SIZE ", $app->attribute( SDL::SDL_GL_RED_SIZE() );
+printf "%-24s%s\n", "GL_GREEN_SIZE ", $app->attribute( SDL::SDL_GL_GREEN_SIZE());
+printf "%-24s%s\n", "GL_BLUE_SIZE ", $app->attribute( SDL::SDL_GL_BLUE_SIZE() );
+printf "%-24s%s\n", "GL_DEPTH_SIZE ", $app->attribute( SDL::SDL_GL_DEPTH_SIZE() );
+printf "%-24s%s\n", "GL_DOUBLEBUFFER ", $app->attribute( SDL::SDL_GL_DOUBLEBUFFER() );
+
+$angle = 0;    
+$other = 0;
+       
+my @colors =  (
+       1.0,1.0,0.0,    1.0,0.0,0.0,    0.0,1.0,0.0, 0.0,0.0,1.0,       #back
+       0.4,0.4,0.4,    0.3,0.3,0.3,    0.2,0.2,0.2, 0.1,0.1,0.1 );     #front
+       
+
+$cube = new SDL::OpenGL::Cube;
+$cube->color(@colors);
+
+$white = new SDL::OpenGL::Cube;
+
+$toggle = 1;
+
+glEnable(GL_CULL_FACE);
+glFrontFace(GL_CCW);
+glCullFace(GL_BACK);
+
+sub DrawScene {
+
+       glClear( SDL::GL_DEPTH_BUFFER_BIT() 
+               | SDL::GL_COLOR_BUFFER_BIT());
+
+       glLoadIdentity();
+
+       glTranslate(0,0,-6.0);
+       glRotate($angle % 360,1,1,0);
+       glRotate($other % 360,0,1,1);
+
+       $angle += 6;
+       $other += $angle % 5;
+
+       glColor(1,1,1);
+       $toggle ? $cube->draw() : $white->draw();
+
+       $app->sync();
+
+}
+
+sub InitView {
+       glViewport(0,0,800,600);
+
+       glMatrixMode(SDL::GL_PROJECTION());
+       glLoadIdentity();
+
+       if ( @_ ) {
+               gluPerspective(45.0,4/3,0.1,100.0);
+       } else {
+               glFrustum(-0.1,0.1,-0.075,0.075,0.3,100.0);
+       }
+
+       glMatrixMode(SDL::GL_MODELVIEW());
+       glLoadIdentity();
+}
+
+InitView();
+
+DrawScene();
+$app->sync();
+
+my $event = new SDL::Event;
+
+for (;;) {
+       for (0 .. 5) {
+                       $event->pump(); 
+                       $event->poll();
+                       exit(0) if ($event->type() == SDL::SDL_QUIT()); 
+                       if (SDL::GetKeyState(SDL::SDLK_SPACE()) == SDL::SDL_PRESSED()) {
+                               $toggle = 0;
+                       } else {
+                               $toggle = 1;
+                       }
+                       $app->delay($delay);
+               }
+       DrawScene();
+}
+
diff --git a/test/OpenGL/test3.sdlpl b/test/OpenGL/test3.sdlpl
new file mode 100644 (file)
index 0000000..8922167
--- /dev/null
@@ -0,0 +1,89 @@
+#!/usr/bin/env perl
+#
+# test3.pl
+#
+# Copyright (C) 2005 David J. Goehrig <dgoehrig@cpan.org>
+#
+# ------------------------------------------------------------------------------
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+# 
+# This library 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
+# Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+#
+# ------------------------------------------------------------------------------
+#
+# Please feel free to send questions, suggestions or improvements to:
+#
+#      David J. Goehrig
+#      dgoehrig@cpan.org
+#
+
+use strict;
+use SDL;
+use SDL::App;
+use SDL::Surface;
+use SDL::Event;
+use SDL::OpenGL;
+
+my $app = new SDL::App -w => 800, -h => 600, -d => 16, -gl => 1;
+
+my @points = (  [-4.0, -4.0,  0.0 ],
+               [-2.0,  4.0,  0.0 ],
+               [ 2.0, -4.0,  0.0 ],
+               [ 4.0,  4.0,  0.0 ] );
+
+my $ctrlpoints = pack "d12", map { @$_ } @points;
+
+sub init {
+       
+       glViewport(0,0,800,600);
+       glMatrixMode(GL_PROJECTION());
+       glLoadIdentity();
+
+       glFrustum (-0.1,0.1,-0.075,0.075,0.3,100.0 );
+       
+       glMatrixMode(GL_MODELVIEW());
+       glLoadIdentity();
+       
+       glTranslate(0,0,-30);
+
+       glClearColor(0.0, 0.0, 0.0, 0.0);       
+       glShadeModel(GL_FLAT());
+       glMap1(GL_MAP1_VERTEX_3(), 0.0, 1.0, 3, 4, $ctrlpoints);
+       glEnable(GL_MAP1_VERTEX_3());
+}
+
+sub display {
+       glClear(GL_COLOR_BUFFER_BIT);
+       glColor(1.0,1.0,1.0);
+       glBegin(GL_LINE_STRIP);
+               for my $i ( 0 .. 30 ) {
+                       glEvalCoord1($i/30);
+               }
+       glEnd();
+
+       glPointSize(5);
+       glColor(1.0,1.0,0);
+       glBegin(GL_POINTS);
+               for my $i ( 0 .. 3 ) {
+                       glVertex( @{$points[$i]} );
+               }
+       glEnd();
+       $app->sync();
+}
+
+init();
+display();
+
+$app->loop({ SDL_QUIT() => sub { exit(); } });
+
diff --git a/test/OpenGL/test4.sdlpl b/test/OpenGL/test4.sdlpl
new file mode 100644 (file)
index 0000000..53af368
--- /dev/null
@@ -0,0 +1,144 @@
+#!/usr/bin/env perl
+#
+# test4.pl
+#
+# Copyright (C) 2005 David J. Goehrig <dgoehrig@cpan.org>
+#
+# ------------------------------------------------------------------------------
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+# 
+# This library 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
+# Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+#
+# ------------------------------------------------------------------------------
+#
+# Please feel free to send questions, suggestions or improvements to:
+#
+#      David J. Goehrig
+#      dgoehrig@cpan.org
+#
+
+use strict;
+use SDL;
+use SDL::App;
+use SDL::Event;
+use SDL::OpenGL;
+
+our $toggle = 0;
+my $app = new SDL::App -w => 800, -h => 600, -d => 16, -gl => 1;
+
+my @points = (  [-1.5, -1.5,  4.0 ], [-0.5, -1.5,  2.0 ],
+               [-0.5, -1.5, -1.0 ], [ 1.5, -1.5,  2.0 ],
+               [-1.5, -0.5,  1.0 ], [-0.5, -0.5,  3.0 ],
+               [ 0.5, -0.5,  0.0 ], [ 1.5, -0.5, -1.0 ], 
+               [-1.5,  0.5,  4.0 ], [-0.5,  0.5,  0.0 ],
+               [ 0.5,  0.5,  3.0 ], [ 1.5,  0.5,  4.0 ],
+               [-1.5,  1.5, -2.0 ], [-0.5,  1.5, -2.0 ],
+               [ 0.5,  1.5,  0.0 ], [ 1.5,  1.5, -1.0 ],
+       );
+
+my $ctrlpoints = pack "d48", map { @$_ } @points;
+
+sub init {
+       
+       glViewport(0,0,800,600);
+       glMatrixMode(GL_PROJECTION());
+       glLoadIdentity();
+
+       glFrustum (-0.1,0.1,-0.075,0.075,0.3,100.0 );
+       
+       glMatrixMode(GL_MODELVIEW());
+       glLoadIdentity();
+       
+       glTranslate(0,0,-15);
+
+       glClearColor(0.0, 0.0, 0.0, 0.0);       
+       glMap2(GL_MAP2_VERTEX_3(), 0, 1, 3, 4, 0, 1, 12, 4, $ctrlpoints);
+       glEnable(GL_MAP2_VERTEX_3());
+       glMapGrid2(20,0,1,20,0,1);
+       glEnable(GL_DEPTH_TEST);
+       glShadeModel(GL_SMOOTH());
+}
+
+sub initlight {
+
+       glEnable(GL_LIGHTING());
+       glEnable(GL_LIGHT0());
+
+       glLight(GL_LIGHT0(),GL_AMBIENT(),0.2,0.2,0.2,1.0);
+       glLight(GL_LIGHT0(),GL_POSITION(), 0.0,0.0,2.0,1.0);
+
+       glMaterial(GL_FRONT(), GL_DIFFUSE(),0.6,0.6,0.6,1.0);
+       glMaterial(GL_FRONT(), GL_SPECULAR(), 1.0, 1.0, 1.0, 1.0);
+       glMaterial(GL_FRONT(), GL_SHININESS(), 50.0);
+
+}
+
+my ($a1,$a2) = (89,305);
+
+sub display {
+       glClear(GL_COLOR_BUFFER_BIT() | GL_DEPTH_BUFFER_BIT());
+       glColor(1.0,1.0,1.0);
+       glPushMatrix();
+       glRotate($a1 % 360, 0.0, 1.0, 1.0);
+       glRotate($a2 % 360, 1.0, 1.0, 0.0);
+       if ($toggle) {
+               glEvalMesh2(GL_FILL,0,20,0,20);
+       } else {
+               glBegin(GL_LINE_STRIP);
+               for my $j ( 0 .. 8 ) {
+                       for my $i ( 0 .. 30 ) {
+                               glEvalCoord2($i/30,$j/8);
+                       }
+                       for my $i ( 0 .. 30 ) {
+                               glEvalCoord2($j/8,$i/30);
+                       }
+               }
+               glEnd();
+       }
+       glPopMatrix();
+       $app->sync();
+}
+
+print STDERR <<USAGE;
+$0
+       Press:  t       Toggle wireframe / solid
+               f       Toggle fullscreen
+               q       Quit
+               any     Rotate Bezier Surface
+USAGE
+
+init();
+initlight();
+display();
+
+my $event = new SDL::Event;
+$app->loop ({
+               SDL_QUIT() => sub { exit(); }, 
+               SDL_KEYDOWN() => sub { 
+                       my ($event) = @_;
+                       if ( $event->key_sym() == SDLK_f ) {
+                               $app->fullscreen();
+                               display(); 
+                       } elsif ( $event->key_sym() == SDLK_t ) {
+                               $toggle = $toggle ? 0 : 1;
+                               display();
+                       } elsif ( $event->key_sym() == SDLK_q ) {
+                               exit();
+                       } else {
+                               $a1 += 33; $a2 += 5;  
+                               display(); 
+                       }
+               },
+});
+
diff --git a/test/OpenGL/test5.sdlpl b/test/OpenGL/test5.sdlpl
new file mode 100644 (file)
index 0000000..1960b4e
--- /dev/null
@@ -0,0 +1,159 @@
+#!/usr/bin/env perl
+#
+# test5.pl
+#
+# Copyright (C) 2005 David J. Goehrig <dgoehrig@cpan.org>
+#
+# ------------------------------------------------------------------------------
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+# 
+# This library 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
+# Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+#
+# ------------------------------------------------------------------------------
+#
+# Please feel free to send questions, suggestions or improvements to:
+#
+#      David J. Goehrig
+#      dgoehrig@cpan.org
+#
+
+use strict;
+use SDL;
+use SDL::App;
+use SDL::Event;
+use SDL::OpenGL;
+
+my $app = new SDL::App -w => 800, -h => 600, -d => 16, -gl => 1;
+my $toggle;
+
+my $knots = pack "f8", 0,0,0,0,1,1,1,1;
+my $edgePts = pack "f10", 0,0,1,0,1,1,0,1,0,0;
+my $curvePts = pack "f8", 0.25,0.5,0.25,0.75,0.75,0.75,0.75,0.5;
+my $curveKnots = pack "f8", 0,0,0,0,1,1,1,1;
+my $pwlPts = pack "f8", 0.75, 0.5, 0.5, 0.25, 0.25, 0.5, 0, 0;
+
+sub init {
+       glViewport(0,0,800,600);
+       glMatrixMode(GL_PROJECTION());
+       glLoadIdentity();
+       glFrustum (-0.1,0.1,-0.075,0.075,0.3,100.0 );
+       glMatrixMode(GL_MODELVIEW());
+       glLoadIdentity();
+       glTranslate(0,0,-15);
+       glClearColor(0.0, 0.0, 0.0, 0.0);       
+       glShadeModel(GL_SMOOTH());
+}
+
+sub initlight {
+       glEnable(GL_LIGHTING());
+       glEnable(GL_LIGHT0());
+       glEnable(GL_DEPTH_TEST());
+       glEnable(GL_AUTO_NORMAL());
+       glEnable(GL_NORMALIZE());
+       glLight(GL_LIGHT0(),GL_AMBIENT(),0.3,0.3,0.3,1.0);
+       glLight(GL_LIGHT0(),GL_POSITION(), 1.0,0.0,2.0,1.0);
+       glMaterial(GL_FRONT(), GL_DIFFUSE(),0.6,0.6,0.6,1.0);
+       glMaterial(GL_FRONT(), GL_SPECULAR(), 1.0, 1.0, 1.0, 1.0);
+       glMaterial(GL_FRONT(), GL_SHININESS(), 40.0);
+}
+
+my ($a,$b) = (0,90);
+
+my $ctrldata;
+sub initpts {
+       my @points;
+       for my $u ( 0 .. 3 ) {
+               for my $v ( 0 .. 3 ) {
+                       push @points, 2.0 * ($u - 1.5);
+                       push @points, 2.0 * ($v - 1.5);
+                       if (( $u == 1 || $u == 2 ) && ( $v == 1 || $v == 2 )) {
+                               push @points,  3.0;
+                       } else {
+                               push @points, -3.0;
+                       }
+               }
+       }
+       $ctrldata = pack "f48", @points;
+}
+
+sub display {
+       glClear(GL_COLOR_BUFFER_BIT() | GL_DEPTH_BUFFER_BIT());
+       glPushMatrix();
+       glRotate($a%360,0,1,0);
+       glRotate($b%360,-1,0,0);
+       glScale(0.5,0.5,0.5);
+       my $nurb = gluNewNurbsRenderer();
+       gluNurbsProperty($nurb,GLU_CULLING,GL_TRUE);
+       gluBeginSurface($nurb);
+               gluNurbsSurface($nurb, 8, $knots, 8, $knots, 
+                       4*3, 3, $ctrldata, 
+                       4, 4, GL_MAP2_VERTEX_3);
+       if ($toggle) {
+               gluBeginTrim($nurb);
+                       gluPwlCurve($nurb,5,$edgePts,2,GLU_MAP1_TRIM_2);
+               gluEndTrim($nurb);
+               gluBeginTrim($nurb);
+                       gluNurbsCurve($nurb,8,$curveKnots, 2, $curvePts, 4, GLU_MAP1_TRIM_2);
+                       gluPwlCurve($nurb,3,$pwlPts,2,GLU_MAP1_TRIM_2);
+               gluEndTrim($nurb);
+       }
+               
+       gluEndSurface($nurb);
+
+       glPopMatrix();
+       $app->sync();
+}
+
+init();
+initlight();
+initpts();
+display();
+
+print STDERR <<USAGE;
+Press:
+q                      Quit
+t                      Toggle Curve & Trim
+f                      Toggle Fullscreen
+Up/Down/Left/Right     Rotate
+
+USAGE
+
+my $event = new SDL::Event;
+$app->loop ({
+               SDL_QUIT() => sub { exit(); }, 
+               SDL_KEYDOWN() => sub { 
+                       my ($event) = @_;
+                       if ( $event->key_sym() == SDLK_f ) {
+                               $app->fullscreen();
+                               display(); 
+                       } elsif ( $event->key_sym() == SDLK_t ) {
+                               $toggle = $toggle ? 0 : 1;
+                               display();
+                       } elsif ( $event->key_sym() == SDLK_q ) {
+                               exit();
+                       } else {
+                               if ($event->key_sym() == SDLK_LEFT()) {
+                                       $a -= 10; 
+                               } elsif ($event->key_sym() == SDLK_RIGHT()) {
+                                       $a += 10; 
+                               } elsif ($event->key_sym() == SDLK_UP()) {
+                                       $b += 10;
+                               } elsif ($event->key_sym() == SDLK_DOWN()) {
+                                       $b -= 10;       
+                               }
+                               display(); 
+                       }
+               },
+});
+
diff --git a/test/OpenGL/tutorial/.DS_Store b/test/OpenGL/tutorial/.DS_Store
new file mode 100644 (file)
index 0000000..c2cd56c
Binary files /dev/null and b/test/OpenGL/tutorial/.DS_Store differ
diff --git a/test/OpenGL/tutorial/lesson02.sdlpl b/test/OpenGL/tutorial/lesson02.sdlpl
new file mode 100644 (file)
index 0000000..1752eb1
--- /dev/null
@@ -0,0 +1,156 @@
+#!/usr/bin/env perl
+#
+# lesson02.pl
+#
+# Copyright (C) 2005 David J. Goehrig <dgoehrig@cpan.org>
+#
+# ------------------------------------------------------------------------------
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+# 
+# This library 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
+# Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+#
+# ------------------------------------------------------------------------------
+#
+# Please feel free to send questions, suggestions or improvements to:
+#
+#      David J. Goehrig
+#      dgoehrig@cpan.org
+#
+
+use strict;
+use Getopt::Long;
+use SDL;
+use SDL::App;
+use SDL::OpenGL;
+use SDL::Event;
+
+my $arg_screen_width =640;
+my $arg_screen_height=512;
+my $arg_fullscreen=0;
+
+GetOptions(
+          "width:i"        => \$arg_screen_width,
+          "height:i"       => \$arg_screen_height,
+          "fullscreen!"    => \$arg_fullscreen,
+
+         ) or die $!;
+
+main();
+exit;
+
+
+sub main
+  {  
+   my $done=0;
+
+   my $app = new SDL::App ( -title => "Jeff Molofee's GL Code Tutorial ... NeHe '99", 
+                           -icon => "icon.png",
+                           -width => $arg_screen_width,
+                           -height =>$arg_screen_height,
+                           -d => 16,
+                           -gl => 1,
+                           
+                         );
+       $app->fullscreen() if ($arg_fullscreen);
+   
+   SDL::ShowCursor (0);   
+   
+   my $event = new SDL::Event;
+   $event->set(SDL_SYSWMEVENT,SDL_IGNORE);#
+
+   InitGL($arg_screen_width, $arg_screen_height);
+
+   while ( ! $done ) {
+
+    DrawGLScene();
+
+    $app->sync();
+   
+    $event->pump;
+    $event->poll;
+    
+    
+    if ( $event->type == SDL_QUIT ) {
+     $done = 1;
+    }
+
+    if ( $event->type == SDL_KEYDOWN ) {
+     if ( $event->key_sym == SDLK_ESCAPE ) {
+      $done = 1;
+     }
+    }
+   }
+  }
+
+
+
+
+
+
+#########################################################################
+#Pretty much in original form, but 'Perlised' 
+
+
+sub InitGL
+  {
+   my ($Width, $Height)=@_;
+
+   glViewport(0, 0, $Width, $Height);
+   glClearColor(0.0, 0.0, 0.0, 0.0);                           # This Will Clear The Background Color To Black
+   glClearDepth(1.0);                                          # Enables Clearing Of The Depth Buffer
+   glDepthFunc(GL_LESS());                                     # The Type Of Depth Test To Do
+   glEnable(GL_DEPTH_TEST());                                  # Enables Depth Testing
+   glShadeModel(GL_SMOOTH());                                  # Enables Smooth Color Shading
+   
+   glMatrixMode(GL_PROJECTION());
+   glLoadIdentity();                                           # Reset The Projection Matrix
+   
+   gluPerspective(45.0, $Width/$Height, 0.1, 100.0);           # Calculate The Aspect Ratio Of The Window
+   
+   glMatrixMode(GL_MODELVIEW());
+  }
+
+
+
+# The main drawing function.
+sub DrawGLScene
+  {
+   glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);         # Clear The Screen And The Depth Buffer
+   glLoadIdentity();                                           # Reset The View
+   
+   glTranslate(-1.5,0.0,-6.0);                                 # Move Left 1.5 Units And Into The Screen 6.0
+   
+   # draw a triangle
+   glBegin(GL_POLYGON);                                                # start drawing a polygon
+   glVertex( 0.0, 1.0, 0.0);                                   # Top
+   glVertex( 1.0,-1.0, 0.0);                                   # Bottom Right
+   glVertex(-1.0,-1.0, 0.0);                                   # Bottom Left   
+   glEnd();                                                    # we're done with the polygon
+   
+   glTranslate(3.0,0.0,0.0);                                   # Move Right 3 Units
+   
+   # draw a square (quadrilateral)
+   glBegin(GL_QUADS);                                          # start drawing a polygon (4 sided)
+   glVertex(-1.0, 1.0, 0.0);                                   # Top Left
+   glVertex( 1.0, 1.0, 0.0);                                   # Top Right
+   glVertex( 1.0,-1.0, 0.0);                                   # Bottom Right
+   glVertex(-1.0,-1.0, 0.0);                                   # Bottom Left   
+   glEnd();                                                    # done with the polygon
+   
+   
+  }
+
+
+
+
diff --git a/test/OpenGL/tutorial/lesson03.sdlpl b/test/OpenGL/tutorial/lesson03.sdlpl
new file mode 100644 (file)
index 0000000..d2129e1
--- /dev/null
@@ -0,0 +1,161 @@
+#!/usr/bin/env perl
+#
+# lesson03.pl
+#
+# Copyright (C) 2005 David J. Goehrig <dgoehrig@cpan.org>
+#
+# ------------------------------------------------------------------------------
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+# 
+# This library 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
+# Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+#
+# ------------------------------------------------------------------------------
+#
+# Please feel free to send questions, suggestions or improvements to:
+#
+#      David J. Goehrig
+#      dgoehrig@cpan.org
+
+use strict;
+use Getopt::Long;
+use SDL;
+use SDL::App;
+use SDL::OpenGL;
+use SDL::Event;
+
+my $arg_screen_width =640;
+my $arg_screen_height=512;
+my $arg_fullscreen=0;
+
+GetOptions(
+          "width:i"        => \$arg_screen_width,
+          "height:i"       => \$arg_screen_height,
+          "fullscreen!"    => \$arg_fullscreen,
+         ) or die $!;
+
+main();
+exit;
+
+
+sub main
+  {  
+   my $done=0;
+   
+   my $app = new SDL::App ( -title => "Jeff Molofee's GL Code Tutorial ... NeHe '99", 
+                           -icon => "icon.png",
+                           -width => $arg_screen_width,
+                           -height =>$arg_screen_height,
+                            -d => 16,
+                            -opengl => 1,
+                         );
+   $app->fullscreen() if $arg_fullscreen;
+   
+   SDL::ShowCursor(0);   
+   
+   my $event = new SDL::Event;
+   $event->set(SDL_SYSWMEVENT,SDL_IGNORE);#
+   
+
+
+   InitGL($arg_screen_width, $arg_screen_height);
+
+   while ( ! $done ) {
+
+    DrawGLScene();
+
+    $app->sync();
+   
+    $event->pump;
+    $event->poll;
+    
+    
+    if ( $event->type == SDL_QUIT ) {
+     $done = 1;
+    }
+
+    if ( $event->type == SDL_KEYDOWN ) {
+     if ( $event->key_sym == SDLK_ESCAPE ) {
+      $done = 1;
+     }
+    }
+   }
+  }
+
+
+
+
+
+
+#########################################################################
+#Pretty much in original form, but 'Perlised' 
+
+
+sub InitGL
+  {
+   my ($Width, $Height)=@_;
+
+   glViewport(0, 0, $Width, $Height);
+   glClearColor(0.0, 0.0, 0.0, 0.0);                           # This Will Clear The Background Color To Black
+   glClearDepth(1.0);                                          # Enables Clearing Of The Depth Buffer
+   glDepthFunc(GL_LESS);                                       # The Type Of Depth Test To Do
+   glEnable(GL_DEPTH_TEST);                                    # Enables Depth Testing
+   glShadeModel(GL_SMOOTH);                                    # Enables Smooth Color Shading
+   
+   glMatrixMode(GL_PROJECTION);
+   glLoadIdentity();                                           # Reset The Projection Matrix
+   
+   gluPerspective(45.0, $Width/$Height, 0.1, 100.0);           # Calculate The Aspect Ratio Of The Window
+   
+   glMatrixMode(GL_MODELVIEW);
+  }
+
+
+
+# The main drawing function.
+sub DrawGLScene
+  {
+   glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);         # Clear The Screen And The Depth Buffer
+   glLoadIdentity();                                           # Reset The View
+   
+   glTranslate(-1.5,0.0,-6.0);         # Move Left 1.5 Units And Into The Screen 6.0
+       
+   # draw a triangle (in smooth coloring mode)
+   glBegin(GL_POLYGON);                                # start drawing a polygon
+   glColor(1.0,0.0,0.0);                       # Set The Color To Red
+   glVertex( 0.0, 1.0, 0.0);                   # Top
+   glColor(0.0,1.0,0.0);                       # Set The Color To Green
+   glVertex( 1.0,-1.0, 0.0);                   # Bottom Right
+   glColor(0.0,0.0,1.0);                       # Set The Color To Blue
+   glVertex(-1.0,-1.0, 0.0);                   # Bottom Left   
+   glEnd();                                    # we're done with the polygon (smooth color interpolation)      
+   
+   glTranslate(3.0,0.0,0.0);                   # Move Right 3 Units
+   
+   # draw a square (quadrilateral)
+   glColor(0.5,0.5,1.0);                       # set color to a blue shade.
+   glBegin(GL_QUADS);                          # start drawing a polygon (4 sided)
+   glVertex(-1.0, 1.0, 0.0);                   # Top Left
+   glVertex( 1.0, 1.0, 0.0);                   # Top Right
+   glVertex( 1.0,-1.0, 0.0);                   # Bottom Right
+   glVertex(-1.0,-1.0, 0.0);                   # Bottom Left   
+   glEnd();                                    # done with the polygon
+
+   
+   
+   
+  }
+
+
+
+
diff --git a/test/OpenGL/tutorial/lesson04.sdlpl b/test/OpenGL/tutorial/lesson04.sdlpl
new file mode 100644 (file)
index 0000000..82e0d3a
--- /dev/null
@@ -0,0 +1,179 @@
+#!/usr/bin/env perl
+#
+# lesson04.pl
+#
+# Copyright (C) 2005 David J. Goehrig <dgoehrig@cpan.org>
+#
+# ------------------------------------------------------------------------------
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+# 
+# This library 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
+# Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+#
+# ------------------------------------------------------------------------------
+#
+# Please feel free to send questions, suggestions or improvements to:
+#
+#      David J. Goehrig
+#      dgoehrig@cpan.org
+#
+
+use strict;
+use Getopt::Long;
+use SDL;
+use SDL::App;
+use SDL::OpenGL;
+use SDL::Event;
+
+my $arg_screen_width =640;
+my $arg_screen_height=512;
+my $arg_fullscreen=0;
+my $delay=30;
+
+GetOptions(
+          "width:i"        => \$arg_screen_width,
+          "height:i"       => \$arg_screen_height,
+          "fullscreen!"    => \$arg_fullscreen,
+          "delay:i"        => \$delay,
+         ) or die <<USAGE;
+Usage $0 -w 800 -h 600 -d 10 --fullscreen 
+USAGE
+
+#/* rotation angle for the triangle. */
+my $rtri = 0.0;
+
+#/* rotation angle for the quadrilateral. */
+my $rquad = 0.0;
+
+
+main();
+exit;
+
+
+sub main
+  {  
+   my $done=0;
+   my $app = new SDL::App ( -title => "Jeff Molofee's GL Code Tutorial ... NeHe '99", 
+                           -icon => "icon.png",
+                           -width => $arg_screen_width,
+                           -height =>$arg_screen_height,
+                           -gl => 1,
+                         );
+   $app->fullscreen() if $arg_fullscreen;
+   
+   SDL::ShowCursor(0);   
+   
+   my $event = new SDL::Event;
+   $event->set(SDL_SYSWMEVENT,SDL_IGNORE);#
+   
+
+
+   InitGL($arg_screen_width, $arg_screen_height);
+
+   while ( ! $done ) {
+
+    DrawGLScene();
+
+    $app->sync();
+    $app->delay($delay);
+   
+    $event->pump;
+    $event->poll;
+    
+    
+    if ( $event->type == SDL_QUIT ) {
+     $done = 1;
+    }
+
+    if ( $event->type == SDL_KEYDOWN ) {
+     if ( $event->key_sym == SDLK_ESCAPE ) {
+      $done = 1;
+     }
+    }
+   }
+  }
+
+
+
+
+
+
+#########################################################################
+#Pretty much in original form, but 'Perlised' 
+
+
+
+
+
+sub InitGL
+  {
+   my ($Width, $Height)=@_;
+
+   glViewport(0, 0, $Width, $Height);
+   glClearColor(0.0, 0.0, 0.0, 0.0);                           # This Will Clear The Background Color To Black
+   glClearDepth(1.0);                                          # Enables Clearing Of The Depth Buffer
+   glDepthFunc(GL_LESS);                                       # The Type Of Depth Test To Do
+   glEnable(GL_DEPTH_TEST);                                    # Enables Depth Testing
+   glShadeModel(GL_SMOOTH);                                    # Enables Smooth Color Shading
+   
+   glMatrixMode(GL_PROJECTION);
+   glLoadIdentity();                                           # Reset The Projection Matrix
+   
+   gluPerspective(45.0, $Width/$Height, 0.1, 100.0);           # Calculate The Aspect Ratio Of The Window
+   
+   glMatrixMode(GL_MODELVIEW);
+  }
+
+
+
+# The main drawing function.
+sub DrawGLScene
+  {
+   glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);         # Clear The Screen And The Depth Buffer
+   glLoadIdentity();                                           # Reset The View
+   
+   glTranslate(-1.5,0.0,-6.0);         # Move Left 1.5 Units And Into The Screen 6.0
+       
+  glRotate($rtri,0.0,1.0,0.0);         # Rotate The Triangle On The Y axis 
+  # draw a triangle (in smooth coloring mode)
+  glBegin(GL_POLYGON);                         # start drawing a polygon
+  glColor(1.0,0.0,0.0);                        # Set The Color To Red
+  glVertex( 0.0, 1.0, 0.0);            # Top
+  glColor(0.0,1.0,0.0);                        # Set The Color To Green
+  glVertex( 1.0,-1.0, 0.0);            # Bottom Right
+  glColor(0.0,0.0,1.0);                        # Set The Color To Blue
+  glVertex(-1.0,-1.0, 0.0);            # Bottom Left   
+  glEnd();                                     # we're done with the polygon (smooth color interpolation)
+
+  glLoadIdentity();                            # make sure we're no longer rotated.
+  glTranslate(1.5,0.0,-6.0);           # Move Right 3 Units, and back into the screen 6.0
+       
+  glRotate($rquad,1.0,0.0,0.0);                # Rotate The Quad On The X axis 
+  # draw a square (quadrilateral)
+  glColor(0.5,0.5,1.0);                        # set color to a blue shade.
+  glBegin(GL_QUADS);                           # start drawing a polygon (4 sided)
+  glVertex(-1.0, 1.0, 0.0);            # Top Left
+  glVertex( 1.0, 1.0, 0.0);            # Top Right
+  glVertex( 1.0,-1.0, 0.0);            # Bottom Right
+  glVertex(-1.0,-1.0, 0.0);            # Bottom Left   
+  glEnd();                                     # done with the polygon
+
+  $rtri+=15.0;                                 # Increase The Rotation Variable For The Triangle
+  $rquad-=15.0;                                        # Decrease The Rotation Variable For The Quad 
+   
+  }
+
+
+
+
diff --git a/test/OpenGL/tutorial/lesson05.sdlpl b/test/OpenGL/tutorial/lesson05.sdlpl
new file mode 100644 (file)
index 0000000..45709cd
--- /dev/null
@@ -0,0 +1,242 @@
+#!/usr/bin/env perl
+#
+# lesson05.pl
+#
+# Copyright (C) 2005 David J. Goehrig <dgoehrig@cpan.org>
+#
+# ------------------------------------------------------------------------------
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+# 
+# This library 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
+# Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+#
+# ------------------------------------------------------------------------------
+#
+# Please feel free to send questions, suggestions or improvements to:
+#
+#      David J. Goehrig
+#      dgoehrig@cpan.org
+#
+
+use strict;
+use Getopt::Long;
+use SDL;
+use SDL::App;
+use SDL::OpenGL;
+use SDL::Event;
+use SDL::Cursor;     
+
+my $arg_screen_width =640;
+my $arg_screen_height=512;
+my $arg_fullscreen=0;
+my $delay = 30;
+
+GetOptions(
+          "width:i"        => \$arg_screen_width,
+          "height:i"       => \$arg_screen_height,
+          "fullscreen!"    => \$arg_fullscreen,
+          "delay:i"        => \$delay,
+         ) or die $!;
+
+main();
+exit;
+
+
+sub main
+  {  
+   my $done=0;
+   
+   my $app = new SDL::App ( -title => "Jeff Molofee's GL Code Tutorial ... NeHe '99", 
+                           -icon => "icon.png",
+                           -width => $arg_screen_width,
+                           -height =>$arg_screen_height,
+                           -opengl => 1,
+                         );
+
+       $app->fullscreen if ($arg_fullscreen);
+   
+   SDL::ShowCursor(0);   
+   
+   my $event = new SDL::Event;
+   $event->set(SDL_SYSWMEVENT(),SDL_IGNORE());#
+   
+   InitGL($arg_screen_width, $arg_screen_height);
+
+   while ( ! $done ) {
+
+    DrawGLScene();
+
+    $app->sync();
+    $app->delay($delay);
+   
+    $event->pump;
+    $event->poll;
+    
+    
+    if ( $event->type == SDL_QUIT() ) {
+     $done = 1;
+    }
+
+    if ( $event->type == SDL_KEYDOWN() ) {
+     if ( $event->key_sym == SDLK_ESCAPE() ) {
+      $done = 1;
+     }
+    }
+   }
+  }
+
+
+
+
+
+
+#########################################################################
+#Pretty much in original form, but 'Perlised' 
+
+
+
+#/* rotation angle for the triangle. */
+my $rtri = 0.0;
+
+#/* rotation angle for the quadrilateral. */
+my $rquad = 0.0;
+
+
+sub InitGL
+  {
+   my ($Width, $Height)=@_;
+
+   glViewport(0, 0, $Width, $Height);
+   glClearColor(0.0, 0.0, 0.0, 0.0);                           # This Will Clear The Background Color To Black
+   glClearDepth(1.0);                                          # Enables Clearing Of The Depth Buffer
+   glDepthFunc(GL_LESS);                                       # The Type Of Depth Test To Do
+   glEnable(GL_DEPTH_TEST);                                    # Enables Depth Testing
+   glShadeModel(GL_SMOOTH);                                    # Enables Smooth Color Shading
+   
+   glMatrixMode(GL_PROJECTION);
+   glLoadIdentity();                                           # Reset The Projection Matrix
+   
+   gluPerspective(45.0, $Width/$Height, 0.1, 100.0);           # Calculate The Aspect Ratio Of The Window
+   
+   glMatrixMode(GL_MODELVIEW);
+  }
+
+
+
+# The main drawing function.
+sub DrawGLScene
+  {
+   glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);         # Clear The Screen And The Depth Buffer
+   glLoadIdentity();                                           # Reset The View
+   
+  glTranslate(-1.5,0.0,-6.0);          # Move Left 1.5 Units And Into The Screen 6.0
+       
+  glRotate($rtri,0.0,1.0,0.0);         # Rotate The Pyramid On The Y axis 
+
+  # draw a pyramid (in smooth coloring mode)
+  glBegin(GL_POLYGON);                         # start drawing a pyramid
+
+  # front face of pyramid
+  glColor(1.0,0.0,0.0);                        # Set The Color To Red
+  glVertex(0.0, 1.0, 0.0);                     # Top of triangle (front)
+  glColor(0.0,1.0,0.0);                        # Set The Color To Green
+  glVertex(-1.0,-1.0, 1.0);            # left of triangle (front)
+  glColor(0.0,0.0,1.0);                        # Set The Color To Blue
+  glVertex(1.0,-1.0, 1.0);                     # right of traingle (front)     
+
+  # right face of pyramid
+  glColor(1.0,0.0,0.0);                        # Red
+  glVertex( 0.0, 1.0, 0.0);            # Top Of Triangle (Right)
+  glColor(0.0,0.0,1.0);                        # Blue
+  glVertex( 1.0,-1.0, 1.0);            # Left Of Triangle (Right)
+  glColor(0.0,1.0,0.0);                        # Green
+  glVertex( 1.0,-1.0, -1.0);           # Right Of Triangle (Right)
+
+  # back face of pyramid
+  glColor(1.0,0.0,0.0);                        # Red
+  glVertex( 0.0, 1.0, 0.0);            # Top Of Triangle (Back)
+  glColor(0.0,1.0,0.0);                        # Green
+  glVertex( 1.0,-1.0, -1.0);           # Left Of Triangle (Back)
+  glColor(0.0,0.0,1.0);                        # Blue
+  glVertex(-1.0,-1.0, -1.0);           # Right Of Triangle (Back)
+
+  # left face of pyramid.
+  glColor(1.0,0.0,0.0);                        # Red
+  glVertex( 0.0, 1.0, 0.0);            # Top Of Triangle (Left)
+  glColor(0.0,0.0,1.0);                        # Blue
+  glVertex(-1.0,-1.0,-1.0);            # Left Of Triangle (Left)
+  glColor(0.0,1.0,0.0);                        # Green
+  glVertex(-1.0,-1.0, 1.0);            # Right Of Triangle (Left)
+
+  glEnd();                                     # Done Drawing The Pyramid
+
+  glLoadIdentity();                            # make sure we're no longer rotated.
+  glTranslate(1.5,0.0,-7.0);           # Move Right 3 Units, and back into the screen 7
+       
+  glRotate($rquad,1.0,1.0,1.0);                # Rotate The Cube On X, Y, and Z
+
+  # draw a cube (6 quadrilaterals)
+  glBegin(GL_QUADS);                           # start drawing the cube.
+  
+  # top of cube
+  glColor(0.0,1.0,0.0);                        # Set The Color To Blue
+  glVertex( 1.0, 1.0,-1.0);            # Top Right Of The Quad (Top)
+  glVertex(-1.0, 1.0,-1.0);            # Top Left Of The Quad (Top)
+  glVertex(-1.0, 1.0, 1.0);            # Bottom Left Of The Quad (Top)
+  glVertex( 1.0, 1.0, 1.0);            # Bottom Right Of The Quad (Top)
+
+  # bottom of cube
+  glColor(1.0,0.5,0.0);                        # Set The Color To Orange
+  glVertex( 1.0,-1.0, 1.0);            # Top Right Of The Quad (Bottom)
+  glVertex(-1.0,-1.0, 1.0);            # Top Left Of The Quad (Bottom)
+  glVertex(-1.0,-1.0,-1.0);            # Bottom Left Of The Quad (Bottom)
+  glVertex( 1.0,-1.0,-1.0);            # Bottom Right Of The Quad (Bottom)
+
+  # front of cube
+  glColor(1.0,0.0,0.0);                        # Set The Color To Red
+  glVertex( 1.0, 1.0, 1.0);            # Top Right Of The Quad (Front)
+  glVertex(-1.0, 1.0, 1.0);            # Top Left Of The Quad (Front)
+  glVertex(-1.0,-1.0, 1.0);            # Bottom Left Of The Quad (Front)
+  glVertex( 1.0,-1.0, 1.0);            # Bottom Right Of The Quad (Front)
+
+  # back of cube.
+  glColor(1.0,1.0,0.0);                        # Set The Color To Yellow
+  glVertex( 1.0,-1.0,-1.0);            # Top Right Of The Quad (Back)
+  glVertex(-1.0,-1.0,-1.0);            # Top Left Of The Quad (Back)
+  glVertex(-1.0, 1.0,-1.0);            # Bottom Left Of The Quad (Back)
+  glVertex( 1.0, 1.0,-1.0);            # Bottom Right Of The Quad (Back)
+
+  # left of cube
+  glColor(0.0,0.0,1.0);                        # Blue
+  glVertex(-1.0, 1.0, 1.0);            # Top Right Of The Quad (Left)
+  glVertex(-1.0, 1.0,-1.0);            # Top Left Of The Quad (Left)
+  glVertex(-1.0,-1.0,-1.0);            # Bottom Left Of The Quad (Left)
+  glVertex(-1.0,-1.0, 1.0);            # Bottom Right Of The Quad (Left)
+
+  # Right of cube
+  glColor(1.0,0.0,1.0);                        # Set The Color To Violet
+  glVertex( 1.0, 1.0,-1.0);            # Top Right Of The Quad (Right)
+  glVertex( 1.0, 1.0, 1.0);            # Top Left Of The Quad (Right)
+  glVertex( 1.0,-1.0, 1.0);            # Bottom Left Of The Quad (Right)
+  glVertex( 1.0,-1.0,-1.0);            # Bottom Right Of The Quad (Right)
+  glEnd();                                     # Done Drawing The Cube
+
+  $rtri+=15.0;                                 # Increase The Rotation Variable For The Triangle
+  $rquad-=15.0;                                        # Decrease The Rotation Variable For The Quad 
+   
+  }
+
+
+
+
diff --git a/test/OpenGL/tutorial/lesson06.sdlpl b/test/OpenGL/tutorial/lesson06.sdlpl
new file mode 100644 (file)
index 0000000..02a4c79
--- /dev/null
@@ -0,0 +1,2563 @@
+#!/usr/bin/env perl
+#
+# lesson06.pl
+#
+# Copyright (C) 2005 David J. Goehrig <dgoehrig@cpan.org>
+#
+# ------------------------------------------------------------------------------
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+# 
+# This library 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
+# Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+#
+# ------------------------------------------------------------------------------
+#
+# Please feel free to send questions, suggestions or improvements to:
+#
+#      David J. Goehrig
+#      dgoehrig@cpan.org
+#
+
+use strict;
+use Data::Dumper;
+use Benchmark;
+use Getopt::Long;
+use MIME::Base64 qw(decode_base64);
+use SDL;
+use SDL::App;
+use SDL::OpenGL;
+use SDL::Event;
+
+my $arg_screen_width =640;
+my $arg_screen_height=512;
+my $arg_fullscreen=0;
+my $delay = 3;
+
+GetOptions(
+          "width:i"        => \$arg_screen_width,
+          "height:i"       => \$arg_screen_height,
+          "fullscreen!"    => \$arg_fullscreen,
+          "delay:i"    => \$delay,
+
+         ) or die $!;
+
+############################################################
+
+my ($xrot, $yrot, $zrot) = (0,0,0);
+
+write_crate();
+main();
+exit;
+
+
+sub main
+  {  
+   my $done=0;
+   my $pth = $0;
+   $pth =~ s/\w+\.\w+$//;
+   
+   my $app = new SDL::App ( -title => "Jeff Molofee's GL Code Tutorial ... NeHe '99", 
+                           -icon => "$pth/Data/perl.png",
+                           -width => $arg_screen_width,
+                           -height =>$arg_screen_height,
+                           -opengl => 1,
+                         );
+   $app->fullscreen() if $arg_fullscreen;
+   
+   SDL::ShowCursor(0);   
+
+   my $event = new SDL::Event;
+   $event->set(SDL_SYSWMEVENT,SDL_IGNORE);
+   
+   InitGL($arg_screen_width, $arg_screen_height);
+
+
+   while ( not $done ) {
+
+    DrawGLScene();
+
+    $app->sync();
+   
+    for (1 .. 10) {
+       $event->pump;
+       $event->poll;
+       $app->delay($delay);
+    }
+    
+    
+    if ( $event->type == SDL_QUIT ) {
+     $done = 1;
+    }
+
+    if ( $event->type == SDL_KEYDOWN ) {
+     if ( $event->key_sym == SDLK_ESCAPE ) {
+      $done = 1;
+     }
+    }
+   }
+  }
+
+
+
+
+
+
+#########################################################################
+#Pretty much in original form, but 'Perlised' 
+
+
+
+
+sub InitGL
+  {
+   my ($Width, $Height) = @_;
+
+   glViewport(0, 0, $Width, $Height);
+
+   LoadGLTextures();                           # Load The Texture(s) 
+
+   glEnable(GL_TEXTURE_2D());                  # Enable Texture Mapping
+
+   glClearColor(0.0, 0.0, 1.0, 0.0);                           # This Will Clear The Background Color To Black
+   glClearDepth(1.0);                                          # Enables Clearing Of The Depth Buffer
+   glDepthFunc(GL_LESS);                                       # The Type Of Depth Test To Do
+   glEnable(GL_DEPTH_TEST);                                    # Enables Depth Testing
+   glShadeModel(GL_SMOOTH);                                    # Enables Smooth Color Shading
+   
+   glMatrixMode(GL_PROJECTION);
+   glLoadIdentity();                                           # Reset The Projection Matrix
+   
+   gluPerspective(45.0, $Width/$Height, 0.1, 100.0);           # Calculate The Aspect Ratio Of The Window
+   
+   glMatrixMode(GL_MODELVIEW);
+  }
+
+
+
+# The main drawing function.
+sub DrawGLScene
+  {
+   glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);         # Clear The Screen And The Depth Buffer
+   glLoadIdentity();                                           # Reset The View
+   
+   glTranslate(0.0,0.0,-5.0);                                  # move 5 units into the screen.
+   
+   glRotate($xrot,1.0,0.0,0.0);                                # Rotate On The X Axis
+   glRotate($yrot,0.0,1.0,0.0);                                # Rotate On The Y Axis
+   glRotate($zrot,0.0,0.0,1.0);                                # Rotate On The Z Axis
+   
+   glBindTexture(GL_TEXTURE_2D, 1);   # choose the texture to use.
+   
+   glBegin(GL_QUADS);                                          # begin drawing a cube
+   
+   # Front Face (note that the texture's corners have to match the quad's corners)
+   glTexCoord(0.0, 0.0); glVertex(-1.0, -1.0,  1.0);   # Bottom Left Of The Texture and Quad
+   glTexCoord(1.0, 0.0); glVertex( 1.0, -1.0,  1.0);   # Bottom Right Of The Texture and Quad
+   glTexCoord(1.0, 1.0); glVertex( 1.0,  1.0,  1.0);   # Top Right Of The Texture and Quad
+   glTexCoord(0.0, 1.0); glVertex(-1.0,  1.0,  1.0);   # Top Left Of The Texture and Quad
+   
+   # Back Face
+   glTexCoord(1.0, 0.0); glVertex(-1.0, -1.0, -1.0);   # Bottom Right Of The Texture and Quad
+   glTexCoord(1.0, 1.0); glVertex(-1.0,  1.0, -1.0);   # Top Right Of The Texture and Quad
+   glTexCoord(0.0, 1.0); glVertex( 1.0,  1.0, -1.0);   # Top Left Of The Texture and Quad
+   glTexCoord(0.0, 0.0); glVertex( 1.0, -1.0, -1.0);   # Bottom Left Of The Texture and Quad
+   
+   # Top Face
+   glTexCoord(0.0, 1.0); glVertex(-1.0,  1.0, -1.0);   # Top Left Of The Texture and Quad
+   glTexCoord(0.0, 0.0); glVertex(-1.0,  1.0,  1.0);   # Bottom Left Of The Texture and Quad
+   glTexCoord(1.0, 0.0); glVertex( 1.0,  1.0,  1.0);   # Bottom Right Of The Texture and Quad
+   glTexCoord(1.0, 1.0); glVertex( 1.0,  1.0, -1.0);   # Top Right Of The Texture and Quad
+   
+   # Bottom Face       
+   glTexCoord(1.0, 1.0); glVertex(-1.0, -1.0, -1.0);   # Top Right Of The Texture and Quad
+   glTexCoord(0.0, 1.0); glVertex( 1.0, -1.0, -1.0);   # Top Left Of The Texture and Quad
+   glTexCoord(0.0, 0.0); glVertex( 1.0, -1.0,  1.0);   # Bottom Left Of The Texture and Quad
+   glTexCoord(1.0, 0.0); glVertex(-1.0, -1.0,  1.0);   # Bottom Right Of The Texture and Quad
+   
+   # Right face
+   glTexCoord(1.0, 0.0); glVertex( 1.0, -1.0, -1.0);   # Bottom Right Of The Texture and Quad
+   glTexCoord(1.0, 1.0); glVertex( 1.0,  1.0, -1.0);   # Top Right Of The Texture and Quad
+   glTexCoord(0.0, 1.0); glVertex( 1.0,  1.0,  1.0);   # Top Left Of The Texture and Quad
+   glTexCoord(0.0, 0.0); glVertex( 1.0, -1.0,  1.0);   # Bottom Left Of The Texture and Quad
+   
+   # Left Face
+   glTexCoord(0.0, 0.0); glVertex(-1.0, -1.0, -1.0);   # Bottom Left Of The Texture and Quad
+   glTexCoord(1.0, 0.0); glVertex(-1.0, -1.0,  1.0);   # Bottom Right Of The Texture and Quad
+   glTexCoord(1.0, 1.0); glVertex(-1.0,  1.0,  1.0);   # Top Right Of The Texture and Quad
+   glTexCoord(0.0, 1.0); glVertex(-1.0,  1.0, -1.0);   # Top Left Of The Texture and Quad
+   
+   glEnd();                                                    # done with the polygon.
+   
+   $xrot+=15.0;                                                        # X Axis Rotation       
+   $yrot+=15.0;                                                        # Y Axis Rotation
+   $zrot+=15.0;                                                        # Z Axis Rotation
+
+   
+  }
+
+#my $image1,$a;  #this can cause a segfault in LoadGLTextures/glTexImage2D   !!!
+
+
+sub LoadGLTextures
+  {
+    # Load Texture
+
+   #uncomment this for a different method of loading:
+   #my $img_data  = read_gfx_file(FILENAME=>"../../ScrollerDemos/backdrop2.h");
+   #my $pixel_ptr = $img_data->{PIXEL_PTR};
+   #my $pic_info  = $img_data->{INFO};
+   #my $width     = $pic_info->{WIDTH};
+   #my $height    = $pic_info->{HEIGHT};
+
+    
+   #if you uncomment the bit above, comment this out:
+   #-snip-
+   my $pth = $0;
+   $pth =~ s/\w+\.\w+$//;
+   my $surface=create_SDL_surface_from_file("/tmp/crate.png");
+   my $width=$surface->width();
+   my $height=$surface->height();
+   my $pitch = $surface->pitch();
+   my $bytespp=  $surface->bytes_per_pixel();
+   my $size=$pitch*$height;
+   my $pixels = $surface->pixels();
+
+   # Create Texture    
+   my $textures = glGenTextures(1);                #name texture
+       die "Could not genereate textures" unless $$textures[0];
+
+   glBindTexture(GL_TEXTURE_2D, $$textures[0]);   # 2d texture 
+   
+   
+   glTexParameter(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); # scale linearly when image bigger than texture
+   glTexParameter(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); # scale linearly when image smalled than texture
+  
+   glTexImage2D(GL_TEXTURE_2D(), 
+                  0,                      #level (0 normal, heighr is form mip-mapping)
+                  GL_RGB(),                      #internal format (3=GL_RGB)
+                  $width,$height,
+                  0,                      # border 
+                  GL_RGB(),                 #format RGB color data
+                 GL_UNSIGNED_BYTE(),       #unsigned bye data
+                 $pixels);            #ptr to texture data
+
+    die "Problem setting up 2d Texture (dimensions not a power of 2?)):".glErrorString(glGetError())."\n" if glGetError();
+
+  }
+
+sub create_SDL_surface_from_file
+  {
+   my $filename=shift;
+   
+   my $surface = new SDL::Surface( -name  => $filename);
+   
+   return $surface;
+                              
+  }
+
+
+
+
+
+###################
+#alternat loading support:
+
+#keep ref counts up:
+my @sprite_c_heap =();
+my @sprite_area =();
+
+sub read_gfx_file
+  {
+   my %args=(
+            TYPE       => "GIMP_HEADER",
+            FILENAME  => undef,
+            @_,
+           );
+   
+   my $struct   = read_gimp_header_image($args{FILENAME}); 
+   my $size     = length $struct->{DATA};
+   my $c_array  = new OpenGL::Array  $size  , GL_UNSIGNED_BYTE;
+
+   # c_array is the main reason to do the following ref count trickster:
+   # (otherwise the OpenGL:Array goes out of scope and the memory (image) is ZEROed out (and invalidated) by the DESTROY method
+   push @sprite_c_heap,  $c_array;             
+   push @sprite_area,    $struct;
+
+   $c_array->assign_data(0, $struct->{DATA} );   #take a copy of the data
+   
+   return {
+          PIXEL_PTR   => $c_array->ptr(), #could return $c_array instead to kepe ref count alive
+          INFO        => $struct,
+         };
+
+   #that all needs modularising.....
+
+  }
+
+
+#nasty fixed to 3 byte RGB 
+sub read_gimp_header_image
+  {
+   my $file=shift;
+   my $cached_file="$file.cached-bin";
+
+   my ($width, $height,$pixel_format, $data)=(0,0,"RGB","");
+
+   #due to that fact that this aint the fastest code ever, we keep a cache.
+   if (-e $cached_file and (-C $file >= -C $cached_file))
+     {
+
+      print "Reading cached binary bitmap data :  $cached_file\n";
+      open (FH, "<$file.cached-bin") or die "Open: $!";
+      my $line="";
+      $width=<FH>;
+      $height=<FH>;
+      $pixel_format=<FH>;
+      chomp $width;
+      chomp $height;
+      chomp $pixel_format;  #but who cares? not here anyway!!!
+
+      #slurp in the rest of the file (its pixel data)
+      {
+       local $/;
+       undef $/;
+       
+       my @lines= <FH>;
+       $data=join '', @lines;
+      }
+      
+      close (FH);
+     }
+   else                 # there is no cached file, or the cached file is out of date.
+     {
+      
+      open (FH, "<$file") or die "Open: $!";
+
+      my @data=();
+      my @pixel=();
+      while (defined (my $line=<FH>))
+       {
+        $width =$1 if ($line =~ /width\s*=\s*(\d+)/);
+        $height=$1 if ($line =~ /height\s*=\s*(\d+)/);
+        if ($line =~ /^\s+\"(.+)\"$/g)
+          {
+           my $c=$1;
+           $c =~ s/\\(.)/$1/g;                                 #remove meta guard
+           $c =~ 
+             s/
+               \G
+                 (.)(.)(.)(.)
+                   /
+                     @data=(ord($1),ord($2),ord($3),ord($4));
+           
+           chr    (  (  (  ( $data[0] - 33) <<  2)       | (  ($data[1] - 33) >> 4) ) ). 
+             chr (  (  (  (  ( $data[1] - 33) & 0xF) << 4) | (  ($data[2] - 33) >> 2) ) ).
+               chr (  (  (  (  ( $data[2] - 33) & 0x3) << 6) | (  ($data[3] - 33)     ) ) ); 
+           /gex;      
+           
+           $data.=$c ;
+          }
+       }
+      
+      
+      close(FH);
+      
+      print "Writing cached binary bitmap data for:  $file as $cached_file\n";
+      
+      #create a binary cached copy
+      open (FH, ">$cached_file") or die "Open: $!";
+      binmode FH;  #we might have to put up with weak OSes.
+      print FH  "$width\n$height\n$pixel_format\n$data";
+
+      close(FH);
+     }
+   
+
+
+
+   return {
+          WIDTH  => $width,
+          HEIGHT => $height,
+          FORMAT => $pixel_format,
+          DATA   => $data
+         };
+  }
+
+
+
+sub write_crate {
+       my $crate = decode_base64 <<EOF;
+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
+SUVORK5CYII=
+EOF
+
+       open FP, "> /tmp/crate.png";
+       print FP $crate;
+       close FP;
+}
diff --git a/test/OpenGL/tutorial/lesson07.sdlpl b/test/OpenGL/tutorial/lesson07.sdlpl
new file mode 100644 (file)
index 0000000..447b956
--- /dev/null
@@ -0,0 +1,2556 @@
+#!/usr/bin/env perl
+#
+# lesson07.pl
+#
+# Copyright (C) 2005 David J. Goehrig <dgoehrig@cpan.org>
+#
+# ------------------------------------------------------------------------------
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+# 
+# This library 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
+# Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+#
+# ------------------------------------------------------------------------------
+#
+# Please feel free to send questions, suggestions or improvements to:
+#
+#      David J. Goehrig
+#      dgoehrig@cpan.org
+#
+use Data::Dumper;
+use Benchmark;
+use Getopt::Long;
+use MIME::Base64 qw(decode_base64);
+use SDL;
+use SDL::App;
+use SDL::OpenGL;
+use SDL::Event;
+use SDL::Surface;
+use SDL::OpenGL;
+
+my $arg_screen_width =640;
+my $arg_screen_height=512;
+my $arg_fullscreen=0;
+
+GetOptions(
+          "width:i"        => \$arg_screen_width,
+          "height:i"       => \$arg_screen_height,
+          "fullscreen!"    => \$arg_fullscreen,
+         ) or die $!;
+
+############################################################
+
+my  $light = 0;
+
+my $xrot=0;   # x rotation 
+my $yrot=0;   # y rotation 
+my $xspeed=0; # x rotation speed
+my $yspeed=0; # y rotation speed
+
+my $z=-5.0; # depth into the screen.
+
+my $filter = 1;        # Which Filter To Use (nearest/linear/mipmapped) */
+
+write_crate();
+main();
+exit;
+
+sub main
+  {  
+   my $done=0;
+   my $vidmode_flags= SDL_OPENGL;
+
+   $vidmode_flags|= SDL_FULLSCREEN if $arg_fullscreen;
+   
+   my $app = new SDL::App ( -title => "Jeff Molofee's GL Code Tutorial ... NeHe '99", 
+                           -icon => "icon.png",
+                           -flags => $vidmode_flags,                   
+                           -width => $arg_screen_width,
+                           -height =>$arg_screen_height,
+                           -opengl => 1,
+                         );
+   
+   SDL::ShowCursor(0);   
+
+   my $event = new SDL::Event;
+   $event->set(SDL_SYSWMEVENT,SDL_IGNORE);
+
+   InitGL($arg_screen_width, $arg_screen_height);
+
+   while ( not $done ) 
+     {
+      
+      DrawGLScene();
+
+      $app->sync();
+      
+      $event->pump;
+      $event->poll;
+      
+      $done = 1 if ( $event->type == SDL_QUIT ) ;
+
+      
+      if ( $event->type == SDL_KEYDOWN ) 
+       {
+        my $key= $event->key_sym;
+
+        $done = 1 if ( $key == SDLK_ESCAPE ) ;
+        
+
+        if ($key==SDLK_l)
+          {
+           printf("Light was: %d\n", $light);
+           $light = $light ? 0 : 1;    # switch the current value of light, between 0 and 1.
+           printf("Light is now: %d\n", $light);
+           if (!$light) 
+             {
+              glDisable(GL_LIGHTING);
+             } 
+           else 
+             {
+              glEnable(GL_LIGHTING);
+             }
+           
+          }
+        if ($key==SDLK_f)
+          {
+           printf("Filter was: %d\n", $filter);
+           $filter = 1+(($filter) % 3) ;
+           printf("Filter is now: %d\n", $filter);      
+          } 
+
+        #bit lax:
+        $z-=0.02      if ( $key == SDLK_PAGEUP );
+        $z+=0.02      if ( $key == SDLK_PAGEDOWN );
+        $xspeed+=0.02 if ( $key == SDLK_UP );
+        $xspeed-=0.02 if ( $key == SDLK_DOWN );         
+        $yspeed-=0.01 if ( $key == SDLK_LEFT );
+        $yspeed+=0.01 if ( $key == SDLK_RIGHT );
+        
+       }
+     }
+  }
+
+
+
+
+
+
+#########################################################################
+#Pretty much in original form, but 'Perlised' 
+
+
+
+
+sub InitGL
+  {
+   my ($Width, $Height) = @_;
+
+   glViewport(0, 0, $Width, $Height);
+
+   LoadGLTextures();                           # Load The Texture(s) 
+
+   glEnable(GL_TEXTURE_2D);                    # Enable Texture Mapping
+
+   
+   glClearColor(0.0, 0.0, 0.0, 0.0);                           # This Will Clear The Background Color To Black
+   glClearDepth(1.0);                                          # Enables Clearing Of The Depth Buffer
+   glDepthFunc(GL_LESS);                                       # The Type Of Depth Test To Do
+   glEnable(GL_DEPTH_TEST);                                    # Enables Depth Testing
+   glShadeModel(GL_SMOOTH);                                    # Enables Smooth Color Shading
+   
+   glMatrixMode(GL_PROJECTION);
+   glLoadIdentity();                                           # Reset The Projection Matrix
+   
+   gluPerspective(45.0, $Width/$Height, 0.1, 100.0);           # Calculate The Aspect Ratio Of The Window
+   
+   glMatrixMode(GL_MODELVIEW);
+
+   
+   my $LightAmbient  = [ 0.5, 0.5, 0.5, 1.0 ];                   # white ambient light at half intensity (rgba) */
+
+   my $LightDiffuse  = [ 1.0, 1.0, 1.0, 1.0 ];                    # super bright, full intensity diffuse light. */
+
+   my $LightPosition = [ 0.0 , 0.0, 2.0, 1.0 ];                 # position of light (x, y, z, (position of light)) */
+
+
+
+   #hmm, undefine:
+   glLight(GL_LIGHT1, GL_AMBIENT, @$LightAmbient);  # add lighting. (ambient)
+   glLight(GL_LIGHT1, GL_DIFFUSE, @$LightDiffuse);  # add lighting. (diffuse).
+   glLight(GL_LIGHT1, GL_POSITION,@$LightPosition); # set light position.
+   glEnable(GL_LIGHT1);                             # turn light 1 on.  
+  }
+
+
+
+# The main drawing function.
+sub DrawGLScene
+  {
+   glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);         # Clear The Screen And The Depth Buffer
+   glLoadIdentity();                                           # Reset The View
+   
+   glTranslate(0.0,0.0,$z);                  # move z units out from the screen.
+    
+   glRotate($xrot,1.0,0.0,0.0);                # Rotate On The X Axis
+   glRotate($yrot,0.0,1.0,0.0);                # Rotate On The Y Axis
+   
+   glBindTexture(GL_TEXTURE_2D, $filter);                      # choose the texture to use.
+   
+   glBegin(GL_QUADS);                                          # begin drawing a cube
+   
+   # Front Face (note that the texture's corners have to match the quad's corners)
+   glNormal( 0.0, 0.0, 1.0);                                   # front face points out of the screen on z.
+   glTexCoord(0.0, 0.0); glVertex(-1.0, -1.0,  1.0);   # Bottom Left Of The Texture and Quad
+   glTexCoord(1.0, 0.0); glVertex( 1.0, -1.0,  1.0);   # Bottom Right Of The Texture and Quad
+   glTexCoord(1.0, 1.0); glVertex( 1.0,  1.0,  1.0);   # Top Right Of The Texture and Quad
+   glTexCoord(0.0, 1.0); glVertex(-1.0,  1.0,  1.0);   # Top Left Of The Texture and Quad
+   
+   # Back Face
+   glNormal( 0.0, 0.0,-1.0);                                   # back face points into the screen on z.
+   glTexCoord(1.0, 0.0); glVertex(-1.0, -1.0, -1.0);   # Bottom Right Of The Texture and Quad
+   glTexCoord(1.0, 1.0); glVertex(-1.0,  1.0, -1.0);   # Top Right Of The Texture and Quad
+   glTexCoord(0.0, 1.0); glVertex( 1.0,  1.0, -1.0);   # Top Left Of The Texture and Quad
+   glTexCoord(0.0, 0.0); glVertex( 1.0, -1.0, -1.0);   # Bottom Left Of The Texture and Quad
+   
+   # Top Face
+   glNormal( 0.0, 1.0, 0.0);                                   # top face points up on y.
+   glTexCoord(0.0, 1.0); glVertex(-1.0,  1.0, -1.0);   # Top Left Of The Texture and Quad
+   glTexCoord(0.0, 0.0); glVertex(-1.0,  1.0,  1.0);   # Bottom Left Of The Texture and Quad
+   glTexCoord(1.0, 0.0); glVertex( 1.0,  1.0,  1.0);   # Bottom Right Of The Texture and Quad
+   glTexCoord(1.0, 1.0); glVertex( 1.0,  1.0, -1.0);   # Top Right Of The Texture and Quad
+   
+   # Bottom Face       
+   glNormal( 0.0, -1.0, 0.0);                                  # bottom face points down on y. 
+   glTexCoord(1.0, 1.0); glVertex(-1.0, -1.0, -1.0);   # Top Right Of The Texture and Quad
+   glTexCoord(0.0, 1.0); glVertex( 1.0, -1.0, -1.0);   # Top Left Of The Texture and Quad
+   glTexCoord(0.0, 0.0); glVertex( 1.0, -1.0,  1.0);   # Bottom Left Of The Texture and Quad
+   glTexCoord(1.0, 0.0); glVertex(-1.0, -1.0,  1.0);   # Bottom Right Of The Texture and Quad
+   
+   # Right face
+   glNormal( 1.0, 0.0, 0.0);                                   # right face points right on x.
+   glTexCoord(1.0, 0.0); glVertex( 1.0, -1.0, -1.0);   # Bottom Right Of The Texture and Quad
+   glTexCoord(1.0, 1.0); glVertex( 1.0,  1.0, -1.0);   # Top Right Of The Texture and Quad
+   glTexCoord(0.0, 1.0); glVertex( 1.0,  1.0,  1.0);   # Top Left Of The Texture and Quad
+   glTexCoord(0.0, 0.0); glVertex( 1.0, -1.0,  1.0);   # Bottom Left Of The Texture and Quad
+   
+   # Left Face
+   glNormal(-1.0, 0.0, 0.0);                                   # left face points left on x.
+   glTexCoord(0.0, 0.0); glVertex(-1.0, -1.0, -1.0);   # Bottom Left Of The Texture and Quad
+   glTexCoord(1.0, 0.0); glVertex(-1.0, -1.0,  1.0);   # Bottom Right Of The Texture and Quad
+   glTexCoord(1.0, 1.0); glVertex(-1.0,  1.0,  1.0);   # Top Right Of The Texture and Quad
+   glTexCoord(0.0, 1.0); glVertex(-1.0,  1.0, -1.0);   # Top Left Of The Texture and Quad
+   
+   glEnd();                                                    # done with the polygon.
+   
+   $xrot+=$xspeed;                                             # X Axis Rotation       
+   $yrot+=$yspeed;                                             # Y Axis Rotation
+   
+   
+   
+  }
+
+
+
+
+sub LoadGLTextures
+  {
+    # Load Texture
+
+   
+   my $pth = $0;
+   $pth =~ s/\w+\.\w+$//;
+   my ($pixels, $width, $height, $size)=ImageLoad("/tmp/crate.png");
+   
+   # Create Texture    
+   
+   glGenTextures(3);
+   
+   # texture 1 (poor quality scaling)
+   glBindTexture(GL_TEXTURE_2D, 1);                    # 2d texture (x and y size)
+   
+   glTexParameter(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST); # cheap scaling when image bigger than texture
+   glTexParameter(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST); # cheap scaling when image smalled than texture
+   
+   # 2d texture, level of detail 0 (normal), 3 components (red, green, blue), x size from image, y size from image, 
+   # border 0 (normal), rgb color data, unsigned byte data, and finally the data itself.
+   #glTexImage2D(GL_TEXTURE_2D, 0, 3, image1->w, image1->h, 0, GL_RGB, GL_UNSIGNED_BYTE, image1->pixels);
+   
+   glTexImage2D(GL_TEXTURE_2D, 
+                 0,                                            #level (0 normal, heighr is form mip-mapping)
+                 3,                                            #internal format (3=GL_RGB)
+                 $width,$height,
+                 0,                                            # border 
+                 GL_RGB,                                       #format RGB color data
+                 GL_UNSIGNED_BYTE,                             #unsigned bye data
+                 $pixels);                             #ptr to texture data
+   
+
+
+   # texture 2 (linear scaling)
+   glBindTexture(GL_TEXTURE_2D, 2);                    # 2d texture (x and y size)
+   glTexParameter(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); # scale linearly when image bigger than texture
+   glTexParameter(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); # scale linearly when image smalled than texture
+   #glTexImage2D(GL_TEXTURE_2D, 0, 3, image1->w, image1->h, 0, GL_RGB, GL_UNSIGNED_BYTE, image1->pixels);
+   
+   glTexImage2D(GL_TEXTURE_2D, 
+                 0,                                            #level (0 normal, heighr is form mip-mapping)
+                 3,                                            #internal format (3=GL_RGB)
+                 $width,$height,
+                 0,                                            # border 
+                 GL_RGB,                                       #format RGB color data
+                 GL_UNSIGNED_BYTE,                             #unsigned bye data
+                 $pixels);                             #ptr to texture data
+
+
+
+   
+   # texture 3 (mipmapped scaling)
+   glBindTexture(GL_TEXTURE_2D, 3);                    # 2d texture (x and y size)
+   glTexParameter(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); # scale linearly when image bigger than texture
+   glTexParameter(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_NEAREST); # scale linearly + mipmap when image smalled than texture
+   #glTexImage2D(GL_TEXTURE_2D, 0, 3, image1->w, image1->h, 0, GL_RGB, GL_UNSIGNED_BYTE, image1->pixels);
+   
+   glTexImage2D(GL_TEXTURE_2D, 
+                 0,                                            #level (0 normal, heighr is form mip-mapping)
+                 3,                                            #internal format (3=GL_RGB)
+                 $width,$height,
+                 0,                                            # border 
+                 GL_RGB,                                       #format RGB color data
+                 GL_UNSIGNED_BYTE,                             #unsigned bye data
+                 $pixels);                             #ptr to texture data
+   
+   # 2d texture, 3 colors, width, height, RGB in that order, byte data, and the data.
+   gluBuild2DMipmaps(GL_TEXTURE_2D, 3, $width, $height, GL_RGB, GL_UNSIGNED_BYTE, $pixels); 
+   
+   my $glerr=glGetError();
+   die "Problem setting up 2d Texture (dimensions not a power of 2?)):".gluErrorString($glerr)."\n" if $glerr;
+   
+  }
+
+
+
+
+
+
+
+
+
+
+
+#somthing needs to keep the ref count alive for objects which represents data in C space (they have no ref count):
+my @ref=();
+sub ImageLoad
+  {
+   my $filename=shift;
+
+   my $surface = new SDL::Surface( -name  => $filename); #makes use of SDL: BMP loader.
+   
+   
+   my $width=$surface->width();
+   my $height=$surface->height();
+   my $bytespp=  $surface->bytes_per_pixel();
+   my $size=   $width*$height*$bytespp;
+
+   my $surface_pixels=$surface->pixels();
+   my $surface_size=$width*$height*$surface->bytes_per_pixel();
+   my $raw_pixels = $surface_pixels;   
+   
+
+   
+   #do a conversion (the pixel data is accessable as a simple string)
+
+   my $pixels=$raw_pixels;
+   my $pre_conv= $pixels;                 #rotate image 180 degrees!
+   my $new_pixels="";
+   for (my $y=0; $y< $height; $y++)
+     {
+      my $y_pos=$y*$width*$bytespp;              #calculate offset into the image (a string)
+      my $row=substr ($pre_conv, $y_pos, $width*$bytespp); #extract 1 pixel row
+      $row =~ s/\G(.)(.)(.)/$3$2$1/gms;                    #turn the BMP BGR order into OpenGL RGB order;  
+      $new_pixels.= reverse $row;       
+     }
+   
+   $raw_pixels  = $new_pixels;                #put transformed data into C array.
+   push @ref, $raw_pixels, $surface;
+
+   #we could have created another SDL surface frm the '$raw_pixel's... oh well.
+   return ($raw_pixels, $width, $height, $size);
+  }
+
+sub write_crate {
+       my $crate = decode_base64 <<EOF;
+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
+SUVORK5CYII=
+EOF
+
+       open FP, "> /tmp/crate.png";
+       print FP $crate;
+       close FP;
+}
diff --git a/test/OpenGL/tutorial/lesson08.sdlpl b/test/OpenGL/tutorial/lesson08.sdlpl
new file mode 100644 (file)
index 0000000..72a69fd
--- /dev/null
@@ -0,0 +1,1281 @@
+#!/usr/bin/env perl
+#
+# lesson08.pl
+#
+# Copyright (C) 2005 David J. Goehrig <dgoehrig@cpan.org>
+#
+# ------------------------------------------------------------------------------
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+# 
+# This library 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
+# Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+#
+# ------------------------------------------------------------------------------
+#
+# Please feel free to send questions, suggestions or improvements to:
+#
+#      David J. Goehrig
+#      dgoehrig@cpan.org
+#
+use Data::Dumper;
+use Benchmark;
+use Getopt::Long;
+use MIME::Base64 qw(decode_base64);
+use SDL;
+use SDL::App;
+use SDL::OpenGL;
+use SDL::Event;
+use SDL::Surface;
+use SDL::Cursor;
+
+my $arg_screen_width =640;
+my $arg_screen_height=512;
+my $arg_fullscreen=0;
+
+GetOptions(
+          "width:i"        => \$arg_screen_width,
+          "height:i"       => \$arg_screen_height,
+          "fullscreen!"    => \$arg_fullscreen,
+
+         ) or die $!;
+
+############################################################
+my  $light = 0;
+
+my $xrot=0;   # x rotation 
+my $yrot=0;   # y rotation 
+my $xspeed=0; # x rotation speed
+my $yspeed=0; # y rotation speed
+
+my $z=-5.0; # depth into the screen.
+
+my $filter = 1;        # Which Filter To Use (nearest/linear/mipmapped) */
+my $blend  = 1;
+
+
+print STDERR "Use b to toggle blend, page up/down to zoom, and arrow keys to rotate\n";
+
+write_glass();
+main();
+exit;
+
+
+sub main
+  {  
+   my $done=0;
+   my $vidmode_flags= SDL_OPENGL;
+
+   $vidmode_flags|= SDL_FULLSCREEN if $arg_fullscreen;
+   
+   my $app = new SDL::App ( -title => "Jeff Molofee's GL Code Tutorial ... NeHe '99", 
+                           -icon => "icon.png",
+                           -flags => $vidmode_flags,                   
+                           -width => $arg_screen_width,
+                           -height =>$arg_screen_height,
+                           -opengl => 1,
+                         );
+
+   $app->grab_input(SDL_GRAB_ON);
+   
+   SDL::ShowCursor(0);
+   
+   my $event = new SDL::Event;
+   $event->set(SDL_SYSWMEVENT,SDL_IGNORE);
+   
+   InitGL($arg_screen_width, $arg_screen_height);
+
+   glEnable(GL_BLEND);             # Turn Blending On
+   glEnable(GL_LIGHTING);
+   glDisable(GL_DEPTH_TEST);         # Turn Depth Testing Off
+
+   while ( not $done ) 
+     {
+      
+      DrawGLScene();
+
+      $app->sync();
+      
+      $event->pump;
+      $event->poll;
+      
+      $done = 1 if ( $event->type == SDL_QUIT ) ;
+      
+      if ( $event->type == SDL_KEYDOWN ) 
+       {
+        my $key= $event->key_sym;
+
+        $done = 1 if ( $key == SDLK_ESCAPE ) ;
+        
+        if ($key==SDLK_f)
+          {
+           printf("Filter was: %d\n", $filter);
+           $filter = 1+(($filter) % 3) ;
+           printf("Filter is now: %d\n", $filter);      
+           $app->delay(100);
+          } 
+        if ($key == SDLK_b)
+          {
+           printf("Blend was: %d\n", $blend);
+           $blend = $blend ? 0 : 1;              
+           printf("Blend is now: %d\n", $blend);
+               $app->delay(100);
+           if ($blend) 
+             {
+              glEnable(GL_BLEND);                  # Turn Blending On
+              glEnable(GL_LIGHTING);
+              glDisable(GL_DEPTH_TEST);         # Turn Depth Testing Off
+             } 
+           else 
+             {
+              glDisable(GL_BLEND);              # Turn Blending Off
+              glDisable(GL_LIGHTING);
+              glEnable(GL_DEPTH_TEST);          # Turn Depth Testing On
+             }
+          }
+        #bit lax:
+        $z-=0.02      if ( $key == SDLK_PAGEUP );
+        $z+=0.02      if ( $key == SDLK_PAGEDOWN );
+        $xspeed+=0.02 if ( $key == SDLK_UP );
+        $xspeed-=0.02 if ( $key == SDLK_DOWN );         
+        $yspeed-=0.01 if ( $key == SDLK_LEFT );
+        $yspeed+=0.01 if ( $key == SDLK_RIGHT );
+        
+       }
+     }
+   $app->grab_input(SDL_GRAB_OFF);
+  }
+
+
+
+
+
+
+#########################################################################
+#Pretty much in original form, but 'Perlised' 
+
+
+
+
+sub InitGL
+  {
+   my ($Width, $Height) = @_;
+
+   glViewport(0, 0, $Width, $Height);
+
+   LoadGLTextures();                           # Load The Texture(s) 
+
+   glEnable(GL_TEXTURE_2D);                    # Enable Texture Mapping
+
+   
+   glClearColor(0.0, 0.0, 0.0, 0.0);                           # This Will Clear The Background Color To Black
+   glClearDepth(1.0);                                          # Enables Clearing Of The Depth Buffer
+   glDepthFunc(GL_LESS);                                       # The Type Of Depth Test To Do
+   glEnable(GL_DEPTH_TEST);                                    # Enables Depth Testing
+   glShadeModel(GL_SMOOTH);                                    # Enables Smooth Color Shading
+   
+   glMatrixMode(GL_PROJECTION);
+   glLoadIdentity();                                           # Reset The Projection Matrix
+   
+   gluPerspective(45.0, $Width/$Height, 0.1, 100.0);           # Calculate The Aspect Ratio Of The Window
+   
+   glMatrixMode(GL_MODELVIEW);
+
+   
+   my $LightAmbient  = [ 0.5, 0.5, 0.5, 1.0 ];                   # white ambient light at half intensity (rgba) */
+
+   my $LightDiffuse  = [ 1.0, 1.0, 1.0, 1.0 ];                    # super bright, full intensity diffuse light. */
+
+   my $LightPosition = [ 0.0 , 0.0, 2.0, 1.0 ];                 # position of light (x, y, z, (position of light)) */
+
+
+
+   #setup light number 1
+   glLight(GL_LIGHT1, GL_AMBIENT, @$LightAmbient);  # add lighting. (ambient)
+   glLight(GL_LIGHT1, GL_DIFFUSE, @$LightDiffuse);  # add lighting. (diffuse).
+   glLight(GL_LIGHT1, GL_POSITION,@$LightPosition); # set light position.
+   glEnable(GL_LIGHT1);                             # turn light 1 on.  
+   #/* setup blending */
+   glBlendFunc(GL_SRC_ALPHA,GL_ONE);                   # Set The Blending Function For Translucency
+   glColor(1.0, 1.0, 1.0, 0.5);    
+
+
+  }
+
+
+
+# The main drawing function.
+sub DrawGLScene
+  {
+   glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);         # Clear The Screen And The Depth Buffer
+   glLoadIdentity();                                           # Reset The View
+   
+   glTranslate(0.0,0.0,$z);                  # move z units out from the screen.
+    
+   glRotate($xrot,1.0,0.0,0.0);                # Rotate On The X Axis
+   glRotate($yrot,0.0,1.0,0.0);                # Rotate On The Y Axis
+   
+   glBindTexture(GL_TEXTURE_2D, $filter);                      # choose the texture to use.
+   
+   glBegin(GL_QUADS);                                          # begin drawing a cube
+   
+   # Front Face (note that the texture's corners have to match the quad's corners)
+   glNormal( 0.0, 0.0, 1.0);                                   # front face points out of the screen on z.
+   glTexCoord(0.0, 0.0); glVertex(-1.0, -1.0,  1.0);   # Bottom Left Of The Texture and Quad
+   glTexCoord(1.0, 0.0); glVertex( 1.0, -1.0,  1.0);   # Bottom Right Of The Texture and Quad
+   glTexCoord(1.0, 1.0); glVertex( 1.0,  1.0,  1.0);   # Top Right Of The Texture and Quad
+   glTexCoord(0.0, 1.0); glVertex(-1.0,  1.0,  1.0);   # Top Left Of The Texture and Quad
+   
+   # Back Face
+   glNormal( 0.0, 0.0,-1.0);                                   # back face points into the screen on z.
+   glTexCoord(1.0, 0.0); glVertex(-1.0, -1.0, -1.0);   # Bottom Right Of The Texture and Quad
+   glTexCoord(1.0, 1.0); glVertex(-1.0,  1.0, -1.0);   # Top Right Of The Texture and Quad
+   glTexCoord(0.0, 1.0); glVertex( 1.0,  1.0, -1.0);   # Top Left Of The Texture and Quad
+   glTexCoord(0.0, 0.0); glVertex( 1.0, -1.0, -1.0);   # Bottom Left Of The Texture and Quad
+   
+   # Top Face
+   glNormal( 0.0, 1.0, 0.0);                                   # top face points up on y.
+   glTexCoord(0.0, 1.0); glVertex(-1.0,  1.0, -1.0);   # Top Left Of The Texture and Quad
+   glTexCoord(0.0, 0.0); glVertex(-1.0,  1.0,  1.0);   # Bottom Left Of The Texture and Quad
+   glTexCoord(1.0, 0.0); glVertex( 1.0,  1.0,  1.0);   # Bottom Right Of The Texture and Quad
+   glTexCoord(1.0, 1.0); glVertex( 1.0,  1.0, -1.0);   # Top Right Of The Texture and Quad
+   
+   # Bottom Face       
+   glNormal( 0.0, -1.0, 0.0);                                  # bottom face points down on y. 
+   glTexCoord(1.0, 1.0); glVertex(-1.0, -1.0, -1.0);   # Top Right Of The Texture and Quad
+   glTexCoord(0.0, 1.0); glVertex( 1.0, -1.0, -1.0);   # Top Left Of The Texture and Quad
+   glTexCoord(0.0, 0.0); glVertex( 1.0, -1.0,  1.0);   # Bottom Left Of The Texture and Quad
+   glTexCoord(1.0, 0.0); glVertex(-1.0, -1.0,  1.0);   # Bottom Right Of The Texture and Quad
+   
+   # Right face
+   glNormal( 1.0, 0.0, 0.0);                                   # right face points right on x.
+   glTexCoord(1.0, 0.0); glVertex( 1.0, -1.0, -1.0);   # Bottom Right Of The Texture and Quad
+   glTexCoord(1.0, 1.0); glVertex( 1.0,  1.0, -1.0);   # Top Right Of The Texture and Quad
+   glTexCoord(0.0, 1.0); glVertex( 1.0,  1.0,  1.0);   # Top Left Of The Texture and Quad
+   glTexCoord(0.0, 0.0); glVertex( 1.0, -1.0,  1.0);   # Bottom Left Of The Texture and Quad
+   
+   # Left Face
+   glNormal(-1.0, 0.0, 0.0);                                   # left face points left on x.
+   glTexCoord(0.0, 0.0); glVertex(-1.0, -1.0, -1.0);   # Bottom Left Of The Texture and Quad
+   glTexCoord(1.0, 0.0); glVertex(-1.0, -1.0,  1.0);   # Bottom Right Of The Texture and Quad
+   glTexCoord(1.0, 1.0); glVertex(-1.0,  1.0,  1.0);   # Top Right Of The Texture and Quad
+   glTexCoord(0.0, 1.0); glVertex(-1.0,  1.0, -1.0);   # Top Left Of The Texture and Quad
+   
+   glEnd();                                                    # done with the polygon.
+   
+   $xrot+=$xspeed;                                             # X Axis Rotation       
+   $yrot+=$yspeed;                                             # Y Axis Rotation
+   
+   
+   
+  }
+
+
+
+
+sub LoadGLTextures
+  {
+    # Load Texture
+
+   my $pth = $0;
+   $pth =~ s/\w+\.\w+$//;
+   my ($pixels, $width, $height, $size)=ImageLoad("/tmp/glass.bmp");
+   
+   # Create Texture    
+   
+   glGenTextures(3);
+   
+   # texture 1 (poor quality scaling)
+   glBindTexture(GL_TEXTURE_2D, 1);                    # 2d texture (x and y size)
+   
+   glTexParameter(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST); # cheap scaling when image bigger than texture
+   glTexParameter(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST); # cheap scaling when image smalled than texture
+   
+   # 2d texture, level of detail 0 (normal), 3 components (red, green, blue), x size from image, y size from image, 
+   # border 0 (normal), rgb color data, unsigned byte data, and finally the data itself.
+   #glTexImage2D(GL_TEXTURE_2D, 0, 3, image1->w, image1->h, 0, GL_RGB, GL_UNSIGNED_BYTE, image1->pixels);
+   
+   glTexImage2D(GL_TEXTURE_2D, 
+                 0,                                            #level (0 normal, heighr is form mip-mapping)
+                 3,                                            #internal format (3=GL_RGB)
+                 $width,$height,
+                 0,                                            # border 
+                 GL_RGB,                                       #format RGB color data
+                 GL_UNSIGNED_BYTE,                             #unsigned bye data
+                 $pixels);                             #ptr to texture data
+   
+
+
+   # texture 2 (linear scaling)
+   glBindTexture(GL_TEXTURE_2D, 2);                    # 2d texture (x and y size)
+   glTexParameter(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); # scale linearly when image bigger than texture
+   glTexParameter(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); # scale linearly when image smalled than texture
+   #glTexImage2D(GL_TEXTURE_2D, 0, 3, image1->w, image1->h, 0, GL_RGB, GL_UNSIGNED_BYTE, image1->pixels);
+   
+   glTexImage2D(GL_TEXTURE_2D, 
+                 0,                                            #level (0 normal, heighr is form mip-mapping)
+                 3,                                            #internal format (3=GL_RGB)
+                 $width,$height,
+                 0,                                            # border 
+                 GL_RGB,                                       #format RGB color data
+                 GL_UNSIGNED_BYTE,                             #unsigned bye data
+                 $pixels);                             #ptr to texture data
+
+
+
+   
+   # texture 3 (mipmapped scaling)
+   glBindTexture(GL_TEXTURE_2D, 3);                    # 2d texture (x and y size)
+   glTexParameter(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); # scale linearly when image bigger than texture
+   glTexParameter(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_NEAREST); # scale linearly + mipmap when image smalled than texture
+   #glTexImage2D(GL_TEXTURE_2D, 0, 3, image1->w, image1->h, 0, GL_RGB, GL_UNSIGNED_BYTE, image1->pixels);
+   
+   glTexImage2D(GL_TEXTURE_2D, 
+                 0,                                            #level (0 normal, heighr is form mip-mapping)
+                 3,                                            #internal format (3=GL_RGB)
+                 $width,$height,
+                 0,                                            # border 
+                 GL_RGB,                                       #format RGB color data
+                 GL_UNSIGNED_BYTE,                             #unsigned bye data
+                 $pixels);                             #ptr to texture data
+   
+   # 2d texture, 3 colors, width, height, RGB in that order, byte data, and the data.
+   gluBuild2DMipmaps(GL_TEXTURE_2D, 3, $width, $height, GL_RGB, GL_UNSIGNED_BYTE, $pixels); 
+   
+   my $glerr=glGetError();
+   die "Problem setting up 2d Texture (dimensions not a power of 2?)):".gluErrorString($glerr)."\n" if $glerr;
+   
+  }
+
+
+
+
+
+
+
+
+
+
+
+#somthing needs to keep the ref count alive for objects which represents data in C space (they have no ref count):
+my @ref=();
+sub ImageLoad
+  {
+   my $filename=shift;
+
+   my $surface = new SDL::Surface( -name  => $filename); #makes use of SDL: BMP loader.
+   
+   
+   my $width=$surface->width();
+   my $height=$surface->height();
+   my $bytespp=  $surface->bytes_per_pixel();
+   my $size=   $width*$height*$bytespp;
+
+   my $surface_pixels=$surface->pixels();
+   my $surface_size=$width*$height*$surface->bytes_per_pixel();
+   my $raw_pixels = reverse $surface_pixels;   
+   
+
+   
+   #do a conversion (the pixel data is accessable as a simple string)
+
+   my $pixels=$raw_pixels;
+   my $pre_conv= $pixels;
+   my $new_pixels="";
+   for (my $y=0; $y< $height; $y++)
+     {
+      my $y_pos=$y*$width*$bytespp;              #calculate offset into the image (a string)
+      my $row=substr ($pre_conv, $y_pos, $width*$bytespp); #extract 1 pixel row
+      $row =~ s/\G(.)(.)(.)/$3$2$1/gms;                    #turn the BMP BGR order into OpenGL RGB order;  
+      $new_pixels.= reverse $row;       
+     }
+   
+   $raw_pixels = $new_pixels;                #put transformed data into C array.
+   push @ref, $raw_pixels, $surface;
+
+   #we could have created another SDL surface frm the '$raw_pixel's... oh well.
+   return ($raw_pixels, $width, $height, $size);
+  }
+
+sub write_glass {
+       my $glass = decode_base64 <<EOF;
+Qk02wAAAAAAAADYAAAAoAAAAgAAAAIAAAAABABgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGBsn
+GihRIixUGzdYGy1XGxwzKTE1PVNVQVNSOFBRP1VXP1ZXPlRURVNWSVdaRVNWR1VXQlRWP1NVQVVX
+RFlaR1hYRlZXSVlaSlpaR1lYQVVTPE9OQVRUQlNVO1JTPFZTMD47HyQjQ1BRRFJURlVWRFNUQ1VU
+Q1ZVRFdWSFpZRlhYR1lYRVdWQlVUSFhYRlVVQ1FRSVdWR1ZWRFVVQlNSRFVTR1lXSVpYRlhWRVdV
+SltZSFlXSFpYR1pYR1tZS2BdPj5CLTY6TmpnUWhnUmlpTWhoT2loS2dmSWdmTGdmTmdmRWBfQWRg
+PF5bPmFdO2BcPWJgQWVjS2poTGhmUWppVGxrWG5uWm5uXW5vWXFzU3NzV3JyVW9vT25tMjY4Qjw8
+VWFeU2BeVmNhUF1bUF1cT11dTlxcTVxbUF9eUGBeVWRhUGBcU2JeU19cTlxZTlpXTlpXTltYUVpY
+TVdVSFJPS1RSTFdUS1VTTVlVPkREGRggHS5OGTlWGhtWHSxYIh87ESA+GVKnL2O8KXjAJFexGSpY
+SFtWeaqoeqync6qpdKqsc6mobqqmZqypXqShXaKfYaajY6KfZqWjZ6elaKmmY6qla7KtbLOuZ66p
+bqylcqumZp+baaOheaeseaiveaytY319MDw/iKirkrW4kLW3jLO1jbO1hqyugaapfaKldaOde6mi
+fqunfqqoeqqmcqKfc6CddaCdb5uYapeUaJaSZZKObZqWapeScqCbeqiieqijd6qkea2nfrOshLqz
+lL+6cYCERmFjk8/HfdPJd9TLdNTLYca8XMW6WsG2YsG3bsrBYLmwXL2zXsC2YcO5ZMa8Zca9cM/G
+edXMetXNeNnQd9jOeNfNetbOeNTNZs/FaNvQatvRhd3Wld7ZQFxca3BxqcvGn767o8G+o8G9o7+9
+n7u7or6+or6+o7++pLu+orm8p76/o7u6oru8nL2+nre5m7S1mra2nbK0m7K0mrGznrO1laqsl6yu
+nLK0eYqJESAgDkqDDWW3Bh2zCEexEiFtGR03IFawMm7RLn/HJluzGSdRODgqPFhWO1VXPVVYQFdd
+PFVYPldYPFRYOVJWO1RYO1RYPldYQFZYRFdZQ1ZYPFRUQ1tbRF1cRl9fQltaPlhXP1laPFRYPVha
+OlpZQ15cPEhHJSssRlZbSVxhR11hRFpeRlxcRl1cPlVUNk1MMlBMMlBOMk5QNE9UNVBPNU5MMElG
+NUtINUpINktIPFBQPE9SNkpMN05NO1FQQFhWRV1bP1hWRl9dQ1xaRV9dTWZkQktKK0A+RmtnR2to
+TG1sSW1rRmxqRW1qRWxpTnFvUG9uUm5vT21vSWxtTW5wUG1uVG9vV3RyVnFxVnJxTXBuTHBuSGxq
+Q2dlOmFfKFVSKVpXL2BcQmppT3JyLDw9QEtLWW5sUGJjUmNlUGJjU2NkVWJkUV5gUl5gU2BiUmNk
+UWJhUGNgUmVgVGNgUGVjWGRkWmVkUWJgU2BgU2FgUF5dUF1cU15dUlxcV2JhS0tOHRovEVKaCm7J
+DSbJD1fKGilmERY6G0icM2OyKXizK12kJTBRLSknUldeVlZZVFphYWZvZWtybXR4eYCGhYySgYeN
+eYGHcYGBbXl5bXN1LjIzTlNTbnRzc3h3dHp5bnBydXd6a25yYmJpWWJmUmNjT1lcV2JlWmZqW2ht
+WmluWGpuVWdsUGVuR1xmRlxlT2NtXm14YHB4YXR2a399b3x5c3x6eoF/VFpXIiklTFVRWWBhUFZc
+WWBmYm5tZnNyZHBvZHFwWmxqW25sUGRiT2NhT2JhWWdiVnFoWndzY3V0ZXd0aHp4bn58bX17bnx7
+bnh3a3BwdHh4ZG9sWG5qW2xpJCwrMz89W2pnXW9tVWhmV2ZlVmZlXG9tZXp4d4iIg5CQhJCQhI+Q
+gI6QgYmNfYmKcYiEb4OAaXt9Z3l7ZHZ4YnV2ZHl4YHR0Y3d1YnZ2V3BzVnBxUWpqRl9dIi0vO0pN
+WGdpX3J0XHR2aXl8anx+a3x+ZXh6an6AX3J0RVpcKjU1Gh4mElKNDWq6Dhq1Gky5GzFgFBQkFCRF
+GShDFi9DGypHFh4sJicoOTg+NTk7ODxDP0JLRUpPRklRUlRdVVZeT1JXUlZYTVVUUVRVU1BSMyss
+Qj4+UE5OU1FTUVBTTEpRTFBRSFBMP0FFOzxBPDU6OTI6NT0+NEJAOENJQUZQP0ZNPUlLOEpLN0NM
+NkJNNkZMPUpSREpXS1VbUVhcWF1iXmRnYGNoRUZLIykqNz1AMUE1KzVBPUJIRVFSQU1MRFFPRVFO
+TFJTRU9PQU5NRVFQTFxZWWNbVmBZVGJeVWJiWmlkW2pjXWtpWWlkZWtpYWNoVmBgT1dSS1BSRE5S
+QEtFNi4sNDYxMENJRElJPVBQOkxHREVNSFBST1xXWWVjX21nXGhhWGNjWGRqWGRfUGFhRVhgT15a
+Tl5eTl5eR1hYSllYS1lXSlZZTlxfTl5eUF5cU2BfSFNTPEVGKS0wOUFCTFBSR1NURFhXSlZWUl5e
+UV1dTVxcRVVWQE9QOUhIKy40HB8nEipGHC1NGRpQGi5OJSUvIC4nboaIUWNiKy8sZGVmIiEoOx4z
+VCg6Tyo1TyA7VCNEWyxJWyhRYzBgXy9UVyxDVy1AXi1PYzJUXi5QZjVZcDhkbDRiZzNeaTZhYjNS
+TCI4Tyg+WChNWipQVCRGWCdMSidALh0oMBoqVylOZjFaUiJFUyNFZy5eaS1hVCVLNSExMRctWS1U
+ajBmZzBkXihbXiZZazFkZiZaYStcMSEtQRtFZyhPYidOXSNIXCNGWiJDYCpKWyRGYSpNWilKOB0z
+VyhRZSdVYidEZitPaC1OZy9IZSlNZipUYyZSYCNQUi1HOSE1ZDJfiTpzezRchDlggD1ifjpzhzBX
+VzNNOSQ0ZzBXYSpKWiZAYShEXCY8WCE3YSRIYTFVNyMxMhZASh5nRhtVQxxRQxtRQBhNRBxTRB9X
+WDJvb0yISSpfQx1RTSRaTyRcTiFbSB5ZRx1XczZ0dTFwYS1mVSheWCxjQRZMRxhOVBxUShtRXCdg
+XihVLiYjJDIzKSglQk1LbJWNTVVRKTk4g6GrZXuAOz1BhpGOLTU5PRs4ZilKYitLZi1edzxwajJg
+eDxzhUZ/dz1lcTtadT1fgkF2fUJveUFtg0uAjkyLhER/gkd7gEl1dD5faDVSZTNXbDNhbjJgdkd2
+k1uOWilIMyMrNxkvcy9mijx9dTNpay5YhDt6hzx/bS9fQiI4NRwvdDJuhjODfTd3dC1sayJifTNz
+eydrdy9sPCIyTRpGfStadCtabyhWci1XdS9afzRqdyldeDFgazdcOCIvVyNPfC1neylPfC1bdCtT
+cy1KcypVfihjdCJediNYZjBLOSAzcjRppz+JnT1znkFvmkJvpUWKpzloZThQQSU6fDVkciZSbCRM
+ZiJDZiU+YyE8cypVejxkOyk3OBZLYBt6XiR2VRtnWB9rWR5rYCh4c0KVgU+ldUeYVClyUyFqWyZy
+XSd0bzaGYyt7UR1sdSx/nUWalEWYfTaGfDiIbSx7UhViXR9qXiFtUBZjWCNgLicqSmRpNUZDPFRT
+da2lTV9dKzU0hKWrW3d5P0VIn6KoREZHPR0vaitYaC9hk1qTm2GXeUFum2aZnG2glWmSl2mapXOu
+iFOPkF6NonGloGuonmelm2qhnHCcd01ymmuWlGaUk2mYhViFi1SFhVaRlWGbZjRWLyQqNhcsfTZv
+ikB9hkp8cDlggUF7h0SCbzVfRiU9Lx8scTRpeDFvdztzdDNuaCZhdjJubylmdTNsQic0TBpHcSla
+cixbbipVcy9YdDBafjdrfDZiaD9VXE1UQkA+PCMzVyVGbSpRdipcdSxScy5IcSlSeChfbCRbcyRY
+ajFPNyEzczNlmkCElUBxlzxim0NmmUaFnD9sZDhPOSMtcC9TbChLYyhHZydGZSVAZiVEdC1beDdj
+LyMxOhlOXBhtXCVxWB9tWyJuXCJuYit4YzB+aTaGZzeDYTV5YTR1Xi1xaDV7hE6Vf0aPXS10Zi92
+fT6Gl1Shlk+fgECPgkaVYS15URxkcip0YCBsRBxTLCorZoSIQ1VUOEtPdaSoT11gNDw8gquqX3x+
+QUVInKKlPEA9Lg8laStbZTFXjGKPc0Jtg058kGCWkluSl2aVnGWgkVeSiFSGgk54sYO9mGOjmmSh
+oXSpn3ihgE9/mGecp32wmG+ihVSFhlWMklych12Rb0BfLiUqOR0vfDVtgz55k06KhkF1gkN4l0qJ
+fTllQSg5MSUyai5hdjNqfDh4dzVxci5nfTVzcipogjh2PCk0VRpEcyldei9hdS5YeDJbdzBehT1x
+cD5cbW1qz87Kz9HIio6MS0BJRR0vbS1TdzFTezROcixUcitaciRZcSZfbi1PNx4zczBlnDp9ljho
+kjlim0FkoUKDoUFsaTdNNyIvbCxVci1Way5TbCtPbCtNci9WeDJfdDNcLiMrRRpWXix1WyR0Yyl8
+XSRxZCh2XyVxYTB1d0WMbz2Ic0CNg1ObdEOKbTiAd0CIiFCaeUaNXy5zXixzfzuLmk+kikechz+X
+h0GXWCJpXBxidyp4Sh9LKycqdpOYUGNhOU9Pc6WpSlhbNDw9hq+uW3d6P0RIl6OeLTMuFg4WRiM7
+ZTNQkWaRhVGAg0l+jV+So3elqH2zmmynkmWSh1d+f0lxonOqi1iQl26gl2+WkGGNfEp8k2qZh1+M
+jFyNmV2Wl2Scj12Sd014cD1ZMyYrOiEvdjBpeDNugz54jUp9fkJylUyFfjxoRCw7KyEsbDFjdDJn
+fTh5gDt5cy1ogDd3eTBvejBtOCcxVxxEeC9hezJkdjBaezVfeTBgiEZ3Z19ds8a36OHj2tvYiZWU
+doCBSkRFSiY9bjRRcS1JbypUbStVdSlWcyhgbi5NNB8ucTVkn0CCmDhskzhnmkBpn0GBokNtaztS
+OyU1ayhWdS5cdjZjcjFZczJYdzVeeDVgczRcMiMtTRpZXyt3XSZ2azOGZS57Zy16ekKMZTN0bjt/
+fkeUczuMYjF6e0uTiFefcD6GXCtwb0WEcEmGVypsWyZvaS97fT+OejSHhT6Sbi9/WBhiTR5UHRkg
+KC0pe5qfWmlpNE1LaaSlQ1lZND09ha+uVnN2QEVJpa2yQ0xFEjkMFSkTTSc8dk1uglJ3bz1cglp5
+kl+QkWORlWKZnmqbg094gEZvglODc0RpgF+CbUJXfDtsfEN2kWaMaj1fYS9MYStQajRhcDVgXzRT
+cj9YMiYvOx81eTBvayZcaylVhkN2dDpjiUJ1fTlnPyU8LyI0cTRsdS5rgzuBjEKEfjRzhjd7fTJz
+dCtnNyUvVhtEejBjfjNnejNeezVfhTtqbTxej5mNvcLI0tHQ7u/tnKepdIOHpKiqTDpHYC9FeC5O
+eSlabihQdSlWcCRjcS1VPCQ0ejpjpkOGn0B4mD10oEJxnj+ApENucj5cOiYxdDNbdzBcejlnfT1p
+dDVfgUJseDhjdDVgPCY0cSpxfC2DdCqCcDGHeDmJgECPllGkmVClgT+Tdj2QhlSldECNViNwYzOA
+gFGfZzWAUSNpXzR2YjJ6aDiAViRtXiJuZyt5biyBgTuVXSxpFS8YFmgXKDoqgZ6kXWptNlJPZKSk
+P1dXMzo6i7GwY3t+Q0ZJrbTCUFRUGWMKHnUhJiEkTiA/YCtIYzRIaz1ZcTlmbj1kdT9xeDpxbTdm
+ajNeZzlfb0diYDlUbDdVhj91eDltZzVWXStFYC5BWCk9YCpLcThcZjlZZTVXOik3Nh4xai5iXStN
+VSk+czFicjJjezVrdDFhOyIzNic1azBkcDJmgDd7ij6EhTl8gjR6fzB1dixsOCQ1VBdDdSxdejRi
+dDBaeDJeejVjUzVMpa2l5eDi+Pby///7/f/+1t3a6Ofjal5fUik4bzVMYipOXiVAZSJFaSJZWSU+
+Qyk4bi5XiDNrhTVzgDZphDRcgjZghzlcYDRMPigxZSpObTFXbTJbcTNfaCtWcDNebjFZXipNODI2
+aC9nfjZ8bixyVyZpYzJycECAdDqAfzKCgDyHe0OKdkqOakKDWTRwQR9YTy5nZkOAQCBWPB1PRyNc
+Ui5oQx5VWC5nSSJbSCFcXjBrKyQwD34UFp0UJTgliaepXW5uO1VRZaKeQVlYNzw8k7W0Y3d5UVNT
+s7y5TUlRFGcYJLwjHmEgHBQeMx0sMCAtNyE1OyIzNiEyPSc2QSc3Nh8wNx4tNyIsMyYrLCAkNSAx
+PiQ6NiEvMh4tMR0tMyEvMB4qMyAuLiQrOyc1PCU2IyMgKSAnQiI5NyAvNyEzQiU6RSZAQyQ+RSY8
+NS0tKCYjSCZCQic6SydBTy5GTCpCSypCSihDSSdDJysiOx4wRSY6Ryk9Ryg+SSk/RSc8My4zqLCd
+7efQ9unm/vX0//35/v318+/hbHNnOCcxTTFCQCo+RStAQSo/RydDOS42KSwxRTA6Syc5SCVDRis/
+TjFFSzQ8TDFAOjQ1KywvQSdBQixDOSY8Oyc4Oyc3QCs9Py04RCs5JjImQCk8TC5ESCs+Qiw8Pys7
+QjFBOSo5Oys7Oyc4PCk6PjBCPihDRTFEPSs5Oyg3Py9DOi48MyYvNyU2QCxBPis7QjBAOyg4Oy05
+JyAgFEgVC6gYEZkWIDAgi6moVGplQldVbKigQVxZNz08krSzYHR2UVRVoqOpTkhQFHAVI7kiGkoV
+NRk0XzZhWzJhXi5oWzFsXDRnVTFaTCpORR5MUSVUVyxZYTtmXztqYjhoYDRiUCdOTyBOXCpbXStb
+UyJOUCVVXTVlbzNpcThnNiI4OCA7YC9UXi5XXypjZTBjYS1dYS5ebDVpSC1EMyItXC1RXDFRbThe
+iFV5bjpfbztgdkRrbTVgQCgybzRdhUl0i0tzjU10jU1xjlFzRj5BhpZ/zMu07N3Y9uTl/vHs7Onb
+z9jCXFpXYjFbfTZxfzZsgDh2gUB3ij13d0BuRCRBby9fgi9rhjZxgDNxiD16gT5ugDhqZDVXQSA/
+bihncS5sYCleZSpjaCxoYCRhYSZeZSlhNig5ZjdcgU5xfUZriVJ5d0JphFF4jFuBjVyCdTtjeDpj
+h0xzd0BmfUdtd0FmhlJ0dEFlazlcekZoXyhNeENoiVd6jlx+fk1vazpdWjZUHTYfDXgPGoYgIDEh
+hKOfSmFaQldXbqmjRF1bNz49lLi2an+BQkRGoairNTE0GVkSGV8XLBcmcTdwbCt7YiZ1ZSV5ZCt7
+aC52XihoUCBdSRlaXiZpbzV4aTF1bzp+dTx9aSxtWSBfbStubylsbyprcSxrbDBybjF2hTJ+hEJ+
+PylBPBw5aCZhcC1rcy9wcCtrbCpjbCtkdTBxUDNQNSEwZytYcTBieTFtikV/fDZwfzt0kkSBgDVx
+QSc6eC5doEN5pEd/pEh8o0d3rFJ/YztWVnRoe5qE1tHM6d3b7ebgub+2iaSUPTxAcDVuhjWFfzF4
+iTV9izV5ki6GdzlzRCo6cy9kiS5ygy1nkjd8jzJzgTBihjhqaT1ZNiIxZyZdcCdmaShiaCZjaCVm
+ZCFiZSJeYyhbMiktaTdVl1Z9hj5tkkt4hUBtejdklVaAnWKLiklydzReiUpzfDxofzxwfztwgT9v
+fTxsZSJVjkl9eTNmaSVTgUFpkVB5i0pzejthe0JrYTxZEzIKFFkYJzgrd5iRTWRaRFhacKylRV5c
+NTs9jbSzZH1/P0NDlKCaKissDR8MJyQnajJsZyx1WB9uXChzZjF2aTJxUSRdRxpVSBhXSCBZZDBr
+XSZhZTdxcT97aDFrWSJaYC9nXipqZitrbi5seTZ2bTFxdDJyfjp5gzx+PCk3PCA1ZidfaSpjbS1n
+bjBlZytbZypbbi1lUDJPMiMubS1dcjFkbi1ghUV2cjBjfThvhTxxaSVVOCgwdzJYnERynkh9nkZ6
+oEt9qVeJdEBeOVZRP29onaGj49vavsC8Z4yKXHZxQS86jTp/lDiFgjN1hyx2hTZ3iCl7bC9hPSY3
+bS1gjDRyfi1ckj99jDN6fDFlizd1YTlYLx4tXyFfZSJgYSVeYiRgZCNgaCRiZyZfYCZaLiQtcj9i
+l1eCh0BzeTZmhUJxdTRjdzVkfjtqfzxqfz5sjE58f0JtbS9ccDNgdTdjfDxpfj5qjU15iEdzZiZT
+bi1bby5caCZVZSZRay1aiEd4WEBOFiQUIikhYIF1QVFLSVteb62kRmBcMjc7jLKyYXx+NDg4VV1b
+JSUqJBUkaDpscSx9XyJxXiNrZzBwYjFrTCBZRBlTSh5eRRdcQx1YTB5YXCpmcEWAazZyWyRiYClp
+XyxsYClqczV0dTNweTd5cTB1fjJ5cjJ1dip2OyU4Ox41ZydfZylfailicC5obCxgaChccCxnTi1M
+NCYxcDBidTVnbCtehUJ1fTdtfTVtgjlvZR9ROicxeDJbm0Fxokp9n0Z8pU+FqleLkVNxO0hHOGVn
+Z32By8vGV3F5LWVrOUpLWSxPoEGUjjCAfDR1gTF1eTFwfiZwZixYOCMzbi9hkjd5hDFkkz99kTh+
+fjNmizN0VSpKMx4uYiBhZiVgYCRbZSViZyNhaiNiaihiYidcMiUvaDRXomOMlE9+cC9deThmgkFv
+dTJhcyxcbipZcS9eezxqbixccS9eaylYcjFfcjFegUBsmViEmFeEcC9bczJeejllYyFOZidRcjFc
+djFejVV3WDtIJyUhK0Y7JC4qVGNlbauiRF9aNDk8hq2sZoCBKS0tUl1UHykgRydEdTV5YCh2WyJx
+bjByZSpmTSJaOhdSVyNkWiVlRxpXSx9aUiNfbz16ajl0YCtgXypqXyt1XCdxZytsezx3cDFubTJ1
+bTV7cC51ZDBzdS98OyQ6PiA6aChhaCtfeDpvcC5qaipgaClabyxkTixLNCYxcTFjdTVnczJmg0B0
+gj1ygTlxgjlvaiNVOSYweDNcn0Nxo0p4oUuDplKLpk+Fq1uIVUVQR2VrR2ppan18HEdWNmFjOyw9
+fDNzmj6OkDWBgTh4i0WAfDJxfiVvaC5bOiU0bC1dlTmAijVukDt8kjZ+fTFkkTd3XjBRNBsvZiFl
+ayZlYyNdaCViaiNibiRkaCReYiZbNCcxYS5QjU53mlWFhEJxcC5dhENxg0BvbylZaSVUdTNigkJw
+dDBfbipZbChXbSlYdDJfcC9bfTxoklF9fT1obSxZhURxgUBtfDpmgUNrai9WfD1nfUxrKiQkNU5F
+KzcxR1tabKqgQVtXMDY4g6qpYHp7Njo5fYmHLDg1QBxGYid1TyJuXiZvZihkWyBaRhtYRR5faixx
+YyRhWihdWSZjajdydD55ZC1oZDBjYS5xXCl4YSl1bzJycTNubjJwajR5YTV8WCpybEGEgTyIPCY7
+Oxw5bCxlZShbaitibSpnaytiZCZYbi1jSSlHMCQuczVndjVpejdrezdrjUd9gzxzi0J4bCdZPCs1
+fTZgpkx2pkx8p1KPp1OOq1CJr1KNgVRyS1VbQGRfFDM8GEFHNz49ZC1VijR+lkOIkzyDizx+hzx6
+gC10iSt7g0J3PCQ2ZCZTlzeCkzt6hDJukTd3fi9iljd7ZTVZMRgtbiVrcSlqZSNfaiVkbSVjeC5v
+bCViZyhfMyYwZjJVgD9plE9+llWDdzVkczBfgDxrgzxsaiZUdDNhikp4gj5sZiFQayVVcCpaeDVj
+cS9cczFeczFehkVyczJfdzZijk56hUZyej9oc0FjZS1UajxcLScqaIZ9SV1UP1lVbKuiQVtWLDY2
+g6mnYnp6PURBhJCNMjQ2PBtEWSNzUx1xXiNqXyFYYCdhSxpcWidnbi9vayxpYy1oVCVmc0B6bTZs
+Yi1mXS1qXCtzXyp2ai1vdjp4azN0azZ5ZTR6USZuYDB/dECEhjuFOyo4Ox06aChhaS1eaShmbCtn
+aytkaClfci5oUDNNLSIscjdqfjpzfDdsgj1wmVOIgjx0i0J3aipbPS04hTtmqFF4qk2Go02Rp1GK
+r0+IsFKMnFqMTUdUP2NkFj1EIkA4RzBDfDVshzZ6mEKLjTeAgzZ3jDeAhjN6kzeGhER7OiI0ZCVP
+nTqBlzx9ezBfiDVogTFkmjaCZzZeKRUpbR9kcChoaidjcSpqbCdgdCltcSFrcCpnNCUwZy5Ugj1q
+l09/kFB6gT1raSJTdi5ffzdndTBfaSdWh0d1jk14byxZaCNRbCZXfjhobyxadzNibSpZczFffDto
+cjNegkdvjlJ6h0hygkZubzVcWS9LNzA0bI2BTGBWQVZVb66lP1lVMDo6gaemZn5+Q0lGiZWOMjE0
+NxVEVB9zVyFvXiNjYihgVR9bVR5hbC5ubi5uaC5qUR9aZTl7c0B8cDhwajJuXC54YCx1aSxweDl5
+bTx8YjZ4ZTh/YTN+YzJ9dzuJeT6EiTuHPCo6QSE/aihhbi9hby1rdTJwci9qby5mcyxpVjZRMyUw
+eDptiEB6hD5yikJ3nFWLhDx0iT50cC5gRTQ/jEBrqVF6qlCNpk6Op0+FslOMrU2LsV2caE1mNVRX
+JVBSMEA+akBhhzyAgzV8l0OLkDyFei9xkkCGizyAlDyHez5yQCk5ZyxPkDhvlUB5iTtuizZuhTJr
+njmGZDVVLRoucCJnezJzci9scy1rbClgdixveit3dC5sPCw3cDdddzNgl09/iEdykU57fjhoeDBi
+dzFgdjFgbylYiURznV2HjEp3bypZbSZXdC5edzNidTJgdDBfcCtacS1bdTRfejxlg0Zuj1F7jlN7
+iE10XzZSNCwwcJCFTGBXQlhXc7KpQVxXLTc3hKupaH9/QUdEj6CZPUJENxVDWyZuXSNhYSZeVyFb
+SxZXYCluajBxZC5sUyFbWypkdkV/dD54cTl4Yi93WSp3bzJ2fzx6eD6DZz6DaUKHZjiDcT6PdTmG
+hDqGeTd9iTaHPio9RyRCcS1mcTFidzJxdzBxdS9ueDNveS9uVjRPPCw2ezxulUqFikF2kEZ6j0R6
+iT52iDpweTRmRDE8hTdjqE93rU6Fr1OOpE+JqFWXp1WNtlWZi1d4NUFDOEhNPUBDd0htlECFhDN6
+mUiRjTyFeTFyjT6Dhzx8kz2HiVGBSDJDbDJVhjdlk0N6jjx5kjt3jjp4njmGYzdONCE0eCpvfDV0
+cS9rdi5ycSxnfzV3hDZ8ci5oQTE8eUFmjUl2n1aHhkZxiUZznFWGolmLjkh4iEFxeS9fezBgl1aB
+nFqHh0FwcitcbShYfzxqfjtpejZlfTZlbyhWaidSeDhhgUJrikx2jlN6hUpxb0VhMisub4+DTGFX
+RFpZcLCnSGJeLDY2gaimaoOEO0FAkaSfMzw9PRdAZyhpXyZfWyNcTBdUViFkZDB0ZjRyViRiViRg
+c0F8dT53czl3YTB0XCtzbzR6gD59gUKBckCKbkeRckmReUiTfUKRfDuGejaFdC57gDaCPy0/RyVC
+eTFudjNnfjZ2eTJxejRveTNvgDN3VzNQQC45fz1wmVGJkUp+lkyBmU6EjEB3hzducy1hRC47hDli
+qk50pkyCpVGLp099t1yarFyZj0eEVjJQMzQyaGNWPj89QypCaTBndzNynEyRokyQgTRyij6Djj+D
+jT+AkFKIQCw9bzJdjDprlUF/gzRvkT13mkOImTuBZztPOiU3fC92gDN6dDBrezN2eTFygDh4gzl4
+fDZyQjNAdT5ijUZzmVWDikl1llWCi0d1oFyKpWSOoV2Kkkl4fzNliENxoWCMmVaCfzlpcStcdjBg
+ikVzhURxhEFufzdmbShWbSpWfDtnhUdxjE94hkpybkRgNS0xZYV5TWJYR11ccK+lSGJdKTUzh6+t
+Z4CCQEZHnKypPEVGOxI4ayhqYCxoUh5cVCFiYS9zZzV3YS5sUh5cbTp4d0WEcjl8aSx0XTBzYTJu
+hEF8hEWDcj2CcEeWd0+ZgFGYgEqSgEKLdTiAYzCGejiLej6EOS47RSVBfzR1ezRtgDd5fjd0ezZu
+ezVwhjh/Ui9OPiw4gT9znVmPkE2Blk+FqGCVkUd9hThsdDBhSjVAiUJnqVJ1pFKAqEyKqlF6lkp/
+WjJhUDgwWVcpPkYuyLqTnZqOJyolPCwsMCI1azFpijR8lT2EkT6JlTyKiDx8lk6NPys7cTNilDxy
+m0KFiT5yijpunkOKlTx6cUNdPic6fDJ2hzWCgDp3fjZ1gTh6fzh4dzFufjV3QTVDd0BjfzRjeztp
+k1J/k1J+m1qHi0t1mFuArGyVq2eVk0x+kEl6n16JoGGLjkl4ejNkcSlZhD1si0x2i0t2iURzfzpq
+bilZbitZfj1qh0l0j1F7eU1qOjM2X4B0SV1TQFVVdLKoSWRfLjk3hq+sbYaIPkVGmqyoPUlJQBpA
+cjJzWihkUiJgWSlrYjN5Zjd8VCFfYCxqc0B+cj9+ZS91Zyp1Xi9zbzx5hkSCfUGFb0CLb0iYf1Wf
+hFGZe0CMekCObjiHYTKIfkKQiEuSQTNFRSRBfjR0gjt0hDp9fzd2fTlxfzl0hjl/Xj1bPSw5gkN1
+pWOYkE+DmlaKqGOXkUl/gTZpdTZhRzY9gzxlqlF9tVWDrkuIazZYOig1UkQoqpQiqJgfUEc7wraN
+p5qGRTMghE4VWkAdOigwNyBDbjRqk0GFkz6IijyAnFKTRzFCcTJhlD1zoEiKj0R5iDhslj2Alj16
+dERkPyc8fTV0iTiAgDp7fzd5gDh6gTl5ezRxfDZ1RT1HeD9jfS5hcC1eklJ9lFOAoF+MlFN+iklz
+qGeSrW2ZpGORkk5+nF6Jm16Ikk9+hD5wdS5eejRhiUp0kVJ9jEp5jUt6ezlnaCZVbCpZfj9sjVB7
+eU1rMSotXX1xTGBWQlZWc7GnR2FdKjY1hKyqbIWHPkVGk6ejPEhJQx9FZypqUCFdWCxrXzJ2YTV8
+Wi1yWydnajd1azh3ZTNyZTN1bDJ6ZTN7eUGIf0WMcz+NbkGRfFGcek6YcT6NcjeMZDOLZDaGbD6N
+gUKQhUGTRDBMSCZFgDV2gTpzgjp8gzx6gj11gTt2hjl/WTpYPzA9gUV2oWCWkFGFm1iNqGSZjEd8
+gTZtejlnSDlFikB4sluPfT5kSS08Xlgon30huYoo1rEYrJkdREAqsa54hIFlUSsZlFEFm1QNhE4V
+aEUdRzUvRylJaC5mfzZ5n0+SSy9BczRjkjxylT+AkUZ7iTlsjjd1lD13dURoPCQ4fjdziTuBhTyC
+gDh8gDh5gjp6fTV0fTl2PThAg0tvhjRpdi9ifz5qlVSBo2KOlVSAlFF+nV2KqmyXpWmUpmSThEdy
+ik54lVOBiUN1h0BwcixafT1okFJ+dTVkfj5rikp4gkJwaihZbC5cikx6ek5uKyQnXn1yUGNaQ1lY
+dbOpRV5aJTc3hqqqcYKGQUpJkKmlOUJFOhhAUR1gVCRjYDF0bT2EXjBxXC5tZTJ4ajZ9bDl9azd7
+aTN5aTN3cDx/fEWOfUeUcz+Qd0eXgledc0qPckSVaDeQZTiLcUeSc0aVej+OfEGRQzFGTylKhDd8
+fjpxfjp1hkF7hD55gjt4hTh9XjxfRjZDhkd2mleNklCDm1OKqF2XkkqCfy96iDxrTTZHbDtiUzVV
+RjkxmIYbwKMgrYYZto8qxa8fo5EnQT0vuq51b21XVy0RkE4KmE8JoFAIo1MOilMWYEIiOSw0Th9O
+dEJuUztPezNemT54jkd9jj90kT1xiTdskj1yc0ZlPyc7fjJ5fzl2ijqEgDx9gTh7hzyCfDR2fDp4
+RjlFiVV4jENyhDRqgjxqgz9soV+MomGPjUt6l1aEoV+OqGeVqGiUn1+LiEZzkEt7jkZ5iEFzdjJh
+hENwjU16djNiaSNSgD1slFSCiEd0bi9bdDZkdUlqKSIoYH97UWRhQltbfbSrTF1aIzM0hauqb4OG
+Q0tKlrCpOEJDMA84Uh5kWydqaDJ2XiltYCtsZDJyYDJ1ZjR6bTV9bjV9ZzF4aDR3cz6Cd0GJeEKP
+ekaUgFCdgVafdEqRb0OQaz6QdkmYe1CdcUOUdTmLdz2OQzFGUStNhjl+gj50gT54gj13gz14gDl3
+hTd8ZEJkRTVBhER0lVGIgUZ3l1GLl0aIk0SEgT1oZS1nLy4rPTMmcWArspoXyKEavIontpUksJow
+uaEumoQrQ0A1rZ5wV1JDWS8RjkoJlEsImEwFnE0FlE0GmE8MgFMRVD4dQjI6ODFAWCtIizltpU6J
+kjl3kDl2ijhujjptbkBhQCc/fTF7dzVvgjh6ezl2fzd6hzuCfTZ4fTp4RjVDild5nlmHhzhuhT5u
+gjxrhUNxqGeWomGPkU99oF6No2KQm12HqmmVjkt5i0V2iDxwgTdqjkx7jE98iEp3fztqbylZayhW
+fDxpikl1h0l1ez1qaT5eKyUpYIB5SF1YQVtafbWsSltYLDc5hKuraICDQ0tKn7evPUhGNBM8VCBo
+XChwXihtXy1rYi9uZDFzZjR0YS5yZzN7ajV/ZjB4bTl8dD+CeEKKgEqXg1Cae0yVcEKSbUGQb0KR
+dUeZeUqecUOVbj+TfkGVcjiMQjBGVC5QgjR7gj50h0R9hD95gTp2fzl2hTh8WjhbQzI/hENyikd9
+i02AmE6NlEaKgkuAUzVPNCgud20iopg1uaQmupYhxZ4ivZwbspYfs5EttIomoIImOzc4TkUvMzg3
+SSsSfkYKgUQHekMFfkYKh0oMi0sOmFcMmFcIg04UZ0MWOi4fQiQ6eDhslUKFokiKjj5tijpkaDtZ
+QCRBdyt2czdqeztyejt1gDZ6gTV8fTZ3ejVzRzNBhlJzqGWTkUV7lEt+gz1vgj9wjEp7oWCOoV+N
+lFKBn16Mp2mTomKOllSBhD5vgztuhT9wfzppejdlfDxpjUp5hT5ubSpZby9ddjVifT9rgkRyYjdX
+LSkpZIV8TWNbPllWeratRFhULzg6ibKwZ4KCR01Mpb2zQU1JOBc/XCZvWypxVyptWy5sZDRzbTZ5
+dDp9ZS92YzJ7ZDR+ajN6dD6CeUGFhUuSgE2XfEuTcUKLbD2Naz2QbT+Td0mfb0CackOabT2SfEGV
+gUCVRzRKUSpOgTV4fThwgj56gDp1fzlzfjh0hjh+XzhcPC87gEZ1gzx0mU+PllKJdT1vQi5IUkoi
+kIgfvZ8mqoslso4ttZg4uJYqvZEiunwwsXoov4saqYgfPzZBR0U7Hy4vNycYa0AJfUUHd0UFdkUH
+e0cHfkYLhEoKi1IGnlsOoVMIhlATUDsaOyQrUytUgzx3hzlpiT1iaj1QQB9Adi13dDlxdDhueDhz
+fzd5gDh7eTJzejNyQi89cTxgpGKRnlWLiUJ1h0FziUV3h0N0jUt6oF2LnFqIkVB9nF2JllaCkE18
+fDdohUN0eTdoci1dejNhdTFfdDNhiURyeTdlby5bcC9bbjBbfTxqZDZXLywrcZOHUWVbQ1tXiMC3
+TWVhIygpSGFeOkRCRk1Kp8K5Q05MQB5FZi90YC5wXjBwYTBycTh6dzd6bDJ3Yi53YS12azh8dTx+
+g0KGiEmMg0+RdlCWakGKbD2JbTqIazyOckWcbT+YcEWabT+TbTmOdj+MmEudSDRISiVMfTNtfTdv
+ezZ1ejVufDdufTdzhDV/XjlePS46iEZ8iD5ydj5wRS5CQTsqiXQos5Qfs44js5QZs5AmuqQquJ8s
+u5IjuYYYu3kkuYEtx6AarZofTEtDubGapKuETEM5WTUIfEUHekUHfEkKe0sLekkMfUgLh04PlVsS
+mWEUm10NmlcKfUoTUzgeMyksOiA5bytRXzpOPiM+dDFueDBxdjJvezZ1cjJtdjZwdS1ufDFyPCw6
+XCNMjEZ3lVGEhT9uezVkiUNyiEBxi0R1lE59l1WBmVmDjk16klB+klB+djRigj9tfTlobSlYdzNi
+fDpncTFdejlliEdzeThlcTBcczJecy9dYTFTLikqc5OFVmRZLzw7UHBrMUA9JCYnXGZmSUJDRk1K
+o8G4QUxJPx5EYixxZS9zbTh3czt3czl3cDV5Yi5zYzF4aDR4dT19fEmIikiLgEeLbk+RbUyUaEKM
+aDqIbTqKaTqNbECUdEeab0OObD2LbzmKg0aLoFCeTThLRyJHeDFodjJndTBseTVrdzNqejRxfS16
+XDxWSDM9dzhzSSlUNzMnd3MkqJcivZgbuZESu5UlxKE9wbAut6QytZE6t4EwuYE0uYMxwJcW0rYc
+qJoiPT06qZuH3duacm1bWDkVjVcLhUwGgEoIfEkLe0kMgU4QilUViFMMh1QNi14Sj2IOml0Ip1EI
+lUgRSjwYKicnNyk7NSQ6ZSdefjFzfTF1fjZ4czNucTJrcSlreS9wOCg2XiNLfDFiiEF0jUd2dC9e
+eTNigDlpiEByiUNzlFJ/i0t2kVB7iUl0j096ejplczBefTlobyxabytagT9sbCtYejlmgkFui0p2
+cC9bfDtndDBeZzVXNC0vdJSGVmdcKTk4TnRuNENALzQ1iqShbHZ0RUxJp8K6QExJOxpAZjF2cTh9
+ezx6eDpxdjt3ZC9yXC50YzN5czx8gkWAeEWHbkGIZTyHaEGPa0GOZTuIZTuLZDqMaEGMbESPbD+O
+cj+NbDmJdz2Kl1OToEyWRzJESCRHdi5kczBjdDFsdzNodDBldS5sgCx9WjFWJi0xOSwyZ1ckoJIg
+wK0mtZsWupkRwJgUvI0mso4mwakmtZE1sYg5uH41toI2s5QquaAkuqgkj4IiIyIpVUtLuKeJiI5w
+UDcYoGEQqWcRmlwQik8Mh00OhUsPhEoPhEwLiVAKilILhFcOjF4Oll4InlkLnFURd0kUUTwZOCop
+Pxs/UiVWcy1nezFxbS5oaSpkcSlqfDFzPC06ay1Xeipcei5hhD5tgjxrcixbbSZWeDBiiEJykk98
+jk54jk53k1N8i0t0h0ZwcS5cdzNjci9ebChXejdldzZjdDNgeTdkg0Fufz5rcTFdhEBuYjBSNjQ1
+aY+AR2BVPVpXgcG4S2ZiMDY2epyXXnJvRk5Mr8a+Q0tJOB5AcD2AeTp9dDVwdDtyaTNwYC1xXS1x
+Zzd4dkOAdUB8bj2JWzWGZz+Pf0qWckGPZzeKZTmNaECSc02UflSaeEiUaDiHZTWGhkWPl1OQnk2X
+RjJHSSFCcSlicSpZci5lcC5idyxddi5rWSddOR88TU81kYIoxaggvK0evaMZxqYRvqEZuY4mv5Qb
+v5sqtJIltIk7soxHuIksvZcZvZwqs5tKtaY4cGYmYV9TYFlMST46d31fUzggl1YHomIJnmAHpVwK
+nVYOjk8JkEwGkEwJi0sIkE4InE8JkFcKhmINh2EMkGELnlgImlgNgU4TXzkhOiQnOBw8WSZbbzFp
+czJkbilnfzV9QS09fUhrfzJfeSVadytdgDdnfTVkdi9ebCRWejNlkEl7lU+AiEhyk1N9h0dxi0t1
+ejdmci1fbilabCdZbitbgkFtbi1adzVieDhkhkxzdDdefkNsRCY7Li8tXoV1OlZHPFxZcrmvPFZU
+LzU0f56ZYnJwRU9NscnBQUlGJBQpZzpxeTR7cTFzajNvWyloXSxsazdzbjx5aTp5ajx8ZDKCaDuL
+f0yYhEiNbDuIZDOGZjeLaz+OcUSMdkaPc0KOXjWEZDeHj0aQlEuLn0yYSTZKRyU8cCpieStYfC5j
+dy9gXSZWQiFBQzkydHofspwX0ZIUtpsUsKQgu6YZvqAkuZEyxqYcxKoUwaUzvJRLto06uJkwwJ4Z
+xaUXtpoRu6Mhq6EvTUgzsq2Zw7+YTEZCQkA2TzQhmlUIq2cQq28QpGgHpmINql8SpVoImlMGl1ML
+llAKnFMImVgJkVsJkmAMk2IPk2cVlmgVo1wEmFYNhFceUTkiMR4uQBtIWiJWbiZgfDF1OCk5g1N3
+hkFueCZbey9keC9hfzhohEBuezlnaSdVgD5rklB+kVJ+iEl2jEx5h0h1hUVxby5bbi1abCtYaChT
+ez1lfj9pcjNcg0dvfEJrkkt/WjNQGCYaKzAqYYZ1P1ZJOlhWa7iuPV1aLzU0f56ZYHFuRU5Msce+
+PUpGEBsQMyczYy9oazFyXidoXClnZjVvazhwYC1oYzFuajh3dDyDeUOHgEmMdTyCXi98Xi9/ZzeG
+dUaOekaPbTqFXzB/XjKFZjaEjUSNiDyBnkmVSzhLRSBCbShrci1faixeRBxFRzYxeG8msJ0Zy6Mi
+wJYQuJQNwZwcwaEjtJYitoszwZUuv5ogu6QYu5ktvo05xJktv40uw5EdwpgbybAn2MMYhn4kU1Fb
+1M2y4t21n5iQKSUmRy4ckksKnFIHol8NqXIRrH8apXQSrGoLrWAHrF4KpFwMn1gImFcInFwPoFsO
+omESml8Ol2IMmmcNqWkRrGULplsSh0wVTjcgJyQrORo9ZShfPzE6hk91o16KhzhphjlqlEp5iUFt
+i0Rxn1eIjkZ4ejJkjER1nFeEjEd0kkx5lE97jUd3ejRmdzFjezVmcixcfDVmikN0eTNjdC5dgkBr
+bj5bIkMaHHUeKzwsZ4x7QVVMOFpUYLGmPF5bMjc3f52ZXm9sRE1LrsC7QVFNGUEWGDcUNh49Xi9m
+ZzJwdTt6azJwYS9vZjBuczl1gEN+hkeFgUiEekiLYzSDYTKAajmIeUWRfUiNd0GMZjSEZzeKbDWN
+ajWGhECLhT2In0+dVD1QTB4/aS1qSCVDNSQzWVgnr50hzagWvZgRvZgRvJgSuqY1ups2vJAxwJJN
+uZQxxJskxp4kwaInx5k9zJc0xIosyJQrx5oczrIeyLQw0bgsgG0pZ2Ni39i/5Ny81c+6Tk1DQSsV
+hEcOjkkJlkkLmlQKom0RrIIWt4cZsIAWrXcTqGgMo2UPpGcVnF0QmlsOo2ITpF8QpFwJomEJomcV
+oWsOo2UErFgEp1MRhkwVTD4dNys5MTM0Z0NefE5scUBgWihKZDVTb0NeYzZRajhWeEZkcD5bXSxJ
+aj5dZztaZzpZckZlZz1aWzNPUSpEUSlEUSZDVihGXS9NXDBOUCBCSylCFzgVD5kREq0UJD4ldZqK
+RFZPOVtUXq6jO1pXMDQ3gpiYXG5vPUZIqb68QVRMDFwNI40mGjIcPB9BWS1ZXC9aUCZVUSlXXC5f
+YzdlZT9naT5pZD1xWjlsUS1sWzRuYjpyXTNnXzJkXjJrWi9uWTRpVDBoUCltXC9saTZ0h0J5RzJH
+LiUzRyVDT0ckin0rwqsdxJ8awJYZw6YUzKoTx6Elvpg2wZFCwIxFy5xF0KsyzbAXz7YYzbohwaA0
+xpdByqYh0awbz6Mkx6Ejy58hxqIie1slbnNd1NC9sqmOsKGAXWBSOC0ce0cQmVURnVQSjFAInlMO
+mloOmmcQonQVq3kYrnYUp28QqWoSo2ANnV0OnV4PmlsJl1oGnFoKllwKnmgQpWsNnmkGoF4Eo1UH
+mVQPcE0ePjU+TDtIXDdUTjhOTipBUCg7Sys/QylAQiU7Qyk/RSpBRSY+QiI7PyE3SSs/SCo9Si9F
+SSpASSU5TCo8Rik6SCg7TCk9Sy9CRS9CJBwlEVQUErsXFqcXIjwjfaGZTV5ZPFpXXrmvQ2BbLTA0
+iZucXGttO0RHscXFRlBRDFwPG7gmIG0jFxAWMBswNBwwMx4xMB4rNSA1NB80MyIuPiEvOR82NSEu
+OyI0PyQ4PiU3Pic3PCc2QSw2PiY4Qis8QSo6QixHPCk+PSo/UC9CJjAxP0AriGc1tpIky6ESvJcW
+w58iyKspwK0mwJcxxZo6yJ81zZ070JpB0aku2b0k0Lsi1Lsp17whyqQywZg1x68xyaMwzpMmypog
+y54YyKkdb1pAQk1AUVJGRD4vX1JDTU1DLisnWj8clVwjj1wTolUOolQMpVoNqGYYoWcZpGkVqm4R
+rnUZrHUXqG8QpWsNomsMlV8IklwNlV0OkVcHmV0LoGERnmgPnGYKnGAIl18Gh1sLTzc4hDx1s1Wj
+oVCNnz1/nDZ1nT5/mkeHkkB+oFGTolGZpE2anEKNmj+Fnj9/mThykj58lTp8ky5xlT19jDd2lTl5
+kjd3kzt6n0+Of0l6IyogC3QLG44aJTgmjKuqWmhnPFpZYb6zPlxWMDA0kaKjXmpsPUNGucjNT1Vb
+DFEQIZ0pF0AXPh0+cTptdDtmcDlgcjlrcjp1dD5xeUJpgjxpgTt1gUBqhUBng0F1hEJ4h0R8hUB5
+gTxvijyAkUGIjUF6lUZ9lUVvlVF0o1Z4UTpBdFwbu5AcwpMSv5gUwKATxqYev50rvppCspdHrZY2
+xK02zJ042as317od07wXyaw0zK1D0q0y2aBAzJ08yaw8x6MyyqEvx6Uo06gf3L0lY2E3NDA3nZpn
+z9SY3dqrw7+TZ2ZXODAnbEgZjWMSoGILolsMplwMp2AOqmsSs3odtn8lt4MrsH0dr3kMtn0Msn4N
+p3QRmGIUmWURlVoIk1YHlFgLo1wSqV8RoV0OmlwIlFoNRjU5jDJ0r0aXrlORpz+GmjBxpUKErE+V
+nkCEnD+HpUiSo0KPm0KQm0KLokiMnUCBljx7n0uLlkWGijh7mDh7mTJ1mz1/kzJzoj6EqligekZ6
+GCYbFVQWKjgtmLK3ZXN0PVxcZL+7Ql1dMjM2kKKiZHFzPEBEtb3JVlthDjsKFjkVTSdNfkGAfzh6
+fDNufzZtgDd1fziBfzdxgjhehTpnjTyDjjuHkT2FiT5skUFtmkNxkjpqkTl6mkCMmz+Glj5unD12
+qUeBolN2pk99UjtIcV0WuZonv5ols5IcvZofw6AjwJsfzqQsya44xKM+zKFA1asq2Lcf0aQwzps8
+0agx0LQszqw417Mw17Ew1LAsy6AswqU3xq8v7MgV0b0nRj41qJ9/7eKU5uCd29Wh1tKP0M2SamxT
+OzEXiVUTkWkcnm8No2wRrWYRq2ESpmIUpGUYqWYdsWwUtm4JtmsKrWsIq3QNqHgOp3MPq3IXl14K
+jFcJilYLi1MLlVUSpFgRolYOQDMojzFtrkiYmz6IokCBpD9/oUSGoUeMnjt+pUWHnz+CmTh7nDyD
+nkCIn0KKp0mNojx7mkCBnU6Vn0aMnjl9mTN1nTd6nkCClDd6ljh7p1KWfUV1KCIlLjAwqsDJbXV8
+PF9fbMXHP1xgMDM2lKioaHR2PUBDrbS+UFVYBxQAPiU8gziGgTmAfTh2fjh1fjdyezlyfDx8hkJz
+hz9fhjdrjjt9jTt8iTxwhj1nkkNrmkNtlz9vnkCNpEmIn0N3pER5qUiBqUl+olF0qU+MVDxLeWAZ
+u502v6I2yqkyyKIa0KEnyaQqvaokxp4nxpUsz6Yk060f0aEqx6MxwKFSuqNNx68wzqw6xK8g0akm
+1Z8oz501yKg5z78u4NQTl4kjW0hg2NOf3tx43deN19CZzMyC3NiGtrh7QTsye0IRh1oakWcPm28S
+rHAOsnQSrHITpGkOpWYRr2kNunAHtm0Fq2QSpGQeqXMqrHgWrn4Uqn4Wk2UMj1kGi1IMhU4QiU8M
+j1MPPDAjgCVlsk6Zr0+bnDp+oz+DoESHokqLmTt8nkGDrVGWn0OJoD+Imz2InkGLn0CDp0OAmz2C
+nUSRo0iRnD2DmzN4njN1oEyGn1KMmTh7kzh9olSVcT9qMSwys8rQdXmDNltbbsTEP1xfMzU5k6an
+ZnJ0Oz5CmaKkSE9OKxYneDd4gTOCeTRzezVtfjdveTFrgD10fT5tfj9mg0BngDNvhzpxhzlrijtr
+iTtojjxlkzxpmD57n0KIm0J1oUd2pUSFqUmBqkZ6pUiIrUibVTdNeWEWwaEpt5giuZgnu6QpyZMp
+x4wut5A0zqA5yqEfzaMbzZ4jzaMruZ9AsKRKvKdCyqkvyaUsx6Apy5klz5gwyqQz0Z4317AtrqAl
+S0gwpKGH4+KW4tN42s+I3dWN09F33NaE1dCIWU1BXDMMilcMjlcXi14SmmsPoXQRqXsUsn8UrXcT
+rXAPqWkLnWUMsXssrn42mmwmoGURo3EKr4YVpX8UoGwPllwKilULhFYOfEwMNi8jhitrojiBr0qV
+q0qVpEWRmT6DoEaHnkWHlz+DpU6Vo02UpEuSnESPmECJmT2Anz99oUSHoUiRn0ePoESNmziAoD17
+nEd5m0x9mD15kjZ4pEyVik6EMisxo8DAZnF0O1xccsHARWBgLjE0jqKiZnN1NDc6jJKSP0dESh9G
+fS52dC9vdi5qdS5kdCxgejBoeC5hdjJWfTdkhDh2fjN1gjlsgjRkiDRuhjRkiTZejjZmlTqCljt4
+lzxsnj99pEaGoUpzo0J+okGaqEOiUDlPd2QdvpwiwpwjvZEkwIUuv4MnvYonv5gzyqMvzKcowJAs
+y58qyacgxqA2zq82xaEvxpw4wJwgxZoyu5UiyqUs2b4g5bQluY0rODcog4Jm692g186ey8Z7zMJ/
+28+A2tNv2c6H1MqHeHRWQS0Vg0wOiVMKiVcMiFoLh1kOkmMTo3YVnnQSoHEVpm4apWMVpWARqmAQ
+rV8RpFwOm1oLpG0WqYAYrY0congQllwEl1UGjU8OPzcuhyxsqUKJljV7qU2Uqk6go0aWmzyDrVCV
+qE2TokiPo0uUpFKZpVOcnEePnUOFmTt8lDl6oEeMoEmSnEuVl0OKlTh5lDJrlTJrkjFrkTJslz+C
+hUd9MSgugaOcXGtoPVtda7y5QV5cMTM2h5uaZ3R0LzM0eIaELjY1SRw/cyhqbypodytmcChZdCxZ
+dC1YcSpSdy1efTFpgDRufDBpgDFtgC9phDNniDpkgS9fjDNtkDhykTdnlTluljp8n0Z9nEVwnj59
+oT2WpkCeTzxNb18VupQYuocZvIMnuX0zs4YWxJgQy5QRxp0kwJcrwJgjyqIfzKcYy6Mdw5QrwJc0
+w5gmxpYf0Jsezp8by64h4Lkcr6AYVUcohIVh1MuP5dOP1sedw8KCz8R21MFs1cJs08aE2M+Ghnxa
+MjAlej0HhU8NhEwQg04Nh1UKhlIFilUKlGARmmQNmmEIkVkIlFcKmlUQnFMSl1AIlUoKlk8LmmIL
+oHkOpoAWnGwMmlQFmlALRTUqhyxyokWLo0uHnDh0pTiLrEecn0SLmDR7p0mPmjyDnj2GoEiSqFSf
+oEmWmT+Lkzd8ki9vnTl7nUGIlkOKkjqClzh/kTJwlDVtjyljjCpliitreDZnLiYsa4uETmNfOllZ
+ZLSuQF9eLTEyhZmYX2trKi4vY3JvKTEvRRk6cSdnbydiciZYcSpScClQbihNdS1VeCxidypjey9j
+fTBmgS9ugzBthTRmhTNjhjFnjDVrjjllkDZhlTlxkTh4mUF6mT50mjh0mDN9mzCITzZGemAUs4IN
+sHIZpmoetXsbxZMVwJMIvpIVwp4ru5gnwZ8hx50ewpYXyp0hvowUxI8T0ZYYyaIPzacU0JwMzJIW
+r40kTUY3mJOB09aa39Og18uK08WJzMKHy7xeyLFRz7ha08Fz2Mh4p5ZjNzYqZDIGd0IHe0IIekAF
+ekQBhFIIi1oMh1MJj1EImVYGnl0HnloMl00HkkYGkUQGkkEHkkIGkEcDj08GlGAImWcInVcRmEwM
+Py4kgSZwpEePnD+HoDV+liZtnTF5rUaTnzuInj6KoEOOo0WQmD2CmDuCljeBmTuGmT6FkTR1kzV2
+mkGHkz6BjzR1kzJ4ii1uiCpoiSNgiSZjhyRlcSpaNSwybYiCSFtXOllZYa6oOllaKy4vhZmYYm9v
+KS0udH57Nzw8Qxk9cSdhcSdZeCxXdy1UbiRLditUeS1bey5ffC5ifzBlhjVvhDFtiDJsizZsjjhr
+jDZokDlpkjlllDhtnUKBlDyDlzyEnj+Ilzd0nj55njGEVjVNdlATs3YYtXg5sIRLuIojwoUXvIQW
+u5cmtJQqwKI5wZ8ly50gwJUewpA1w48uzaQY2qcQxJEZuYggx4AczYsOfGAqZWdG3tGj3sm04dCu
+1cmZ0ciE18eFz7hcyK9UyLVU07xt2LppyrZhTUYxTS8Ye0QRez8Mf0AGekIHekkKiFoOk2QVkloO
+i0kFjEULmFERnFYOmlMHmUoKmEoMmEoKlkQEjj4DjUYEkE0ImE0SkkgPQjIsgidxqkiVoTyQoDaI
+nDh4lytsnSp2qD+OnTaEoUGNmECKn0mLoUCGnTd+mziAm0CGnEiKkT6BmD2HnkKJiS1tmTd3jSxw
+hyZqiiVnhiNjiyZocypZNSgvcYSAVF1bO1hYXaulO1tbMTQ2gZaVZHBxKCwsZnBrLzMzRRpAcSVc
+cyhWdilWcidPciZSeitceytcfS5egjNjhDNoiTZwjTlxkDtykjxxkz1rlD1rlj1tlTlumDl5mzyG
+mTyOmTqRnj2UmTyBoESApTyRVTZSdVYQuYIcrXsstplAuJAewIIYxo4XwZ8dwJ0owKAhy6wWzqEQ
+ypIkxIwh06cbzaUVx40cw4Mew4IjxYYhqn8hQzwolI1n3dSD6Mym4s2z2cyp1MyF4MmK2b90ybFf
+yrdh0bZ12rhq38hllYlmQTMoajgTfTwPfToEeT4GekQJiFILil0LjmULlGQJlF0GkVgEkVYFlFUG
+mlMFmFUHmlYKoFQJoFIJmUYKlkEQjkAJiEMKQjMxhyt2oj2PojuQozyJoEKOqUWNmCxznDB4oTJ7
+pT6GoUiNo1KWmTuDojyGpEGOnDyHmUOInkmOnj2IpD6PlTeAiidmljJxkC5xiylujitujSVodClY
+LCAnVmBdQ0hFO1dXYa6oOlpaLC8whZiZZ3R2HyQhNkI6ISYmTBxEdylecilWdStXcShNeC5ZeCla
+fixchDJihTdgiDhojjpskTtxlD90lUFxlT5vmUF1lj11mj56nj6BoD6Gnz6JnDyNnz6NnzqEnjqF
+nziQVDZTdGAMvJUSxJofuZoKw44QxZIXyKAT1KIq0qUczKoPy6IVyJUVxosrxIIy0pYtwIcawooZ
+xIkhzpInt440TUEpMjMyTUU3lIVP2MmO6Na45tOs5tqS28yQvLJzu69Y1MJm2MF218Bs38V54cuS
+hn1kOi0YVyoNgEEGgzwJgkQKh0cFi1IJjWYNmHIDnG4FnGwKnm0Nnm4Kn2YEm2UIoGwQo24Qo2EO
+o04NnkUNh0IHfUMJPC0ukjR/qUOYrEifoTuNoz+XpEOYrEyYrkaNni53ojeAnkOJokePokWOp0aS
+o0GPo0SQnUCLokaRn0KMoj+SnT+OlzV3mi51kS11lTR3kzBzjylseSlaKCMqPD8/LTIvPltYaLSs
+Pl5dMDM0hpmaaXZ3MTc0gpCKREhJTR1CfC5jdy1eeCteeS9ZeTBaeS9afzFhhDVlhzlgjDtplEF0
+kz53mkV/mUV7lUB1m0R8mEB8nUOFoUKKoEKCnEJ6oUOJmzyDo0CBmzmBoDqNWz9YfWQZwZUVyJce
+uo0PwZQcyqgWy64Z1KgqzaQVwJ0Oxpwey5Ibx4Q5w3o6zI0bzowf0I4lvYQxknM1WVEmaWtSwryc
+m4hrOTwjlYNo2Mal4M+gp5tsZF5NU088UEQ1iXxRzLt248173cWD5dOj18yVkJFkRDoyRisHdjoR
+jkwOjkoHjEcLjV4RmHEFnnUJoXcLo3kLo3oKo3gOo3oWp4EfsIglqHYam1oMlEkEk0YEiUcLQDYz
+lTqCtFKirk6jpD+RqECUpD+Sq0mXs02Xr0OOozuFoUGKpUCKp0WPp0qVqE2aokaRo0WQrU+amj6I
+njuKp0mVnj2BpT2FljR8kS1vlzd3kzRzfTRiLywze4CAUVdUOlpWarauPFxaMTQ1hpmaZ3N2NTo4
+nqqmVFlZTB4+eipheS5fey9gei5fey9ffTNjgTVvhTZwjT1qjDlrkUF1l0WAl0SDkj59mEF/nESE
+nUWJpUqTo0eOoUSJo0WKpkiFoUZ6pUSCoT2Kq0OcXUJWg2kdwYwZzZcTz54Rza8c0robz7AiyaAT
+zqQiyJ0zx50s05gc0oQm0Y4T16Ab1aYhpXEzUD06cHNbrqZt7N6g8Oax+OacnZ16WlJKaWBVZWRd
+cGlcm5JUvLBZnZhWSz45h4NN59GF4cmP28yZ5tOM7NaLy7+id3pgQiseWzUHml4Ool0Ojk8IklgH
+nmwJoHEHoXQHqn0Pq4AUpH0YqIIhpHwZoXURpHYUoGkNn1QHmE0LSz02jjB0sUuXtVSnslGhpzyJ
+q0KRrUiYqEOOq0eSq0eUqkWRpkGLpUWOpEaRq1Geo0eSpEeSr1Kdq06Znj2In0KLnz+InTmEoESN
+mTh/ljd8lDR4hDhqKyowi5KSZm9sNlhTarauQGBdMzc4gpaXZnJ0Njk3o62rWV1bSBw0ditadS1Z
+dShceiphfi5lfi5sgTR1hDZviDhpizdqjz1xlT+BlT6GmUSDnkeEnEODpkyRokiPpUqPrU+XpUON
+pkR/okN6rUeTqj+Zq0KhWzxfgFkuy40r06gb27kc1roXy6ojxpc2yJEu2a8a2KcoypQg0pgb0oUk
+06MO8ssTrZAURzw8qa6S59+T9uua7+Ks6Ny64dmV4tucy8Sir6ppu7206NzC7thU4tJJ29aDopKS
+Rj44rp9r5dmS6dqZ7NSS5daY8uTG8Oa0gHVjLR0Xaz0KmloGpF4HlVEHlVYHpmoJpG0JpGcHr3QO
+r3wSrn8SrH8RqHMOnGkKm2oPo20cl1sXU0M8jSxqrD+Kt1OatVWksUaOrDiGpkeZpUaVsEubskuZ
+rkmSqUiWqkeUqEeRp0qSpkqToEKOoUGPpUSQq0qRoUSMqUeUmTaBo0aPn0SPn0KLmTeAfTFoLy00
+jJWSaG5qN1pWZbGqQ2JgLTEzfZCRY21wOTo5pK2pVllWQxcxcyddbSZXcyZgdyhieClefixtfjBu
+gDNlhDVgiThjjzlyjzh0lDt8m0GEoUmAmkF5nUJ/oESEo0aMpUaLo0KCpUF+pkGIqz+XqzuYpD2Z
+XEBYiW8Y26wh0bMh1rU0zZ4oypczxZQs0aMo1Kcf05cfz5ASy40ixpMd3rwYvKgdST4praNx7+e/
+7tus6tqQ4Nmv5tu82NCV5NOO6dqh7t2T59zJ7OGs69g9yr5c4tar6OSzhYRuVU08op9k28uN5dOf
+ysSOsKaZiIJ1XF9LOz9AOy8nUDIOeUgJj1gLlFgNnloIo2sUoWoKnlYKoVwKp2cNqGkQp2gSqWsV
+nmQPl18OjVYPTEA8mDhzrDaEq0B9tlmktlGZsTaEpkWUo0aWrEaZsEiWqkqQrU6ar0uXr0uWpkeP
+okWNoECMoj+Ooz6KokKIo0SOqEWUnTqElzZ9pkiUnECKpESOgjtxMS01jZaSbW1pM1RTabWtQmJf
+KzAxd4qLWmRnOTs5rLavWlxaQRA3cyFmbiVebiRdbSJYbyVUdyhidylifzFfgjNaiTZeizZpiDRg
+kz1xmT6Clj1vlz5xlDhznT+AokGIoD2GmDV9oTyDpkGMoDSGqDyKpkCQWT5PhnIS2K4ZzqkYyJYe
+xZUkwosjzpgh0Z8dx5wewY8QxYkUwIkcxZAWrYoUOjkjmopw5NiA29Gv6dbI3M1+382n59e+3c+U
+4tGI3NGS3tF84syT4dmj1cRMw69r3tSo3Neh6+fRbnNsMi0vYGBJa29PUktAYF5UmImDycF/0cuZ
+paRxjZNsWEtNTzgUfEwJl04JlFQMnm4Qnl0MkUoBlEoEnVEJoUoFoVMHnWAJn2YNnmMWSz45jzFu
+u0KYozFzrkmRt1akr0COqDmBoz6JpkGQp0KPqkiOq0uRr1CYnz+Kp0WVoUGJnj6HpkSQmDiBpkqP
+qE2Wn0COnz+InT6DnT6Hp0qToUKOj0qDMCw0k52YbG5oMFJQbLiwQmFfLDAycoWGVmBjOTo4prCp
+WFpbQhA7cB5faCJWaB9YaiFVaiJPdipgdSddfC5Yfy9SgjBThzZYjTdmkzpzkjhykjdrljpxmTt7
+mjiBnTiDnTiDky56nDeEmTV+mC51mS10lzB/WTtRhnIXyqQPxpsQv30du4wmwY8cxpETvokXwY4b
+xJEQwYUdvostpHcmUT0sbm1Y4s+14Md808qs2dHBzcJq38if4M6x3MyP4cyF38+X285s5Md53dWj
+1L9W0sF15Nqq7+m6uLKiUlRHW1FEMystS0o2sqeD3dm17t265tt/8uCd7+J+6OeSq7J1Oy4mYDIM
+mEsJmUsHi0wEkloKk1QMkEcJk0IFnUMFmUsGj1IFlVQGm1gQTUE7jDl2uk6mqz6ApTJ4q0mbrUqW
+pC9ypDF6pjyIpDuIozmCqUaPp0qTmT2InDmGo0CHoD6Gq0uVokWLnUSHo0qSqUuZmDqElDV7lDN5
+pEaOqU2aiER/Mi42jZaSZ2hjNFZVbLixRmVjKzEybX+AVV9hNDo3lJuWUk9WQRQ5bB1OYRlNaSBd
+cyNdbh5WdydhdiZdeylXgC1UgS5SgzJbjjVwkjV3kDJtkjR1lzl6ljV/kzN4lDN1ljJ5lTB6kSpz
+jyxtlSpzmyl+oC6OVjVXf28XzqUQypYZsXIcu4gmuocju4wOxY4QxIkJv4gQvogZoH4oSzsjjYBl
+2c2w18+/3cR6082u0Mu218du3Mmd3Myo28eS28mK2MSj2Mt53syH3d+9489h9OKm8OPVko54Tkk3
+ubJ14dOSqZmIU0s1q5t32dWs4dWn28996tyl7NV88d6m392VgXZiNyEUfD4Fm0gHh0MJe0ELgkwM
+iU4Phj4LijoEjEkJhkkIjUIBlUULST44kD+FuVOsvE6gpi97oDR+sEqUpDZ9pixtoDB4pDiIojKI
+nDaBl0KLnUGNoTuJnjiDoj+Ko0aSokaQnECFljV7ojuGn0OOlD2ElTR5ljp+o0yThEl8MywyfYaC
+YGBeMVVUbLqyRmFfLDM0Z3h6UVtdMjk2iJWMSk1PPREuaRxGZxxXaR9ZayJIcSRSbyBYbiFQeypX
+fShRgCtSgClhiC1tjTFvjDNokDNvjDBoji5vjjBslzdxmzd4lzF1lS5tlTJslyxzmip8pS+VVzVX
+fG4SxqgNxI8VuXUUtYITvIkbv4sSvHsVtXgQvYEgr4QtTD0piH5r38mQ3c6w2s7G2cR22NGp0smu
+0sFp3Mih5Min5Meh49Cv2s3F0sqK2NKP3eHF0b17oJWTZVlpZ11KyL1+7eWW8Nqs9uKue3pMVElC
+yb+d6Nah4tF57tyh59V65t6649yixsCCREk6SyYIhz0JkkALgzwFeDcFczkHeEIKgToHfTgEiEkM
+mksKj0UMRDYxiCBprT2StlGhpTuGoipyojZ9pkKIoChrmylvoTJ+ny+AmzF6m0CImjiCnjaElzN+
+oUWPn0mVoEuUmTyDnzd+mTB4kjJ6nECIlzV9jzN6ljyFgEN3Mysxd4OAVllYMlVUb7ewRl1cKS8w
+X3FyTFZYMjk2gJWLPUdGPxIsaRpKZx1TZR5IZiA7aiNGbSNUcyVVdyRYfCdUgS1TgShagihghy5r
+hy1tkC5tiStfjSxqkC5xkC5qlC5tkChrkCdlky5skidvlSlwmiiBVDhKgG8S0agUx4siwocluogS
+u30QtnQIt3MPvX8Zx58ad2kjVk5Z186i3siL2s2x2M/B3spw2MyV3M6s1Mdx18ik48+i1sKXq5yL
+hYB6f3JUeW9QcnFtaGNLdmpMn5hf4tmH7uF37uKf7dy77d2TzsSJUk1LioBu69ee38907Nmk6dR+
+4tu739ih4tx/mZplOycdVS0PdzMKgTYHezIGcjAGbTgKcDsIbjsGbjsEeT0EgEANRDUxiB9joSl0
+njN7p0GMoitymSZqoDd8pTN7mCNpmiVonClrmypylzB4lShynDN/kzF7mj2Io0yYoUyUkDN6mzd9
+mzd8lTR4kzR3lDR5jC9zlDZ8dzZpNCwxcoWATVhVMlZUZ66nRV1dJi0sWGlqS1VYNj47epOJQEpM
+QhMvZxlPaB1VZRtCaRtQax5dbiRdciFdeiJhfidYgi5QfSlPhS1kjC52iCx6iSptiipmkSpykSl3
+jSlsjilpkSdqkydojihtkiZ0pDV5lip7WT1OfWsXqn0WoHMSrIgiuIgatm4SuW0Lx44HyqIQlXkl
+RjQwop1x4tOi0MCM18242tO64Mll182P18mfzrlo19CutrWVXlk6VEY8hnpfmo90rJxxtpll2cNl
+6dJT7tlq49B649pk7OCc5uG449aI7delqKCNSkNCw7SA4dR+692u6taA8OCw59+u4tqD29WOTElP
+MS8qOykYVyMPZyoCeDYJfjcQczgKdjcGeTcJdDUFezkJSD45gy1vpi50nidrnC11oTV3oi1vmCFo
+nC15nyhxmSJjlCVfmSRolyhvlyVwmS96ljF6mTaBmTuIoEOPjjB4jC5ykjd3iy5tkjVyiCtohipo
+kjh3ci5cOC81boN+S1dUMFNSZ7KpQV1bKS8sUWFiS1ZaMzw7dY6DP0ZFRhc5ZxxVZxxPZR1BZhtP
+bR9eax9bcyRjfCZkfSVVgitReilciCpzhydyiDFrhTNfiCxijCdnjCZmiitokC5plSxnlSlqkCtl
+miZ4oSiBgS9yUz85RTokOUEpSjEddV4cvooTtG8Xw4ISq4wUZlwYLy03VU4y08Nx4c2e0MOO08q3
+0syw48Vh1M6U2cqf5Mdtxr2bVElCgndXz7qL4sJh3btp3cJg7cNm6chR8dFI8tpW79xx799u8uGd
+8+S679uD6NSp2cupYl1WeXJa2tOK6t6z7NyH69yd4duy4NOK6dyXjIpuPz4ugXVXTkk8PicLSCUM
+bCgDhzYOkTsJgzkKejUIdzsMQD05eS5spzWGli58nSVslitvnCxxmyNqlCJqoyt2lyRrjiRimCVj
+lSJpkSRtkyx0lzR7mTeBkTJ/lTqKmTyHhylskjV3kjV1hCpmhyliiSlpgixsbChVMysxboN/SFJQ
+M1JSarKoP11aKi8sUmJjU1xhMDk5fJGNRE1DRBVDbR5kZiNBaCBXZx5PaR1KcBtgdiRfdyRYeiNV
+fyZbfypkhChmhShhhTBehCpbhyZdiyNhjCRniyVrlStxlihvlCRznCd8niiKZihMNi00HiReGRyU
+Oi2LJCYyXFEVvJAZrnUnYVwdUUo7lYdgZGFVYWIt4Mxj2sua1siY18y52s2s4sdm18yV3s6o2tFj
+cmpTZ1w827t55MCAzqpO4LQ84btp5bpw6Mtd789G9+BN9eJq5tlo8OCo7+G+7dmA49Sn6NK8sq6I
+Uk1PoqB159q97N2M69qX5t644Nqa3tOg0sySQEk7iXJDx7WOl4pvRUFDPCchTCMTdzAGjDoHhzgE
+ijkLQz4qOSc+gS5uoS2Cny57ny58mSdzmCdrlSJhmSNonShtmSVnliNglCNmlSVrkSdpky9ykjJ3
+kDN7hix4lzyHkzaAii52lTqAkDZ4gyReiSRijSlrdTRjNS40bYJ9TVdUNFRTZq+mQl9cJSwpW2pr
+V2FlLDY1e5OPPUxJMBQsYh9RcCNaaR1RZR1Kah5VcSBgdiRYdydQeiRZeh1jeyNjgidchSlajjRn
+jSxujSlqjSZsjid4jCZ0iyFrkiZ0lyiCiyaLUidEHBpFCRWDCAy+FBCQNTRJGC8uVUUWiW0dTUk0
+X2pXz7B789l7eW1DinhJ3tB22c6b282k1Ma128qi4chv2s+X49anw7t1Rj8nnJNS0LRtz6+Bv6Fb
+0qs82Lp+38CH79iR6tFh8N5R9ONl7OBn7eCk6uW65dh539So2su82dGIeW5NV1JKzseo7OKC59mJ
+6d+85dys59u44dWagnpOUkQwzbJ92riMqZ+WRUVGNDw5SC4bWSQNdTUEjEUSQTcpLi00Ry9GYCRT
+iTF0pjuKoTCBlShwmCdsliZvliRqnSdnlyVhnixsmCdokyVgjiVjkSxtmDR5kC93jzN8kTqDkj2D
+hjJ1lT2Dii51hiFcjyZfZi1XLigub4R/TVhVNVRTb6+nSmBeKyoqXnBxVWBiLTUyfJWRO0lJHhMa
+PxcyYBlOaBxCayFSax5mbyBaciBOdCJQeyRfeh9kfiNigSZYgyZZiSlpiC1piCdnjCZwjyt8jjN0
+kzp3lShyjSZxUCw7FRROCQejCQi4DQ+ALjRBhZycfJKlJzY4KyoljYRk7MNt5sl6w7ONWlQ/uahq
+182A2s2b2Mqb3c6+4M+l3slz4dKV3NGhcGFRZFtBxraCzrFtyq53yK9ZxbJsxbaV59eh8OGw49Jw
+6NVY8+Bp7d515dyZ8OCx7d135tWn3c2y5sxvwbFgMy4zh4Bp6N5y8uKN6N+65Nu22dKn39OIv6xd
+OTYvnpJszLN52cioh3ZhUEw6e3NeYV1LSTMvaToTNDMtCwxnITJxNyxAWCdEkjN5pT+PnTOAnix8
+oDaFlSp0liNlliVglCRhlCRhkyVgkSNfkSNjkylulCx0iitzjDZ7jTZ6hzByhCxyijZ4jChnhCha
+PR8vKSUndISDSlhTNlRTdq+rRllZKSYoYHd4V2JkMTk2hJaVO0dIEDQPHS0YPA0sZh9GcyJnbhxl
+dSBUcyBUeiNlgCZufyVthSNnhyhcjS1gjylpii9iiCZhjydukSx1lTF0lDR8nS9+ay9KFx8/DASe
+CAaqKhJ7HjRHYaClhsXVhM7YVaWsMzo2q4xZ2cZ9qJtoXFpEfXlK5NR54c14282a182b2s7A1cyi
+6dGG5dKNrKWDMCIlqKKCy7yWyKpc2bl1xKhSyrFjyLeW2tqv7eq85Nh+6d5S9+Vt8eCB5+CY7t2k
+6uFy6til5tKl48Zp6dFhhHNwQjs308Zr9+aZ6uKs5trC3de13NR518hqWVNBWUxDsp9s08Gbyq5/
+SkIyYl1RzLmcpJl5Vks+JSopEBFPBRCdHi2mMzhQYiFGnDuEsEaZpDiKnTmKoDuJlytxliZglydh
+lCRelCRekiFekyJjkSRolChvkSpyiipwiSxykTh+kzp/kTRxjS1vPyAvGUMcKjApeImLR1lSN1RT
+dbSuPVhYJicpY3Z4VFteMDo2hZaVPEJLBVcBFHMPIB4eSRVCYBhkYBtaayJOcCFUdCNfdiNkdiNj
+eSJbeiVSfSdReiFRfCFcgCNmhSdugSNogiZleyNgbilbMSonBA9xDQG0DxiCJjApO4aHacfUeMLM
+b8fRWNXgSn16V0cwamRIPC4uV0c1wbNn59l31ct32c+c0siY3dC91s+i5tF75NqAZFxLV0VH1cem
+1LiM1rJM3bpxyq1l2rdM38J74+Ks4dmQ08WZtKpfz8Vp6d9+6+SZ8OaX7+V47t+f7tei3sle8tJu
+18eMQj01mZBX8OWT7t+439K3zsaq3dd/1MlsUFA/KyMmlXhUzbmOxbuFSkxBLDEsYlNIcmM/ODUw
+KygsGBoiDQmAByW/HT+bOy88dSlgqU6Ws0qdpz6SnjWElChwnihwmCJqkhxikR1fkCJfjiJdkidk
+jSNhjSZmiilphSlphC1sjTl7hDByTiFBFV4TGYsgIC4gc4iJSVlVNk9NZaGbOFpYIB4gPkxNMzI2
+Nzw6f5GRQT5HBl8KBrUKFWkQGhMZMhkxMx4tNxwvNx4wOh43Ox46Nxs1QCU2QSQ0RSY4RSI5RiQ5
+RCU8QiY9RSU5SylAVS4/Py0xEiQ0BgKdCw6LKiouKDE8QJSYccXPdcLTbsjWWsjNP2V0MDAvNi8t
+PmdyOUQ1hn013c6J1M6G286Z08eU1sWq39Of59V1qp9fSD4/wbWG5MiU1bVq2bJI1bd9yr2F0r5p
+7cyCmJZyYWAxdGxWcXBdWVRGdHBKp6Noq6Nnl41Vr6R04s+Z789X69R77uWek4ZZUU4408yH5929
+29G32dOp4NaTjYFLNkhJS21uRjQmo4xjpJJrKS9OMi5HJjFAKzE7Njo2IyMsJzI5JBpGABudDzrC
+J0Z+Py46VjFNUjBNVjBPUSpFSiQ5TCNASyM9Tic8SyU3TiI7TyE8UyU+USE6Sh46RyA/SCE+RR48
+RiM+MiMqFEwUELIXEJkUJTYic4aHSlJRJjIxSltcMTI1ISgqS399OVpbMzg2dYmFNzhHCGYIC7II
+DUwPLRclTiRDWzFRZTFaaTJaZi1XZSpWZytXai1YYiVQdDNibSpaaitcYydXXSBRcC1ghT5zfkRo
+QSw5CxFfBwe2Ix9gN0RBPUtbLlpgYLC6b9Tec7S4MlBTJSY3NzI4JHB3SsLLWYSHNjUin5Zm2NGQ
+6NCW29SZ6ta46tyn3sZ2WVA1iod58tqY5L5l5rQ+5bZT1bV82cBy1Lxad2pISkU+pZ5l5+Gz5ua/
+y8KDk4RqdHBpb25mYWJYPTUzkIVj781t79Z149CZ0sR2SEIxkodd39Ks4dar7OGMyreAKjMlWY+e
+XMjRPmN2S0MxYE8+DxZwJihiPGV5PVdeVmVzTk9UFEFNMTtCCA1ZCTOzF0e9NT5VRi03YzNUZDNa
+bTdhajFZcDtkYy1ZZzFdbTZkbj1jZDhdWTFTVDJMXjFRXitTWi5TXzBUbTVcQio2CUwKC6ERFZMV
+JTQian+ARk5NSVFOkqypUFlYJzAyTIOAPGBgLzMyboB6MT8/DFMND1INLxwrZCdVZiJXaSpbaylc
+XB9NWhtLaCZZcy9jayRddStodChndylpfzFrZRpTcCReciBajDN4eTNvNCspBQiFAwy4KiVOMlt3
+QnOsOk9ZQHmFZLi7Q1ZeHRJHHyBANWNwL7jDP8DKc7K1OkJLQDgus6GB5d+i4tGMyMGonJZ/Z187
+Qz40qJ9d2buK2b5l4LM93rNG3L9x5Ml9dm9Kblg+18Fn99+D8ei/9OrZ+O998eV05N3Iz9C85uXS
+oZmURzowwq1m5dBs1cJ87uCKjoNeSUE1vrV+79ub5NBwVlI2LWtzdrrOPLTEQ7KxRmRmLykzERaV
+IyJuM1d5J0tYV3+KeJKQFTJLHmd3ICA0CSKODD/MIjV5QSAyeCxmijV5iy95jjF7mTmElTWBjSx5
+kTCAkjSAjTR8didnZydZcyxifilsfCpsgy1xgyxwfjdwPSk2DFANFXMZKDInX3N1Qk1KSFJQk7Gt
+TltZLTQ3VoyKPmBhKy8vbH94OUk/DRoMNhwwZTBZXyRPVBxEUiBDYCNQTA8/UhRFZyVadTFnejNn
+cShdcydffjBqdSNfeytnciJfhzBsgy1uVRdSJiQtBgemChG0LDBOM2iOVI/Yb4qkNk9KKkVHEhhL
+FxFuNDI+P46OMMzVS7/BdcPGRGhsMiwrZFNDgYNsYVNTPElYRkA2ME5MPkFRX1EcnY1Sz79z17hZ
+1rZP3tCCoo9tT0c+2cWA7dpZ5td/5uK98PHI5th329Fv3de34tu/59y67eXEZFxVenJM286B4c90
+3dCAbGVMJiYqaGE+tLBxbmQ5KFVXOMLYZ6y4R7C8LbbCR5CXFiNDChGxLS1yGUdvJ1BuRGtsZbW5
+KThLM3qYMkZGDxleCzfEHDifPSc7aSdVjjt5ji93iCt0hSdsljh+ljh/jzB6izN4jjd6iTd0aShY
+aSxbdytjgS1qhS5wiDR3iDF6ijl7PCo1ES4VJyspXG5wRVFLRFFQiKaiTFlWKjI1WI+NPF9gKCsr
+cIR9Nz86KA8hYS9WWiZLVx5IVBxEUxtDXBtNVBZIaShbbChedS9ndi1lbSJbfC9reChncyFgfi5s
+gzZxgTFqax1VVCNJIBtEBweoDRGyKTRVM2WCYJLNaZzQN1deIh0rDwtfHSJWODc3N4eKNs7fU8fR
+f9XiSnt9PDQ0PDcsICo7IiibKDWxQElHQau3W5ydLC0mTUUpwadh38Rt4tBxxb6BQz42hXlU99yJ
+8c9j9d5m+Om09unG3dNs28996uGn9+q+6tu17N7Cn5iUTUkzzrqB8+N3uKtnMTY2TFlaOTg0TTw4
+OTovGZWjQcXaXbO9Q7u+MsDbNYGAGBFBEBK5ISdUIld8LFmBOVhRW6q4OENHVY6tZXeGFRlAFDO0
+Ij2wLic+XipLijZzjjB3hi5zhC5sgSxqjTd3jDV3ijd5izN3lT2AfS5rbShgcCdffyxofilrgDFy
+fC5ufyttdzpqNiAyHyAhYnN0RFBLQ09PiKWhTVpXLDY4X5eURmlpMzU1gZSPQ0ZIPR00XSZPVRxH
+VB9GShI9Vx1JVBhGXB9OaSlacjBibipeZx1UdSlifjJtei5rcyZidSlkcSdeZx5SezBlUzA/FRJU
+BAStDRbGLzpWKld9VpHGc6LPMEZWGRZXIxR7KThJOkdMLnBzU9HeXtTjYdnmU4aIPjs9Nzg2NCtC
+DhxuKShaTHR9UtLggdPaYGhtJS8qVkwww6lf4NJ0jYJZTDoy2b+H8thq8NRW8NRr8uSo59i2nZJN
+amBCaF5GgHZorKKMz8Ce2MqwU08+mopQ++p3hHU9Ml9masHKL0NLMCdaP0ZgKGRpNqapWa61Xaay
+TL3LOnBuEg1YDRG6KCtYO1dqM3iuSExNPVZZP0ZNbKrPdpqqHyI6DCedGzu/KTFXOB4rgzFykziA
+iTl8fC5qeyxogzJxhzR0izN5hy92hjF0iTZ4dipnbChdcCxeeTNqayZfeS9ngi1vgzFwZzJZJyko
+dYWCUFhXSVFQjKWhSFNRLjk7ZZyZQ2ZmNTg4ipyVR0hMNxYwWSZOWSNLRxI4WCBKXSNPURdDWiJL
+ZStWeDxpaStbYhdRcydigDVvcyhgXh1OWRVIbCFZeiVkdCtjPioyCRBcBAm/DBPSJzVjJ0ZxVZjK
+dZaxIiE/DguWKSZvJT1MQmR3KU1Sb8XOWtbfVtrrTXt5P0ZNLjJDLDVNNTE7JzkuUKSpYs/ZZtfg
+j6y0UE5XLTA2Z1s6vaJ4YVlGp5RZ0raIknxBcmMseWdIfm5gWE5ON0M7SXx/KTM6ISA0NzhEVVFI
+oIRrbmVYZV0y18lxX089QoiRY/LwX3F3GB5BFiqQOjtQSmZjfp2nWa61Ra+7RmdpFhBoBg69IR5w
+NkY8MHa4PF1yJSccPGd5drflZpa1Hh41ByqUETbFKjNrMB8mcixmjTl9izh5eDRsbydheitohzNy
+ijZ3hDN1eSpqfzFvfTRtbS1ebDRegEVyhkp2aCxWejFlhTJvbzReJignfo6LUFhXT1dWiqOfS1ZU
+Ljg6aaGeQ2VmNDY2k6OaSkhMPRk5XCtTRhQ5Uh1EXiZQUhhEUhdEVBhHcDFhbStdZyNYbiJedSlk
+dSpjayJYYh5SbCZbaBxUeihlgjlyPS0xBxJlCxLFDBXPJzOJKj5SVI66U2d3FhtaERSuLShVI0FK
+VImuQUNMap+kTdrdad/pTnh5OFp4OkZaEhRYSzZ0JkU6NbS/WOHkWdHfodLXVXNyLSRJNTRiU05O
+SkU5cXFUR1NeJjqFGzaeKk2gOTpcJy43dbu7afbxYIWDHBdYHx6MKS+DMTpbUEtHT0E3WFs2JTw8
+ZLvEa+zofLO1NDAuGBlhJiiLOD5JVIuUM73FN73GRFtcFhBrCw68GReOJSozGFKCN32sOz8/On2i
+ZrDcM3aWHCFADTCpDTDDLjRjQCQyfDVvgDRvjD9zezdtdC5mcipkezFthTh1fzNweTBrcCpifjNt
+eTJpazVhajFcdTZkbCxcbipdfjFsazBcJygogpKPU1pZSlNRfZeTSlVTMDo8bKWkTHB0NTc3laSc
+TFJQNRQuQA41VCFJZitaTRdCThdATBI9XSBQczFkdjBlfDNrdixjdCpibyZgeS9sgzh2bidfUgo/
+iDlvgzpsQCwwDBNlFRrGEB3NIDC0LjtBP2qMMTlLEyKODxe5NDBXITxBV6vRTVxzSmhlT9rhd9ne
+RldhLHOqNE9iDwVZGDu2NDZGNnl/bdnTWdLlkN/pUKiVLytGDgyJOkh/Ukg8MjZqFzPFCT7iASvq
+HUnZKztQP5+YoP/9Qentgc7PU0pMCRZaDAqpHD3INkqOQD1FMCYxJGxrXtvfatngaNDTRFRWISMk
+DQmDMDJpNVpQM7jDP6+1Njk9DRBoCw21Dw6mJC5aGzdRW5LAQEZKMnqnWbHdLGBsEyJYDjnDEDC4
+Ly9OUShGkDl7gTBrdTRjhjpzgzpyfzhxfzNwdzFpeTJrgjZzeTFqby1jdjJodTBkazFbbTdfcjBj
+cSxldi1oZC1WLSoug5OPV2BdQ0tKcYuFSlVSMTo7bKWmSG1yMTMzi5uVQUtHKAkhWiROaTVdWB1L
+SxdCTBU/WBxIaCxbZydZayVZbCRbZCBUcixihjp2iTp6gjhxWBNIZh5SlUJ/k0OBXDxJDhBPCxG3
+DxnODSXSOkBqL0BCJS89FSysECHHMjpiJj9KWK3ZRIyuM0VKRMPJer28OUJOPpPMOF1wEQpUDjbD
+ITBwIV9gX+DkaOjxauvzSMfDPEY8DxFwGR66TUppHhxHDCzBBkLZCi7RGzWMMEdIKsfBkv79Qevu
+g+zybI6BHiM0DASLDjzNDyDAJTGGSkFJG1lOX8rQi9zkZNzfTG1oNC0nDQxGFRGMM0NIOYSANWpt
+LiwuDg9lCQaoCQitGh+KJzdBbI6iOk9RL3mpSqfDLjc6EC2DCz3FFTOnNC9CYC9RjTJ2izh3ci5n
+gzRvfzVsfzRthTZ1dC9nejRsgTRxgDRxbjBiazFedjFlaixaYilUayxcbClgdy9pYixVKicsfIyI
+TFdSP0pIb4mDQ09LLTY4baamSG1yLi8wg5SQPkpJOxs3cjhmXitQUx9FUBxHWx9PaipbXyJSYCBS
+citgejJoZCJVdzJnfzNvjDp6bidZXBlJhDxylUGCm0SKc0BcHxc7BAyaDxXZAxLoLzCYPTgjJS49
+EiyrDSLMLTZcLT9CZK/XObbiPVZnQoWIYn99Nk9cP6LfPWB0FBFXGTDGHB2VJk5PS9LgbuboWurt
+U6CwQ0M2IStKBBC5LC62MzY+CzCBD0PfDh7PJidcN0Y7KLrCpfn3UevsavL4YsbEPkQ6Gg5bEEy/
+FyaxCTTHLFCXO0ZJaampgtPbWdDWPGRjQEVHHikvBgSBKyyBO0I5NDs/Pk5cGxVZCQSYBQizCwup
+KTdYW2hsLUNPMH+mSIGNHxoxED+zCjnDGzWCQic7dS1dhi9zfzRwhzZ1ijx4kEN7hTdwgzV0fjZx
+fzpwfzlxhTl2fjVtbTFeajBcZylZaChaZipZYyVVbitfXClRJiYqdYiDRlNOOkhGcoyJQkxLMTo7
+campTHB0MDEyfpGOOkdIRSRBai1dVCFFSxo9XypWaSpeaCVbXSFRcDBhdzFmdCxjezNoejFnhDp1
+eC5sXBRLdjBliUB2gC5qeCFdcjBYOilEAwyBCxvgDhndHCeMNT0gJCYvCxijDxLgPDNzMDo4aKzK
+R7zrX5SqSE1RKzw+NWh6PbD1PVltDhJbDCvHIBmlKEhHV8fIfOLwWN/iOlZfRmFrMTxUEiK2EhjN
+Qjx8GzhSDEDDCBnBLipQMj4vLai7pd/kS+3vUfb6dOHiQWFZLisuJ0uZHS61CELKDDW5NTprVnJw
+bNTZQd3hRFRVTWN9L0lSEglWDR2uPj9WL0NFL1x/ISJGBQOODAy+EQynICWDOEFEJjpIK3+WRERS
+DCpjC0rEDjHEIzViXipLkTV4gSxyezZrjDhylEeDkkJ7jz14ijx9gzl1ezhsfDpvfTNwhzJzeTJo
+YzFZYS1VYSZUZStZYyhTZiZYWCdQJCUpbYJ+SFZROEZFeZORRlFRLjo8dKmoRGxsKisrbomGPkdI
+QR48WyNTTxdCXyRSay9fYydXZypacjRkeDdoeDNncixiejNqdy9nfTduYxxUaBtVhjlzey5oaRtV
+biFZdidjVDlFCxxhChnXFRPRHitWMD1XLS9JCAqcEhngJymUIywvWZO0WL7zV7jbVlpYJy47QI28
+SrPuN1NpBAxdBSnDFBOxOT5HTru6dO79UqemJTBBRYmwPEBbGC+rBhjZJSu3O0NICSGKDhazNjdQ
+LjYvJoGFeebqOPX5Mff2c+fsMWRiPTgyIDZiBxihFUPUDULIHiiXR1FXSbq2S9PSMUVDZYOsT2aD
+GxQ3CAmxKTSJKEA4JViGNz1KCAtzChO9Cw2nFA+oLjI4JzUwI1FxJCZCBkC5CEPFGDW1NTRHfi1l
+njqIjzN4gzRuezhsijx6lzx/izh6jj6ClEKCfjVteThteTVvfC9uejBpaCtcYSpWXSVRYiVVYyZV
+YyNVUSBFIR8mY3d4RFFSO0dGgpuZRlBRKzc5d6ypRm9uHR4fVHNwNkNDNRUySxhIYStXdjhpYydX
+ZSlZaC1cay1ccC9haSVZaCFYdzBodzBobihfYhxTeS1ngDRvaRxXciZgcSZneSZphERiKShLABGj
+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
+Dy3iJyxdKFFiNKnjNm2BM2+iOYaxLjBCFC6eB0TBCFjMCGDYBGLVG2CyITBXC0y8JVG1Ly9JExJl
+CzC/DD67CSq7GyyBLShGDhmIECa6BhWrJTKOOy8yXi1FfCxuhzZ+UzlNPys3ai1rZCtrZStqbTBw
+cTNyai5pXShhXCpjZzFrYy5oWytkXjBoYjBpXCdfVyNZVyVYWCZXUiNRUCROSR5ISh9JUCJOOx47
+EDQSDYoUFJElGCkYXnN3M0VGTFFRlqyqRVFQITEzUo2MTXJ0LjU3eX2BOkE9CkcLEzMRTxVBbRlT
+ZxhIaR1Peh9jdhxdeh9egCRfgiZhgCJjiClojCxqiydokChrlSh3lSWAlSV+lipykyZmoS9voy1t
+qjBznS50pyh5lTlsUDVDhThitT56pz54tkicsUF+aklVDyl/DFXfDkzhCTziBiffITjAJC9TFDHC
+FizUIS5WGyReAgW+MT2XJy8zESOkDQ3LChjPHSO6OTg6D0yhEGDVD1DSAyzaNDiPLDU5OpfDNm2C
+OmubQFZaHRVkBy2wDTK/DVvDBV7OFl7MIEt8HTdsCkjPCkfSNFB0Jyk7DiqdDUC1GCS3MCthJCU/
+DBSVEyq0ChmkKzNtQh87ZilDbShmhiV/WixVQh5DdBpsciFsbiBrdCdwfS14fi16bCJuZh5pdCl2
+dC54aCZvaihxbShyaCRrYR9kYSBiYyJkYB9eXh1aXBtYWhlVXhtdYCFbRiBBESsaFlsTFiQWS2Jq
+M0hJRklJlqinR1BRIzM1X5uZT3V3LjY3eXyDPz9EDRgLPBsxdCFbbRhQZx5SaihTdSNVfCZaeyNa
+giVhgSNhiSpvjCxzjityjChulCt2lip8nC+FnzWCozd3pjZ1pzN2rzZ8rTN/rDqPtC2Mmzt4VDZK
+kkBvs0F7p0B6wEefrzqDgEhaDy1yEkjeDz/YCj3YCCvjKzmWJyJmGzrRGzBzJDRWDCvFBwi9HSLK
+NUpHDxhrBwXPChbZLTOEKkNaEFLNE1jTD1HUAC3ZIzi6OUdDVoSfVXKHKURdIixDDQ6ZByeyEia3
+Clu7CFHRHDWdIjJTFDiQCUTNCkfILlulNkJFFCR3BiSxFiCcNDhAIR5BBguMCy+8DiebKCtHVCFL
+cSdMZCheiyR4WihOPyNCeR9xbh5oax5oZh1mbSRtciZtbilvYh9laSJpdS12aydvaCZuayVtaCNq
+YyFlXx5hXh1eYyRgYSRdWx5XVhhRUBZPVxlWaCVgOh83DCENHighS2RuMEhKSkpJkJ+fSlJSJC0u
+X4GARV5fNzs5l5ifUU1NMBYpaCVgdSFVbiNQcidafCxgfCdahC9jjzBwiytrii1nmzR5mzV1mzN2
+oTWFqjaQrDiJrDyBr0eCtkqKuEWQtz2QvUGLvUiMxkeYxT6crEmKUzdOkEZxuFGBqEF4u0eWrjqG
+kkNsHDFWDULPCy/bCTvRHDTbNj9qKyZkLTZ6Iio5Dz+2DyTYCh21DhbKLD6XLSdLBgOrERjLNDNV
+HD+bEUrWDmDQCznRBy7QEUrXN1h9SlxgXWlzPUA6FRRuCxKuCSWwDxawCVu4CUHFKCBkMDdWET27
+EETEFEnJE1a+Old4HiBOAA2lJyt+NjgrKSwzCgt5CzK+FzycNCc8cyZpgiluaClmgSNnWixGPyU7
+bhxoahpkax5nZBpjZhxlZhlgbyVsbidvZB1mdS1zcClvbCdtbilvbCluZyVqbixvZiRlYiFgaShn
+aShmXBxYVRlQVhtTWxdZUhtUMhk3Hx0fTGtyKERKPjo9cXZ5Pj9CGxgaOEdIJC4wRDw8s66sXFZT
+RRpAeClmfCxUditUeS5ZfS5ahjJjjjRzlzV7kzRzjjNsnDZ6pT+Ap0CFr0SVtkOTuEKLvUiKwlCU
+wEqcx1GgxFCUzlWYyVaXz1GXykeet0+QVTVOlFB2tVd/o0Fxt0uTrTuHoUd/MTlOCDq2CijlBTLk
+HzSWRT5FQDxQIzQ+GRaQCDXSCx+5CyDKBhq9GS/BPzppEQ5yGhqNIjFPFS3KEUvZEGnPEkPOCy/W
+D1XVI2G8NDhPQkU9LTVCDgqUChmlBSS0DhGnEU/DFD+tIy5CID1/DD3OCULECkXEC1C/JF+nIic3
+DQiHKi9ROzIsQjM0FBdZCyu7H0agPCNHfSh1hSh8cixrchxXVipBPyQ8aBllaRtjaR5lYhphYRle
+ZRteaB9kdCxyayNrcChwdC10cCxzcS51cC51bi1zcDB0cjJ1aihqZSNmbCprYyJhWhpUWhhSXRha
+WBdYSR9HHRkcR2txL0dPICEkMDw9IicpLjU1iqalY3h5QUJAurWyYF9cTRtDgy9mejJUgTJdgDJf
+hTRijTVokzZzmDh4mj59mkGBoz2Cpj6FsEeTtEmYu06TvkuOyE6Vyk+ezE+k0VWhzliXzVWWy1id
+zFScxE6brlCJVzdPnFmAr013rEZ3sD+KrjuIq0GJRkFJDjigEy7bGC+tKjRIYz9JW0xRHxptCguw
+DCfLDx6/CyW+BhfEByrCMSyUMTJVLSdXFSiDCCLWD1DZD1zREVPODkbWEVDWEU7ULS9vOzUxHSNa
+EAykDRugBhuzBAWbDzu/KEl2Hio5DkGhDjrOEUjGCUbAClLBDla+JzpQLBxSMTA2OS45UTA/JyRE
+CCWTIUSJTihGcSZsbydgcS5odR5kWS1KOiE8aBtmaRthZhxgYxtgYRxfYBpdaSNnbyRrdChxbyZu
+cyx0dDB3dzR7cjF3dTR6eTh8cTFydzV4bChtaidqaCZnYyFfYyFbWhtYXhxaThtFIhwgTHR5Qk5Y
+Mj4+aYuIQE1NMjg5la+wZHh5QD8+vri6Wl9aSx45hjNofzVihzZmgDFghjFijzRokzhsmDt1mj1+
+pEaKp0KHqD+KsEWVsUWVsUeNw1WXxlGWyU+ez1OezFKW0lugz1afzVmoxFKdvFqfrGKTUDJHjDpo
+rkJzqj54sj6OsD6NsDyGVUBKFDCJEjCPMy9FUkJHZzROeU5mHh9bAASMDSLADx7HDCO/DCDDCyfT
+GRSwNjpPMTBDEhixBzLSCEfSDELQD1nTE13SEU3VG0fPLTliRUQ4GxlfCAeYDhmhCBOtCgOsDR+U
+OTwwKSBMHEKqFjvGGk3GEErDCFG+DFXGHkB7NjAnSzJHSCxFbS5RWTNUDh9WGS1YWypOei5/YSpV
+cyxwfCF3VChLOB04biJqbSBjZhxeaiBiZR5fXhpbYhxgZR1icCdtcitycStzdjJ4dzR6eTZ9eTh+
+fj2CdTR3cjB0cC1zaidraCZoaylpaSpmYiliYSJfUBtIJB0jXYKIT1ZgLkBAZJKQPk1OOD0+kaur
+Y3Z3PTw7vLWxYWBdSh07hC5mhDNmgzFggTJdhTJhkDZskTVwlj18ljp7nDx7pkKBrESMr0OQtkiU
+tUWOwlKTyFaayVGhzlKazlady1epyVSmwU6kuU+VrE2OmUZ8WTpTizpnq0hzokV5pkWKrD6Trj97
+WUFMFCdIKSc+eUBhck1nWClIlUJ1QjRJCQhlBxq8Chy7Bhe9CyLCECfaCw2oNTJRKS8vEReGDDfS
+CzvWEDbUDlTQD0bVFVDGJz1bLC5lPEWFJytKBgWJESaqDRetCwinHCdNTUA7ND5KDy10DC68FUfI
+EErHDVG7BEjGGkCaODIwajJiTzFJfS9ifTtmOTREIS0tSShJfyx4ZSxadyhtgSV6Vy1QOxk2bx9l
+biJkcydpaBxebCJjZR9gYBtcYyFiZyZnbyxxcC1ydjN4dzR5eTh9eDd7ejl9eDd8cC50aCZsZiZp
+YCBhYyRjZCZiZSZiYyJhTBxJIxwkZoCGS1ddMENEa5SYQ01QMTY4lK+uZHd4QD8+tq6tXFtaSx48
+ijRqfjFdfjBbfjBghTJojDNrkTtvlUR8oVCJok2Doz53rEKDsUSItUeItkiJvU+OyViZylSey1Ci
+0lmoylaiu0uXuEyesESKpT2DkztyUTJIiTxkqEdqokRxqEeCojyGoTt3Sjg6UThHlkN+pDp/e0Nr
+SSg8ljdyfUZnICE5EiCgFCXFChC3BB66CinTHSWFRjhDP0I3EyBWEkPCCzLYCjfQDEzbFzy8ITJM
+JB1iESbAFS3HNTReFhZZChqhDRWsJSNhPzo5QyxDYzlSJixGBhqbDEDKBkfBB0y+BD/EIDV1XTBK
+g0NyQC40eypljTBxcTNWNisvLSMvbiNnbytndyVrfSFwVCpOOxw5aB1gYxpcaiFibCNkZR1fYx1e
+YRxdYB9fZiVmaidsbytwczB1ejd7fDuAdzZ7cC90bi1yaypvZydqZiZncTNybzBtYiJeZydjYyFf
+Th1LIBkhdI6UTlxhMkRFc5ygQ05QMjg4lK2tYnV2QUE/r6ipX11fTiA+hzJlfjJdfTBhfzFpgzFo
+hjNlkUJ1lkV+mUJ8oEJ6oT54rUaGrEOEtkyIuEqKu0uOxFCZylKgx02kwUySxFSLukuTq0SZrD+F
+pTR+ji9oUzNIijxoqURqoDxpojpzqkJ+mj5rQjVBkEF9tkeUpDqIhEp3SS47kzV0qFmCRT9JEh9y
+ByK+Cgq4BSG9ETO9NDJTYjtQVUhOJCxBE1CaCTXXCS7ZFEnFIyxOJxZwDBDMCzzPDiLKKzWZLzdH
+CQ5qEh18US9GhEN3QCc9fRpjTjNOEhxrCjm5CUrBB0DEE0CvNzRFhjBkhz11QC45dilgjS1yhilq
+YTNULSQraSBkcydvcSBjfB5pUidOOhw6YhxcYhtcYxxebyhpYhpdXRZYYh1eXx5fYyJiaydsbCht
+bitwdjN3fDuAejl9cC5zbCtwaChrZSVlbS9tbDBscDFtYyFdZSJfZyJhUR9MIRkicYuRTFheMEND
+bZaaRE9RLzQ2j6urXnJ0Pz09sqmqWlhZTyFAhC9kfzNlgDJqfS9mfi5jiDRqijhvkjx4nkB/qEaF
+okB/qkaHrEaHskqItEmOu0iVwEmZwlGavlGNvUuOuUeQsVGOpkqJnjF6nyR3jTFoVDNJij5tpUZv
+pUh6o0N+p0B8kz5lRjo+oUGGsEaTpkWNjluETDBDizVtqUeDd0pjGCNTCR28DA20Ch3HFTaBSS07
+jkJtXDdLUzdKGj9YDDC5CifiGi5cJzNZFBjKBhXFEkfAESTIGSjCQEhrKylDMzJGgC12kEGEQSw7
+exJZcTBdJiZOCDWhD0nCDDTCGziGSyk2lCd2hDh4RCxAcitbhSpffSNUcTVdNiMzbyJobB5nbR1b
+eRxeTB9JNhszZiBhaCBhYRtbZCJgXxxaYB1bYB1cXh5dYCFiZyVobCptbitwbyxxdzZ6cTF0bi9y
+aipuZiZoYyNjYiNhXR5aYiNfZCJfYR5bZyJhTx1KIRkia4WLSVZbL0FCaJCVQE1QLzg6h6mqV3J0
+PT09sqqpWFdWSx09hi9ofzJpfjFofi9igjFnhDFrijZwlDt2mzx7nDt7pD1+qD+ArUKDskaIs0qN
+tkiRt0ePtE6HtEyCtkaNqT+Do0yCmzt8nCp9pSGEiC9uUy1LiTZpqD9wpT17pT9/p0N+jjppRjI9
+mDd8r0eQnUCFZ0dgQTYycDBWqUGJm0l1LzRKABSdBQu6BhKzIjVLcjBNnUR1UCpGhTJrSEI/DiaC
+ESiWLiFNGjW/ECDNBBm8DUfLDCDEECHPNTeMNDkxXC5QoimVkUKKRjE/cRJbhB1mQjFBDjJ8DkXG
+GTSeJi9DaCRQnC6AiEF+PS06aitbgCJbfyFUbjFaNR8ycCBqax9iax1VcxZSTyFNNh4ucittbSRm
+XxlYVRVRVxlSYSFbXh5bWRtZWhxcYyRkaClqZydrailtbS1wbjFyaSttZylrYiJkXh1dYiFgXx5b
+YyJfZiRhXx1aYBtaTBpIJBwkbYiNTFlfLj9AYoqPP05SLjk8jK+wVXJzPT8/saqoWlhXSx09iDBq
+gDRnfjJmgDFngC9kgTFliDdvjzhzlzd2nzt7ojp6pj1+qz+BtEaIsEeErEWCsEqEs06Brkd/sEWN
+ojyBpEGBlSp2liZ+nR6FiC90WjJUiTVpozlvozx8nDh2nzpykDlrRTJAlzp8q0mWhD9sOC5WMzlm
+TzBCkThvp0WHUj5LBxd0Aw23DxaZPTM4kjRjoUh0UzJNly16ekZQMDVPKDVOHx92FC/QCRjBCRzB
+CkTHCh3BCBfLJi2RNzM7fS50qCeblkaORC89dRpejCByWDVMFzNaEUu/HTFnQycohSdzmjOFbzZs
+KyUsVydPdCVWfSRXbzRbNCEyaBplayBhaB1ScBVRTSFMMBoqYx1fbSNlYRtaVBVQVhhSWRpVXB9b
+VBlWWB5dXyJiYCNkYiVoZSdrZyhrZylraCprZihqZSZoXyBgXB5cWx1ZVxlVYCBcZiZjZCJhTx5L
+HxggdI6UUF1iLD4/YoqQQE9TNDo9ka+wVm5wQD09s6qoXFtaTB4+hzBpfjNkgTZnhTVsfi5hhjVm
+iDJrjjVwlDh3lTd3oDx9oj19qECBqkCBrkODrEeBqkp+qEN2pj98qkSMlzR4mC54lyd1jSJwmCSA
+gi5sWTNMhDFeoTxwn0eArFqOp0B3kDVqRTNDlTp6pUaKckFeERdsEBPENjtuXy9DiS1pcUdbFiFL
+Bw2tHCZ0WzBCnTdzpUd8WTZNhCtjrDF0YUJMMDw6DBilEynGCRu8CiLBE0fDDSPACxLGIjBmWjBN
+lDmKpTmeklCMPDA2cBtdiCNxeDRgJjBUDzh2NSc5biNQlC18lTmRUTFPICogQiQ6YiNHdiJSaDBR
+NyY3ZRtmYxxbYBhLcBdTUCZRKxcnWBRVaB9gYRxbVhZSVBdRVRhTVBlVUxpXVRxbXyRjWx9gXCBi
+XSBkZylsZSZoYiVmYCJkXiFiZihoXiFgVRlVWRxYYiRgXR9bXx5cUCBNHhcgeJKYVmJoKTs8Zo6T
+QlFVMTk6jq+vVW9vREJCsqyoWltWSh47gzBlfjJkgDFjfTFcfjFdgDBfhzNmizNukTV1ljl4nTp6
+okB6pkJ5qkR/r0mLqUV/pT93pTp9njCCmCx1kyhojCJujiV9lCZwkSZwhCplUzBIgC9doj91ljxy
+oUd8oDx0kjhyPyk/kzd4sFCIVzpOBgx5BADbFRq8Pj9YTiIydDdeRUBNCgqDIi1NYylXqEB5p1CG
+UzpMfCFKsyZ0iS9jMDY8Cg6VCDLHCh2+EiXFFz++DS/JFxmsNC1GgTZ1pj2dnDWTdEJuNDAlVxhU
+iChygiptQTZOJCwwYCdKhSRlkjZ+gjiFKSYxHClqKSw8QR4sch9TajFONSM3bSVsYiBVWBhHahRN
+SyBJKhgpUA5NWRhUYyNdWRlTVhVQWxhTWhlWXyBfWRxbXSBeVhpXVx1aVR1bXSJhYydnXyRkXyRj
+VhxZWiJdWB9bVBxXURlUXyRgXyVgVxtYSh1LIRkjd5GYTFhgMkVHX5WYQlNWMTo6ja+tV3FxPz89
+squpWVhXTCA+hzNrfDBgfzFefS9dfzBigDBjhTJmijNvkTd1kzl1lTlwmj5woUJzpUR6lTpzmj53
+mTd5mTCDlil3jiBhkCJhih1oiR96jh9yiRxrgCVfTy1CgC9cnzpznD11kjNnmzdvkTdxQStBljl9
+oT+GYEhRCQ5+BQPgBQLbMCyoOjQwcSZVZ0hXICdXMzE4dDNnqEOEpkqJWDpSdyBLqSRsrCZ0Zz5P
+FRRiCTa8Bx/ABiO8Cjq+CTDJKy6EVS1LkyiQpzqddzBvOzNDLTY4ShlCfypogCptQDM6RCw+hCxu
+hSNekTqLXDZVFBpeFhvAHh+BLh8qaiNJZSpMMiIwZyFhXBtMVBdDZRVIRx9GKBcmUhBQURNNWBpU
+WxxXVRVQXRxXXBtXYSBeXh1eWhxbWx5bVhtYVR1aWR9eXiJiYiZlVxxcWSBdVR1YUxxXVyBbVR1Y
+VBpVWyFdWh1cSR1KIRokcYqRSVVdMkZHYpicP09SMDk6jq+uXHZ2QEA+ta6sWVdYTB5AhjJsfjJj
+gjNlgTFngjJogTJlgjBohzJujjh0ijRskz1ul0Fum0JymDtykjd5kjV7kC97jSh6hB5iiB9bih5i
+iR1vhiB4kCFughVlgidgVDVCfi9anjZ0njlzmjVooDx0kzl0QixDkzZ6oDqGcU5eEBNqAwLMAwbc
+KCe4OD40diVbhERnTUlNNjIteDNsqEKBoEB5Xz1TbR5Jsid1qiB1nDRlPCpCByCCCRrBCiu4Bzi8
+DDa8PD1fbSVenieQhSp/PCs8EReCGiOMPjEwXyRPhy51UDxGXCdOkyp3hCNahDaBOis2Dh2NFSXB
+GR6ULCI/ZiRDXiREMiEvYBtXXRtOThVAXxZDQR1BKBYmUQ5PUhZQUhZQVhtUVxxVWBtUXBxZYB1c
+Yx9gWh1bXyJgVhtZVh1aWyBfWB1cYCVlWh9fVx1bVx9aUxxXVBxXVx5ZVhxXWB5ZZipnVylXIhol
+Z4KJQk5WM0ZIYJaZPk5RMzo7kra0XXh4Q0NCurO0Xl1eSRxAiDJxgTRogjNogTFpfy9jgDFigTFp
+hDFsiTVtiDRqkj10lz9ylztykTJ1kzCDkjCBji54hiVogyBehiFighxliSF4hSJviB5jiBhpfiRi
+Ty8+fjBanTN0mDNumTNlnDZvjjZwQy1CjzRyrEKLg092IyRSBAOpAAPcKSmwQzg9ei5giTxrdE5n
+My80fjFtpzp3mzxqYj9MWhxBrCN4pyt2oydrazZJEhpWDw60EDe9Bja2DzWtOjhVdSNmnSeSbi1c
+Fho+AwSzDAzDLjFBSyk4hi91VTxSXiRSkCxxgSVYfzJzLiMyDhqRGR3CGyJ7LSQxYh1HYSZMMB4v
+WRpRYR9WUBVCVxQ7QR4/KBMjVRRUUhZPVRlTURVOVRlSURVOXB1ZXh1aYh5eXh1bXR5cWR5cVBtZ
+Vh5cXiNiWh9fXiNiWiFeVR1YUhtWVBxWVRtWYCJeWh5bWBlaTSFOIRkjVWpzNT9FNklMYpmdQVNW
+Njk9jLOzYXx+KCcoVFBPKS8nNRovdixjhDVsgjBkfjBdgTBkgi9qfy9mgS9ohTFsjDZzkDZ3kjVu
+kTJtkTR6mDeIii93ijNvgSVegh9ehiRqgiBuhR1yhB1lhx90jhdyeiJsTS1Aey9ZnDZ4ljNwnjts
+nDRsjDlyRi9CkDdzojiCnEeGWT5YCAtoAQHLJSiUTDJBiTZqhDdnmUuASjhKjzNwpjp9mTp2UjxH
+OjQ8aiJEiSFkqiNxjjFaOC0/DBSAEU3BCDS6DTCkNCtOfiRpmy2JcjZjDBo7AgGsCQnIIytRRCk2
+fzBuUDNKVSBGhCVneCJOfixoMSo1DBSBFxawHyJWOyIxah9OVx9CLx4oSxpEXR9RVBNCVRU7QRw+
+KxIkSxJKURNNVhhSVRhSVBdQURVNVBdRWRtXXB1aZSFeXRtYXyFgVx1dUxpYXyJjYiJlVxtbWSNf
+WB9dVRxYVB1WVh1WWyJYYillailtRiVIGRQbIS04GSQmPU5SXJWaN09RNzo+ibGxU29xPz4/ubO3
+VllYDA0LQhk6ey5phjJngC5cgzFqfi9vfTFkfS1mhTFwiDF0jjBqhyxiiDJpgy1qizB2hSxsfyVe
+fSBbfh5igR5pfxlrgx5viCNyhBt6jRxudiNmTC5AeC5ZnTZ9lDNznTxsnDNpjDlxQio/kDd3mjN2
+pTZ/mEuBMSpGBw59KyxNaDBVkj1zfzlomEZ8TTZJjjNupDyEjDp2LCs/HyR+PkZaUyM9oCFpnSFc
+ajNPFihODEaaDzi9GDKWRDFNfyVujCV8fzx1JS44BgWQBgXBISpHSCk3fi9vUjVLUh5BfyNbcxxE
+fiVgRS5EERNnGBmGJSQoTBw9ciRSVyBAMCAnSxlCWBpMVhNHVhVAQh1BLhUmShFIURVPTxFLVRhS
+URROURVMUhROVRdTVhhVYiJeYiJgXR9eYiVlVxxcXR5gayluXh9iWR9eWSBgWSBeVh9aVx1ZWx5c
+bytvZC5lGhQcISMiXW97M0JIOEhNW5OZM0xONjk9ha2sVG9xR0ZG0crPYGJeF0EYGSsbSBw8dzNh
+fypqgC5seS5kdSteeSxgfC1jfixkgidgfCdgfyhkfiJgcRxXeSBYgiRcex5aex9hgiFogBtmgyNs
+hCRvhR52jiJnfjBrRio8dixZnjaFlTR5kTJhnDNmizhvQypBjzV3nzh6njB/qFGRclNsMSw9VjFC
+nTt+ljx6djllm0V8VDhNii9soj6DgD9aIyVOCAKzIyu6OjNFcRhKoCBcmCtoQDFCEThvETSrKDeR
+SStEhyt6kSaCiieASThFDxNcFRmKOik+ZiVSfy5vTC9ETRk5fSFWchRDgCBeUi5MGBw9ISBHPR0v
+YR1JbCFUWidILxwoShREXRpXWxNRWRRGQRpBLRQlURdOVRdSURJNUhRQURRPUxVPVRdSWRpXXBxb
+WRpYZSVjYSJjZSVnaClsaiZueDF7bSpxYCNnWB1iWyFiVx5cXCJjYCNnYSphGyQfEVMaISskf5qn
+QVVfN0ZLWpGXM0tNNDg6eqSiUG9uQ0NDwry7Wl9VGWsZMYQvIiYbRx9AZSFcYiJWZSRSYh1LZB9M
+YR1HYB1GYhxQYyBQYxtKYxZGYBNDYhRGaRlMZRdLZhpLahlWcRtcbhpXch9fcRpaeRpZYSJNRC03
+aydQhSp0hC1vfylWgS9Wei1eQig5eTRnhitmgixqiT54e1FzTTQ8hjVulTV6ey5iYzRRgj9rVjdI
+dihfiDZnc0BIJB1SCQetBgbTKytuViA1gRxMjx5eai9RIC88CiiGHzR/SChDey5zeSNwgSZ4WDFR
+JSk3KCk8RiQ4ZxtXaihaPCg3RBYycx9QZhE+axpQXStQHhwjKB0hTB86XBxDWRxISyQ8JhYjRxE9
+WRxYThRKURJGPBo5KBEmSBJFShVISBJHRxJFSBRESRNFSRZKRxNJVx1UWyNaUBhRVB1YVR5cXiZj
+aC1way9tbTBtYCdnTh1WTB1TSRxRRhxQTiFUIh4eFIchFZMqGCUbjqm2TWBqNkZKVY6TL0hKMjg5
+cJqXUW5uPD49tbWyW11bD2oRJq4qKGIpFxMTKxQkKhcjKxUlKhcmKRUiKhgjKRciJxUnKhkkKxkj
+LBclLxcnMBgoMxwsNR4tNiIuNh42OyI4QCY2PiQ9Oyg3RCU1QSc6MjA1OCs0Rik9PyY5PyEwPCk0
+SDBDLjYsTitDQSg3Pig0RiM8PS44NDYzSSpBPCo0QCQ7Oic1STBEKzYsPyc6RSQ5QS0vHSY+BAqN
+AwLLICiHQzI0RSQyPiE0RSw2MDcrEiRWGidwLy4xPiU7RCdAQSw8OSczJiQnJyslLyInNhswPCYy
+KCwrKh4gNR4mLRwmLxcsNRgpHB8aHB8ZKhkeMBciJxQfJBghFR4fLRclLRwtKR0iLBUmGxoaGhsd
+LhIrJBUiJhYmJxgnKRolKRokIxgjIxgkKBcoLh0sKxwqKh0qKh8qLyErNSE0Lh4rLB0sMB0yLRsq
+KxkqJRUoJBonFBEUDUQSFrgmGJ8lGCcbkqy5TV5oMkJFU4uQMEdJLjk4bJWSVG1uNDc2k5qWRk1I
+EGcQFpcbEDsWORozXyRFYSJBZh5HYx5LYB5CXRw/XxxEYhxAYRw+ZSBGaCBQbiFfcCVbciVVeypf
+gzRuhDR2gzNugC5nhjJ1jDqFijWOgEmARC0+bTVVhTtbfzxbgDhbhjlngUBuQjE/by9ojDeEei9y
+cC5oXT1ZVC9JdS1cYipEgypmfCxjdjRiRjNAaTRadTFegTxtTzVODBFfCQy9Ki2DVTE+djNbcjFb
+dDRgeDZjRjBIFiRHMCMqZC5OdzhaaDNLUzVBJCQkTSlGaydYYypWXyxQQChAQCI2Vi5GYDFMYDJP
+Tyo+JCAlQBw7Th1FSRc/SBs/RiM5Kh0rTR1DWCZYUyFQXyVePCI7LRoYWCAzYihDYydIZChLXiJB
+WR82WyE1XSU/Zi9SZClEZi1EZS9EYy9BYS1KazZgYzJVYTNXYDBTWyhGXShMVSE/YS5MSyhEEioU
+Bn0MFJIYHi8ihqCtRVZgNURIUYSKM0RIKzg3aI+NWW9wLzMyfIWDNUE4B1EHD0QQPxYvdSVRdBxM
+aBpFaxxSbRtUZhhEahtKbRtRbRhCbBhDcB1Qcx5efiJpeyBbgSVXhiRbiypukzB+jSpxkil3lDKK
+ki6Boy2Ghjh1QyQ+dC5ZljZtkTxpk0JllThwgzdsRis/ciRolDOIizOBdihuYzZhTChHfCZich5Q
+lCl1gipldCxbTDFCbytYhCxmjix9bjNYKSRACQyGLjNqYjFKhCptgS1ffyxfiil3ZTdSJywqMSAo
+ZitQfS5bcCdRYS5PMyQybyxheBxdbCNWcyRbPCI2RCE4eTZlhz50gkJuZTVRKR0nRRk9URdHURJF
+WhlMUSZGLBktVxlGaiVeZR1RcCFkTCZKNBYfYR42bihFdCtQditVcSdOayI/bSM6bSZFczBedy9O
+ejFPejRUezRZfjpnezRodjJZfDZYdzNdcjFjbytfZCRDYydFbDVmTSVDES0LEFsRHy8jdZCcPE1X
+OklNW4mQNURIKDUxZYuJV25wJC4tZ3p3MD41CxoMMRUqbx9MbhxHaRdJbBpOahlRZxlLZRlDaxtM
+bBtJZxc/aBpGaxxQciFbeB9beR5dfiNkfiRiiCpvhiVwiShwkCt2jyp0jStznS58gTBnQyU5djha
+mDxxlD5skkRjkztpfzhkRSw8biBkhzJ+kC+EeSVvZzFiRipFfCRfcSRRjix4gClleDFcRy06aSZP
+gTBliDB5cChQRDBACxREKyxAYyhJiDFzfDBddCtWiSxxbjFZOywzNh8payhRdylabCZOXi5HOyc+
+cCheZiRVYSJNbSNbOCAyQCE2fz5uj01/h0t2bDhdKxwkQRc5ThZCUBVEVx1KUilMLB0tVhxHZiVe
+XiFQaCFeRCNELxgibCREcytKdzBJeTNNdS1NcChKcyhGeTBQdjFZeDFPeTNQejVTfjlbgjphejJX
+eDZLezhRdzBQdjRadDJpby9aaCtHZCZLbjBiPSg6GCUWJCUmcY2ZOkhONUVHXomPM0ZJJzQwYYeF
+UmlrHCcmZX14MT8+KBIlYR1RcRtXZRhIZRdJaBlOaBZTZRdPaBtHZxdFaRpBaBhDaRpJahtPbR5V
+cyJTcx5XeyJjgCZogSRlhydtiix4hyt6iyh2iid0lCd7hTZwPyM3djlZm0V4mkl3lERokTpogTxo
+Pyo7bSNneSlwiCp9dSRsYStcRy1FeCFeciVWjS57fylleDJgQig4aidUey1mhDVwbiJKWCVBQTI0
+KCUoaShRjjR3fi5kcCdTeyVidClcQCo4PB4tayNPdClXZiRJWipDNSQ4ZSNRayldZSFUayVbOyM0
+QR43fzptjEl7iUx3dD9kLBwlPxQ3ThVCURREWBxLVCpNKRkoWiBKaCZhXyNSZyBcQyBBLxgfbSNC
+fS9SfzNSfzVPfDJPfTJafDBZfTNdhj9tiEJ0h0Bvh0FnfzlVhkJjgj1ldjRSeTRVfjZgczFPcjJS
+dy9hcypfaCZIZiNGaTJXQCQ8IyImc4+bOkhNLj5AWoWLNEdKIzEsY4iEUmhrHSgnZH92NENEQRQ1
+cBtTZxZVZxlTZBhKYxZLaBhYZxhQZhlFaBdHaRdCaxlHbR1OaxxPah1QaBtMcyRbdyBeeh9ceyBh
+hyx3hSh7gSd3hyhxhiZykSd5fjJpPyM0cDZSmkp7m019lUNplD5sh0NvPCg5aiNlayJifCVydSZr
+aTFjRSxCeSVhcyldiCl2fitlcy9fQSg7aypZeCxlfS1wcCFWaSJMbjdXNSoveC9kiC5sfzBicitW
+cydbgihnSStAQB4wah1LbCVPYh9CYixJMiAyXCFGaiZeayNcZyRWOSIxQRs2fzZtiER3ik14czxj
+KBoiQRY5VBxIVBhHYSVUVi1MJhYjVx9HZyZeXyNQaCFbQyFALxgebCQ9dy5JfjRTgDVUfjNOgTdU
+hT5gfDhcfjhbhD9ui0R5jkh1fDtZgUJojkl7ezdbeDNSfjhrfDppdzZQcjFPcDBUayxPaylKZSRK
+WS9KJyYqdpGeOUhMLT0/WYOJN0lNKjAvaZGVUGtqHSkkXnVvMT07SRMyZxpOYh5ZaRtNYxZJZhdU
+ZhpPZhpDaRxEaBhHZhZEZxlJaBlOahpTah1WaB5YbR1XcRtXdSFddiVndyRufSZ2fyVugyVuhydr
+iiJseDJvOyU4bzVRlUV2mEx9jT9plEFyg0NuOSo2ZB5eaydneCRzdCNwYzRiPiQ7filqeydjgCpu
+fCZmdzJnPyw4cDBlcilVeS1nbCNUbyZQfjR1Oio3fDNtgTBgfDFjcC1WdytkhCptRyc9QRwrZiBG
+YyFCXx06YCtJMx4vUR05ZSNWaiJeYCBPNyEwPxo2dTBngUJ1g0R0bz5hLRwmQBU3VR1IVxxJYCdV
+Wi5SJBcgVh1BZCNbXyRPZx1cQiI9LhshZiNGcSpAdzFNezpgdC9SdTBMeThYfTteeTVYejZYg0Ft
+gkJudjhYdzheh0V3fjtkdjFMdDRSej5lfTtibzFRcTdSajBPaS1NaCxLUCU5JiIpdJSePUlPLT8/
+VomRNk9MJjIrcpuSXnBwHyIiSF1ZJTI0SBQ+dx1kbxhbaxdCbBZNcBZeahhKbRdHaxRGbRhIbBdH
+cBtLbhhQcB5abyJcaB9UaRpMbhhNcx9bfipviDF9gSV0gCBthSVuhSVgkSdwfjd1Rik9dS9YmDx3
+lkF9jTpukjZyfzpqQCg6ZR1gbyBhgih1diJsWS9RSCE/fiRsfh9kfChohShxdyxqRS5AZyJjbCRQ
+dCZcbB5TdSVhkkSLSDNDdTFkfjRcfS5ldipjfCRxfilwSiZCRhgwYRtGXxtBYhlAWCZHMhonShkx
+Zh5PaiFcWhtHOiAxQBs2cy5lhDh1ijl0azdbJxwnSBU/VxlIXB5OWh5SVihSKhwoWRtCZx9bZCRR
+aiVlSCdCNRwpZydcaSZHaCVFcjBhfDJidC5UbylPdC5VdC1UcSpOdDBdgz5wfzdhcSxSfjpqgzxy
+eS9adzBQezVegDhndjJVcjBOdjRXaypIcCtNXCdCLicqXn+FNENNOU1QgJilREtVHCksUm1kP0tO
+EBYTGiQdHh8gOBw4ThlGTRI1ShIsTRY1SxM4SRM0TBQ3ShIzSxUySxUyTA45SxRETRtNUBxLUxpB
+TRY/SBE9UBRBUx9MViBPVhlIVRlIWBxLWh9TYyBiViRRNyAuVSNCZSlQYi5UYSlNZytPWC5JNyM0
+Rx9HWx5UaShjVR1TSClHOyM4VyJJVCBIVSNIZCdQVCNGPi4/WSpUTCE5UiU/Sho5ViRGWCdUMyMy
+Vi1KVSpFWiZIVyJHVyJRURxHLxsoMBQiRBU0QhUwRRMuNxcsHRQZMg8iRhI2RRU9ORMwJhQiLREl
+Th9EXShVZSdXUCNDKBckNRAuPRU1Qhk5QBQ1NhgtJRkjPhUtQxg5Sxo2SSBDMxotMBgjSiFDUh86
+SxYuRh08TiNBUCE/SBo3SBw0RRkvRBstQxcxTiBAUiRFTyA5TyI/TyVJVSpMTyM7TR82UiU9TiI0
+TCEyTCI3Rh0tSyAxPR8vIiAjK0NJGycuODo5XnRzKDo+HBUmGh9VEDJaGCVcGCFTFxgmJSQfM0FE
+RFNVT2BlXnF1WG5wU2huUmhqVGptWG1yUGVqVm5wS2xxQmBkHjAxFyotLVVbJFtjMGJnQWZtUWtx
+YHJ1YXV9YnV7WXB3VWxzWmpuVGlxWWx1VWlwUm5zWGpyXG92VXFzXW56W297V25xVm5yVGxyUmht
+W3V6ZHV7XHV/VGlxMC81UU5NUWFmXFlkVF1bVmJhX2hsYW1oX2psX2hqWmZhSGBiSltaTl5WTGFf
+VV5fWWZhXG5lXGdoX2tnZW5rX2hpXGtoZmtsYGJkW2ZnXmhrU2FiXmVoMzM4DhQYEDA6F0hQJFFT
+Hk9aGkpWL1hgQFlhQlhcO1ljOVpjM2hvQWRyMGV1LWd2MG16IGR1Pmp3Vm51WXB8Wm11W2t1WGdy
+VGNvWmp2V2x1YXF6ZXN9WGx3JS00Q0tUUmVuUGZuVmhxYG55X251WmlvV2duWmlzVmdtRFVdNUJJ
+IRgeGCpDFzxrGjNtGD9tHyg7DQ0xBROSD1K5DDa4DieTGBMqGhcYMD9BRFNXRFtfUWhrVGxtSWFk
+RV1gQ1teS2NnSWJmPF9jO11jNk9WGyguECMrIklRIFNbJlZePWBkT2tuW3N1W3J2W3F4V2h0TmNs
+Rl5mSl9pSmJqSWFoS2ZrTmZtTGRtSWNqUmZyUWdyTmhxTGZvSWFsQFRhQlpiTWRoSWFnQVVbJS0x
+PEBAPUZJR0pPQkxMTl5dUmFhVGRgUmJfUmFcUWNbRl1XSF1WTWVcUmxjYHJsZXFtZ3ZwaHd0bXx3
+b355bnl4cnx7c317ZnFtWmhkWWVjVWBeVV9dKi8yDQsaDyMzEj1MG0tYH09XH0tTM1hgRWFqRV5o
+OVViNVZhMlpkPFtqL11rI1NjHU5dDkpWGVBXLVdeO1tlSmFpVWZuTl9oRldhS1xmTmJsVWZxWWt0
+T2NsHScwOkVOTmFpTWZrW3B4ZHWAYnR9XG53XW55WGhzUGBqOEhTJjM9FBYcEkCDDnHfDGfgGH7M
+FDZkHBExBBGfC1q5DUbBDyaiFxYvRFZPR2xlRGZmRGllRWlmRmpnQmVjRGdnR2ppR2ppSm1sSW5s
+R2lpSGppUHFxT3JzTnNzS3FxTnFxSGxrRWtqRGhnTm9uUXNxVHV4SnN2TmtrIykpWWBianZ4YnR0
+Z3x7YXV2Znl7ZHd4YnZ4ZHp8YXh5YHh4YHd4YXl5ZHt8aHx9ZHh5ZHd6aXyAYnR3Z3p9Y3V5XXFy
+WW1uVmtsXG9xWWdnXWpqY29vX21tX3BwVFhaIyYoSFxbSmBgTF9gT2NkQ1hZQ1hZPlVWPVRVP1ZX
+PVNVPFNUO1FSOU9QO1FSRldYRFdXPVVUNVFQN1FRN1FRO1ZWP1tbQl9hQF1fRGFiQFxeP1xcRV5d
+NDo8HissQGNgRmdlRmloQ2dlQWZmR2tsR2xsTHBxSm9vRW5vQGpsQGprPmhpP2trPWlpOmRkOGFh
+OWNkO2VmO2ZnPmlpRWxtSmtuSmptSm1vUmttFhgbDzePEHXtD4LnD4veEjljDxA7CRuRDFOkBz6l
+EiOKGSI5RmlpYZCRUoeMVIiMWY2RUYSJR32CQ4CFRoSIS4mNSoaLP3l/P3uAPHuAQ4SITIyPRYGF
+P3V7PnN4OXV6PXuAQHyBSYOJWI+Ua52ka6OqbJKZJjQ6doqPi6WphKSndJeZcJGWcZKYcpOYdpec
+dJSaepugdpeceZmfepykdpqjfKGqcZigcJabcpaWcJSVbJCRcpaWcpOTcJGRcJCQcI+Qd5CReZCR
+gJeZgJmZe5SVbnh8KjY5YIWEa5KTZYaJY4aHX4GDWX19Vn17U3p5UHZ1U3l4TnVzTXNySnFwRmxt
+RWhsRWZsQ2NpQWBmQmBmO1xiP2NoQGltTXV6UHh+VHyCU3uBUnt/ZomLSlRaKjtAZZCRZZWYap6g
+aJ+hY5yeYJWbZpyhZ52iaqGmZKCmZqKoZKClZKGmX5+kXZyhXpieXZSbXpacXJmeXpuhaKWqa6Ws
+bqSqaqCnaqGodKCmGB4kECZ9D1/SB3LUCXnIDTdjFxYhExQyFSA6DR06FhczIh0UIScsJzEyHzQv
+IjIyIzQzITEwITExIzEzJTM1KTc4JDIzGCIlFyEjGyMlGyIlFigmGSUlHSYlGyknFygoGyorHy0v
+JC8xITIxJzIzMDk8KDYzGB0ZMTU0NDg4Nzw7MzY2MTY3Mzg6NTo8NTo8MTo7Mzw9Nj9AMzw9OTw/
+Oj1ANz1AMjs9Mjs9ND0+ND0+NDw+Mzs8NDw7Mjk5NDs7MDg4LjY3LjY2LTQ1LzY3LzM1JSssFh4f
+KDMzKTQ2KTQ3JjI0JjE0KTM0KjMyKTIyJC0sJS8uKDEwJS4tJi8uJS0uJCstJS0uISssISsrIywt
+ISstIy0uJjExJjEzKDQ2KjU3KTQ3KzI0KjU3HCUnGh4gJDIzJzY2JjU1KTg4KDc3KDY0Ljw7Kzk4
+LTs6LDs7Lj09LT09LTw9Kzo8LTs9LTs9LDo8KTk5Kzo6Kjo6Kzo7Kjo6Kzo6KTg4Kzo6JDQ2FxsT
+FRI1ESRHFSxDDy0+IB0tRQEAoDwASgAgBkoABAA=
+EOF
+       open FP, "> /tmp/glass.bmp";
+       print FP $glass;
+       close FP;
+}
+
diff --git a/test/README b/test/README
new file mode 100644 (file)
index 0000000..3836672
--- /dev/null
@@ -0,0 +1,28 @@
+README
+
+The files in this directory are the test scripts used
+to both verify that nothing major is broken each release
+and to demonstrate how the SDLperl API can be used.
+
+Many of these scripts have been submitted by people who
+use SDLperl, and further submissions are more than welcome.
+Still, while these examples demonstrate how to use the
+API, they should not be taken as the best way to use it.
+There is more than one way to do it.  Given the variety
+of styles presented in these scripts, there is probably
+something for everyone.
+
+Descriptions 
+
+checkkeys.pl           prints keys pressed to stdout
+graywin.pl             creates colored rectangles where you click
+loopwave.pl            plays a wav file using audio callback in perl!
+testconsole.pl         creates a simple console interface
+testfonttool.pl                displays a series of bitmapped and true type fonts
+testgfxprim.pl         demonstrates some basic drawing primitives
+testgfxroto.pl         rotates and caches an image (wait a few seconds)
+testjoystick.pl                tests joystick movements
+testshell.pl           experimental perl shell support 
+testsprite.pl          displays a wave of smilie faces
+testtimer.pl           displays multiple, contemporary, timer callbacks in perl
+
diff --git a/test/checkkeys.sdlpl b/test/checkkeys.sdlpl
new file mode 100644 (file)
index 0000000..0d5fe8f
--- /dev/null
@@ -0,0 +1,104 @@
+#!/usr/bin/env perl
+#
+# checkkeys.pl
+#
+# Copyright (C) 2005 David J. Goehrig <dgoehrig@cpan.org>
+#
+# ------------------------------------------------------------------------------
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+# 
+# This library 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
+# Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+#
+# ------------------------------------------------------------------------------
+#
+# Please feel free to send questions, suggestions or improvements to:
+#
+#      David J. Goehrig
+#      dgoehrig@cpan.org
+#
+
+use SDL;
+use SDL::App;
+use SDL::Event;
+
+my %options;
+
+$options{-flags} = SDL_SWSURFACE;
+$options{-title} = $0;
+$options{-width} ||= 640;
+$options{-height} ||= 480;
+$options{-depth} ||= $options{-bpp} || 24;
+
+my $app = new SDL::App %options;
+
+# SDL::EventState(SDL_KEYUP,SDL_DISABLE);
+
+sub print_modifiers 
+{
+       $mod = SDL::GetModState();
+
+       print " modifiers:", 
+               ($mod & KMOD_LSHIFT) ? " LSHIFT" : "",
+               ($mod & KMOD_RSHIFT) ? " RSHIFT" : "",
+               ($mod & KMOD_LCTRL) ? " LCTRL" : "",
+               ($mod & KMOD_RCTRL) ? " RCTRL" : "",
+               ($mod & KMOD_LALT) ? " LALT" : "",
+               ($mod & KMOD_RALT) ? " RALT" : "",
+               ($mod & KMOD_LMETA) ? " LMETA" : "",
+               ($mod & KMOD_RMETA) ? " RMETA" : "",
+               ($mod & KMOD_CAPS) ? " CAPS" : "",
+               ($mod & KMOD_NUM) ? " NUM" : "",
+               ($mod & KMOD_MODE) ? " MODE" : "",
+               "\n" ;
+}
+
+sub print_key
+{
+       my ($e) = @_;
+
+       print "pressed " if (SDL::KeyEventState($e) == SDL_PRESSED);
+       print "released " if ( SDL::KeyEventState($e) == SDL_RELEASED);
+
+       my $sym = SDL::KeyEventSym($e);
+
+       if ($sym) {
+               print SDL::GetKeyName($sym);
+       } else {
+               printf "Unknown Key (scancode = %d) ", SDL::KeyEventScanCode($e);
+       }
+
+}
+
+my $event = new SDL::Event;
+
+my $done = 0;
+
+$process_keys = sub {
+               print_key($_[0]);
+               print_modifiers();      
+       };
+
+my %events = (
+       SDL_KEYUP() =>  $process_keys,
+       SDL_KEYDOWN() =>  $process_keys,
+       SDL_QUIT() => sub { $done = 1; },
+);
+
+while (!$done && $event->wait())
+{
+       if ( $events{$event->type()}) {
+               &{$events{$event->type()}}($$event);
+       }
+};
+
diff --git a/test/graywin.sdlpl b/test/graywin.sdlpl
new file mode 100644 (file)
index 0000000..e1902dd
--- /dev/null
@@ -0,0 +1,76 @@
+#!/usr/bin/env perl
+#
+# graywin.pl
+#
+# Copyright (C) 2005 David J. Goehrig <dgoehrig@cpan.org>
+#
+# ------------------------------------------------------------------------------
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+# 
+# This library 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
+# Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+#
+# ------------------------------------------------------------------------------
+#
+# Please feel free to send questions, suggestions or improvements to:
+#
+#      David J. Goehrig
+#      dgoehrig@cpan.org
+#
+
+use SDL;
+use SDL::App;
+use SDL::Rect;
+use SDL::Event;
+use SDL::Color;
+
+my %options;
+$options{-flags} = SDL::SWSURFACE;
+$options{-title} = $0;
+$options{-width} ||= 640;
+$options{-height} ||= 480;
+$options{-depth} ||= $options{-bpp} || 8;
+
+my $app = new SDL::App %options;
+
+sub DrawBox {
+       my ($x,$y) = @_;
+
+       my ($w, $h) = ( int(rand(640)), int(rand(480)) );
+       
+       my $rect = new SDL::Rect -width => $w, -height => $h, 
+                       -x => ($x - int($w/2)), -y => ($y - int($h/2));
+       
+       my $color = new SDL::Color -r => rand(256), -g => rand(256), -b => rand(256);
+
+       $app->fill($rect,$color);
+       $app->update($rect);
+};
+
+$app->loop( {
+       SDL_MOUSEBUTTONDOWN() => sub { 
+               my ($event) = @_; 
+               DrawBox($event->button_x(),$event->button_y()); 
+               },
+       SDL_KEYDOWN() => sub { 
+               my ($event) = @_;
+               $app->warp($options{-width}/2,$options{-height}/2) 
+                       if ($event->key_sym() == SDLK_SPACE);
+               $app->fullscreen()
+                       if ($event->key_sym() == SDLK_f);
+               exit(0) if ($event->key_sym() == SDLK_ESCAPE);  
+               },
+       SDL_QUIT() => sub { exit(0); }
+} );
+
+
diff --git a/test/loopwave.sdlpl b/test/loopwave.sdlpl
new file mode 100644 (file)
index 0000000..39cd8b0
--- /dev/null
@@ -0,0 +1,6494 @@
+#!/usr/bin/env perl
+#
+# loopwave.pl
+#
+# Copyright (C) 2005 David J. Goehrig <dgoehrig@cpan.org>
+#
+# ------------------------------------------------------------------------------
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+# 
+# This library 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
+# Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+#
+# ------------------------------------------------------------------------------
+#
+# Please feel free to send questions, suggestions or improvements to:
+#
+#      David J. Goehrig
+#      dgoehrig@cpan.org
+#
+use SDL;
+use MIME::Base64 qw(decode_base64);
+
+die "Could not initialize SDL: ", SDL::GetError()
+       if ( 0 > SDL::Init(SDL_INIT_AUDIO()));
+
+my $filename = '/tmp/sample.wav';
+
+my ($wav_spec,$wav_buffer,$wav_len,$wav_pos) = (0,0,0,0);
+
+my $done = 0;
+
+$fillerup  = sub {
+       my ($data,$len) = @_;
+
+       $wav_ptr = $wav_buffer + $wav_pos;
+       $wav_remainder = $wav_len - $wav_pos;
+
+       while ( $wav_remainder <= $len ) {
+               SDL::MixAudio($data,$wav_ptr,$wav_remainder,SDL_MIX_MAXVOLUME);
+               $data += $wav_remainder;
+               $len -= $wav_remainder;
+               $wav_ptr = $wav_buffer; 
+               $wav_remainder = $wav_len;
+               $wav_pos = 0;
+       }
+       SDL::MixAudio($data,$wav_ptr,$len,SDL_MIX_MAXVOLUME);
+       $wav_pos += $len;
+};
+
+$poked = sub {
+       $done = 1;
+};
+
+$SIG{HUP} = $poked;
+$SIG{INT} = $poked;
+$SIG{QUIT} = $poked;
+$SIG{TERM} = $poked;
+
+$spec = SDL::NewAudioSpec(44100,AUDIO_S16,2,4096);
+
+write_wav();
+
+$wave = SDL::LoadWAV($filename,$spec);
+
+($wav_spec,$wav_buffer,$wav_len) = @$wave;
+
+die "Could not load wav file $filename, ", SDL::GetError(), "\n" unless ( $wav_len );
+
+die "Could not open audio ", SDL::GetError()
+       if (0 > SDL::OpenAudio($wav_spec,$fillerup));
+
+SDL::PauseAudio(0);
+
+print "Using audio driver: ", SDL::AudioDriverName(), "\n";
+       
+while (10 > $done && ( SDL::GetAudioStatus() == SDL_AUDIO_PLAYING())) {
+       SDL::Delay(1000);
+       ++$done;
+}
+
+sub write_wav {
+       $wav = decode_base64 <<EOF;
+UklGRiSQBQBXQVZFZm10IBAAAAABAAEARKwAAIhYAQACABAAZGF0YQCQBQAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoP+q/6H/lP+T/4b/b/9x
+/3//Vv8Z/yX/Lv8T/zD/Tf80/z3/fP+s/6D/rv/9/y8AKQAjACsA6v+c/9T/BwDT/8n/8P8EACwA
+VABlAFsAOgBTAIYAXQAZAA8AIQBDAFYAagCIAG0ATAByAJkAmwCqALMAkwCfAM4AtQB/AGcAYACA
+AMkA7wDsABcBUAFWAV0BZQFkAYQBqgG2AYkBHgHVAL4AogCOAJwAvgDcABIBbwHAAcYBewEwARMB
+HQFSAWEBIQHnAKwAZwBsAHwATgBLAG0AewDQAAQBnQCFAAEBGgHgAPgAPwFDAeUAkACZAMEAzQDR
+AN0AAQE0ATkBOAFqAZsBrQHKAQ0CNAIcAgMC8QHeAeIBAwIoAgUCvwHMAQMC8AGLAVoBiwGrAbUB
+3AHoAa0BdgF2AXcBXwFFASgB3QBoAEAAewBtABoA9P/K/7f/AgBbAIgAuQD4AEUBiwF8ATwBVgGU
+AXIBIgHuAMkAnwCCAIIAjgBrADQATACLAJ0AggCAAMAABQEXARAB7ACZAH8AugC7AGUADADf/+r/
+HwBmAIoAawBLAG0ApQCnAH4AYQB6AKIAaAAAAPP/HwAeAPr/4P+3/5//+f9FABAA2P+g/0L/TP+9
+/wkADgDO/4D/hf+x/53/Zv8y/97+f/5z/tT+Kf8x/03/Y/9P/5j/OACNAF8ACgD5/wQA8f/S/6n/
+c/9H/1H/qf/o/8n/qv/L//3/BADb/53/XP8f//r+z/6M/m7+ZP5J/kb+Yf6I/qv+xf4K/3//5P8T
+ANr/Vf8b/0X/MP+w/kf+FP4F/kL+f/5z/m3+ff6v/v3+A//V/uj+O/9//3D/Jf/c/n7+Mv4u/iv+
+FP4e/i7+N/5o/qn+qv6K/pv+v/7p/ib/Iv/X/pr+eP5s/nL+ev6k/vP+Of9z/4X/UP8L/+v+9P4T
+/0v/hP+D/1n/OP///oj+If4h/nz++v5K/2v/zf84AB4Atv9G//X+GP9k/4X/r//A/3r/Lf/s/mz+
+Cv49/q/+3f74/jr/TP8d/xL/JP/s/qP+uv4a/4r/0P+5/5H/tf/4//f/r/90/2X/dv+e/63/pv/H
+/wQAKwBBAEQAEQDG/7z//f9LAKAA6AD3AOEA2gDmAMoAhgBHAB8AEwAOAPX/oP8r/0T/zv/d/7P/
+6P8bACsAXACZAKwAjABtAIgArgCrAJkApADaAPcAAAFSAZQBZwFMAY0BvAGqAXYBLgEFAQgBBAEK
+AUQBcAFPATQBSwFaAVUBUQFqAZ0B0gEYAlsCYQJAAhkC0QF2AS4BBwH/ANkAjgCDAKwArQCMAJEA
+1gABAe8ARAEJAlICBwLaAc8BfQEbAQIB8ADDAJcAeQCmAOoA0wDOAEABnQGVAYABoAGxAY4BgAFs
+AR8B6gD4AOMAhwAYANz/+P8yAGoApgDuADUBYgGJAYYBFQGvANIA+ADXANEA3QDgANUAuQCzAMEA
+zQDVAPgATAGSAXsBIwHcAMsA2gDyAPkAoQA/AIYA6QDFAKEAlwAvAN//AAAKAOr/4P/t/wgABQDH
+/4n/if+b/6f/6f8fAPr/2v8AABwA9P+t/4z/nP+v/6j/kP95/4H/rf/s/zIAUwBHAEwAYgBGAP3/
+x/+8/8r/0//Q/8j/tf+u/8H/3f8SAFkAZQA1ABcAIQA9AEEAAwC1/4D/Qv8p/1n/Wv8Q/wr/TP9K
+/xr///4K/z3/Tv9F/2L/TP/7/t/+8/7j/q3+of6t/lr+6v0H/mD+cv6F/sX+9f4V/zr/Qf8p/xH/
+8P7v/jP/Xf9P/0T/H//h/tr+Gv9E/yT//v78/hr/Nf8W//T+Lf+A/4T/Vv9Y/2j/NP/i/oX+OP4/
+/kP+CP4B/gH+v/3O/SL+Hf7o/eT95P3s/UP+xv4Z/xP/+/4r/0j/3f5u/ov+2f7T/pb+nP7O/sf+
+tP7V/gD/Jf9i/6L/p/+M/6b/zv/R/8j/tf+u/7L/pP+G/2b/T/9J/2T/hf97/1f/Tv+E/9z/JABE
+ADsALwAgAPH/2/+8/1P/Cv8m/2L/cf9D/+n+vP4a/5r/r/+T/5r/iv9k/47/pv9k/yL/2P7S/iT/
+M/8k/3P/2P/v/x0ApgAdATUBNAGKAQECOwJPAigCtwEyAaEAJQADAAwA+f/7/yUATwCHAL0AvgCy
+ALcAxADGAJQAXQA9ACcAJQDy/8r/9/8fAFEAqQDvAAYBGAFhAZYBfwFuAXYBTAHuAOIAIAEnARwB
+AgHiABsBYgFgAWUBcQFhAYQBvgGjAWEBUwF1AXkBSAEIAaUAFwCx/7b/3//o//r/RwDlAHYBkgGE
+AakB2QHjAdEBvwHDAd0B5AHHAZ0BUQHxANcABAEnAS8BNQFKAXMBlAGxAd4BEgImAvABcwHqALIA
+vgCmAIYAtQDeALYAwQD9ANQAZwAdAA0AKgBZAHMAWAAHAK3/jv+T/2n/N/9Z/63/AgBfAI0ASQDv
+/wAAVQB1AFoAPAAyAHAA5gAdAeAAbgAjACgAWQBqADYABwA7AJIAiABAACQAFwAUADMAOABBAIQA
+zwAEAScBIAHQAGwASABPABYAt/+M/5D/mP95/0//Pv/8/pz+ov7x/gr/I/9b/2D/b/+w/9n/0/+g
+/23/a/9Y/wP/rP5x/ij+3/3d/Rv+Tv56/tj+jP8/AF4AHAAAACsAZQBRABoAAwDi/5z/Rv/i/nz+
+P/5B/mL+hP6r/uP+J/9W/27/ef9s/1r/Vf9j/3v/W/8F/8T+qf6I/nH+g/6//vL+7P76/mj/yv+g
+/1P/R/9G/0D/H//t/sX+t/7c/hD/J/8F/83+1f7x/s3+x/4h/0//Nf9I/1j/Gf/+/kz/g/85/7/+
+sP78/ib/Hv8Q/xP/L/9S/17/Qv8u/yz/FP8b/1//lP+Z/4b/X/8v//3+5P7q/t7+oP5+/qf+qf5d
+/hP+/v01/r7+OP9C/wD/3f4e/2T/Uv8F/7T+lv62/u/+Ev/5/rv+vP4R/0P/KP8Y/yz/Of9n/9L/
+AgCq/0v/bv+m/3//Tv9g/3r/ff+C/5D/wv/u/wEASACdANYAIAFjAXgBaAFVAV4BjgG9AZ4BTgEp
+ARsB9ADZAOIA2gC+AMwAFAE1ASoBUAF/AYMBigGAAT4BEQEQAdQAdQBiAGAARwBQAF0AcAC2AOcA
+7AD5AA0BFAEbAUEBZQFzAX8BcgE4AQsBMgFLAQ8B8gAgAVUBewGTAagB9QFZAmICNQIuAi0CBgLd
+AcgBogF1AX0BmgGBAUwBJQEfATkBSgFIAUMBZgGlAcwBvQGIAV0BOQEKAesA7AD2ALkARgBKAK8A
+wgCdAI8AgACTALwA7gAvAR8B5wARAWYBUwHlAKsAtgCkAJcAqQCYAGIAPABTAH8AfABfAG0AswDn
+APoABwEGARwBLgEHAe8A+wD6APcA3ACXAGAARQBQAJwA4wDdAMEA0gDyAAoBLAE8AS0B/ACuAGEA
+HwAUAE0AegB3AFcAAgDS/wkAAAB6/xD/+/4D/xT/Mf9M/2n/Yv8n/wj/+P7Z/hf/ff9m/zT/cf/E
+/9//4v/o/+7/0f/F/yQAiAB1ABUA3v8LAGkAtADBAHoAKQAjAGQAmABwAAsAs/+Z/7H/i/8a/6D+
+VP5W/mn+hv7E/ub+5f71/iL/Tf9i/2r/Z/93/5//iv8T/43+av6V/of+X/5n/nP+c/6W/tH+7/76
+/h7/Xf+K/3H/KP8C/w7/G/8s/zr///6H/mP+pf6a/lT+Tf5K/hX+3P3b/Qj+L/5L/lv+if7C/r/+
+uv7Q/rf+hv53/oP+p/7U/vz+Df8B//L+9P72/uz+8P4Q/0L/cf+B/3j/Y/9F/zD/G/8T/x3//f7k
+/kT/0/8LABsANgBBAEsAPQAbABQAIABBAGEANgC9/1//Uf8m/8v+pv61/sf+/P5j/7D/qv90/1n/
+W/9u/33/WP8+/3f/zf/2//H/yv+c/7L/0/+g/2T/aP+V/7H/qf+a/4f/dv+G/83/KABYAIEA2QA5
+AVgBHAG6AHMAUwAeAND/v/+2/1//9f7l/iT/MP8O/x//Y/+w/woAbwCQAFMALACNAPUAnwAAAM7/
+6P/T/4v/hv+v/6H/uP9CALgAzADvADEBUQFtAWoBPgEZAQUB8ADcAO0ADAEWASgBRgEyAfEA6gAa
+AScB6wClAKgAzACgAFIALgAJAOn/3//q//7/AgAUAEsAkwClAJIAyAAvAUIBBwEJASEB9QDLAKgA
+eABqAGcAcgCsALYAYQBSAMkABQH6AEwBrQGXAW4BmwG9AYwBawFwAT4B2QCXAJoA6QBQAXcBUwFP
+AawBBQIiAvwBsQGTAYsBcwFnAUsBDgHEAHMARwBLAGMAhwCAAF0AgAC/AMMAwQDuAO4AwADdABYB
+3wB6AI0A2QDnAMYAhABbAIoArwCNAHsAigCfALUAwQC8AJwAbAAzABUAQwB/AGEAGgBEALQAvACG
+AHIAWABGAHUAkwBjAEYATwBGADkAJwAvAHEApQCaAG0ATgBOAEkARABgAHcAWAAiACIANAAdAPT/
+vf95/1b/b/+U/57/j/+d/9T/6f8TAF8AOADx/+H/qP+C/6//vf+A/zH//f76/vj+w/6j/uP+Q/+G
+/7T/wv+N/y3/Bv9M/5j/nv+H/33/hP+P/5X/gf9r/3L/fP+D/5n/pf+m/7n/1v/p/+//0f+R/0j/
+Ev8S/xX/x/5w/oD+xv7w/vf+//4Z/zP/Lv8Y/xv/N/8y/wz/1P5u/iL+K/4i/tv9uP22/aH9qP3t
+/VP+o/6s/tj+Vf+a/2b/Dv/+/g3/0/6G/nL+b/5i/nL+m/6R/n7+t/4H/1L/j/+T/4//yv8CAOf/
+pP+F/5j/sf+O/1n/N/8l/yr/SP96/5v/lf+Y/7D/xf/I/8L/2f/z//j/1P9p/97+f/5m/oH+sP6/
+/tL+Vf/n/+X/ov9P/73+eP7K/hf/Jf8K/7f+pP74/g3/3f7m/uT+mf6r/jT/kP+R/7r/RwDEABkB
+jwH2AQ4CBQLrAa4BawEFAVYAn/8j/xX/V/9q/0j/W/+8/zYAnwDPAMEAxwDOAIcAWQB8AH4ARAAo
+AGgAngBeABUALABfAHUAhwDOAP0AvQCKALAAmwAmAPH/CQAnAFUAeQCCAI8AowCvALkAsACVALoA
+FgErAQUB/QDhAHsAGwAgAFEAQQAZAAkAFABGAFoATwBuALQAFQFxAYsBjAGpAcMBsgGFAVgBNQEr
+ARsB3QCHADMAAAAGADsAqgArAXMBmgHuASsC6wGMAWsBdgGMAb4B+gHgAZcBlwGtAYsBigGoAaEB
+pAGVAVQBDwHlANIAzgCmAE8AKwBKAHIAfABTADYASwBeAI0ABAFpAZ4B3wEBAgECHgL9AYYBRQEz
+ARwBCwHbAIwAdACMAGkAGAAHAEUAiQC0AAEBaQGTAbIBEAJKAjwCJwIDArsBfwFbARABnQBHAD4A
+KwDl/7z/pf91/2j/tv8RAEMAjQC9AMcABwFIAVABMwHWAGIAIADW/zv/rP6J/p3+rf7R/hL/Tv+Y
+/yAAjQCQAJIAnwB/AF8ATwA2ABUA2v94/y7/Kf86/wr/2/4W/3//5P8qAFIAcgBiADkALQAOAL7/
+cP9Z/0n//P6m/oH+bf5m/pL+z/7k/rT+qv4u/4b/Q/8A/+/+5P7Z/qD+W/5E/hz+CP5U/pn+ff5V
+/rT+M/8L/8D+6/4T/8r+bf5H/hb+5f3I/Z39gf2A/XH9kP0L/nP+j/64/gz/Qv9L/zz/B//R/qL+
+b/5f/lb+Kf4B/gb+Kf5e/p7+zf7l/vX+EP89/0f/D//Q/sD+ov5t/mf+LP6n/Zb9Af42/vD9k/18
+/af9/f1G/nX+oP7E/vv+L/8e/9j+qf69/uv+FP9Z/4T/Yv9K/3D/gf9a/zX/Mf9Z/4D/cf8u/+X+
+zv7V/t3+xP6G/oL+3/5G/3P/jP+t/9T/8f/8/wkA2P9u/0D/aP+n/6//nP/L//z/1P+o/+P/MQAp
+AAYA8f/v/0cAewD2/4L/hP9V/xL/Hf83/1L/dP93/6H/7f/w/+L/CAAgACcAUwBzAC8A2f/r/x4A
+JABIAJwAwwDXAA0BMQEzAUIBawGdAbkBtAGkAZ4BewEeAdUA9QBcAXoBLQEOAW4BwgG7Aa4BvwHD
+AcQB1AHGAbQBuwGtAZcBiAF2AWYBWAFZAUEB4QDHACIBJAHcANEA3ADqAB0BSgFOATsBJgFJAYoB
+egFKAUcBQQEjARUBFQHrALgA5gA9AUsBRAF1AbEB2AHpAekBBwJRAoMCVQLzAdAB4QHLAZUBXgEQ
+AfAARQGwAfIBKwJNAkUCQgI0Av8B4AHVAc4BuwGSAVoBGAHmANIAzwCKABoANQDFAAEB0gCaAGMA
+GwD2/+L/sv99/03/O/9p/5//u//x/x0A6v+w/9r/IQBGAFoAagByAH8AkwCWAJEArADoAAcBHAFP
+AVUBFwGoAAsAkf9j/1X/Lf8D/x3/YP+J/57/oP9w/0L/U/+Q//P/TgBLADAAQAAzAPj/t/95/0v/
+Vv+Y//P/AACD/0b/hv+C/zv/H/8w/3L/3P8pAEcASAAoACAAMgAFAMT/u//g/wgAEADb/27/7f6G
+/lf+Pf4N/v/9Iv5S/qv+/f7r/rz+wv7V/u/+IP89/1j/ov+5/1L/9v7k/un+7v7v/hL/H//4/vv+
+Cf/a/qz+x/4o/4//qv+T/3b/Rf8U/xT/K/8G/8v+7v5n/6//jP9e/yX/wf6D/mH+NP4g/k3+wP47
+/1T/2/54/o7+fP4W/vv9Mv5V/o7+FP+h/7X/U/8Y/yH/Hf8b/yr/Ov9S/2r/n//D/3X/Dv/5/vj+
+2P7H/ub+IP9G/03/W/9k/1L/J//8/vT+IP9q/5//zf8AAO3/nP9g/1b/Pf8E/wH/Bv+7/mL+YP57
+/lz+Tf6N/uz+af8SAJ0A4wDrAMIAswCnAEwAzv9x/zH//P7u/gX/+f6+/qv+/P57/+T/RgCqAAoB
+YgGDAXgBbAEoAboAjgCMAGQALQAeABEA1f+g/7j/+f8wAG4AsgDyAB0BFAH7AA0BEQHGAGAAFQDw
+//f/NgCcAOYA4gDHAAcBcAFXAfEA3wDpAMgAyQDxAPsA0QCEAHcAwADLAIMAfgDJAPEA3wDUAAQB
+MQEjARsBGAEFARMBGgHyAOkA/wDxAA8BeAGtAbkB2wHqAfcBDwIDAtcBugGuAZ4BpQHRAdwBngFZ
+AWgBtgHtAegBygHLAcsBtgGsAZ0BfQF1AZwB0AHAATkBxwD6ACwB2gCKAEQA6//9/3AAtQCrAIEA
+fgDgADwBFwHEAKwAxgDsABgBQAEyAfcABAFSAVcBJAH5AMYAsgDeAPIAxgCiAJsAlwCDAGgAXgBs
+AJ8AwACrAJIAYgAnACwATQA5APr/1v/p/xsATABJACgAOgBZAEQALAAoABcAFgAdAP3/1//v/xkA
+CgDc/5b/XP9l/3//kf+n/7H/vf/W/83/nv+T/7n/0f/S/9L/v/+R/3P/kP+f/3H/c/+d/3X/TP+E
+/7H/of+H/3v/pP/w//7/8v8HAOL/h/9b/1f/Q/8d/wn/+P70/vz+7P7v/g//G/80/3r/qv+b/2L/
+Rv93/6X/j/90/2z/DP+C/mL+Yf4j/t79vf3G/fb9Qf6T/sT+yf7f/jn/bP8o/+X+6/7s/r7+e/4k
+/sn9l/2u/c79uv2y/dD9Ff52/qj+qP7U/iv/Yf9f/1P/Qv8K/8n+h/4r/sj9i/17/Xb9d/17/Yr9
+2/1m/tT+Hf9Z/2D/av+X/47/Wf9e/53/y//F/27/sv7x/cj9Iv59/tv+Qv+A/7//FgA0AOL/L/+A
+/jH+Jv4o/kf+g/6Z/nj+X/6Q/vj+Lv9c/9j/TACeAPMAFAHZAIcAaABiAHEAvwArAU4BEQHTAMYA
+pAA2ALz/gf+k/wkAQAD1/3X/Df+0/o3+n/7A/gD/TP+g/yAAggCOAIQAagAoAPH/7v/h/5z/nf8T
+AEQACQAAACEALgBhAMYACgEfAR4BNAFnAW0BPQEoAVYBjQGgAYwBegF8AVoBDAGLAN7/i/+3//L/
+OwCfAL8AwADYAK8AKgC//8v/QwDkADkBNQFCAWsBhAGWAZMBZwFVAXsBqAHXAQQC9wHQAcoByQG1
+AZYBfwGVAdcBAwIdAgACcAH/AEsB8QFHAl8CbgJgAkACAgJjAZ0AHgD1/y8AmgCvAIQAlgC2AHoA
+FAD1/yYAhgAbAdABUwJZAhMC3wHDAaABbAE4AToBYgFpAVcBLwH7AO8A7QC1AIQAhACQAMAAGgFv
+AY0BfwGOAZwBjQGXAagBlQF4AWsBWQE7ARwB8wC/AKoA0QAXAR8BwgCaAOwABAGOABIA5f/Z/9r/
+/P8mAEkATQApACMAJADK/zn/+/4Z/0X/f/+u/6P/cf9P/0//Lv/V/pn+s/7y/hT/HP80/0T/Pv9h
+/6T/0/8FADsATgA4AP3/qP92/2X/Fv+g/oH+qv6s/pn+rf7M/uH+Ev9r/8D/CABGAGMAeQBhAOj/
+lf+p/33/+f6+/r7+sv7H/sT+lv6j/tf+AP8b/xf/CP8g/1L/Uv8m/xL/7v6K/hX+//16/uT+6f7s
+/uP+r/6L/oj+kv6g/sP+AP9H/33/gf9w/2X/N//z/uv+Ef8q/0X/Z/9k/0n/M/8K/9j+tf6X/o7+
+xv4b/yD/7f73/iX/I/8h/2f/mP95/53/AAD+/4v/6f5//qj+9P73/gr/R/9s/5X/xv+o/1X/Mf85
+/0X/df+7/5H/CP/K/ub+7P7J/pr+hP6a/rD+mv5Y/jv+Zv6V/qv+qf6y/gn/e/+p/6n/tP/B/6X/
+Wv8I/9v+o/6A/tL+QP90/4//wv/3//7//P/+/wwANwBXAFMALwAeACoA+P+g/4T/Yf8Q//X+Nv+1
+/zMAeQC6ACABUQEoAQYBBQHWAIYAUgA7ABMA2P/H/+T/GwByAN4APgGRAdkB4gGnAXUBeAF/AVcB
+JQEYAQgB3wDJANkABgEnASUBHwE1AUYBQgE+AVABkgHLAbwBmwGbAWsB4wB4AF0APAAZAD4AewBs
+AEIAlQAEAfoA7gAPAQcBHgGMAecB2gF1AQwB2gCvADMAmf96/+v/NAA9AIgAxgCyAMUA+QDzAMwA
+swCnAJAAbgA5AAYAKABjAIYA2AA1AWEBbQGGAb4B1QG0AbQB6gEJAuABoQF3AUgB9gC/AMQAxQDQ
+AAUBGwHZAJ0AxgAYATsBLgH4AJIAdwCzAJ0AOgD0/7z/hv9i/2j/nv/F/8D/3v9JALgA+QA3AZMB
+zgG0AZUBtwGpATMB/AAeARYBFwE8ARkB0wC6AMUA4QDMAH0AbwCVAJwAnwCpAH4AGADm/wYAHADx
+/8P/2/8HABIAAQDx/+L/5v8QAEQAfQCuAJwAXAA8ADQAGQDg/5L/Rf9G/8//SQAfANH/z//X/+z/
+DQDa/4P/ZP9w/5X/fP8L/8D+zv7i/tT+2P7q/r7+hf6p/gj/Hf/v/vb+Bf8C/y7/RP8b/+r+zv7D
+/qn+fP51/n7+aP5I/m/+9P5V/0P/HP9R/63/uf+J/3//i/98/3n/qf/W/8b/lf9w/2z/g/+C/2X/
+Z/9r/zr/Rv+m/5//Pf8H/9X+nP52/lP+Yf6Y/qb+0v4s/xT/sf6f/q/+iP5g/mj+c/55/q3++P74
+/rH+jv6R/pP+nP6p/t3+Lf9L/zj/Hf/4/r/+jv6C/nD+Sv5H/mn+lf7U/v3+8/7l/u7+8/7p/gv/
+Of9K/4H/3f8NAO7/pf9n/0T/Of8Y/9n+uf67/tL+Df8X/+b+7v4l/1H/hv++/8z/wv+4/7b/0f+z
+/x//r/6t/qb+bv5G/l7+jP6i/uf+cv/V/+7/BgBUAKsApgBWACkALwD1/4H/av+T/5T/jv+h/6X/
+mP+9/xwAewC8AOMA/AAZAQ8BtwB3AIoAgwAxAN//tv+X/3H/eP+l/5T/Z//X/6kAzgCNAMQACgEH
+AQ4B+QC1AIwAeAB2AI4AgwBbAGYAtAD6ABMBSwGqAcsBxwHdAcgBggFfAVgBHQG/AHwAYwB5AKoA
+zwDxADkBjQHMAQcC+QHJAe0BJAItAgsC2wHMAbMBbAEyAScBQwF1AYkBhgGrAccBsgGxAdcB4gHC
+AbkB0AHSAYQBIAEjATYBAgHJAJQAawCGAMUA5AD8ADIBcgGWAYEBTQE1AT4BOgElAS4BRgEzASAB
+UAGFAYUBfgFxAUoBTAF0AXEBUwFGAUUBQAEgAecA0gDqANkAmACNAKIAlwCRAJgAnwCSAGgAVQBp
+AG8ASgA0AEgAUgBnAJwAnQByAHkAqwCWAE4AVwBpACkACgAcAPH/1//6//j////9/6L/Yv9a/zr/
+Nv9y/6f/x//P/8b/zv/I/8f/2//W/6//fv+E/5L/Y/8v/zX/cP+h/7L/sf+1/+X/IwBNAHIAeABP
+ADIAMwAsABsAEgAAAN//vv+1/7j/rf+U/4H/lP+g/27/N/86/1L/U/9O/yH/sf50/r3+KP8+//n+
+jv5I/jv+Mv4S/t79uv3g/Tn+Uv4w/kL+dP6F/qD+zv7M/sH+5P4j/07/Nv8g/zj/O/8s/yT/MP9m
+/6b/sf+T/4T/gv97/3T/c/9m/0D/SP+E/4//ev+C/27/Rf9B/zr//v7K/sT+vf60/rT+r/7Z/iz/
+Vf9T/z7/Dv8D/0b/Sf/y/sD+mP5o/nH+mf7A/vL+9/7q/iP/RP8g/x//L//0/o/+ef6Y/ob+Tv4j
+/h3+Pv6U/hv/dv9q/z3/NP9O/37/sv/K/7r/uP/9/1YAZgACAJz/oP/X/+H/uv+l/6H/n/+I/zz/
+6/63/rL+2P79/gb/9/4Y/17/Xv9J/2f/Xv/1/tn+XP98///+x/7K/rj+3f4j/2D/pP/j/zsAngC/
+AKUAkgCZAL0A/gArATQBBwHIANEA0ACXAHcATQD1/73/5f8/AH4ArQCzAJAAdwAxAOb/6v8GAA0A
+DABDAKoA1QDHAMMAmQA9AB4AcgABAXMBlQGbAc4B6QGiATYB5QCjAHsAnQAZAWwBYAFsAYwBeAF7
+Ab8B+AENAhQCEgL1AYkB+gCcADoAr/+S/wEAQAAlACEAUQBuAHIAogDnABMBVQGxAfQBCQL3AdEB
+ywHIAaQBwwERAgYCvQG5AfgBCQLQAbcB5gHrAbcBvAHSAZYBRgFFAYcBuAHLAdgB0AG9AZYBWgEy
+AQcB4gD4AC0BRAEOAZUAhQDlAMAAQQAkAEYAXACPANkA6ADTAPkAUQFkARUB0ADIAMAAqwDBAOoA
+7wD9AFABwgH4AeoBvgGNAWUBLAHhANAA6ADGAHcAUwCCALEAxQDqAAgBDgEXAS4BPQE9ASwB9QCa
+ABcAjf9C/zb/HP/x/vL+NP+Z/+T/GwBqALMApQAvAP//WwBcAN3/o/+Y/3X/Yf8y/+f+r/55/mr+
+l/6i/of+wP46/3r/g/+Z/8L/vv+W/4T/a/8y//j+wf6f/mr+Bf7X/Qz+YP6U/sb+L/+w//3/8//M
+/7f/pP+I/1H/FP/z/tP+zf7j/s/+sP7E/uv+5f7M/vv+W/9c/9/+jf68/u7+1/6i/jv+6v1d/v3+
+C//k/tL+vv6Z/nn+TP4b/hP+GP5F/qj+2/61/pv+1/4t/1n/Xv8s/77+mf71/i7/9/7a/in/bv97
+/3//X/8u/z7/b/97/27/R/8e/xX/C//W/p7+pv7L/t3+A/9E/z3/9/7q/hj/OP9P/2f/g/+L/1n/
+Tf+Y/5j/J//L/qz+qf7H/r7+YP42/kT+Lv4+/oH+if6I/sH+8f4B/+n+wP7S/vn+8f7y/iH/J//o
+/tH+E/96/7f/pP+I/4f/kP/A/9v/nv9v/6L/5v/3/9r/t//G/7j/Uv8T/zr/ev/U/zoAXABdAHgA
+qwC7AHcAJwAbADQAOQAoABMA8v/Z/9v/3//K/5//cv87/y3/iP/c/+3/GwBGACUAGgBvAMMAuwCJ
+AIcAugC9AFcAAwAkAE4AJAD+/w0AKwBiAL0A2wCbAI4A4AAaASYBPAFWAVUBXwF/AXgBWgFwAcgB
++gHRAZcBiAHKASgCOgIUAgMCDgIfAigCBwLVAcIBxQHDAa8BiQF2AZMBqQGjAaEBXgHpAAYBeQF6
+AUYBOwEzARwB8gDJANMAxAB5AGgAvADpAMsACQGQAakBZgFcAYoBrQHtAUUCWwJGAm4CoQKLAlkC
+FAKpAWIBZwFzAV4BNQEPAQwBJgEuAQQB/AAZAQoB8gDQAIQAYQCLAJwAfAClAPkADAEjAWABbAEt
+ARUBLgEXAfcADgEuAeMATAAyAIMAggBQAEIARACAAP4APAEoARYB7gDGANoA0gB7ACYADQAEAN3/
+vv+E/wb/s/7j/jr/XP9m/1n/UP+l/x0AEAC+/7v/rP9z/4P/qP+v/8n/3f/H/6r/rf+x/8T/CQAl
+AO//0f/5/x4AAAC//6P/vP/g/wMABgDB/3X/Tv85/x3/4P6y/un+SP9n/2j/af9D//b+vf6Z/mz+
+Xf52/qL+r/5j/i7+T/5A/tL9kP3k/UH+Q/5X/pb+pP51/lr+Xf5J/jT+Hf4G/kb+rP7k/gr/7v6p
+/pT+jf5w/lj+V/5n/ov+q/6S/nT+jv6m/qT+sP7p/i//QP9I/3P/nP+I/0H/DP8V/yH/3/6f/nf+
+CP6Z/aT9z/29/eX9Sf6J/tn+Nv9Z/1X/Tv9B/zv/MP/9/sb+rP6M/jr+Bf4j/ij+GP5W/vL+rP8c
+AD8AVABqAGgAXgBiAEIA3/93/0L/Gf/k/sn+1f7b/qj+b/6m/kv/0v/+/y0AYQBSADkALgDp/4n/
+Q/8h/zv/Vv9G/0D/S/9N/zL/Qf/M/zIAFAAlAIcAoQCBAIQAfABMABQA5P/X/9T/h/8R//P+Lf9o
+/6n/BQAbAOH/6P8hADYASgBfAEAAJAA0AD4AOgBFAEwAPwBPAHsAoQDTAAsBHwEnAVsBlAGJAXMB
+bgEnAcQAtgDCAK4AiQBYAFUAZwB5AKcAtQDPABcBQgGDAcYBiAEfAUkBsAGoAWUB9gA5AO3/UgCV
+AIwAswATAXYBqwGvAagBhAFPAUkBdwG0AcMBhQFpAbYB3gGZATsB4gDCAPEABQEAARgBPwFtAaIB
+0QHiAc8BwAG2AYoBYgFfAU4BGgELAScBNgEyASQBLQFAAU0BaQGFAXwBWgFwAacBagHbAJsAngCY
+ALEAtQBxAGYAgwBfACoAKgBZAIIAiACTAKYAhwBdAHAAiABnAEYAVABlAEQAGQAiACsAHAAuAEYA
+JgABABAABwDQ/8j/BABFAH8ApAC2ANgA0ACWAIQAogDOAOAAtgCZAL8A0gCHADoARABgAG4AjgCz
+AMkAvwCdAGgAJADv/+v/9v+5/2H/e//W/+f/z/+1/4b/bP90/3j/hv+E/03/Tf+d/5P/Lf8d/2L/
+dv9A/yT/LP/+/t7+KP9s/0//I/8i/0T/nP/L/47/Yf+F/8v///8TACoAVAB0AHUAaABiAG8AfQBt
+ADAA2f+b/17/EP8O/0X/Vf9D/2X/vv/B/3f/cv+e/6j/of+Q/0D/4/71/iL/4f5k/s/9Uf1k/ev9
+Yf6S/oT+dv6L/oX+c/6b/qL+Nv7R/eb9PP5n/j3+Lf5l/mj+fP4O/47/rP+//7//kf99/5b/o/+W
+/3T/X/91/43/jf9o/yX/6/7v/hP/Dv/n/sD+lv5W/iv+SP5x/m/+gP6s/pn+oP79/jb/P/9s/7T/
+lP8q/0r/uP+b/zr/EP/o/u7+Wv+6/9v/7P/t//3/GQAFAO3/LACWAM8A7wD7AMkAcwA3ABMA1P+E
+/2b/Xv9I/1L/af9j/2L/av9g/1n/gP+o/7j/6/8AAND/vP/g/x4AVQB5AJgAhgBOAFcAbwBXAGkA
+sQDiANoAuQB3ADAAGwDu/8b/AQAxANj/ov8hAJAAsQD0AAgB4wD9AA0B0wCRAFEAPABXAEwAGQAd
+AFAAOgDj/6n/mv+i/7v/CABuAIUAYABSAE0AWwCCAIQAdgCkAPsAQQE/AecAjgCHAKwAqwCOAK8A
+BwFDAXEBqwHEAb8BtgGpAa8BwgGvAXkBgQG5AcgBswF+ATkBBgHcALgAswCXAFUAYACCADwA5v/P
+/+X/KQCHALwA9AA2AUIBYAGnAa8BgAFzAZEBigFiAWUBcgFaAXYBBwJ6AlAC6gHBAc8BzQGzAZ8B
+fgFAARgBGAEPAQABCwEpAS0BEQEAARsBQAETAbkAhgBkABwAwP+2//L/9P/C/8L/+/81AHsA4QBQ
+AX0BHQHUACcBPQGwAEwAMgAKAAMA8v+l/2n/Rv9b/7T/2/++/8T//P/6/6n/sf8LAPX/k/+J/6T/
+d/9B/0n/T/8p/wH///4S/yv/XP+c/7T/k/+P/6T/if9e/0b/PP9F/2X/jf+l/57/af9B/zv/Gv8E
+/yT/Nf9J/37/e/8z//T+6P71/vH+9v7//sT+ev6L/qv+j/5l/jv+Rf6a/s7+x/7k/vj+rv5x/oT+
+c/5A/jr+Vf5+/sT+CP8O/9/+xv7y/ib/L/83/0X/P/8q//H+uf7I/vX+Dv8a/xv/E/8p/1L/J//F
+/qP+zP70/gD/9f7c/uP+CP8+/2H/Uf9i/5D/gv9S/0j/XP9F/+/+uP63/qT+qP7K/qL+dv6F/nX+
+XP5m/nv+of69/rr+z/7c/qr+ff6P/n/+Kv4n/nb+if5y/pz+4f72/gH/Ef8Y/wz/8/7h/uP++P7y
+/uj+C/8y/0D/O/81/z3/Tv+V/+7//v/t/wEAPgBYACkADAAqAEkAUwBiAHMAbQBSACkAAADt/+T/
+3f/7/wkAqv9K/5H/BgAiAEcAfABYACMAOQBrAJUAfgAhAAUAPQAxAPP/+v/s/7j/3/88AHIAjgDE
+AAABKgFiAbQB5wG/AWABEQHnAPcA+gDdACMBsQEAAhgCDwLBAVkBLwE4AVsBhAFyAVMBewHOASQC
+JwKYAQEB3QABARcB9QDQAMQAwQDjABMBBAHZAC8B1wEYAgkC9QHEAa4BxgGpAWUBPwEcAR4BaQGx
+AdEB7QHzAecBFQJUAkwCJwIKAvwB9wHEAZYBnwGoAZ4BgAFMAUgBgAGeAb4B+QEFAtkBvAGnAW4B
+QgFdAYYBlAGvAb4BnQFXARMBDwE2AUEBTQGEAasBggFjAYsBbQEDAeEA4gCTAGoA6ABGAfwApwCP
+AIQAkwChAG0AOwBEAFMAdgCmAGYAzv97/3j/g/+v//X/AAC9/7D/AgAyACwAMAAzAD8AZwCGAIoA
+bgA1ABEAEQAJAPT/9/8XACIAFAAgAEQAaACLAJcASgDT/7n/3v/g/9//8f/o/9P/wP+X/2v/aP+S
+/6v/pv+v/6v/fP9T/0b/O/84/z3/RP9l/4P/b/9T/0v/Nv8w/0j/Pf/u/sr+9/7y/qf+c/5P/iX+
+Df4s/nP+oP7F/gL/V/+X/57/jP9s/1v/eP+o/6X/WP8i/yf/L/8E/7z+qf7H/tf+1f72/kX/dP+B
+/8v/FAD//8b/jv9D//n+t/6S/pn+l/5q/jT+BP7L/Zf9wv1P/qX+qv7t/mP/gv9b/zX//P6v/mb+
+Rf5Y/jP+uP1y/Zv93/3r/QD+fv4L/17/p//t/+7/ov9I/xj/Mf8y/83+cP5X/jr+Cv7f/cP9zf0K
+/mv+z/4N/wn/E/9i/4//g/96/2j/Vv9b/2v/cP91/57/rP+B/2H/Yv+D/67/t/91/yv/Vv+w/5T/
+P/9F/2L/Tv8z/xv/Dv8P/wn//f4B//r+0P69/sX+mv55/sT+IP8e/+X+1/4O/yL/BP///hT/Wf+p
+/8n/BgBmAJcAsADSANQAuACeAGEAIwAnADoAQQBLACoA7f/y/ywAPAAsACcAIAAWAC0ARAAQALr/
+mP+9//T/LABwAGMABAD6/3UA3QDYAJoAZQCKAAABLgEJAfYAAAEhAVcBbAFHASMBIgEjASQBOgFE
+AQQBzgDzABcB+wDPAN8AFgEhASEBMAFGAXYBpwG6Aa0BlAGeAdQB7gHPAaQBhgGDAYoBjwGNAVIB
+EQFAAYkBhgGAAYUBgAGbAdcBAwIHAtQBkwGaAboBhgFgAX0BTAH7APgAIQFKATgBCQEkAWQBagFV
+AVABPwE4AVcBYAEqAfMA9wDoAJAAcwDQADIBQAEqASUBLAFbAZcBpQG2Ac8B2gEDAiUCEAL6AdkB
+kgFcAVsBawFVAUgBYQFhAUgBPwE8ATEBLQEqARgBJgFQASwBrQA1AAAA+P/e/8T/mf8x/9f+3P4P
+//v+0f7h/ub+Dv+J/+X/+//w/+D/EwBZABYAqv+3/8b/d/85/zn/NP8W/zP/bf9c/1v/q//P/67/
+rP+z/6H/n/+m/5j/f/+C/4X/ev9y/1T/IP8T/zH/QP9Z/57/8/8rAEEATAA1APv/sP9Z/wH/uP6c
+/qD+of7P/iX/Hf+Y/lb+hv6F/nL+q/7Z/t7+7/4D/wv/5v5p/vP9yv2z/az97v1a/oj+Yv5V/nv+
+j/6m/u7+Sf97/5j/1f/0/7L/Wf8h///+Bf80/2X/ef+O/87/BgDq/4r/L/8A/+/+2P6n/k3+4P22
+/dH91v24/cn9Fv5w/sz+LP9//6P/m/+A/2b/gP+S/z3/sP5r/pH+d/4N/vn9FP47/ov+vP7e/g//
+Ev8Q/z//N//p/vL+Wf+N/3X/cP+H/1P/+f7t/vH+y/6m/pH+nv7w/jv/Pv8y/zT/Ov8k//b+7P77
+/i3/gP+m/6P/p//G/+b/1/+c/2f/VP81//D+0v7+/in/Qf9X/2L/av+T/8j/tv+p/wMAUQAsACAA
+jADcAM0AxwDPAJoATQAeABYANgBHAEAAYwCMAHsAbwB6AFkAFgAEABsAKQBdALcAAAEQAQEBDAEa
+ASwBTgFdAWIBYwF0AaIBkwE5AfIA5QDQAI8AbgCPAMMA9gAZASwBOgFHAXUBwwEHAjkCTgI4AggC
+0QGsAY0BXwE4ASYBCgHMAH4AJAD+/y0AWABDADMAZgCyAAEBUwGTAZEBUwFlAdIBAQLSAY4BcgFz
+AVIBHwEXASQBJwEsAV8BtwHnAeYB3wHAAX8BdgG8AfgB7QHCAbQBtgG0AbEBmAFrAVMBYAGcAQIC
+NAINAg4CSwJbAkECJwIHAr8BTAH0AMMAjABjAHQAxQDoAMIAyQApAYgBdQE0AQwBwgB4AHQAgwBs
+ADwACgAWAEkAKwD7/ysAXgAyAA0AKAAoAPH/vP+W/4L/p////zMAFwDv/+b/2//S/9H/xv+u/4r/
+jP+2/7z/p/+V/4D/g/+6//7/KwApAPH/1//5//X/sf9m/0D/NP8a/+T+lP5a/mX+mf7L/gr/O/8r
+/y//ff+C/zL/A//G/m/+Vf5M/kT+S/4j/hr+X/53/lj+X/6n/vv+KP9V/7D/z/+k/7z/1f+M/1T/
+Xv9c/1z/iP/A/8P/i/9Z/2r/pP+6/57/t/8CAOz/ev86/2n/nv9+/1H/O/8r/z7/e/+///z/BQD1
+/xgAPAAQAOH/yP+m/5H/iP+N/77/9P/V/4n/Rv8W/xj//f6r/qP+zv7A/qn+s/64/s3+Gv9o/3L/
+af9c/wn/qv69/gH//v7Y/sr+t/6z/uX+FP8m/2L/1f8SAOP/i/9I/0X/af9l/1T/bf+n/9X/0P+u
+/4v/Wf8u/zT/T/9f/3f/f/9n/2v/ff9n/z3/D//y/gD/MP80/9/+vP78/vD+jv5d/kL+Pf6K/uj+
+Iv9n/4T/Pv8C/xX/Iv8X/yD/GP/i/qT+bP4s/hX+VP6G/m/+j/4j/6D/vv/M/+n/CgAsADYAPwAy
+APj/5v8FAAAA2f/E/8T/2P8AADgAewDPAB8BRQFxAaABhQExAdIAiQBJAPX/0f8ZAHcAlgCZAG4A
+SgDBAEQBHgHmANQAigBlAG4AOgAFAOn/w//B/87/yf/p/zQAawCbAOkAQAGNAc4BDwJgAocClgLx
+AkIDMwP8Ao8C+gHFAc8BiQEqAfYA9AA8AW8BSQEuAUIBXgFtAWoBXwFHAUIBaQGYAY0BRwEeATAB
+VgFxAWYBVQF5AccBAgLkAXoBEgG3AJ0A6wAxATkBQAFbAYMBvQHSAbABkQFvAWsBtwEBAhQCGwL/
+AZUBOQEMAaUA/P+R/6b/5P8DACgANwAqAE4AhQCVALUADAFOAWUBfwFuARkBrwBgAGAAbgBYAGMA
+dgBpAHMAZwAeANH/0v8mAIgA4gAUAQMBzwCPADIA0f+x/9b/IgB0AIYAgADBAPsAyABfAAoA2f/Q
+/7f/Uv/5/uv+3f6n/mX+OP5B/n7+xf73/ir/Wv9q/4H/v//o/7v/dv9Q/0n/bP+S/4X/Tv87/0X/
+Hf/V/qn+wf4N/1X/gP+H/2T/M/8z/1//f/+P/6D/2P9LALoA5wDHAH0AUQApALz/S/8M/97+vv6Q
+/lL+DP6p/Uv9Zv3X/f39Hv58/rn+Cv+b/9P/kf9f/1j/d/+n/4n/Ef+B/gr+uv2U/ab9xv3G/Q3+
+2v6d//7/HAAiAE8AlgCiAHIAYQBiAA4Anf9I/9j+cf5I/lL+i/7c/iT/T/9z/6L/yP/r//b/1v+Z
+/0f/B//U/q7+p/6x/qz+pf7B/tD+iv5R/q7+Cf/N/ov+pv7N/sj+iv5K/lD+d/6w/un+rf4t/gz+
+Tv6I/mn+JP4i/kr+av6X/qr+iP6I/qf+mP6S/pr+f/6H/uv+Rf9S/2j/mv/M//f/7P+q/3b/e/+g
+/7P/yv/D/3v/Xf+O/7H/qv+l/8D/8/8vAEsAHwDg/7T/s//i/wcAPABoAA8Ab/9h/83/xP9K/xr/
+Tf+V/8b/3/8GABgA4f/b/zoATgAAAO7/CAAOAEoAoQBfALL/lP/h/77/Yv9o/7j/FABoAIMAbwB9
+AK0A1wDwAAMBJAFPAZEB5gEBAsYBkAGfAcIBzQHKAckB2QHiAcsBqgGGAWwBXgFWAYIB2gHuAc4B
+zgGpAWABhQHLAZUBWgFuAWsBaQFzAVwBaAF+AZAB0wHxAaMBbAHAARwCCAL+ASgCHgLiAdUB9wHp
+AbYBtgHiASECeAKVAlUCAQLXAf4BPwItAuwB8AEHAswBewFmAW8BeQGCAYoBoQG+AcgBtwGoAdcB
+KQI3AhwCKAIhAuABgwEiAewA3gDVAMkAewD+/+v/RABkAFkAZwBHADYAiADXAPUA8gDGALIAswBt
+AAoA2/+u/2f/Mv8s/zz/Qv9i/6H/xv/b/zAApADVAMkAtwC+AOwADgHgAJEAaQBhAFcAaAB3AFIA
+RgB+ALUAugCxALoA0ADpAPUA2QCMAAMAdP88/xb/tf56/qP+5P4x/5v/sv+B/7P/GwAAAHL/3/55
+/kj+Uf5Y/j/+L/4D/tv9Df5M/lT+df6m/qb+xf4s/3X/av9Y/4L/1f8OACYASgByAFgA7/90/yH/
+8f6d/jP+B/4Y/kL+dP6Q/pX+o/7R/h7/S/8k/wL/K/9d/0H/6f6x/qL+nv6//gH/Df/+/jP/Z/9X
+/zP/Jf/q/nD+aP7d/t/+jP5r/j7+Cf7v/ef94/3H/dH9Rf6+/tf+3/4V/xb/xP6N/nT+Hf6L/Tv9
+WP1z/Wb9gP27/ff9Vf65/tj++f5l/8L/7P/t/77/ov+1/5b/L//n/tr+3v71/iP/Of8j/wv/Ev8x
+/13/lf++/+z/JwANAK7/df9J//7+Ff+E/3X/Pv+V/+v/of8g/+L+1P7o/i7/fv+D/zn/BP8h/zf/
+6P6g/sL+Bv80/2f/rv+6/3v/fv/l/yAA+v+p/37/nv/n/wgA6P++/6v/0f8uAEMA/P/o/zEAbABb
+ADcARgCPAM0AxwCnAKcAvwCuAKUAEQF9AVAB/gD0AOAAswCVAGUAMQAzADUABgDg/73/uP8ZAIkA
+qwD1AGkBmgG+AQMCLAIQAsEBWwElASgB9wCcAFMA/v+8/8//AQAZADEAhgAkAb0BDwIJAgICOgJV
+AisCEQIkAikC3wFmAQoB4ADjAOsA9AAaAXUB8AE6Ak8CYwJyAmMCIAKsAWQBXAEhAbcAigCjANIA
+5wDaAN4A8gDhANgAEgE1AQEB4gD5AOQAwgC/AJ4AaABQAEoAZwCkAJoAcACcANAAyADnAD4BQQH0
+ANcA7AD4APYA9gDrAMcAoAB/AIEAwQAFASQBWAGDAWMBZwGrAZcBLgH6AAoBMwFfAXgBawFOAU0B
+SQEpAQ4B+gDgAMwAwwCQABUAwv/F/7//lf+e/+X/2f+N/63/FgBFABsApf9E/3T/t/+K/1n/Uv9N
+/3T/qf+//+H/BgArAF0AgACJAGcAHAAJADIAIgD1/9D/lf94/5n/q/99/3//tP+i/6H/+f8eAPT/
+4f/f/8v/pP93/3j/m/+r/5n/cf9A/xD/JP+A/6P/Z/83/z//Yf+l/8n/lP92/7H/zP+9/8f/qf9p
+/yz/4f6W/mL+Kf79/fH9zf3Y/S3+Iv7z/UT+sf7k/uv+6f4O/wr/wP6b/pP+g/6G/qX+v/7I/vH+
+Df8I/zv/ev+f/+f/FwAEAPb/5/+u/1v/D//8/gz/+P7W/qn+ef6S/vT+Kv8Q/xD/TP9//3r/U/8w
+/yD/9/7C/rj+h/4X/uT98/3t/dD9y/3y/UP+gP6g/uv+H//5/gj/U/8q/7b+hP5y/k3+Nv43/hX+
+1f39/YX+z/7K/sb+Bv9U/1X/Nf8y/1L/hP+V/5P/mP+D/3r/nP+i/1b/Fv8s/07/S/9U/4D/nf+/
+/yUAfwBbAB4ALgBWAHoAbgD1/1f/Ev8C//b+HP9C/3H/LADnAPEAuAB8ADIA9/+d/0T/Ov81/wr/
+Ev87/1D/YP9//6v/4P8/ALYA9QDuAAcBUQF9AYcBeQF9AaYBowGGAawB2gHZAa4BPwHHAJIAfwBZ
+ADgARgB8AM8ABwH1AK4AbwCDAOgAPwF1AaUBpQFzAW4BawEJAacAowDAAMUAzAD1ABYB6ACPAKYA
+EwEfAfcAEgE2AWwB1AH+AeEBqwFeAVsBlQGLAYwB5wElAhMC+QG+ASYBYADs/w8AXABkAFQAbgDp
+AHcBdgE5AWIBtwHxATICfQKhAroC2wKlAhUCmQFcAV8BaAE9AfwAzwDNAAMBQgFYAW0BngHVAegB
+wQF6AVoBYAFIAU8BgQFvAUcBawGAAUQBGAEXARcBCwHrAOYA7wDCAJQAlgCBABIAn/+c/8r/5/8Q
+AC8AIQAIACcAVABEAEMAZgB3AKoA6ADYAKUAmQCEAEkAIwASAP3/EwBOAEkACADo/wEAMwBtALQA
+4ADnAAsBTgF/AYIBWgEtASABCgGmACYAvP9V/wr/2f6O/lH+RP4h/hb+Uv6G/q/+6v4Q/0z/w/8e
+AEMAMQDv/8v/z/9l/4L+8/3V/cf91/0Z/lr+m/7+/rz/iwCwAGsAMAAFAAkA8/+N/zX/7f5//jT+
+Dv7I/Z79yf0E/jD+of5A/47/sv/2/w0A8v+6/0r/6/7R/qT+Ov7a/bn9yf33/S3+a/62/tz+2v7t
+/iH/Bv98/h7+G/4U/gj+D/7+/fP99v33/RH+C/7d/QT+YP55/ob+r/7A/rv+k/5U/iP+3v2h/Y/9
+kf15/VX9lP0h/oL+rP7d/iX/Xf+b/9r/tP9A/wX/If8//y3//v7J/q/+uv6//sf+/f4n/yL/HP9O
+/6z/pf9F/yX/Rf9H/yr/GP/k/sX+G/9n/0f/JP8T/wr/Zv/W/wAAGAALAP3/PwB4AEwAEAAHAPz/
+4v/l/+7/p/9P/4H/7f8AAP3/OAB6AJIAkgCDAHMAdQB/AHwAWgAaAPv/MQBoAHMAnQDiABMBJwEU
+AfYAzACDAE4AQgBfAKwAyQCOAIIAtwDzAE0BnAGlAYYBXQE7AVcBaQHVAD4AWAB8AFsASQBNAFwA
+cQCBAJcAnQB4AHYAtgDTALwAuQDKAMUAkwBjAGYAegCiAOEA/gALATIBRQE4ASsBJQE6AX4BvwGn
+AWEBSAE6AS0BMgE8AWIBfQFlAVQBUgE5AR4BIQE/AVUBVAFfAWcBUQE/AUsBVAE1AR4BSwFJAc0A
+ggC3AOUAxwCeAHgAXQChAB0BSwFWAWYBXAGbAfoB2AFoATUBMQHXAGEAUwBQABIACABVAJYAygAs
+AXsBigGPAY8BgwGQAYABIgHSALsArACaAJAAhwBnAGoAqQC2ALAA5wAxAWsBkAGtAbQBkwFeAR4B
+3wCeAE4AGgBTAOIASQFBAcoALAADACYAGgDu/6T/Qf8U/xr/Dv8c/yT/zf6b/uT+D/8E/yb/Tf9J
+/1L/pP8NAAYA0/8sALgA7AAPAUUBVAEpAboALgDY/5D/MP8U/zX/MP8z/2L/g/+W/6T/t//j/wMA
+/P/8/xgAEQDV/6f/jP9K//P+1v4M/1L/dP+N/6X/p/+x/7v/f//7/qb+1/4C/8j+n/64/tr+Af8C
+/+n+8v7f/rb+3P4b/wf/wv6t/rj+pP6H/mn+EP6X/Wr9h/2j/Z79nP3C/Qv+YP6N/rT+D/9E/yL/
+D/8e/x7/Bf/b/pv+Vv4x/jT+Rf5K/mH+fv5k/kH+ZP66/ur+8f4e/1//b/9H/xL//P4F/z7/sf8T
+AP//qP/J/xYAw/9O/0j/Ov8g/0f/Vf8q/xD/8v7A/p7+ZP4p/kX+lP7J/t/+4P64/pr+2/4q/yX/
+Cf8H/yn/fP/J/+H/0P+m/23/PP9C/1T/Qf9G/1v/XP9o/5P/pv+I/4r/u//R/8n/wv/V/xsAagCA
+AGsAVgBbAG0AXgApAAAACQD0/8H/yf+y/zn/Bf93/9b/6v8sAGEAcgCtAOsA9wDdAJ0AgQCVAFEA
+w/9j/yL/7P71/jX/jf/j/zQAwABFAV0BTwFEASsBLgEoAfEA+AAvAdsASQAkABMA3//g/+b/1//6
+/zsAkgDaANYA3wApAVwBYAFCARcBEwEWAd0AlACIAKUAwwDTAPoAEgHoAP4AVwFTASgBKQE6AVsB
+UgEiAUoBkwGKAW4BQwH+APQAMwFUASIBIQGZAfMB1gGgAZgBmQGkAdwB9AHNAcQBzQG9AcoBCAI3
+AkgCXwKLArUCqQJNAvoB+AH3Ad4B3gHbAbkBjwGTAaEBbQE/AUQBIgHoAOUA1wCQAEwASQB2AKEA
+pQBmADYAWACTAKgAjQBaADkATwBkAF4AggCvAJQAawCHAJUAXAApABIA/P8HAEMAXQA0AA4AKABa
+AFAAFAAUAFIAYABDAE4AbgB1AHsAhgB0AFMAPQAnAC0ASABWAFwAXABZAD8AHQAmAB4A1f/T/0gA
+mAB5AD8AKQAZACQAUwBPAB0ALABbAFEAaQBuAOb/gv+m/8X/vv+3/6L/rP+w/1//Pf9x/2H/Hf8p
+/1X/RP8z/yf/8P6q/o7+pf65/uD+H/8l/w//Nv9f/z7/Kf9D/2P/lv+//7X/nf+M/1j/G/8n/0L/
+Kv8B//L+D/8e//n+4f4k/4//lP9H/wz/5f7M/rL+hP5b/j7+Hv4C/gL+8P2K/Uj9sv1E/ov+tf6j
+/nH+lf7n/gz/3P5t/l/+uP6b/vD9gf14/Wz9Z/2h/d39AP4r/k/+fP6y/uL+B//6/s7+vv7E/vL+
+T/9b/y3/Zv/M/73/ZP9W/3D/UP89/13/aP9m/4D/jv96/4z/1P/x/7//ff9d/2T/S/8E/+7+Lf+H
+/4f/Dv/V/kj/yP/V/6X/ff9r/2n/W/9P/0L/8P6L/oH+rf7B/vT+ZP+J/0v/VP/Q/ygAOAB2AOgA
+EQEAAQkB7wDIAKsAPwDO/77/zf+u/3H/Sf9q/7z//P///8//0/8WAEAARgAwAAQAGQBrAGoAKgAL
+APT/7/8zAKcA2gDXAAQBNQEhAQABAAHJAD8ANwC4ALwAcwCAAIYAcwCXALkAuwDEAOIAMwGgAbAB
+WgE4AUgBIgHlAMEAnQBtAF0AbQBrAGIAcQCLAL8AAAEmAUUBWwFvAbEB7AHNAXEBPwFmAYUBVwE5
+AUABLQEiAS0BKgENAe0ACwFbAY4BtwERAnsCpwKdAnsCLQLoAdQBxQGjAZYBnQG3AeMB0gF+ASUB
+8wDqAOQA7AAjAU4BCQGIAF4ATQDH/1z/gv+x/9n/TgCmAHoAUwCSAPEABQG1AHUAmADfAO0A0gDD
+ALYAkACEAKIAhQBPAHIAvwDuABcBMAEbARkBIgEMARIBHQENASYBZQGBAVcB+wDGANoA1gCMADIA
+7v/I/73/pf9x/zX/Dv9G/7L/rP9q/43///98APYAUwFdAfIAZgA2AGYAWADS/1v/Pf82/x7/E/8O
+/wz/Qf/H/0EAZQBpAG8AgQDGAPEA4ADqAPUApwAkAMb/dv8m//X+tf6I/q7+3f4Q/0H/Jf8T/z7/
+V/9o/3r/ev+A/2z/HP/R/sT+1f7N/tf+//7v/s/+FP9q/0n/Fv8C/8b+tv7f/uL+1P7E/qL+r/7X
+/q7+P/4E/h/+I/79/TT+tv7W/pn+a/5O/kb+T/4q/tD9lP2n/fD9R/6J/q7+xf7g/k7/4/8CAKP/
+JP/q/gH/JP8i//z+7f4a/zr/Lf8//3T/f/9r/2z/Z/9G/xP/4/7T/sH+gf5A/ij+HP4m/m3+z/7W
+/pj+iv6O/pb+wP7b/uP+Bv88/yz/yv56/nv+ov7Y/ib/b/+l/43/Lf8P/0r/Xf8o/xX/Nv9h/4X/
+e/9w/4z/iv9U/1j/rv/Q/8L/5/8BAOX/3P/u/9L/ov+h/7n/r/+E/2n/c/+d/6H/af9V/6L/9/8U
+AD4AUAAuADsAUQAgAAsAFADY/4//Yv9M/1//XP85/z7/W/9b/1P/Rf9g/9H/LAAhAPj/9v/q/6P/
+av9z/5X/zf8XADMAXgC/AOIAtwCuAOkADwEUASUBFwEDARkBJgEQAfIA9gDwAM4A4wAdATcBDwHY
+ABIBfwGIAV8BcwGdAYQBSwFAATwBDQEGAUIBWAEWAcwAvwCxALIAzgCrAJUA2gAVAR8BOQFkAWcB
+dAGQAVoBCgH7ANAAiQCPAJkAcwBYAHgAuQDXAPEAOgF+AZABggF2AZEB5QEXAuUBkwGJAcwB/AHt
+AcYBnwGVAcIBDwI7AjMCIQIuAmcCpwKnAksCzAF+AYcBqgF9ASsBHQE5AUEBEQGYACQAOACtAOcA
+yQCLAF4AZABuAEsAGQDP/2//WP+l//7/IQA2AEYAHAAEAFsAtwC+AL0A3gAIAToBYgF0AUwB5wC+
+APkAMwE8ARgBwwCMALcA1QCOADkAHAASAB0AUgBqACkAzv+y/7f/mv+G/7T/7f8IADEAawB+ADgA
+7//5/y0AVgA/ANX/Qv8R/4X/3v+z/4L/bv+R/wAALgD//9X/vP+//9D/pv9R/yj/Fv/8/jD/mP+W
+/yL/uv6t/tj+8/7l/sr+1v4h/1v/Uf9C/zT/JP80/0P/Vv+q/wUAHAACAPv/MABXADEA7/+r/23/
+R/8f/+X+t/6u/u7+VP+I/4X/Yf8w/xj/+v63/of+eP5W/kr+nf4C/xb/+f7a/q7+f/5e/lb+ZP5v
+/oj+wf7A/kD+1v37/Sb+Cf7s/fH9Cf5U/tL+IP8n/yv/M/8S//T+AP/z/tD+5f4T/yv/Hf/Z/m7+
+Hf7//en97f0W/kH+bP6Q/p3+jP5o/kz+c/7w/nD/r//M//3/JQAWANv/kf80/8j+hv51/lj+/v2m
+/cz9Gf4H/hL+gf7w/mb/9P9ZAFgA+P+P/3n/p/+Y/0D/9/69/qH+pf6c/oX+iP7g/or/QADDABAB
+TwFdAQgBkgB2AJMAcAAyACAAJQAgABwAMQBHAGMAgQCnAP8AUQF0AYgBfAFFATEBNgEQAdAAnQBt
+AE4AWAB0AIYAggBuAFYAYwCsAMIAhwCTAN4A7wDSAKsAkACiANQA6gDwAPEAtQB3AJcA1ADdAM4A
+7QBDAWUBSAEzAf4A1QDuAAkBCAH9APcAAwEOAf4A8wABARkBSgGQAcsB2wHLAckByQG9AdQBAALp
+AZoBcAFiAT4BHwEKAd8A2gAAAQcBDgEtAU4BcAGMAbEB4AHQAZABiwGkAYQBTAEYAdoA2gApAVwB
+ZAFoAYIByAHaAakBhAGaAd4B1wGjAbQBrgFKASIBZwF7AVgBXwFiASwB8gDJAJkAdgCEALoA5QDM
+AJoAqgDdANwAowCTANEA8wDqAPIA3wCOAEQALQBDAGsAZAA1AEQApQDmAPIA9wDNAJAAdgBRAC4A
+NgAMAK7/av8m//L+9f77/v3+Iv9S/2z/d/92/2j/SP8w/zv/Rf82/xb/8f7x/h//c/+z/47/Tv9h
+/7H/4f/b/9f/8P8eAEsAYgBOACMAAQDm/+L///8RAAwA8P/C/7f/4v8BAAAA/f8HACAAKAAdAAIA
+x/9u/yP/Ev8X/xj/OP9B/+T+aP5N/nb+if5u/iz+8f0D/lL+l/7G/uD+0v7L/vr+Cf/V/sj+3v6r
+/mT+X/5K/v/94P3+/Qn+Bv5C/rT+Ev8p/x7/Rf+C/3n/Rv8c/xL/Ov9I/wP/zP7n/gL/yP57/m3+
+dv5+/rT+AP8l/0H/X/80//r+Fv8R/4X+9f3a/SD+fv6q/ob+S/6B/hP/QP/6/q/+hf5+/oz+kP6n
+/qf+QP72/Sn+UP4n/g3+Hf4N/gf+Wv7A/s/+xv76/iT/Lv9Z/4//i/+D/5D/fv+U/8f/fP/k/pv+
+kf6d/sb+2P7E/s3+Ff90/7L/kP88/x7/Mf9S/5H/7f8nAB8AJABXAFEA9/+0/6X/iP+A/7r/1v+F
+/yv/Wv+3/43/QP9i/8X/KgB+AJ8AjACMAKcAnQB1AG8AiwCjANgAKwFVAUQB6ABdACIAOgAxAOv/
+tP/F/wAAWQDAAPoADgE5AXYBqgHSAecB+QEEAu4BtQF4AVsBNAHwAMMAnAB4AI8AxgDrACQBjwHr
+AQwCEwL1AbUBpgG7AaABswEgAjwCygGCAaoBhwEJAd4A6ADlAPwABAHnAO8AAgECARMB4ACDAKMA
+EQFOAV0BUAEyAQsB9QBMAZUBOAEKAYMB6AH/AewBrAFvAVMBLgH5AM0ApQCqAMsA1ADJAKYAiQCQ
+AJcAuAAFAT0BiQEEAmwCpQKjAlcCzgFxAWcBOAHmAKUAagBHADUARQBrADYAzv8DAI4AsgDcACcB
+LAEzAXABkwGBAVcBIQH0AMkAbQDp/43/ev+U/9j/MABUAGgA2gBtAaoBnAGZAaoBuAHAAZMBTAEn
+AQQBsABOACAAHAAVAPD/1P/j/wsAPQBXAF0AewCyAMIAngB+AFEAAwCi/1H/JP8K/xj/LP8X/xL/
+K/8j/1P/2v/4/6v/if+O/5T/fv9I/yT/AP+2/oT+sf7l/rr+q/4J/1n/dv+a/6P/Y/8j/wj/4P7g
+/jD/Qf/H/kj+Sf6U/tb+Gv9X/4r/5f9eAKsAqACBAE0AAwCl/1T/Of9N/2D/T/8s///+zf7B/tT+
+1/7k/h3/RP9P/1X/U/9Q/0X/Mf8B/6H+cf6o/rD+aP44/vv9wv3t/VX+tv76/g//Kv9p/0//xf6D
+/sz+8v65/pj+jf5P/vv98v0//nr+gv6h/u7+Gf8K//n+5f7R/tD+/v4r//n+y/4D/z//Ov8q/zD/
+UP+G/4z/af9I/yn/G/8J/xn/cv+0/6z/uv8RAFoAWQAfAPn/EQD4/5r/ff9//xr/rP6p/qH+df6M
+/uP+MP9C/zH/T/+S/6f/sP8BAF0AZQBEAA8Asv9I/wv/Kf9b/3n/wP8AACIAZQCiAJ8AiACNAJ4A
+sAC6AL4AxwC8AI8AYABbAJQAxgC/AMQA6QAXARgB3wDSAAgBIgH9AP8AMgFAAS4B9gCZAF4ARQAP
+AO3////Y/3v/c/+x/97/9v/f/7P/wP/t/yAAUgBXAFAAVgARAK3/rP/q/+n/hf8o/z3/fP90/3T/
+2f9FAJEAAQGAAbQBjQFUAUoBPQEPARABNQElAQoBHQEfAe0AqAB9AJAAyQAUAU4BTQFWAYEBbwEY
+Ac0AvADBAKIAiwC5AP4ACgHaAJsAMADr/10A5ADuAPgAAgHLAL4A2gCeAFQAPQAaAAAAAQDx/xEA
+XgBWABgAOwDAACgBbwHQARwCJwIiAhcC4wGCAQABbgADAN3/3//w/wIAOQCOAPEAawGrAZUBbAFh
+AXQBgAFlARIBtABpAA8Axv+3/7n/tf/U/x0ARQBFAGEAkQCyAL4AuwB7ANT/c//X/xEArv9v/3z/
+ff+3/yEASABGAF8AogD1APoAlQA4ACYAHwDw/8X/ov8s/37+J/48/lH+W/6f/hP/f/+1/8P/0//h
+/+r/7P/l/97/3//0/+T/i/80/wT/Ev9Z/6j/5//3//X/IgBXAFUARgB0AK4AjwAoAMH/lv+3/9P/
+xv/K//D/5v+h/6f/2/+w/z//1f68/uj+4P6Y/mb+Xf5t/p/+v/6y/sH+Cv9N/4L/rv+w/4n/Yf93
+/7b/wf+W/4H/nv++/6T/df9t/2H/Rf86/1X/hf+S/63//v8bAO//0P+8/4//bf+U/+b/DgAGACcA
+gADKAOIAwQCQAGAADQCv/2X/J/8A//v+8P7O/ob+H/4K/nf+2v4G/1j/t//y/xwAKgDt/1D/s/57
+/mv+Rv4A/sH9yv0F/kD+e/7I/iH/bP+5/wcAIgAaAAAA3P/q/xgAAwC0/3f/PP/Z/o/+hv6T/sn+
+Ev8f//v++P4//5T/mP+Q/9b/AADm/+f//f8HAPH/n/9j/3T/hf9+/5r/3f/z/7X/rP8gAH4AeQCA
+AKQAlwCPAI8AawBpAGcANwAiAC0AIQAJAPr/0P+k/87/EQARAPf/5f/v/yQAVgB1AJQAqACjALIA
+/gBGAToBAQEDATQBOwElAQABwQCtANIA3gDIAM0A/gAcARgBGQEvATkBAgGyAJoAqwCXAEEA7P/o
+/zEAdwCqAOEA5gDlAEABdwE8AfsAwwCeAMkA7QDHAKUAegBJAGUAfgBgAGUAdwCOAOYAOgEoAbsA
+YwBcAHcAbwAZANn/AgAvACUAHAAtAEUAYACCAKIAqQC4AO0ADgEdARwB9wDIAKYApQCsAIIAKwD2
+/w8AQABRAEoAVQCKANEAEgFQAW0BXwFUASIB0gD9AGoBTQHkAKQAcQBRAEAAIwAhADcAPgBOAHEA
+aABKAHEApwCnAKwAsABiAPj/+v8uABUA3v/p/zQAXABjAHoAdAB/AMIA1wC1AM4AHwFDAUYBPAEa
+ARQBIgEVAf8A7ADfANYAxACoAKcA0wDzAO0A2AC5AIsANwD1/+//xv98/2H/MP+2/n7+t/7a/sD+
+s/64/rz+4/4u/3D/p//J/9L/AAA3AAAAp/+n/5f/NP/1/hH/G//V/tT+MP9H/0j/lf/c/+D/zf+1
+/7P/3P/k/8j/s/+j/6r/xP/J/6P/Zv8p/yX/T/+D/8j/9P/7/wEAAADX/6X/XP8I/wL/Jf86/0T/
+Mf8d/wr/wP45/r/94v2X/gz/K/9E/zr/Jf8W/9X+fv4u/tH9vP3t/fD99/1M/ov+bv5v/tf+Lf9C
+/2n/sf/Z/7z/lf+x/8f/oP+E/4T/pv8GADYA5f+T/5D/qf+n/17/+v7D/r3+8/4o/xf/4v7F/r3+
+rP64/ur+Mf+a/wkAWAB0AFYALgAhAAMA8f8BAMv/Q/8O/17/gP9B/yj/NP8//57/PACmANIA0gCn
+AGYAHwDr/83/3/8aADEANABIABwAlf8a/+z+4P7O/sH+6f5K/43/iv92/3L/bP9G/x//Nf+W/wMA
+MgAQAPf/CAAbACcALAA1AEMASwBIAA4AyP/Z/xEAUwDAABIB6ABdAP3//f8BAB8AcwCKAJIA7gA2
+ARQBwwByADMAHwAZAAAA9P/o/8H/ov+p/5n/bP+O/8r/0v/1/y4ATQBBADkAZwCIAIwApQClAKIA
+zgD+AC4BWwFtAVwBMAEXAQUB5ADLALIAjAB0AHMAdAB5AJUAwgDmABMBegHIAcwB3AHgAcABrAF1
+AfwAlAB1AGkAQgAcAA8A7/+r/6X/DAB+AKUAsADrAGoB9QEpAggC2AGtAbYB4QG4ATQB4gACAfgA
+hQBEAGgAqQDSACQBsQHtAc4BngF1AVgBKAHhANYAAQHsAMkA5QAAAfIAzgCwAKkApgCyAM0AygCw
+AL4A5wC9AGMASwBjAFsAHgD2//7/BAD9/xAAagC9ALgAqQDkAB8BBgHKALQAjwBOADwANQAZAPH/
+uf+W/4L/Rf8b/1//n/+K/6P//v8+ADsAFAAGAOz/nv95/4j/cP9W/3H/nf/G//n/KwBFAF0AiwC+
+ANEAswCHAGgAVQAVALX/mf+J/zj/A/8l/0X/Cv+//qb+oP6//vX+3v6i/rH+1/7X/tj+1P6n/nT+
+kP7L/rL+eP5W/g7+zv0G/mr+hP5x/mb+of7r/sv+mf6z/tf+3/7o/gD/A//d/qL+h/6K/nn+cv5l
+/lD+e/6x/pj+cf6E/qD+r/7L/s7+u/7S/g7/LP8R//n+I/9e/27/Xv86/xL/Ff9N/3X/kv/D/8P/
+rP/H/9H/p/+D/2P/E//o/kT/Zf/P/mj+eP58/nf+d/6G/tT+Dv8I/zv/hf9x/1H/jP+2/4L/Zv9w
+/yn/mP5W/qv+9P7R/tH+If9d/3T/jf+v/9f/7v/p//3/LQBvAMUAxgBGANb/vf/N////EADr/9z/
+8v8FAPX/zf/E/8X/wv/o//v/w/+X/4//av86/y7/Vv+U/4X/KP8X/2T/cP9R/1j/Pv84/5D/2f/w
+//3/2v/K//v/9P+S/2z/ov+7/63/tP+t/4//rv8QAF8AjQDRACABKQH4AMkAqwCyANwA+wAZAUgB
+RwE7AUAB9ACVAJYAtgC2AOoAZQG5AdQB2wGnATEB1gCxAKYA1gAhAVUBmgHZAbUBUgEWAbkAAAC7
+/20A/ADaANUA/wDyAMAAdAAiAAAABwA5AHwAigC6AD8BcQFHAVcBmwHOAQcCYgK0AtYCxwKLAiAC
+mwEhAa8ATAA2AHAAtQDhAB8BdgGbAY0BhgGNAaoB1gHlAdUBuQGhAZMBUQHLAGsASwBPAIIA0QAE
+Af8AFwFtAX0BDQGXAIMAigB9ANwAggGEAQgBsQB5AHsArgDPAO0A9wDnAAkBSQFRAUUBVgFeAS4B
+1QCIACkAm/80/0H/gv+5//7/QwCXAAcBQAE+AT0BHQH1AAkBBgHCAJQAWgDv/53/gv9+/5z/9v9f
+AJEAsgAJAWcBkAGbAZwBegFQATYB/ACiAHQAfgBlAEgAdQCcAF0AEwAxAEIA+f+t/4D/W/84/wb/
+p/5Z/kj+a/7O/hr/K/9S/5j/2P/g/6//b/8b/+H+JP98/2z/QP8z/zv/Tf9e/zX/3/7b/iT/dP/D
+//r/9v/D/3//Kf/R/qz+tP66/s3+Ff9y/6j/t//C/9b/7P/r/77/dv8s//H+2f7n/un+v/6e/q3+
+t/6M/l3+hf7m/gn/LP+B/4P/Tf9j/4j/P//N/pb+hP5k/gr+nf1+/Yn9f/2V/eL9N/57/sf+Jf9r
+/4f/lv+y/9r/5P+1/2L/Kv8X/9n+Xf79/fb9Gv5i/sX+7v71/iP/Vf9k/03/Pv91/6z/t/+2/5f/
+Uv8S//H+yf6n/rT+yP70/kD/T/81/1b/t//k/8L/0v/m/7n/j/93/3n/bf82/zv/jf+X/0L/MP9n
+/1v/MP9W/5D/Zf8N//v+Av/8/hD/If8K/xf/YP+H/6D/4P/v/8r/tv+5/9P/AwAdAAUAHQCAALgA
+qACNAGYAPwA6ACMA3f/O//n/7//d/zIAmAByABwASQCvANQAwACKAFQAPQBvAMYAuQBFAOT/9v87
+AEQAKQAcAEIAggCbAIQATAAoAFAAfgBcAEEAgQCpAFQAKQCxACUBEAH/AP8A7QD8APcAtQCYAMIA
+6QAFAQsB0QCnANMACwEfAVIBpwGuAW0BYAF1AT0B1gCeAJYAmQCWAJIAowC1AMoACgEvAfkA2gAV
+ATABKQFPAUsB/wDHAKMAiwCkAMsA1wDCAKEAwQAcATgBIQEoATYBLgEpAUABOgHuAKsAxwAMAQMB
+ugCRAJYA2ABCAXMBewGXAbQB0wHsAcEBeQF/AZUBYQFIAX8BfAE0AToBhgGwAawBpwHBAd0B5QHx
+AdkBjgFTASgB6wCvAG4ACgDJ/9L/wv9M/+v+Pf+8/8X/1P8RAB0AQgCZAKgAhgCVAK8AnQBrAAkA
+lv9f/0P/Hf8e/0j/bP+N/8v/5f/c/xsAjwC/AIkASQBGAE8AVABcADcA/v/X/9D/5//5/wcAIwBG
+AGIAhQCyANcA1gCkAFoABwDA/4T/Tv8m/wb/6v64/pL+xf4x/1z/GP/e/iT/oP+i/zr/9P7N/s3+
+8f7N/mT+Cv7U/d/9OP5u/nb+tP4f/2D/W/9L/z3/Hv84/6T/8//t/+v/4v+D/yD/6f62/rj+Bv9O
+/2//kv+6/9P/0P+t/3D/PP81/07/Y/9F/xP/6v69/pj+fP6a/tD+8P4//5X/oP+C/2D/J//V/n3+
+Uf5N/iz+JP6X/gr/+v7h/tT+kv6r/ir/eP+S/4n/Y/9x/3P/BP+j/qr+pf58/nz+ov6t/nT+R/6A
+/rz+tv64/qr+lv7V/hH/F/87/0z/If8A/w7/Lf9D/0f/Kv8F/xj/Zf+Y/4n/d/+Z/7z/wv/N/9b/
+6v8JABEA+//g/9T/z//L/87/0v/s/x4ACQCb/6j/OABOAPr/wv+n/6b/o/93/0z/Tv96/8//DgDc
+/3f/d//J/+j/r/9l/1//jv/E/woARQA0AMj/YP9g/6f/2v/R/7n/0f89AK8AsgBzADkAFwDf/5X/
+q//x/wgAEQA0AEgAHQDz/w8AQQBfAJIAwwDpADYBcwFUAe8AlQBWAEMASgAVAOL/6P8KAEMAdwCB
+AIIAqQDkAEMBrgGqAVABHQEOAQkB9QCjAEIAPwBfADwAJQAzAEcAfgDfAE8BmwHFAfwBPgJVAiYC
+3QHWAfwB0AF+AYgBsAGIATgBCQHfALYAuAD2AD8BNAEVAVsBxQHmAbkBdQE2AfgAyQCzAKcAhgCB
+ALQAyQCWAFkAVACvAA4BEwEhAUkBVAFpAZUBsQGtAYYBPAEYAQ8BzACdAKwAmABuAGwAfwB8AFIA
+IgAoAHAAtwDAAIwAYQBgAD8AEgAqADYAAgAZAHgAqgDrADEBDgHwAEIBjwGTAXQBOgHzAMMAhgAn
+AM7/oP+w/7n/v//m//T/6v/1/xwARABlAEwAyf9m/6D/yf9h//n+s/53/on+u/7Q/un+G/9V/4j/
+tv/U/8f/t/+4/5P/hf+j/4P/Lf9D/9j/GQDS/5j/mP+L/1//Rv9S/1j/YP+F/7f/7P8FAAIAJgBb
+AF4ATQBBAAwA0f/B/5//Tv8I/wD/Hf8t/zv/Uf9c/2b/df+X/8z/3v/P/8f/oP9r/5X/x/+P/zz/
+7/68/sf+2/7//iX//f7r/kL/aP8X//L+/f7X/sP+tv5+/mH+aP6D/qr+yP74/jP/Mv8Z/13/rP+k
+/57/wP/t/xMAEADu/87/yP/X/+f/+f8JAAAA3v/X/+z/3v9+/yT/IP8j/xH/+P7Q/sP+2P7U/rb+
+zv4F/yb/RP83/wH/Bv9I/0//BP+3/mb+Jf42/l3+bv6F/q/+//5g/3f/T/9m/5//k/9t/03///6N
+/n7+2/74/tH+3f4S/0r/d/+E/4H/lP+8/6r/hP+x/+7/BAAPACAARwBVADcANQBMAEIALgAuACUA
+EwA1AFMAAwCw/+3/PgAoAP//GABnAKsAwACOADUAKwBNAO//Zv9W/3//yv9JAMYAJgFDAREB/AAT
+AdYAagBsAJAAOwDY//L/TgBVABQACwAmADYAfgD5AD4BOgEYAesA5gAbASoB9gDDAMMAGwGbAbMB
+dgFlAWEBRAEyAfgAiwBjAKEA4gD3AAEB9gCzAJQA1QAmAU0BSQFpAbcB5gHzAe4BjQHsANcAGwHS
+AFAAMABPAIkAtAC2AMwA0gDQADABiAFpAVIBeAGMAZEBfQE+AfsAtQCGAIMAeABAABcAPwCUAM0A
+5gD8AA8BEAEPARQBEgEhATkBKQHgALQA2wD3ANwAyQDYAOgAyACoAOAAJgEaAQcBIwH5AI0AVgAg
+AMX/iv+M/+j/XwBoACkASQCvALoAnADAAOwACgEjARkBAQHCAEsAAADT/2L/HP83/z7/Lv9D/3j/
+n/+o/9f/CwDk/7f/5P8RAAkAGwBCABMA0v/u/yUAJAD+/+7/IgBqAF4AGAAMAD0AdQCXAKcApACi
+AMwA8QDKAI8AUQAYAAYA6f+h/1v/Tf9j/3b/af8i/xL/Of/x/n/+kP66/mz++/29/bj9//1v/rH+
+x/7z/jb/bv+D/1T/Dv8C/zH/hf+2/6//o/9z/0X/Zf92/0P/7P6t/tj+Hv8z/1f/df9G/xj/Ov9P
+/z7/Sv9l/4P/nf+c/3D/Mf8n/z7/Hf/b/qz+iP59/oT+h/5y/n3+6f5O/4v/xf/B/3n/Ov9b/7T/
+vP9u/x//5f7N/tz+xP6B/nP+nP61/pr+Yv5I/nj+wP7V/tX+9/4m/zD/Dv/0/uz+6f4J/zH/Hv/y
+/t3+1/7c/v/+OP9d/5D/4v8sAGsAZAAAAML/2v8EACAADgD6/wUA+f/c/83/r/+m/7//z//q//3/
+z/+V/5T/sf/B/9r/8f+0/1P/ef/g/9f/j/9I/yP/Vf+N/4X/fP97/4H/vf/+/+T/sv/V/xYALwBI
+AHMANQCr/6T/HwBjADIA//8BAB4AKgD6/8z/7f8hAEkAggCJAFEATwCFALUA1wDwAOcAuwB6AEcA
+RgBFADoAXwCjALwAswDiADsBQQHoANEAJwFGAQUBuAByAFcAdgCIAHgAcQBgAFgAmQAFAVwBcwFZ
+AV0BiQF+AS4BAAESAQsBzAC1AMMAkQBrALkAFwEiASkBSgEzAQ8BJAFGAV0BewGPAXoBPgEMAQIB
+GQFYAZ0BtgGwAaoBqQGiAZcBjwF3AWwBhwGmAboBkQFSAUsBJgHCAJ4AwQCwAGYAQABHACcAr/92
+//L/ZgBkAGoAjACcALgA0wDcALIAQQAHACgA8P9O/xr/dP+7/8X/4P8dAFIAaABwAIYAnQCmAKAA
+kgB0AFcAdgC0ALAAbgBEAGAAlwCpALoA2gDMAKwAtQDLANAAywDiAC8BdwFlAQwBowArAL//lf+I
+/13/Vf+z/xoAOAAkANX/oP/u/ycA8//C/67/eP8m//X+3/6m/mH+Xv65/hz/Kf9e/9n/AAAZAFcA
+awBZAEYALQD//9n/6v8RAAoA/f/4/9D/t//C/7z/rP/A/9z/7v/7/+r/tf9u/0//d/+c/6n/r/9u
+/wf/4f7o/v7+Hv9L/4f/r//Y//f/2v+3/7v/uP+V/4H/Y//4/qz+Bv9r/0z/Ff/u/uX+KP9g/13/
+bv9+/0P/Bf8K/+b+kv6G/qv+zv76/gf/wP5x/nX+f/5M/hb+Nf5o/mX+iv7D/tj+DP9A/wr/qP6d
+/t3+Ef8O/wP/KP9Y/2P/cv+u/87/tv+s/7X/v//F/6b/gv+p/xAAVAAqAMP/kv+B/0v/NP9b/3P/
+Y/9d/4D/g/84/+j+tP6x/t/+5/7M/tb+AP9V/5D/QP++/qD+xv7P/r/+tP62/r3+5v4k/xr/xP54
+/m/+nP7k/i7/Zv+N/5L/nv+w/5X/WP8d/w7/D/8h/07/Zf96/7L/1v/E/8H/9/80AHsA3gAlAU4B
+agFlAU4BJAHSAIEAOQD2/+f/+P/s/73/uf8DAEIARABPAGEAZACVAMYAswB3ACIA4P/z/wgAw/+G
+/4n/ZP8r/1L/rv/A/7f/NwAQAYsBlwGKAZMBnwGIAWQBYwGBAXYBOwEdAQ8B3gCbAIYAqQDJANQA
++gBWAaIBtgHHAe4BBQLwAecB+QHcAYwBawGRAYwBYQFsAX4BZwFYAYEBzwHeAaYBpgG3AXABKAEu
+ATcB6gBvAEQAbwBxAC4AHABVAIsAtwABAVABTAEhATgBXwE9AQ4BEQEUAQcBBwEGAfsAAgEQARkB
+JwFIAYgBtQGdAW8BawF9AWIBFgH2APkAwABnAC4AGwAcAAkA2//p/zsAZQBkAIIAtADFAMYA0ACb
+AC4AEwBFAEAAAgC//2//V/+L/6j/uP/r/y8AbwCHAHgAUAAsABkA8f/g/xcAPQD8/5b/sv8mAC8A
+6v/f/ysAcABqAHUAlABrADoAUgB3AGAAEwDx/yUARAAYAPP/3/+e/3H/ov/D/4r/Tf9Q/4j/rP+O
+/3f/ff95/3//qP/R/9f/7P8bAAoA7P8aABQAy//P/9b/nP+Y/7P/hP88/xr/I/9m/5X/dP9r/4f/
+Yf8X//P+5/6p/l3+i/7V/r/+xv7//un+qf6x/tD+s/6i/uL+Nf9Q/2H/eP9e/zz/Sf9o/33/nP+7
+/5z/Yf91/37/D//F/vP+If/r/oz+hv67/qz+Tf4e/lj+l/6y/qr+VP4f/m3+yP6s/ib+i/0Y/RL9
+Uv15/Y/9v/0E/nP+B/9D/xP/AP8u/1n/Y/87/9v+h/5//pb+l/6p/uX+HP86/0j/NP8z/3v/sf+0
+/8T/0f/j/xcAOAAlABIADgD1/97/6f/6/+z/sP9m/y//Kf9i/5X/p//E/+D/BwAvAC8ADwDa/6//
+dv8n/xn/Lv8c/wb/8/7Y/tP+//5I/5//6P/u//L/MABMACsABQDA/zD/vv7h/jv/V/9S/1b/bv+p
+/wgAeACrAIIAaQCLALMAzwC7AF0AAAD2/0wAvwDdALcArADIAPgAJwEaAc4AZgAbAAoA4/+8/9j/
+6P/F/7r/8P8uAFcApAASAU4BbwGfAaIBfQGKAakBSgGyAHEAYQBrALMAAAEKAd0A2QA3AYUBYAE1
+AYIBCwJdAmYCYAIoAsQBngGQAW8BZAFpAVYBMQE1AWEBZAE4ATABPAE9AToBNAFkAagBnwFuAUUB
+JwFFAXsBXAEgAR0BLwE8AVYBfQGdAZEBbQFVASYB4wCkAGsASwBZAIgAiwBeAEwAMwACABEAVACT
+ANYA5wC/AK0AnABzAFYALADk/8v/3/+u/2T/XP9r/1//Tf+L//3/JwAeACUAQAB0ALMA0wCvAIIA
+qwDmALwAdwB+AKMAtgCrAJ4AtQDUAPEADgEZATIBcAGIAT8B3AC0AK8AoACdALoAywC9AKsArwDN
+AO0ADAEZAeQAhwBhAEgA2v9v/0X/Gv/5/hL/W/+v/7//lf+3/wkAEQDx//L/1/+l/+D/kQANAdYA
+ewCTALMAbgAFANb/yf+6/5j/eP+n/9X/o/+G/67/xv/m/xoABQDg/xoAeAB9AAcAg/89/xD/0v6U
+/oj+mv6X/n/+Uv46/mP+mf7D/u/+Hv8O/7H+xv5A/xr/ff4n/iv+TP5h/kP++/3z/S/+Vv5l/k/+
+Rv6Q/vf+Nv9o/6//2v+t/3D/Uv8q//T+vf6L/lb+Sv5m/jv+G/5+/v3+Pf9b/4f/xv/v/8v/df9T
+/17/Tf8r/wX/2f6k/oz+tf7Z/s7+0f7m/u3+Gv9W/z3/B//9/gf/F/85/2f/Sv/o/vL+Sf89/+7+
+rP6s/vf+Av/F/tL+FP8p/0D/cv9y/1z/gv+e/4j/hf+G/2r/Rf9L/5z/4//y/xQAFgDL/6n/oP9s
+/2L/mP+1/53/ff92/4f/r/+2/5r/xv8nAFgAVwBDACAA7//J/83/4f/l/+D///88AFQANgAUACYA
+YwCPAIIAMgAJAFIAegAxANH/c/8c/xb/Wv+m//b/GgAMADMAfwCjAKgApQCxAM4A1gC4AIQAQgAx
+AH0A3QAGAQcBDAEVASIBRAGEAbgBtQGYAYMBdQF6AYwBZAEDAeMAIgF4AakBswGnAagBxwGxAYgB
+mgG6AeQBCgL8Aa0BVwFmAakBrQF8AVABQgE2AQ4BDgFIAXUBlQGvAaUBogGyAZ0BiAFuASoB9wD1
+AL0AWQBeAKIAxwADAU4BWAFEAYMB3gHKAYMBeQGLAXwBUwEsASwBVQFrAXYBgwFqAWEBkQGdAVIB
+BwEDASABJQEzAXoBvgGuAXUBUQEtAe0AmwBEABkAOwBVAGEAmQC3AJ0AggBDANX/1P9cAHMA7f+x
+/7f/kv9w/2H/bf+h/8L/0/8qAHQAPAAhAG4AXQDp/97/LAArAA4AVwChAIMAdQCiAJkAdQB6AIUA
+aAAqAPb/6f/2/+f/yv+3/5T/lf/X////2P+n/8n/CwAOAM3/mf+//+//+v8KAAMA5P/U/8b/rP+i
+/43/kv/U/8D/T/9R/8b/7/+4/3D/Uf+C/6//nf+Y/4//Rf8T/xT/3f6Z/rT+0f6d/nH+mP7S/pf+
+Ev71/Tr+XP5Q/jH+C/5A/r3+7f7R/sv+3/4N/z3/T/9o/0n/8f7T/tz+2v7I/rX+t/7B/rr+k/5u
+/nf+lf6l/rT+tf6a/nj+Qf79/df91f3l/QT+Nv5T/n7+4P4G/7z+mf6p/nX+N/4t/iL+B/4K/kf+
+Yv4Y/rr9of3O/Qb+8v28/dD99f0G/mj+Af8M/5L+eP7G/uP+2P74/ib/H/8H/zj/iv90//z+wf7Y
+/sn+u/7f/gD/Jv94/6T/nP+3/9H/0v/S/+f/IAA1ABIACgAdAOf/nf+S/13/+v7C/pD+RP4u/nr+
+6v5M/5P/rv+f/6H/9P9aAG0AQgAQAOj/6f/v/5v/IP/o/tj+2v4V/2P/hv+f//j/gQC+AJAAdgCc
+ALQArgCjAKMAlwBgAEUAewCcAHcAZQBoAFAAcgDMAP0AFQFEAW4BfQGIAYEBUAEpASsB/wCqAKIA
+uwCyAMAA5wD5AOwAwQDTAEkBgAFZAV4BXAEsARkBCQHrAMUAdwBjALkAwQB8AKQAEQEiAfkAQgG+
+AbIBcwF8AZcBpwGvAYQBRgEQAdQAtQDSAAgBIgE3AXABrQHwAUkCfQJ3Al0CRgImAgIC/wHsAaMB
+YQEyASYBSwFQAT4BXQGPAZcBbwFGATIBIQEqAVcBdwE+AeYA8wBIAVcBEwHFAGwANgBcAIkAcABV
+AI8AEQFsAUwB8QDXABYBYQGFAZ8BrAFsAS8BYAGTAVoB5wCjAK4A1gD1AAgB/QDeAN8AEQEYAcwA
+kACRAIwASwAEAOz/2//F/8b/4/8BABEAFgA0AFwAaABpAHQAdABuAGsAOADo/7f/k/9O/zn/i/+v
+/57/nf9q/0b/WP8y//j++v4k/2j/hf9J/wb/Kv+Y/7b/fv+H/77/tP+H/3H/Zv+M/8n/pv9o/4D/
+pP+k/7T/z//V/9j/BQAuAB0AIABBADAA4/+1/8L/l/9O/1f/dP9V/0z/af9m/1f/S/9D/z//I/8H
+/wn/G/8u/xn/6f7e/sn+mf6//if/VP9K/xT/1f7a/uz+1P64/pD+Yf5v/pD+a/5O/nP+pf7m/gr/
+7/7J/qL+lf6r/p/+hf6h/tD+/f42/1v/jf/p/xMA8//j/8f/Yf8L//f+Bv8l/zX/M/9U/6r/AAAW
+AAkALgBbAFMAMgD8/8X/v/++/53/cv8z/wX/I/87/9n+af6W/v3+6/6t/qX+Yv4B/gH+Jf4n/i/+
+Vv6j/tD+tP6w/sf+nv46/gn+U/7V/gn/9v4J/zb/Uf9x/5f/qf/G/+T/2f/Y/wAAHQATAO3/xf/k
+/zUAUgBEAEAAXgBsACwA0v9l//n+xf6c/nT+gv69/vD+JP9g/3X/j//s/1UAigCsAAcBZQEwAbMA
+sQC9ACsAgf9J/0n/bv/W/zoASAAMAPn/OABVADAALABfAKgA/ABAATQB2wB3AFYAeQB/AFAAMQBJ
+AH8AogB6ADEAHgAzAF4AkQDBAOcA5gDBAJwAlgCKAGoAcgCYAKQAowDfADkBRQEdAfQA5QAFAUsB
+kQHAAQICTQJDAt8BjwFbAQwBFgGNAbwBrwHZARICJwIkAuUBhwFlAWYBdAFtARwBwwCXAHAADgB/
+/2D/s//X//P/bwDLAKsAogDpAD0BfwGgAaYBrgHGAdcBxwGIASIB5wDoAMkAqADWAEkBygESAh0C
+GwIbAiACJgIXAvwB8gHJAYMBYgFGARAB7gDSAKEAlACpAMcAywBfAM//vv/j/8H/g/8y/+j+EP+D
+/9P//P/w/7v/0P8bABwA+/8UAFcAgACJAJAAggBtAJEA2AD1APAA0wCNAFgATwA6AP//7v8lAFAA
+dwC3ANIAzADLAKkAYgA8ADwATQCBAJMATwAYAPz/yf+e/4L/a/9E/xX/DP8n/2b/zf8MAOL/Yf8w
+/63/DgC8/0X/Kf8E/73+m/5b/vn91v3k/Rz+if7S/vj+Rf+h/9b/7v/2/8n/gv9d/0n/P/8s/+L+
+dP4n/jD+Uv5Q/nj+3f5E/5j/1f/i/+f/AQDl/5//e/9n/03/D//F/r7+7P7//uv+Cv9f/4T/gf+j
+/8j/sv+P/4X/fv93/1r/Wf9+/0r/HP+O/+v/sf+V/6z/g/9s/4X/kf+Z/3b/R/9m/3L/+P57/oX+
+p/6C/lv+Y/5u/mn+mP7j/vD+7P4I/yb/S/9t/13/RP9X/0L/4/6j/pX+nv7j/jD/QP9Z/4v/uP/h
+//X/5/+//5//l/+c/3f/Rf8v/yz/V/97/4v/o/+L/2L/X/9S//f+tv71/hv/3v6f/n/+fP6M/or+
+n/7q/h3/Qf+g/9P/pf+n/9T/y/+v/8X/zf94/wT/3v4M/2b/oP+F/2L/c/+x/+3/AgD3/9D/yP/4
+/x0AGQAEAO//8/8OAEcAkACOAGcAeACUAK0AyQDyAFsBrAGdAY8BmAFWAagAFQAiAEcACADw/zEA
+NgAXAEYATgAkAD8AXQA1ACoAgwDeAOkAtwCKAIcAggBsAE8AWACWALAAzgAJAewAlgCDAJgAkgB/
+AIgAsADDALsA3wAPAfEAsQCsAM0A6AAOAUYBgAGjAZMBbgFeAWsBjgGxAbEBhgFwAY0BqwGuAawB
+rgGhAXABJwHrALsAqADXAP8AvABjAJUA+QDaAIoAdgCJAKIAjABhAGoAfQBxAH4AlgB9AEAAMgBe
+AJIA4AAzAVgBSwE3AVwBhgGEAXQBTgE9AWYBfAF4AZgBqgFTAdAArgDMALsAkAB6AGEAVQByAJQA
+xgDzANUAlAB9AG4ATwBSAFkAYAB8AJMArwDBALQAsgDFAM4AygCsAIIAdgBnADcAFQAKAAsAQACN
+AJkAZQAoAPb/1v/G/5X/aP+L/8b/xP+v/73/qP9V/yn/QP9K/yz/Iv9C/2L/gf+j/7T/wf/N/8n/
+t/+N/3f/o//I/7H/p//W//v/8v/6/ygAJwDZ/4D/Nf/u/s3+2/7Z/uX+Hf9J/1P/NP8R//b+t/6f
+/s/+3/7w/kb/U/8I/xb/P/8Y/9z+rv6z/tv+0v7M/vj+4f5a/gz+RP5c/hv++P0Q/hL+Fv6A/vP+
+5/64/rv+q/6s/uH+B/8k/zD/JP8s/0D/Vv9i/1H/Pv81/0v/i/+h/53/yv/l/8L/vv/O/6L/gP+k
+/77/i/9d/3v/nf+N/3D/bv92/1j/CP/L/rn+ef5N/qX+2f63/sH+zv7f/jX/bf9n/1P/JP8f/1D/
+Mf/S/rX+1v76/vj+yv7W/g3/Kf94/+z/DwD+/wIAGgBDAG0AUwAjADEAIQDY/+P/GgDo/5X/mv+1
+/6v/uP8FAE4ATABNAKYA9ADMAIMAdAB6AHcAawBcAFMAOwAiAD4AXgAvAAwAigARAfUAxADAAKYA
+owDHANMAvABrAAgAJwCZAHwA2/+m/w0AaACYAOQAHAH/AOcALQFbAS8BCAH6ANcAtgC0AL4AzwDt
+ACsBmwEAAgwC8AEHAigCAAK0AY0BkAGoAaoBZwH1AIsAQwAvAEQATQBHAGYAqgDbAPkABQH8AAsB
+LQFbAXABKwHuACUBSwEPAe4A4QCoALEABgEeAf4A/wAlAUQBMgECAfMAEgExAUoBgQGXAVIBBQEg
+AX8BoAFoASMBEQENAfcAzQCSAG0AegClANEA5gDUAM0A2ADdAPQA7QC1AJoApgDGAOcA0ACkALMA
+3QDHAIoAgACIAIAAhABnAB8A+/8LAPP/o//D/ykALgAhAB0A2P+6/+r/8v/Y/7n/jP97/4P/Zf83
+/0n/kP+3/6v/l/+U/5L/jf+i/7v/v//O/9D/sP+x/+X//v/1/wQAJQA+AF8AgACZAMkA7gDCAHYA
+ZwCFAFwA/P/h/8z/fP9D/2D/uP/a/8D/0f8AAA4A9//c/9L/tf9s/zX/Fv/K/nb+d/58/jn+Jv5Y
+/pv+CP9O/1//gP90/0f/R/8e/4n+J/5P/m7+bP57/lr+Bv4C/pT+LP9A/y7/Uv+I/7v/4v/m/9z/
+7/8cAFAAVwD5/4P/S/8S/7D+R/4V/jf+jf70/jf/Vf93/6X/wv+l/3f/cv9q/zD/8v68/nL+K/4I
+/v/99v3A/Zv91/0Y/g/++f34/Qj+UP6w/vL+KP9H/xv/2v6Y/jb+IP5Y/l7+Gf4O/pP+J/9j/3v/
+kP+O/4L/h/+J/3//X//2/nL+Uv6R/s/+0/6s/rP+IP+Y/9f/DwA8AEAARwA3AOL/Tv/B/oj+d/5L
+/kH+iv7d/h3/Z/+U/53/xv8mAGkAbwBzAFEA5P+T/5H/ZP/h/pH+v/4r/6X/AAAZAA4AAQD4/8n/
+aP8d/0X/2v9pALsA3wDAAGIADgD//xQAHQATAP//AAAuAGYAUwAKAOn/4//+/1cAlwCvANgA1ACU
+AEgAHwA8AIEA4wBKAY4BvAHlAegBrwFnATEBFwEyAUUBIAH/AP0A9ADcANoA0gCSAIAA+QCKAbIB
+vAHMAZkBZgFCAeUAjABfAC0AOQB2ADIAo/+e//P/AAD4/z4AmQDVAAsBLgEyAScBMgE5AVQBpgHO
+AdoBCgInAusBigFUAS0BJAFGAUcBPwF9AdUB8AHWAbEBkwFiASgBIwE3AW8B4wEUAggCIQIlAvQB
+uAF4AVEBWgF3AYQBLQGXAG4AbwAAAIz/cv+X/wUAdwCqAMwA1wDQAPgACgHTAMEA3QDyABoBTAEv
+AbcAewC0APAA/gD3APAA9QAIAe8AqwClAMgAwwDRACUBXgFIATsBMgHYAFkANgByAJgAcgBcAJ4A
+wwCAAFcAdQB6AFEAOgA/AB0A1f+w/77/zf+7/5D/rf9JALoAhQBTAHoAeQBNACkA4f+e/4//if+K
+/4H/X/9h/4T/mv/L/yYAZQBUAC0AKQACAM7/2P/S/3f/Mv9J/1//NP8E//7+HP9Z/6z/8f8QACwA
+SgBoAIsAagD6/6b/j/+Q/4z/c/8z/9L+lv5y/lv+g/7L/gn/FP/5/gH/I/80/0r/Mf/P/p7+y/7f
+/rf+gv5N/mr+yf7b/sX+wP6x/r3+Av8a/7r+Xf5n/pX+sv7Z/t/+eP4g/lP+nv6N/lD+SP5b/mP+
+gP6b/pf+iv5i/jP+Pf5e/nX+lf6T/o/+v/79/i//Kf/t/sX+2/4I/xf/GP8b/w//Gv9e/5H/bv8m
+//f+2f7X/ub+yP51/kb+lv77/uT+lv5m/k3+Yf6I/pf+sv69/p3+mf6a/n3+eP6L/pz+rv7O/gP/
+9P6M/pb+LP91/13/RP8N/+P+DP8t/zj/Zf+A/4T/ov/W/wgA+//L/8r/0P/l/wAA+P8PAF0AggBq
+AGUAlQCwAL0A8wAbAR0BGAEBAeYA9gAXAQwB5AC6AHoAPwBJAFMAEADe/+r/AQBJALgA4QDAAIYA
+ZwCVAL8ArwCMAIUArgDgAPUAzABXAO7/9P85AF4AiAD1AEkBcQG6AcIBhgGPAcAByAGlAXkBcQFz
+AVwBOgEUAfgAIQF6AZ8BpQHLAf0BEQLkAX4BBwG4AKMAcgA4ADYATgCNAM8A+gBBAVgBWwG9AfQB
+rwFyAWgBaAFmAVYBIwHkAJ8AeQCyANUAjQB8AMoA5ADkADEBbQFTATEBPQFNARoB0QC8AKsAngDF
+APQAEAFBAUsBDAHxAAsBCAHlANQA/gA6AVkBkgHaAewByQF4AQEBgwBDAFkAgACsAPYALQFCAV0B
+cAFbAS0BAgH+ABIB/wCbABIA//80ABcA7/8AAPn/4v8JAEAAaAB5AGcAlQAFASQB4AClAJAAXAAO
+AAkANQArACkAmADtALoAfgBJAPr/8f///8X/sf/n//H/2//d/9//8P8TAPT/fP8Z/x//e//M/8v/
+nf+Q/3r/QP9M/5b/rP+e/7v/+/8kAP//sP+I/2X/VP9o/1X/R/+X/8j/i/9A/8/+Xf5P/lj+bf60
+/ur+GP9s/23/7v6U/sP+Ff8i/xr/N/9P/0j/QP9E/zr/Jf8V//D+x/7a/ir/Tf8m/x7/KP/2/tb+
+F/9d/0T/B/8E/0v/kf+P/4D/iv98/2z/hP+o/83//v8TAAAAAwAGALL/Tv8p/xj/Bv8Q/wz/wP4+
+/uz9H/5Y/g3+vf3S/e79Kv6r/uT+uP50/jX+If4p/hX+9f3m/fD9Bv4S/ir+Y/6d/r3+x/7h/iD/
+Wf+F/4z/cv90/5X/uP+v/2f/Jf8U//n+wP6O/nX+if7S/h7/Uv9s/0z/Kv87/1H/Vf9C/yf/R/+J
+/4P/Pf8f/0P/cf+l/9T/sv9h/5v/JgAhAN//7v8YAC8ALAAiACIAAwC3/6X/3//H/3n/kv+4/6v/
+zP/5//P/2//F/8L/1//c/8n/qv+W/7X/t/9+/4n/zv8FADwAZACJAL4A4ADnAPIA/gAOASABMwFd
+AWoBIgHWANEA2wC6AIMAbQCMALUA1ADeAMwAugCwALgABAFBAQEB1AAsAVABzQBDAAcAAQAlACwA
+DgD9//D/+f8fADsATgB9ALYA4AAUAWEBhgFQASsBbQGgAVwBEQEnAV0BXgEtAQ0BHwEuAR8BEgEO
+AR4BUQGcAc0BxAGaAXABYwFZAUQBOQEfAQQB/wDuAPcAEgHbAJkAqgDPANEAwAC3APAALQH5AKsA
+3gAuASEBDwEQAfQA3QDpAPIA5ADVANEAxgCdAJIAxgDjANkA3wD+ACcBKAEaAVUBfwFUATUBMAEU
+AQoBGAHyAKQAeAB1AIEApQDIALMAlQChAKsAsACuAJQAhwB+AHkAcABBAPb/y//w/yUAKQAVAA4A
+GAAxACUAy/9t/1v/af95/7D/ov8a/wr/nf+j/yT/5/7F/sD+4P7S/sr+Cf98/wwAbgBRABMABgDa
+/2H/3v59/jr+Mv5k/rT+C/9Q/5j/2v/8/zYAggCYAGcAMQA7AE4ATQBBABgABgDw/5z/ef+U/5L/
+e/9n/17/dP93/0L/Lf9u/9f/RACMAH8APAAMANH/RP+z/h7+V/32/Dz9jv2F/Zr97/0P/kD+sP4G
+/0f/ff+p/+X/5P9u/xP/Df+7/hT+zv31/S/+f/4C/2r/a/9c/5H/4/8JAPX/1f/F/8L/z//C/1b/
+2v6y/tj+J/9N/0P/ZP+1//D/GQA6ABMAx/+P/1H/AP/D/pL+aP5w/pH+sv7//l3/n//I//n/WACD
+ABwA1v/R/2L/uf5T/iX+Lv6B/uf+Kf80/y7/Wv+U/37/Lv8t/43/9f9XALUAswAzANT/5//j/4X/
+LP/x/t7+Iv9o/27/gP+g/7H/x//i/wAACQD8/+f/v/+k/4z/g/+g/7L/0P8EABEAFwBlAL0AwgCI
+AHQAnAC8AN8A8gDKALQAtgCAACwA4v+8/+r/IAAjAGoA+gBQAWkBcQFGAeUAhQBKAEoAOgDX/53/
+vP+j/1P/O/9H/yj/+/5I/93/IwA1AFYAeQCKAH8AXQBAACoALgBiAIQAbQBUAFQAWwBvAJ8A5QA9
+AaIB6gEUAj4CWQJNAkMCNgL5AdEBAQI8AiwC+gHcAcwB3QEiAk0CMgILAqsB/QCVAI4AYwAFAPL/
+KwBZAIsA1AAIASIBIgERARcBAgHOAPMAUwF4AY4B0gHUAU0B7AApAVQBHgEVAUUBRQEgAQsB5ADJ
+APwAWgGfAdMBJwJXAjIC1AFRAdIAcQBBADgAJQASAAsA3f+Z/3b/fP+w/9H/w//Q/w8AUQBoAFoA
+TgBJAD0AZgDAAIgA9f/7/yoA///R/7H/mP+w/9j/BwA6AC8ABAAQAEUAYABnAI0AuwCoAIUAoQC5
+AHQAAQDL/83/zf+k/3H/kP/b/wAAJgBdAIgArQDsABgByAA+ACQASQArANf/jv9u/z7/Av/x/uj+
+2f7U/uv+MP9V/zr/Kv8t/y7/WP+S/1b/4v4W/6P/vP+A/1X/Vv9q/5L/zP/a/7H/mf+n/7P/p/+D
+/3L/jv+Z/23/Qv8Y/63+dv7S/hT//f73/gf/Df8Q/w//8P7X/un+A/8L/97+sP63/sD+yv7Y/ur+
+Hv9V/2T/X/9a/2X/h/+O/3T/cP97/4j/oP+c/1D/3P7G/gP/Cv/t/s7+hf5Y/pv+yf6T/lv+Lf4H
+/gj+EP4f/kD+Wv6J/s7+1v6N/mr+kf6I/kT+Q/59/kX+8P1T/uP+CP/1/tT+z/4N/17/h/+G/3H/
+Y/9z/4v/ef9d/2n/Z/9F/1f/n//L/87/7f8fACAABgDj/8L/0//t/9z/yv/I/7D/f/91/7r/8//0
+/+L/zf/F/9H/AAD9/67/kP+Q/3n/cv9s/0r/Sf90/4n/jf+I/4T/i/+b/8n/6v/B/4j/kf+z/7j/
+vP/d/wkAJAAzAD8ATwBwAKQA0QDeAOoADQE1AVkBbgFzAWMBQwFJAY8BzwHdAeAB0AF4AScBIAEX
+Ad0AlwCLAMwA9ADiABEBaQGFAY0BZQHgALgAGQEgAccAkgBlAEYAXQCnAAgBGAHMAMsAMQFKAecA
+oADIAAQB/QDVANUA6gD3ABsBUwGKAa4BtQGnAbYB7gESAjcCTgL/AbQBpAF1AUgBMAETASkBaAGK
+AZsBpAGrAacBegExAesAsACRAIAAXQBpALkA1QCdAGwAdAChAMsA9QAeAQ0BqwBdAI8AvwB3ADcA
+KgA4AHMAtgDQANkA4wDPAN4AJAEjAdkAtwDFAMcAvQCuAH4AKwAHACIAOQBPAFYATwB0AK0AtQCT
+AG0AVgBNAFMAcgCJAJEAmwCUAIIAbQBrAJ8A3QDGAHUAaAB0AC4A3v/H/+H/AgAHAAYABwDs/6r/
+jv+p/8//4//F/8D/8P/T/43/dP9L/zD/Pv8n/wn/Jv9U/2v/Wf8T/9n+y/7L/tH+2/4I/yn/AP/+
+/lz/jv9g/03/ZP9R/zD/Lv8w/xb/+v4S/zz/N/8o/0P/Zf92/47/qf+u/5f/iv+f/5v/Yv81/0r/
+Y/9N/zP/O/9n/5D/lv90/xT/s/6y/tr+1P6+/pD+If7j/TD+Uf75/c797P0m/qv+RP9m/yb/7P7K
+/tL+8/6u/hH+zv3d/eT96f3k/cj9q/29/Q3+bf7C/vf+DP8n/0P/S/9M/1D/KP/P/rr+CP86/xf/
+6v71/iT/UP+D/7v/yf+4/8D/0f+8/6v/sv+e/3v/ev+G/2f/LP8I/xn/T/9U/xn/Nf/e/zgAyP9Q
+/0r/Uf8v/wj/+f4L/w//7f4C/zz/MP8e/zv/O/82/5L/AADd/4P/j//f/w8AEAAXABAA6f/1/ycA
+NQA+AE8AWQB2AKAAyQABAToBXgFyAX4BigGZAaYBpgGaAXgBJwHhAMgApQBmAEAASgBlAHYAeAB/
+AHgAbgCGAJYAegA6ACgAVgA4AOT/xP9//zX/TP96/7z/KAB7AJ4AlgCXANMAEwE2AU8BbQGBAXIB
+VAE8ATMBGwHUAJ0AsQDfAM0AlwCmAPQAGwEAAf4ANwFjAVwBUgFnAU0BAAH4ADABRAEeAQsBBgHY
+AM4ABQEpAS8BRAFlAYEBmAGpAb4BzAHXAcoBhQF9AcQBuAFjATkBEgHRAKIAhQCAAI4AjgB4AFwA
+OQATAAgAGAA+AHUAnACwALUApwC2APAALgF0AbMBsQGGAXABbQFqAXYBmgG4AccBxgGmAX4BagFZ
+ASgB8wDkAPcAAAH7AAMB6gCkAIIApQDKAKQASAAWACcATQBYADkACwDp/+f/BADq/2H/A/9U/8P/
+7/8IAOj/tv/p/0IAcABTANv/i/+n/7T/gf95/7b/yP+p/6n/oP9U/xX/OP+D/7n/4f/6/wQADQAW
+ADIAYgCQAKMAjwBqACUA0P+b/3j/Xf9X/27/uP8IADUAhgDhAM4AeQA6AAIAyf+K/1D/Uf9R/wj/
+1/7w/vT+qP48/hz+kf4A/8n+m/7Q/qX+HP7d/eT97P36/fb9Dv5s/qL+sP7w/gz/rP5B/jb+cP6m
+/rn+xf7R/sf+yv70/hn/Mf8s/w//Lf+A/5j/YP8G/53+V/59/s/+Af9m/+n/FAAaABYAl//D/kz+
+Jf7d/b79Bf5Y/of+wP7s/tX+1P4X/zb/MP9l/7H/k/81/xv/2/4M/nb9h/3B/fL9Tv63/tT+sP53
+/lP+Nf7q/cf9Nv73/lb/RP81/xn/0v6i/of+Yf5K/lD+hv7//nD/e/9K/zr/IP/S/sj+EP8o/0L/
+kf+n/2r/Gf/Q/sP+CP9q/7z/DQB0ALMApABzAEcAJQAXAC0AQABKAFwAVABDAE4AbABKAPb/IACb
+ANAAAAFAATIB6QC9AG8A5P+R/5j/4v86AEQAGQAFAAAA3f+y/7L/uP/R/yEAfgC2ALgAqgCkAJIA
+nwDRANcA5wAiAT4BOwEQAaYAVQBPAGYAkQDmAFsBrQHLAd0ByQGgAW8BMwE6AWUBdQGYAcAByQHC
+AbgBoAFnASsBPQGUAccBtQFYAbQAPAAnABUA1f+M/3X/6/+0AAMB/wAlATMBKAE4AUMBHgENAVwB
+nAGHAXMBfgFYARMBMAFlATwBGAFFAYoBmwGWAb8B5wHiAcQBwgHkAdwBpAGQAZ4BjAFwAYUBzQEE
+AvIBsQFxAUkBDgGxAIYAZwAdABMAewDrAPQA4gAQARkB+wBwATACHQKTAWoBXAE9ATABCQG5AGsA
+SwBqAKwA6wAcAVcBngHHAdABvQFoAfMAxADgAOEAmwBHAAAA0P/N/9f/sv+S/7z/+/8kAFkAlQC4
+AK8AgwBzAHwAcQBUACoA+v/P/7z/sP+L/3b/gP90/17/e//G/9v/m/9i/27/kf+E/5X/pP8t/9v+
+VP+o/0X/7P7b/rv+pf60/qz+kv6X/tT+Q/9v/yP/9v4P///+5v4G/z7/Tf8l/xf/W/+H/1r/Jf8T
+/w7/Fv8m/yT/E/8C/97+xf7Y/u/+6/7Z/sj+rv6u/tn+8/7W/rr+wP6r/oj+tv7z/rT+VP5n/s/+
+Fv8V/xb/Dv/U/qL+rv6w/ob+qv6+/mP+O/5X/kH+N/5i/nT+hP6F/nP+if6D/jb+/P34/Qv+Ef77
+/Qr+OP4U/tL9/f1k/pn+mf6g/sf+//49/3D/eP9M/zz/df+f/4T/VP9B/yn/Bf/0/vv+Jv9c/43/
+wP/Z/9//+/8qAEkAIwDj/+//EwDo/6P/j/+L/5L/yf/f/3z/E/8c/07/UP9I/27/jf+U/6//4P8B
+ANb/mf+W/7X/xf+e/3r/jf+S/3H/WP8m/9X+0P5C/7X/3v8qAJwAxADAALAAjQCHALoA6gDbAKEA
+XgAtAAwAxP95/43/5P8+AJcA+wBJAT4BDQEFAeIAggA2APz/u/+z/8j/1/8QAEcAWABuAHEAcwDg
+AEQBEQGwAGIAKgBHAHkAUQAVAPv/AABDAHgAbQByAMEAHgFHAUIBLwEMAecA+AAoASQBAgEPARUB
+6ADNAOoANAGcAd0BuwF6AXwBlgGVAZABigGVAccBDQI+AkMCMgITAuQBmwFFAT4BfAGaAZ0BqgGp
+AX4BTQFSAXYBjgGIAUEB9wDFAHsAlQASAQsBuADPAPgAAgEZASQBIgEnAQgBCgFsAZcBWgFPAWgB
+PwEuAT0B5QBkAFYAwwAoATkBHgEQAS0BagGAAV4BRgE6AUEBcgGNAWQBKAEDAdIAiQB1AIMAjwDQ
+AB8BPgEwAQMB8wAWATYBOgE5AUQBUwFCAeUAggCBAJ0ApACSAEIAIACHALoAXQApAEIAQQAxAC8A
+IQAoAEQALAALAOv/nP99/43/hv+A/5L/rv+Z/2z/fP+s/6P/a/9T/0v/YP+S/6b/wP/v//f/4f/i
+/97/uf+i/7L/z//l/wAADQAIABYAIAD0/5L/VP95/7z/0v+n/2L/ZP+m/7D/Vf/3/vH+G/8R/+L+
+xP5//ir+M/5I/hL+6v3n/ez9Fv6G/in/jv9E/7T+pv7z/uX+W/7Q/Zz9pf29/b39hv1X/Yv9DP6V
+/uj++f4a/2P/if9q/zb/Nv9T/zP/+/4R/y3/4v5s/if+Nv5r/n7+mv7Q/tb+5/5d/9P/xv+P/23/
+NP8D/7n+Yv4//gv+2P0F/ir+5v3M/V/+2P6s/rb+CP8a/zn/U/8y/xn/DP8K/0L/bf85/wT/LP9w
+/4X/pf/f/7H/Pv84/5f/sv96/33/g/88/wr/7P7D/rT+qv63/gj/Rv9e/4b/l/+T/5P/pf/A/7f/
+p/+0/8P/t/+F/1//a/91/1n/PP9H/2L/aP91/6r/vP+L/2b/d/+z/7z/Yv8v/3L/r/96/wX/sP6u
+/uP+5f6z/qz+6v47/0v/IP8r/4L/z//n/9///v9LAFwAVgCcAMsAowCZAMgA7gD+ABQBFAHTAJwA
+qQDqAC0BOAElASUBKwEWAe0AzQDPANsA7gADAeYArQCXAJ0AqQC2ANUADQErAQkB5AAFAT8BUwFO
+AUABcQH1ATIC1wFXARMBDgE1AVkBZAF1AXYBdwGrAaYBOgElAXEBeAFeAZEB6AHfAY4BjAHgAS8C
+OgIMAuoB6wHQAYcBYAFkAW4BmAHqAQMC1QHSARICJgLwAdcB2wHIAboBuAGgAWIBKgEdASwBHAHh
+ALwAwQC8AJsAmwDDAL8AhwBSAB8A3P+s/8r//f8BAAAA2P+P/5r/8/88AGoAkgDyAJ0B6AG7AbAB
+hwHGAPD/kP9r/zj/H/9Z/5//q/+v/+v/TgCeAN8AHgFYAZEBigE+ASIBLgH2AJ8AbABHABsA7P+w
+/2j/TP9V/1P/Yv+l//7/OQBdAKgAHgFoAUYB+QC9AFoAxP8o/5T+9v2B/Yv9w/3I/fX9TP5h/pX+
+O//c/zQARQAjAAgAzP8j/4H+W/4y/sL9d/2u/WH+7/4I/yn/dv+5/xIAfgCqAI8AXgBFAEkAKQDn
+/5f/Mv/0/v7+Ev/1/sr+2/4e/2X/p/+u/1j/7/6M/jj++P29/aL9rf3p/V3+lv6P/t3+KP/i/qz+
+7/7i/nL+dP62/m3+uv09/Qf9FP1v/bj93P0E/jX+eP6P/jn+5f3z/Sb+Uf6P/vD+Nf8c//P+GP83
+//z+nv5S/lD+lf6z/pP+h/6z/uf+C/8c/wf/6/7//iD/Gv/y/un+F/8q/xX/J/8z/yv/VP+O/6n/
+rP+i/47/a/9R/2j/qf/L/6n/lP+c/2z/M/9r/8//4f/R/wAANgAtACcAQQA/APH/k/+J/3D/+v7H
+/hv/X/9M/yj/Jv8t/y//Sf+R/97/6//w/zgAhQCQAHwAYQA8AEMAewCMAFIA5v+h/9P/JgA4AEoA
+ogAfAXgBkwGrAcEByAHYAdkBwQGvAZwBgwFbARgB0wCzAMoABwEsATIBUwFGAb8AUgBsAGwA2/9g
+/03/RP+a/28AFgEnAfgAMQGgAZABNAEoAZYBBAIjAiYCBQKgARQBywDrAAIB/wArAWIBogH9AS4C
+QAJkAmICYQKsAucC+wIfAw8DnAIRAsEBoAGCAWUBZAFyAWMBOwEAAeUADQEWAeQA4AAbAUYBVgF7
+AZgBYAEUAU0B9AE7As4BWwE2ASwBZwF7ARUB9QARAekA0gDoANoAvgDlADYBagGFAYsBZgFFAWwB
+rwGqAXMBVgFCARkBzgB7AGkAmAC5ANIADQEiAe4A4QA2AW4BPgEKAQcBBAH5APQA9gDMAGwALAAj
+AC0AIgDs/97/BwD0/7z/yv/v/+T/3v/7/93/kP+3/x0ADgC+/3D/Ov9Z/4D/Wf81/1b/cP+F/9n/
+FwDY/47/xP/7/9//yf/C/5v/Wv9j/8j/0v9w/1f/fP97/2j/Tf8q/y//S/9I/yH/6/7a/v7+If81
+/0z/Vv9T/2D/ff+M/3T/Xf9r/4D/j/+F/2b/dP+P/1f/+/7k/gD/E/8W/wn/6P7l/hv/Kf/z/rr+
+m/6b/pz+sP7r/gv/7/76/kf/RP/6/vf+G/8H/9L+xf7J/oL+Nv5j/pn+lP7H/tr+gP5q/sb+6P6p
+/p/+7f4W//r+7/4O/xj/8f7w/i3/NP8O/xT/Lv8x/zv/T/9B/0H/hf+a/2P/aP+S/4X/bf9q/1T/
+Jf8Y/xr/4f6h/s3+Fv/+/tv+6/7x/vL+/P7+/hP/Df+v/oL+qP6D/jX+Jv4+/mH+ev6b/sP+wf7n
+/mr/p/9u/0L/Sf9K/yH//P71/vv+GP89/1P/Uv9H/27/vf/b/8//z//2/0oAgwB2AEsAEQDT/6n/
+aP8I/+3+Pv/J/zgAWgBUAFQAWwBjAG0AJQCf/5X/AAA8AD0AKQDs/6v/pf+0/83/+f8WAFQAyQAE
+AfkA7QDEAIMAaQB+AHwALgADAFkAwwDgAN8A4ADmABwBYwFfAUkBdgGCAS8B5gC0AGsAKwANADAA
+jQAEAX0BzwHTAZYBZQFKAQ4B/QBFAXgBhQG8AfABzQFfAf0A/ABGAZQB5gEfAgACyQH4AUECDwKi
+AT8B/AD3AP0A8QDqAMsAfQBUAHkAmACsAOoAIwFOAY0BmQFEAc0AowDOAN8AtwCbAKIAxwD5AP8A
+BAFdAa0BogGTAaABogGUAYABcgFfASsB+AD1AB4BegHKAaIBUgFcAYYBhgFuAWcBeAFuAUEB+gCg
+AG0AXwBVAE4AOQAOACMAcwB5AFQAJgDU/8z/AwDS/5b/3/8tAEAASQBHAC8AFgAAAPn/GgBKAEYA
+HwApAE8AUQBDAEYATwBJAEIAXACIAJgAXwARAAYACADW/67/nf9m/yb/LP9R/1H/W/95/4r/k/+T
+/3b/XP+E/8v/8/8HACMALAAHAM7/p/+T/2n/RP9t/4D/EP/P/jn/af8T//T+Cv8Y/0b/aP9W/zD/
+8f7L/uv+6f6S/jD+Cf4p/kH+OP5V/lX+FP5K/u3+Gf/d/uH+HP8e//j+E/9k/3v/Of/8/iT/WP82
+/wj/4v7A/t/+/P73/hT/IP8f/0T/TP8d/9b+o/6n/rX+uP7N/uD+zf6v/pv+cf4M/qr91P1B/if+
+2f3O/cb91/3+/fH91f3T/c391P0c/kP+Hf4q/nT+n/7N/jj/ef9L/xH/Hf85/yj/B//g/qr+l/60
+/qv+oP7h/ij/S/93/8f/FABJAHMAZwAcAPv/DQAAAOP/6f/e/6X/av9T/27/pv+v/4z/mf/h/x8A
+MwA3ADkAMwAmABAA3/++/+z/DwDU/2z/BP/P/tT+2P7p/gb/Dv8r/2n/iv9l/yr/QP+G/77///8V
+ANH/ff+Z//j/GQAYAB0AKwBcAKcA1wDZANcA5wAZAVEBXwFMAUUBMAHhAMYA9gD7ANEAmQCBAKoA
+uwCAAFIAmAD3AAMB8QDrAPoAFwHrAIwAewCwAM0A0gAFAT0BIAEBAfcAsAB7AJMAqAC5ANsA1QDb
+ABkBJwEAAQ0BVgGOAYYBWAE8ASIB8ADZAOgA/wAVASkBTQGPAcoB2gHqAQgCEQIaAh8CLQJEAhIC
+xQGkAYsBkAHeATECOgIqAi4CGALwAfgBKwIxAuYBmQF9AVgBCgHLAKwAqADjAC0BNgH/ALAApAAC
+AU0BTQFBAQ8B3QAZAVEBCgF0AO7/7v9KAGkAOwA6AJcA2gC8AH8AXQBXAFkAYwBfAEcAUwB9AKAA
+yAD3AEQBiAGnAdYBBALqAW0B5wC7AKcAbwBAAEYAjwDtAEQBawFDATIBRwEsAQEB6gDQAKIAfgB/
+AGAABgC3/5f/hv9O/0P/tv/2/5j/HP/J/nj+P/5V/of+tf7J/sf+FP9R/+/+pf7k/hn/C/8N/zn/
+Zv9V/zj/UP81/+7+9/5g/+r/DgDK/+j/hwDVAI8AMADs/9n/MACCAEMA+P8qAEwA9/+H/wv/S/6f
+/Xn9wP0Q/jf+VP6C/sn+Af/2/sX+p/67/vz+PP9d/y3/lv4v/kL+If6z/ZL9iP2K/RP+mP62/tr+
+4f60/pb+a/4u/kT+r/4M/3H/0v/G/2T/FP8Q/z7/RP8e//b+4P7y/tr+T/7K/bz9w/3H/RP+Xf5t
+/pT+uP6c/oj+ev5l/rH+Z/8AAEEAZQBVAOn/aP8Q/+v+9v4u/2//cf9p/53/nf87//j++f72/iT/
+0v98AKEAXwAQAMj/fv85/9/+jv53/n/+qv7A/nL+Mv5A/kn+Uf59/nr+Kf79/UP+1f4t/yr/MP88
+/2X/y/8CAPX/5v/T/8j/w/+A/xv/EP9r/5j/f/+4/z0AigCKAJsAtgCKAFEAaQC/APcABAH6ANEA
+sgCUAEQA2v+//wUANwA+AHEAhQAEAHf/YP9R/xv/Ev8d/0r/yP8aAAAA5//Q/6b/xf/y////SgDR
+ACsBRgFKASYB2wCuAMcA8wAWARABwgCCAHkAcwCFANMAMQFRAU4BcQFzAS0B/QDkALUApwDgABwB
+EAHTAJ0AgABdACQAFQBYAKYAnQCJAMkA7ADLAMMA2QAMAWEBhgGiAQQCGgLQAcgBwAFPAfYAzgCG
+AIAAmQBvAJAAIgGhAfQBSgKbAt0CFgM2AxsDtgI9AggC2gF1AUQBTQE0ARABGAE5AX4B1QENAjoC
+cQKcApoCVALbAWoBLAH/AM4AvgDLAPwAPwE6AeoAuADdABgBSAGLAcIBrQFiAUoBXQFsAZMBlwEz
+Ae8AFQEmAfoAvABRAAAAMABvAEsANgBnAKgAwwCTAEAABgD1/+n/rv+o//b/zP9F/zP/ef+j/6D/
+mv/J/xsATABAACAADgAWADcAXwBYAEcAlQDNAIgAQgA9AFcAVgA2ADYAKgABAPv/AwD5//T/8v/n
+/+3/4/+f/3D/hv+a/4v/Xf8z/1//l/9g/y7/Kf/y/sT+yP64/pv+jv6D/on+mf6e/q3+s/6N/pD+
+0v7o/t3+5f7t/uH+4/4C/wP/4P7J/rv+x/4N/03/Rf87/2X/lf+W/2z/Nf/x/qP+ef53/mP+af6h
+/sT+2f7j/un+Jv+C/7f/rv+H/4D/df8v/9f+mP53/lH+FP7X/Yf9RP1U/Wb9Mv0o/XP91/1H/qf+
+0/7W/qn+Rf4S/jn+O/4B/vf9NP5O/gD+of1C/dL8zfxG/bP9+P1r/ur+Fv8j/x//6/74/k3/ef+C
+/4r/dv9f/2D/Sv8M//j+Vf/U/wYAJQBoAI4AdgA0AND/Z/8V/8P+ZP4w/ln+nf7J/iH/ov/8/wQA
+9v8pAGQAUwAPAJr/I////vb+1/6R/ir+Kf6n/gH//f4l/7P/NwBqAIQAxgD8ANoApQCrAKQAdAA3
+APL/7P8zAHQApwD2ADcBSgEyAdcAgQCAALEAvQCeALYABAEoAQcB1wCzAG4AGgD+/yYAegDcADgB
+eQF+AUEBIAFFAUwBLAEaAf8A3QCdAFcAbgCnAKkAowCyAOAAHwFPAX0BmQF4AWgBwgH8AaoBagGJ
+AWkB9gDIAMgAlQBkAIAA2QAlAT4BLgEfAUUBjQGdAXYBbgGXAc0B9QHxAasBWgFFAUYBOAE+AVcB
+jQH9AUgCRgI7AvwBgwFiAbYBEwJEAk0COwLuAYUBXgF0AZQBoAGlAakBwgEjAmUCGwKZAUUBEQHt
+AN8A1ADpAPcA2QDQAMUAgABXAIsAuACeAJUAowCFAGUAdgCcAKwAoQCQAFoAEwASADQARwBMAFwA
+nACzAGsAOQBKAFYAXQCCAKQArQC3ALwAsACiAJUAewBvAJkA5AAGAdkAswDGALAAfQBxAGoAdACD
+AGwANADX/1//JP88/0b/Q/9O/03/ff/T//L/9//6/9X/1P8cACEAx/+Q/3r/K//g/gL/Lf8G//z+
+X//Q/wAABQD2/+P/5P/4/wYA/f+9/3//bP9U/x//1P6b/nj+Y/5y/pj+pv6e/qj+uv7p/hb/Bf/f
+/t/+Ev8k//j+7P4D/wD//f4o/yT/wf6j/v3+IP/t/t/+A/8V/+7+nv6B/qX+pv53/oL+pf5h/gD+
+7/3w/dH9v/3b/Qn+Af76/Tr+h/6z/tH+8v7v/rD+dv59/qX+s/7D/gb/UP9s/6X/DQBFAEwARwA4
+ACcAKgBOAD0A1v9+/1b/R/8t/9P+gf6R/uX+MP9M/1L/Tf9J/2r/o/+1/4D/UP9X/0j/Iv8M/9L+
+ff5s/qP+4f7v/sT+z/4e/xn/z/7B/vP+LP90/8T/y/+O/3r/t//+/wUA5//e//L/AgD6/9f/tP+j
+/5z/vf8IAAwA3P/j/wgALQBDAEIARwBDABkAEgA+ACwA7v/M/8P/yv/9/zsANgAGAP//EADn/7X/
+vP+7/8f/HgBLACkALQAnABEALwBRAGcAYwAlAAUASgBqAP3/tf8KAGMAYABSAGEASwAJABYAawCN
+AKYAzQDNANUAHAFUATkB6gClAL0ALQGBAYIBRAECAUQByQHXAZ4BfwGJAa8B6QEMAroBGgHVAC8B
+sQHXAbQBgQFaAUcBMgE0AUoBLAH+ACIBJAGWAEgAeQBrACMALwCPAAIBfgHBAbABiQGQAccBowHo
+AFkAhADPAL8ArgCPAC0A1v/m/0UAjgDLABoBXAGIAZABggF5AZUB6AEdAgUC4gGZAQkBewAhAOj/
+uP+7/xEAgwDvAE8BlwHYAfMBswFfASsBEwE9AUgBwgAvAAAACQD9/5f/G/8h/7z/OAA/ADQAHwD8
+////HgAuACAA9f/d/+r/q/86/0P/lf9t/wP/Df+G//D/CAAFABkACgDi/+r/+P/0/+3/yv+l/8H/
+DgBLAFoAQwA6AGEAkwB8AFUAdAC3ANwAqwBDANT/Xv/q/pL+hv62/uH+FP9a/1r/G/8Q/0H/if+y
+/7X/0P+t/yT/5v7q/oz+Cf7z/R3+Vv6//jT/b/9o/0v/LP8M/+r+vv7L/j7/uP8HAEEANwDg/43/
+f/+I/1X/DP/n/vf+O/9J/wD/v/5z/hL++P0Y/h/+H/4o/i7+R/5//s7+Jv9i/5D/yv/+/zEATQAW
+ALj/aP8p/xL/Ef/1/rr+lv60/uf+Dv8y/x3/1/7m/nr/9//p/6//lP98/37/ff8Q/5v+fv5y/o7+
+pv6C/or+tf6i/mr+MP77/ff9Rv7B/gv/Gv8u/0b/YP+P/6j/kv+a/8//6f/r/8//jf+C/8r////e
+/8T//f9qANkA8gCyAH8AawBTAEMAQABQAHMAmwCyAKcAcwAUAMr/uf/L/+z/8f/o/9L/gv8///T+
+Ov6u/cn9Ff55/iT/zf8ZABMA7f/K/87/3//Q/8D/6v9QAJgAlABZAOj/of/a/yIAFgDQ/6f/zv/4
+//b//P8yAGAATgA7AF4AlACsAJoAZQAYAPP/AQAQABAAJgBnAGMAFgAdAG0ApgDRANgAxwAMAXoB
+jwFVAQ8B/AAhAR4B7AD1AAYB3QDFALQArwDYANYAswCqAIMAcQC7AOEAtADBABcBSgFSAVgBWAFE
+AS0BLgE7ATEBHAEjATEBGQHjAK8AngC7APAAMgGOAeQBBAIaAiMC9AG7AZMBZAFNAWgBngGwAZAB
+aAFHAUIBUgFMAUwBegGjAZgBqQHZAboBfAFfAR4B0gDzAE4BXQE/ARIB3gDxADkBVAFKASgB+AAZ
+AWgBawEuAQ4BIAEXASMBYgFGAcAAdwC0AA0BDQHQAM8A/ADzAMEAqwC1ALsAywDXALkAgQBgAGwA
+cgBDAA4ADAA2AD8APgBrAHIAPAA5AIoAtAB5ADwASQBsACUAv//M/+f/vP+0/8b/kf9n/53/0P/B
+/5H/Y/9l/5D/s/+1/5b/gf+1//T/x/9b/zz/bP+O/4T/lP+1/3T/6v7l/l//gP9e/0r/Rv91/5r/
+fv9u/5P/rv+o/5H/Y/9E/0T/I//v/vX+Gf8V/xP/QP9g/07/S/+e/wMACwD0/wEAFgAIAMn/cP8j
+//H+3f7U/sb+s/6E/mD+lf7J/r7+zf7b/qD+Xv5D/jz+K/4F/gH+NP5X/k7+av6c/oT+Q/4k/iD+
+Df7p/fz9U/5//oP+oP61/qb+hP5u/oL+rP7V/v7+C//4/ur+Af8r/0H/TP9c/1z/O/8V//P+rf4z
+/rv9jP2l/cX93/0l/pL+6f4X/yn/Mf8n/x//Df+3/o3+zf7g/r3+mf5X/kf+ZP5S/nP+4v4H/wr/
+Pv8i/7b+g/6A/mj+Uv5o/p7+zP4A/2H/q/+y/7//2//b//P/HwAjACIAIgACAM//nf97/3X/ev96
+/6L/DACUAPQAIgEuARIB4gCaAGcAgQCkAKsAzQAIARsB4ACDAFwAZgBvAHAAkwCxAHoAZgChAJMA
+OwD2/+b/+/8VADkARgAnAAIA4v/k/wsALgBFAGAAXwBVAIoAsgCIAG4AlgDHAOIA3gDEALQAzgAC
+AfIAxgD1AEIBWAFKAUIBWgFwAWYBWwFaATIBHgF1AccB0gHJAcMB0QHJAZMBUwE5AWYBwQHwAbkB
+dwF2AYUBgwFyAWIBXwFrAbABAgL7AcQBtAHGAdUByQGsAZUBdwFWAU0BXQFPAfMAuwDgAPsAAQEr
+AVQBWwFzAbUB5wHhAcgBmAFJAQMB0gC2AMcA3gDSANUA4wDWAM0AzwCuAIcAqgD7AC4BSQFdAUQB
+DQH3APwADwFOAXwBdgGrAQcCCQK/AWEBHQELAf8A6gDcAKgANwANAFUATADb/7L/rv+H/7L/FAAh
+AAoADAADABoAPAD9/5r/ff+R/5z/oP+y/7n/s//g/wcA2v/H//3/MwBLACwAEwBGAIwAkgBfAFgA
+kACGAEMAQgA9APj/2/8fAGsAUgATACIATABAAA8AAQAMAOX/xf/f/9n/wf/O/9H/xf+T/yX/E/9r
+/1n/3v6e/qP+x/7j/rz+kP5+/k7+X/7U/gD/v/6a/s3+/v71/gL/I//O/j7+K/5m/ob+q/7U/sP+
+e/5R/mz+j/6j/sT++v5K/5P/r/+u/6D/hv91/33/ev88/xn/Ov8O/4b+Pv5m/p/+h/4v/gL+Gv49
+/lj+Z/5g/mX+kv6r/p/+gf43/i7+oP7H/nT+P/4q/hf+P/6O/rH+f/47/k7+iv54/ij+/v0b/lL+
+ef6//gv/Bf/3/kT/hf9j/0j/Yv9A//L+Bv9X/3L/Vv9A/2L/kf+J/2L/Ov8W/xD/Df8L/w//6v7Q
+/u3+A//i/q7+hP5t/oX+pf6T/n3+qP79/j3/Sf9B/zz/Hf8f/2T/Z/8p/yX/Lf8A/+X+Av8l/xz/
+7v4A/1b/af9A/1r/pP+g/2f/Uf9b/3P/kv+t/83/+f8UAA0A//8SADoATABAAC4AQwCUAPIAEAHq
+ANoAEQFJATcBKwFtAZsBmAHAAfkBxgFgAWgBpwHjAScCOAIxAh0CyQF9AWoBPQH0ANAAvwCBACkA
+BgADAOL/v/+s/6f/6v+JAD0BhwFgAUMBWQFBAdIAgQCPAKUArQDLANYArwCNAKoA5wAlAWcBpAHO
+AfUBCAL6AfwBCwIHAgYCFwIAApsBIQHLAG8AGQAPADEAgQARAY4BygHcAQ0CTgJCAvABlQFmAWIB
+RQHnAH4AXgB/AJcAnwCcAIAArQAeAUEBIQENAdgArQDsAFoBtgHKAZsBkgGaAWkBDwHMAKAATQAV
+AFwA7QBVAVwBRwFrAaMBuAHHAdYB3AHVAZ8BjAG7AcsBwwG2AZkBmwGlAZcBswH1AQkC3AGBARIB
+kQD6/4f/Tv8u/y7/MP8u/17/lf+a/5v/1/9OAK0A0AAPATUB3gCVAKEAbQDi/4P/b/+F/+H/SABW
+AD0AOwA/ADAA2v9m/2T/4P9zANoAEAH1AEgAhv9L/0f/Hf/q/qj+dP62/jL/U/8X/9z+sv6o/tb+
+D/9c/6P/cf/+/tT+2P7p/hb/RP+J/+z/PwBhADoA9v/D/7P/sv+B/y3/+P7x/vf+8f72/vr+2f6z
+/tf+Of+C/6X/rP+R/5T/uv+j/0z/Av/g/t/+zP5h/gH+IP5h/mX+Tf46/i3+Ev4B/lb+4P4H/8z+
+m/6i/tT+8v7d/rz+pv6Q/m/+Nv4M/hX+MP5W/nf+lP7i/lD/lv+e/5v/d/8J/8f+8P4//3X/kv/U
+/xMAJQAnANv/Xf81/0r/Sf9G/17/Pv/B/lb+CP6R/SP9CP0L/T792P1s/qb+i/5D/ln+4/4i/+z+
+1v4Z/1f/Zf9e/yL/yf7M/hz/Mv8i/zj/Q/8q/z3/bv+J/7//8v/7/yMAWABDAAoA7P/b/7L/iP+T
+/7n/8f81ADMA+f/K/5z/U/8V/w//Gv8U/wj/F/9P/5X/zf/l/9T/xf8ZAI0AeQAnABgAHwD//8v/
+j/9U/y3/Hf9U/73/7P/1/1UA1QD9ACABcAF0ARsB4QDdAK8AdABfADsADQAFABkARwCCAL0A+wBA
+AZUB6gEiAjoCTAJUAh4CvQFxAU4BLwERAQYB+gDwAP0AEAEPAfwAAAFHAX0BWgE/AVIBTgE5AUsB
+TAEAAc4ADQFYAUYBCwHRAK8A0wAgAUABKgETASkBcgGQAVcBVQGpAbABaQF1AcYByAGSAaMBygGt
+AZEBlgF1AVUBeAGJAWMBYgGAAZMBigFCAfgA+gA8AV8BIwETAX4BxAGGAVABegGVAWEBIAEPASQB
+OgExAREBBgEEAQQBBwHiALMAmwCgAAwBZgEaAaUAbgBbAEQAHAD5/wcASAB7AKsAsgCKAH4AcQBg
+AFwAeQCrAKQAiQCUALIApwB+ALsAMAH5AFEAMACWAPQA9gCaAFkAeQCOAHgAfgBvADkAHgAOABsA
+XQBcANf/cf+6/zAASQApADQAiQCjAFIAJgAhAAMA5v/j//P/9v+r//3+hf6K/m3+Hf40/of+of7R
+/lr/3v+4//L+l/7u/iX/wP46/jH+Yv59/pj+ZP7X/ab9/f1E/jj+WP7g/jv/L/8L//n+Hf9A/xr/
+Fv9V/23/Vv/+/n/+W/53/o/+0P4m/5z/NgBsAC0A7/+t/yn/hf4F/sP9uP2i/WD9VP2c/fT9Q/5e
+/jX+KP6x/lb/TP8F/+T+mP4q/tb9sf2n/XX9NP1S/Z79ff2O/H771vzKACgDrgGq/j/9Tf5MAPIA
+Yf/h/Ur+af/j/4//zP4w/nj+pv9QAJH/d/5J/sn+OP9D/+7+o/7q/sf/cgAFAMP+F/7U/t//X/9d
+/e795wKNBGH++vkn/+0FswNU/CP7lAHWBWgB3/rk+2IC7ANR/sj6C/7QAcsAm/0W/bP/cAEcADf+
+cv4MAGoA2/54/Wv+vQByAe7/xf4AAAwC3QHd/zT/rAD2AZEBqwCrAFEBoQEjAW0AXQC0AIIA9P8y
+APkAAQFhACsAzQB1AVoByQCEAPIAqwHBARoBzAAqAUgB6ACyAPgAbwG5AZoBRwFIAWcBLwHiALAA
+ewBTAH8AGAFaAcUAawAIAaMBSQHGABcBegEgAaQAqwDNAGIA0v/v/3UAmwBnAHAA6gBuAWcB7wCq
+ANMAEgEKAe0A7gAcAZMB0gFUAaMAUQCLAHABEgKiASYBewEgAlACuAHpALoAOQHbAQICigEUAe8A
+4ADWALwAVADR/73/UADqAPAA2QDzAPAA+ABFAYEBggFoAUMBVQFgAbwA4v+t/+3/FAATACkAWQBz
+ALgASAGqAaMBmwHeARkCDALeAbABgwEjAXgA+f/P/43/Yv+W/7v/zP8EAEAAZwCJAMUAGAFFASwB
+JwF3AZwBXgEPAb0AYQAkAPv/0f/d/+z/p/+e/1QA4gCZADwASgB4AH8ARQAJAMr/Q/8G/1X/Vv+2
+/k7+pP4Q/yP/V/+d/3H/O/99/9r/8f/T/7z/nP9t/2L/UP9V/5r/yv/G/53/b/99/7n/6v8PABwA
+JwBcAH8AYQAVAK7/WP8m/wb/4P6n/nX+cf6I/n/+Xv5u/pP+lv6o/uH+E/8F/7z+qf69/pn+XP4P
+/r79yP0B/gb+A/4D/hH+Yv6W/mH+Rf6E/sz+D/9Z/4X/f/9b/0T/Yv+k/6P/WP8s/z3/dP+D/1D/
+Ff/o/uX+Gv8//z7/Rv9D/yz/Kf82/xr/0f6W/pf+1f4I/+D+vv4K/07/N/8Q/yb/Xv9q/1H/N/80
+/1T/SP/c/or+rP7I/rn+3/7e/pL+kP7D/tP+xv6n/rr+Hv8p/8f+w/4a/xn/2/7t/jP/Uf8t/wr/
+Ff8t/0j/av9+/63/BQA/AFsAYwBOAFEAegCQAHAAYgCAAHUAUAAyAAwA6//j//3/KQA8ADAAJAAY
+ABoAJgAhABsACwDu//3/FADq/67/pf+i/3X/E//R/iL/r/8DACMAEwAEADcAZwAZAIT/U/+g/w0A
+QgAhACoAaQBlAEQAVwBuADQA3//+/2QAagAsADwAiQCzAM4A/AAsAXEBugG9AXUBFwHmAOUA1AC3
+AL0AIQHNASkCBwLzASYCLQLsAZwBWAFDAUUBQwFlAZ0BzwHXAXwBLAE9ASAB1ADrADABQwFEAS4B
+vQArABwAiQDgAOcA4wA0AYMBYAFRAZ8BsgE2Aa8AuAAcAWMBegFgARIBzgDfACYBaQGYAboBBQJd
+AoMCigJtAhMCtAGaAcYB7gHXAa0BpgGqAY4BTQHiAGYAMwBCACwAHABgAIsAegCZAL0AhQA4ACAA
+KwBuANMA2gBmAPz/GgBWAAsAqP/I/yEAUQB/AMQA1gCgAHkAngCoADUA0/8iAK8A1wDIAMwAnwAu
+APv/+/+5/27/df+R/4//lv+O/0r/Df/q/tv+Cv9q/8D/9/8CANH/bv8A/6b+gf6M/qr+zv4d/5v/
++P/p/3H/+P7J/tz+Gf96/97/CQAOAOL/f/9J/wz/sf7u/pT/6v8AABAAJABDADYAzP9g/1T/Z/9Z
+/zn/Ef/q/uP+6f7E/pf+hv56/mv+iv4C/4H/k/9u/3j/l/90/xL/yP7H/tL+z/4K/yj/1v6u/ur+
+MP86/xz/J/9g/5P/xf/f/7D/c/9n/2T/jP/L/8n/pf+T/5P/Zf8N/+7+GP9B/1H/WP8p/8/+pP5y
+/u39a/0m/TP9mf0K/mP+jf5o/lr+qf62/ir+uv3k/Tn+Vf52/sD+3P6o/oD+wf46/2T/ZP97/6f/
+8f/x/8T/6P8HANr/x/8NAE8ASAAMALn/f/9//5b/q/+p/5T/jP9e/wH/2P7a/sb+wv7e/g3/WP+X
+/7v/+/81AB0A8v8oAK0AyQBcABgABQDc/7n/o/99/0T/Of9z/7n/yf+n/7n/HgB8AI0AdgB6AH0A
+UQAYAAQA///a/6//tP/E/6X/ff+M/8D/4P8JAEsAigDbAC4BewGxAZgBaAErAcsAjQBxAGQAZgBP
+ADcASABpAJQAvQDKAOoABwHnANgA9wDwANEA1QDaAHoAAAA6AHMAFQA5AIkAYABrAFkANwB7AJMA
+oAD5AEEBDwGuANoA4wB9AJsA5wDWAJYAkwADATMBCQESARgB7ADSAOoAMAFbATEB/gD1AP8ABAEF
+ATMBbgGHAbcB6wHNAYEBbQFhATABPwF5AWIBHwEcAUgBfwGWAVYBEgEwAaEBAwLKAS8BDAFdAWAB
+CwHIAHEAOACBAOYABQHmALkA4ABRAX0BXgFMAT0BMwFSAXsBdgEiAbAAeACKAMUA2ACjAJMA9QBs
+AYUBZQFEARsBIgF0AaABYQEiAQwByAB9AIQAoQCrAK4AngCnANkA5gDFANMA/wD9APcABgHgAJEA
+YwBXAFoAbACGAHsAGwCw/8//EADy//D/5v+p/7L/z//W//7//v+n/4L/y//y/8v/zv8AAP//6P/q
+/8H/cf95/8L/7f8RABcA9v/h/8b/mv+H/6z/vv+Q/2T/Y/+F/6L/qP+e/4P/d/+Y/8b/v/+1/93/
+7P/R/8P/yv/U/8j/xP/Y/9H/mv9Y/0r/S/8d/+v+oP4o/i/+xv4H/8b+Y/4l/kj+eP53/nH+W/4r
+/hn+S/5Z/gb+1v3z/Q7+M/6H/r3+wP7v/jj/Sf9C/0//Rv8j/zH/XP9y/5H/hv9I/z7/PP8J/9/+
+4f7j/oL+QP67/kL/OP+9/jL+L/6w/uH+f/4L/gn+gP7S/qf+Yf5g/pT+r/6q/rP+tv6U/pf+9v47
+/yb///7P/pX+rv7i/rz+m/6a/oj+mP6o/oX+d/6h/r/+tv7A/vD+8/6t/pH+q/6m/pb+l/65/hL/
+X/9y/4L/t/+9/3r/bv+k/8P/1v/x/+D/sP+L/3D/dP+n/+v//f/T/8v/5v/4/yYAQgA6AHoA1QDZ
+AKcAaQA1ACEAHQAqACkAAAAUAIgA5ADoAMoArwCQAGgAJQAPAD4ATAA3ACcAEwDk/6r/kf+e/8j/
+6f/h/73/yP8aAHsAjQBDAA8AHwAzACYAKgBNAFIATQByAJIAdQB6APYARAHUAHUAuwAuAY4BrgF5
+AU4BWgF2AZcB0wEAAhECLgJBAjYCCwKhASQB7gAIATEBMAHyAJgAcACXANsA0gCSAIEAjAC+ACoB
+YgFAAQwBEAFXAX4BLgGfAFUAXQB3AJAAjQBlAG0AzwAuAUwBSgFcAZABsgHMAQACIQI0AhoCfgH2
+ADQBkAFNAdcAygAPATwBGwHkANcA7AD2APkAMQFyAX4BYgE7AU0BcAE/AQ0BMQFYASgB6gDHAKUA
+tADFAH8ATgB5AJgAlgCkALYArwBwACcAXwDQAIQAyv/C/y4AKwDj/9n/9//k/6P/kf+8/+n/GgAp
+AOT/s/+7/5v/iP+9/9//z/+//+//XgCjAGkAGAArAGkAkACVAH8AbQA9AOL/qP+A/zT/+/7s/gn/
+Kf8P/wv/L/8z/yf/TP99/0f/6f73/gb/sP5f/hf+0/0D/mz+nv6Q/m3+k/4J/z3/+/7X/hb/av+w
+//P/AADn/+r///8YAD4AUgAkANP/pP+F/0j/IP8e/wT/D/9v/3//Lv8U/yv/Iv/h/o3+c/6j/rv+
+r/7C/r/+c/4d/iT+ZP5t/mz+qf71/if/QP9M/2n/jf9r/xH/Hv95/3f/Kf8A/9b+kv6Q/ov+Xf5Y
+/k/+T/6J/oP+O/5E/oX+of6B/j/+HP4r/mr+qv6y/rT++f5c/57/xv/v/wwABAD+/yEAYgCRAH4A
+QwAbAPX/yP+s/7X/2f/D/47/mf/C/9j/u/+P/43/d/9K/0v/dP+q/7//mv+D/5j/lf+X/7P/YP+v
+/on+C/+J/9P/DgAGAPD/LAB3AIIAMACf/1L/ef+V/4H/qP8PADgAHwAWAP3/zf+f/2P/Rf9s/6z/
+1P/m//P/8v8FAHYA/AAmARoB/QDGAIQAHACW/1z/iP/N/ysAvwBcAcwB7AGyAWcBOAEHAcYAlACc
+AMwA6ADeAKoAZABZAHUAOwDq/zYA0gDzAL8AegDX/yf//f4k/1b/dP+F/8j/HgArAAcAIABeAAAA
+LP8x/zMAnADp/6v/lgAZAVwA0f/GADkCJQLmAMkAOQIGA+8BgQCfAMsBCQI2ASoBPgK5AskB1wAJ
+AU0BigBp/xH/kv8RAB4ADgBAALQACQHWAHYAigAHAXoBuAHHAYwBRgFjAVkBrQA+AJQA4ADDAMQA
+EQGXAdYBbwEbAS4BHwH2ADgB1wEtAgcC5wEEAvUBjwFVAVYBUQE+AQsB/wBSAYABBAFoAF0AqgD7
+ACQBKwF0AcABiQEMAbkAuADXAAgBhQEYAlsCRgL3AYgB+QBiADoAjwDKAJAAVgCAALkArgBdAA0A
+BwAuAI0AHQFLATEBKAH2AL4AqAB2ACcA4v/B/9H/6v+7/0L/7v7z/hn/IP/f/pH+lf7C/sT+uv7h
+/hz/NP9P/6T/7v8XAE4ALQB1//n+Yv/x/9j/ff+B/9P/6P9Z/9H+Wv9zAKEAXf8z/Uz8jP6UAXkC
+PQJvAngC0wCe/cX6y/lf+3D+0QCoAWIBXAAO/s76M/nB+of9t/9bAsAEFQOu/af5GfmN+Y753frg
+/sYDOwWpAbf9Qv0J/k39XPzF/QwB+QL7AWz/3/xr+8v7Vf2A/iX/nwD5AtYDtgGJ/hz9av3D/cr9
+Sf6J/48AmwA8AOz/b/+f/gX+Gv61/ir/0P5U/p7+B/+0/j/+3/4QAFcAAQAJAFkAcwAbAKv/pP+R
+/7L+V/1M/OH7Lfw6/Wn+Jv+4/18A0QDXALcAkgBFABcAOgBCAO3/W/+C/qH9K/0b/Sz9eP0u/h//
+RACIAWECiwIsApUBDgGDAP7/qv9r/z3/QP9M/z3/TP+V/+z/SACoAB0BswEBAssBWwH5AIYA2P8q
+/+n+H/9m/4r/hP+K/ygA9QDTAN//ev8ZAIAACADH/4sAlgAt/T34OvjH/ZwBPwEFA8EJCw5vCRgB
+Lf7lAMEByP09+63+1QKZAS/9MPvb/Fv/xwAOAiEEOgaXB/UHbwa/Ajb/Z/56/53/Wv6r/Tn+jf79
+/eb9TP8qAaACAwQgBUgF9gQMBRUFAAQ0As8A1f/d/rD9svwM/av+9P9XAO0AagLbA/ID6wK9AmkE
+mQXCA40Ap/8wAWUBev4E/LH9CwH7AP39mf2sAVwFWQRnAewBPwVoBhkEgwE0ARwC9AFUAKj+Y/60
+/0sBVgHB/83+VgAmA2cEhgObAhcDyQMdA5QBywAyAakBSwGWACUAmP/I/nf+0P5H/7f/QgDsALAB
+eQL4AvsCfAJ8AZoAlQDiAHwArP9Q/1v/H//E/tb+CP/u/tv+Nv/e/2cAiQB8ALsANQEtATUAO/9t
+/0AAcwAAANL/OQBEAFL/V/6f/vj/JAGMAVQBuQAAAID/gf/c/xYAEgARAAoAbP9Z/ij+O/9PAHUA
+0v/o/mP+qP4o/yv//v4P/83+rP18/Fr88/y8/db+0f/O/xT/Ov4y/an8g/0I/zcA3QCMAGn/pv5n
+/tv9ZP3c/QH/AQBTAM7/8v6h/uT+Fv8O/9T+mP7h/kz/Fv+J/nL+6v5R//r+3v3o/NX8Yv3//W3+
+rf7g/hf/Bf9X/qP90P2z/oL/6//u/1H/O/6N/Zr9wv21/cb9Bv4g/u39pf2d/dH9B/6L/lP/f/8A
+/6r+vf7Y/sv+0P7j/qj+cv6a/qf+nf77/mX/bP9V/wb/Yv4w/pT+8v5V/83/9/+6/17//v6K/kf+
+mv4v/3//kf9//07/Jf8V/xj/Gv8P/wv/Mf9k/2T/Ov8d/xr/Fv8c/0n/ff+h/+X/EgD4/wkAVABu
+ACAAdf8B/z//uP/4/x4AFgCn/2z/xP/v/7P/ov/U/+n/zv/C/+j/BAAXAEYAKACm/0f/UP97/5X/
+iv9c/2r/rP+w/53/wv/3/xEANwCUAP4A4QAkAHv/j/9NAN8A4AC4ALQA3gASAQcBtwBuAJwAZAE+
+AmMCoAHFAHkAQQDa/5T/Zv+R/0YAuwB5ACQANQCMAPEAIgEeASQBQwExAcMARAAGAA0ANgBiAHEA
+fADOAD8BfQGSAa8ByAHBAbQB4AEoAgcCkAFcAYIBsAGvAXkBCwGoAJUAwQDtAAABCgEaAToBXAGO
+AdcBAQIBAuwB4AHQAZsBTAEKAdsA2gAVARUBDQGHAQMCHwIRAucByAHXAasBKQHkANoAxgADAUcB
+CgHQAN4A2QC9ANsASQGHAT0BGAFxAakBkAFhAUABMQEUAd0AoACvAAwBQwEvAQMB7QD/ACcBOQEP
+AegAHQFKAQQB1wD6AOAAkQBkAGIAZQA7AA8AAADy//f/IwBAAC8ANgBrAJcAgwBDAF0AqgBhAL3/
+bf9P/yj/J/82/0P/b/+J/3z/ev9o/0P/N/9B/27/zv9AAHUAOAD//zwAbwAyAAIADgAGAOb/w//B
+/+P/4f+7/9P/EQAKAN3/4P8HABsAAgDN/7b/3/8IAOL/qf+X/4j/iv+T/3z/Pf/0/r/+xP4B/wn/
+4v7x/vX+vf7H/hz/L/8M/wr/+v7W/tf+6v4H/yP/B//k/vb+//7f/sj+v/6p/pj+if5p/jb+Cv4w
+/pr+1v7e/vb+GP8j/w//Dv9N/4r/nv+1/9H/zv+h/3P/cf+B/3j/hv+6/7L/g/+L/5j/hv+U/7b/
+r/+F/2X/WP9P/zv/Hf8F//v+/P7u/uX+4/6s/lH+Tv6h/rP+av4F/tH9Lf7S/jH/Nf8L/x//sP/7
+/03/Zf4+/on+mf6D/n/+g/6h/t7+QP+r/93/8f8aAEsAfgCjAKsAwgDrAAIBHQEiAdgAcAA7ACsA
+6P9Z/+f+1/7y/vD+5v5Z/14ADAH/APsAWwF6Ad8AEgAFAKcAwwDP//T+Bf8L/1T+xv0Q/ov+xv76
+/jD/YP9m/17/x/9TAD0A9v/n/3X/5/7w/hT/uP5k/tD+u/9kAHYAYgCjAAcBYQGDAT4B4QCvAIcA
+dgDVAFkBUgH4AN4AFwFTAT4BBQEcAXwBqAGqAa0BZgHjAGgALAARAMz/jv+t/x4AeQCWAMEADgFP
+AX0BtQH3AfABfQFBAXcBXAG/AD4ACwAYAJAANwGZAZcBdwGNAa8BhgE4AS8BYgGfAQECeQKTAjcC
+4AHOAb0BhAE2AcYAgwC2APUADAEsARwB5QDrAAMBwAB9ALUAAwH4AMQAmAByAGgAcwCPALUA3QAa
+ATgBHgHxAKsAcgB5ALEA0ADMAO0AJwFCASoBwABfAH8A2gArAVkBRQEnASwBMwEtASoBFgHaAIwA
+SgANAMb/h/9l/0f/KP8y/zn///7x/lj/tv+j/3L/lv/M/8P/ov+S/6v/3P/9/yEANgAjAAgAAQAz
+AGYAZgBtAGgAZgC3ABEB/QCYAE4AUgB7AI8AhQCCAIsAkQCTAEoA1P+m/7j/xf+o/2n/Ev/M/tP+
+xv5h/iD+J/44/l3+ov7W/uT+6f75/gj/9v7S/tL+BP8k/zH/cv+p/3f/+P7O/i7/cf+A/63/zf/i
+//v/vv9b/1n/bf9c/5H/AQAWANz/qP9M/8X+a/5Y/n/+2P49/5T/wf+w/33/N//q/rX+oP6Y/qL+
+tf7C/r/+xP77/gP/xv73/k//D//F/s3+sv5//l7+Nv4H/rn9dP2c/ff9Ef4F/i3+Z/6V/vX+Uv9d
+/03/dv+//5f/C/+m/nX+Zf5+/qP+sP61/ub+L/9J/3//FgCrAOsA8QDRAJsAcAAvANv/xf/Z/7v/
+gf99/4z/dP9f/1H/Xv/O/ygA7f/F//L/5P+w/5j/aP/+/rb+2f73/sT+h/5v/oD+s/4J/4X/6/8H
+APX///8hAN//VP8v/0f/Sv9w/5n/ff9T/2n/pP/O/9///P8cACAAOwB2AHoATwA4ADcAVAB1AIgA
+hQBlAE4ASAB1AL8AxQCWAHgAgwChAKYAmwCiAJYAjQCzAKkAagBvAL0A/gADAQgBIQFEAXUBWAHn
+AKsAjQBkAHwAtADLAMgAnwBhAEIALQAEAO3/EwBKAEwAagC0AI8AAwDY/zcAngD4AFMBQgHpAM4A
+4QDrAP0ACwH2AAEBQQFeAVABUwFDAf8A9QAjARwBFQE1ATYBLQEsARQB/AAEARoBQwGBAbEBtwGr
+AcAB3wHVAcIB0gHHAWEBGAELAaMANgBYAHYAVwCAAO8AUgFhAQYB2QAdASoBxAB0AKcAGQFNAToB
++ACmAIkApACkAH4AdwCzAAQBMwEkAdQAkACZAMIA1wDDAKMAugD9ADgBPQEjASMBSAFzAWoBKAHt
+AOQA7ADjAMwAmABTAEkAZQBgAFUAMwDv/9L/2P/C/5L/nf/n//n/9f8vAEMA///V/+//AQDt/87/
+zv/x/+b/lf+A/9b/+v/L/+b/JAAFAMr/u/+2/77/zf/H/7X/tP/f/xIAIgDk/1X/5P7Z/vL+FP9L
+/3z/oP/C/+X/2f+A/1T/gv+M/1D/R/9p/zL/0v61/sn+6P7y/u3+/v4K/xX/Q/+D/5L/UP8I//b+
+/v7P/pb+qf65/qz+qf6w/r/+s/6o/tb+Gv8r/wX/C/9J/2j/Rv/u/p7+mf4W/6z/rv94/3P/fP97
+/2b/Wf9U/0r/Vv9w/2T/V/9l/0T/Iv89/0T/Of9W/33/n/+e/27/Pv///qf+i/7K/hf/LP8c/xz/
+Fv/1/uL+9P4O/xX/HP8q/xT/CP87/0L/2f58/m3+Y/5m/p/+7/4s/yf/D/8j/xT/7P4D/xv/DP8j
+/zn/8/53/jf+Zv6p/pL+aP6e/h//r/8AAPP/wv+E/03/Q/9Z/1b/Xf+t//r/7/+s/4n/x/8wAFUA
+TQByAJ4AtwDbANcAoQB1ADYA1v+9//n/LgBDADwALAA1AEEACwC3/7f/8f/q/7D/lP94/3L/xf//
+/+n/wP+d/7n//f/w/4L/NP9S/5f/w//S/7b/lP/Q/18A/gA+ARoBMwF9AYIBQAEFAQQB/ACfAC8A
+IQBGAEAAIAAGABoAYgCvABUBjgG9AasBowGcAYIBhQGuAZABNQEqAWUBSwHiALEA7gBTAUcB2ADw
+AJABtwF8AV4BJAH2AAIB9QC/AGwA+f/X/yoAagB3AK4A+gAcASgBNQFiAZUBnAGgAcEBxwG5AZ4B
+SQHkAJMAbwCNAJkAgQC1AB8BZQG/ATYCYQJMAk4CagJ8Am8CaAJaAukBXQEeAQ0B3wCMAG0ApADv
+AAcB1gCcAL0AMAF+AXoBVwEIAZsAiwCrAFIAz/+R/33/mP/s/0sAlgC9AOMANAFWAQkBxgDKAOkA
+FgFLAUkB4QBtAEsAZgBdABAA1f/x/0IAcwBZADkASwBZAFkAcQCAAEgABgAoAGUAWAAPAMH/r/+8
+/6T/pP/H/7H/i//B/zQATgACANP/zf+X/0n/R/+V/+j/AwDU/6r/vf+t/3z/Xv8k/wn/M/9B/zP/
+NP8y/0L/TP/q/lf+Uv7M/hP/E/8N/yj/QP8y/1v/k/95/4j/4P/v/7n/tf/Q/9H/xv/E/+v/BADO
+/7j/8f/+//X/EAAaAAAA7//u/87/of9c/xP/PP+g/9D/pv9Z/3T/nf9p/yv/Cv8M/w//0P58/j3+
+HP5C/oD+uf4F/xr/5v7S/sv+fP4Y/sn9m/3R/S/+O/42/nz+2/7i/pH+Y/5j/nP+j/6I/mH+Tv51
+/s/+If89/2T/rv/d/wUAHgD0/5H/OP8H/9P+nf6f/t7+Qf/B/z0AewBOANj/df9k/1j/D//K/q3+
+tP7M/t7+9/79/un+4f7O/pv+if67/s/+oP5t/vv9S/01/Z/9xv3k/Sf+dP7t/lL/Uv85/zz/Df+u
+/pv+6f48/1z/dv/F////6f/x/1AAqACqAHYAbgChAL0ApwB0ADAA7v/6/3AAywDAAJQAlQC+AK4A
+QgDQ/5v/lf+h/5z/kP+T/5r/rv/W//n/FwBAAIIA4wA8AU0BHAH0AO0A+wDiAGwACgAYAGEAuADv
+APMA7QDKAJgAnQC1ALAA2gBFAZYBvgHKAY4BHgHdANUAtgBnACwAZgDSAPcA5wC7AFkA7//x/5IA
+XwHGAb0BhwFIARwBAAGtAEMAUgDhAHMBpQG+AQQCKAIXAvwB/wEqAjMCEQLlAcEBtwF6AfAAZgAC
+AAEAqwCCAeIB2wGVAUoBSgGaAc8BrQF+AXcBjAF3AfYASQAOADkAQwAYACEAVAA8ADQAjgDpAPkA
+9QD5ANQAvAC3AKQAuwD2ABgBAQHVAKoAnQDGAOsA3wDCAOQAVwGvAZEBPQEXAQ8BDwEzAV4BXwE0
+ARcBMQEqAb4ANwDq/+D/IgCiAN0AtwBFAM7/5/8FAI3/Hf8I/y3/jP/X/+T/1v+g/2n/av+E/43/
+nP/S/xoAYQCWAKIAYgDx/8//+//0/7D/i/+V/73/6P/Y/7D/r//T/xMAXQBfACwAKwAsAND/W/9L
+/2r/TP8//3r/pP+Q/1D/HP8O/wn/Fv8h/yD/UP+J/5j/tv/S/7T/g/+r/zYAWgDO/1D/I/8X/yD/
+9/6K/kL+SP5j/nj+qf7R/vf+ff8CABoAIQAoAMv/L//1/jb/Uv8L/8v+uv69/sv+xv6b/nr+m/4O
+/7r/NwBNADAADADP/4n/Zf89/+b+hv5e/mH+TP4y/iz+P/6A/rn+wv77/mr/YP8G/wP/8f6G/jv+
+Ff6y/V/9vf00/u79iv2Z/cT9/v1N/n/+pP7I/gH/Vv9o/x3/6P75/gH/3/7E/rz+pf6G/rP+Hf9c
+/4r/v/+4/2//Wf+P/6n/pf+j/53/iP9p/1b/Xv+C/6f/sP+n/7v/5v/U/6X/s//F/67/vv/8/xoA
+JABMAGYANQDv//L/JwBPAHUAdQBCAFEAeAAfAKf/hv96/23/af9r/7H/9P/H/7P/CgA4ABUAEgA+
+ADAA8P/f/+3/1//R/wcALAAfAA8A7/+8/9D/KQBbAHoA0wANAQsBLgFXAV8BSwEPAc4AtwDBALgA
+qADIAAoBOAFKAWYBvgE/Am0CUAJRAloCRAL7AZEBRgE7AUUBLwEZARAB2wCyANIAxgCaALIAvwCp
+ANYAJgEzAQQBsgBsAIUArwBrADAAWABhAFEAfQCfAKMAtQD1AEMBSAFSAZ0B0gHJAZQBVgE9AUUB
+QgElAfoA5gAZAU4BMwEEAfQAAAEjAUABXQF2AWEBQAE0AR0B8wDUAMsA0ADFAI0AVwBIAGEApADa
+AKgAUACUACcBHQGxAIcAdgBHACMAEgASAA4A8f/v/wEA4//D/9v/8P/3/zoAoQDeAN0AsACNAIUA
+kgCsAJoAfQCOAJgArQDxAPIAjABPAF8ATwARAO3/9v8QABoACQD+/w8AHgD7/6z/df+Z/+//MQA6
+ABUAEAA9AFgALgDy/xYAYAAJAH7/mP+4/4L/if+D/13/m//A/2n/Qf99/7H/xv/c/wQAAACL/xX/
+3v67/sb++/4k/zH/Mv88/1P/av9r/1L/Rf9J/0n/UP9o/47/l/98/5L/yf/D/6T/zf/z/7b/Zv83
+/xv/Kv9H/xX/vP6O/ln+Ov5y/rT+yP7w/iv/IP/d/rb+uv6i/nj+uP4k/y3/SP/V/wgApv9M/xj/
+5/7A/qn+rP63/sX+9/4f/8T+Pf5t/vP+//7e/hD/YP9W/x7/Rf+W/3//Jv/n/t3+//4R/93+s/7d
+/hH/K/8u/yH/Mf9H/zj/Rf+Q/9L/6v/y//z//v/Y/7D/r/+y/9n/GQAiABwALQARAND/iP9A/yv/
+Tf9m/2H/Q/8D/83+6f4Y//v+3v78/h7/Yf/T//r/wv98/2r/mP+o/1L/9/7l/vr+Cv8U/yX/Dv/n
+/iP/j/+z/5D/c/+l//z/GQAFAPz/IAAgANL/w/8LADQA//+z/7f/1//s/wIADQAuAE8AUABsAKUA
+yADTAM8ArwBmABkA6f/D/6v/nP+S/4v/WP9J/7f/HQAZAB0AVwBLAB8AJgArABMAAgD8/xAAPwAq
+AAAATACeAIUAhADDANUAsgCiALQAsQCSAJoAmwBZADYAVACCAMQABwEsAVIBfAGQAZ0BqQHDAesB
+7AHiAQgCOwI9AhIC1wGXAW8BbAFYARUB5wDsAAkBIwEjARoBHwEhAR8BSQFkAScBLgGvAc0BZwEC
+AY8AJAAWAD8AYAB7AIsApQDeANYAqADeADoBVgF2Ad4BIwLsAaUBzgHuAZ8BZAFoAW8BgwGKAXkB
+cwFAAd8A0AAfAUcBKgEbARIB9wD2AP4AyQCIAHYAYwA4AAEAwv+j/9L/IgBTAG8AlACcAHUATgBM
+AIgAygCcAFQAggCsAGsABwCz/6T/1//y/9P/uv/a/xoAVAAuAKz/dP+x/7n/Zf9V/5b/m/9a/0//
+vf8/AFoAQgA9AEMAVAA/AOj/w/8RAGUAcQBuAHMAfACoAMYArgCjAMcA0ACQAGgAbAAxANb/xP/+
+/zQAJQDY/67/zP/C/3j/S/9c/3T/Wv8d/8j+af54/uH+1P5r/ir+5f3e/WH+3f7Q/pr+0P5//xEA
++v9w//n+zv7L/r/+kv4S/oH9n/1T/sj+3P4E/z7/Vv9z/7z/AgAmADgAXgCRAH8AOAALAN7/of9j
+/w7/s/6U/q7+xv66/rf+C/+F/8j/wP+p/83/KQBbAP7/T//p/rn+cf49/gz+q/1o/ZT97P0l/kr+
+Jv4B/pj+b/+l/47/nP+V/1v/7v53/kP+Lv7f/XT9gf0t/tz+IP9B/5P/BQBvAL0A1gDEAJwAbQBC
+ABsAEwAeAN3/U/8g/4r///8BANT/3v8hAGUAWADu/2P/6f6i/oz+dv5P/kT+Tf5R/m/+h/6S/sf+
+JP+W/wUAOQD5/4L/Zf9q/+r+Nf4R/mD+tf4a/4f/uv+m/4v/l/+a/3P/W/+U/wIAWQCyAAgBCAGm
+ACMA+v8MAPL/s/+T/8r/GgAmAAAA1P+0/7H/wP+0/6T/wv/u//n/8v/s//j/IgBLAIYA3AAeAWsB
+2gEkAh0C3AFqARUBOAFOAfsA4QA/AZEBwQEVAi8CqwFTAeMBjwK0AskC8wLYAmQC5wGKAUYB/wDd
+ABsBUQERAb0AtQDFALsAoQCmALUAswDJALkAgACPAL4AtgCtAM4AxACCAHAAlgCzAK0AkACGALsA
+DQEwASQBNQGRAfEBCwL0AdkBsgGVAb8BBAICAtIB3gEfAiYCxQFOASMBMgFEAVQBUgEEAWYA6f/N
+/5//Kf/O/rX++P6Y/x4ATQBUAFEAZQCKAJIAnwDZAP0AAwEnAT0BBgGsAIoAuQDvAAMB+AC4AJsA
+9gAZAc0A0gBQAbYBxAG+Ab4B0gHyAbcBLAGyAG8AUAAJALD/t//s/+//CAAsABkACAAUAB0AFwAh
+AFkAkgCQAHEAMwDi//L/JwD1/7T/yf/u/wQAHQABALj/hv93/6L/8f/+/6X/WP9g/3T/bf93/4v/
+Wv8g/1L/hv9S///+zv7L/un+Av8Q/w7/C/8V/zj/jf/M/7v/lv+Q/6T/w//I/5b/Uf8W//7++f7c
+/sL+zP7w/vr+2P7G/t/+6v6q/lz+aP57/lP+T/54/m7+P/5N/l/+Lf4L/vT9vP2i/cz9Cf4V/jj+
+i/6s/pr+Xv4X/h/+VP6M/sz+5P66/of+jv60/rH+jv5r/nf+4f5f/27/E//n/uD+oP5y/lf+LP56
+/h7/MP/1/h//Xv9I/wH/8v5N/47/av9M/1b/Ov/d/sr+Jv8n//3+ev8BALz/TP8f/8L+t/4y/zj/
+//41/0f/5f6u/tr+CP8N/w3/Kf95/8D/kv8w/xv/Ff/l/gX/cP95/wb/uv7Y/vL+Ef9N/0j/Kv9i
+/8f/4//f/woAQgBlAJoA3gC1AAoApf/Y/xMAEgAVACYAPABmAHMAXQCIAN8A/gD4AA8BMQESAbsA
+pgDEAK0AmwDKAOMAsQCPAKoAtgCWAGEANwBbAKIAwADXAOMAyQC2ALQAdwAFAOH/GwBRAG8AqgDQ
+AI4AQgBnAKoAiQBIAGAApADOANMAowCFAKQAzgDcAPUAPAGNAZoBXgEvAToBlwH+AQUC5AHxASQC
+XwKfAroCtQK4Ap8CaAIpAsEBSQEAAeQA3wD7ABEBzACAAKgA6gDhAMkA3AD+AP8A6ADWAMEAnwCN
+AKwA1wDQAK0ApwCbAH8AiwC8AOAA3gDnACEBVAFcAVkBOAH3AN0A7gANATcBTAFFAWYBsAGpAVgB
+JgH8AOwAUgHPAfYB6QG7AXcBNAHgAIAAQwAsACIANgB4AKYAmACcAMgA4ADaANAA2QDUAJoAiwCp
+AGYA9f+4/53/pf/H/8//tP+p/8D/3v/u/+b/2v/b/+j/9//f/7L/pf+e/6H/0f8VADcAMgAhAOX/
+of+0/wYAVABXACIAEgAtAD0AGADn/9//5f/n/9n/z/8AACcA9f+S/0H/Df/W/sL+8P4o/3T/uP+A
+/wP/0/7r/uX+vP7U/u/+s/64/iP/Kv/K/of+Yv5t/rH+1v7o/hD/LP9c/7D/q/8f/9r+JP88/xT/
+OP+B/2H/Dv8d/zH/6/7L/tn+yf7R/vD+9f4N/0P/Sf8p/yz/KP8K/xb/KP8B/+v+EP8c///+6f77
+/j//ef+H/6L/1f/7/9//qf/D/+j/wP+C/1r/X/9v/0//HP/3/tH+uf70/ij/+P7v/gH/4v4E/x//
+s/5U/jb+8f3b/TX+WP4C/sD9tP3Q/Rz+XP5x/p7+Q//+/yMA5v/I/8b/sf+e/5H/jP+B/1r/Ff/I
+/sX+6f7d/tH++/5W/5v/rf/e/x8AIQAHABUAOQA+ADQAPQArAOD/of+b/5D/bv95/6P/ov+M/73/
+OABrAEAANwA7AA0A8P8JABsA9P/F/9D/8f/F/0v/Av8P/xf/A/8f/3//uP+o/9T/PgBoAGAARgAI
+AOL/2P+3/6D/zf8YAEoAeQC8ABUBfAHAAd4B9AH2AdcBvAHLAboBWgHeAHoAVwBJACwAIAAdAB4A
+RgCHAMIA9wAdATEBUgGMAYMBFQHkAPUAngAjAN//rP+2//n/GgAXACkAcwDMAOcAvgCfAL0AzwDe
+AEoBugGbARQB2AAqAXIBaQFkAWwBdQGJAX8BfwGqAaUBdAGGAbYBpQGOAZoBdAE8AWIBpAGkAYsB
+lwG5AY8BPQE7AUsBKAEQAQ0B9QDaAOYA7wDKAMIA6QDxAMQAvQAVAUYBQwFYATAB8wD1ABQBQQFN
+ATsBUgFgAScB6gDoAP0ADwESAf4A4QCeAEsAKQA8AHQAmgCHAGUAbQCOAGcAGwAiADoAQQB4AJ8A
+mADHAPkAyACtANYA0gChAI8ApwDCAKUAWgAgAAQA/P/5/wkANQA9AOn/lf/E/xEA7P+m/43/Pv/a
+/uf+Kf8z/xv/7/6//sH+5/71/s7+Y/4M/lf++P49/zj/bv+z/5H/OP8K/9z+kv6P/tb+/f4W/1n/
+jP+t/9T/0P/N/w0AWwBTAOz/Vf/U/qv+sv6v/qL+wv4k/4r/4v8kACsAAwDT/7z/wf+D/xL/8v4b
+/zv/Jf/0/g7/UP9B/wj/1/6W/mD+SP4q/iH+Kf7x/b/97v0r/jP+B/7E/av9vf2b/Vz9Xv1i/T79
+QP2T/fH9Hv41/kD+R/6H/gj/g/+t/3j/PP9b/8P/DgAQAPH/3//q/yIATwD8/3//Zv+J/5L/Zv8m
+/9z+g/5V/kP+Gf4Z/mH+sP4X/47/tf91/0j/ef+i/5//kv9X/9n+h/7A/vn+sf5u/or+wv70/g7/
+Fv85/1T/Y/+c/6v/Zf9b/+X/cwCQAIQAYwAxAC0AJgDc/5L/Xf8e//j+GP8+/wT/vv7G/un+Dv9c
+/6b/g/9H/2L/ov/T/9v/wv/S/zYAsADaAKkAegBhAPb/bP9t/9j/MQBeAF8AfwDpACkBMAE+AR0B
+5QBIARACHgKyAaABkQFRASwBDAG1AEUADQBBAKMApgA2AO7/BAALANf/uv+y/33/ff84ACIBWQEz
+AUIBbQG/ARwCDALDAc4BygFfAf0A0wC2AK8AwQDsADoBfAGbAbUBwAGxAaABqgHUARQCZwKsArYC
+iAJOAv4BgwExAT0BfQG7AdsB8QH1AYEB0ACbAIwAMAAZAIcA+gBKAaIB4QHBAS8BnwCGAJoAfgCA
+AN4AIwEmASMBDwHNAHkAbQDRAEQBfQFzATsBEAHfAKUAnAC1AMgA9ABNAXsBWAE3ARQBzgCeALQA
+CgFXATcB4gCxAHsAFADD/8H/4v/o/+r/GABRAFoAeQDMAO0A+gAZATwBqwH5AYkB3ACFAGgAQwAO
+AOX/1P/P/8n/6/8jAEEAYwCZALwA0wD4ABoB+ABzAA0A9v/M/37/T/9I/0P/Rf9L/1D/kv8dAKgA
+8AD7AAsBHQHnAHoAJwDr/7X/rf+1/7D/wf/Z/7P/fv+c/8f/sf+X/5X/qv+j/1X/Fv8H/+n+x/6y
+/ov+RP48/qb+3/7C/sz+zf7B/v3+Qf9n/5j/s/+n/7T/yf+a/1n/S/9P/1D/av9//1H/AP8g/7D/
+y/92/1j/V/9Q/0X/MP82/0f/Mf/6/s3+tf66/tj+7v4C/wn/H/9O/0D/F/8t/0D/Gv/8/gf/Bf/3
+/iH/YP9Z/zD/Gv8c/xX/9/7Y/rL+w/46/4r/VP87/1P/Iv/w/uv+AP8N/8T+cv5t/mT+Qv5J/n3+
+nv6T/qn+1P7C/p3+p/7C/rn+r/62/pr+V/5B/mP+jv7B/sr+pv7K/kH/f/9h/yf//f7t/gb/Mv8K
+/6v+l/64/sX+z/7x/ib/Uv9n/5L/5v///8D/o/+u/5H/VP8p/yT/B/+9/or+ZP5E/k7+d/7C/iL/
+eP/V/yIAIgDJ/2n/bP93/yL/Ff+y/ywADACy/2D/Cv/s/iX/Sf9e/77/QQCyABYBHgHHAJUAkgCY
+AJ4AoACzAMMAqgBmADEANwBkAKoAIAGqAfMB/gELAh8CBAKyAUgB0gBrACsAAwDz//n/LgC7AEYB
+cgFuAYIBywHyAckBnAFNAewAuQCMAFcAJwD0//j/NgA3ABAAVgDnADcBWgGUAbEBmQF9AYIBlwGW
+AXUBLgHuAPUAPwGgAfkBKQJEAlwCQgL+AbEBkQGpAb4B4AEgAlMCaAJRAgsCvwGJAU0BDgHeANIA
+6QAUAUABOAENAScBcgFuASgB8gC7AIMAewCUAIEAYgBfAEkAQwBhAGsAfwCyAL0AxwA5AbUBkwEu
+AQcB5wC7ALEArwCHAHwAzgAmAUMBTgE/ARAB6wDmAN0A0QDrAAcB3gCSAHkAjgCaAIIASwBDAHgA
+swDsAPoAzQCNAFQAMQAlAC8APAAwACYAMwAAAID/Xf+w/9X/2v8oAGkAUwBbAK4AxgBWANX/pP+a
+/53/pv+5/9H/zv/q/xsAFwANACYAJgALACQAWgA3ALT/a/+m/9f/u/+d/5b/t/8LAFsAfwBaABQA
+MwCMAIsASAAaAPv/6P/A/2n/J/8T/x//PP9g/3//kP+x/9T/0//K/8L/s/+9/+L/AwAHAN7/pf9q
+/x//1/6V/jv++f0x/nT+P/4a/lP+gv61/gT/Hf/o/pD+ZP6W/rz+ef7//Z39hf2G/X39p/3S/d39
+Qf75/mL/Uf8e/yL/Zv+l/6z/ev9U/zv/w/5M/jL+6v2P/bL9G/5S/l/+hv7c/iD/Nv9Z/5X/m/9a
+/zX/R/9H//z+mf5n/jr+Av4J/hz+//3x/R7+qP45/zn/Av8L/xH/+/7r/sn+ff4m/vn9HP5S/lL+
+S/52/sP+2/6w/rb+7/4B/wz/ZP/O/+v/yP+H/z7/I/8o/xr/G/88/2f/sP/0/xAAUwCuAM4AzgD9
+ADwBQgEgAQoB3gB8ACYA4v9//0n/cP+O/4n/l/+w/8b/0//h/+7/BgA6ADkA4/+6/wIAFQCm/0b/
+KP8o/z3/XP9//6P/2P8+AKQAjwA5AFIAmQCkALsACwE7AQMByAANAW0BPAHjAOYAAwEfAUkBXAFV
+AVcBfAGtAbgBlQF0AXcBYwEiAREBQAFeAS8B9gAfAU4BFAHcAPcAIQELAdkAyQDLAMkAwwDIANwA
+9wATARgBHwFwAcsBsgF6AWcBJAEAAS4BNgESAewAzgDaAPEA2ADKAAUBKAEEAdwAzgDSALAAdwCG
+AL4A6wD1APkAIQFQAW0BigHFAQACEwIPAvgB5wHiAcEBrAGuAX8BUwFNASUBGAFNAU0B7AChAM4A
+EgH7AL8AngCdAKgAlQBzAGAASAAwAAgAqP8Y/+j+af/W/8f/x//b/+T/IQB6AH0AJADs/woANQAk
+APj/9P/4/+L/5/8HAOj/lP+a//n/OwBEAD8ASwBXAE8ANwAfADQAcQCOAHkAXAA2APz/zf+m/3b/
+eP/L/ywAZQCVAMIA3QDRAIUAKAAEABUAHwAkADkAPgAkAAUA6/+9/3D/A/+4/uL+Qf9O/yf/Lv8b
+/9n+6v4i/wL/5P4b/z//SP9Y/z//Jf8b/97+g/5V/on++P41/1L/bP9J/y7/bf+V/3P/bv9//3P/
+hP+x/9D/8f////j/DAAzAFEAYwBjAIUAsABsALL/z/44/iX+Gf7e/ez9WP7G/gb/C//4/vr+0v6G
+/pP+4P7s/pj+Mv4x/m3+O/7W/bv9y/0T/qf+H/8+/0H/M/8d/wz/0f5c/gz+Nv6z/kz/x//Q/4f/
+af+k/8X/lf9e/z3/WP+j/6v/Zf8r/xv/D/8W/0f/Y/9c/2T/Wf87/0P/Uv8y//z+6v78/hP/R/+a
+/8L/nv9N//r+0P7U/vf+Lv92/6//s/+t/57/V/8s/1P/dP+m/xkAYgCDAMYA2AChAGoAMwAHAB0A
+PAAmADUAZwA/AN3/lf9+/4H/i//O/0gApACvAJoAowCeAFEA5//F//v/KgBAAGEAPQDn/xEAiACL
+ADsASQDJAD8BYwFRATkBHgEfASwBHwEiAT4BUgFiAXYBfAFxAWUBYQF3AZEBkAGhAYYBAgG1AL8A
+dQD8/9j/wf+r/w0AjgChAHcAdQC2AOQAzQCiAJcAvAD7AEYBhQF4ASUBAAE2AVkBSgE5AR0BLwGU
+AbwBjgF6AYcBfAFrAX4BowHkAQ4CugE/ASABIwESAQYB5QCiAHsAVAD//9//EAAdAAUAHwBoAKIA
+sQDKAPkA1QB1AJEA/QD4AJoATwAxAD8AQwARAPz/GgA6AGgAlACEAFQAZQCwANIAxwDmACkBFAHO
+AM0AvwBcAP//6v/9/wEA1/+l/6r/y//r/yUAYwB1AHgAlgC9ALMAiQCYAKcAcABJAEUAMwAfANb/
+b/9p/6T/wf++/83/9v8YAAQAwv+2/+f//P8NABEAxf/D/yUA9/93/1X/Q/9N/5D/n/96/4D/t//9
+/0AAKgCw/2f/hP+v/6L/j/+G/0n/Lv98/7T/nf+J/6D/8P9LAFoANwAEAOj/FQA+AAEAl/9w/5n/
+u/+y/6b/ov+t/83/5f/n/9X/p/92/3v/mv+T/3f/e/+N/2P/Mv9L/0z/+f6p/oD+gP6f/o7+Sv48
+/j3+6f3Q/TL+bf55/ov+if6W/qr+i/5Y/lX+af6C/tD+Of9A/+b+0P44/5f/uv/I/5X/X/+m/xcA
+GgDG/4v/jv+x/9n/8P/X/4j/RP9e/5T/hv9Y/0n/QP9Z/8H/8v+x/3n/gf+J/4D/p//O/3r/6P7T
+/g7/+v69/qT+dv4H/uP9Pf5h/l7+wf4B/+n+Mv/E/xYAGwDq/73/vv+m/yf/nf6h/vn+Hf82/2j/
+Yf8q/zf/lv/z/zcAagBGALr/Ef+f/qL+7f4G//3+Bv8K/x7/Rv9d/1L/Vv+w/zUAnwABATYBDAHa
+AOEAvQBAAMr/mP+w/9z/+P8FAAsAEAAoAFwAPwCz/57/TADPAKEAJADY/+n/KwAkAMv/d/8w/yL/
+jv/x/wEASgCuAIwAKQA8AHwAKQCZ/6X/IQBjAI8AwgDHAMYAyQDFAO8AQgGSAcUBsAFdAUgBmQGm
+AWQBYQFwAXsBlQGKAWkBZQGLAYUBJwEPAXIBuwGeAXQBfgFnAREB4ADjAOAA/QBfAXMB9QC5AAgB
+IQHKAIsAiwCzABMBdwGHAXUBfgGGAYMBRAHVANkAQgFxAWUBeAGDAT0BAwElAVABZAGTAb4BsgG6
+AfcBAAK+AZIBiQFxAT4BEQEeAVIBZAFaAVUBagGxAfoB+AGeAS8B+ADZAJYAWwBlAIoAnQDHAOwA
+5gDJAJIAUgAwABsAAgAXAHkAtQB+ADgADADV/6H/d/9f/33/qP/O/ycAZwA8AAAABwALANb/tv+5
+/7L/q//m/1UAfgBaAEQANQALAOj/5f/x//X/3P/z/zIAGgDR/8b/zP+w/7P/w//C/+j/HgAjAAQA
+5P/G/7//zf/u/ygAUABvAI0AfABgAEcAJQAJAN3/pf9w/yP/qv5b/ob+w/63/sP+AP8q/1z/mv/Q
+/wUABADu/xEAKgDN/0X/A//r/sT+lf6T/pj+Vf5H/tH+Yv9t/y//LP9D/zH/H/8K/+X+uP6N/pX+
+i/43/vj97/3o/fP9NP6L/sj+4/7u/gD/Mf9l/1b/EP/T/r7+q/5z/jL+AP73/SL+Wv4+/tn9Dv7F
+/uj+k/5r/jr+8v3k/eH9w/2h/Xz9j/3h/fn90/3o/S3+av6k/s7+wv6D/kj+Lf4V/uv93P3y/fD9
+1/3h/Qv+Qv6i/u3+/P4v/57/GABvAG0ANwAiAFUArADQAK4AkQB3AC8ABAAzAFUANAAiADYASQBG
+ADoAGQDy/+T/3f/c/8z/lf9b/1f/ZP8p/9v+sP56/oT+/v5c/2b/Vf9c/7r/KgA0AAoADwAcAAkA
+IwBzAGsABQALAKcACwHUAI4AlQCfAKAAzgAFAQIB+AApAT0BJQFGAXwBgwGNAYIBLwHYALIArgCX
+AHMAawBrAG8AfgCyAOwA2wCrAKYAqAChALEAzADcAOgA4ADfAP0A6wDOAOcA7QDgAO8A+gDmAMIA
+ugDKAOQABAEJASEBYwGLAX4BbwGEAZUBeQFxAaIBxAHNAdgB0QGtAX4BZgF5AYgBcgGOAdYB3gGt
+AZMBpAGwAacBswHMAa0BZgFLASkB3QCxAJYAiwDGABABMgFBAUEBHgH+AB0BTgFPAVIBhQGrAbcB
++QFAAhgClgEKAagAjgCVAHMAMAACAB4AkADjAOQA/ABDAU0BCgHTAMAAjQArABEAUgB4AHMAdABy
+AGsAggChAKsAxQDgAMMAmwCqANgA+QD+AAgBLwFTAWYBbgFJAewAkQA4ALz/Y/9p/5L/p/+l/7z/
+4f///1gAvADOALoAdwDy/8P/7f+k/w3/s/5R/tr9uv3s/Uz+tP4K/2f/qf+o/5f/yf8WABEA4f/t
+/xIAAwDI/4//Vf9C/4f/7v83AGMAggB/AGoAewCaANYAEgHsALsAuQBfAK7/Iv/f/uP+If9r/3H/
+Rv9b/43/cP8L/5P+U/59/rT+pv6B/ln+Ov4V/sX9ff1//an9uP3c/VT+ov6D/nL+ef6N/tv+Kf9V
+/1X/C//R/g//O/+t/g3+Lv6e/t7+R/+x/67/jP+I/57/ov9h/wP/nP5B/j3+Wf5B/iX+HP4d/jn+
+Xf54/qj+1f7L/rz+Gf+1/+D/pf9k/xf/6v7W/r/+7f49/2L/e//K////yf9+/17/eP/A/wAA6P+F
+/4n/1v+b/yD/+/71/gP/N/88/yH/9f6G/j/+QP4e/hf+fv7j/tH+ov6O/lf+Jv5S/uf+fP+s/7//
+6//9//n/7f/q/xoAUgB9AL8A2gC5AKAAcAAYAOv/7v/1/wcAJQBRAHIAYwBEAFsAhgCUAJEAdQBb
+AEkAGgDo/8f/pP+v/+n/BwAlADwACADj/y8AeABTAOX/cf9l/8b/IAA0AAMAv//g/28AqwB0AFEA
+XABkAFkAbwCJAFIACAAnAJ0AAQETAdEAbQApABwAGQAgAF4AlAB6AHYAtwDaAOIADAFSAZMBugHd
+Af0B8wGyAWwBPgH6AJgAbwCZAKAATwAqAE0APgAwAH0A2AD6APUA6wASASkBqQATAP3/+//6/zgA
+bABwAHgAiQDKAE0BjwFxAXkBsgHRAd8B6wHYAX4BHAEmAUIBDQHbANwA1wCyAJkAtwAGAU8BdgGS
+AaABmQGTAZQBlwGcAYgBUgErARwB6QCYAGoAQQAEAAAAMQA+ABcAHgBnAFkA4/+a/7X/2f/G/7z/
+2f/S/8v/IAB0AHsAbABSADIAPwB4AMQA4wCYAFYAiQCiAEIADQAsACsAPQCEAJIAYgBZAI4ApwCE
+AIEAiQBxAIwA0QDgAK0AdQBYAEYAIADh/6L/ff9s/07/HP8G/zD/gv/E/8X/p/+u/67/hv98/6b/
+wf+t/2v/N/9H/3r/eP8f/9j+1P71/iz/If/U/tz+H/82/13/ff9m/0T/IP/9/g7/NP8Y//f+A/8A
+//H+7P7B/mH+Hf5r/ub+2f7S/iT/JP/v/iP/d/9c/w7/6v4J/2b/nv93/4L/6//4/7j/7v9gAIgA
+fwBnAF4AeABhAPT/qP/B//L/KgBYACcAq/92/57/l/9a/yz//P6v/k3+HP5B/l7+Xf5v/ln+Jf78
+/cn9uv31/Un+ov7o/tL+cP5D/oP+4P71/t/+6f4N/1//xf/u/8P/n//4/3oAqwDEAPkAKAEnAd0A
+gwBdAGIAcABnAGcAlAC0AIAA+/+d/7j/xP94/2v/pv95/+3+pP7E/vL+1v6P/p/+Bv8//xP/2P67
+/oX+jP78/h7/9f4G//D+oP7R/nL/rf+J/4H/vv8/AJIAegBrAI0AgQAvADIAqwDzANcAsgCqAH8A
+bgCrAMMApgCZAIMAKwDh/9L/w//C//H/KgA6ADQAQgBYAGsAsQD+AN8ApwDcAFABjQF+AVMBFQHN
+ANcARQGSAZIBvwH5AdUBsQHDAaEBQQErAYQBugGiAYQBZQE1ARABBwH/AOEAtACmANcAMAF+AYYB
+NAHEAIsAhgBtACYA+/8yAHQAfACbAN8AJgFnAYUBiQGVAZQBewGCAb8B8gHtAcsBowF0AUEBFwEE
+AUQB4QFHAjUCDQIPAhwC7AGOAVsBTgEzAfAAvADVAAABEAH8ALoAggBgAFUAfACEAGkAcgBhAC0A
+JwAzACAAAAAGAGsA0gCxAGYArQBGAVUBuQA3ADYAWABoAH4AlQCYAIUAbQBKADEANwAbANv/rf+r
+//X/UABTAEYApgAUAeoAVQAPADkAaQBPAAAA4f/z/yMAigDRANIAzACfADQAxv+Z/6v/of9q/1f/
+h/+S/xz/g/5d/tv+hf+l/3H/k//8/0IATgBcAHMARACw/yT/+f7l/rL+eP5I/l3+3/5g/4L/qP85
+AM8AzQB1AG0AvQDrAMgAjgA3ALL/IP+l/lr+O/48/lD+gf7E/tD+tv7J/gz/OP84/zP/Fv/O/pb+
+nf6t/ov+Zv5t/ob+lf60/gn/Zf+T/3L/Hv8x/67/yP9f/w//Hf8+/xb/n/5A/jb+OP44/ir+7f3h
+/SX+TP4d/uP98v3r/Wj98PwM/Yv9AP44/mH+t/7h/rT+p/7i/kL/fv9+/37/eP9u/1b/Hf8X/2b/
+sf/M/8T/tP+s/7r/6/8FAPb/+P/r/6X/d/9f/y3/7v7a/gn/Mf89/2z/iP9e/3P/1//t/6//lv+e
+/5//pv+M/zD/2P7P/vH+EP8n/wD/tf6s/tn+7f7p/g//Yv96/1L/M/8P/wP/Mv9U/1H/VP9q/1//
+Tv+i//3/BwAIAC0AaQCXALsAuwCHAFoASgBnAKAAuQCCACkAJwBwAJsArQDEANUAAQFSAXYBOQHb
+AMMAyACvANAA5gCDADEAIAAVACwASABPAHEAqQD8AFIBTQECAdwADgE2AQMBywDFAIQA+P+6/wAA
+UQBsAIMAigCdAOIA3QCaAKAArACrAPAAPwFBAS0BNQEvAREBHAFlAaIBnQF1AVkBdQGgAWgBKwGQ
+ASACVAJZAlYCIAK+AbIB3wGhAVsBlwGsAUIBEQEcAeMA2gAVAeUApwDkACcBSgFHAQUBBwFwAZ0B
+UAECAfkA2wCBAEQALAD9//n/RQB4AJAA0AD1AMYAeQBrAJsAvwDJAMYAuQCcAHkAXQAoAAMAAADR
+/73/EgB3AJMAUwAIAC8AzABcAW0BGgG9AJcAfgAsANr/3/8iAD8ABwCY/y//MP+c//z/LgBWAEcA
+BwDG/2//Ef/e/rr+gP55/rz+5P4C/zr/Kf/w/hn/l//7/z0ApAD0AOwA3QD0AAsBIgFBAVYBNAH1
+ALwAbAAwACIALwA5AAAAj/9C/zr/R/9N/1D/N/8j/zv/Lf/6/gv/RP9b/13/mf/t//f/0f+M/x//
+4v7i/on+4P34/dT+I/++/pn+1P7v/qn+bv7E/kT/df+T/6b/bP9C/27/lP+f/8H/7P/V/2L/Fv8z
+/xn/nv43/g/+Ff4Z/iv+b/7a/h3/5f59/mf+iv6i/rH+3P45/5X/nf9J//n+J/9w/zn/0/7R/if/
+Pf8K/xv/kP8uAIQAMgC8/7n/xv91/z//hP/A/8P/5f/+/+D/u/9j/wD/If+M/5z/Qf/b/q3+rv50
+/q79FP07/Zz9xP3s/Un+nv6e/p3+Av9k/2r/X/+L/xEAuADMAD8A1v/5/z8AJACp/zX/Hf8d//L+
+5v4j/0H/9f7M/iz/pv/S/7D/x/9XAMQAigD8/9v/JgAnALz/Zv+B/+D//v+z/6L/8f/Z/1//P/+a
+//L/uv89/3P/XQDxALUANAAsAJoA2wDHAKcArwC6AG8A4/+U/5X/bf8b/2L/UADfAMAAtQDzAA8B
+0QCIAKgAHQFQASQBIAFkAYAB/QAZAL3/KwDBAAEBFAFkAcIBmAEWAfEATQGYAXcBTQFcAW4BXQEq
+ARIBPgFfAQYBkwDvANwBMwLDAVwBVwFuAVkBEAEcAa8BCALqAd8B9QHAATkBzADGABsBaQFmARkB
+xACsAIoALAAgAKAABAHNAD8AAABlANIAmAApAFAA1QD1ALsAqwDfAAUB5ACmAJcA2gAkAVEBmAHV
+AcABQAGkAIoACQF0AVUBGgEtAU0BCwGxAMYA8ADpAOoAsQBYAJcAzQAQAHj/2P9NADEA8f8ZAHQA
+eQAcANL/BQB5AKkAswD+AFEBGAGhAJQAxwDQAKEAXgBhAMgADQHQAGYANABFAH0AaADu/8z/OQCR
+AIwAggCdAMAAzAC2AMIAHwFsAU8B7QDhAD0BUwEVAfgAKQFpAWEBGQHXAMIAyACxAIAAiQCvAIIA
+9/9P/wH/KP8b/4/+LP5N/q7+2/6Q/k/+pf4j/wP/X/4l/rf+J//X/ov+/P6z/+b/qP9a/2v/AwBu
+AFAABwDv/0IAnQBnAO3/w//C/23/Af/6/hL/9/7q/hD/Ov9R/0f/MP8b/x7/QP8n/8D+mP7E/tb+
+o/5M/hX+Lv5C/tb9WP2c/UL+Sf7X/Yv9bf2W/fn9Jf5M/tX+Pv8c/8H+fP6A/pb+Uv4A/j7+xf6g
+/uT9pv0g/pf+t/7P/gv/bf+h/1b/Cv8y/2L/Hv+d/nH+0v5K/zb/n/5O/qj+Df8N///+Wv8dALEA
+qQBkAD8AJADL/z3/5P6y/lH+6/3n/Uv+rv6N/vH9BP46/wcAff+i/m/+n/6P/h7+Cv6Y/ur+w/6M
+/on+3/4R/8n+i/70/tP/HACP/y//o/81AAAAnf8mABoBIAE1AIj/qf+s/+n+Pv5E/rX+L/9F/yP/
+e/8YAD8AIgBIAJEAlgBtAI8A0QC7AFUA7//w/0cAQADQ/53/GwDpAAoBlAB5AMAAxACXAJoAuQCq
+AD4AoP9v//r/iABZANH/y/9ZANAAlQAAABEA0QBYAVABHgH8AJwABACl/5r/yP8hAHcAwgAxAa8B
+0QFtAUMB7gHpAmsDUAMhA0MDNQNwAmAB3AAEATYB9wCfAMcAZQGgAQEBhwAAAbcBuAFJAUkBvgHY
+ASABWwCVAKEBMQKMAdUAOwHzAccBRgGNAVICqAIWAhMBwgAuAUUBywBrAKIAKgFKAeIApAD9AGsB
+QAHCANcAnQEdAr8BQQFUAacBiAHKAEsAngAUAdYAUwBuAM8AxwCRAKsAJwGVAVABmgBUAI0AnABo
+AFcAvQB4AbQBOQHHAMMA0gCnAJcA0wD1AK4ALADl/+//0v9k/z7/wP9MADYA5v8pAPUAYwHgACsA
+OgCdAGwA6v+Y/z//rv4B/mD9Lf2k/UL+Xv5x/kb/TwCeAHYAtwBAAWQBAQGLALAAIwHhAOz/O/8f
+/y//Of8a/xn/u/97ALEAcAA0AGEApwCqAI8AegBzAEgAyP81//j+If9U/yD/zf71/kL/Pf83/0P/
+Af+V/kT+Cf4B/kH+dv5f/vj9j/3Z/Yb+lv5j/rb+Kv8D/5r+1v54/7j/sP+h/3v/Z/+S/7D/bv8I
+/9L+7f5S/7b/yv+V/43/+v9hAFcAIgAcAEgAbABZABEAq/9G/wP/1P63/vX+Xf88/5v+Sf6F/ob+
+F/4F/qT+M/8o/8b+Zf5x/un+Bf/E/ur+Jv/D/kD+PP50/tf+Rf8q/+D+C/9S/2T/Rf/1/sj+8/4p
+/0r/dv+Z/5n/l/+w/7v/rv+q/6L/qf/f/x0AOAAuABEAuf9c/4T/9f8GANv/EABrAFwAAgCo/4P/
+u//+/7v/Mf8x/4//iP8m/8f+vf4M/0f/Rv9z/wYAYgAhAPj/LAAfAML/Xv8T/zv/m/9//0P/jv/Y
+/5v/NP9A/7r/4v9k/xb/zP+eAE0AT//9/sH/jQBpAPP/NADWAOEAQADU/z8A7QD6AHYAPwDDAF8B
+IgFhAFsAFAFpAewAfwD1AM8BCAKZAWwBxQHeAUQBrwDpAHQBeQEdAQgBPgEeAYYALAA9ACMA8/8t
+ALAAEQEfAa8ABAAuAAUBJAGsALYAewEkArgBpwBUAAgBcgHLAFcACAGlARkBRABgADMBkwEMAXwA
+1wCbAYwB5AD1AMwBDQIbAQAA/v/1AH0B4wBVANQAjwFuAb8AhwD6AHgBpwGqAdABGgLsASABhACo
+APsA3ADHAEoBpwH1ANf/0P+1ANgAEQCU/9T/WwA0AEb/5f59/+f/qv9Z/3z/EAB9ADUArf+7/1EA
+yQDaANUAOQGBAQYBmwD4AJoBsQEhAaoAyQC/ANn/Kv+t/4QAsgBdADAAqgBTATsBoQCOAPsA/ABW
+AOz/awAhAekA3/8s/0f/bP/8/pT+5/6P/8n/ef8h/wr/1P4s/vX91P6O/0T/1f70/mT/tv+L/1r/
+2P9hAEsAKgCJAA8BFQGeAG8A2gDwAPL/x/6w/lj/YP+D/vH9ev5n/2//uv79/moACQEKADT/6v/I
+ADgA/f7N/r3/CwD4/hz+9f56AHEA6P4a/un+3f+G/7j+N/90AGoA4/6x/SP+Iv8Y/5n+9f6z/5r/
+8P6t/gr/a//p/tb9k/0//nb+xP1C/an9Uv5t/un9ZP2Q/S/+pP7J/rP+o/60/tL+I/8t/3b+Ef66
+/lH/FP++/h3/8P9BAOj/c/9H/2r/Yf8K/zj/KgDLADUAC/+Q/v3+hv+G/1//wv9LAD4Anv8//7L/
+OQAAAGf/N/9N/+7+NP4D/pr+A/+a/hf+Qf7E/hz/H//J/tT+1//WANAATQBcACsB1gE5AbT/4v49
+/83/3P+6//r/dACEABUAAADHAKsB0AGFAYMBwAGzAR4BRADh/0AAjADJ/47+bf5L/5f/E/8T/xsA
+6wCHAMb/+P//AHcBvwDo/wUAmABhAGn/Jf8xACkB7AAvAPn/fwBPAXMB/QAvAeUBwAH5ANEAZAHI
+AUEBVgBiACYBCAFDAE8AEgFSAZ4A7/8ZALoALwE5AfIA3QARAQUBmgBaAI0A+wBeAXoBUwE5AVUB
+kQHLAewB7QHlAd0BrwF9AZUBzQHkAcQBXAEIASYBUwEbAdcA9gAgAc8AOAD8/zMAeACbANcALgEq
+AeEAzwD4ADUBfAFYAbsAfQDfACwBFgEeAY0B4QGPAd4AogD5AFABUAEaAfIAxACNAIcApQC/ALgA
+awD4/+b/WACfAJkAoACOAGoALQDT/wUA2gBuAUkBvwBgAFkAYgA3AO3/xv/a//P/9//1/+b/1v/o
+/x0AWwB1AGcAUwA3ACMAKwAfAAgAEQAAAKn/Tv8v/z7/Wv9c/1n/Xv9S/07/W/9c/2n/ev9c/0L/
+a/+X/4n/TP///s/+uf6r/tz+av/2/wcAg//z/hH/iv+6/7z/yP/q/zMAcQBSAOj/l/+v/+n/y/9m
+/1b/x/8wABYAlf9Z/2X/Nf8I/2v/CAAFAFf/qP6B/q7+qP53/m/+h/6G/jj+yP3M/Tr+MP6i/bT9
+lf4m/77+9P31/ef+Yf+w/uz9Av6L/m7+qv1K/Zv9G/4x/hH+fv42/0b/wf6+/m//wf9b///+VP/9
+/8T/m/4q/iH/6/9L/z7+Zf6q/zMAQv+I/mr/oABQABX/+P4RAFwACf/p/Xr+kv9g/zT+4v2T/m3+
+Qv3y/AP+P/9M/zj+7v03/wAA2f5o/cn9Tf+h/4P+F/6P/wwBTwB0/kr+4v+EAFn/xf7e/98AfwBk
+/zX/TgDuAB8Agv+dACMC/gGKAJ3/6f9eAMX/7/5S/2AAwABPAAAARwB6ACAAAAC5AIUBeQEOAUgB
+AQIxAngBqQDNAGwBRAGSAJIA9ACTAAQAPQCmALEAfgAdADAA+ABlAQEBkwCeAOEAwQAuAP7/lAA+
+AUsBKQGeATMCxgGaAAgATACAAC0A1P8lAPcAWgHLAPT/tf8bAJgAwgD6AMoBrQLPAnACCQK/AbIB
+rAFvASAB+gAfAV4BZAFeAYABkQGLAaoB3AH9ASACPQIeAvIBDgL8AUkBuQDxAGkBfQFWAXoB5QEw
+AgkCcQHyANkA+QAiASYBFAE9AVwB4QBOAFwAqQCpAKMADwG4AQIC3AGfAXEBagEyAYQABgAWAEsA
+XgBlAGUAVgBQAFEAUwB1AMEAJAFNARgBEwFhAZYBqQHLAQsCewLdArECLgIGAjoCJgKGAeAAsQC0
+AJ4AlQBJAJ//Y/+h/5P/Z/+U/7v/1/9VAMEAkwBEABoA/v/5/8L/Q//x/uj+0f6x/t7+Kf8i/xL/
+WP+h/8D/+P///5f/c//G//n/+v/S/1X/4P60/pb+xf4+/zX/nP5a/r/+TP9//wb/ff6s/gr/yf4h
+/rn9r/2O/S/99/w7/bv92f1o/QT9Gf1b/X/9kf2Q/XX9U/0H/ZD8dfzO/Af95Pyi/Kj86fzF/JX8
+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
+EP9bAI8BzQLcAzEEBQQ4BAoF5QW2BuIHKglxCtcLEw0FDuEO+Q84ERMSkxL3Ev4SnhIDEvoQgQ/8
+DXIMowrpCMYHtwYeBY8DaQIdAXv/Gv4G/a37LPru+MP3W/bV9HnzbvKq8SHxxPBV8LXvFe+c7jju
+ve0N7WXsJ+xn7Pfsk+0s7u3uyu/A8DDyDfTK9Z33sfl0+/78rP5SALEBtQKDA0MEDQXRBXMGBgek
+B0II/AjiCasKXQszDBUNtw3vDQMOAw6nDfMMaAwZDEYLEQoXCSsIJQcOBrAEPwMcAvYAyP/V/sr9
+lfzE+2f7o/tS/okEVwoCC1wHsAKv/6sAQQXMCMYG3P9p+BX0MPNu82/yMfBQ7xXyy/cJ/ev9avn8
+89DySPZt/P4B8QLE/kT5r/WM897xn/Ek84r1ofjo+xL9wfoB9+P0Kfa3+jcA7wPpBM4DkgFO/53+
+JACHAp0ErAZWCJQIagchBSwCmv+z/Wf8rfyD/v3+Yfy4+Ar24/Sf9Qf4rvq8+/v69/lc+WL4ffYA
+9Nbx8PBV8cDxrvBE7vnrxuoX683sMe+E8SnzMvRW9aT2TPcf92r3sPjW+X768foH+9T6Hvtu/Pr9
+tP4J/73/twD8AT8DOgO3ASQAj/8vAIgBlwLgAjgCQQGtAXMDRASFAwQDWgOmA58DWgMWAmH/efzj
++sX6RPs5++T5h/jZ+AX6r/oV+5b7Gvxn/cT/eQFNARMAyP4t/mb/nAGBAjEB9P5t/cb8b/1R/xMB
+0AI/BbQHUAknC2QOfBJaFxEdvyGjI6wj+yLHIdYgqSCDIGkf8R1tHDAarxdaFbwTmxMgFbMXNhmy
+GHsXGxY+FEMS1xCXD3oNkwpuBxcEfwDE/Hr5k/f99oj2VPWk813yU/FE8MzvtO+g79DvIvBW8Fvw
+TPCG8Fbx3PJm9P304vQH9fL1TPdt+DP5WPns+NT4Q/kX+pT7cv1c/3ABhQN/BeEHgAqZDGkO3Q8l
+EJQP8w5YDuUNng0xDcoMSwwSC8AJjQkZCocKLgsoDHAMywsVC7UKYArLCQsJEAh3BmwESQJRANb+
+sP1//Fb7cPqC+Sn4t/a/9Rj1gPRX9IL0cPRY9JX05vQh9ZH1XvY69+T3gvgn+ZD5mPlr+WH5m/n5
++Uf6lPop+7v7BfzJ/JP+oABsAj0EDgalBxcJYwphCxYMiQzLDOQMnAwkDAYMBQzACzcLigrnCUoJ
+Gwm6CWYKZArhCS8JZQh1B2IGXQVqBG0DYAIbAZ7/A/5R/NH6dfkO+O72RfaY9YD0SPMo8jDxpPBM
+8Nfveu9477PvB/Cm8EzxjvH28bLyNfOC86LznvPG8wr0R/Ss9FT1PPZm96n46/k8+8X8nP5rAMsB
+2wLbA7MERQWwBTkG7QZsB40HqAfwB1IIkAh9CDcI4wewB8EH4wfYB30H1wYHBiYFkgRdBBUEZwOx
+AqkC7AKNAvUBjwLNBUALEA8SDiAJoQLp/Vz+cgMWCCsHMwBg9+7xrfEf9EH28/Yf98/4cfyX/03/
+/vqY9STz7vSs+aP+n/93+qny5+w66nvqxO1e8gv2a/i5+U356/bj81ny9/Pb+Mz+hAKvAuX/Yvtt
+9932ePq//3QDbQRdA3EBxf/0/r3+kv57/rD+gf80ARcCAQAJ/Ab5bvhP+tr9+gCMAZb/jvx5+R73
+KvZH9k729fXU9d31RvXE8wryOvEF8jb0IffA+cL63fkE+If2ZfY199b3+ver97z2S/U49Fj0i/Vs
+9475JPsV/BH9KP4Y/wkA+QBQAdUAPAD7//3/dwAzAU0BNgBn/hj9+/wU/sX/5QC1AFz/Ov6G/tX/
+SwEZAiMCHQLYAacBMALuAkYDnwJEAR4Azf+dALEBTQIlApkBhAFJAbgA/ACTArEEQAZ7BxwJvApU
+CzMLqAv0DLYOSRHHFOAXhhkBGrEZWhmwGWMavhoeGjwZDxkbGcoYXRcZFfQTbRTVFbAXRxnbGXUY
+iRUCE7wRVBEOEe0Pdw1FCvIGEASnAYz/S/6d/c38APxU+7j6zPlg+P72PPZa9nb2mPWS9N7zw/Kx
+8ajxXvLs8gLz6PJB82r03/Ua99f34ffj96L41vke+z38Bf2M/R7+T/9MAY0DWgViBvcGdQfoB1YI
+ywhECZ8J1gkZCoYKSwtLDOIM3Ay6DAoN1A2DDsYOwg43Dg0N5QshC1QK/QgsB04FyQPnAoQCKgKz
+ASIBhAAcANz/f/+z/oX9j/zo+xf7KPo7+Tf4Ovda9rf1h/WZ9Y/1VPUf9QH1yPTO9J71pPYe92f3
+2vdd+Dv5svog/Af9u/2W/q//5AD3Aa8C7ALlAgcDlwNfBOUEBAUaBVUFvQVoBgAHkgdoCDIJuQkb
+CisKywloCSAJkwi7BxoHkgajBXcEXwNZAngB6gB8ABAAtf8Z/y7+Tv2B/LX77voM+jr5ovgc+GD3
+VfZU9bT0VPTz84nzV/NT8x3zjPIE8tzx5/EC8kryqfL78knzb/Nv847zEfQH9SH2Dfem9xP4oPg/
++cP5IvqT+mP7aPxO/RT+zv5e/8f/aABrAYYCegMWBE8EegToBNsFmge8CScLTgt/CukI9wYvBj8H
+mQjVCL8HoAWLAz4CWAEOAc8B6AKkAxAECgRNA40CYAIeAogBJwHyADAAvP4B/fv6xvjz9u71xfVS
+9kP31veM95/2vfXR9en22Pfr97D3lPdP9772KvbV9an1gfVn9ZL1Nvb39k73NPfx9gD3sPeF+C75
+DPo3+1L8DP1K/Sj9LP3X/cT+H/8R/wf/ov7u/Yn9pP3K/a39wP0y/hv+QP3J/BX9Df0//Mb7R/wc
+/bP91P1f/a78LPyK+536Ofp2+gj6nvhS9932DPcj98D2nfaL9yr5ffoC+w/7iPts/OL8yPyS/EL8
+afuA+oT68foV+0v7o/vp+2z8g/2x/kD/Zv9u/x//tf6n/qj+dP4o/mf9WvwM/In8M/3M/Sn+Xv6r
+/hj/PP9j/24AuAGRAlEDrQNJA/QCmwMrBOsDYgQoBScFdgVNBr0GtwbIBgIHdAc+CHAI1Af8B4QJ
+XguXDH0Neg78DsAP/hH5FAkYjhoVG9wZ0BizGMYYwBiEGJAXZBZ5FVsUoRPPE/ETwxPOEz0U/BSZ
+FToVwBMcEuMQtg9YDsoM1gp1CMEFNQOYAbQAuv9q/iT9gvxR/O37Tvt4+ob5Dvn3+I/4Lvge+F33
+3vXh9KT0svQE9Wz1gPU79RH1V/UP9ub2mvdD+MP4HPm4+aT6iftL/CD96P11/g7/1f+PABEBqwF/
+AgQDUwPmA64EoQW0BsMH2QjCCTwKpQpVC9QLxAuoC/gLcgxqDJwLiwq1CVoJbglOCWcIAwftBaoF
+4AXsBawFSgWyBOMDYgNWA0UDsgJ4ASQAL/9l/nz9fvyl++P6GfpD+WH4wPeJ92n3IPfL9rP2F/ed
+98b35Pdf+Nj4Cvk4+XL5ufn9+RD6Q/oP+yb8xPzD/HP8I/xN/Cn9AP44/lj+5f6f/00A6wCMATkC
+qwICA6kDMAQ5BEEESATwA4MDaAOGA5oDjgNbAwcDigIJArsBdgEXAcEAZADb/07/4P5K/n39v/w2
+/Nf7Yvu8+iX62/nZ+bX5SvkI+QP51/ij+Jf4QPiP9xD3/PYW9/X2b/bM9W71k/Xz9RX2IPYG9nX1
+B/UZ9Tr1YfV99V/1fvUL9pP2BPeZ9z340/hJ+YH5iPm/+TH6lvr1+jL7KvsZ+yv7evvo+0r88fwB
+/gX/1/+KAPsARAHAAW8C+AIyA7sDBAZ+CscOHhDBDoAMuAq5CiANKRDsEFAORAkxBL4BFAJtA1kE
+UwTxA3wEiwZ9CNoH1QQQAtIAiQDiABkBGf/o+X3zZ+4Q7NPsGe+78IXxIPI38rHxVvE98Wzx8PLk
+9Yr4U/kJ+EP1H/KK8PjxpfU6+Qb7A/sB+iX5m/lg+2/9wP4w/7//2gC7AcgBTQHgAPwAQQL1BPMH
+XgmtCMgGogT2Am0CHAPlA2MDmQHP/+b+gP79/YD9DP77/8kBhgLdApoC9ACr/i799vzQ/cL+T/5z
+/Cn6JviT9+743vpa/FH9av16/Fr7FPu/+8/8xv3z/RL94vtI+0n7X/t9+8b7S/we/fn9d/6P/hT+
++PwS/Ev8r/0r/13/i/6Y/Zj8PfwU/YL+5/+rAKEAeADXAF4BZwFCAXsBTwLHA10FZAZTBiEFOwTQ
+BM0GsQkmDLQMigtLCjwKdgtEDZkOMg9LEIYS0xSKFvcXpxjmF9cWMhd8GDsZYxkIGZQX5BU5FR8V
+BxUoFRkVZBTPExEUgBR1FNITgxIcEQMQkg6FDHsKsgjJBtcEOwP5AeIArv9T/uz82vt2+0L7q/rm
++S35Z/iT98L20PXJ9NTz3/IT8s/xGvJ/8rDynPIn8sDxF/Lo8n3zt/O289jzS/Sv9Or0WPVE9pr3
+5fjL+Y76hvuJ/JD9p/5s//7/8AAHAsMCPQPWA5kEVAU5BokHAgknCvEKrQtzDAwNTg1eDUkNKw1D
+DVINEA2fDB8MjQsxCzcLMwvaCkQKjAmvCLAHnwasBdYE6wPfAnIB+f9i/0z/j/5o/ZT8yPvx+mX6
+8Plk+dj4Ifg893328vVv9QX10/SP9DD0NPSN9O30lfVb9nj2CPa/9bz1yPXm9Sn2XvaB9tT2PPdg
+92D3kvdC+Hj5lfpJ++b7ivwW/bD9bP7y/lD/vv8vAKYAJAHSAZ8CTwPjAx0E4QOXAzIDhALfAWsB
+/gB2AOP/eP91/7D/2/8HACMAEAAdAHYAsgCAAPr/9f7D/Qr9lvwb/Mn7h/vv+gb6Mvmf+G74y/hi
++aX5Yvno+Jb4YvgG+HX3BPfa9rb2qPbv9lD3a/dX92j30fdS+J749/hV+Uf5BfnX+Jz4a/hq+Hn4
+bvh/+M348fjl+Bn5v/nK+uH7hPzQ/GD9Of60/gv/4//CADwBugFbAtwCHQMoA78DJgakCosPbBJ+
+ErgQlQ69DekO2RDEEcQQcA2qCPAEvQOFBCcGqAd0CPIILwoMDN0MpAuDCTEIyQeBB+gGJwU8AdT7
+wvZ988Py/vOw9bf2r/YZ9sT1xvW+9b31OvZf9xL5x/om+1n5EfYF8xnyOfTz97v6ofvv+jL5tfe5
+9zf5BfsO/GX8AP1N/lv/Sf/A/tH+6f9oAgcGyQjrCCoHEgUqA/EBIwJqAzUEjQMBApYAAgA5AJUA
+JAFLApsDzQTfBSUG/ASmAmQAUf9f/97/GACA/9L9yfuy+j77AP3U/ur/GgCa//3+wP6z/mT+0/08
+/Zv8P/w8/Ar8nvsL+zL6w/lI+jD7GPyv/ET8MPuM+pD6kPqM+hn7vPvo+//72/tg+0z76/vB/H79
+Zv6c/4QAggCq//X+bv+oAG4BXAHxANUATgFOAn8DpQTyBTEH9Qd7CFIJ9gogDX4ONw6fDaAO5BCw
+EhcTlhIjEuYRpxGlEWYS2hO/FMkTrBGuEJERDRMLFCQUbxOlEm0SjxJbEo8RfhCxD/wOyw1VDPgK
+eAn0B+YGBQa5BHIDAgO7ApwBQQCu/+P/CQBS/9n9t/xm/AD8w/oJ+WD3AvYm9aH0HfT68130lvQw
+9IbzVPPO82n0cPQN9N/z3/PL87bz3/M59L/0Q/WE9cn1Svbq9n339veK+EP52Pkv+mf6b/qH+kX7
+aPxo/Xb+sf8jAaUClwMEBIAEEwU2BfUEGAXbBawGIAczB/MGtAYsB4MI+wn8CosLtguaC3ELUQs3
+C94KTQrMCRUJHQiJB08H9AaLBvgF/ATtA0MD2QJKAsYBjAFMAWYAAv8q/hH+5f1l/cj8+vsn++r6
+3vrQ+Vr4FPhb+K33UvYz9WL0HfR99KX0QfTR887zM/RL9NPzxfOf9Gv1rfXC9QX2VfZV9hr25vXH
+9cT17/Ul9nv2HPfN93P4N/nf+Ub6APsw/DH9yf0M/hj+Sf7L/mD/2/8/AJgA1QD8AE4B2AFiAtUC
+SQPBAyMEXwQ8BL4DdwN9A0UD7gL5AhAD2gLKAgQD+AKRAkYCEQLbAbgBXgHIAEUAwv8h/4f+8P1i
+/QX9wPxx/Df8O/w7/PD7qvuv+6T7Xfse++b6o/p++oT6hfp7+pf6yvr3+i37dPu5+9770vuX+3D7
+kvv9+1r8dvzU/Fv+qgFsBR0HYgbiBFIEqwU0CCQKtwr0CaQHOQSJAT8BJgOHBZ8GCQYBBcUErgUU
+B6wHbgdmB6QHpAdCB0QGcATtAUf/Z/07/ZP+8P9SADYAHwDw/wwA9AAjAscCwAKpAvwCCQOmARv/
+Df2w/LX9IP9tADgBBgHZ/4T+Mf4c/2sAHwHSAPX/IP9y/q393vy2/K/9S/+bAPcAWQAw/9n9rfwu
+/H/8L/26/Z39YvxW+hH5t/kM+7T7IPz5/PD9cf5y/iH+sv1a/SD9Mv2d/eb9ov2//Cv7pPmt+XT7
+ev12/jb+Of1a/Fr8HP0N/tf+Jv/H/gf+ff2J/UH+J/9P/6z+Rf68/m//hf/6/iz+p/3C/Qv+4P11
+/Vr9gf2x/Qn+kv4V/5H//f8UAPb/AAAfAOL/Qf+4/mv+Ov5O/pP+d/4z/m3+Nf83AAEBvQHIAm8D
+GANQAt0BMQLSAtICMgK2AfABhgLOAgEDvAMBBUsGMwc6CBUKIwwjDasMxguuCw0MQgxgDC8MlwsZ
+C7UKVgqqCukLIg1rDdsMJAwDDKEMSw1xDUMNAg1aDEgLnwp0CtEJzQg/CAgIwwc0ByYGUwVEBfoE
+6gPtAp0CjgLJAR0Ayv67/gD/cv5x/eL80/yB/Jj7lfr5+cj5g/mt+Jb32fY39nP17vTZ9Bn1i/XU
+9Rv25vav99j3xPfE95j3MfcE9zv3Z/dy93/3rPcx+Nf4Rfmy+V/6M/sA/Lb8Ov13/bj9Af4q/pL+
+W/8LAGgAWQDQ/4j/HgAcAfwBxQKBAzYE0ATuBJEELgQ3BN8EqgXSBW4FQgVyBaAFrwXkBWkG5Qb9
+BqoGQQYWBjQGVwbsBRwFcATTA0QD7wLYAtMCwwKnAoECVwIxAhcC9gGRAf8A0gAFAfUAhwALAHv/
+yP7v/dz8x/v7+pr6fPp/+p76ofp1+jL6yPlI+QH5CPkp+TD58vhU+H/3y/Y89o/19PQB9cD1Z/ZD
+9rD1p/Uz9p/22vZ49y74Zfi7+IP5L/q2+lf7CPyW/AD9ef3g/f39AP4m/oH+Gv+q/wUAWwCSAL4A
+TQEtAuUCWwPXA3AEFQWSBawFjgV2BY4F4wUrBiMG7AXPBb0FkgWBBZcFrAW2BXkFPQVqBUkFuQRR
+BOADcQNvA3gD4gL2AT8BsgBPAAgAsv9g/wj/gv7w/YD9Hv2t/D38+fvZ+8X7uPup+6H7pPvJ+w78
+WPx+/FP8O/yk/Fn9Zf4eAPsBMQPdA0UEgwTYBHcFNAbfBk0H9AaeBdkDhQIdAn8COAO2A4gDBQMQ
+A9ADtASHBWMGAAczBy4HmgZfBewDUgLNAKT/7P4O/4v/df8L/5f+Hf4J/mX+s/60/q3+1P7M/kv+
+7/35/cn9Bf0//F/8Q/0Y/mf+F/6H/Sb9GP05/Qb9hPw8/Of7/Pov+jP6hPoh+yP8tfzI/Nf8z/zG
+/Nv8zfxt/B78MvwJ/AD7pvnI+Ef4zPdo92v35vdD+C/4XPgL+X75r/n9+R/6Hfpr+rL6fvpP+or6
+8Po9+z/7wvob+tT5BPpy+vD6u/u6/C79F/0v/a/9bv5+/6sAXwFMAcEAUABDAKMAcQFGAl0CYwH7
+/wj/6/6W/6IAiQHGAVMB4wDHAO8AgwFVAvcCEgOVAvMBiQFzAc0BIgINArkBLAHsAHYBLwKEAqkC
+JAPEA98DugPTAy0ElwTABAIFGAZ6BxYIAAjIB+AHlAilCVsKUAr6CdIJkAkXCRwJ0Al0CosKCApa
+CUwJEgpQC2oM4AzLDFgMkwvSCloKFgqgCfcIfQjsBy4HngYKBoMFTAU5BSYF+QS0BHYEHwS8A3cD
+OgPvApICJwKgAaEAWf/H/gf/T/9q/xP/8/26/Cz80ftT+x/7Fvvi+k/6P/lu+I34SPkj+rj6qPoV
++ov5bfnQ+Wr6w/qm+kz66Plr+ej4ovjT+HD5Pvrb+g/7LvuL+x78svwm/Zn98v3i/aH9x/1g/vb+
+U/+G/7f/DQB9AO8AXAGmAdIBGwJ1ArYCJgOxA/EDbgQ2BXgFgwWxBakFqwUIBncG1QYiBycH2AZk
+BuIFoAXQBTAGoAbXBpcGEwZ4BQQF1gSqBGIE/gObA0MDnALKAUIB7ACRAFcAgACFAOv/cf9t/2H/
+Gf+0/mv+Cf53/QL9Xvxk+9v6F/tm+1L7LPtI+177O/tA+2b7e/uG+2T7DPvl+hb7Avts+u757Pno
++X75B/nS+Pr4Vfl9+ab5BvpM+m76bPpN+mL6zvpM+0/72Pqe+qb6T/r2+S76YfoP+qr5jfm1+RT6
+jvr++mX78Pul/ED9nf0B/rf+d/+4/6n/uv/w/xYA8v+z/7H/2v/q/wQATwCTANkARgG2AesB4AHW
+ARMC1QJlBGoGPwcWBrgErgR2BRQGzgW2BCEEqQTzBFEE6AOABKAF8gWnBN8CcQKZA/0ESQU2BNUC
+QQJyAu0C+QJxAuoBRQFCAGj/P/+z/x4A6P8z/4D+YP7h/kf/Ev8y/hP9Z/yg/FP9V/06/Pj6jfqy
++vn6W/uu+9r7svs4+/n6Yvs9/MT8bfzH+837Xfx5/O372Puq/Cf9ufw4/FT89fx//TT9R/zL+zT8
+8/ws/bb8QPx+/FP96/0Z/nD+Gv+Z/5j/Mf9Z/mv9Pv1u/Sb92/z0/Cv9eP2R/T/9NP3M/W7+nv5N
+/tD9yv1T/ur+I//0/ob+Pv6M/hT/Y/+4/w8AAACe/3L/tP8JAPb/j/82/xH/U//w/zcABwAJAEgA
+WABiANAAiQEpAlYCugGqAAUAFQCAAKEACAAw/+X+OP99/2D/Iv/t/tT+9f5L/3r/if/T//f/oP9K
+/yz/Dv8V/0f/WP9U/13/ef+7/xcAWwBxAFcAMwBGAGcAcwCHAJoAigBhAKMAWAGIATUBXgEDApcC
+1gKXAk0CXAJ6ArECLgOMA4oDggO/A+UDtgO1AxEEgQQOBbUFKwZ2BrMG3gYsB3EHaQeTB/0H/wek
+B6gHKgigCOgIZwkZCncKZwoWCqQJbgltCWEJXAlXCRQJoghqCH4IkQiQCHkIUggtCPUHxAetB2wH
+0AYrBs0FcAUEBeUE4QSNBPIDiAN0A1UDOgNLAzsD4AJXAvMBvgFLAa4ANwCw/wT/lP5s/kT+Jv4E
+/sL9lf1x/Rf9zfz2/Fr9if1+/Ur9tfzr+337j/uw+4T7Q/sJ+6X6Qvok+lb6zPpK+5D7zfsL/Cj8
+WPyC/E/8/fv4+x388vtz+xD73Pqw+s/6Y/sS/KP8/fwA/R79rf0d/hb+Ef5o/tb+Lf9h/yT/wv7u
+/oz/BgAuACUAJQBxANIA3gCzALoACwFRAZUB0wG8AacBtwGgAagB6gH4AbwBegFrAUUB3wCxAMsA
+9gBGAX8BQQHqAPQAIAEGAZ8APAAXAAEAwP9y/zn/6v6M/lv+T/4n/tP9fv0r/dz8vvzV/Pn8If05
+/QH9nPxE/O/7w/uv+4j7lPvF+6T7Qvvd+mf6Kvpl+tv6SvuK+7D75PsM/NT7Ofv0+lb7gPsn++z6
+7fri+r36wvoL+0z7dfum+8L7w/vy+1b8dvwq/N77+ftW/HP8U/xE/D38Ifw4/O38/f2D/kH+7f0G
+/pz+fP8GAOn/pv/T/1UAvwDCAIoAswBQAaUBPwG1AMEAFgE+AW4BlwFhAS8BdgHVAf8BHAI7Am0C
+qALwAlUDPQNqAq8BogHzAfIBhwE9ARABxgC1AAEBUwF6AXwBPQHwAOgA5wDaAPwA7AB9ABcA1P+d
+/7L/GwAfAKn/j//c/wAA/v89ANoAUgFQASoB/ACUABQAuv+M/17/Kv8u/1z/fv+o//7/RAAwAO7/
+AABVAIIAjABGAKf/Sf8q/wH/8/7H/nL+ev7T/ir/p/8dABcAyP+I/1D/Hv8R/1X//P+IAHAA2P86
+/wL/Mv9s/43/gf9H/x7/Gv8p/z7/Rf81/yT/Hv8T/zL/jP/M//j/TwCsAJwAOwAOACoAfQAAAXEB
+ZQEnAYYBSwKRAmMCKQLdAcsBTgLIAr0CsQKwAlQC/wH/AdgBjAFeASkBEAEOAcwAcQBYAF8AOAD4
+/+H/4P+3/3r/Xv9N/yn/Pv+X/wQAZQBZAPL/v//8/1MAawAuANP/nP+f/8L/xP+a/4b/tf8WAKgA
+DQHYALEABQFCAWcBzQE4Al0CWwI3AvoB4gHgAdkBAQJ7AuwCAgP7Ag4DDgPjAgkDZwNPA/4CCwNY
+A3kDhAPMAyYEJATYA7IDvwPsAycEOAQMBL4DngPeAyEEAQSvA3UDVwN9AwEEhwTRBO4ECAU6BUgF
+7QRpBCoEPgR2BKUEyQToBPkEzgQ8BMED3AMmBHYE2gTvBL8EhQRDBPADawPCAkkCAQJ7AQQBBQED
+AYIAAQBMAPgAGQHSAMUA3gDGAJoASQCU/+v++f50/2z/rv75/bL9Wf3v/OT8/fzQ/Jr86fx+/az9
+d/1O/Vn9fP2w/df93v3q/a397fxU/Dv8UPxm/GH8LPzq+8v74vsX/D78X/zJ/GT9t/2u/YD9Tf0c
+/eD8mfxq/Hr8ovyj/Jn8qPyo/LX85vzC/FX8VPzK/A79F/04/Sf9u/xH/Cj8kfwF/ef8hPxx/Jr8
+p/za/Gr97v0a/gD+1f2u/Zz9uv3E/aH9qP2//b79zv3E/ZH9av1a/VL9Wf2k/f79Ff4m/jf+KP5I
+/pD+jv5O/i/+LP4G/tf9xP2H/TT9L/00/RH9Hf19/cn9vv3D/bv9i/3c/Wb+af4Z/sb9ev2C/cL9
+sf2U/af9nP2z/Rn+Wv5N/jr+Pf5g/sH+J/9U/1T/Y/+H/3v/L/8U/1r/m//N/w8AKwAxADwANQAk
+ACYAVACiAB4BlAGMAQoBdABKAOEA1wFlAjkCzwGtAagBjQGJAbEB2gHJAUoBrwCOANMAGQE+ATYB
+DwEaAVsBiwGmAaQBqAHTAegB6gE1AnUCQgIMAt4BuQH3AUICLQLyAccBqQGdAZkB2gFJAiMCjwFj
+Aa4BIAJ5Al4C5QF7AUwBUQG1AXUC8wLMAkwCzQFxAVoBhAGeAYYBhAGgAVABcwD6/14A1wDcAJYA
+cQDEAC8BPgEDAcIA4QBPAXoBEQFsAFwA4wAIAaQAPgAQACcASwBFABAAw/+t/xUAnQCdAEsANAA4
+ADEAVAB7AFUAHQA6AIUAnwBtADAAOgB8AM4A5QCaAF0AWwBGAA8A3P+7/5j/f/+N/5f/jv+g////
+YABnADYA4f98/1r/dv93/1f/SP80/wD/w/6g/s7+IP9S/6r/CwDn/37/Uf8c/6j+Q/4V/hb+if4/
+/63/tv+A/0n/Df+w/nP+n/7w/uz+5f4z/27/Jv+0/qv+2/7Q/sj+IP9X/wr/wv7N/sz+xP4I/27/
+yP8WAG0AygDoAMQAhABLACYA+v/G/2T/C/8w/1j/E//s/if/a/+n/w8AlgD9AEcBoAHVAZABLgHj
+AFAA3/84ALUAfwAwAGQAtAD+AH0B7AH/AeMB6AEZAiwC3AFvAWYBmgG/AcYBywHYAeYBJgJxApAC
+kgJGAtMBrAHDAcABnQGnAccBuAGgAZgBgAFkAYIBvwHfARACSwJSAjICDgLrAdYBogE4ARUBTQGL
+Aa8BoQFeAe4AZAD6/83/3v9OANoA9wDwADEBOwH6AOQA0gDBAMwAugCFADAAwv+S/53/Xv/V/pX+
+yv4P/yv/S/9n/03/Tv+4/zQAZABKACkAIQAEAOz/FQBiAHYAYABQACMAwf93/6j/2f+B/yP/Lv9D
+/yj/D/8H//P+z/7D/vX+Pv9h/33/q/+t/2P/8f6X/nj+ef54/kn+6f2e/Vr9Hv06/Wj9Ov0S/R79
+/fz7/G792v3//Qb+I/50/sL+wP6N/nP+T/4c/g3+Pv6P/oT+Pf55/hr/eP+i/83/2//Q/9b/9/8j
+ACIA5P+h/3v/Wf83/z7/Q/9F/1T/NP86/3L/Zf8//zb/D/+5/mn+N/4P/un9w/2e/ZP91v08/m7+
+jP6b/pL+BP++//D/7f8oADEA6P+8/6j/jv+h/7H/2/9NAIYAbQBuAKUABQFwAbkB3AHtARQCUQJg
+AjQCAwLYAZEBRQEvATEBOwF4AbABuAHQAQACQgKBAlkCFwIOAuUBywHcAbsBZAEmAR0BDgHdALgA
+wgD1AFMB8gGjAtoCmAJcAj8CKwI0Aj4CFgLXAa8BdQEWAbsAawBrAN8ARAE7AQYBAgEwAX8BwAGW
+ARMBswCWAIcAlgCyAGMA8P8FAIMA3QDuAN0A0ADZAOoA7ADXALoApgB7AEQAEgDE/5P/jP9n/13/
+ev+A/57/3//j/6n/gP+C/57/yP8JAAoAn/9k/3b/g/+2/+j/vP9t/yH/zv6c/of+gf6U/pL+Vv5F
+/p/+KP+p/7j/WP9J/5D/m/+g//n/RAAmAOn/7P/I/zP/7f4q/0b/RP9H/x//0/6r/rL+o/5l/ir+
+If41/kT+Xf5k/jX+//3Y/cL92f3w/c39s/3L/bX9Z/0d/QX9HP0A/aT8evyj/K78afxR/H78avwv
+/Cz8HvzS+8r7Ifw3/DT8cfyY/Mv8Uv20/bT9kv1f/VP9i/2S/Sj9tPx3/ET8Qfym/PX8tvya/Cr9
+uP3N/cn9AP5D/lv+Mf7a/bf9+v1d/oT+gv6w/hH/cf++//b/GQBOAK8AGAFEATwBKQH4AOUAHwFO
+AV0BagF+AYYBUwEKAekAygDBAAUBKgHuAPcAdAG2Ab8B9AEIAvcBEAIfAu4BrgFrAVIBmAHFAbkB
+AAJ1ApsCnwLcAkUDbgNFAzwDcAODA2oDNAPQAnsCXAJmAmwCQQIHAgkCXwLKAhgDFgO4AmkCaQJt
+AkMCKQIrAgICtQF/AV4BVAFqAXsBcgF8AaUBrgG0AekBKQJLAg4CoQF2AVkBFgELAVYBcAFIATIB
+IwEvAWsBjAF4AVkBQwFaAbwB/QHoAfgBJAIcAu8BrgFbAfUAxAAUAZ4BBgJRAnEChwK/AvoCSAOn
+A7oDdANUA4gDnwN0A0AD/QJvAtMBugH+ASICKwI7AlICfgKWAogCfgKKAsICyQJEArMBgwF9AWYB
+PQE0AXQBkAEdAbYAqACAAD4ABQDM/5v/W//7/r7+i/40/hn+U/5//p7+8/4y//n+qP6z/tD+ov54
+/oz+gv5U/nP+xf7v/gD/Cv/3/rb+lv7D/gX/Lf8W/+r+4f7O/o7+RP4U/u397/0h/jz+Jv4L/iH+
+Qf5E/iH+vv1s/YD9xv33/Qz+D/4q/n/+2v7x/tD+o/6Y/uD+S/+k//z/KgAqAGQAsACMABMAt/+/
+/+3/yP9N/97+vf7D/sb+Ev+h/+//GgCHAAgBIAHiAMUAxQCvAHwAHQC3/2v/Gv+2/lX+G/4P/hX+
+Fv4k/mL+vv4T/1D/bv9f/2L/r//l/8H/e/8l/7H+Qv73/cX9o/2U/Yv9i/1q/SX9QP2O/XH9SP1j
+/W39iv2r/Yb9dv2B/ZD92P0d/gj+x/3G/d79wf2j/dr9Qf5G/v399v0Q/vn9zv3I/Qf+Vv5P/hv+
+RP61/u3+9f4N/y3/Pf8p/+j+pv6T/p3+qf61/rX+u/7f/hL/O/9P/2f/aP9D/z7/cf95/w3/l/6e
+/gH/S/9V/zT/9f7S/iD/uf/q/33///7Z/hv/df90/0z/XP+Q/8T/7f/s/7v/rf/S/wYAbQCiADwA
+v//T/zwATQAaACIAVAB3AJ4AwACjAGoAWQBnAHkAagA4ABUAFwAxABUAy/+z/6z/kP+P/6L/p/+S
+/2b/RP9h/6r/wP+r/7T/vf/k/2AAjQA6AAAA+P8mAG8ASQC1/1f/X/9s/3j/m/+I/yD/3P4h/6T/
+2//K/+z/QwCbAPsAQAFCAf4AqwCXALYA7gAfARgB+QADAUQBjQGaAZIBzwFKApwCsgLNAuACywKu
+AqMCyAIpA3ADRwMYA1ADgwN1A3UDhAN9A58D8AMEBMQDfANRAzIDDgPXAp8CbQIaAgkCnQIiA0UD
+ngP5A/MDFgR5BIkEJQSmA2IDQwPqAlsCCwIoAkoCTQJBAgcCwwG9AfQBFwL+AfMBBAL2AdUBrwGG
+AZMBwAHWAe8B+QGuAU0BSAEvAbUAbgCIALQAyADdAO8A5AAHAWEBgQFQAQYBqQBKAAwA5f/P/8T/
+yv/8/ywAIwDO/2r/kv8wAHMALwDb/6X/l/+5/9L/qv9V/w3/Iv+M/9j/6/8GACwAXgCiAOQAKAFu
+AcUBNgJpAjYCLAJGAvkBiwFkAY4BwgGPASMBuQBQADMAWQBQAAsA8f8iAGAAoQDUANIAtACfAJUA
+cgBdAIYAoQCvAAEBSwEXAbAAhAB5ADkA4/+q/z7/m/5x/uH+GP/A/nT+gv60/ub+9P7r/tT+j/6b
+/jD/Y//r/p3+s/7N/sf+k/4+/tz9j/2D/XX9S/04/Ub9if3X/f79HP5T/p7+vP6s/tn+Hf8y/0//
+Mv+b/i3+Kf4z/kD+Sv4b/rf9cf19/Zv9cP09/Wn9yP0h/lr+Qf7m/aT9nf27/dn9w/2V/a79y/2Q
+/U79HP3Q/Iz8Ovz9+zr8ivyZ/K38vPyO/Fz8ovz1/Nf8zvwK/Tf9TP14/bD9vv2q/av9v/29/bz9
+3f0K/jX+Tv5A/jT+JP7U/Y/9iv1l/TX9Y/33/YL+iP5R/mP+g/59/pX+vv7a/in/gv9m/xT/3f6l
+/nz+YP4x/hH+CP7s/aX9Vv1X/bj9Bv4j/k3+ZP5r/sj+gP8iACAAcf/N/qP+oP5t/iP+7/3g/ff9
+Jf5V/lv+Sf6n/pD/SAB9AJQA2QAwASYB2QDbABMBCwHbANsA/gD7ALcAcwBMADQAXAC8AAYBGwEb
+ARwB+gDGAM0A5QDcAOgAEAFHAX4BbAEhASUBZgFRAeAAtwAsAZ4BegEsAQkB2QC9AOUACQEVAS0B
+NQEqAR0B+gDmAB8BagGQAc4BLQI7AswBeQHVAXICmAJ0AmcChgK9ArsCiwKHAqcCyQLlAgcDPANo
+A2MDMQMXAxgD9QKtAmECSAJ2AqsCogJUAjkCkQLtAuYCswKfApgCkQJxAiEC0gG5Ab8BqgGEAbkB
+TAKWAmsCGgL7AS8CcgKXAqsCmQJeAlYCnwKrAjcC1AGyAY0BrQEfAlQCIQL/ATACYQJXAjYCFwLw
+AdYBuwF/AVwBdwGwAbsBjgGeAQcCWwJjAikC3gG/AdAB8gHyAbMBcAFHAQkBvQCmALgArACBAGUA
+WgBdAGgAZABOACYAMgCZANQAdwDs/8z/8/8CAOX/n/+P/7//zv+//8D/sv96/1H/Zf+A/4n/dP8s
+//H+8f4D/+7+nf5T/mD+lP6i/o7+Y/4//kj+Zf6b/gr/Zv99/2j/MP8Z/yr/G//u/s3+Av9p/1z/
+8f7L/vf+AP+//p3+w/4D/0b/TP/6/rb+yf76/i7/Vv8Z/43+Sv5u/oP+SP7z/dP9C/6G/vX+TP+R
+/3n/VP+I/7z/pf+Y/8n/5f/i/9X/rf+4/0IAfAEPA7gDIgOPAtQCdQObAzoD9wIfA2MDfgNCA6MC
+EwLbAbgBiQFpARMBgwAgAOv/rv9j/w3/tf6E/nb+Jf6R/Rz90vxz/AH8u/ti+4n6b/lg+I/3gvcd
++H/4s/j++AL5H/md+dn5u/mc+Zb5wPnr+eb52vnq+Qr63PmK+d75o/r8+i/7w/sV/Nz7+Pug/Az9
+6fyk/K38T/08/pz+Wf4K/v/9PP5i/hf+yf3i/T/+tP4Z/xn/wv62/vr+/P7D/rL+8P51/yAAuwDt
+ALcApgDMAMUAxQAEAQ8BwgDnAHEBWgHdALAA1wBaAecBAALpAdkBswHKAS4CMQKjATgBZQG6AcQB
+uQGwAWwBEwHsANUAfgD4/53/hv+m/6v/X/8q/xv/GP9o/+P/NgB1AK8A5gAoAWoBlAG1AawBSwHO
+AG8AHADQ/6H/wP89AOcAXAFvAR0BjwBNAIkAzADbAM4AqgB6AJEA7QDvAJsAoAAbAY0BxAHMAbEB
+gAExAd8AoQBOACgAnAAuAT0BHQFRAcEBJQKVAhUDQAM2A4ED+gM7BDwECQSsA1cDVwOBA3cDRQMQ
+A/4CKwNdA1YDOwMoAwcD3AKhAm8CdQKyAisDrwMJBCMECQQkBGAENgTnA/MDJAQQBNEDngMvA3IC
+zQGCAcwBTwJZAjYCbALcAk8DmQORAzYD2ALAAtQC6QLOAkUCpwFTASoBHgE2AXEB3wGNAlADyAO4
+A0sD9QLYArICcgJLAgsCeQHwAI8AEgDL/x0AnADnAAYBGQFdAaIBnQFyAVsBdgF/AQ8BdQA+AEEA
+DADR/93/+v8eAHwA3wD9ANEAjACAAIQASQAoACoA5/+c/2//Nf83/4T/t//M//v/IwA3AFMATQAJ
+ALj/iv+Y/6j/hP9e/0f/If/T/kL+u/2e/c39EP5k/qz+p/6D/nr+bf5s/o/+uP69/pn+df4//vn9
++P0A/sr90/0v/jv+z/1s/Vn9V/1G/Ub9RP07/UD9UP1M/RP9p/xE/EP8gvye/I78MPy4+7T7B/wg
+/Br8Zfy//OX8/Pzp/I38Xfyj/Pf8Fv1a/db96P2X/ab9AP4g/hn+L/6M/vT+JP8v/wj/y/7M/gD/
+K/83/0T/Sv82/z7/N/8C/wn/SP+A/9P/SwB1AAMAWP/r/uj+Jf91/9P/6/+y/33/Wf88/zr/b//F
+/xIADgCv/2n/Nv/f/rj+3f7//gr/Jf9H/1v/R/8S/yD/cv+v/9r/8/+6/0j/Av/y/vf+6v7X/uf+
+0v6V/of+rv7i/hL/If8M/xD/Pf9C/+f+Vv7y/f/9V/6u/s7+sP6Q/p7+wP60/m/+OP4x/jr+Tf5D
+/gv+8f3l/aX9Yf1y/aD9lf1Q/fL86vw9/W/9lP3G/bz9kv2e/d79LP5p/mr+Xf58/oP+R/7y/cD9
+qv2A/Xz91f1M/q/+9/4h/2r/3v8nACwAHAAPABYAWwB1AP7/X/8F/yL/rP8HALn/Qv8//57//v8t
+AIQAEgFIASAB+wDrAO4A5wDDAOYAaQGgASsBkgBPAGUAyAADAbsAqgB9AVgCXwIIAqMBCQGVAIYA
+jQBkABIA+P8rADAA9P///28A/QBvAbUB+wErAhACFgJKAjkCBQKmAeMAQQBTAJsAfAB0ANkARAFq
+AXwB7AGPAsICngKwAtoC5QKzAigChAEJAdUA0ADcACoBuAE/AoUChAJsAncCtQLvAsICXwJBAi8C
+CwI9AmQCNAJfAvgCewMHBIgE1ARYBfEFOQZPBg4GgAVUBc8FcgagBkwG1gVEBaQEZQSDBLUEDQWa
+BRUGOgYjBgEG+QUfBjAGBQbcBdUF0AWoBTUFtwRsBCYEBgQnBEYERQQvBBIE7gPgAwQEHgT5A7oD
+jgNbAwgDngI2AhcCLQJqArcCeAKxASwBIwHqAE4A3v+l/1r/8/5v/sT9Iv3k/PD85/y0/If8ovzy
+/AT90fy2/If8//uQ+5X7uPvH++T78/vK+5P7cvtH+wT7zfrF+gf7e/up+377afte+y77/Pr6+ib7
+VPtv+5X79fth/KX86fwm/R/98/zZ/Ln8t/wR/WD9KP3g/AL98/x8/HX89Pwx/VX92P1B/oX+9/4i
+/+L+4P4z/0b/AP/l/i//XP8Q/5v+Xf5d/oL+nv6W/rr+Rf/n/1sAhAB1AJIAvgC1ALsApgBrAGIA
+PADR/3//fP+b/5v/pP/b/+P/tP/b/0gAgACCAGAAEADT/9T/8v88AIgAQQCc/yb/3v4A/9P/owCL
+ALf//f7Z/if/ff+w/8X/9/9NABkARf/S/gP/U/8SADQBgQG0AOD/Zv/1/ub+w//QAOsAGAAS/3T+
+Vf6P/gr/lP/o/8f/NP+b/pH+Fv+f/wMAdwC/AIUA5/8n/5z+nP4x/9T/+P+//1T/lf7U/Z/99/2F
+/un+AP/L/kz+0v3Q/Rj+E/7O/cT97v38/RD+Kv4B/s391P0p/qD+tf5e/hD+8f0g/nn+b/4h/g7+
+9f2e/YT96v11/rD+jv56/p7+rP6p/uf+O/9m/1X/8P55/kP+Hv7M/ZP9sf3j/dL9tf23/aj9q/3r
+/UT+af5D/vv9of1b/XH9/P20/gf/8v7X/tD+t/7A/kn/5v8UAOP/TP98/i7+k/7j/tD+0v74/g//
+Rv+S/9H/IQCOABYBXwH0AEEABwAuAEAATABkADMA2//d/xUAJgAiAC8APQBtAOUAMQEaASYBTQEo
+AfAACgFeAcQBGwLDAb4AJQBXAJgAtwA3AcwBnwG1ANH/ev/E/1cAxQD5AA4BAwHDAE8A1f/M/0YA
+mwBrACsALgDt/6f/IgC6AOgAZAEvAk0CwwF8AaoB+gE3Aj8CGwLvAdkBqwFWASQBNQF0AdEBKgJC
+Ai8CdgI7Ax0EsATsBEsF1QX2BcQF5AUyBlMGbwZyBh8G6QViBisHpgcICH8IqQiRCKsI+QgiCSwJ
+Vgk+CZ0IFgj/B/QHygfRBzAIfghpCB0IAggQCNcHRweTBssFRgULBYgEygMhA7kCFwPvAxgEhQMU
+AwUD7QJ5Ag8CBwL+Ac8BqAE2AW4A9P/V/5X/Hv/D/o/+Gv5e/eD8rvxZ/PD7ofs9+6b6A/qe+ZD5
+s/nh+dL5dPlC+WT5YPkZ+fb4Hvld+Y/51PkU+uj5bPkJ+fD4I/l6+Zf5Q/lR+Rr6nPp8+l76kPre
++h77W/ul++X7QPzw/Jz9w/2t/e39Pf4o/gL+M/5m/kH+QP6X/s/++P5b/5L/mP8EAJUA4gBEAc4B
+JAJ1Au4CFQPjAtQCCAM8A0MDWAPOA1YEfgRNBLYDBQO+AsYC0gLVAuwCIwM+A/kCiAJGAiMCAALx
+AQ0CLgIMAssB2wFGAqoCnwK1AVoAlP9n/9v/CgHHAUYBawDp/17/E/+7/7IAagH9AcIBbgBG/2X/
+bgCmAYACawJoAVMAzv/F//H/DwBkAAQB9QCa/9j9wfyC/Ov8nP1I/s3+nv58/Ur8A/yd/E/9p/22
+/ZT9Wv3//HT87vul+4/7hfts+xn7Y/qJ+Sr5MvkB+fL4kPlD+o36lfpT+iL6u/qf+zX8rvy//D38
+p/tL+x77A/sC+xv7HfsP+xL7+Prp+kz77vuR/DL9mf2e/VP9Av3t/B79PP3l/Hb8Rvwf/Ar8Fvwx
+/Gb8kPyW/Kz8+Px3/Rz+qv7i/rX+Qf7k/cb9vv3h/V/+1v70/v/+/v7r/ur+8f5K/wgAgwB4AA0A
+g/9z/8P/6v8RAEIAIwDi/+r/EgAPADQAmQC5AKMAygD3AM8AhACCALYA0QDVAMEAmwCaAJEAXABw
+AOUAMQEjARoBLQE5AU0BOAHkAK8ApgByACkAEAAYABIA8f/J/7//6v8aAAAArv97/4n/1v9EAGIA
+AACr/5P/bv9o//f/uwDVAGoANQAsAC4AbQDHAAcBGAEEAfUA1QCVAIoAtQDTAPgAAwHzAC8BiQGl
+AbsB3QHAAYkBugE4AlYC8QF1AVoBrAHeAZMBGgHaABUBngHZAQIC5wIJBFUEUAQABd0FGAbbBb4F
+9wVwBuYG0AZOBh4GawbRBi8HqAc+CL4IzAiiCMQICAkrCV4JbwkeCc0IZAjAB4sH2wcpCHkI6gg/
+CU8JQglACTYJ6AhzCEQIIgixByQHYwaLBYAFEwZdBngGgwYbBmYFIAVPBUMF1ARLBCcEUwTcA9QC
+/wF2ARcBygBdAPb/6f+t/+T+JP6//Xb9DP2m/Hf8cPxX/BT8w/ti+yr7Q/sj+5v6IPrS+bD5qvls
++Qb50/jt+DL5Rvn9+Mb45vj6+N34B/mm+SL6/vm3+cX5zPm1+ef5Ovpr+rb6Kft4+4X7kvui+677
+Cvye/BX9T/1//f39ev6J/mT+g/4B/4L/wf/f/w8AeQAjAbQBCQJJAlECIwIHAkUCkQKEAnQCtwJA
+A8oDDAS8AxID1wIjA3oDwQPhAwkErwSXBRsGNAYIBpUFSAWWBRAGJwYfBhsG1gXFBUIGiQbOBd8E
+6QRVBV0FZQWPBW8F8ARtBAcEogNzA2ED3ALmARgBzgCrABUAIP9K/tj9nP38/NH73/qy+rD6Fvou
++aX4c/gW+J/3cPeM9wD4s/gK+cH4N/jg95L36vZz9nT2S/YH9v/1E/ZV9sT2F/cy9y33VPfl93X4
+o/ia+Jv4sPjQ+Pv49fin+Ij41vgn+Sf5/fgi+a35Pvq2+hH7IPsn+3b7j/sm+936IfuV+9z7HvyW
+/Pz8C/0c/YP96/3j/XL9Gf05/cD9U/6X/pj+d/5i/o3+xP7p/hX/TP+Q/+v/WQCFAGkAcwBpAOP/
+aP9v/6X/DgC2AAsB2ABaAN3/kf9I/w3/P//V/00AVwAaAO7/zP95/zj/Rf94/8H/4f+c/4D/xv/V
+/5n/Rf/k/rL+0v7i/r3+9f5H/xP/1f4L/z3/9v7B/gD/P/9M/1f/m/8IAFYAnQDyACMBMAEHAYUA
+AwAIAG4AywARAUQBPQHoALEA9gBYAZwBBgJxAq8C6QLkAosCaQLjAs0DgQRhBK8DOgMvA0gDjAMY
+BLEEswRABDQESQS2AwADBgNeA2wDmQP+A+8DXQMZA3sD+QNMBG4ESgQdBCIEKgTcA4kDxgNDBDQE
+pQMnA8gCfQKTAusCugIeAiwCpQKqAoECqQLWArQCpwITAzkDlgINAhcCDwLdAd4B8gHoAaMBQwFT
+AccBBwL2Af8BZwK/At4CDAMcA/0C4wLnAvkC9wLdArMCqwLXAukC7gI1A5oDyQMDBJwEQwWkBZQF
+NwUDBRgFWgWKBVkFAwXeBMwEgAQmBFQE2gQKBfMEGwVgBUIFxQQ1BOUDBgRVBHMELgTBA5sDqgOi
+A3sDJwOVAmMCxQLHAnwCugIJA+sCswKAAk4CQAJNAkICCALbAb4BSQHQACYBvwGOAQ4BDgEdAcQA
+XAAmAP//yv+T/2v/QP/K/jj+Cv7u/an9ov2i/V79Fv0G/Sr9U/1J/R39Dv0l/Tv9Of0n/Qb93vze
+/Ar9Gv3g/GL89fsb/Lj8Pv3L/Vj+CP4H/aX8Ff3W/dX+Vv/k/oT+uP7k/vr+Nv9g/6T/dAA4AboA
+Pv9S/rj+3v8nAVAC1AJtArABMgHqAOoAWAHZAQsCyQEVAU0Am//3/q7+JP8JAF0A5/9P/wP/6P6f
+/j/+E/4K/gj+9v2K/Z38vPua+/X7Mvwx/Oz7fvs0++/6gfpn+rj66/rn+rf6Yvol+sr5LPno+D35
+m/nW+ej5YPmS+Fr4gvhZ+BT4QPi1+Oz4zviB+Bj4Mfj4+Hz5gPlu+R/57vgZ+nH8kv0R/Ir53/gC
++3z9R/3w+sb5LfvY/Gb83/q7+g38Gf0Q/Z38X/xc/I/8o/wl/Iz75/sP/Wz9TPzH+kH6Ifup/NT9
++/0P/Qj8Dfy0/LL82fsJ+zn7qfwW/gz+Av2O/GH9pv5k/2v/+f7c/oj/QQA0AJT/Lv9G/2f/Kf+g
+/in+I/6N/iX/ef9d/3b/8v8xAAgA4v8SAHcACwGiAZMB1gDg/zn/Vv/y/3sAxQAVAaoBFwLGARAB
+4AB3AQsC7gGgAZMBgQF4AaoB3gHxAQoCIgIpAkgCaAJjAmwCcgJvAqkCyQJAApIBiQHWAewB+wEm
+AhYC8gFBApwCjgKAArcCKQO7AxME+QPMA6sDNQO7AuICnANIBIIEdARmBFsEEASMA04DpAM0BHkE
+cQS1BEIFUwXdBIcEhASeBKYEcgQeBOQDyQPRAx8EigSNBE4EZARXBLgDOgMWA/sCBwMrAysD6gJr
+AgkCCQJDAnsC3wJ1A88D6wPoA6wDRgP2Av8COQNYA3IDmQOUA5gD0wPfA6oDpwMuBOEEHAXPBGEE
+ZQTfBBkF2gSrBLYEkgReBIME9QRhBZIFuQUCBlgGowaoBl8GFwb9BRUGMgb7BYkFLAXjBLYEoARz
+BJsEOwVdBfwE1QTBBL8E9wT3BJIEDQSqA5UDjgMhA4YCEwK4AasB4QHwAf0BQQKGAsEC8wLbAnYC
+KAISAukBkwFZAUMB4gAkAIH/Jv/Z/n7+Uv5b/k7+QP5r/pv+of67/sj+av73/d/94v3C/Yj99PwT
+/JH7uPsf/Cz81/ui+5z7pfsb/Mj84vx7/FH8jvza/Pv86PzR/On8Nf2K/YL9IP0F/YP9Iv56/o/+
+RP6t/TP9Cv1e/Qv+mf7S/rz+iP5e/jL+K/57/uH+Gv87/1T/QP8C/9z+1v7b/vH+Ef8I/8L+cf4b
+/uD97P3w/dv99P0N/s/9e/2Q/bH9GP1p/Jf8AP3V/FX8Avzb+8P7zfur+0H7Dfs3+1X7EfvD+tX6
+9/rn+tv6pfry+U35VPnO+fX5vfnh+Rr6y/ls+Y/51fnA+aP53/kO+t75efkm+Q75Q/nE+SL6FPrJ
++WX5I/ko+U/5c/me+fj5Tfoc+oT5Hfka+Wf58fl6+qf6mPrd+kH7RPsw+0j7evv++9D8Ov3X/Df8
+zPvH+2D86PzF/E784PsV/Aj9rP3D/c/9u/2b/fn92P4i/3b+/v1a/hj/z/+AAK4A3/8O/0P/AQBc
+ABcAvP/s/5oAIwH8AF8AMwDeAKABpAE6ARgBVQHMATECDgJOAYwAUQBsAJsA2gA8AcwBdAIRAx0D
+EwJ9AHX/df8vAAoBtAHAAb0Aev8q/7//TQByAHYAuQCeAboCAQMuAsAA3P+hAE8CFAPEAlwCGQKZ
+ARgBXwFYAg8DBgPAAvoChgOPA+kCWQLMAhEEAgUGBYAEGQQOBBUE3QOkA9YDVQSVBFAE7gPWA94D
+3wMzBMgE8ATNBN0E+gTVBHIE9wNzA0gD2QO8BB4FwgQJBJAD0gNMBCQEzgMDBHwE1gQPBRwF+QSx
+BEAE/AMyBFEEKAQ5BEAE3wOvAxMEiwS8BNME7ATiBK0EuwQ5BaEFeQXjBDMEtgOpA8IDuQPLA/4D
+MAR6BJYEIwRtA/8C+wIeA1MDfANJA+wCuQKdApYCtQLgAiMDfgPPAyoEogQJBS8FAgW3BH4EGQS8
+AwUEmwSeBBgEoAM2A+wCEwNjA4EDVQM6A6EDGAQOBIsD5gKEAnsCrAIaA2QDCANnAhYCDgIOAucB
+jAFIAWYBxAEhAkMCBgKhAVUBMwErATIBLQH/AMQAmwBsAFUAjwDYANcAiwApALr/Qv/z/uf+//72
+/tD+mP4z/uD92/3a/az9dP1D/Wj96/0L/sn9wP2z/Xf9Uf06/Tn9bv2I/W/9Tv32/IH8dvzN/Pz8
+0PyW/HH8GPzB+w78gPxT/Bn8Q/xy/In8cPwZ/BD8fvzJ/K/8V/zq+5n7c/tn+1v7VfuN+wj8Wvwo
+/KH7Q/sp+yL7V/vX+zH8F/zx+0D8qfyj/Bn8U/v7+nP7Bvz9+5X79vo1+un5BPr6+f75Rfpm+lf6
+ePq6+qT67vly+TT6Rvst+1/6Hfp7+r76Vfqi+b75+Po7/Fr8cfti+tr5I/rP+jP7VvuJ+7v7m/so
++676UPou+kL6dfoG+wP83vwE/U/8OPuv+hj7wvvk+6L77vvu/Hj9wfxE+1j61Poe/Cj9rf37/Wb+
+o/49/kv9Kvy/+9f81/4+AOv/Jf7F/OP8p/3z/Y39bf27/oEAvgB6/0v+Hf64/oL/CAD8/4v/h/8s
+AJwAWAAJAM3/V/+W/+cAbQFNAGD/1//xAI0BcAFlAQcClgIAApkAzv+JADACTAMZAwMCEAHzAFEB
+ZwEkAfkASwHqAWcCvQLrAtkCWAIpAVkAtAGFBKYF7QNpAVcATQEjAzIE1wPCAlkC/gKAAxwDcQJT
+AgEDQgRxBYUFFgRqAjkCJwOJA2oDFAQcBdcEaQNPAhsCeQIsAwcEsQQIBUUFYQVvBP0Byv/w/xQC
+DQS2BF8EjwP5ArkCYQJJAu4C4QOPBD0F1gVUBY4D+QH+AR8DsgNqA2ID7AOYBBQFwARYAwcCLwK1
+Ay8FiwUWBaUEKAR9A0wDpgPfA+QDQQT8BFYF3ATzAywD4gJ9A2YEpwSyBAUFGwWdBN0DSwNTAywE
+FgU/Bc4EJARwA+QCqAKbAnkChwJDA0sEXwT3AlYB9QDRAf4C1wMUBH4DcAKkAUkBGwHnAN4AWAH/
+AQsCdAHfAFwA1v+//yYAqABRAesBwQEnAc0ArwDUADcBigHIAfQBggEmAKX+MP4I/zEADwGEAUUB
+oAAlAPb/LQDYAJQB8wH6AcMBPgGJAAkAMADxAJcBbAGQAPX/IAChAOoA/gASARsBFQEzAXMBewHw
+AAAAZP9o/3r/Rv9I/9X/iwC9AB4ATv8R/zf/Hf+w/i/++/2L/lv/Kf+3/Q38Y/tA/LH9TP5A/on+
+3P5T/un8hftp++z8Hf+7AKwA0v64/AX86Pwe/kH+of14/b/9Uv2/+8f5xvjJ+Tz8T/7Q/sn98Pv7
++bv4TPme+6f9w/2w/Pv7n/u7+qb5f/lf+pf7r/zw/PX7kvrG+dD5evoO+7b69fly+jD8E/0B/GD6
+5/ni+lH8p/ye+8P6Ffu7+837d/tV+677EvzT+w77BPtD/Pj8bfsm+dD4evqa/B3+RP5H/TP8iPtO
++9T7Nf2j/i7/wv4A/nL9Pf03/Sj9Mv13/dz9Of6r/lH/mP/L/g/9pfsB/FH+0gBQAcz/bv72/q0A
+FgFI/2z90P0AAIQB4AA7/3P+g/5Z/vX9xv2e/ZX9Hf4H/5b/Uv9b/mD9Tf09/uv+v/7C/jr/Mf+9
+/t3+W/+d//v/LACk//7+4/7D/vH9jv3W/o0A2gCv/1L+/v34/iYAQwDI/38A6gIKBSUEMAAN/XX+
+7QJFBUED4f/N/i8A0AEYAjgBewDxALICVAT2A6MBNP+X/pUAvgM9BQcEHgK/Ac4CdwPfAmQCVAOH
+BBQEfwK3AbcB8gCn/8v/bQIyBpwHvgSVAPr/IAOKBcMESQMyBP4GLghaBZoAhf6PAL4DZAXvBSkG
+LAXaAg4BHAGaAmcEdgWABVwFOQUaBAICWwBoACoCeQS0BfQEYAOpAoQCKQIWAtcC/gPcBBQFewRC
+A8ABagASAP8AagKDA8kD1wIwAVYAAAEAAvMBUgHYAYwDTgQUA3EBTwE5AugB+v/a/lwAVwPXBGkD
+fgDQ/rz/wwHEAtUCTANXBLoEhgNLAZ7/tv9dAUQDEARfA8sBmgCuAEMBJwHOAJQBggPLBLgD4gCh
+/qT+IQALARcBkwFyAjkCYQA0/vX9aQDqAn4CJgAR/1wA+wFXAUL/rP5AAC0CkwIyAZf/qP9GASkC
+6wAj/1P/RQEkApEA0/6T/wEC6QK3AKH9EP0k/yABaAFuAEr/0P43/8P/ef+p/mr+Kf9cAPQAUQCw
+/kL9Sv04/oz+TP6d/rH/KwDv/qr8EPtZ+2/91P+KAPz+3Pzm+wT8dvxe/cn+JP/j/Un9bP5v/7f+
+8/ww/Mj9ZADWAG7+MvyR/C3+Of6q/AL8xPw2/X394f4WAAH/jPy6+3f9Vf86/yn+G/5Q/8D/gP2G
++rP6Y/7sAbQBOv5q+/n7n/7Q/zX+W/wT/cD/NgGo/+j8DPw1/S3+iP71/qL+df3o/Bb98Pyr/FX9
+8P78//7+qPxx+738Lf8EAGb+hfzD/Gj+sP4Z/fT7X/xc/Rv+nv7t/pP+Jv22+/b76/3X/8z/+P3m
+/BH+cf9D/tD71ftZ/rz/rf58/YX97f2J/tT/ywBkAMj/CAASAP/+1v0t/oz/2P9D/jf8Y/xs/xoC
+jwG//gn94f5KAkkCT/4g/Of+LwKYAbP+0vyQ/L783f3FAAID/AEZ/3v9Hv5P/7D/6/+hADgBIwF4
+AL//k//t/4kAxwGpA4YECQOkALP/pgDaAbYB4gAdASEC4AFPAJP/VwCjAZMCCQNUAzgDVwIAAQcA
+8/+HAGQBFQL8ATwB2QAsAYEBSgH/AI0BoQLLAnMBxP+w/3QBugKWAS//mv74AEYD9QGj/pD+pgKj
+BacDfv84/kgANAIrAlQBLgHPAQMCRAGYANwAbQFtAWwBSQJ+A7ADTQKNACUAIwGJAqsD/QM+A70B
+bADCAN0CJQRTAmr/lv8MAzQFMQMHANz/BALkAp8BlAAZAS8CogI6Ah0BFADBAAsDEQTRAXj+mf7v
+AiQGEwR8/9j9XADUAqQBA/8T/5EB6QLGAWkAQQAyAMj/NwD8ASsDBwI6AIoAmQJ0AwQCKQDm/4oB
+XgM0Ay0BkP8dAPsBfAK4AOP+av+2AX8CjQDj/sr/jAGSATkAJACtAQ4CJQCi/jMARAO7A6oAjv2z
+/QMADAHD/0/+Ef+WAfMC1AC6/Hz7fP4sAWQAxP78/yED0gN4AKf8VfzP/l4ACQAcAEYBYAFF/5/8
+tfsS/SL/HgBnAL4BgwPTAor/VP2y/kUBagFv/4D+IgAyArkBxv4U/Or7HP5nANoALQAfAI8AIwDi
+/lf+tf6N/gf+if/6AuED5v9h+9f7GAAZApr/9/yp/jsCAgIG/iT7uftF/rQAUQGT/8n9Zv5QAGAA
++/2j/Eb+8/9X/zL+Yv65/vn9Qv3M/Z7+C/7I/PD8E/4W/rz8q/t2/Mn+0wDqAOf+5fzx/LD+9f91
+/3z+fP4B/1L/af+R/mn8Kvvq/BYAngGAAB7+ZvwZ/Kf8s/1q/5oAWv/c/KP8xv6J/2v9dfsv/Dv+
+4/+mAHD/evwR+0T9eQBIAeH/pv6C/uD+Sf9t/2v/of/8/w8AUP+r/Yb8Sv2O/94BgwLMACP/k//7
+/+H+f/7b/ywBlgEsAZ//IP4u/k7/dwB+APn+Pv7G//kA7P+2/mL/zQBnAeIAb/8g/nb+/f+MAPb/
+AgBxAbwCcgFB/tz8yv67AfkCYQJcAWkALf9c/m7/jgEqAgsB3/80/yv/GgAkATkB+gBWAcMBCwGj
+/47/tACzAGT/AP/X/zMA4v9HAI4BUgKJAc//+v7Z/68BxwNBBckEvAJHAX4BSgLxAUwAE//G//AB
+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
+cAGVApkC4gBP/z7/BACDAIEA8AC+AuIE6gQwAkj/EP9TARoDOAL9/2P//QBPAq4BjgBjALoA/QAl
+AYkBFwKoAQMASP/7AC4DIwMgAUX/6P4GAEMBTAGkAJQALwG3AbEB6wAdAFEAUgEkAjUCgQExAPn+
+jf7M/mL/AABRAGUAjACOAK7/Y/5M/gsAkALOA24Ckf8t/m3/HwHHAIz+yvxB/TT/hgDZ/679LPw/
+/aoA1gMABB8BDv6V/ab/3gFgAmABMwB//zL/Af8y/gb9EP2y/mcA/gCTAL3/9f6L/qH+Y/+bAC8B
+ggBA/6L+Yv9SAEr/yPwv/KP+7wAOACH9Svs2/FH/jgFtAA/+Cf6b/7z/Sf5C/fX94P/dAA8A9v6J
+/gr+Tf1q/ZD+e/9k/7b+/P3V/Yf+h/4I/VX8sf0b/0v/E//d/pT+tf4A/4X++P2u/g4AnADp/4H+
+gf0E/g3/cv61/Fb80v2b/3sA///Q/nX+LP/j//7/c//G/u7+KgB1AVQBlP9f/Tz8Yv2w/zoA0v4f
+/iL/ZABFAGP+sfxe/T3/vv/F/hL+fv58/9v/l/4V/ZX9O//i/4D/Gf8R/y//Rv9B/yj/W//H/5X/
+6v4e/wgANgBi/67+Uv8mAekBNwCo/rv/ywE4AgIB/f+RADQCnQILAa3/HQAWAdQAef9s/vr+3wAU
+Ap4BAgHaAPn/6/45/0YAwgCaAPb/+f55/rb+wv47/tz9Uf5F/9b/rP8v/wv/iv8nABMAaf8u/wMA
+GgEKAdT/6/5D/0oAFwExAasAQABkAJwAiwCXANgA5QD/AIMB9QHXASsBdgDnAKsCvAOYAsQAdQB6
+AT8CHQK+AQoC5wIsA0IC9AAdAPz/rADvAYYCZgGR/0T/2AA6As4B6/+H/mX/wQEzA4cCqgB9/zkA
++gGwAsMBZACo/67/PwCwAHYAWQD2AFEB7AAPATACAgNsAgMBiAAIAgsEkQN+AJH+/P9dArICKgG2
+/4v/rQDJAagBLgGSAWQCsgKDAksCHALAAQsBNwDq/4cATQE0AZIAIgDS/97/4AAsAnMCmwGuAMgA
+mwHQATcBZgAHADkAsv+Z/vn+lwBpAScBtQAoAHX/DP8k/4r/NAAXAcgBQQLTAgsDGgJpAD3/L/9B
+APgB5ALnAez/x/4h/0UA5ABGADf/LP94AHsBsQAo//r+awDCAYcB6v8x/pv9LP7m/oX/HABKAEAA
+LAAt/0f9bPyg/df/oQHYAUUAOf5J/ZX9OP4B/xwAAQEPAU0ATf+O/lj+yP6u/7gAXwHqAEn/YP1h
+/AL9nv6N/07/1/6i/mb+Ff5B/mr/AAF2ASgARf5w/Tr+1f+WALT/tP7E/tL+5P0S/c/9XP/3/xb/
+x/2y/Qz/HwCH/xv+1P1W/2gB/wEyAH39T/xA/ef+BwBWAM//3v6F/sT+Vv6M/Jz6APtu/nkBjgAs
+/XX7nvx3/tz+DP60/VL+tf4G/hz9UP17/hT/rf5p/o7+NP46/bD8bf3q/rP/Kv9l/kL+Tv4C/nP9
+av1o/sb/mgBEAMr+av1t/c/+ogB4AXMA4v64/sP/dQAeAD3/2f6H/3wAgQCD/0D+q/04/h//tv8y
+AFMArP8I/0T/5P8SAK//kP+VAN8BpwHj/1L+EP6T/gr/N/81/yT/3P5E/tL9Of5p/6EAVgFkAfsA
+SQCi/8r//wAyAgsCsgCY/3r/2P/Y/2n/Yv9jAMUBMAIuAaH/Cf8LALABZwLLAfQAwADqAM0ABwA9
+/4n/sQCPAcIBowFUAc8AaAB5ACEBDQIxAhMBAAAGAD4A0/9l////jAFFAtoA7v4D/8YA4AFhAaYA
+FAEfAlsCRwG9/3r/9QBhAkACJAGJAPUAeAFnAVQB3gGoArUC+QFgAUUBigH0AdIBKgFKAZkCtgMQ
+A8oAKv8GAKUCXQS4AwsCKAFaAcYBpQEYAcYA5ABVAdkBDwIAAqwBrgCx/zgA+QHxAmECXwEUAWIB
+RAGfAHUAXAGYAtUCCwKQAT0C/AI1AmAAs/9TAYEDpAOlAbH/hf/WABsCPAKeAWQBnAFxAcMAjgBz
+AVEC4gGzAHEAgAFKAoMB4/9E/1UAzgFAAqIBjAB4/93+M/+VACwCcAL3AHD/q/8WAXkBNQBQ/xUA
+ZQGQAf3/G/4q/gQAYgEHAXD/UP4g/+QAcwFTAPb+0f4fAH4BYQEeACX/YP9xAAEBdgBW/5T+B/9N
+AAUBmwC4/xn/RP/0/ywAqv9s/yYA6QBvAO7+Rf5f/+cAXwF4AAv/Wv77/hEAeAAfAFf/f/44/s3+
+2f9eALP/jP4m/tv+3v/x/+/+5/2B/dj9V/74/SL9Gf3l/W/+BP5a/Yf9ef4N/7H+Sv6D/sP+ff7U
+/TT96vwI/XT90v3t/dv9vv3F/Sr+zP4f//j+5v5U/+P/5/9m/+3+w/7P/rf+cv5G/ir+Jv5P/lb+
+Iv4v/uX+0v8cAIz/wv6E/rL+pf53/tD+YP8e/xf+K/34/Kb9Qv7j/Wn9sv1W/gv/uf/F/8/+Uf1z
+/Fr9Uf8yADL/T/0x/Dv96f+nAcAAXv5I/cP+9wBJAaf/hP6I/4gBBwJDAAP+R/2W/qsAmgH1ANH/
+Iv8//9H/OABhALAACwH/AGQAUv9s/nr+N/+q/y7/a/6u/sH/bQD+/+f+gP5o/9gAfAG3ADn/Rv7F
+/tj/2f/9/n3+j/7e/ln/nP9a/xj/Vf8gABMBTQFrAFf/Tv9DADcBbwH5ACcAY/8o/zD/Av/H/sz+
+QP/4/5YAywCMAD8ALABZAIEAXwBjAMkA8QCYAFAAqgBeAX4BrgC5/6//jgAuAdoAWgCsAH0BwQEm
+AS8AsP8UAMgA6wCiAJIAlACRAMcA1wDAAAcBMgHRALMAFAF7Aa4BUAGNAEAAyACEAb0BUwGWADwA
+qgBnAbsBhgF7AeIBIQIcAiQCIgINAvoB/gFMAqcCuwKKAgQCWQH2APwAQwGWAb8BmQFAAQoBSQG6
+AQUCEALjAeAB7AG4AZcBvQEFAnMC4QILA8ICGQKpAYkBbwGDAaoBtAH8AUIC0QEqAdwAmQCSAOkA
+IwEFAaYAXwCJAPIA+gCCACgAFwAkAGUArwCAABoAYABPAe0BmAHMAF0AkwDoALMATQB8ADEByQGg
+Ad8AaQCFAPIAWgGYAbQBdgEYASYBiQGcAeMAv/8a/1f/5P/w/2T/1f79/s7/cQB9AOL/8/6h/p//
+XwHdAVQAuv6P/n7/NQCZ/2f+9f1v/mH/CwDJ/+3+q/6L/4wArwApALn/t//1/yMA8/9h/zX/xf8Q
+AGj/Nf5m/cT9B//d/3n/3f4s/97/EwDF/2X/J//J/nX+1P6Z/7D/Hv/W/h//gP+0/4b/3v5//v3+
+mv+D/+z+d/6h/j//pf+J/+r+PP42/tb+YP85/4/+9P3P/T3+1v4T/9f+Sv7w/Uf+xf5s/rL91/2l
+/g//3f48/lf93/xT/RH+Rv4H/tH9qv2J/Zv98f1X/mb+Df62/d39b/7K/qf+Sf4R/jL+iP7W/uj+
+rP5U/hb+/f0h/qz+Tv9V/7j+M/4b/jD+Yf6q/u/+If/+/lH+1v1h/h//1/73/af9Z/6L/7r/k/5L
+/XD9Qf/RAAcA8f1A/TL++P7W/oT+dP6T/gX/zv9SABwAnP+b/zoAwACuAF0ANAA3AEMABwBy/wz/
+W/8XAIoAUADG/4b/xP9zACUBFQGCABUA4f8EAHIAxgDkAOQA4QD0AB0BQgFHAekATwAaAEYAKgC1
+/5n/AAAsAN7/jf+R/wAAqQAMAR8BGgHqAOoAbQHJATYBGABV/0f/6/+mAMwAaAAcAGUAFgGpAdEB
+pgFFAc4AbgBgAOkAkQGXATcBRQHbAXQChwLhARMBJwE6AgUDrwItAnACCgNMA/UCTAINAl0CcQIE
+ArMB4wFRAm4C6wErAeQAOAGUAYsBjgHwASgCNgJSAhECiAH8AH0AQwBWAJkArQBiADAAjAAAAc4A
+YACvALQBeQJeAgsCTgLYAvkCjwL1AbIB/QE+AtIBHQHiABsBRgEoAfUA+AA8AZEBtAGuAc8BBwL8
+AaQBOwHrAKUAdQCEAIYAewDNACgB7gArAMn/VAAiAWEB9wAwAIH/kf9nANMA+//m/vP+7f+/AMUA
+JACJ/4T/AwC0AAABYQCC/07/gv+i/8H/tP/7/tP9I/1f/Rb+lv60/qj+3v5e/67/pv9u/zr/I/8Y
+/xD/Ff8n/w//pv4T/oX9NP12/Vr+Sf+H/0H/Iv9i/9H/CgDU/1r/+P7L/qn+j/6r/uP+L//Q/1wA
+CADg/gP+If7t/tn/AQAw/z7+3v0+/t/+6v5K/t39Of7U/hz/Hv+4/g/+1v1T/vj+Av98/gT+5/06
+/sL+7P64/rP+8/4N/9z+rv5y/hP+Ef6L/ij/jv9p/7/+N/5F/pP+3P5H/8j/3v+r//f/lADEAHgA
+CACN/x//CP80/zz/AP+j/lL+UP6X/pv+Ef6e/eD9YP6q/hn/rP8AAAcAv/+A/5z/pv9u/3j/uP+Q
+/9r+9P1X/Sz9h/1P/tT+5/4Y/4b/1P/s//n/DgAKAPz/KABkAEAAtv83/+T+pf7Y/oz/CQDY/3X/
+mP8kALAAGwEmAcYAWQA2AHQA3QA1AUkB6gBgADMAbADoAJoBxAHvAIUAjAF+AhwCMQG5AMQABwFh
+AckBAQK4AUUBTQGEAaYB5gHqAYIBGwEPAVYBnwHJAcIBdgEPAdQAywC0AJIAtwA0AdcBMQL4AX0B
+FgHnAB0BkgHgAeUBnwEWAZUAdgC9ABsBQwEwASEBXwHsASACigHEAHwA6wCiAaMB7QCLAM0A+gC3
+AGAAGADx/xAAAACR/4r/KgC8AJ4A0v/8/vv+6/8NAZsBTQFjAH3/LP9l/7v/7v8TAFQAuwA0AUIB
+ZwBU/0v/GgD+AKEBhAHiAI8AuQD3ANEATgD//0UA2AAbAdQAQADf/+v/KABAABgA8//6/xkAUQBd
+ACcAEABDAGoAUgBwAK0AWADH/+r/jwDRAH0A+P/x/48A6wCPAPL/pP/0/2kAkQCoALAAhwBTAEAA
+HACg/1z//P/+AGMB4QAqAAQAcwD8ABUBjAAbAGsACgE+AfAAdgAlAE0AqQC4AIEAGQDG/wYAmgDN
+AKAAZAA9AFEAoAC/AHgAQgBrAM4AFwEEAaAAFAB7/xT/Gf9c/6r/0/9T/4L+Zv7x/lD/OP/r/sz+
+L//W/y0APgASAKr/ZP8Z/5D+Of5g/tP+FP/b/l/+Af4F/jb+BP6D/aH9pP5u/wn/0f3I/LD8lv2Y
+/pz+wv00/X39L/6F/k7+Bf74/T/+m/6u/nr+MP4w/tL+mP+A/2j+Z/1V/db9JP7+/dL91v27/Wn9
+R/0p/YX8QvwR/fb9M/6J/UX81Pu+/N/9G/5D/Q78j/sT/Pv8wf1W/oT+Mf4B/m/+9P7v/qz+zf6A
+/0AAfAA4ALL/Mv/J/kT+8f1Q/jf/5P/L/0z/Lf91/53/eP8k//H+R//0/1IASQALAJL/K/9N/6z/
+6P8AAPf/KQDKAHUB4wHHAS8BzAC9AH8AdAA+AQIC3AEhAV0AAwBNAAMBlAGAARQBEAGcASUC6AHL
+AL//n/9XACIBJwFWAIv/kP81ALsArgArANP/KQDhAEABNAFFAWoBZwFsAX0BggGIAYMBUAEVASoB
+dQGfAbcBvwGIAVkBegHJATECigKfAo4CiwKPAlYC0AFtAWkBewGgAQMCPAI7AmMCbAIQAr8B7QGJ
+AgID3AJWAg8CQgKAAmMCBgKtAb0BXAK9Am0CQQKYAssCkAJZAqECHQMPA3UCGgJSAp4C2AIDA/4C
+GwNxA6QDmANsA2sDogOXA0IDPQOfAwcEKQTrA5YDVAMbAxMDQwOBA8QD/wMaBOQDVgPKAmQCHALu
+AdwBvQFvATEB/QD2AF4BvQHAAdIBAALtAZcBNQEIARwBNAHbADgA+v/j/3v//P7E/tv++/7//uv+
+tP6d/un+Lv8J/+3+R/+Y/zn/l/5J/gj+lP0V/cf83Pww/Xz9k/1k/SP9Hf1Q/av9Jv6V/tP+1P6Z
+/hr+fP0C/d/8Fv08/f/8iPxb/JD84PxN/Wf9/Pzr/Ef9gv2S/S/9S/ze+1j8HP10/eP80fuE+xb8
+GPw9++z6kvsI/LT7Qvti++f7LPzd+1D7Vfvx+yz8wvtz+837ePyU/CX8Qfwu/bX96fym+5r7DP1N
+/tj9Wfzp+1L9wf4t/lj8pPvF/FL+cP74/MX7Ifw+/av9K/2B/Hf8OP1W/ij/0f5x/aD8N/1g/rb+
+u/3X/HX9nP6a/oP9x/x8/ff+Mv+0/XP8HP0h/6QAcwDd/mD9bv3n/iAAAgBK/yb/qf8NANr/P/+6
+/pj+8/58/6z/hf9x/4j/Xf/2/uL+D/8V//3+FP9k/57/lP9l/z//H//P/nb+vP7//2AB0gGzAdcB
+bAIaA2EDDgPSAmUD5wObA0QDQANDAx4DAwNpAxUEhgToBEkFewWjBfgFbQbOBhAHMwciBwkHGwdi
+B4UHOQcDB2gHBQhLCIAInQgyCL0H2AcPCMQHawebB7kHcgdVB0MHCgcXB0EHCQfLBu0G9wazBqgG
+uAZYBsEFhAWqBZ4FBAVsBF0EbAQPBIMDBANIAqIBkwFrAcUAPADI/zX/DP9r/wkAmgCLAP7/mv9P
+/7n+I/7e/W39uvxq/Fr80fsF+9z6XPvJ+9n7u/vE+xf8OvzZ+3X7SPsT++b60vrA+sX64frK+m/6
+WfrC+g/74fq/+iP7pvvo+/r76/vS+9P76vsU/Ej8P/wW/HH8Qf2e/Ub9+fwO/Un91f1u/pj+4f6M
+/9P/ov+T/6X/oP9w/zn/X//s/1oAfwChALsAxgD2AGgB3QH0AS8CJwMmBHYEUQQvBEMERwQqBEUE
+mwTcBMgEagTyA2MD6QKuAogCjwLWAuwCnQJPAiQCAQIxAogCVAKTAd8AxwCBAasCagMXA/YBwwA4
+AHIAAQFhAfIALwAaAEoARAAtANz/iv/g/6oAFAHoAHsALwAnAAMAgf8e/0v/gv8l/4f+Tv5w/nz+
+PP57/Uf8hPvd+778Xf16/R395PwV/fP8ZPw0/Kb8S/2n/X/9IP1F/QD+WP6a/Wf82vsg/Hn8h/yJ
+/Jf8c/w2/JL8ef2o/Y/8cvu9+1H9wf7b/vj9L/0E/VD9f/0H/XD8rfym/WD+D/6k/Aj7z/pP/LX9
+Lv05+4D6XvyI/jX+8vtc+o763PtC/Q/+RP5Z/pH+xP7S/oX+j/2r/BD9a/7o/rz9ePzW/LD+/P/w
+/qD8sPvh/EX+Dv4U/d78af3Z/eX9cv7L/18ABf/0/GT83P1y/wX/I/1n/Mf9Y/8V/xX9yfsR/dT/
+AAGJ/9L9BP4z/8X/YP+f/q/+pv8QAIX/AP8E/yz/CP/j/l7/WADUAB4A6f7K/un/xgCIAJr/8/4t
+/4j/Xv+G/2cA8gBnAEv/oP4K/xcAqABfAB0AfwDdAKEAJgAKAK0A0AGdAtcC/wIZA94CpwLuArcD
+gASzBEcE3AMLBLQEcQUwBn4G8wVnBYkFyAXKBbkFhAVXBXQFzgUdBiQG/AUlBvoG1QcTCP4HBQgH
+CLQHPQcSB1wHyQevB+EG/AWsBRcGpAbCBtwGdwdbCOkIywhBCPEHKAg8CLAHDAe1BnoGMga/BR4F
+ewQqBDUEEASHAzsDpAM+BCYEiAMbA9wCfgLxAVUB0wDTAGcBqAEhAUsAiP8e/xz/Gf8N/x///P6P
+/h7+tv14/Wv9Xv0y/e/82vwF/fD8bvwe/FP8gvwv/Jf7Ffvo+ij7i/vM++D78fsM/B/8B/y/+7r7
+7PvJ+3L7b/vG+yP8Qvwh/Bb8T/yZ/NL89/wy/bb9N/5q/nf+Pv7Y/ev9Tv5q/nr+rf7L/vb+I//y
+/q/+3f5N/7n/+P8OAD8AZgBoAIwAvgDcAAMBKgFEAWABigGTAUgBHgF/Af0BJQIuAmICjwKAAosC
+twKaAlkCQAIwAvUBtwHMARMCHQLNAWMBSwHCAZUCJAOpAl8BlgDpAO8BBANmA6cCWgG7AAUBagGL
+AVgB1wByAH4AyACvAPP/VP92/+D/AQDy/9//9P8QALv///55/pX+Ff/3/qj9Lvz6+/D8mf0d/SX8
+nfvP+3j89/zQ/Gj8oPw2/RD9Mvyk+/T7qvzV/Cv8i/vg+938Xf3J/Lj7M/uI+yH8gPy5/AL9QP1L
+/WP9zv1T/h/+tvz++nb6oPtR/ZD9CPzv+uX7ev07/U77cfrN+4H93v05/aL8UvyZ+0j6hfk5+r37
+e/zS+4z7S/0+/6r+MPzq+vT7Vf0u/QL8j/vZ/A7/7v+8/jv9yvxN/Rb+Sv6m/TX9/P0k/4n/gf9L
+/0T+cvxe+6H8av/cAGz///zS/Aj/dgA+/1n9k/2u/xgBRwCB/uH9uP63/8//Nf+d/nL+8f4OAOwA
+hgBd/67+Hf9/AIkBBgGt/17/zwBHArgBjf8j/uL+kwAVARkAVf/R/6cAmgCi/7/+uf6H/5kAFgHi
+AIUAKgD9//X/0v/T/2IARwHaAZkBxQBIAE8ANQDP/5b/HAA3AQICMQIwAkQCbQKkAt4CGANjA6cD
+qQNZA/8C2QIMA7sDXQQ9BM0DBQSqBBAFEwWIBBsEpQRjBVwF5QSnBPIEwAVSBhwGvwXjBTwGfga5
+BqkGTQYiBlMGigZZBvQF6gU/Bq0G/AYFBwAHGgc4B2YHmQd6BxcH+QYmBx0HxgZkBvwFgwU+BVYF
+YQUmBR4FkwURBioG4AV5BSoF0gQvBEMDeAIOAuMBwgGoAYoBPQHXAJwAhQBcAGUAyQDsAJ0AegB9
+ABoATP9h/sn9kf0d/YL8T/xU/Ff8afyU/Mv82/zQ/P78Cf2d/FP8i/zU/MP8T/za+8z78fvU+4j7
+XftT+4T7Cfx//IP8YPyv/Dn9Xv1E/UH9c/3k/T/+bf6c/or+Ef7L/Rr+jf6//rv+1/4e/yv/Ov+T
+/4r/A//Q/g//Qf9D/zj/Pv9l/4f/ff9z/33/ZP9o/8z/JwBDAFsAhQCPAGIAHgDW/8z/TgDMALMA
+hQCHAHYAbQCJAK0AxwACAXUB0AH4ARsCRAJKAtsB+QBjAIgAMgFJAloDXANBAlMBQwGtASwCfAJc
+AtwBcQFwAYcBMQGEAPr/mf+J/xwAqwCEAOX/Df8m/tn9fv5k/6j/+/7S/Wr9N/7y/pL+fv2m/Hj8
+5vyz/WL+pf6+/rn+A/7N/EL8pfxi/dn9df22/N/84v0n/p38nPqu+gn9NP8T/yP9qPv5+3L9lf5R
+/gb9Kfww/FP8b/wn/eb9Cf0R+3f6/fsa/sb+8vwa+nD5zfts/uj+lf0c/N77bfxK/Cb79vkY+gv8
+nv13/DD6+fkh/On98vxx+r35RPzL/yAA+/u/94D49/yA//L9VPvi+lz8VP2Z/KH7E/yT/bP+f/5u
+/cT8Bf2V/Z/9Cf2W/Cr9nf6b/8/+qvy1+4j9OwCUAJL+mf1q/9MBkgFf/q77g/zG/5YBFADX/QH+
+4v9cAEn+HvyW/N/+RgBDAOT/sP/I/9j/rP+Y/6z/1P84ANcATgEYAT8Acv/8/un+FP8R/1P/rwB/
+AhsD9AE2AJz/iwCBASIBRQB0AJQBZwIJAqUAgP+2/8UATQEMAd0AgQHGArUDvQM6A/ICGgM2Ax0D
+IgNxAw4EzQQPBYQEhgPAAugCCQT7BPUEqwSNBHkEcARhBIUE8wQ/BSsFBwURBSYFWQWJBS4FuwQb
+BQ8GmQZmBkQGtgY4B0IH+AbFBvEGWgeJB18HOAdWB5wHzgeyB2MHcgfhB+EHIwdaBhUGMgZDBg8G
+uAVnBTgFOAUqBdkElQSDBHEEWwRVBHgEzgQMBa4E2QMxA/YC0QJoAhMCGAIFAqoBRgHHAEAAKABf
+AFkADACz/4T/l/+I/yH/0f7g/vj+3P7F/pz+Hv6j/Zz9yv28/Vf90fyf/Pb8dv2d/ZT9p/2m/ZX9
+pP3H/eX9+P3e/a79qP2W/XD9mv3k/e795/3p/ef99/0J/hH+Jf4r/jL+X/5d/gn+vP3T/Tb+cf5G
+/tj90f1p/gD/L/8L/+3+J/+N/67/a/+p/sD9pv1n/hf/UP9N/0v/S/8u/9b+Vv4u/rv+lP8BAOv/
+t/+0/+b/EwAMAM7/m//b/2gAqAB+AD0ACwDb/83/IACHAJYASQAAABgAZgCFAJsA4AD8APYANgGq
+AdkBcQHdAMkABAEVAQcB2gCMAGkARgDV/7D/+f+t/9b+N/4Z/qz+TP80/67+P/4b/nT+8f62/sT9
+5fz1/Ar+3v5+/mD9nvzz/NH9tf2B/AH8Dv1e/lX+0vyM+0n8Nf5w/kH8vvpO/CP/tP/9/L/5hvmj
+/OD/DwBL/Yj6Uvpb/Dv++/0K/EP6bvlg+Wr6iPz9/RH9pvpS+XX6yfzH/cD8ePst+3T7Ovxe/Tj9
+G/sj+WX5Svuf/Ef89/rG+XX5nfrN/CL+e/2d+7T5J/kp+3L+m/9a/R76uvjb+Wz8g/6O/uP8fPvU
++4X9OP8/ACwAWf7n+yr89f/BAsUApPwu+x39e//s/77+4f2m/g4A9P9Y/nX9Xf6O/4D/L/84AOUB
+AwIBABD+bf48ACABkACM/1b/SgAZAbEAJACvAJQBqwHZANL/+v/+AdUDNAN1ATMB/gHwARoB3QCc
+AX4CxQKEAjkCLgIdArABNQElAYkBPALqAvYCOwJDAYcAeABHAQgC3gFvAZ4BQwLHAs8CQwKcAaUB
+TQL0AmgD2QNQBEUEUAMfAiMCWAMvBD8ELAT6A9wDZwT2BL0EdQSMBKAE3QRQBbQF6AWzBTQF9wQa
+BRoF8wTzBNkEygRBBeEFAgbmBSoGlwa+BpcGPAbzBeEF7QXjBcgFLQYBByYHbwYCBooGXQeXBzcH
+3wYLB1sHIAdhBvEFQgaJBhgGeAVoBZYFWQXCBCMEwAOoA5MDXwM0A/MCogKGAjsCoAF1AZ0BkwG0
+AQcCAQKYAS8B9QDRAIYA8f+W/9z/LgAXAN7/yf+h/0X/Ev8q/zn/Pf9f/3v/XP8B/47+OP4s/kv+
+bP6w/vD+xP6M/qD+Y/6l/ef8xfx8/WP+3/4H/xj/Fv/A/jL+6P24/VH9Af0Y/YH92P25/V/9aP2j
+/aH9k/3L/Wz+Jv9H/47+o/1X/aT95P2G/av8Rvzs/L79vf1e/X39LP71/kj/0P5A/nr+zP5U/qz9
+5f3F/v/+cf4F/gv+K/7+/bX9w/0C/mL+u/6n/m3+Uv4z/g7+EP5N/qv+B/8k/+P+aP4B/iz+3f5R
+/yf/jf71/Qf+xf50/5r/eP96/3j/K/+z/qH+9v7w/pj+Wv5k/hP/9v/c/+n+U/6H/jP/s/87/xf+
+kf3Z/Sn+Sv4m/r/9h/2o/bX9S/0C/XD94v2u/Rn95/zc/Uj/Of94/SP8tPwa/m/+av1z/Pz8jv7u
+/kX9+vs8/Tr/B/8S/VX8EP4LALT/kv1c/On8uf3j/dP9GP5T/oz98/tW+3/8U/0e/Hb61Poh/dP+
+Fv6Q+375tPmD+8r87/ye/ED8V/wY/XT9TPyQ+jj6Yftx/HT8NPzk/B/+Tf6k/I76SfoC/Af+3P4B
+/nb8u/sQ/Lr8Vv3G/Wb9TPz8+2X9EP8F/+v9h/22/Zv9lP1m/ub//gC0ACj/0P3m/bH++v5O/7UA
+8gECAdf+4f1t/jv/j/+a/ygAtgEYA3wCSgAT/xcAtAHJAZwAEQCTALcAvf+5/uD+HABJAVkB5ABr
+ARcDBgQGA6MB1AFoA9gE+ASoA7wBXgA8AAcBCQK/Av8CywI5AvMBeQIDA94CrwJAA30EbQXUBNUC
+SgFtAW8CAQO/AlcCpAJVA2gDywIkAgkCogJeA2sDygJrAq4CFAM5AwYDhwInAl0C5gJDAz0DFgMV
+AzkDVgMpA+EC9AJdA8kDBgT/A8UDjAOFA7QD8gMmBDAE/AMBBJMEIAU+BSMF+gTWBPEENAVVBWAF
+ZQVUBTEF6gRLBLoD1gNRBKcE6wTyBKQEkQTtBDAF/gSRBFQENgQFBAsEUQQ3BJUDRANoAzgD0wKl
+Ap8C2wI/A0gD8gKgAoMCrQLZAo8C4gFbAUoBnQEGAhoCvgFlAZQBNQJ1Au8BfgHIAUkCaALoARYB
+iQCCALIAtQBuAB8AMACUANoAvwB1AFYAcAB6ACoAdv/f/uv+S/+N/3b/Bv+n/pf+kv50/qT+Of9j
+/+3+g/6B/tT+Jf/P/sb9IP1S/Zn9mf1u/VT9k/30/UL+cP4T/l/9Of2i/er9xf1l/Tb9Pf0l/e/8
+yPzz/Hv90f2h/Yr9Av5g/jD+5v3C/cb97/3U/Yf9jP2+/bX9mf2s/QP+W/5D/gL+Hf5j/iP+ff17
+/Q3+Zv6e/u7+BP+Y/gj+z/3Z/QL+Df59/bD8C/18/v/+B/5B/a/9nf4m/9D+F/5k/pf/CQBc/3z+
+N/6O/sb+WP7I/c79E/7f/Vz9af0r/uz+a/+w/5//N/+u/of+zv7a/oL+H/7D/Zv9DP7U/iz//v7T
+/tr+5v6w/kT+Cv5D/qf+4/4b/1v/Tf+o/ov9w/zM/OL8dPw7/MX8x/2k/qL+s/3p/Bf9n/2B/bb8
+afxs/bX+uf5x/QD8TPvJ++78qf0G/o3+nf5w/Tj8SvwL/Wr9Tf1y/Sz+Jf/f/6b/Xv4I/an8KP2v
+/dT9h/0S/Sj9v/21/ZX8gvuv+wP9Tv6l/l3+O/5s/sj+xf7c/Rr9sP3Y/jz/0f6I/tn+Sv9y/1H/
+IP8c/xv/y/6J/uD+NP/f/lP+Yv5Q/4cAIwHfAFYA0v9R/zn/v/+lAKkBTAL9ATUByACJAOv/Cf/P
+/vj/wAG+ApcCrAGaADsAqQA6Aa8BVQITA3oDnQOMAyQDiQLuAa4BJwLyAj8DLAM5AzgD2gI1ApsB
+ngFPAjQDBwSWBI0E4QMsA/oCGAMaA+oCxALwAmkDrQNSA3kCyQHQASkCPwIrAkcCxgKTA/wDewOL
+ArIBGgEnAb4B6gGkAQwCDQNpA9sCRQI4Ao8C0wKzAnoChAK5AvcCIwMiA9UCbgJDAkUCWwKBAmcC
+MgJ4Au0CEgP6AvgCNQN5A4oDXAM3A1MDmwPgA/kDCgQNBMMDaQNMA0UDFQPRArgCxgK7Ap8CtAK+
+AnMCQwJTAmECtgKDAwQE4wOVAx4DqAJzAgoCbQFFAZEBoAFQAR4BMwFbAaMBMQLRAi0DSgNnA3cD
+MgOOAv0B2gHkAdsBtAFrAQwBxwDFAPIAFAEgATIBPQEoARIBMQFVAS8B0QB4AEkAUwBrAFAALQAv
+AAkAxf+i/5D/Xv8g/0L/mv+X/3j/a/8G/3r+Pv42/j7+Lf7D/XH9of3i/eL9z/2c/TP9F/2y/W/+
+Xv6O/dv8vfw5/c39fv1k/P772fza/f/9Yv3+/Iz9Rv4s/q/9z/16/qn+7/0M/f/84/2c/gn+4fzF
+/Lb9Uv7g/fb8mPz3/Ev9Fv3A/Pb84P1z/v/9M/2x/L38Dv3T/E38cvwM/U/9YP1G/ab8/vv/+6X8
+Xv2P/SX9qfzB/Fn9x/3D/az97f2H/v7+tf79/dv9lP4s/5r+e/08/fT9d/4v/tP9Gv7n/o3/fv8U
+/9P+h/45/mz+If+2/6r/Gv+F/l3+k/6O/gD+zf3Q/gMA///p/uP9kv2d/cf9Of7I/jD/k/+C/3n+
+uP0w/qz+Sf7X/W/+7P+9ANr/aP7o/UL+tP7i/gj/mP85AAwACv8f/hX+sP7z/pz+rf5w/8//P/83
+/nX9gv0N/n3+Bv/7/6cAHgDL/ij+yv7X/zgAtP8W/+n+A/8b/x//Mv8u/wj/Lv++/wEAj//s/sP+
+Of+4/8f/uf+o/x//SP7e/e79Kf6Z/iv/gf8r/yL+Q/1P/Sn+bv83AL7/9v4H/0L/5f5t/k/+df7G
+/mT/YgAtAesAtP+o/rj+qf9XADUAFQCoAIYBBAK7AdsARgCjAIEBJwKLAuEC4gIyAl8BJQFqAcAB
+DgJiAqkCnQIdAmcBEgF4ARUCdwKdApYCogKnAtEBQACN/z8AVAEoAoICVAIiAiMCyAECAYoAywCd
+ATsC9gE2AekADAHuALsAEgG2ASYCfQLRAvQC8wLaAqQClwL5AoIDoANqAzkDRgOqAwYE7QOIAzID
+xwIZAqEBtwH1AfMBzQHHAcgByAEFAlcCawI3AhUCcgIWA1ADBwO2AocCPQIJAi0CEAJ1ASkBWQF/
+AWoBVgFWAV8BvQEUAuYBxAH+AUACUQL1AXABkAE1AqcC3QLbAp0CawJnAmMCCAJoAQYBNgGqAfQB
+/AHQAaYBiAGCAcUB0wFnARMBMQGKAcMB1wH0AQ8CAALpAdoBrAFbAfUAgQA9AG0A2AAQAfMAvQCU
+AFQAMwBcAHsApAAZAVoB9gCnANgAvwBAAOv/5P8xAFsAAAB9/wD/x/71/uX+Pf6m/df9Qv4m/vT9
+9P3W/bH91f0//qr+1/7h/vX++v7z/hP/Uf9//2b/Iv8a/zL/KP8c/xb/+f7L/qD+Sv7e/eb9Vf6H
+/oT+gf5v/of+sv6//o/+Hf6//cf97v2h/Qv9rfyU/Jn8ivxF/Aj8bPxI/Xb93/yp/DX9DP6R/mj+
+JP5N/nX+Xf5E/jz+O/4q/rv9Bv3q/JL99P2U/UX99P0m/7L/cP8j/0r/lP9o//f+9P4L/83+vv4K
+/0L/+v5K/vD9ef5z/wkAMAAUAN7/5v/b/27/D/8n/4f/u/+1/6n/iP8X/7T+G/86ADcBQAGxAMwA
+YQEiAR8AQv/5/nH/HgBRADIA9/+6/6X/v////2cA0QD/ADQBcAFNAaYA1//b/3MAIAD4/mf++/7a
+/+H/2f7c/S7+bP9FAGYAcwAbARICFgKrAPr+gv6I/+sALwH6/6P+eP4Q/1T/zf4a/jv+MP8bADoA
+bP+2/hr/zP+X/5T+vP3k/bL+7P7o/XL8C/z5/Bz+gf7B/XH8V/zL/VH/5P8u/5b9qPxA/TT+SP7o
+/cf9sP2R/fP9s/4T///+3P7P/vn+Zv///5YA3wCjALj/jv5c/iz/4f/u/zj/bv7A/gUA+wDbACMA
+6v9PAIcAcQCSAOoAGQHsAIMADQCa/4b/HQD3AGQB8QDp/0z/vv9vAD4AqP/K/8YAzgGlATsAQf+d
+/3UAygBcABEA6AAPAs0BTQBy/7//BgDL/+b/9gA+AuYC0gI0AooBUgFsAXEBawGcAeQBGQI8AjAC
+uAEbAfgATwHUATwCMgIFAmkCIwMxAzsCKwECAakBNgIrAuIB1AESAmcCXAKwAcUAVwC5AFEBbAFI
+AXkBxgGfAQsBhABlAL0AOQFxAYsB0QEhAiECnAHGADkAMgB0ANEACQHmAIwAUQBmAK0A+ABCAYsB
+zgH0AeMBjwEuAR8BfQEUAmcCIgKhAYoBvQG8AaYBwgEMAlsCjQKcAqEC0gIcAxIDpwI8AgQC/wH/
+AdcBugHYAdwBsAGCAfoAdQDfAJ0BwgG2AaIBIwHFAAoBOgHVACUAiP9q/+L/RAAjAMf/k//b/24A
+0gDiAM8A3AAGAfUAkwAvANv/hP9s/6T/y/+r/1//F/8K/0j/Zv9Y/5f//P///6r/c/9x/3T/dP87
+/6H+I/5I/p3+m/5z/mD+lf4l/7H/6f/O/1//zv6l/gv/gP+T/zr/7P4B//T+cP69/Tv9W/3//Xz+
+sv73/mb/r/9Z/2T+V/0W/e79x/61/iz+/P04/lL+yv3c/I38m/0M/3//SP9a/wIAqABiAJb/Sv93
+/0z/i/4c/tL+6/82AMD/P/9N/7X/mv8W/xT/5f/ZAAQBdQD5/9X/l//K/tP90f0B/zcAnAB3AB8A
+kP/7/p3+pP5W/0EAZgDJ/3X/4f9dACgAcP8G/3T/QwCuAKEAZAAfAOn/q/9M//r++P48/2z/g//j
+/04AXgBVABQASf+R/qT+h//7ABICZAE8/5v9wP0N/yAAJAC8/zkANQHnAP3+Jf0l/cT+lAALAr8C
+6AEAAFr+xf1c/mn//f/2/wYAMQBd/x79D/sK+9n8Nv+mAEAAZ//H/24Ahf85/cb76Pxp/6gArf+Z
+/TT8Lfwf/S7+ef4E/nX9cf1Q/pD/MgDv/03/9f4D/+b+Of5o/S399P1m/0sA0f9x/hX9Gfyp+x78
+j/14/yoBaQKsAukA0/3j+zX86P21/4UADgBj/17/SP9x/kn9qvyT/QMAAQItAl8BUQA7/63+0/43
+/6r/IwBsAEwAaf/2/Q39ff23/nD/U/8L/y//mf+Y/wT/yP52/20ApwDU//b+C/+i/wQAcAA7AfcB
+2QHWAP//HwDIAAwBzADjAOYBCgMLA70BWAAMAJ8AMAGUARkCgwJgAqEBcABd/zL/u/8IAFEARwE5
+AhcCTAGsAA4AZ/9J/9z/xQCiAQ8CswGhAN3/TgA9AXwBBgF9AHQAAgG6ARICwAE5AW0BYgL5AqgC
+EAKqAWsBeAH0AWcCVQL6AcQB0gEeAl8CQgINAmcCNAO8A5gDBgOaApMCwgLfAvACKANUA0ED4gJ2
+AlcCXAJgAsoCewPPA9cDwgN1A1IDqAOrAwgDpwKnArQCwgJyAvUBzwHfAQYCUgJbAh0CQQKeAqsC
+fwJYAigC0gF5AUkBOAESAQYBVAGJAVEBEgELAQkBAwHZAJ8AwwANAQMB2gD6AFcBZQHSAC4AHABf
+AJYAugDLALEAgwCdAMAAUgCx/3L/mv/p//n/t/+N/4z/av8w//P+tP7Z/oX/uf/G/pj9Kf1+/WL+
+Sf/A//P/xf8d/7f+0/63/m/+o/7t/r7+b/5R/gn+PP2e/Bz9cv6g/wUA1v/S/zUAeABAAPH/OwAJ
+AVYBuwDp/3z/jP+U/wX/PP4h/tX+eP9z/yn/Rv/3/8kA4QAOAEX/WP/1/wQAQ/+y/u3+Y/+L/2H/
+/f6n/pj+fP5p/tX+df/m/z4AkQD/ADkBrQDT/1f/H/8//8v/SgBkAFgAewA/ADT/UP6b/tX/7AA/
+AUwBigG2AY0BvQDA/+X/IwFTAqkCEgKBAZcBdgGuAB0ARADFAFIBRwFFADv/6P4b/zH/0f6R/gH/
+u/8OAJT/q/5C/of+5f79/gv/SP8k/wn+yPxh/Jb85vyy/Ar8KPxB/TD+HP5N/cH8Bf2L/Xb9NP28
+/ZD+jP6j/f38Xv0v/oz+9f1t/AH7vPpm+2L8L/01/ZX8TPzj/I79Pf0b/DH7Mfu2+/v7BPxt/AX9
+xPzp+9v7/fxN/qP+1/3L/Ez8WPyk/Gr9l/7g/kr9O/sP+7X8Gv4W/lD9Tv2Y/oH/ef7g/CX9Bf/0
+//P+iP04/eL9Ff76/N/7Wvzh/b3+VP6J/WX9Yf1d/G37ifwv//4ArwB7/zf/oP8T/5X9//xI/moA
+twF3AXYA1/+6/2P/p/64/tT/egAwALv/ef9e/zL/3v7O/pz/5ABpAdgANgA+AIsAdQAKAB4AGQHg
+ATwBrv+P/ob+P/8OAHcAdQC3AEcBHgFdACMAbwCGAFkAiAA/AaAB7wCn/wT/mf9uAFgAy/+9/wQA
+RgBMAOr/q/8cAPYAZgEUAZcAawCWABkB6AG4Av8C3QLwAmIDEQR0BGgEnwQyBaMFnwUTBXsESQSa
+BE8FugWABTAFaAUsBrkGyAYZB5gHrAegBwIIhQh1COwHegddB14HSgc4BzEHIgcGB/AG2waUBkIG
+KAZCBoUGyQbgBsMGeAYwBhAG9wXZBakFRQXUBHME6AMzA84C6QJEA6cDugOKA2cDLwPiAogC4QEo
+Af0AfwHeAYYB5wB+AFMARAAAAIP/Rv94/8T/xP9u/xb/4f6X/jD+D/41/u/9Rf0R/Tj9K/0L/dD8
+e/yj/Df9sv0g/kb+Hv5Y/rT+lP5O/iv+1/1g/UT9pP35/ev9+f1D/kj+Mf5p/qb+qf7R/lX/+P8f
+AJT/Df8c/1L/OP8i/0j/gf+0/6D/Rv/r/rf+xv4G/37/CgAwANv/Zf8y/1b/rf///zQAmAADAfQA
+iQD//3T/W//f/2cAWwAIAOb/7P8DAO//jP9B/1v/jv+U/4L/Zf9a/2f/Y/9X/0v/I//M/mP+OP5V
+/pr+9P45/1z/e/+O/1j/5v5t/gz+GP6W/v3+Hf8g/93+eP5S/lL+Z/6S/pL+ff6h/uD+HP/c//cA
+HQE3AEr/qv6h/hD/Gv/V/r3+pv5g/uT9b/2f/aD+k//V/wQAawCbAIIAWQCBADkB9gECAl4BXwBk
+/8n+nv6d/qL+1/4h/+T+Dv51/Vj9Uf1n/bX9Mf6+/ub+SP5W/bX8jvy9/AT9Kf0t/Vn9sv2z/Sz9
+sPyK/HT8UvxV/I782Pz2/P78Pf3m/db+Nv/2/hD/tP+jAG4B8wBQ/xP+1f0r/p7+df6s/SP90fwo
+/HH7Lvtc+4/7ivuo+/n7vvsF+wf7AfyM/MT7ivpN+vj6QPui+rL5FfkI+T35uPj39vP05/NN9Ln1
+EPeA9zT3Jvcj+Ln5lvps+ij6dPo2+977CPyl+776xflx+bT5Fvqu+pz7nfx+/RH+NP5l/tD+7f7T
+/k3/cwBXAXgBQwEGAeMA8QCtADUAtQA3AmADCQNOAa//hP9fALwANgD0/9QAKAKrAhoCLAHlAIUB
+MgJsArkCXwOZA7ICRQFzAKIATAGUAVgBHgEBAb4AWAAQAAgANQB6AKsAxQAJAV4BJAE/ALz/eQAA
+An8DnARRBf8F2QZ3B3sHIAf/BmUHHAjXCEEJ9ghyCJoI4wjJCDkJawqfC5YMTg2uDasNeQ2mDSsO
+Vw4yDjsObg5sDv8Ncg0tDSwNQw2KDeAN5g29DY4NRg0VDQ8NxQwkDMMLrwtWC9EKpQrECvIKDQvQ
+Ch0KRQlvCHMHfgbaBVwFqQTgA2MD9QIzAmMBxQBYAEIAYwB/AGUA8P9L/5/++P0//RL8pvr4+Rv6
+HvoI+hD65fnc+SP6Kfq/+SX5jfhF+Dr4uvfh9pz2/fZq95f3s/ca+M74gvkP+mz6rfoJ+1r7XvsY
++5L6Evra+bP5h/nG+Y36Z/ss/AX95P2h/kX/0/9KANUAZgHoARgCzAGRAboB3QGnAWMBjwETAnsC
+yAJJA/EDdQSpBKEE6QRlBTIFsATDBCwFcQWABXAFpQUbBlYGQwbTBesEKwQJBOIDOwOvApkCYgKk
+AcgAQAAhAGoArQB3AEoAlQCYAPr/kf9s/+f+Pf7S/Yz9Mf2i/Pz7Zvv8+rj6hfp1+mf6KPrj+Z35
+QPn9+L/4bvg9+Ef4Ovip9+j2wfYA9+z2zfbi9oL2yfV49Tn1ufR29H30oPQg9en1ivb/9k33jvcH
++Ij4xvj/+EH5Pfk5+ZL59fkN+hH6ZPrs+jn7cvsd/AD9kf1v/pcALQMtBEsDRgJGAvoC7AOxBPIE
+DwUjBZYElAMDA20D2AT3Bt8IjAlaCf0IdQjLB2AH6AdaCW8K6wklCB4GSwRTA28D/AOzBCQFaQTF
+AjoB/f8U/6H+j/6l/pD+//0J/RT8Gfs8+iH6tvow+xn7lPrP+ev48/cQ9832Mvdr9xD3ovZi9gz2
+wvUa9u32XPdN94/3ofib+d34sPYA9ab0WPWA9lf3ivd693P3L/eq9ob27vbv93/5mPqK+tz5Ifnf
++AP59/hZ+cL67/vr+3L7DfvW+gD7avso/E39Kv5I/tf9PP0z/R7+T/8sAO0AjAG8AeEBOgIiAnwB
+awGeAugDMATcA3IDBgOGAvgB7QGfAlwD5QNvBKEERwTNA4kDYwMHA5MCiwLqAhQDggJqAWYA5v8p
+ANwAVQGRAbwBXAEuAAD/bv4//mH+yv4t/1n/A/9Q/vv93/20/Sb+NP/D/2n/ov6u/ZH8sfs/+yL7
+afvV++T7UftY+qT51vnw+nP8if7cAe0FPglSC58MXQ3eDUoOjQ4BD4APGQ+XDfULQAvNCzINAw8k
+EVETPBX5FlgY4hgUGQoaphuEHB8cMBsQGrcYZxdzFvIVyxUZFtIWQxfAFoEVPxQyEzwSexH4EGsQ
+0w9gD9UOLw7vDUwOqQ5pDqgNvAysC+0JeQdSBdwDjQIEASj/DP0P+4L5pfhL+On3u/dT+Hv5Wfoc
++tD4LffR9aD0I/Ow8Sbxi/Gm8X/wsu6E7UPtWe2P7bnti+107QTuwu7m7tnun+8m8aHyivPb8wX0
+c/Qp9dT1dvZs93z46Phw+Kb34PYS9uj18fZ6+AX6wPuX/WP/yACcAYkCxwO+BHgFaQZwB/4H2AdP
+B9wGugb9Br8HjQj9CJcJsQrUC5oM5wzPDMMMIQ2UDZEN6Qw5DDMMfgySDGkMSgwkDIQLVwrrCJ0H
+hAarBSUFmwT1A0sDaAJEARcAMP/B/qz+mf5N/s/9O/18/D/7aPmH9yz2F/UU9ETzcvKn8TzxFfHK
+8D3wm+877x7vu+4D7oLtSu0Q7Rztke3P7aftx+2A7hHv6u6F7oLuFu+/7wPwKPBM8Drw0e9G73jv
+t/BB8pvzAPWU9gb4LPkp+u/6xPve/Kr9uf1I/fj8F/1j/aT98f13/mD/mAC0AboC7gP4BNgFJwdj
+CL4IoAicCNAIbAnFCsQMcQ76DqYODg5kDb8MewyfDBcNyg3QDeoM/gtcCyoLNgySDuoQ4BEsEWAP
+DQ2fCuoImggXCQEJogcwBWQCDABj/ov93/3Z/kz/4P4F/qb8mfq8+ML3nPf99+P30vaA9V/0TPNT
+8g7yw/KQ86Dz6fK58Xnwae/d7lnvfPBi8drxNvKa8vzyZPNM9Pf1rPf9+BT6pfo2+rL44fb19V32
+U/f092D4Lvkr+nb6Mvqt+lb8bv5BAHwBAwKSAWMArf/G/9//6f9xAFoBxQEpATAA7v96AEUBTAKK
+A0kELAR+A64CSQKLAi8DOQSdBasG2AZlBr8F6gTyA0YDeAMhBP4D+ALPAb4AAAAFAIwAEwHFAXgC
+sAKMAhkCOgFvACQAFQDp/3L/tv6+/Xz8LPtN+gn6YfoY+4n7l/uV+1L7d/qF+T/5qPlM+p76h/pF
++sf5Fvlu+BX4Jvh4+Oj4P/kF+e/3jPbp9ST2T/Yk9rr2kvkG/3AFxQqMDj4R+RK/E94TeROXEucR
+qhGSEOkNPwu6CgoNahE4FuYZkRznHtEgHSIoI+YkcScZKRkomSRbICQdbhu2GqkaFxuxGzccXxz7
+Gw8bEBqJGSYZ2RdUFb0SUBGsELoPxA7DDowP9A86D4wNWQv+CHgGcQM9AH79Svtl+f72iPM+8KLu
+yO63723wFvHa8nv1pvYK9VbyUfCH7hPs6+ip5Xnj5OId4/XiD+Jy4X3i/eRX54Xo3+g26QbqLusq
+7BHtkO7H8J/yy/LC8RzxvPFs82j1JPd5+Ij5WPpb+i/5vfd199v4JfuC/RwAUAPzBlIKpwzrDQEP
+XRAwEcYQmw9wDlMNSgzBC8IL3ws4DAoN+g3LDrkPCRHMEo8UrBVcFrYW9xVIFDkSpQ9tDaAMeQxP
+DH8M1QynDKsLtAnyBmsEDQOIArsBRQCv/l39b/zN+w/7Xvo++mn6SvqY+Uj4v/Zq9fzz9fFs7+zs
+uOrJ6Frne+Yr5pfm2eex6UnrJ+yB7GTs4OtK67vqWuqJ6urqwOoo6nvpxOhW6J/osOlH6+vsUe6K
+793wLvLr8ijzk/NP9Cv1K/ZK94j4xfnr+jz8tv3c/oL/LgAxAfUBDgL4AU0CKwOEBBUGbAelCAQK
+YgvRDCEO5A5eD8oPHhAXED4P4Q3CDBMMegu1CiUKMwqoCiELgQsWDEINSA9aEu4VdhhwGOQVnhI5
+EOMOCA4DDY8LvAlMBwwEsQCt/g7/eAHHBGgH0AdHBiAEAAJgAOv/lAAtASYA/Py5+M708/GH8JDw
+YPHt8Zvx1fD97x/vsu5L7+nw0vIy9ND06fST9A/0xPP48+X0I/b49t32lfWv80nyxvHy8QfzHvVJ
+96H4Ufm1+Rb6FvsV/X7/hAEjAzkE7wPoAe/+kvwf/Ff9tP4G/6n+dv5A/uf9Sf67/7YBBQQABqcG
+HQYnBZEEuQQaBSsFQAW2BbUFNwTGAdj/Hf9x/0AAKAH1ATsCuwHHACoAVAAbAX4CPASVBdcF+QSn
+A1MC/QDL/xb/3/57/nL9AvyX+qj5cfni+f36VfwR/c789fs3++b62Prl+u36tvpM+tb5JPkH+Iz2
++fRR9Jj1iff29//2X/bI9lv3VPft9gz3J/ij+Xz6F/rn+MT3RPdy95/3mPfN9zb4nvit+dj8pgJ8
+CRsPlRJaFBYV9BTrE34SvxH8ETYSdRH8D3cPQBHmFO4YMBykHvMgYyOWJQAnuSeCKB8pBCivJF4g
+mxx4GvQZ3RlpGfgY/hg0GTQZBBnAGGoYqxf2FTYT7A8fDe0LBAzFC6UKdgnACBwIkwbCA8AAqP4u
+/Yz7Svm19qT0BfMF8XPuMexP6yLsru2y7k7vS/Br8Vzxi+/t7H7qZ+g/5qjjRuEv4K/gAeI24z7k
+u+X35y7qe+vU6y7seu177zLxDvKU8gzzB/N38qHxKfHi8drzXfaf+Hz6U/zY/X/+nf7H/jf/MgDK
+AaoDvwXrBx4KsgwpD28QqRCoEGYQrA/fDh4OfQ16DUUOZw8LECsQdxAdEQYSKBONFF4WVhikGZwZ
+IRixFQETbRD/Dc8LRAqeCXQJWglBCUAJOwkDCVsIKQfoBb0EQgOQAQEArf5z/SX8pvr5+E731PVq
+9PbyDfIy8qjyePKF8dPvpu2u6z7qPemn6JnoQumB6obr9+tH7HPsIOyK6zfrPesh67HqYupS6mfq
+zep760/slO1C77jwCPKs81v1rPaK9y34Avm1+Y35z/hi+Nj4PPrt+0791v7uANIC7AOLBDsFVgaU
+B4UIXglaCj0Lxgu+C1wLYwv4C0QM/wtMDHENMg4vDq0N0QxLDEQMEAyACwYLIAutCxIMGQwmDIYM
+4AzQDIYMrAwADc8L+Aj6BjAHVAicCGsHxAUMBVcFsgVMBTMEnwMuBJ4E0gNpApkBugHmAeEA3v5M
+/db8ifxf+9H58fgQ+YD5+vg19zL1OvSw9IX1nvUV9Yr0I/QH9Eb0TvQh9G30DfUi9Yz0HfRa9Bj1
+r/WD9S/1rfWx9oX30vfD9yP4JPlB+g37UvtT+4X7Cfxi/Gj82fwC/ir/gP9b/8v/EQEcAu0B+wCi
+AGUBdgLOAioCaQFUAZUBrwF8AUcBjAEWAjsCogEOAXQBQwKDAg4CfQFWASkBiwDw/83/9f8AAJP/
+2v5f/i7+wv0K/dv8T/12/Tz9HP37/Nb8vfyu/M38uvwo/Ij7R/s4+936J/qb+an5CPoc+tj5fvlb
++cD5Nvr++Un5Afmi+UD6rvlO+Ff3cvdy+DH52fgs+EL45fj1+D74yveC+Av6B/vg+i36q/m1+fL5
+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
+kBG/EX4RDRETEJoOEQ0KDNELUAw7DYUOpRD2ExUY9RuCHgogjiHrIkUjXiLdIFMffB3OGnMXLBQG
+Eo0RzhH0EQgTmBX+FyAZ7Bm6Go8abxnuF80VGhNSELINbAuLCREIGAcZBswE7AN8A78C+QHnATcC
+CwJeAbMA7P+O/o78bfqL+AD3LfYw9jn2q/Xa9OfzkPL08D/vfO0E7F/rh+sI7MHsue2z7rDvzfCD
+8YTxffHa8RbytfES8bbwYPC17+3uY+4S7jjuWe838WTzu/Xf9935yvvR/Mn8hPww/KP7M/sb+0n7
+p/sM/Mn8Qv7h/wQBJQKYA/0EOgZnB28IHgmTCUAK3ArBClQKMApACksKQAppCiELEAyfDOMMBw3Y
+DGYM7AtzCxcLzgqwCu4KMwsyC/MKhwrZCcUIlweTBnMFBASbAq8BLgGsAL//pf7m/T79uvzj/Dr9
+EP24/Eb8dvsr+kn4QfaT9PjyR/H27zfvr+4m7vztP+577szudO8T8B7w4e/K72bvvu477nftZOyj
+6zbrteo36iTqq+qX663s9+1M73jwevE+8t3yXfPC8zj0nfTR9Pf0SPXQ9V/28PZr99H3pfj2+Tj7
+Nvws/S3+Gv/T/3UAOwHwAWUC/ALuA9MEXgWZBcIFKwbFBiUHOgdDB20HbwjcCkcNZg2UC08K1gpZ
+DFwN/AzxC3sMlQ9xEuMRYg+GDgkQBxIiEp8PvAzlCyMM5QpjCDkHnwj6CpULlgkeBwAHEQlACsoI
+VgYgBR0FgQTtATT+jvu0+nP6yPnb+G74+fj6+T36jvlK+Wz65/vA+6L5O/cQ9kD2s/YT9qT06vNr
+9Cf1+/Qw9CT0i/W/9zz5Xvk8+YT5XPlm+Gr3Ofcr+Kj5d/oG+gL5tPiS+dn6tPv8+x78kPxY/eb9
+vv1x/Qz+r/9TAd4BaQELAWYB7wHCASIBGwH+AfsCFgMoAtcAIgCEAHwBOQJzApsCNwP2A/oDYgM3
+A4wDrQNNA3gCuAG5ARYC9gGbAcMBxgJQBA4FbwRkA9UC5gIPA+ECagLnAYMBNwHOAA0AoP8yAO4A
+4wB4AG8AzwDaAOv/Zv5b/T39Yv0R/UH8jPuU++/7//sU/ND8//1+/tz94fxv/Ln83/z/+7X6OvpG
++rz57Pi2+Nf42fjj+A75Qvmk+QD6efmC+HT4Qvlk+gf8Tf6jAJkCrQRFB7sJDQsaC5EK5gk+CXkI
+VgdvBrwGgwguC6kN/w9AE/cWpxk0G1scsR1oH1cgFR9SHK0ZixdnFdcSQhDxDncP9RC5EsYU5hbW
+GKwaCRxEHIYbExrGF/QURhL4D7kNpguCCu4JyQhFB00GLQZpBrYGHQcRB34G/wU1BV0D4wDG/gL9
+OPux+X74iffe9kX2ofXB9Jfzi/Kp8X7wxO7r7OTr+euK7ALtPe2L7WLuRe8n7xzuIu2n7Gns5Ov+
+6lrqLurZ6SnpoOjd6DrqZuyX7kjwvvFr8yv1dfbj9pf29fVK9d/0u/SA9Cr0jvQF9g34NfoM/LP9
+wP/qAW4DSAQ3BZMG1AdZCAUIVwfVBpkGuAb6BhkHogf5CGQKPwsCDP0Mmw1+DUANig3eDcsN1A0h
+Dn0O0w4sD1sPCg91Ds8NtAxOCy8KfwkLCWwIiAe+Bi8GmgXTBA8EpwOZA74DugMuAzQCDQG7/wL+
+7vvl+Tf40vZm9QH0D/PJ8gXzYfNU8/jy/fIn883yAvIO8TPwn+8P7xnuwuyF69fqz+oC6yHrn+uf
+7Gftuu0N7ozuBu9X77TvOfCO8Gvw/O+p753v8e908A3xJPJs82z0ePWg9pH3ZPhn+XT6Ufsd/Pb8
+uP1n/iD/xv9WAP4A7wEQA+MDXgTgBHgFKAbpBogHVQjICRQMNQ85EpETLhPtEgwUlxXoFaQU8RIc
+EjIS1BGEEOoP1BAbEv0ShxPxE9EUPBbpFqoVfBOGEtcSBBKxDkkKMgdzBrAGGQbBBMgDqgMHBCwE
+9wMKBFsEzAPrAaH/3v24/L/7ffrH+AX3DfZN9tz2a/Yd9TL0fvS79b32mfaL9aH0ZvQH9APzKvL+
+8Uzy0fJA81fzYfO988/zMPOs8uHyfPPf8+jzsvNd85Lz1/Sp9gX4tfgt+Y759Plg+rX6JfuJ+6X7
+x/vg+6H7ovte/En9+P2H/ij/KQCVAdUCfQOnA6kDxwPGA3MDHAP6AgQD9gLLAvgCzwMgBWwGPQdV
+Bw0HDQc5BwsHfQYABs8FuAVqBZcEZQN9Am0COwMvBJ8EewQbBOYDyANEA5ACWgIEAn0Ajf55/Sv9
+Jv1V/V392Pw3/OT7n/tg+3H7nPte+yj7hfus+9P6Pvn29/b3uPgJ+bT4GPiL9xn3k/ZD9mX2mfaB
+9jD22/Va9a/0lPRU9TX2w/Z299344vqz/K/9UP7K/5ECfwXzBjoGkgQWBJMEhwS/A0ADLwSjBlkJ
+Rgv7DI8P7hIYFhIYxBhBGS4aiBolGbQW7hRqFFwU8hNLE9wS6BLmE78VohdZGe0aXByxHQ4e/hxd
+G8sZOxh7Fk4U4REEEAoPNg7XDG8L9wpmCw4MdAxIDKcLBAtcCm4JEwhBBjYEHQIoAJX+M/2e+9n5
+a/jC92n3UfaZ9IPz+vIR8vDwO/Bh8ALxrfAv7wzuyO3K7ZPtuOxe64HqduqT6lfqxemg6XXqdOvb
+6+Tr2uv8647sZO037hbvO/CB8V3ygvIv8tPxm/Gz8TDy4vLk83X1QPfP+Cv6aPub/A7+w/9hAb4C
+6APqBMwFYwarBv0GcQfjBxsIKAhXCAkJqgrVDIUOmg9+EEMRBhKREnwSUBKdEh8TmhPGEygTCRJX
+ETUR0RDsDzAP5A6sDlkO2Q0gDX0McQysDGAMpgvgCkcK4gkcCd0HugbFBb0EkAMsAnMAsf5c/XT8
+nvvJ+kT67/lt+bL4xffP9jr2+vVn9Wr0XvMa8pjwQO8m7j7txezE7LjsLey66yXs1ewW7SntVe2P
+7Z7tQu2m7CvsqusU68nq3upJ6wrs2eyo7cHuEvBO8Tvy9/IG9ED1BPZS9rv2jfeb+HH5vPkK+vT6
+IvxJ/fX+DAGCAkgDIQRdBecGPQjuCFQJGApzC+kM8A0TD+kQnBKLE1QULxWxFb8VNxXaE7wSExPS
+E2MTIxL/EFgQ+RB5EiATEhNDEysTiRLGEc8QcQ+RDUsLHwk6B4oFRgRJAzACHAGBAJ4AVAHCASkB
+PgCv/x7/WP48/Y/7r/kH+Iv2TPVc9JjzMvMf8/Xy1vL78i3zHvPC8l3yI/IQ8uHxk/El8S/w/u5v
+7sXuiO8G8BfwEvAv8HPwuPDc8Bvxg/HD8SDy1/Iv8zTztfN09O70Z/Uy9ir3yffW96z3pPfM90n4
+OfkJ+lv6zPq6+9L8uP1Y/hD/CgDWADYBVgFmAZMB0QEAAj4CwwKgA7AEkQX/BSkGiQZMBx8IoAiq
+CIgIeAgwCJYH6QZ9BqcGDwfoBl0GUQbIBh8H8AYUBgoFwAT8BKoEngOLAssBawGXAckBRQGdAGMA
+HgCE/+j+6f4r/2j+0/zC+2v7xvqM+Zf4W/jJ+KL5BvpW+Xf4gfjr+H/4effo9uH22/ZU9hz1DvQm
+9OD0GfWQ9P/zVvSr9Vr3GPnj+qH8Pv68/1gBCgM9BJ4EiQSYBNoExQQ9BOkDRwREBbwG4QhrC2AN
+5w7TECcTjRV0F4cYzRg8GHMXEBezFg4WXxWOFMMTxxNxFCIVFBZ/Fx8ZhxqJG0UctxzFHI4c7xt0
+GnQY7RbyFa4UJxPjEQwR9hBnEWARlRCiD04PrQ+oD3QOuwxOCycK5whTB5wF8QN/AlQB7P9e/nL9
+H/3A/Oj7n/pJ+Rv4H/dK9jv1zvOa8tzxCvFV8DjwBPBA76nuYu7Z7U7tHu3s7E/sf+sq63vrnusK
+643qBesc7Bvt3u2k7oXvZfD78CzxcvHP8bvxR/EN8YrxdvJt85L0+vWO90D5x/rq+wf9jP74/4oA
+uABSATwCAgOZAxkEjgRaBZQGsgdsCO0IkQmCCoYLdAxODQEOeA7FDtcObw7vDSsO+A6JD7wPvQ94
+D0UPSQ8BD2EOuw1HDRINqgwGDI0LRgsIC8QKggpKCgUKlQkECU8IUgdGBoMFqQQgAz0BnP9m/rL9
+JP1G/Gj72fps+hf6r/nh+Pz3Vfdy9gz1rPPB8ujxwfCd77nuJe7c7YPtAO2z7Nns/eyZ7BrsBuw8
+7FbsAuxd66rqT+pM6hDq4elE6tTqVOsd7CntIO7Y7j7vre+O8ETxcPHU8a/yqvOv9Kz1q/YS+Ev6
+2vwt/hv+V/4BAJcCegRwBB4DwQJvBDEGQAbMBZQGCQlqDMcOUA+6D3ARRxOAE8cS1BKfE9ATRRJS
+DxYNSQ0sD0sQkg9oDksOSA8vEPQPLw/TDqAO8Q3rDLALBApSCN4GQwWiA7cCowKoAhICtwBq/yv/
+t//e/wL/Wv2g+9b69Pqm+ib5Vfel9gb39PYO9h/1hfSD9Ov06fR29BX0x/My8/HxK/Cq7jTu5u6p
+74zvDu/q7nLvXPDK8HTw4e/Z7+rwTfJZ8iXxmfCM8eLybvNd83vzMPQ/9ej1G/a99sP3rPiR+dv5
+c/nH+e/6mvu6+xz8Iv3C/lMAOQG4AYYCqQOOBOgE0gTIBEEF6wXuBWkFmAX3BpkIcglVCf4IOQn1
+CXQKVQoNCh0Kkgo/C6MLKwsrCooJWQkUCasIbQhlCEIIygciB5YGRgYzBhMGfAWOBKoDHAP6AvgC
+wQJgAgwCoQHvAIUAkAAbAPj+KP4m/i3+rP2w/Hj7ivrt+Yj5gPl1+R35yfiT+GH4gPgo+d35xPnS
++An4CPjA+Ob5sPrZ+pH7if3m/8kB2gIIA/gCdgNjBA8FaAXLBTsGrAZGBzEIkAk4C7gM0A3PDh0Q
+rBE2E0EUmxSYFJwU4RQJFWcUERPnEawRaxKrE9EUkBVrFrgX5xiqGdMZdRk9GSEZyBhSGH0XSBZx
+FdsUqBMJEgYR8xBBEV8ROBHwEMUQ9BAwEbEQJQ8dDV0LDgqyCN8GCQXkA0MDnALvAScBNgBz/7X+
+pf1U/An7DfoX+b73Mvby9FX0KvSX80zyEPFq8EDwMfDk737vMO/J7i7uee2N7GjrnOp06nHqYuqK
+6uvqj+tX7Mrs6OwE7S7tYe197Yvtne3I7UruCO+w7ybwqfCC8aHytfOk9LL1/vZy+OX5Afug+0P8
+Q/0U/mj+8P4cAHgBrQJ/A7QD8APoBCwGIwfIB2UIOAkPCpIKxQr2CiMLSAu0C1sMpAxWDAgMPwyx
+DLQMRQzzC8ULewtLC0sLGwuTCvwJgQkuCQkJ4Ai2CIYI+wdCB8EGOgZSBS0E/QLDAZ0Apf+y/oX9
+afzg+7f7SfuC+uD5gvky+af40/cR94P2A/ZX9WT0VvNb8rrxbvHb8N7v++6H7mrufu6c7pPuaO5g
+7nHuNe7E7W7tFO3T7OXs+uyv7D/sRezV7GHtl+2/7Xbux+/N8C3xcPHg8b/y4/Os9Cj1rvVq9tX3
+cPpd/RT/DgDJAS8EEQbLBpIG3AW3BbQGVwfcBuUGSAj9CTQLBwy6DO4N2w/+EEwQbQ86EK4RsRHb
+D3oNTAyeDN4MygsgCmMJ4AnHCjEL/wogC9gLDwxXC0wKEwnhBx4HSgYOBQ8E2wMWBPgDZAOnAtQB
+OAEHAbgA4v/k/hv+kv0g/U38H/sZ+nX5NflH+X35gPlb+TH5mviX9432qPX19ED0UPNI8q/x7fFq
+8k/y+vEI8lXy4vKo8wf0+vNN9BT1uvXd9Xf1A/UC9Xv10PWx9cn1cfZk93v4hvk0+sX6t/uW/Or8
+IP2r/XT+Xf9FAM4AOAE+An4DPAS1BDsF4wXEBmYHSgfnBvcGhAcYCEUI9QfIB1kILgmACVwJXwnb
+CYIKEguvCzMMcQyQDKQMrgyeDCcMOgs+CnQJywggCIkHWgd5B2oH8QZABvwFUgaDBtYFvQQcBN4D
+mQMgA0wCdgEjASoB3QDd/9n+ov7I/mv+lf3l/Hr8H/x0+zT6Avnp+JD5ivm6+AD46veI+CL5/fhv
++HH4kvkk+8v7f/uw+xf9zf59/yX/Af+u/8MAoQHjAZsBngHBAlsEIQVJBRgGnQf6CJAJQAkQCfoJ
+UQsHDGYMOg1+Dn0Pug+MD4EP5w+LENIQjhApEBAQXBD2EHoRmhGmEdYR+BEiEnQShRIqEggSnhIs
+E8wS6xEuEasQOhB3D0cONg29DI4MGgxICzMKTgkHCccI4we8BtgFMAWWBLQDaQJIAbkANwAx/8/9
+XfwG+yj6xfke+Rj4h/eF93b35Pa09Xb08vP784vzS/Ih8bHwk/As8ETvRu7u7TvuVu7g7VbtKu0w
+7Rbt2ezQ7CXtee2g7ZftZO1w7cPt6e0F7l/unu727sPvh/Au8QbyxPJP8wn00vQ19YP1RfZa93v4
+e/kB+iL6l/qt+9v8gv3T/XL+XP87ANoANwG8Aa4CowNIBKoE7ARbBR4GxQb2Bt4G7waWB2QIuAjA
+CLoI4AhWCbYJqwl5CZ4JCAo5CgYKugmoCbIJdwnzCFEI4gerBzcHhQbRBQoFZAQ/BC0EtwNCAw0D
+xwJSAqgBoQCz/1D/FP+C/rL92Pzq+yj7yvpS+n75xvh/+HD4Ivh49+72w/aq9mv29/Vx9QX1qfRd
+9Cv02PNt83Tz4/Ps85LzxPOv9IH1qPVl9W/1RfaG91/4XPjY97r3Ovjg+Fj5YflN+cb5jfrQ+sn6
+Svsj/Nn8W/3E/Vn+iP8EAfEBHQLkARsCNQMhBAMEmAO3A0ME3gRtBcUF2wUOBq0GawfOBxMIdgiS
+CGIIRwhSCHIIiAiBCFkICAiyB70HFggkCMoHegd4B78HJQg/CM8HMQfDBmYG1QUdBWAEzwO9A/sD
+3QM1A5ECXAISAkMBYwC//5H/GwBiAKX/vf4q/qr9R/3A/Mj7w/or+hn6IPrP+ZP5xPkC+iH6LfpK
++mD6Ivrz+UX6qvqL+ij6x/lM+f34C/kS+RD5YPnl+Ur6ufpo++D76/sU/KP8Lv1g/YP96f0//kP+
+SP5r/pf+6f6G/x8AVwCRACoB0gEkAjkCZwK8AucC1ALOAuUCDwNuA+oDLAQwBDMEJwQFBBQEaASM
+BDIE3QMhBJsEcwT1AwEEVwSRBMYEywRHBFsD9gJaA58DUQP/AiMDWQMkA5oCKwImAkYCDAK3AZMB
+fgFxATUBtgA6AOD/rf+m/6f/gP8Q/4v+Wv5P/iv+Iv4U/tr9wv2s/UT9u/xX/Dv8Yvxo/C38MfxM
+/A/8+fsI/KT7LfvO+jb6uvl4+YD5EPqh+u/6Zfv0+4r8kv3T/oT/v/8xAP0AxAEiAjUCUgJvAr0C
+SwOCA7ADggRgBcAFKgb+BvYHzQhXCWYJYwkBCvsKkwufC3ULmAsRDI8M0Ay/DJ0MpQzwDE0NbA2J
+Dd4NLA4yDtgNSw3wDNAMhQwCDLgLwQvBC68LiQstC7kKQwr1CRQKJAqOCZ4IvQcZB74GNQYHBbwD
+JwMDA2QCTwF/ABYAoP8h/+X+yP6K/hD+Z/25/Cv8q/sz+6z66fkr+dT4/Pg6+dr4+vdJ9xH3HPcd
+99r2SPbk9dn1pvUq9Yv07/O08+DzFvQx9GD0s/QB9TH1SfVE9SD1QfXn9TL2u/WL9e71PfZE9ir2
+Rfb89sP3CvhQ+Mz4JPmP+TX6zPo8+7H7Wfzh/BD9c/0K/l3+nP4K/4L/yf/D/+r/mwBWAd4BbAIC
+A64DdgTyBPMEFQWoBSwGRwY/BmQGlQZ/BhYGuQWOBU4F6wTJBAgFRgVJBTIFAQW5BLME1ASKBP4D
+tgPBA9YDrwNBA7MCHQKvAaYBmgESAWoA3v9q/07/eP9t/wn/m/5z/or+jv5h/hb+wP2u/df9rv0p
+/bj8uvza/IL8Dvz2+y38pPzZ/E38tPve+2r8gPwa/MX7zPsU/EX8QfxF/G38ePwT/JH7i/v7+3v8
+r/yv/Nf8Nf26/ff9qP1l/Wv9X/1x/f79jf69/sH+m/6Z/v/+R/89/zn/SP9r/8D/FgAPAMz/v//8
+/2wA4gA2AWEBYwFRASsBHgF1Aa4BbwFOAYYB6QFGAjwC/QEVAmICigKAAnQCmQKMAhwC7QELAgEC
+rQFFAfYAhAD6/+r/PwA3ANX/n/98/0P/Gf/n/pL+Vf5o/nv+J/6F/RD99vzo/Mf8Z/yo+0/7tfv6
++7/7jfvC+0D8fPwI/Hj7rftf/Jj8MPy1+4D7ovvH+6z7XPsD+zv73fsS/Pv7B/w+/M38gf3i/Qr+
+Rv6c/vX+R/9p/y3/wv6R/nn+W/6V/gb/MP9G/8H/ZQDTAAcBEwEWAU0BgwFaAUwB1AE1Ag0CrwEF
+AXsAnQDbALkAVwAPAEIA5QCeAekBpgFXAUoBXgFSAQoB3QDsALYAZgCKANEAuwCwABQBcwGEAY0B
+3QFHAlACAAKjAUoBKAFXAXEBLAGnAEIAXgCpAJIADQBp/xn/Sf9p//L+E/5r/V/9mf2U/VX9OP1i
+/bT97/33/Rn+cP6y/rr+xv79/uH+Wf4V/i3+Av6G/Tz9Gv0P/W/9CP6Y/gz/Rv+A/+z/VgCyAFgB
+HAKcAgUDjgMSBEwEQAQwBDUEeATkBAQF7gQWBW4FzAVqBiwHoAfaByYIZAiYCPwIagm3CfgJTAqq
+Cu8K8QqkCkoKPQqDCs8KAgtKC6kL+gsjDPYLfAsiC/oKpAojCssJsAl+CUsJZAldCQUJtwhICJcH
+HAfhBpsGRwbYBVoF+gSfBPYDLAPVAtMCqAJhAioC5AGdAYwBXQHHAB4Am/9B/wj/wv45/nX9yPx/
+/Ir8YvzH+zP7B/sR+/z62/rg+uT6v/p4+jX67vmD+Tz5MvkW+R75P/n++J74hPiv+AT5Lfkm+UP5
+hPmr+Yn5C/mo+Az5nvmD+Xj5/vmb+jH7sfv0+yT8dfzj/Dz9WP06/SL9V/3O/T3+m/40/9D/7P/z
+/10AwADjAAQBRQG4AToCdgJiAjYCBwICAhYC+gHvASkCVgJUAlYCjwLnAv8C0AKMAkkCBwKZAfUA
+VgDh/4j/Vf9J/1j/Z/91/53/2P/5/9z/3P8yACAAcP/n/pL+Df51/dr8Zvxm/Jb8jPx6/IL8d/yV
+/O/8Cf29/JP8u/y6/Fj8z/tT+wz7IftZ+1j7SPtT+y/74frm+kT7evt0+377lPvP+yz8OvwQ/Af8
+/vsX/I/89fzn/KL8gPyl/NX84Py6/Hb8lfwc/WP9av1+/ZL9wf0v/qr+2P7F/uL+VP/G////3f9R
+//P+C/84/zb/Cv/0/jP/hv95/1r/ef+O/6n/MAD6ADsBywCBANAAHgHfAFIAAAADABcADQDQ/33/
+Xf94/7f/KAB+AJUApwBSAMX/zf8NAJT/q/52/t7+zv42/sj9iv1X/XT9wv3k/ej93P3P/cz9kf0W
+/bn8vvww/cn9u/0d/cf8jfxm/Hz8ZPxv/BT9v/3g/Zr9NP0n/bj9KP7X/X798f2Q/jr+af1x/U/+
+B/8i/+f+Cv/N/2EAIQCc/7j/awABARYB6gAIAYUBxwGYAZQBBAKVAgQDOQNAA1ADhAOLA00DOwOM
+A+0DHQQ6BGcEegRsBFwEHQSnA4ID/ANGBMcDXQO4AxcE4wOuA5EDZwOuAwwE9QO7A5gDfwOHA3QD
+ygL/AeIBCALWAakByAHlAfcBOAJ9AmMCCQLlAd0BpwE/Aa0AIwD5/xMAFgARAAYAzP+m/7L/xP+u
+/3P/ef+l/7L/7v87ACMAvv9w/13/Pf/M/kv+LP5I/l/+4P6Z/6//S/8E/9H+z/4d/0f/T/+P/87/
+4//r////CADV/47/xf9WAJQAxACAAVwCuAL5Ap8DTQTkBK4FgAbvBggHWAfJB8wHfAcyBwkHDQdD
+B3gHXAdNB7cHPQiECHgIWQhcCGgIkAifCFMI9ge0B4sHZQcjBwUHLAduB8MH+QfQB5EHrAfSB5kH
+SwclB98GEwYNBZYEbQQEBJADRgNMA78DBwS1A2QDKQO+AmcCIgKbAcwAPAARAMz/Yv/d/vv9+PxT
+/C78OPwv/B/8IPxd/J/8hPxR/Eb8Fvy9+437cPst++L6k/o2+uX5svnG+Sj6k/q0+oT6SPo6+mT6
+jPrL+k37lPt1+1z7QfsR+xT7S/ul+yD8g/yO/GL8c/yZ/EP83fsZ/If8jPx8/J/8z/z2/O/85Pwp
+/Yj9xv3q/fn9D/47/mX+gP56/m7+sv4Z/zr/Tf+L/8z//P/8/6v/Y/9n/zr/0/67/tz+9f4r/1r/
+K//H/qb+tv6Q/j/+G/4u/i7+Jf5m/q/+b/7p/YH9Dv16/An8GPxP/Dz8B/ys+z37+vp++tL59fnI
++kr7dPud+837H/xz/K78wPx0/BP88vu6+y37jfow+hf6Kfpj+qH6vPrV+jH7sPvh++b7RPzn/FH9
+PP3e/Lb8tfyB/FX8afxs/H38Qv1H/pD+gP7N/mn//v8qAOb/s/8PALAA2QB2ADkAmgAYASoB8ADQ
+AFQBOAJTAmsB1QCqAf0CDAP3AWYB2AEQAmEB0AA9AQcCVAJaAocCvgK+AloC0AGiAdQB1QFSAd4A
+1ADeANQAtwC+APUAzgAqAL7/FwDsAA8BKwCL/8z/HADx/5z/V//m/of+tP4X/x3/5v6l/lj+Jf4m
+/nf+1f6x/iX+rf2r/RX+Sv5K/mf+c/6d/hn/UP/U/mP+h/6b/qj+DP8M/6L+1P52/8H/0f8nAN8A
+OQHiAK4ACgF6AYkBhgEGAqgCuAJoAl0C4QJhA2IDIQMkA8EDdASQBCEEfgNZAzYEEwWtBJwDcwOB
+BGMFBQUTBMEDhASqBe8FTQXrBEQF7gVHBu4FHwW2BAoFXgVrBYoFYQWYBOYDAARTBP8DWgMiA24D
+/QM6BHQDDAIuATEBpgH9AaoB9ADKAEABkQFDAXQAnv9O/67/PgBWAAkA8P8tAGYARwDG/zz/H/9h
+/7X/v/9K/9z+//5A//r+Q/65/dT9Yv64/m3+3v2x/Rz+e/5g/lj+l/7F/sv+A/9z/57/a/8H/77+
+/v6U/9v/nf8v//b+Rf/m/wAAf/9C/3H/rP/p/wkAPQC+AP8A6wAVAVQBOwESAR0BMAFAAXkBygH1
+AQkCWgLDAgIDSQOgA/QDPARPBBEEwgPCA+MD6QPRA3cDFAMtA40DvQO9A5oDhgO1A9YDygO1A3cD
+IAPeApcCSAIJAtEBmgFaAQIBwwDJANMAwACYACcAwv8ZAIwALAC3/6f/cv86/03/av89/7n+Cf6Q
+/Y79uv29/cD9vP2U/bj9Ov6I/mn+Qf40/gr+0v2h/Ur94fya/I38ufzs/Nr8gvxy/N/8OP1M/Vv9
+aP1s/bL9Vf65/oX+NP4U/gr+1v1f/Q79M/2j/TD+0v5a/4z/qv8AACsA2/+I/5T/h/9G/2H/tf+5
+/4n/af9c/2T/iv/e/0gAdABGABQAKABZAFkAEwC2/2v/Kv8A/9D+bv4r/lb+sv7q/uH+xP7w/lb/
+pv+h/0r/Bv/r/tH+nP5X/iv+Af7b/c39sf2V/aT9yf3j/e394/3i/Q3+Rv5Y/g/+hf0f/eH8t/zB
+/OT84fzX/BL9bP1u/eP8X/yb/Dr9YP0d/fz8Gv1t/cH91f3J/dP9AP5c/pj+Xf4z/o7+Bf9W/4b/
+YP8m/yD/NP9c/3//s/8JAC4AOABuAHQAAgCB/3H/EwANAZgBegElAQ4BHwEQAewA5QBPAfwBYgKa
+AvYCNAPiAjUC+wFvAvwC7QIeAjYBCwG8AVwCSALNAYEB2QF7Am4CvwF8AbABxwHTAdEBlQEBASsA
+4f9JAHUAGQCk/1X/kv9NAJMAAQBL/0b/7/90AF4Azv8g/7f+wf4n/2n/Df9a/jv+tP7Q/nj+Vv5I
+/h7+Lf44/gn+1P3T/U/+6P4L/wP/M/+G/7T/Uv+i/qL+df8LAHr/dP5S/iL/2v/G/zP/q/7+/mMA
+8wDO/9v+Nf8+ABgBGAGNAIYAIwFnAeAADgB9/5j/oADYAQQCSAHXAAgBSgFjAZgBBAI8AgQCrwGK
+AawB4AHwAQ8CfwL/AiwDGQMLAwED+wIlA1sDVQMGA3UCugFBAXkBCQIgAtEBuAHEAZ4BGQFIANL/
+PADgAMoANADJ/7X/5P/t/37/Bv8G/37/GABZAPr/Lv+j/r3+MP96/zT/rv6S/r7+sv5B/sb91/1L
+/qz+fP6Z/ff8Lv2b/bj9o/2E/WD9MP0y/bf9ff7g/r/+2/5r/9///f+h/0H/b/+y/7f/p/+F/2P/
+Z/+R/6b/Yv/t/tf+av8wAIUAbAA3ACoAWgBYAP//xv/U/w4AaQCRAHUAYABFAA4AAgAjAGYA/wB+
+AWgBWAFtATsBHgEzAREB2gD8AEUBTAExAUEBaAFhAVMBZAFgAWwBrgGzATwBxQCtAMkA4wDDAHkA
+cACvAM4AlQBdAJ0ADAESAcQAogDGAMkApwChALsA1QDoABUBRQElAdsA3gD/AA8BLgEIAYIA9v+2
+/83/1P+E/y//H/9S/+D/cwBuAPv/k/97/9T/JgDh/2P/Ov9B/1b/eP9p/1D/if8MAI4AtQCyAPUA
+VQGKAVwB+AANAYIBkgFDATIBSgFGAVIBIQGKAFgA9ACyAQcCDgLyAdcB+QFPAlEC5AGXAYIBZQE6
+AfoAygDIAO4AIwEaAZUAGABUAOYALQFSAY4BxwHOAZ4BhQGeAXMB3wB5AJQAywDNAKoAewBsAIsA
+rwCvAJsAzgA9AVwBMwE8AVAB/gBPAKj/af+J/6z/5f82ACoAzv+l/5X/FP9R/u/9Iv7V/nj/af+/
+/i/+TP7K/tz+lf6I/rP+Af8p/xT/CP8S/zP/Yf9e/xL/yv5r/sH9u/1//qP+F/6s/Vn9dv0u/sL+
+2P6t/rz+QP/G/9v/kv+E/8//AAArAHkAiwAhAK//k/99/yP/3/5B/y0A5QDYAD8Ayv+7/9j/6//Z
+/6n/tv8zAL8AywAVACz/Df+v/zYAYQBNADkAWABiAF4AjQB+AAIAxP8kAJYAVACB/+n+Df+g/9L/
+Rv/f/iD/KP/Z/tD+lP7x/dX9GP7H/QT9nfwD/dP99f0k/Y38y/wS/fH8l/xF/Ff81/xL/R79n/yu
+/Pv89fwK/Zr9Xf7P/q3+P/7K/Xr9mv3v/dz9Y/0w/YH90v34/RD+1f2O/ez9vP5P/3X/ov/p/9v/
+v//u//7/rf88/zj/rP/T/03/ef7Y/eb9vv6P/1z/wf4N/9H/6/+d/6j/+f9CAF4ANQAUACUAOQBS
+AJAArwBUAAEAVwC8AIYAPACPAEkB8AFRAkkC/gGdAUYBLAEPAbUAYgBnAJcAiAA4ABcAWgCiAKcA
+iQCMAKYAnQByADEA8f/G/63/o/+Q/27/XP9s/5n/5P9OAJsAaAAeAGUAswCcAKAAtgBsAA8ABwAc
+AAQAvv96/3f/t/+1/1n/Jv8+/1b/Vf9c/2//hv+y/8f/nP9+/7///P++/zb/8f4c/1b/af9T/27/
+GQDHANkApgDAACwBngHMAccB8QFgAr8CugJnAicCFQIDAtsBpwF5AVsBfwHdAe0BugGaAXwBdgGN
+AXoBQwF5AQICAwKoAYMBQwEAARwBWAGWAbsBrAHlAW8CqQKWApcCpAKsAsgCAwMiA+UChwJKAkEC
+SQInAt8BnQF+AXEBYAFOAQwBuwDVACsBGQHDALQA7wATAQYBCQEKAesABwFTAU0BIAEuAU0BYwFd
+ASMB8gD1ABEBKQFHAXQBdwFEAQsBAgE4ATYB0ACXAJoAgABwAGgAWgCeAPEA6wDDAIoAXQCBAK8A
+oQCCAH4AggB4AHUAiACzANgA8gAZAUMBhgHBAa4BiwHAARcCKgIGAsgBkwGqAeoB+wHvAecB4wHf
+AeUB8QHgAagBZgFcAYUBnQG2AdkB8gEGAuMBfAERAdAApwBuACIAsf8n/w7/I//C/mT+dP6p/tr+
+HP9j/4L/Rf/r/gX/Sf8R/4z+V/5p/jP+2/2x/Y79k/0H/pL+tf7U/kj/lf90/xb/sf5u/k3+M/4e
+/g3+A/4S/jX+L/4K/gT+B/7w/dX9/P1Y/oj+fv5y/o3+yv7c/mb+tf1r/XL9SP01/Yv93f0C/gT+
+of0F/dz8J/0T/Zz8gPyU/I78o/zK/Oj83Pyk/Kv8Iv2O/dX9Lf5f/lX+Qv6G/h7/cf9q/53/CQBI
+AEQA/v+V/yf/jP7f/Yr9kf1l/ez80PwZ/U/9XP03/Q/9PP2D/Zf9rP3Z/QX+Bf7H/YP9W/03/R/9
+Xv0O/s7+HP8I/zH/rv8HAAYAqv8E/5H+vv4D/+X+uv6K/kL+Qv5g/lv+av5q/k/+df65/rT+hv5y
+/mv+Wv4n/tb9nf1o/Sv9TP2f/Yf9gP0X/rz+Gf9D/0L/Xf+S/73/KgCXAKMAoQCLADMA5P/F/7P/
+h/9z/4j/lP+e/7n/2v/a/8n/4f9UANkA0AB6AGMAdACVANQAJQFuAXQBLQH9ABcBDAG/ALgA6AAW
+AVEBOgHlAOMA8wDPAOoAMQEuAUQBoQG7AYMBQgHmAHEAZgDwAGQBYgFeAakB5AHRAaMBWgEUATUB
+jQHAAdoBwAGHAYQBuQHxAQICHgJ9AsMC3QIQAzwDPwNLA3sDrAOjA10DEQPNAosCbAJjAjEC7wHQ
+AbMBsQHSAakBSAE4AYsB0QH+ASsCGgIjAo8C5wIDA94CdgJUApsCgwLbAXcBZwFZAZwBLAKSAqUC
+uwIzA8sDAQS6A1oDQgNPA1QDJAOqAhgChgFFAVwBVgEsATsBkAHtAUsCuwL2AugC6QIMAx4DEAPJ
+Al0CHgIGAscBZgEpARIBAAEKASsBUQFCAeMAywADAdsAiwB4AEQAIQBZAFIA9//R/9v/1//y/x8A
+AgDY//f/AwD1/ywAcABLAPL/2f/a/97/EgAbAOT/1P/m//X/EgA9AD0AFgAgAIAA8QAIAdYAoQBp
+AEQATQBGABwABAAJABEABgD3//H/1f+X/27/f/+m/5z/bv9i/47/1f/w/6f/SP9h/7T/xP+o/0z/
+1P7v/mr/pf+t/5H/b/+c/9z/yv+b/2//Of8i/1v/wv/Y/4//dv++//7/7//N/9b/3v/O/9P/0P+q
+/5//uf/G/5//RP8o/3T/of+D/27/gf+m/6D/Zv8y/wn/xv6k/uX+Df/W/sD+6P4C//r++/4w/1//
+NP/X/qH+kf6G/lr+Av7K/ab9TP0f/Tf9Nv0k/R/9NP1V/V79Qf0p/UD9PP3i/I/8cvw3/O/7+PtL
+/Kf8+vxA/U79Vf2k/fH9C/4K/tb9h/1s/XH9YP1G/SL95vy2/Nv8Rf1r/S/9+fwZ/WH9k/3L/fb9
+Cv4r/jn+Ov5Q/iX+t/2M/Zn9hP16/YP9Yf0l/Tj9m/26/Y39jf2p/c79Df5A/oX+yf6h/oP++/5A
+/5z+zP2c/bP9rv3O/RH+Hf4j/ob+6/7r/sz+vf7O/jn/ov+V/3T/kP+9/8//m/9k/3r/pP+3/7L/
+wv/5/z4AqwAjAVoBYAFoAWIBSAEYAbkAeACXAMsAuwBpAE0AYwBMADoABwB+/2P/4f8ZAAgAKABJ
+ADkARwCEAIcANQDK/67/BABCADkAawDzAHIBqwHVATECYQJlAtMCUgNSA0EDVQMmA40C4QGJAXcB
+dwGUAdUBIwJ6AsUCtwJaAjwCZwJvAmQCbwJwAlcCNQITAuABoAF6AXkBsgE2Aq8C3ALlAggDPwNB
+AxcDCQMBA8wCbQI1AkcCIgKkAVkBWwGAAdgBIgIuAiwCLQI3AnECrQKDAjQCSwJqAhgCrwF5AUMB
+FQEzAYUB0AEEAhUCKwJoApoCpwKqArYCugKqApsChQJNAgsC0wGSAUEB7wDeABcBYgGpAcMBqwF0
+AVQBmAEJAj8CLgIEAuwB1AHCAcIBoQF/AZsBuAGsAc4B9wGaARQB+QDpAKcAawBFADwAGwDv//3/
+AQC8/4//uf/q/xAAWQC3AO0A5QD7AEIBMwHSAJkAbAAwADYAZwCNALsAwgCPAGwAUAAEAMT/sf+b
+/4v/xP8VAOv/fv9z/33/E/+u/uL+Lf86/37/0//L/67/e/8K/77+zP7F/k7+2P3u/T/+GP69/fD9
+YP5t/lz+c/6V/tf+Iv8Z/8b+S/73/QL+1P0h/aX8svy6/J78tPzF/Lb8Cf3X/Y/+0P69/qz+sv62
+/qT+a/4+/j7+Iv7U/bz9xf1n/Qn9PP2p/d398/05/o/+wP7R/rL+gv5//pv+of5U/gf+HP41/iX+
+KP5M/oz+0/7y/tn+5f5D/1b/6f6f/sj+9P7c/qr+oP7C/sf+sv7A/sj+nv6I/p3+qv6t/tD+Av8W
+/y3/TP9O/zj/L/8o/+3+uf65/rT+nP6s/uj+/v7x/hD/Vf91/2D/XP9z/2r/bf+Q/3//VP9X/0v/
+/v7y/lr/hP8U/6v+6f5u/4D/Bv+6/vP+Hf8H//P+2f7X/hT/KP/c/rX+u/57/in+Ev4Z/jb+Uv5r
+/sj+Nv9P/2X/w////+H/1v8lAIMAngCqANoAyQCCAHkAnwC9AMAArgCYAIMAcgB4AKcA3QAOAUoB
+cgFoAV8BcwFfARgB3wC2AGkAFAD6/xwASQBnAIUAmADLABcBIwEfAUQBUwFQAWYBiwGvAaQBZAFR
+AXcBYwEKAdgA2QD0ABkBBgH5AB8BGwENAS4BUwFNATgBSAFPAfYAhgCYAOAA7gAGATkBPwFpAb8B
+ngFKATwBKQEaAXEB1QHNAbABwwHDAaEBwQEMAi8CTwJXAgQCwAHZAewBiwEgAVgBpQF2AToBMAFT
+AY4BoAGPAacBuwFYAeEA/ABoAXsBKQGyAEEAXgD4AFUBYgFRAUABXgGWAZkBawFNAT0BKAEqARwB
+3gC1AL4A3QDjAPcATwGTAYcBcQGHAbABxgHKAeIB+wHaAZUBYwFJARgB3QDKAN4ABgETAQoBEQEJ
+AQ4BQwFdAUEBNQFTAW4BRAHaALAA3QDaAJ8AVQDY/0H/6v7l/gr/IP/t/r3+Cf+E/5v/lv+u/1v/
+5/65/mf+If46/j/+7f28/RP+iv6L/nb+5P59/7H/v/8TAFIALQDj/4b/Yf+v/87/hP9Z/3r/2P8v
+AAYAd/8l/0//g/90/1P/N/8r/0H/JP+3/m/+WP49/nv+HP9t/47/4P8NAAUA9v8AAPH/X//0/lH/
+jP8o/7n+mf6+/vf+/f7a/uD+Bf9A/5T/tP+D/0z/cf/a//v/0v+5/3f/6/54/mT+hf5p/u79kP3T
+/WX+lP5g/jr+Lf4x/mv+jP53/oX+qf6v/sH+2P7Q/tf+1/6q/or+jP54/lP+Q/5l/rj+8P4X/y7/
+9P6j/nr+Vf5V/rr+GP8A/+j+Ff8p/wv/6/76/h//7v6b/qn+r/5b/i3+O/4Y/s39wv3W/bf9wv0M
+/vT9kf3I/ZX+Bv/+/jf/tv/f/63/cf9o/6r/2v/M/6P/ef9V/yn/Df85/4//mP9d/zr/Y//i/0sA
+ZwBtAIcAwQDqAM8AmgCTALgA0ADkAA4BCwHEAIwAgQBkAD8ABQCn/4n/kf9s/zj/DP8B/1j/7v85
+ABQAsf+H/9r/CgC4/0X/Sv+9/w4ARgC2ACwBKQH7AFQBtQGVAT8BBQEaAVMBZwFkAVQBQAFUAXQB
+PAHeAOsASwFwAVwBdAGmAbQBdQEYARcBPQEOAbwAjAB2AG8AYwBPAF4AnADdABoBbgGxAawBrAEz
+AsMCmgIfAsMBXgEYASsBKAH5APkAEwE/AXIBhQGmAfoBTQJoAlsCVAI0AtkBewFbAUsBLwEvAUAB
+MgEYARsBOAFlAY8BxwE6ArcC6wLxAvoC3wKvApUCagJBAh0C1wGdAVkB3wCLAGsAQAAZAPb/AABW
+AHUAGADX/wcAOwA8ADQAFACz/2n/sP8RAPD/hP8Y/+3+Ov+W/7D/qv+V/6H/AAA9AOf/hf+M/5z/
+fv91/4f/a/8W/+3+/P74/hD/Sf9a/1r/cv+b/8//3/+y/5P/jv9r/0n/YP+E/33/Yf9T/3b/2f8l
+ADAAOgAuABUAQwCJAJgAdABTAEgARABiAIgAagAfAOv/z//l/x8ADQCr/1//PP8x/1P/gv+R/4b/
+W/8s/z//Q/8C/wj/Mf8Q///+F//+/pr+Uf5y/rz+7f4d/1z/ov/A/7b/tf+j/3X/Vf8+/yf/Gf8F
+//L+6v7Q/rT+5v5J/3r/YP8f/wH/D/8D/9P+p/6n/rb+uv6+/pj+UP4i/jb+Vv41/ij+av6B/g3+
+tf3p/Qf+3/3Z/eb98/1I/qj+w/7E/sT+6v4O/8T+Xv5Y/n3+YP4i/jP+hP6R/nz+3v5X/0b/Mv+D
+/6T/a/8t/xP/I/8z/1r/lP+n/7P/8P9PAIYAcwBOAEAATQBmAIkAsQDEANQA7QAPATMBMgEiAQ8B
+wwBsAD0AKQAxAEIARgA0AOn/r/8gAMQAvwBiABUA0f+1/7H/ev8w/wD/2v7y/hX/Df8//7D/8P/w
+/xQAYgB/AGgAUgBKAF8AdQBJAP3/7f8nAAAAgP+f/yYAagCDAJ8AuwDJAJIADwCi/6b/8//8/7H/
+i/+u/6z/OP/s/jL/nf/N/9v/IQB+AJQAgwBqAEgAMAAoABsA0/+i/xAAmQDNAP4AJQElASIBLQEv
+ASkBLgFBAW8BjgFqARsB4gDIAJ0AZwBqAIwAjQCVANkALwFfAXIBVgEeASoBbgGqAd0B+gHqAcoB
+yAHEAZEBKgHQAN4AKwFZAWQBcwGoAewB/QHrAeAB5QEPAikC8wG5AYQBIwHQAMsA5wDrAPIAJQFM
+AeYAUABmALQAhABKAFYAiQCcAC0As//A/9L/jv9w/57/2v8mAGkAXwAlAPT/qP9h/3T/pf+L/zj/
+J/90/63/jP9K/z3/a/+m/9T/AgA+AF4AXQCCAKoAogCDAEQAyv9r/4j/4f8dAEcArwBPAcsB/gHf
+AYsBSAE+AUwBMQHNAGIAPwAkANj/gf9j/37/pf/d//z/6//0/xEAQACJAJwAdQAtAOX/5f/5/7j/
+Vv8x/zT/Nf9g/9n/YQCRAJMA1QAaAfMAhABJAGwAmACAAEwANgAPALn/Y/8l/+X+3v5L/5r/hP9z
+/2v/V/9Y/1f/Y/+C/1v/+f69/rv+xf6N/hv+wf2+/e799v35/fb9x/3v/Yn+y/51/kb+ev5//lz+
+Pf7//ef9BP4F/vH94v3N/eH9K/41/vH98v1P/o3+iv6F/oX+fv6H/qX+sP6c/nb+QP5V/s/+JP8a
+/y7/l//+/yEABwD4/wcA+P/W/xIAewBpACcASQCTAIAAFQABAGkAlAB0AJIAxwCzAI4AnQCyAKcA
+fQAbAMH/8f9tAH8AJAABAEIAdABSACQAMABYAH8AlACJAGQAVwBZADIANQC9AEEBDgGAAIEA+AAG
+AbcAsgDPALwAswCfAEoAAgDi/8r/wv+4/97/IAAaAAoALQBLAEYATQBgAFEAQABUAFsARQAkAPX/
+2f/8/1UAogCwAK0A2AD8ALgATQA7AJQAFwEkAakAPQAEAAYANQAWAL//zf8EANz/v//q/+7/xv/T
+/zkAtgDnALEARgD//xAARgBNADYAUwCkAA0BjQG7AVkBCwFMAdUBOgJKAksCdwKeAo8CXQJOAh0C
+nQFnAa8B2QF1AfAA8ABFAVkBXQG9ASICOQIGAr0BngFyAfcApQDKALkABgBp/7f/egCOAAQAsf/M
+/zQAtAAbAT8B9QDOAGkB7AF/AekA2gDqAIQAu/86/zH/PP9P/4H/tv/7/0wAbABcADsABwAJAHgA
+wABrAAAAMgCfAIYAEQDK/6f/i/+a/+v/PQAYAIP/Xv8KAI0AVgDy//L/QQByAFgACQDS/8//3P/5
+/97/dP9w/+f/EACl/wf/sP7d/jn/ff/c/xMA6f/B/8b/s/+J/4n/h/9M/yb/VP+1/w8AMAAFAML/
+5P9lAIsAIgDC/8r/5f/T/6f/bf9j/8P/QgB2AHwAlADWACIBFAG/AHAA/v9j/wX/9v7j/qH+Sf4O
+/kP+uv7O/oD+Rv5j/vP+sP8FAN3/fP9K/6X/2/8C/+H9pP39/R/+Ef4I/vf99/0W/l3+oP53/jX+
+tf6t/wQAlP8S/+r+BP8N/8H+RP4O/nn+BP8N/7P+Q/4q/pT+/v69/iv+Zf5L/73/g/8q/wb/LP9W
+/yr/Cv9r/9f/yf+X/4L/a/9+/87/+//t/+T/5//0/+z/pf9f/2f/m/+r/2j/6P6v/t/+/P7b/qb+
+tv5C/+7/PgAVAM//6P84ABkAaf/W/g//mP+X/yL/sf50/nj+y/46/3D/ef+j/x8AwQAHAc4AeQBc
+AJ8AEAHpACAAr/+1/27/x/5f/mb+uP5f/x0AiQB/ADMAEAAtACwA8/8QAMsAdQF8ASoBxQAdAFb/
+8/73/hH/Mv9J/2f/1v9tAKMAqADdAP8ACQFEAZYBrQFrAfsAvgCbADwAAQACAM3/k//K/4AAKgE1
+ASsBvQGXAiID8wInAqAB0AE6Aj8CxQFwAeABjQJuApwBRwHGAToCXgLCAlsDkgNSA+gCZQLWAWEB
+0gA8ANL/Wf/t/rv+hP4G/nL9af0A/kf+8/0L/uz+j/9U/+P+tv6T/k3+Df4D/ur9mv1//cP9A/4Z
+/lL+qf7h/hb/gP8BADEAAQDe/xEAZQA0AJj/av/K/yIAGAC3/3D/rP9RANoAygA9AOT/JwC9AA8B
+0wB2AG0AsQAjAYkBiwEgAeEATwHzAQMCcAEbAZsBIwLWATEBGwGwAUMCQwIHAvsBEQIpAtEBEQHH
+AAkBEAGkABkA7P+IAEkBMQGNABYAHwCuADgBKgGkAEgAYgCUAJUAlgCRAEsAIwBxALwAuwCzALsA
+0QD5AA8BDQEFAewAzwCyAGMADwDp/+X/EgAtAPH/wv/d//b/7P/O/87/AQAgABUABQAAAPP/wP95
+/y3/Lf9m/xz/nP6c/sj+6v4U/9L+Nf4J/nz+Df9e/0D/GP9R/3j/c/91/0H/8v62/qr+//41/5r+
+3/1F/ln/w/9r/z3/xf9+AIkA+v+C/2n/pP/G/3X/Sf+7/zUAIwCg/2X//v/aABwBxQCVAPQAUwEQ
+AVUA4v8mAJAAjQBRAOz/Y/8x/2//x/8XADwAEgDg//z/9P9T/5L+Lv5f/hv/v/+8/3r/k//u//z/
+iv/Z/k3+cf4M/y7/0P64/u3+yP5m/lX+bf6a/g7/Tv8M/+r+Jf84/+H+iP6q/g//M/8T//j+Gv9Z
+/17/+f41/n39tP3l/tf/DADs/6z/d/9m/zD/Nf74/Kz8E/10/Rj+Kv/8/zsAEABj/8j+B/+B/37/
+OP8+/9P/ZgAtAEj/bv7M/XL9fv2o/Rj+Lv90AAYBpgBEAGcAlAC4APUACQErAcsBZwIaAvIAyv83
+/13/0P8OACYAPQBsANAAFwG5ADAAPwC5AGABGwJoAi0CAQLSATYBhAAXAO3/JQDMAHMBqgGIAYUB
+lgFtAUMBGAG/AMcAhAERArgBDwGxAL0AFAELAWsAPQARARMCdwIGAi8B8ACBAdkBOwFbAOP/sv+Z
+/4j/Nf+b/pP+e/9hAHgAMgA9AH0AqQCWAGAArwBjAWgBsQBBACoArf8X/xL/dv/x/2AAswC7AIwA
+gQCyAAQBPQFAATgBVgFZAfEArgAFAV4BfQHOAQgCwwFkAQwBkABVAHUAgQBpAGQAXQAsAO7/q/92
+/3z/tv8WALMAUwGEAUwBMQFcAV8BOgFCASoBwQBbABkADAA1AIkA/gBVAWYBPQEwAW8BewFGATYB
+MQE2AV8BbQE1AeAAtADNAC4BpwHSAcsB+gEpAu0BwgH8AfcBmAEzAbsAdABiAPr/d/9U/zv/Mf+C
+//3/SgBlAGEANAAsAH0AdQDT/1H/OP9Q/zb/jf7C/Xz9jf2G/YD91f2k/on/FQB8AOQAJgFdAVAB
+tAAOAMD/2/8nAOz/S/84/7P/CQD//7H/b/+W/wIATABYAFcAwQBZASgBJQAr/9n+8/7C/mX+Tf40
+/ir+mP43/2b/Cv+p/qj+J/+1/5//Tv8+/yb/Iv81//T+h/4o/tX9Av6e/rX+Yv6F/t7+7/71/vH+
+lf40/j7+g/6E/jr+GP46/mH+QP7k/fH9mf5F/5n/wv/Q//z/hwChANb/Mv9F/5b/lv8I/4j+r/4P
+/wP/rv6h/h//wP/c/4D/Uv+O/7T/Yv/b/oz+rf7y/sj+YP4l/ur94v0U/qT91vz6/Pr9uv7b/q/+
+mP6+/sb+av4w/oX+9/4J/+3+Bf9H/2v/Xf8z//r+rv6G/vj+uP8EAAMARADeAGIBVAHDAB0Azf/V
+/9j/lf81/1f/8/8ZALH/dv+F/3b/G//V/hH/p/9SALYAbgDd/6H/qf+f/3b/VP9p/4//sf/e/5z/
+J/81/0f/7v7d/pj/pwBNASQBnABYAPz/O/+z/pH+kP6//g//YP/i/1sAPwDD/4L/tP9PAPgAHAGr
+ADcAFAAUAPf/s/9j/y//W/8XAOMAGwEWAUoBWQEXAe4A/wAgATQBWAHTAU4CUQIbAr0BJwGKAPr/
+t/8gAP0AuAECAvQB6QEQAjsC+wE3AZMAlwD4AEgBWAESAcwA0wD3AA8BFgEPAToBtAEEAuABwgHe
+AaMB1QAQAPT/UgDVAEUBWwE7AS0BGAHxAO0A7gDiAFsBWwLbAm8C0gFsAeoAOgDF//T/qABWAbMB
+0QHUAcQBeAHgAFMAHgA2AGMAgQCrAOYABAH4AOYAfQC9/57/UQDjAOkAtQCIAH4AXwDm/1D/Av//
+/kD/tv8HAGYAAgE0AfEA0QDBAJ4AxQA+AakB0wHxATECPwL8AZ4BFgF/AFUAsgAnAU4BGwHOAK4A
+vwDcAOgA6QD2ACwBiAGoAUABhgDJ/z//Lv9m/2n/S/+J/yUAmgCCAAYAs//G//v/HQA7AGYAaQBR
+AEsACwCR/x//wf7E/l//BAApABcAJwBoAN8ADgGnAEEATgBqAAwAY//E/jn+Av5M/qf+vv7n/lv/
+/f+CAI4ARwA6AIcAxQCtAGAARwCUALkAIAA7/+7+f/9WAI0ABgC+/zQAuQCdAAUAov/k/2wAmgBg
+AAQA1//b/8b/jv9Z/0r/R//+/qP+if6k/hf/kP9w/w3/3/7K/pb+Ef6Q/br9NP4i/tz9Cv5M/jn+
+2P16/Vb9bP3n/Vb+Qf4S/jn+nv7I/on+AP59/YX97P0K/qf9HP0P/aj9PP43/t79tv3p/UD+YP5b
+/mz+hf6Q/qj+0f7y/vf+qf4y/g7+Ff4K/vP9wP1k/Rb9MP1+/Yn9QP0S/VX9xv0x/oX+av42/oz+
+7/7I/nH+Nv4U/jr+Vf7w/Yb9pv0D/hr+O/7P/kb/W/97/5H/ff+P/77/uv+j/6P/nv+t/8L/b//5
+/v3+Qf9D/yr/MP9d/7z/HgAvABcATACjAKcAcABgAJIAygC+AHEARwCAAN8A/gC7AHkAlADCAKoA
+fABwAGoAZAB3AIAAdAB+AJ4AsACxAKoArwDgAAUBxACGAMIA/QCzAD4AQgCUALEAtgC2AIcAewDb
+ADkBEQGmALwARQGaAaEBqAHiASECKwIeAhUCBwIEAu0BoAGMAeEBCgK5AVkBcAHaARwCEALWAcQB
+FwJhAiACnQFbAYgBzQGsAUMB0wCbAMkA9QDtAPgA6wC5ANoAKwE9AUMBQAHtAL0A5gC4ADQACwA9
+AJIAOAHiAf4B4QFIAhkDfgNlA2UDfAODA48DcAMmAxoDOQMeAxMDXwOyA/IDNgR4BNwEgwVCBp8G
+fQZIBggGqAVWBfoEkwRlBI0EuwTEBPgEeQUCBlYGZgZQBj4GQAZgBmEG4AU8Bd0EVwSaAwoDuAKr
+As0C0QLIAgADTQNdA0IDMwMvAxEDywI1AlABngBSACMA5/+C/xb/0/7Z/vT+u/5u/oL+0P7k/qf+
+dP5j/lb+Gf6X/RT9t/x6/Fz8xPwM/lb/wP+F/xj/o/5E/gL+c/2Z/E78tvzr/IP8+/un+8P7rfzB
+/VL+Gf8gABQADf9T/g7+2f1+/bT82/vE+zH8Nfys+xX79frE+zP9U/77/sz/qgCzAMn/nv6w/SP9
+wfwJ/BT7q/oM+4T7hftf+6v7tPws/lH/5/8tAEwALgCi/7r+ov2C/G37cvq++XT5uvlI+m/6OfqC
++qn7w/z5/Kz8evx8/Gr8p/sh+s74gvio+DL4V/ej9i72XvYG91j3YvfF95T4Tfle+d/4nfjC+JD4
+mfd29g72OPZK9lb2pPYM94H3H/i++CT5f/kA+mv6lfqB+jj67Pmb+RX5l/iB+J/4pPib+Ln4QfkA
++oH6tvr5+nz77Psh/Dj8QPxi/JX8mPxk/CP8CPwg/Dv8UPxa/BX8r/vx+9z8SP0g/W396f32/fT9
+AP7i/ZH9Cv2t/Mn88vzZ/PD8cf3O/fH9Ov5G/rD9F/1S/Rr+tP4t/5T/PwC6AWcDjgRYBUUGzAeg
+CTkLjQx9DeIN5A2aDfUMXgxPDJoM7wyMDdYOpRB9EhMUmhWFF7cZZBvUGyQbERovGWAYKhekFVMU
+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
+nQw6DDcMaQxNDLILGAukCg4KfwkuCf4IvwiMCKMI/Qg7CQMJWQiNB4UG1QTtAp4B1AAAAPb+Af4h
+/Tv8bvue+sz5bPmM+az5w/n/+Qf6m/nO+NH3//Z39vb1PfVT9HvzMPNt8z3zqfKq8unyBvON82j0
+OvX29VH2PfYY9tX1e/Vg9Zr19PU29iv2pPXh9IL05/TM9Zb2Rfce+BH5DvrR+iv7hPvY+837vPvW
++/v7PPxp/Fr8Kvz/+9j7wvsT/Oz8Af7v/oH/pv+Y/73/MgDEACUBTwFWASUBzQCLAHIAXwAuANn/
+bv8l/xT/Df8W/1L/aP8C/6D+rf7H/tD+C/83/zH/Nv/2/jL+kf2L/a/9i/0b/XL8xft++6P7y/vY
+++37z/tv+077dfuR+7T7xfuY+037//rN+tn6+/rl+rb6hvo6+v356vkA+i/6d/r8+mX7N/uW+kX6
++frN/G//OAL2BBoIaQtsDp8R/hSLFyEZRhrZGpkaJRoUGh8a4hkxGU0YrRdaF6UXDBkBGwAdNB9p
+IYYjuCWaJ/8oJyp7KmQpMidmJFkhDR5fGo0W1hI6DwYMwQljCI8HWgfMB44IawkwCswKOAsrC4wK
+LwkUB4MEhQEA/ij6iPYS847voOza6rrp0Oh86AXp8Om56mrr++ti7MHsQe0d7tbuke617RXtkOzo
+6yPrXurg6bHpi+mk6UfqF+vy60ftJe/a8CryuPOT9YP3zPla/HD+nf98AKoB8AIVBP8EkwX7BS8G
+FQYzBr4GVwfGBx8ItAiICUEKAws5DL8N/w66D0MQ7xCWEeIRDhI/EgkSQxEGEHgODA3yC84KlAlg
+CBgHxwXMBH8EUQTHA1oDNgP3AnkC4gFmAR0BkwC5/+/+9/24/HX7Tfor+cX3J/ab9Bbzm/GL8OXv
+YO8G7wXvau/p71nw7/Cp8UjyuvI58+HzUPRS9Fb0nPTE9Ir0PPQk9Fb0y/Rz9XT2mPdo+DX5jfom
+/H79uf4qAIoBmwL1A9QFkwcSCS4KOAqmCVwJYgnACWYKrAp7ClEKHwrLCZwJhgl3CWcJRwmsCbAK
+LQvJClMK2gklCboIrwhcCHwHegaTBXYE8QJFAa//Q/4c/Sj8WvvV+ov6UfoN+gz6bfq3+ub6V/se
+/M383fxM/EL78Pmw+KP3uvb19VL10vSG9Dn01/PD8xr0m/Rg9YL2u/fL+Gv5xfkn+iD6lvkC+Wr4
+wfc+98T2IvaH9RH1t/R89GL0p/SD9Xn2HPcH+HD5evrc+g77N/tW+4D7dvsU+3/60flL+RT5IPlq
++d35QfqF+tD6Ivt++7v7sfuu++77a/z+/ID92/33/eD9tf14/Sj91/yP/Fn8RPwT/Iz73fp5+qr6
+8/rq+vH6HPsl+0b7gvul++j7G/wb/HH81Pyl/Dr8+vvz+zL8dfw4/Jn7Y/vI+xz8LfxD/Ff8KPz0
++xT8T/yN/NX81fx//Gf8mPxz/AH8u/u3+5L7BvuN+hH74Pxw/ysC8wQKCIQL/Q5DEq8VHBnaG5Yd
+FR6gHWcdxx3mHRMdjhtUGrkZOhm6GAgZiBo3HHQdBR9fIckjcCV9JnUnNCgbKK0m9iOqIKQdwxoz
+F/0S5w5mC4MIHwYmBLkC4gF7AXwB9wHkAvoDwQTqBKMEPQSDA/IBZ/9N/Dn5VvZt81XwSe2b6oTo
+H+c95sbl6eWx5srn0Oji6U/r8Oxl7oDvRvC58MnwdvDU70fvH+/07oXu9+1c7W/tr+4r8C3xVPLm
+84f1avfQ+XT8Dv8/AcICCQScBTsHcQhcCUoKNAvTC/ALlAtqCycMFQ0LDWIMGQxQDLUM/AwPDWYN
+LQ7KDtAOyQ49D9QPIRAAEG8PoA7VDScNpgw2DIkLewryCCcHoQVCBJkC2QBc/y/+Rv1p/LT7g/uO
++3z7SPvC+uj5Wfl1+Yj5APkZ+P32vPVv9DnzR/Iv8ZzvRu6o7ULt5uzp7DHtl+1x7snvO/Gr8ob0
+xPZ5+J/52frT+0r8rfz+/Pr8wPxr/Pz7ofuG+7D7Ovwl/fz9tv4PAEICqwTIBp0IjwqLDOoNnw4f
+D4oPyw/xD+QPVA87DsEMNgv4Cf0IHAhxB/4GlwadBj0H3gcaCB4ISwiqCAMJHAm+COAHrgZDBZ4D
+xQGz/6f96ftP+sz4k/eS9pb16fQL9aX1KPay9mj3KvgF+fn5pvrT+qz6ZPoW+sn5SvnE+Gz43/cT
+92j25fWf9cD19vUr9rr2YvfQ9z745fjX+fH68fuN/JL8NfzW+6n7gfsD+3H6Afo8+TH4qvea92j3
+HvfE9m/2bPad9sf2DPei94D4cfn0+dT5uvk7+tr6D/sr+0j7Ffue+j76GPr9+a35O/nB+Eb4F/hO
++KT44vhC+dL5KPo3+lP6vfpi++X7N/yD/Lv8ovxC/Mf7NfuT+uP5RPnM+Gr4Uvia+NL4zvjW+A35
+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
+PPxx/Hr8VPwZ/Nf7uPvC+8L7pPtD+576APqm+XX5Lfmp+BX45Pc2+Iv4mfi/+Bn5WPlr+YP5uPn/
++UD6R/pQ+rn6Ffv/+sb6z/ri+pL6+/mJ+YD5hfkw+ez4HPl3+eX5kvpk+xr8dvyi/Pr8U/18/eb9
+v/41/+X+nP7U/gj/4v6x/pb+Wf4Z/mj+I/+Q/47/Of+a/gv+/v0p/gb+vP2E/V79LP27/C/8vPtF
++9r6gfrS+cL4yvcr97b2MvbH9Z31ovW59ZP1FfWC9Ff0vPQc9UD1ofUX9gr2xfXf9Tr2VPYu9i/2
+ePZq9y35Ivsz/Z7/AQJmBFIHpwoaDrYRHRWcF0gZ6RqAHH0d+h00Hg8ehB29HCgcAxwoHFwccxxr
+HF4coRxEHfgdyR7LH70gRyFIIRIh6iCJIJUf0h1VG8AYWhayE+QQYQ7bC/wIMQbrA+8BIADV/sP9
+lvzJ+337IPt8+v35vPkT+eH3jfYk9XfzkvGX72ntA+vF6APnbuW143Hi++HY4cvhBeKl4mLjDeT6
+5CzmjOdP6SjrjOzA7QDvze8w8Mjw0/ED8wH0pfQR9ev1XvfP+AD6MfuU/Bv+ov9XAUcDEwWWBgAI
+PAkXCg4LZAyMDU0Oyw78DgAPFg9zDyEQwBATEfwQdxAMED4QmxBhEJkPhg5yDdAMjAwuDIcLtgoA
+CmoJqAjBB+EGHAaTBSYFoAT9Ay8DIwI2AZQAvf+G/iL9y/vH+tP5l/hS91L2d/WE9MfzUPPV8nLy
+S/I58j7yiPLg8g7zXPMW9DD1fPaA97v3cPcg90H3Ifgx+fn5wPpd+1j7PfvB+6b8iv0t/kf+Kv6I
+/mP/GwC5AGsB2AH8AWcCdQPIBJ8FlQVGBXQFkAX/BG0EgQTKBFoELgMTAmcB+wCQACcA6f/v/zwA
+ogDsAAoBLQGFAbQBlwGNAZEBbAEdAcwAxQDuAKQAqv93/oP9y/wg/I37I/vl+tH69/od+w37Jvud
++xr8g/zX/Pn8+fzk/Ob8+/yp/Mj7mfqO+Qf5vPhN+Ov3m/c+9x/3YffC90v4W/mB+uX69vqI+0/8
+0Pxh/Qz+L/7D/VX9Ff3d/Jf8VfwR/N372vvf++n7Kfx//Kr8r/y+/ND8//yh/Yz+L/+X//D/JgBT
+AE0A+P+Z/zb/nf4T/rv9S/3M/D/8f/u1+kv6S/pF+jf6KPra+Y/5kvnO+TD6hvqy+tj6v/pv+oX6
+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
+xg8PEC4QRxCmEN4QlBA4EBMQ4Q9PD0gOLQ1VDJsLowpkCUMIpQdYB8sGCQayBeIFDAa4Bc8EygM3
+A8MC8QHqAN//u/6J/WP8Gfu6+X/49vYd9a7ztvLv8WHxzPBN8GTwsvC38LDw2fAX8Zrxt/It9ID1
+0fZL+F35AvrW+rD7F/wb/Ab8r/vn+lv6bvpJ+pH59fin+JP4Ifku+sT6A/vP+/38JP5J/0AA1wBB
+AaUBhQHeAB4ATv9H/gX93Pvf+t75/PhS+LX3TveJ9wv4Kfh++MH5NPsv/PH8jf0b/tX+Zf8i/zb+
+Y/3A/PP71vqG+Ub4Hvf09ez0QvQk9HD0xvQ29e315vYP+Az5uPkp+j76DPro+bf5IPlO+JT3tPZk
+9ejzxPIK8lDxmvBU8FDwMPBG8Ofwz/HO8vvzIfU29m73ivg9+ZX53/lG+qD6lvom+pv5NPn0+Ez4
+GPcJ9nD1PPVo9dL1X/Yl9zX4iPns+vP7ivwj/bv95f3S/dr9uP0X/Rr8Jvtf+qj5+PgT+Nb23PWc
+9cX1DPax9oX3E/iv+Kn59PpM/Fj9T/7s/4MCswU4CeMMWBCgE+gW/BmzHP0etCC1IQAiKiJ0IhMi
+/CAMIHsf4B78Hfsc7BsGGwwb8BvVHIQdRB49H70gpiJDJCIlPSXOJBMk7yIyIcoewxuJGLoVFhPo
+D6oMBwqzB3AFgQMZAikBdQDT/2H/Sv+O//r/MQAtAE0AiQBSAFP/uf37+0z6Uvjf9XHzcPHY72/u
+D+3461vrPut966Drr+tP7Iztx+7K79zwH/Jz88H0AvY092j4T/mj+dj5M/qU+uz6RvvD+1z85vyn
+/aj+LP9p/zEAMAHFAUUCJgMwBCoFHwZBB6AICAo9CywMEA3ZDWgO8A5gD5UPow+uD6IPRw/VDpEO
+HA4xDTMMbgvNCiEKawmiCNIHRAcGB+cGtQZSBvsFCgYOBmgFbQTGA3AD7gIEAvEA2v+I/if9DPzg
++nP5QPgZ9671h/TZ81LzwPLu8SbxEvFq8VLx8fD/8Jvx0fKp9IL2qfdm+C/5y/lg+mT7bvyz/Bn8
+//rK+QX50fih+Df4xPeE96P3FfjL+JD5Ivri+k78I/7c/34BKwOYBIUFzgVXBXMEsgMDAwICwgBP
+/7b9UPw9+yj63/jT93L3vfd/+Dn5Afom+yn8A/3u/bT+gf8gAPj/cf80//7+av5h/cT70fkx+Af3
+wPVa9KHzmvN48yrzPfPH86b03PX19rL3lfir+V36mfqc+lP6wvnQ+Ej3n/Ve9Dnz2vFf8P/u1+3w
+7KPsK+007n/vAPFw8qXzF/X49p/4rPlV+qf6lvok+k35efgp+M731va09ZT0svOy8z30j/TY9If1
+m/bY9/H48/kK+yr88/w3/Vz9mv2v/Tn9bPzb+3f7//p++qj5hPjV9833y/et98T34vfv9zj4EPlv
++q/7VPzM/NP91v+6AtcFlQgVC70N1hBXFJ8XHxqyG/AcSh76HtYevR67Hjkedx1XHX8dyRy7G1ob
+CxtyGoAaOhu9GzIcJR10Htgf4CAeIeUgyiB5IEgfpR0tHFka2xdeFcMSSA/sCwUKiQgxBsYDUQK+
+AY4BHQE5AK3/BQCCAGcAGABRABABjAEUAaD/xP0h/Iv6T/i29cjzjPJl8TbwUe/b7pPuWu5C7mLu
+wO4277XvSvAY8TnypfNC9Yr2Nfcq+Of5Zfv6+078rfzz/H39Iv46/hX+TP7g/p3/EwAhAHQAOgHk
+AZACswMsBXoGlQcmCR0LjQxXDdANBw5gDvMOIw/iDq4Osw6aDuoN9gxODNYLWQuiCrgJDAnWCLkI
+QAipB3AHhAeIB10HOAdJB28HQwd8BnkF1wSEBOMDygKWAVIAG/9c/oD93ftK+mT5lPic98T2FfZt
+9cD0FPSl85nzv/Pa8wD0Z/QE9QP2XfdI+HX4Sfhh+Av5vfnj+ar5k/mk+af5r/nT+eL5vfmJ+cH5
+dPoV+4n7CPxz/Oz89v1V/2IAuwDNAFoB+gH4AXIB7ACvAGEAx/8k/13+cf3w/Nf8g/zR+1j7Uftz
++737GfxT/Hf8cfwy/B78ffy+/Gj87ft3+wr7E/sr+4P6lPlD+WD5UPn0+Iv4KvjQ98T3AvgA+KD3
+b/eJ93/3SPcV9/T26/bp9gD3IPf09oX2Bfa89az1P/Vu9LXzVfMh88vyYvIC8tjx8vFD8qjy6vJR
+8w30zvRd9e31nfYx94X3lPdj91b3Yvf19nr2WvZE9lb2kPal9sr2JveB9+73dPjG+CX5Afq++vf6
+N/uP+6X7bfsh+/b60vpw+uz5cvn/+KP4X/hK+E74Tvh/+NL4FflT+b/5ffpC+/H7HP0x/94BnwRh
+BxMKswycD+kSUBY8GWAb2hyqHfkdIB5SHjYeMx2PG0Ma4hnxGYIZehjOFzAYAhnAGZgaXBtBHOcd
+7h9CIYshISGvIIYgvx+EHVsaHRcVFFYRvQ7zCwMJjgbkBFgDoQGpALsAsAD9/33/8v//ANEBrAG9
+AE8A1AAdAfL/l/1H+5n5J/hX9hb0FPLm8CrwO+8r7nvtiu067tHu5u7z7sHvU/HV8vDz/vQl9hX3
+0/ep+G/5C/qg+gj7NPt3+977Q/yr/PX8NP2y/UD+tv5y/2QAKgERAkQDWQRDBU8GuQdaCc0K/wsy
+DV4OHA9OD1EPgw/BD6wPRA8FDxQPAw+6Dm0O+w0xDUUMlgs7C+oKVQp1CbsIlQjICNcIbQjVB9sH
+ggj6CJ0IuQcAB2oGbgXtAzgCawDH/q39mPzm+kj5Qfhn96P2GvbN9cD10fXJ9fX1lfYV9wr31vbw
+9qb3B/lu+uP6cfoI+gz6Q/pu+jv6p/k3+UL5QPnj+L345/jF+EP45vcC+JX4mPm++pL7Yvy//XD/
+2QCLAaEB7wGVAsQCNwJMAacAZQDx//L+ev0O/D778/qd+iz6FvqF+lb7Svwr/d79m/5W/5z/vv8k
+AHIAMAAp/7v9m/zs+xv73PmU+Gb3T/bD9Yj10PQJ9GD0iPU89pD2Uvdw+Hr5I/pF+t75XPlO+VT5
+tvi59/L2L/YD9ZfzcfK18RbxaPDr79zvLfC18HPxRfIY80n0vvXr9rr3aPj++E35TvkM+Zb4H/ik
+9/P2HvZN9aH0JfSM8xnzkvOY9FT1CvYo9474z/l7+tn6pvvO/HX9bv0q/cH8Mfy4+2b74/ox+qT5
++/jj9/T2xvYJ91b3mPel98T3i/iz+Zn6YPtz/AP+VwB5A7wGiwlSDMkPjhPAFiYZzxrYG5Ic5RyN
+HCEc1xvyGmQZERhtF0IXaBeCFzEX8Ba/F4cZ3BqDG2gcxh1sH64grCDZHz4fyB7jHTkcmRltFpET
+TRHwDuIL5Ai2BtsE8QJFASMAoP+W/37/Ef/v/qH/mQABAdMAoADVADcBugD+/vL8Zfvo+bP3x/TN
+8bLvju6J7Vnshetl68jrWuzx7KDtpO4O8HXxdfJg87X0TvaS92L4BPmm+TP6dPp4+h/6xvnu+R/6
+KvqE+jX7L/xn/Wr+Rf94ALABhAJRA3IEvAXzBi0Iegm1CrcLmQx0DTIO6Q67D0sQQBAWEP8PrQ8L
+DyYOYg3rDEEMQQtrCtcJeQlgCT0J7AjrCJQJSAplCjQKSArsCpULPwvvCbYIPgjGB18GWwRwAsAA
+L/+S/R78DPsY+lj5tPjW90r3Zfew9/H3SPjm+AP6Cvsv+wT7WPvm+xb8lfuG+lD5NfiM91b33PYJ
+9tf1ePYw97v3efiE+Wv6Kvst/Hj9s/6R/xUAZAB9AHoAVwDi/xL//P3f/D78DPx7+3j63fkU+qL6
+Evuu+7H8rv11/h3/jf/k/0EAeQBoAAUAS/+b/gn+Mv1Z/L77E/uA+mX6ePqW+tT6B/s0+2v7aPsv
++1f73fsD/Mj7rPuL+x37efre+Vn5ufgd+LL3KPeB9vz1b/Xe9IL0ZPRq9G30UPQm9Bn0KvQE9GDz
+jPIb8hvyC/L98WPyEvOr8wX0+POm84fzzvNL9J/05/Rs9bn1gPU+9Wv1pPWB9XT1lfWV9a71wvV6
+9YL1Jfaf9r729fay9wn5bPpV++P7W/ye/I38R/zu+4j7BPt6+in6B/oU+lz6Zvoc+uH5A/rS+iv8
+n/2g/zID4Qc6DKoPcxJgFc8YHRydHj0gYCH8IdIhLyEuILUeHR2KG/0Z1xhcGCsYzBd3F7IXdBiH
+GdIa9hvaHCoeOCD0If0heyC+HjcdKxsKGEMUlhA6DTQKSgcFBAMBQ/8l/rL8cPsw+8P7MvwQ/Dz8
+N/03/pv+N/5j/eP8p/z8+1/6yvf/9Mny2fCN7mbsFOtx6ivqCeoX6tvqbewW7jPv8u/78Gjyq/N8
+9Bz1+fUj9yX4sfjr+Bv5Y/mq+cj5A/p5+sX6NftY/Mj94/7N/9wACAI1A0MEKQUWBhwHLQg+CQ0K
+VQqQCkELAAyPDBINbw2KDZ0NFQ7CDhUPRA+MD24P5g6aDo0OGQ4fDTkMrAtWC/YKJwoVCV0IGgjs
+B6MHUwcXBykHcweRBy0HMwY1BY4EsgMqAkwA0/7K/Zb8K/vj+eb4X/gB+ET3kvZg9lH2RfZy9s32
+jPe4+HD5hvm7+Qr6DPr1+bv5APku+KH3BPd/9qr2UPfh90n4pfgI+b75E/u6/Ov9cv4T/wwA0gAN
+AbkAQQDw/0X/Df7u/E387/uR+zz7/foI+6b7ePwT/Y79OP4X/9v/dgAAAWgBrAHLAaIBPwHyAMEA
+PAA2/xr+dv03/f78qvwA/C77/fpk+7z78/sw/I787Pz0/OD8N/2f/Tn9TPy3+zP7Ovoo+Vf4cvcq
+9gb1Z/Tt82Tz+vLY8ury+vIH82nzJ/Ss9N/0RPXY9TL2SPYH9on1OfUB9af0QvTe85rzd/Mu8/by
+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
+fAiFCA4JmgnLCeQJVQqFC0gNvw6KDxEQiRC1EMEQPhGXEcQQsw+bD64P7g7dDdoMrgvRCsAK/wrw
+CuQKYwvcC4ML0AqWCqgKTwpHCQcI+gbhBbUEqwNIAnsAG/9M/n79xfx8/Hf8bPwk/Lv7kfuP+1/7
+pfos+Y73qvY+9pf1ofR382ny7/H58eDxUfHz8FXxLPLW8hnzXfOz85XzCfOE8gTyg/Ez8ffwpPAj
+8Lbv3+9j8JzwtvAd8dHx3PLk83/01PQA9Rn1YfV79Qr1gPRl9IP0gvSh9Ar1pPV19mv3S/gg+Uv6
+lftk/L78Cv1G/Wz9xf02/kT+2v1u/TT9A/3j/AH9Rv2k/UD+Ov97AI8BQQLIAgYD6QLGAq0CPAJj
+Ab4ASQB3/3H+s/0+/er88Pwk/Q39Sv0w/sX+4v4X/z//d/8/ADsB4gEuAv4BpwGSAZAB9gEFA7sD
+YwPWAiADSgRuBeUF1QW5BTcGpgc5CcYJWQkACZQJ5wrfC+MLsQtBDH0NUg5CDvANDA6wDjoPBw9F
+DqYNmw3LDa4NKg2zDAUN5g2CDrcOzg7dDuYOBA9JD7UPEhD+DyYP+Q1vDWoNMw2sDO8LMwv+CmIL
+sAt3C84KAAp4CRQJfQgHCNsHxQeHB9MG7QUTBQQE5wIeAocB6wBjAPr/vP+Q/w3/Iv4o/W38Kfwm
+/Lz7zvra+Tn52viE+NH3ofat9Wj1gPXB9dD1evU09Rr10PRe9Bv0MvRm9GH0LfQN9Bf0QvRa9Dr0
+0vM48wnzk/Mk9Hf08vRv9Yz1lvXb9Q/2RvbM9m/3GvjT+Gn51fkY+hL6FvqQ+jX7qvsn/Ar9Lf4U
+/7z/aQArAfABgAKmAr0CbQOpBKgF/gUpBrgGlgdZCM0I8QgRCbYJngr6Co0K5Am/CQkKOwoyCg8K
+BApJCgILoQt9CyQLYQvsCxEMwAtxC0sLvQqgCXAI8QYUBekDdwOcArkBkAGnAaABNgFaAOH/JQB5
+ADwAuv9//2X/Hv9h/vz8gft0+rf5D/lt+Ov3dvcC94z2ufW39Gv0wvQJ9T31Z/VM9T71Z/Uj9TP0
+LvOW8m3yW/IY8sbxoPGO8WbxNfEv8VHxWfF28ejxVPKJ8uHyXvOZ83jzUfN987nzrPO98yL0f/Tz
+9Ib11fUE9nL27vZN9+f3x/in+Yj6Wvvc+xj8Wfy//Nz8lPxU/FD8ofwk/Yn99f2A/ur+R//G/zUA
+aACxACQBegHOATQCXgImAssBkwF/AXgBcAFbAUkBbAGeAYIBKgEKAU0BtgEeAlsCUQJpAt4CTAOl
+AxkEYQRBBE8EKwU+BpwGVwYTBgQGGAZABlEGGgbgBUcGLgfNB8MHdQetB48IfwkgCpYK/gphC9YL
+RQxLDPIL2gsDDA0M/gvCC30LyAtpDGsMvQszC2cLNwwGDWoNdQ2IDfANgw6+Dm0O9g23DWoNygw5
+DNoLZQsTC/QKpApHCiAKFQoQCvMJrwmDCcUJGwrGCewIGAheB6gG1wX/BJYEaQTVA1gDewOaAyQD
+iwJUAggCXwHQAEYAW/9q/tf9W/3I/Ez8uPvr+nD6W/o5+hf6KPox+hP69/mv+Sr5kPgS+OL34vfS
+95j3Off29gr3OvdC9zn3Mfcw91f3jPev97n3jPdV92j3rffh9w74SvhF+An4Rfjj+Bv5+vj1+Ab5
+PPn9+f/6sPsE/CX8fPwl/az92f31/Uf+0P5K/3n/f//P/5MAgAE2AoYC1QKEA0IEsATWBOwERQW8
+BeIFwwWGBTMFFwVGBZkF9gUdBjIGmAYrB64H7ge6BzsH5gbfBuwGqgbPBdsETwTMAwoDYQIZAgQC
+9AHRAYoBWwGHAegB8wGkAXoBQQG3AP//Hf9Z/qv9t/zH+zP7p/rv+U/53vhw+CT4S/ip+OD46PjH
++Hr4BfiI9wr3YPaH9f30+fT59KD0IfTu8yn0fPSd9I/0gfSE9IP0mfSj9Gf0K/QJ9NbzhvM/8x3z
+EfMy86TzOPSm9PT0T/W19Tf22vZC9zv3H/c395X3Nvip+LL4nvig+Nz4UPmm+fj5hPrj+j/7L/w5
+/bT9GP7o/qH/0P/t/zEAJQDm/x8AjwCgAI8AnwC0ANAA5ADrAAMBOQGuAUQCgAI9AgECFwITAvMB
+CQIRAhECYgLqAl4DuQMrBF0EDwThA+wD6QMMBDYEDQS6A50DuAOzA6ID1wM4BKgEZwVCBpoGqwb5
+Bl4HjQeCB2IHRwcSB+AGLwewB4kHJQcwB2UHbwd7B9kHVgjECGwJHwpVCiAKCAojCiMKIApcCqwK
+5Ar1Cs8KyQrvCtAKZwoVChwKWAp1Cn8KlwqxCsEKowp5Cq8KGAv9CocKSQoOCrIJWAntCG0IDAjU
+B40HOwcSBwEHrQbuBVYFeQW5BWEFrwQRBLwDngNBA40C+QHJAcUBugF1AakAw/9l/0n/9P6c/pj+
+Yv64/WX9jv2I/SH9ivwa/Pz7z/ty+0v7Vfs0+/L63frd+q/6i/qS+nj6Q/pn+sj67fr3+v76+PoT
++1D7avtC+wj7zvqM+ob67Pp2+7H7s/vc+yL8Q/x9/Dz95P0Y/qL+QP9O/1b/iv+O/7f/JwBVAG8A
+pgB+ADYAYwCjAJQAhACvAO8A+wD2ADsBoQEAAmwCtwK2AqYCwwIYA3gDewNMAy0D3QKIAoECcAIO
+ArUBmQFrAfcAjgB9AHQAKwDj/7X/of+h/2D/7/6p/nD+Cv6Q/TD9z/xX/On7iPsV+3j6GPo3+g/6
+hfk++ez4X/gV+Pb3rPdc9zT3W/eq95D3J/cC9yH3H/fy9tn2pPYl9qr1pvXg9YL1uPRl9IP0mvSK
+9JP05fRM9c71l/ZB9233mPcu+Kr4r/ii+N34Oflc+Uz5avmf+bz57Pkx+m36lvq2+tT6Dftw+9j7
+G/w6/IL82/zt/Cb9zf1p/qf+rf6o/q7+0P74/g7/JP8j/wT/+P7i/qL+o/7//iv/+v4L/5H/AgBR
+ALwAIAFJAVsBmAEEAmoCjwKGApACogKjAqACqQKwAqQCiAJrAowCAgNsA6AD6ANSBKsE9AQnBUIF
+eAXEBQIGLAY9BlAGSAb0BagFowW0BeEFPQZxBkIG8wX1BV0GpwaXBmEGOQaIBjgHswfkB/cH+wdB
+CLAIgAi0BzgHLwf7Bn8GPgZHBhQGzQXwBUwGrgYVB2AHkwfQBxgISghfCEQIAgjnB9IHaAf8BsoG
+eAYrBi0GQgZBBiwGEAYHBggG9wXKBagFrAWrBZEFjQV5BQAFawQsBAMEawOPArsBAwHKANkAdAAU
+AEgAYAAYABcAfADGALAAZwA1ABIApv/2/oT+Vv7h/S/97vxJ/aP9p/3E/ez99P1C/oX+Zv5i/nn+
+av5b/l3+ZP52/mP+I/5U/g//bf9N/1T/lv/T//7/GgAAAIH/xP40/hf+Kf4Y/hX+Uf7A/jv/mf/N
+/8f/y/8oAMwAOwELAaEAqQDbAHsA1P+B/4L/z/9CAJMAxwDgAP8AawHHAZ4BQwEvAXABwQHdAbEB
+RAGsACEArP8Z/4z+R/4t/ib+Sv5f/i7+9P3c/an9Vf0+/Vn9Mf2u/BL8lvtE+y/7TPs0++j6yvrx
++lL7zftP/KX8kPxU/E38Y/xg/Dv88vuh+3j7OfvY+qv6cvoP+hr6S/oG+tz5I/pi+m76MvqW+Qn5
+sfhd+Er4UvgD+Kr3k/d/90z3KPc29173pvcs+OD4cfmz+d75Gvp0+qn6d/oz+ln67fpk+3X7a/t0
++7r7Cvz6+wX8j/wC/S/9jP0O/ib+3/3r/Un+cf6T/u/+Lv80/0D/Nv/4/tb+7f7x/tX++f5A/yP/
+tf6y/jP/Tf/c/r7+N//y/48AzADtACYBPQFGAVcBUwFjAYoBlQG2AQQCEgLDAYYBsgFUAs0CqwKL
+ArMCywLOAuICHgNYA4UDHQTlBFgFsgUdBkIGAAalBS4FuQS5BOsE0gSzBPcEaQWtBaIFfQWgBdcF
+1wXOBd4FEQZmBrAGsAYyBtIFGAY4Bs4FmAXEBeQF/QUOBucFyAW/BaEFqQXiBdoFfwVWBX0FhQV7
+BY8FUQXNBLAEyQSJBEMEQAQVBJkDRANRA2gDVAMjA/MC7AIOAyEDAwPJAmwC4QFaAQEBwQCGAGUA
+VwAkAP7/7v+8/5X/gv9t/4T/xP+j/wj/v/4F/1L/e/9r/+/+g/7I/jT/D/+w/oP+WP5E/ob+sf57
+/k/+cP6g/p3+aP5P/o3+5v4+/6L/6P/9////AwAuAHgAewBFAEQASgASAPL/EQAMANT/2f8MABcA
+FgBGAIoAkQBIAAsAKgB+AKUAlwB6AEMAOACjAAoB+gDyAEIBcQFsAYABlwF0AScB8QDBAG0AJwAV
+AOX/mP+R/2H/4v7a/hn/BP/r/v/+C/8q/0L/+P6F/mT+kf7F/uP+yP5O/rf9Y/1O/SD9wPx7/G/8
+f/yK/Ij8q/zi/Nn8sfzY/Df9TP0R/db8nvyE/J38j/w+/Ar8EfwV/M37W/sW+xj7L/sV+wr7LvsW
++8X6ofqi+mj67vmQ+ZX5/PlM+mD6pPrU+rr61vr6+sT6hfp9+pD6dPoc+v35PPpT+gf6+/mT+iL7
+Z/u5+/f7//sY/Hf8+Pxs/dP9QP6K/qj+vf7H/uL+Bv/+/gX/Ov9l/6H/5/8LADQAhwDxAGAByAEV
+AjYCOQI+AkECSAJ0AsICJAOKA9oDAAT0A9cD1gPwA90DXAPhAvsCOAMPA9cC0ALCArkC2wITA1ID
+fQOWA+cDTARGBBsESgRmBAYEmwOyAwYEAwS9A7YDGASFBNAEBQUiBSMFFQUhBUYFcAWUBYcFPAUd
+BWUFlgVBBcwEpQSwBP0ERgUFBXgEDgTtA/wD+QPOA4UDOAMoA1kDcAM3A+UC0QL2AiEDQQMcA54C
+XgKXAqECXQIcAqwBKwEJAQIByACLAEsACACy/yn/v/6n/pv+aP4v/v790P2v/b79FP4//hX+/f39
+/er93f3A/Wr9Kv0k/Rr99/zP/KL8iPyC/GL8P/xY/LX8Gf1g/Y79kv2o/QD+Qf43/hH+KP5o/mn+
+a/6O/kr+sf11/br96/3w/fr96v31/XD+//4V/xT/X/+k/8r/BQB5AN4A2ACoALIA3QDMAK0A4gAR
+AdAAjACSAGwAHgBCANYAMQEaAe8A1wDEAM4A+wALAfgAHwF2AbcBzgGzAWwBBQGzAJ4AnQCNAJAA
+nwB/ACoA8P8BAAUA6P8AACoAMgBnANIA9wCoAFoATgA1APD/qv9o//r+jP6i/un+sv5E/gD+of0/
+/VH9of3C/a39ev1T/Uj9Gf24/G78bfyc/KL8gvyI/JP8kvzH/AH9+/zT/Mn8+/wX/br8XPyK/MT8
+hPw8/F38r/zG/IH8PPwm/BP8BfwN/Cz8WfyB/LH89Pw1/VH9Nv0W/Sz9Zf2S/Yn9Pv34/AL9P/02
+/VP9K/7m/hX/Tv/M/1cAsQC0ALcAEQFGAS0BUgGmAa8BhQGpAf0BAQIBAl8CnAJsAlMCnALsAgMD
+FQNJA4cDkQN1A4YD1ANOBLME9AQ0BVQFZQWDBZgFmwWCBVIFQwVPBUUFCgWvBH4EgQSXBLYEqQR0
+BF0EZARuBHUEZQQtBPUD9QMiBDAE4QN6A4IDrANRA8ACWgIQAjICowLBAqkCoQK7AhoDhAOGA1cD
+fwPOA/UDGwRBBB0EzAO5A9cDrQMzA98CxQKmAncCYAJsAnACRwInAlYCgAJQAg4C2gGWAVYBEgHO
+AJwAaQBDADgAHgDc/5r/lv/c/wQA2v+p/33/Ov/4/qr+XP4a/sP9av1F/Tv9/fy7/Lz8ovxR/Ej8
+g/yf/Iz8Q/wb/FL8T/z8+wL8MvwC/LP7lft3+zD78/r0+gr7Ffss+0L7Yfut+9372PsO/HP8rfzE
+/Nb81Pyo/I/8xfwA/RL9V/3D/ev96f3k/eD9B/4a/iz+rP4I//P+8f4G/+/+vv6o/p3+hf6Q/sT+
+6/6y/kz+d/7u/u7+tf6r/q7+r/7B/hv/oP+z/1r/M/82/+L+hf6p/vD+7f7c/tf+nP5y/sb+Of9F
+/x3/If94/9f/0f+L/17/hf/h/xsADADL/6H/uP++/3X//f5x/hX+Ef4W/gL+Ev48/k/+Y/6M/qH+
+ov6k/nL+6f1C/bv8V/wQ/Ar8Q/xM/DT8rfxA/Q79qPyY/LD8DP2S/Z/9Tf06/VD9Zf1o/QH9YPwv
+/FX8evyz/O/8Mf16/cv9T/7E/h7/yv96ALEAowB5ADUAAAD5/0MAogC1AM0AIwF2AcAB5wHUAfcB
+YgKCAj0C7wHEAcMByQGeAX0BuwEzAq4CNgOsA/EDSASzBPYEJQU8BQ4F9ARFBVUFyQRaBF4ElQTO
+BCUFoAXwBR8GfwbuBgUHuwZ6BmUGcQaaBrsGzQaJBugFjwWJBV0FBgWoBEEEHgRVBHIEXwRTBFAE
+VgRlBF8EXgRjBBAEdgMVA/AC6ALOAosCkQLOAsMCcwI/AlcCfAJ5AmoCgQKSAlEC+gHxASUCXAKQ
+Aq0CZALFAVABIAHwAN8ALQGcAeYBBQIOAvUBjQEfATgBmgGTATYBEgHxAHAA+v/A/33/G//t/in/
+dP+M/33/U/8j/w//E/8j/y3/Jv9H/6H/1P+k/0n/G/8b//3+wP67/vD++P7N/r3+qP5F/s/9t/3a
+/eT97v31/d/98f0O/tT9fP1M/Sz9DP3//O/8mfwZ/Mr7kfsT+4v6TPop+kT61Ppu+8j7+fsn/ID8
+xfyP/Cj8Avwt/IH8v/y1/Fv87/vX+wz8Evz9+zP8pvw+/bP9tP2i/d79H/4q/mT+yP7O/rf+2f6q
+/hr+w/29/bf9qf3E/eH9t/1+/W39R/0a/Sz9Wf1w/aD9Jf6K/n7+m/7b/pL+KP6C/vv+kf4N/ir+
+Mv76/dX9iP07/Sz9F/32/PH8Af0J/Rj9R/1b/Vf9e/2G/V79Zf2T/XH9If0z/W79dv1Z/ef8PPwF
+/Fr8k/x3/E78TPyJ/Ab9b/2V/db9Mv5Z/nH+k/5m/vz9BP6F/s7+x/7H/sL+1v4q/07/A//q/lH/
+qP+u/4X/Vv9S/3X/rP/Q/8n/wv/J//b/VAB9AGQAfgC5AN0ANAGvAdsB3QENAisCOgJ+Aq0CfwJW
+AskCqwMLBM0DuQPdA+sDBQQiBD0EbgSLBHkEbQSMBKkEjARsBHsEowTlBC0FYQWTBbMFmgVJBQYF
+FAVPBXMFiAW8Be4F6AXHBeAFJgZYBmwGNAajBVAFLgWpBB8E6gO4A98DeATMBMoEwwStBLQE9gTY
+BEQE6APZA7IDdwNJA+wCYgL/Ac0BrwHGAeUBsQFwAXkBogHGAecB4wHRAe4BFAL7Ab4BnwF8AUsB
+OwE9ARcB3wD5ADcBIQHfAM0A+AA8AUoBGgEEAf0AwgCBAIsAwQDCAKwAwgC8AI8AoAD0ABkB7QDU
+AK8AUAA3AGAASwAJAPr/NACFAI0AUABBAHMAnQCZAIIAagAhAMP/uf/l/9L/k/+I/7L/y/+k/0P/
+Ev8+/2r/gv94/03/H//r/vr+Ov8j/9j+v/67/rb+nf4R/jj9y/ym/CL8xvsV/Hj8p/zP/Nv84fz7
+/Av9yPwc/Mn7E/wb/Lz7qPu2+1b7/fo/+6z7w/ur+4L7g/sU/KH8cvzh+7r7AfwO/Nn72Pv7+9X7
+1Ptc/NT85vzJ/Mf8+vw6/Wn9Z/0d/br8ePxM/Cr8K/xA/FT8cPzg/ID9sf2h/b795/0E/vb9s/2R
+/b39/P0I/u/98/0B/sP9TP0c/RH9yPyl/NL84fzF/OT8RP1p/WT9m/17/Q/9Of2Q/Uv9tfyl/EH9
+x/3N/ZP9mP0A/jT+BP7J/cX99P32/fT9V/7x/k//Tv9y//P/UgBqAI8A3AAcATYBIgH9APsAIgEw
+AeEArADmAAwB/gAoAZcBEQJfAp0C9gIjAyQDNgMwAxUDFwMPA70CYQJGAjUCHQIBAuMBHgKDAp4C
+yQL4AuQC4QL5Au4C/AJHA2sDgwPGA7IDNAMNA18DawM3A4UDEQQtBAwECgQTBO8DqQNyA0UDIQM0
+A24DgQN5A5EDqgOJA2MDhAO5A5QDRQM/Az8D+gLAApYCYgJ4AsQCygKaAokCoQLGAusCBAPxAssC
+uAKhAoECQwIGAugBlAEuATMBfQF7AUUBXQFeASABOQF8AWYBIAHZAH4ASAAuAMD/LP/x/gT/Fv8N
+//X+6v4b/4X/3v/4/+f/1f/a/9n/wf/X/x8AJgDm/+H/CQDi/5D/bf97/5b/jv+B/7r/JABUAEMA
+OgBLAGcAdQB+AIUAagBrAJkAfwA2ACwAZgCrAJ4ARwBNANEACwGvAFUAQAAqAPz/0v/I/9z/tv9S
+/1r/uP+5/3b/c/+f/4z/c/+a/3v/Av/Q/vn+Cv/g/uT+GP/l/nH+Rv5C/kf+af6I/q/+xP69/uP+
+Dv/v/qr+ef5Q/g/+3/3M/YD9G/2v/CT82vvl++j7svuW+9b7KPxL/Fr8e/yO/I38y/wB/bz8pvz8
+/M/8PPwJ/Pf7w/u3++b7SfzM/CH9Tv1m/U/9V/2V/cL9A/5U/lz+Sv5G/iH+D/4k/iL+Mf57/qv+
+fv45/mH+7f4x/zz/lv/F/13/G/+O/xAAAQDQ/+n/BQD2/+H/1P+q/7z/YADGAIUAgwAIAS8BtAB7
+ANAA3gBrAFcAxQD6AP8A/QCPACwAYAB4AC0ARwDVAAgBsgCJAAEBZQEwAfEAJgGEAaABaQEHAdIA
+DQFlAVwBFwEfAWcBcwFyAcMBAwL0AfEBLgKFAq0CqAKVAn8CjgKWAj0CAgJvAsoCnwJ0AnYCXwIw
+AiACGgIKAtIBcgEwASoBSQE7AeEAqQDzAFEBSQEoAQEBlgBMAJMABAEMAcMAjQCdAOgALAEvAesA
+pACxANgApgBcAFUATAAfABcANwACAG//Pv+U//r/OwBCACsAUAC+APgA0wCpALAA0gDhAAUBGwGZ
+ANf/mP++/+n/MACEAKsA3gBKAZABaQEVAcoAfQA4AAkA4P+p/2T/P/9W/1P/Ff/S/nr+Tv7L/lX/
+Dv9l/hb+9P3R/er9Jv47/iz+Gf4g/gr+lf0w/Ub9a/1N/WX94/1h/rX++f4p/zL/NP9V/4z/oP9x
+/zj/Df8K/zX/MP/X/nz+if77/nH/tf/G/+H/BQD8/9r/p/9H/8n+Yf40/j3+Sf49/jz+Vf6a/v/+
+O/9k/6P/5/8kAE4AEQBY/7/+t/69/k/+7P0Q/mr+sv7X/sz+zf7x/vD++v4s/0b/iv8jAKkA4wDQ
+AHoAEQDI/6r/q/+p/5P/oP/J/8T/mf9O//3+0P67/vL+b//H/97/zf+b/1T/Lf81/zX/L/9q/+j/
+RABtAKkAogAwANX/nf+B/7b/AwAnAFIAlAC8APgAQgF4AZEBVQFaAR0C0wIeAzUDCwPQAr8CbwLa
+AbEB4wEYAl0CUQLrAaQBmgG5AdMB8gFAAq8CKQOXA78DkwNyA4MDjwODA0oD+gL1AlIDowOMA0AD
+6gKdAokCiAKFApYCwAIFAxwD5gKDAjACFQL5AfoBSQKhAssCwgKsAooCKwK8AXcBdAGjAbsBpgFs
+Ae4ARQD6/wMAm//1/u3+Wv/6/5kArQCLAKYAeQAUAPT/3f++/8b/x//I/+f/8v++/0j/A/8k/zv/
+Ov86/0v/b/95/3v/k/+6/9//AQBGAJQAhQAtAPv/7v/n/9H/yf/6/z0AXwA/AMz/S//k/pX+gv6E
+/nr+g/6W/rL+u/6s/rT+xf7//pD/3P92/wn/+f7K/mj+E/7E/ZT9i/2I/af9zv3K/d/9V/72/i//
+6/7I/gn/Iv8I/xn/Ev/W/on+O/4b/g3+xv11/VP9Uv1z/b39F/4n/gL+Ff4v/hX+4v2U/U/9VP2T
+/cT9lf1M/VD9fP2i/Zz9df2F/dj98/24/Zn9qP22/cb91P3G/X/9T/17/V/91Pyi/Mf8zPzh/Cn9
+bf2h/br91f0w/lr+4v2B/a795P0O/m/+pv53/mD+s/4u/0z/+/7M/uD+1/60/qL+rv4I/4T/r/+y
+/8b/z//l/+7/x/+3/+7/PQB4AIMAWAASAOj/AgBMAFkA8v+c/8f/LwBPAA0ABwBuANUAHgFdAWMB
+RwFfAUMB6ADTANgA6gBKAacByAHNAdIB8wEkAiEC7QHvAScCLQL6Ad4BygGLAT4B+wDmAP4AOAGS
+AcwB5wEUAj0CRQIrAkMCrALjAt0C+wIeAyMDPANFAxQD5gLdAvIC8QKxAnwChQLGAggDAQP7AlUD
+qwObA2MDUgNFAwAD0wLnArkCRgJDArcC0QKLAn4ClwKtAtAC0QKuAooCgAKzAtcCowJlAksCMgIS
+AvQB+AH0Aa0BiwHlAT4CHgICAkICUQLsAXQBQQEdAdQAxAAXATgB5gCJAGcAdwBxAEUAWgDCABEB
+JwEaAdQAnwCzAKYAYwBDAFcAXAAZANL/0v/t/+z/1P+o/1D/1/6q/g//jv+W/zj/3P7L/g//Kf/S
+/qf+0P7p/g//Zv+A/0P/IP9Q/5j/o/+a/6f/pv+z/9f/y/+d/2j/Ff/p/gD/F/80/1//Vf83/1H/
+Z/9C/yP/Of9f/3T/k//L/wkAJADr/6L/jf9u/0z/Xf+G/47/aP8z/wr/AP/6/tb+sv6e/nv+ZP5N
+/iD+WP7t/gj/lv47/if+Tf6A/l3+Ev7e/az9sv3j/cL9Zf1T/Yf9kP1l/Un9Lf3x/Ln8ufwA/WH9
+kv2Q/Yr9mv2t/aT9pv3O/Qb+G/7u/bX9uf3j/b/9YP09/Tn9Pf16/dD95v2+/c39HP5J/lT+VP4q
+/hX+T/5t/iL+0P3h/f393/3w/SX+DP71/Tz+g/5//mP+Tv5c/qr+3/7l/hf/R/9p/6L/nv9a/0T/
+av+S/7D/4P8IANr/oP/A/93/0//a/8j/of/a/1EAlwCSAHkAjgCxAJwAXgA0ACEAIwBYAJkAswDG
+AO0A7gDIALYAsgC9APQAMQE9ARUBEgFoAZoBYQEXAe0A0wC+AJUAkQC+AJ8ASwBhAJMAWAAnAEEA
+XACpACYBTAEZAd4AvgDcAAYBxgBNACYAPgAyAPj/2P/p/x4AbwCzAOoAIgE4AR0BCgEMAQIB9QD+
+AOgAnQCSALQAkwBhAGUAfACKALAA+QAjAQgB0wC9AO0ALgEpARcBHgETAQoBHwFEAVIBTQFPAU8B
+IQHWAOYARAE+AeEAuACxAMwABAHVAH8AhwCjAKcAqgCGAFwAhQDlACABIAE8AZQBlgE4ASgBbwGL
+AXMBUgEmAf0A8gD4AOIAvACyAO0AUgF+AW8BWgE5AQ0B4wDkAAMB8QDiABMBGwGyAEoAUABzAFkA
+MwAnACAADwD+/xQAPAAxAAkAHwBmAJIAiABYAHsAvgCJAFYARQABAPn/JAAjAEIAfgCDAJwA7wD2
+AKUApwAgAXkBdgF/Ab0BzQHTAQoCAwLAAZIBawE4AfEAvgC5ALUAnACcAMkA1gDPAAUBMwElARYB
+9ACcAGoAfwCOAHQARAArAFMAcQBcAD0AFADy//H/7f/A/4H/ev99/xP/tv7o/hT/+P76/hH/E/8N
+/9v+mv58/lz+a/6m/pz+Vf4d/gL+0f2b/bX9CP4l/if+c/69/rv+vv7C/qj+pf6+/sn+1/4J/wH/
+xf7w/kn/Pv/z/tv+Bv8U/xT/WP+l/8H/pf9Y/wb/wf6q/sj+3v7K/rT+2f4M//b+1f7l/gD/FP8o
+/2X/oP9O/+H+Dv84/+b+kf5//pL+0P4S/zT/bP+Z/7b/9/8XANX/dv9C/xr/tv48/gb+A/4c/mX+
+pP6+/if/uf+4/27/if/S/yEAigC4ALMAtQBwAPL/sf/E/77/Wv/w/vD+RP94/23/gP/g/08AmQCu
+AJMAcQBoAF0A+f9s/zf/MP/+/sL+m/47/qX9ff3Q/Q3+KP5B/jr+VP7Q/jP/Gf/X/qv+lP6V/nv+
+Lf7p/dP93P0h/sH+Xf+7//L/DwA9AG4AgQCBAFAABAADAD0AcgCAAFIAKwA+AFoAVgBTAG0AiwCu
+AN8A8wDeAKsAWAAaAPr/wv+k/87/KQCHAL0A5wAXAUUBeQGYAaQBzwHhAZEBZAG3AeYBkgE0ATMB
+ZwG3AfcB+gHuAc4BvgHfAdkBiQFrAdEBdALuAjEDYgNMA+QCmgKFAl8CFAKwAUMBAAHrANcAtACB
+AFQATgB6ANsAVQHFARQCGwLwAckBrwGqAaYBiQFRASgBOgFYASkBzACNAEYALwCuAB0BHQE3AV8B
+TAE8AS8B3gCXAOMAlgEAAvsB2QHCAbIBjgFPAQ8B1wCyALoA1ACyAH4AgwBrAAAAzP/6/yAALQBD
+AHwAxgDgAL4AjwCiAAYBHwG0AJUA+AAZAfUA7QDWALgAtwC7AMIA4gABAfcA4QDnAPEAswAzABMA
+bQCmAMUA7QAFASQBAAFnAOj/uf+b/2f/Mf8//2P/DP9R/uv90P19/UL9Tv1D/V/91P1A/nj+bf42
+/lT+n/6N/mf+Z/58/sX+A//U/l3++P3Q/ez9If5N/pP+6P4e/zn/Qv9K/0b/F/8G/zT/Vv9c/1b/
+Qv8Q/7r+h/6D/nT+a/6N/tL+/P7g/qn+nv6v/p/+lP6t/rr+xv7+/iX/7P6S/p7+Cv9N/zD/8/7H
+/qj+eP4t/t39p/2g/a79vP3P/c792P0d/mb+mv7j/hX/Cf8F/zr/Xv8u/wP/BP/0/vL+7f6j/lz+
+Xv6X/vT+T/98/5X/xv/5/xIAIwAaAOL/t//V/+//of9H/yr/8/68/rz+tv6j/qj+2P75/uD+5P4F
+//T+/f5n/6P/Kf+3/g3/S/8g/0X/Wv9L/5v/5//s/wAA/P+4/7j/9//F/0P///7w/vb+Fv88/z//
+V//B/0AAcQBnAHIAeQBkAE4ARwA8AEQAbQB5AHYAYQAxAEAAegB3AGwAvwAjATABDwH6APQA/AAm
+AWEBrwHxAdwBnQF1AU0BDAHPAMUA4AD3AOAAtwDcABoB/gDCAL8AwQC1ANIAEwEzARQB6AD+AHUB
+0gG0AWABHAEgAVgBVwEMAZYAOwBTAKAAtACZAKQAuwClAJ8A4AAvAVoBRgEmAUIBSQEYAQgB/AC/
+AK0A+gAYAdEAqgDYABMB/wDWAPUAAwHyACYBfgGjAZwBhwF1AXQBZAETAa8AfABfAE8AYAB1AHYA
+egCEAJwA3wAmAVABZQFoAWYBfwG4Aa0BTAEqAVwBWQE+AWMBjwGeAaIBpAGuAa0BoAGNAXEBYAEy
+Af8AGQFEARYBoQA+ADgAiADQANsA2ADwAAQBAgEPAR4B7gCFAEwAdgCVAGkANABCAGkAVAAyADQA
+OwArAAcA1f9u/+X+0P7x/q3+pP7T/pj+cf6h/qj+iP5j/lz+mf68/nf+E/7k/Qn+S/5J/lf+u/4M
+/0z/ov/N/+f/EgAVAEAArACpAD4A8P+4/3D/NP8k/xv/Ef8y/2r/nv/a/wwABgASAHUArgBdANb/
+nf+h/53/xf8BAAAA8v8TAD4AUABMADoAVQCOAHMAOQBYAHEAXABtAFYA/P/j/wkAAgDg/8H/p/+o
+/6X/lv+H/2T/P/8r/yz/Of8a/8P+ff6v/kj/yf/U/3P/Kv9L/4v/vf/3/wAA2v8VAKYA3gCIAAQA
+qf+P/5b/dv91/1cAvgEFAg4BvwC4AUICdAFEAMj/KwC6AI4AVP/F/S/93P3A/uT+P/6k/Sn+h//6
+///+0f1p/cn96P37/PX77/t+/Aj9Nv2//Fn80vym/e79qv16/Yv9jP2S/bj9nf05/c78gPxu/IT8
+y/wv/Vj9Vf2d/TP+f/5n/nn+tP6u/qH+q/6U/m3+LP7k/Qj+hv62/o/+tv5S////hADgAAMB8ADL
+AJ8AfgCKAJYAewBDAAwA3v+w/8L/2P95/0//9P+3AAUBDwEjAVIBSgHXAHIAaABlABoArf+J/7D/
+tf+f/7v/EwCqAGABzAHHAaEBwwErAlYCNQIgAjcCOQLdAVUB8ADAANEA+QDzAPcALQFYAW8BggGf
+AeEBMQJvAoYCbwIjApgBKQEXARwBDQEgAXMB1AHxAY4BDQETAVUBNQEDARUBIQEBAdQAoQB9AHgA
+dgCFAKcAtADaACIBNQEGAeUABQE3ARIBqQBpAFUAOwAZAPz/DABDAFsAXABmAHEAiQCnAJsAdQCD
+ALQAxADXABwBUAFAATEBPQFMATMBzAB8ALkAJAEdAdYA1AD3AOoAuACJAIQAxwABARQBJAHyAJwA
+qgACARgB1QB9AGQAowDNAG0A0v9r/1r/2f9iADIA6v8wAJgA5wA7AVwBMQH4AA0BVQEIATkA1f/q
+/ygAfwDGAOgAEgFgAaIBkAE5ARMBUwGXAbYBxwGOAdEAEwD9/1sAmQCMAGoAZgBwAEYA4f+L/6b/
+MABWAA8AQwCnAHEA5f+P/5L/s//F//b/DgDb/9H/3f94//b+5v42/6r//f/t/8j/3f8LADQAFwCm
+/zv/UP/n/1sAJgCA/zf/n/8iADwA1f99/8v/NAAiAAkAXgDSANwAeAD4/7L/2P8cABcAyv/A/zgA
+egANAHn/Of9J/5r/5v/B/1D/EP85/2D/B/+B/mT+yv5O/1P/1P6n/hb/lf+Y//n+SP4M/kf+rf6+
+/mn+cf4D/0f/JP9K/8L/+//X/6v/nP+f/8H/2/+S/wP/y/4h/1v/Qf87/yb/+P4K/3L/vf97/0X/
+zv9oAFIA8//n/zYAXwAIAJ3/cv90/5//ev/d/on+m/6Z/rD+Dv8t/+r+AP+E/7H/fv97/3//H/+b
+/lb+J/7G/Sf9qfzG/HD9Nf6S/oT+kv7f/u/+pv6B/oX+Kv6M/Xz9Av5O/if+HP5Z/oP+q/77/kn/
+lP/Y/+//0/+k/4n/gf9u/1n/ef/j/0YAZwBIAAgA9P8EANn/Yv8c/xr/Ef/2/tv+5v4j/2b/o//W
+//L/FABcAKIAlwBlAF8AMgDR/9H//v/M/5T/nf+Z/5L/5/9YAJsArwCaAJEArADHANkA4gDiAPYA
+DgEDAdgAkABXAHUAwADUAKMAcgBvAIsAfQABAHj/df/a/1QAmwCGAGgAgACLAFMAMgBjALYACwFT
+AVMB6ACTAKMAugB9ACIASgDxAEcBEgHaAMAAnwBpADAAGgD1/+z/SQClAN0AJAExAQIBAAEXASUB
+LgH1AKMAlwCTAEgACAAJAOb/cv8Z/x//Yv/D/z4AyAA1AXwBsgHRAewB6gGXAR4BxACzAOMAAQHb
+AMcAMQG0AZMBQQFgAZsBxwH0Ae8B2gHkAbMBSAElAVQBhQGjAcEBwgGUAWMBMgHsAKwAYQAVACwA
+iQDIABYBXgHoAPH/lf/e/ywAgADiACUBTwFKAR0B8QCYABEA1/8gAJoA4QDxAAEBFgEcASwBQgEg
+AfMAAAESAdYAagAiABkARgBEAOL/mv+w/xUAoQD3AOUAqwC+ABUBLgHBABcAo/9x/zn/8f7D/p3+
+k/7C/uH+8P4w/6r/NwCDAEAA4P8gAKoAoQANAKb/nf+V/3//V/84/2z/ev81/0//p/+K/0n/iv/e
+/9f/zP/n/+j/sP+O/4z/df9g/3v/j/9W/yL/NP80/wb/G/96/7f/x//t/zAALwDA/33/rf+m/2f/
+uv9TAD0Aw/+F/03/Ov+a/8b/Sv/8/iH/0v4c/uj9Mf5c/nb+1P73/nP+N/6r/r/+R/7m/ZT9af2b
+/eL9DP4S/i7+uf5i/5f/cv9C/+n+lf6//hr/3f5L/mP+9v4k//j+y/6//gP/cP+F/0f/Vf+U/zz/
+hP5F/mf+k/7U/hn/QP8y/yT/Qf81/xH/CP/h/rb+6v5W/3z/WP8x/0T/dP9Z/y//Nf8q/zD/Yv90
+/2r/ff9y/yD/z/6l/qb+rf5w/in+N/5W/nT+tv7O/tr+N/+z//j/AQAeAFAAPADo/7P/xf/s//7/
+AADv/+f/AwA0AGEAXABCAEsAUwBIAEQAUwBqAHgAdgBrAGgAbABWAEcAiQDRAL0AiQCKALUAvgCe
+AHMAIwDR/73/5P8MAOv/s/+s/5b/fv/Q/ycA8f/S/x0APgBZALYA5gDcAOgA+QANARwB0gBVADEA
+XABVAB4ANwCBAIMAlQD8AF8BtAEKAhkC5QHAAbkByQH8AQMCuAGMAZ0BgAEuATIBgAGRAZEB0AEt
+AnQCiwKRAn4CLALqAcMBdQEvARQBGQEsAR8B/gABASIBUQFxAScB2QAkAZ4BzQHMAaMBWwEqAQwB
+4gDCAI4ALgApAIIArAC8APAAJQEuASwBWgF1AVIBdgH9AS8C2gGDAVIBHQHjALUAfQBGAEYAXwCD
+ALYAzADFAMYAuQCWAKoA6wARARgB9gDHAN0ACAEIARIBHgEMAfoA/AD8AMgAjQCEAIkAcwBTAFwA
+VgD8/9n/OwBkABQAzf+i/57/7f85AEAAKwAFAPj/FwAHAKL/eP+8/9n/vP+o/5X/av8j//b+Gf9o
+/6P/wf/8/10AowCoAHcAVwByAJMAhgBuAG4AWwAQAJT/Lf8K/wD/C/84/0v/Nv8w/1n/of/f/xcA
+VAB1AF4AMgAMAK7/D/+R/n3+qP7j/hj/Cf/0/jT/Pv/W/on+Z/4y/gX+/v0T/iH+EP4V/kb+Kv6s
+/Y397f0d/hD+OP6P/sD+6f4b/w//yP6R/nn+a/6V/uH+6P7G/rn+t/68/sP+u/66/uj+9/66/qT+
+v/7K/tX+y/6x/rD+q/6n/sj+6P7g/rb+sf72/hf/3f6T/lL+K/41/ij+8v3K/Zv9bf2i/Rv+Wv54
+/qj+uf7a/jX/Yf8+/xL/+/4Q/zP//f64/sX+of48/ib+QP49/j7+f/4c/5X/kP+I/5j/fv9//7n/
+3P/L/4//bP+Z/4///f6b/sz+B/8F/yD/nf8iAGIAkQCzANoAEgEoASABBgG4AF4ANQAmACAAJQAo
+AEYAYwBRAIAADAE3AfsACAFLAVwBSAE6AUABLwHgAK0A0wDjAJAAWgCYAMMAvQDrADQBPAEIAfwA
+EgELAQ8BJgEGAcoApwCaALIAywDWAAoBXgGwAfoBHQL/AbkBnAGRAVYBPQFqAW8BHgHFAKMAnwCC
+AFUAJgABACQAXgBmAEcANQBSAH0AmAB9ABcA3P////j/l/9G/x//+v4B/0P/k//U/wYATACsANUA
+owB8AJEAoACgAKwAyQDSAKAAigCjAKsA0wAIAfgA2wD5ADQBTwFDAS4BLwFOAVcBQAEhAQMB7QDp
+APwA9wD5AC0BXwFhARgB3QArAZMBiAFDARsBDgEAAfQA8gDPAKcAzwD2AMEAmgDPAOoAzgDEALsA
+ywDNAIgAcgB5AD4AIQA0ACYANgCDAK4AsQCxAJcAggCPAKcAxwDHAKkA1QAtASIBxACFAIoApQCp
+AKsAxADRANoABwEJAcYAsADKANsA+wAGAdMApgCTAG0AGQDL/7L/j/96/5r/qv+Q/3P/dP+V/8H/
+AAAmAOL/Y/8z/03/Xv80/7b+L/4O/lX+p/7j/g3/Hv9+/y4AcAA6ABsADQDm/9n/1/+O/wv/y/4L
+/0j/RP9k/6T/wf+m/2L/Xf+9/wsAEwAeAGYA1gAmAUwBjAHPAcoBgAEkAeQAoABUAE0AZgBiAF4A
+aACUANQA6ADKAH4AKAA5AJIAgAAIALf/Xv/Y/mj+yP0k/QL9Ff1S/fv9mv66/r3+6v4Z/zH/EP+l
+/lH+Sv4h/r/9gv2T/Zz9Yf1c/bP94v38/Uj+of7M/rz+rf7C/tb+uv5v/hL+2v3J/Z/9cv1O/Qb9
+wPyl/Jv8fvxY/FT8X/x8/Lz82vzJ/KH8gvyp/O38DP0s/Xj92v0//pn+vP5s/hz+kv5S/1j/7v7/
+/k7/Wv9x/7H/1v/E/7L/BwCIAL4A3ABFAdsBKwJcAqACkAJPAlECegKBAmkCVgJGAlEClgLFAq4C
+zwI8A50D/gM2BA0E2QPqAxMECATKA5kDkQOdA8sDBAQBBOMD3wPEA48DbAMsA9MCtwKWAkACCwLV
+AXcBMAH7AK8AQwASAHkA4wDVALcAfQDg/17/IP+5/ir+uP18/YP9fP0F/Wb8Hfwi/AL8tfuV+6H7
+xfsm/J78pfw4/OX74fvt+7n7TfsK+yb7fPu/+6P7Tfsl+0T7eftt+yb7Afsy+7f7N/xI/AD82fsS
+/GH8qPwM/V79lv3m/Tr+bf53/n/+mv66/uj+Rv+f/4D/Rv9//8L/tP+R/5v/GwA6AXECGgNBA0AD
+cAPPAwgE9AP0A38EXgU+Bv8GdwdwBwAHswaxBtgGLweRB7wHywffBxAIjwgYCRoJ4wgXCZcJHQqT
+CrIKRwqPCfcIrAhECHEHugZfBhUGngUgBQ8FMwUJBcYEwATqBA4F4QRXBM8DHQMcAp0BfAG2AJ3/
+/P7G/qT+ef4s/sz9jv2I/ZX9fP1K/TL9Pv0W/YP8/fvP+6b7Gvtm+hb6H/o4+k36P/og+iv6OvoV
++vf5PPq8+hX7H/vt+tH66frw+rb6d/pt+p76//o4+0L7b/um+8/75vvo+/X7IPyO/Dz91P0J/hD+
+Vv7g/lX/mf/j/wUA4P8YANcAKgHDAHQAiQDgAGgBuQHqAVoCvQIOA4MDrgNvAzQDMQNFA1UDeQN3
+AzADAAMJAx0DFAMHAwIDHAN6A7UDiQNIAyADCwMBA7UCIQK4AYgBWQETAcYAogCeAG0AIgD6/93/
+q/9Q//j+3P7N/qn+cv4Y/pL9D/2//ID8Tfz/+137I/tk+zH7xvqL+hj6n/mi+ev5O/p4+nz6a/py
++lz6HfoB+uH5f/k3+WX5nvlU+RL5YPnL+Rn6f/rp+i77aPuv+w38b/y2/Oz8Jf1T/WX9i/0A/oL+
+u/7c/kn/4/9VAKAA4AAoAXsBrQHFARICjQL7AlcDcgNUA0QDNQM2A1EDUwM9A0wDhgOJA3IDpQO8
+A5EDmgO/A9AD+wMZBBEECATZA6cDtgOvA0ADzwLbAgoD1AJ/Al8CNgIGAhoCQQI+AjMCMgI1AikC
+zwFGAcEARQAXACwAKQAiAE4AXQASAML/l/9j/yX/AP/q/tP+pv5a/jL+Mv4Z/v/9Ef43/lb+bP50
+/mn+L/7s/dj9rP2C/cv9Mf4s/hb+Wv6u/tH+1f7e/vX+6v7h/v3+5P6W/nv+sP70/hn/UP/I/0QA
+vwBxASMCeAKeArQCsQK5ArUCkwKeAucCKANNA3IDlAOwA+4DZgSlBIwEgwShBMYEsQRNBPkDygOb
+A3UDdQOTA5MDkgPBA90DwQObA4IDcgNRAysDGwPoAlUC7wE0AmYC9AFOAeIArgCmAKQAmACWAGQA
+PQCBAJcAEwB6/zr/JP8E/+b+wf5u/kD+i/7P/qb+Y/5N/lr+Yf4y/tH9ov3H/ev9+P39/eP9yv26
+/a/9u/3A/cb90f3l/SL+Yf5e/j/+Tv5r/nD+jP7a/hn/Nf9D/0z/Z/+Z/+H/BwAOAC4AHADq/yMA
+eABXAAgA5P/O/9L/AQAdAAYA7/8WAHgAqgBpABkAPwCbAKUAdABkAF8AOABSAMoA7gCrAJUAvQDq
+AOgAxQCpAIYAcwBsAHAAigB9AHYAlgCNAEkA+v/r/wAA1f+y/+b/FgALAA4APwBnAFQACQDN/6r/
+af8X//L+7f7Z/rD+b/4s/t79Z/0g/T39VP1B/U/9Wv1g/bv9Cv7i/aH9kP2g/br9s/13/TH9B/0B
+/Sv9Vv1j/XX9xP1g/vD+MP8m/w3/U//i/yIAFAAPABEABADm/8H/kf9H/zT/a/9u/1b/ev+6/+v/
+FgA9AGkAvADlAMwA0QDbAK8AZAAyAAoA+/8xAGUAWQA/ACIAKACDAK4AjADCAAABwQCbAMgA0wCa
+ACUA8P9RAKgAXwD//yUAZABGADgAXgA7AM//ov+6/7j/nf+R/4D/Sv8R/+v+4v4d/3b/ov+s/7P/
+v//u/xEA+v/i//D/DwAzAE0AQgARAPL/1/+d/5D/0f////r/BQAiACAABgDZ/6j/o//N/9b/h/9q
+/7P/v/+T/5X/mf+a/97/LQBDAFUAkwDgAPQAywC3ANYAEAEpAR4BHgEMAekA5gAQAUEBVwFdAUwB
+TAFuAXUBQgEcASUBTwG4AQ8C5AGWAYUBigF4AV4BXgFgAVMBTwFcAWYBPgHwAOEAPAGVAZwBmQGg
+AYABTgEsARoB+QDKAL8AkgAwADcAbwBAAOn/q/+b/83/8P8EAE4AcABHACUAHwAGANT/2f/w/9P/
+x//p/w8ABAC+/5f/uf/9/zsAWAB8AMUA4gDHAMkA8QAaAT4BWwFXATIBKAExARgBAQH8ANYArADC
+ABMBNAHzALQAoACRAIoAawBLAFsAUwAuAC8ATQBNABUAwf9c/xT/VP/U//L/0f/K/+D/HwBxAIAA
+TgAOAOL/DgBiAEYA5/+s/37/SP8c/xL/F//x/v/+ev/h//X/2v+//7f/tv/C//L/KwBdAHcAJgCH
+/03/gf9y/xf/+v4//6//BwAtAC4AJgAYAAQA+//a/6b/m/+l/3n/8/52/mz+f/5o/ln+Yv44/gv+
+UP6V/oD+f/6J/nL+z/6h/wgA7//Y/wYALwD4/5z/Y/85/wP/zf66/uL++v7C/ov+kv7Q/kf/v//e
+/9j/5P/D/2n/Lf88/1r/TP8U/wH/WP+p/3z/Iv8d/47/QwC9AKQAOQDF/zv/of4s/hX+VP6x/uT+
+3/7X/vz+Vv97/17/qP9zADABfwGMAVYBwAAdAHv/u/5T/mT+g/5z/jv+NP5o/lz+CP7H/fL93/5R
+AIUB9gGxARQBWwBq/yj+Fv2y/Kr8nfy9/P38Af2l/Dn8W/wW/fL9tv5R/7r/yf9w/97+Mf6I/Qf9
+3Pz7/CX9Tv2R/eb98f25/cn9Ov7L/mD/3/9CAH4AfAA5ALT/Jv+d/jn+bf77/lH/j/+j/3v/kf/C
+/6v/m/+2/8j/+P9TAFMA8P+s/4X/Zv9g/4H/vf8SAI8AzwCcAHcAlgCGAFYAbACeAMgA0wCtAKcA
+6AAVARkBLQFcAbEBGAJsApACeQJhAlECIgKmAfUAhQCSANIA+ABUAeIBSAKNArUCwwLGAuYCGAMg
+AxMDvwIXArkBjgENAW4AAADn/2oATAEjAvkCkwPuA2oErQREBLgDgANkA0EDLAMrAzADGgMNAzID
+ZAOgA+gDHgRZBJ4EqASbBNIE8QSiBHYEyQQKBcoEewRtBFUEEATXA8kDrwOAA2cDRwMAA5ACGALV
+AZsBMQHiAPIAQAGMAbABswGeAV4BPQFvAWsBKgHwAHEA0f9w/yj/2/6C/hP+6/1d/gD/PP8w/0j/
+jf+z/6L/j/9l/x3/3v53/un9if1t/Vv9If3Y/Ov8Vf2o/fb9Wf6L/pj+zP4N/yL/AP/G/rT+q/5z
+/j/+KP4b/i3+Vv6R/uD+F/8n/zr/iP/3/wsAw/97/1n/WP9y/5//rP9u/0j/mP8AAPf/zv/y/yEA
+SQBTADsAXgCRAH8AfgCkAIoATABTAIAAlACZAJQAegB3AM0AVwGcAXwBVwFLAR0BzACEAFwAKwDZ
+/5H/b/9p/0T/CP/+/h3/V/+V/5z/dP9M/yX/7P6k/l/+Lv4Y/hD+7v27/Zz9hf1k/U79a/2t/dz9
+7v3//Sf+Lf7L/WT9RP0M/b78qvy6/Kv8ZfxC/I385/zp/NL8//xG/V79VP1T/Tz98vy3/L785/wL
+/Rz9G/0E/Q79Y/2f/ZD9fv2Z/cX9yv2x/b/9+f0W/vP9rP2n/dP9wv2w/d796v2i/WT9bf2R/ZH9
+cP1Q/SH9w/xV/B38Cvzt+8n7tPua+1D7H/tM+2P7Pvs/+0r7OftL+3X7fvtP++/6v/ry+g/76/re
++v/6Hfsg+yX7P/t4++j7cfy7/MD86/wq/TX9Zv2y/dj9L/67/hr/Nf8+/13/l//f/xQAUQCrAAkB
+fAEpAhIDzgP+AwkEYQTpBEIFXAWFBecFbwbfBkcHCQgqCSsKmgp7CuwJkAkICnsKRQofCkgKbAqM
+CpAKhArOCkALiQsEDKoM3Ay5DMYMrgz5CysLxApACikJFAizB64HYQfHBkMGKwY9BvoFxAXsBe4F
+agV1BF8DaAKAAYcAmP/N/jz+2v1c/df8kPxR/Af80/u4+6z7q/vX+xD8JfwE/J77F/um+l76Ifr4
++en5m/lK+aL5P/pd+jv6R/qB+vr6jPvV+wH8TfyN/PP8lf3d/eT9Mv60/kX/6/+FAMoA1AAJAYoB
+FgJxApICkALBAkcD4ANQBKsEJAWzBTAGhwasBscGFQc3B+QGmwacBqIGewYUBp8FWwUzBSEFEgXu
+BPcEKwUqBfcEogQoBM4DiwMYA5QCQQLnAYUBdQFXAdQAPwC9/17/K//p/pj+Rv7h/af9o/1U/aP8
+DPy9+4/7Tvvp+on6Dfp5+WH5v/n6+dX5hPlj+YT5k/lm+Tf5N/lM+XT5kPlo+Vf5lfnM+cr5tvns
++Wn6vfry+mf74/sv/Gv8ofz3/Gr9pf2v/d39VP7Z/h7/MP9g/7n/BABCAGkAQQDi/9b/TACmAI4A
+cgCLAMEANgGnAasBlQGeAbgBGAKCAlkC3AHAAfMBCALrAb8BlQF7AZoB1wHMAaUBsQGrAXUBNgEU
+ASIBFgGdAPr/tf+0/4T/Bf97/i7+Af7G/Yn9ZP1T/TL99vy0/IP8Wvwz/Cz8EvzX+7v7tfvD++j7
+Efwj/Of7kPvT+2/8Tvyt+4/7rfud+637s/u/+w38RPxu/Or8XP1M/Tn9nv0J/kT+jf7X/uX+E/9c
+AHcCaANpAt8AOABXAFkAMAB2AGUBdALCAh8CfAHeAQED/wPwBDoGWgetB0sHmAbhBWoFAgX1A3QC
+9AG4AjADpAL6AeoBPQKsAisDpANQBE0FtAWgBMsCXwEmAPT+Uv7x/WP9NP2p/fv9mf0X/T792/05
+/kv+sv6B//T/rv8A/zP+N/0f/Jr79PuC/NP8Gf27/af+Sf9O/wj/4v7B/sP+JP9e/+v+UP4S/tf9
+Wf0n/cn9uf5P/9v/xQCxAfEBdQHjAJcATQAGALj/OP/m/uP+z/53/ij+J/6h/gkA0QGpAsMC8gLs
+AkACSgGQACIA0f9y/zz/SP81/w3/MP+D/93/UgDMAFAB8QFgAqMC2gJxAjsBFQCN/0//8v6d/sn+
+U/+i/7r/JwDVADABTwGLAeUBBQKqAesA7P/5/m/+LP7r/dj9Fv5r/oj+Y/40/jf+i/75/iH/1v5C
+/sL9j/1d/bv84vuT+wH8Zfxv/IT83vyR/XH+/P7i/nb+Uv7G/nD/k/87/7b+Dv62/cH93P0Z/qX+
+tf/4AJMBbQE6AYgBHgJxAnsCvgJlA6UDHgOLArkCgAMEBNMDhgMUBB4FeAUOBZQEuQRZBY4FGgWu
+BL4EDgVCBSsF2wSoBNMEGwVfBbkFJgaQBrwGsQbgBiIHvgbZBREFnwSuBPYE5gSoBHAEJgQMBPgD
+rgOwAwMEDwS0A1kDXQN3AzcDwwJoAgECkgFPAQgBkAAVAKT/RP9L/5v/xv/N/9H/2v8NADoA5v8o
+/3D+9P2T/Rv9bPy0+1z7Rfvx+nj6U/qb+vz6NftZ+2/7lfv5+2f8svzZ/PL88fx9/OD74vtA/EP8
+Nfxu/L/8PP2//ez94v3S/ff9a/63/o7+a/7f/tj/wgAmASMBGwE2AV4BdAGHAY8BgAE/AekA5gD6
+ANMAowCFALsASQHCAfUB+QHeAbIBvAEKAlYClAKkAmcCEALXAYQBxgD4/4H/IP/H/uD+N/8R/5D+
+Zv5p/lL+Wv44/sH9x/1U/kb+m/0//RX9u/xq/ET8Pvw2/Bv8E/wQ/PT71Pu0+2n7M/td+377cvtp
++437/vtc/Hb8pfwR/ZT93/3V/b394/00/nb+m/5x/iv+Xf7K/gf/M/9v/8z/QAC7ACwBwAEGA8AE
+wwW/BWwFAAUUBOQCEQLPATAC5QIHA3wCTwIlA1AEAAWKBWsGfgcnCL8HegZIBdEEtQT/A9YCMgJD
+AqsCSAPtAzQEMAQXBNUDzQN9BIMF7AV3BaMEUQNLAV3/Uf4c/oL+Tf8HAGYAgwA5AIf/5f6L/mj+
+Yv5C/s79I/2S/Nj7o/pP+Yj4vvho+fr5zPrU+4f8kfz5+xn7bvpC+nz6tfq++rz6r/ql+ur6Ivsa
++6X72fzt/aH+FP8r/8X+Av4l/Zf8f/yN/L/8OP3M/VL+q/7c/uj++/6K/5oAcAGPAWsBUQHeAPT/
+5/4a/uP9Lv6G/tT+H/9R/4j/xP/g/+P/CAB2AMIApwAvAGf/jP6w/an8s/tD+zP7SPuu+zj8R/zr
++/z7f/y6/Ij8Kfy2+xz7bvrc+Wr5Xvnz+ZL6sfq2+vr6P/uT+0L8EP20/ev9VP1f/NT70fsA/AT8
+2fvd+1v8DP1D/S79xf0N/wIA+/+j/ycAFAEPAToA4v9pAAQBNwFxATgCcQOoBKEFVwbXBjgH5Acm
+CaoKCwwvDe4NIQ7vDa4NbQ0NDRMNAg7aDpwO+A3jDZQOtw9fEEcQYhDlEOwQCBC7DvIN/g3vDfcM
+sgulCpMJpAjpBwgH9QVNBXIFkAXfBCQELwRuBCUERgMJArwAzf86/3f+ZP1V/Jz7KPuO+p/5yPiK
++Ib4M/i09073HfcQ9/f2rfY69tz1sPWB9T/1FvX49Pj0MfVG9UH1lfUs9qn24fbQ9nb2GPZP9vD2
+fPc3+F35g/pa+yD87fyh/UX+8f6g/ycAZQCAAOkAkAEDAkQCpgIQAx0DMQPiA/4EFAb4Br0HWAiz
+CN8I5Ai+CIUIUwgVCKkHRAcvB0sHWAdJBzMHNwdPB38H2gchCAIIoAdNB+EGIwYqBS8EdAPvAlgC
+hwGlABoABwAOAMr/K/+6/sv+m/7C/er8VfzN+yv7TvqM+S/5z/hQ+An4wPc599v24fbr9t328PYe
+9yf3/vbh9vj2FvcO9xH3M/dV94j3xfcs+M34UvmX+c354fm9+a751fkp+sT6ffsd/Jv8CP1s/af9
+9P2d/kT/v/9OAOwAbQHoAZMCjAOqBJkFOwajBu4G7gY1BhcFpQQfBaAFngWJBcoFZQb4BjoHowd0
+CGYJXAriCnwKhgmeCM8HuwZ7BZIEBQSGAxID4gI0A/4DmwSvBMQEKQWUBaAFVAX3BHIEeQO2AZP/
+7P3w/FD85fvp+1v87/yQ/fH9o/3y/Jv8vfzJ/Hb8Bvyg+w37Evrw+BD4oveb9833U/hB+SX6nfry
++kj7KfuC+t75iPlw+Yj5qPmx+Z35nfnu+Vz6tvpR+3X8tf1q/qL+qP5n/g3++f0k/lP+gv7R/hD/
+Fv9c//T/YwDKAFsB6QF4AtkC4wLKAl4CkwHEAPz/O//L/uX+af/y/zcAWQCTAPIAUwFYAQIB2QDd
+AJMA8f87/4X+5v1//QT9Yfzt+837XPxb/df9AP5q/pv+S/7Y/Vr93/x//CX82/uN++f67Pkh+fX4
+OPmd+Sb6kfqo+sn6JPtt+1X7I/tZ+5v7cPsu+zX7cPuD+1X7a/v5+3v8aPwL/DX82/xH/Rn9vPzs
+/H/9s/2n/Q7+0/5+//T/PQA/ABcANgBmADkA5//8/30ArQCAAMgAhwECAkcC4gLeAwoF+QVwBvsG
+mQeyB/AHrQkzDIcNfg1DDUYNEg2DDPULvAt8DNYNIA48DbgMaw22DrEPPRCSEPsQfxFmEUMQ/w7l
+DqQPhw/6DfULZwqXCRoJbQirBxYHmQYoBsMFhQWRBaYFpAV7BY8EpQLGAOH/hP/J/rf9Hf3c/Oj7
+fPqx+Vf51viM+F742fdO9xX3Q/ei9673V/fx9p72OPai9fz0ifSZ9D31y/Wt9VP1fPUj9qD2ifY1
+9l72TPdf+AD5afkk+iL79vto/Jr88fxi/X39XP1l/dz9pv5b/+3/fwAUAYQBmQGsATkCRAORBLAF
+SgZ/Bp8G1QYOBxsH8AajBnAGggZjBvMF/gWtBkwHiAdjBwYHyQbgBhYHTQdvB2YHdwdgB8kGKQbS
+BbAFbQWlBLUDLQPlAqEChQKhAroCmQJGAtEBGwFdACwAZwBeAPD/Tv+h/iz+5P2K/S797fyG/Nn7
+QvvQ+lz6Hvo5+mD6Mvqy+V75TPkv+QD5vfiZ+ML44PjR+PL4G/n2+PH4J/n++KT4i/iF+Jb41/gh
++Yr5+vk1+rn6wfuB/LT8Af1w/an94/1A/m3+WP5d/rf+Kf+T/0YAGQHOAUADcQY7CtML2wqbCREJ
+KwguBvoDLQOaBM4GFgdJBfADqATLBsUI8QkDC+MMLg/hD6UN+gmWBycHwwbiBI4CNAGMAOH/L//X
+/jz/OABCAZUCHwTOBGsE1AM7A+0BPP+z+yf5Ifie9yf39fYC9yP3UPeP9w74+/hJ+sz7Dv0v/RD8
+ovpc+fX3XPYf9RL1Hvbx9tD2r/aE99/42fk0+lb6g/qF+jr6rfkN+Z34TfgZ+BT4Pviv+G35hPq0
++4P8Ef28/RD+af1n/Bn8bPxj/KL7KvuR++T7x/v5+838b/6dAPQB0gETAV8Axv9m//r+P/7F/dz9
+CP7O/VT9Jf2P/ZX+oP8gAFwAqwDeALoAZADr/zT/N/4C/cz7EPs++/v7jfyx/Lf87fwQ/Qz9O/2V
+/Qn+lP6o/uT9nPxb+5D6Svo5+jT6iPoj+4X7svsN/Ir87fwt/Ub9FP2t/If8fvw6/BX8LvxH/GL8
+efyC/Nb8hf07/t/+Uf+K/5D/G/9h/v/9+f0W/kj+kP4o/9f/HABLAPsA/QHiAo8DKAQDBQUGqQb/
+BkgHgQeoBwYIGwmTCrMLlgyVDZUOAg+TDuwNvA1JDlcPBRDqD7wPAhBxELMQsRCjEP0Q4RF7EhwS
+YBH0EK8QRRB4D0MO2gxMC/QJOgnwCAMJYQmbCYgJhQmJCQsJZQiECOcITAjeBm0FGQTKApABkwDX
+/xb/R/59/bL8//uT+4X7s/u7+6X72Ps5/Cb8cfui+gT6h/kP+Wf43ffh9y74N/gN+BL4Lfg6+ED4
+bfjG+PX4NPn5+bL67/pK+/v7bvxr/Hz8GP3R/Qr+B/4b/i3+df4H/4b/9/+JAB4BfAGrAcgBLAIW
+AxsE9gSLBcwF2gW7BXYFPQVQBZAFnQVZBQgFxgSSBJwE+wRuBa0FugWqBZ4FrQWkBVwFPAVvBWkF
+4AQDBDADygKXAiYClQE8ASIBEAH9APsAFQEcAeIAggD0/zf/lf5J/ib+t/1H/Sv90fwP/Fj73fqM
++l76Y/qF+m/6Efrj+fH5mvny+Lr46Pja+JP4j/i1+MX47vhL+aL5w/nX+cr5fvln+YX5X/kp+VD5
+hPl8+aP5Ffqc+jL7qfsb/Mz8bP2y/cf94P3u/c39kv15/Zb9x/3Q/c/9AP5Q/pv+3f5C/9n/SwB9
+ABABXgLvAx0FRQVrBGgDkgKxAc0AUwDIANIBUgIoAtkBdwErAVEBEQIFA/cDHAXyBcEFygTXAygD
+cQKaAcYA9/9Q/9n+Pf5f/Zb8W/y2/E/93v1D/nv+ov7I/pn+2/3q/Oz70PoU+uT5w/lX+az4CPi1
+9633zPf89xD4Pvj5+OL5Jvrk+ZP5Dfl5+Gr4gfhG+Hf4Qfm1+b359Pkn+iT6I/o1+qD6U/u0+7D7
+rvvL+/X7Mvx9/I38Wfxp/PP8Zv1q/Yr92v3h/cf9v/2f/Xf9fv3D/RT+Nf4r/jD+hv4P/23/nP+0
+/57/kf8LAK0A1QDOAA4BeAGcAVYB7ACtAIYAKgCp/2f/hv+t/9f/AwD9/0IA/gB5AaEBuAHHAcsB
+kAEpAd8AhgD+/6b/gv8M/1P+8/3f/bv9v/0d/o3+5P5K/7P/8//4/8P/ev8n/9X+nv5x/nn+5v49
+/yf//P7X/qj+p/7d/ib/Tv89/zz/d/+n/6T/gf9Y/0r/Zf+u/wIAPACGAOMAMQFyAYkBOgGkAFsA
+igC2AFYA0P/z/3YAnwB4AGwAuAB9AXACBQNBA24DowPFA80DBQRWBGoEbgSSBM0EHQWGBeQFVwZa
+B4kISwnbCWwKwgrwCnkLEQwHDOMLSgy7DMIMigwuDAcMOQxDDDMMWwzKDHcNDA5JDkkOKw7ZDVoN
+0AxdDBMMqwsWC40KBgprCbwICAiIB3UHmgdtBy0HeAe9B3QH+QZ2Bv8FpQU9BcsEXQTiA14D9wKT
+AkcCegLsAh8DOgN+A70DmgNBAwsDvAJRAuwBawH5AM0AwQDEAMYAiAAsAOX/pf+I/5n/Z//m/sb+
+4P6Q/g7+r/1N/cr8Tfzs+6D7mvvp+zT8XPyV/Pf8I/3l/Lv8z/zP/Lv8pPxf/O/7lft5+3/7W/sN
++w37ZPvf+6j8ev3e/Rz+d/7L/hz/Sv/2/lj+9f23/Wj9Jv3s/If8JvwY/En8k/zf/BX9Mv1Q/Xf9
+g/1g/R/9xPxf/ED8V/ws/Nr7pPt8+2r7ivvU+zj8jvyq/L38+fwg/Rn9F/0k/Q/9yfyk/J38Vvz9
++977wfte+wD7OPvQ+wn85/vY+9L7y/vx+wH8yfuQ+zr73frK+pj6Fvrc+eL5xPm++Qj6Yfpu+k76
+ePrR+uv60vq++tH6hPsG/ZX9qvsV+VD44fnA+5r7EPuP/Ov+pP/s/Wf7rvpA/Kn+lAArAa4A1P+a
+/jn9SfxF/GX9E/9IAMYAxwAyADD/mf49/6YAhwG0AcYBlAHTAKT/Pf5w/ev9x/7u/pH+Nv5D/r3+
++P7o/iD/rf9OAOgAOQEPAbgAigCEAJoAqgCDABYAdf/7/gb/af/K/wMAIwB+ABwBiwGQAX8BmgGW
+ATUBlgADAJv/Kv/J/sT+0f60/qH+jf6D/t3+bf+l/2D/A//M/pj+Uv4R/uH9if06/VL9R/3c/MX8
+Jv2X/dv91/2+/cf9zv28/cb9xf17/Rf9xPyX/KP82PwT/VP9pP0N/nj+nf6d/r/+7/4e/zL/K/9F
+/3j/jv+F/5z/5f8iAEEAZgCQAKQAwgD+AAgB3QDYAPQA6gDaAAcBIAHzAMcAtgC1ANIA4QDRAO8A
+PwF6AZABlgF0AQcBqQCuAKMAZwBhAGYAfQDcABIBBgErAXABrwHzAeMBmAGmAfoBJwINAtgBpQFk
+AR4BBQH2AMoA2AAXAUoBfwGgAaoBxgHlAfQB9gHnAboBYQEFAZ0A6v9z/5n/uf+L/1b/Qf84/y3/
+Rf9i/3b/of/L//P/AQDF/6P/9/9kAKUAqgCHAOYA4AGEArcCSwMsBNAEUAWgBcEFIQZ/BoYGsQb/
+BucG9QbAB8sIxAmXCjsL1QuJDIANZg6VDjcO2g10De8MaAzgC5ALgQt7C6kL/gsTDEQM5QyMDfMN
+Mw5qDpsOvQ6qDtsNdAwzCywKKgl2CCUI4gfFBx0IpQjeCNUI9QhbCcwJIQpBCtYJpghUB6UG7gWK
+BGcD7QJ7AkoCrwIXA1EDeAOXA6EDOANkAq4BLQGBAJD/ef4m/an7aPq1+Wf5F/nb+ND45/gz+Wz5
+UfkR+br4Ofin9yP3kPat9Zj01/OK82HzQvNR86LzKvTe9JT1J/a19ij3TvdZ9zP3mPYF9sL1UvWp
+9EL0HvQR9Dv0g/Sl9N/0gPVx9l73w/e599j3Kvge+IP39fbV9sD2tPb89jn3ZPfy95X4FPm++WX6
+1fpT+/L7a/yS/Jz8o/yF/Gz8hPyg/Mn8Ev1Y/b79Y/4L/3L/wf86ALcA1gClAIAAdABlAEkAEwCy
+/1r/Tv9d/2b/nv/7/1EAfQBgAAcAqP91/1//VP9Z/zb/qv7Y/UD9AP2s/G38m/zM/O38Gf1S/aT9
+qv16/a799f3C/YT9q/27/VD9Lf23/TT+Nf4m/o7+Uv/g/woA9f/k/yUAQQD2/+j/OgBbADwAOAB9
+ANsA7gDHAKwA1QBIAawB/wFOAkQC6wG5AcQB5QEgAioCzwGIAZcBygELAlYCkQJwAuYB2QGjAioD
+4wJvAkACRAJLAj4CcwLZArcCPQIzAl8CQAIUAicCcwKbAoECbQJLAkICbwJxAlwCRgLwAZUBbwFm
+AWgBSAE3AYIBzwHSAcEBxgHJAbQBhgFRAT4BHgG0AEcA/v+e/yv/5P7I/tD++f4N//L+wv60/ob+
+Df7m/RP+7P2J/VL9Hf2K/CH8d/yr/Fr8R/x5/Kv87fz5/L/8s/zo/DD9i/2+/Xz9I/0m/Tv9PP2H
+/ez9x/1w/bH9NP5W/i/+HP4e/iH+Jv4y/k/+Xf5k/oD+of6h/oD+d/6b/r3+vP68/uP+//4M/0L/
+af9v/5H/1P8QACkAMgA6AC8AQQCCALUAwQC5AKsAYAAEAEEAvgCbAE8AZABpAIAAywDbAOcA5QCp
+AMwAGQHcAGkAVwCTALsApwBBAJ//VP+T/9b/6f8uAH0AagBZAKUA9QD1ALcASwAPADcAKgCb/w7/
++f4x/1P/dP++/9z/pf9q/1r/bv+o//z/fgA/Af4BdgKhAtwCYwP9A1YEJwS2A50DAQREBO0DvwNs
+BHIFiAbMB9QIcwksCkoLegwoDScN+AzcDG0MhQunCksKIArICYYJjQnGCSMKuwpjC9kLWgwGDXUN
+kQ1wDQcNeAyWC2AKagnECD8IDggACLIHlgclCOsIgAkNCpwK+woqCy0LyQrTCWoI+gbQBd0EKARx
+A6cCYAKbAscC4AL7AsACZQKhAsMCxwF0AFH/yf0T/Kr6i/ni+IX48/eA96j3/vc2+Gb4a/hh+Jn4
+5Pib+MH3Ife69uz12PQJ9JPzNfPt8tzyGPPJ86/0P/Wn9Uv27vZU93z3dvdm91f3Pvf19ov2Nfbo
+9cn1EPal9iT3cff597X4aPni+fz5Gvpe+kv68PnG+XP5uPib+Hn5MPpQ+ob6GPvZ+6b8Of2Z/fr9
+Ev71/Sr+af6A/sD+0v6f/tL+bf/O/+f/JwDQAKkBTAKyAgUDUwOiA7oDZwPkAmcC5AFyATQBHQEa
+AScBJQEMAf8AEgFSAZ8B4AEtAjUCogHiAGcAHQDQ/3r/Wf8a/4z+Pv45/gv+4v0a/oz+2/7U/tv+
+Jv8c/4r+5/1//VX9VP01/d38xfwf/Wv9fv2L/Zj9tf3z/VX+nv6X/sP+bv/k/7f/W/8k/wH/GP9v
+/6n/lf+L/zQAgAGsAlYDcANMA4wDUAQCBeMELwSsA20DewPUA/0DlwOoAusBNwJFA04E4QT6BP4E
+HgU/BVYFbAVZBbsEowO/AoACdwIKAo8BUQHhAF4AYQDiAJcBQQJ4AkkCGgITAjUCLQJ8AS4AF//G
+/q7+Pf6//X39Wf1p/QD+2/5G/yb/EP89/0H/3P5Y/r/9t/y5+2P7M/u2+if6qflL+TH5ifkY+lf6
+K/rt+fz5R/p6+nj6M/qz+UX5//jL+Lj41vj4+AD5G/mJ+Rf6bPq9+jb7dPtf+4T74fv0+9L7qvua
++5/7ivu9+1781fzk/Ab9m/0//pX+7P46/y7/Av8J/zn/ZP95/1L/6/7D/gb/Sf9+/+b/QQBtAMkA
+UgHGARYCEQKmAUoBZAHBAcoBVgHeALYAvQC2AJkAiwCTAIgAngD9ADUBGAHpAMoAnABiAGAAWgDq
+/5H/wf/W/5n/dv9i/0P/OP8p/wr/3v6r/rT+1P53/tr9uf3X/cj9r/2O/WL9K/0j/YD9yf23/XP9
+Lf0f/V/97/2u/lH/2P+IAFkBJgLpAoIDCwSUBPUEQgWGBXsFLwUPBVUF0gVaBi0HnAhiCtgL0wzB
+DcgOeQ+nD48Pcw9bD+AOxw1+DKoLVQvJChwKJwriCt0LzQxvDf8NtA5ZD8cP3g9/D7gOxw3eDO0L
+Aws+Cm4JvQjxCBEKDQuHC+wLVAzVDHMNzA2UDQENZwyOC1UKLAktCBkHLgaSBSwFHAUwBQ4FzQSe
+BIYEUwTDA+QC8AH4ALL/Bf6L/IP7jfqo+RL50/jt+En5w/ki+gj6tvmk+cD5pfkb+Ur4ZfeV9vb1
+ffUN9ZD0UfSs9Ff1wvUe9sX2Zvfa9zX4avhU+BX4Dfjx94f3C/es9oz2n/ba9i73vveo+Ib5IvqP
++tn6/foN+wT73PrL+rH6lvqz+ub6MPue+wT8efw//Sb+1f5Q/7P/BAAfAP//1//D/8H/w/+1/0D/
+qv6u/tb+t/7g/mz/4f9vAEAB5AFNAl0CAwKiATABfgDi/4f/B/9X/vf9Ff5t/rb+Cf9i/3//l//7
+/2AAXADa/zf/7f7s/rf+Pv7U/W39+fza/Bz9Pv0W/c78kfyN/Iz8Ovyu+0T7/vq1+nf6Rvol+iv6
+YPqg+tD6DvtO+3/7xPsX/FH8U/wS/NL7+PtR/Er8EPwJ/DL8sPx1/RL+ZP5r/in+//06/mn+Xv6D
+/tn+Yv9oAMgB2QL8An8CKgJKAtkCcwOUA3gDhwOUA3MDOgMdAwMDzwKsAsgCegNqBKUESQQGBBkE
+hgQ2BaMFiwVPBQoFcwS2AyMDdQJ6AZ8ATgBeAIoAxAD0AAoBEwEZAScBRwE/AdEAUwAhAPr/s/9t
+//X+Pf6f/TT9+fwL/Qr9efzN+8P7KvxZ/BL8c/vD+l/6cfq/+vr6D/vm+oj6MPrg+aD5q/nW+cz5
+rfmh+Z35lPll+fD4ffhx+OD4gPnp+Rr6G/rN+Y35u/kc+n/67/pi++77vPxr/Z79ev0g/bn8ovzt
+/GH91/3z/Xb9Fv0n/QP9zvz8/HH9Fv7f/rP/hQD0AJ0AMABJAFgAMwBQAJEAuADEALMAiwB1ALYA
+MgFyAXUBlAHrATQCNAL0Aa0BnwGhAZcB0QEVAu8BsAHgASsCDwKjAVwBjQHTAZEB8ACWAGQA8/98
+/z//Nf9V/5D/pf+X/73/4//K/+f/PABdAH8AuACSAB8AtP8w/6H+Tv4g/uv9w/20/cj9A/4U/j/+
+7P6h/9v/vP+y/9T/CQB3ABMBmAESAucC+wPTBHMF7gUdBjoGhwbrBl4H3wcuCEIIiAguCSYKUgtu
+DHENmw7oD/4QnxGzEYURZBEgEZUQ1A8fD3wOpg3oDKkM0wxLDegNjw41D60PVRBMEZoR/RBOEM8P
+OQ+GDr0N5wwWDE8L1wrQCtYKpQqlCjYL7AtgDMoMHA29DNELIgt+Cm4JTAhGByIGDAVpBCIE8gMe
+BIwEYQRwA70C1ALYAiECLAFgAHT/FP5l/AD7LPqC+aP42fe+92P4JPlX+Tj5ZPmk+YT5DPlx+Nv3
+PveD9tH1TvXw9KX0TvS+81nzuPOR9Gj1OfbM9gn3TfeS95b3dvdD9832Jvaz9Zv1ZfXm9Ln0IfWq
+9SX21PaO9x34tfhM+aX55vkn+iz64vmK+WT5avld+TX5OPmK+Q/6l/oI+3X7/Pt0/L/8Af1G/X/9
+qf20/a/9k/07/d786/xW/bn98v1I/sr+Bv///vb+wP6S/pz+hP5a/lf+V/5R/kL++v2h/X39Vv39
+/N/8Lv14/Zb9pf2F/RP9ovxy/EL87vuw+5T7mvvS+/X79/sC/OH7xvsn/H38Ufw9/Jz81/zG/Nv8
+8vzS/Jz8YvxA/Ef8aPzD/Fj9hP0f/dv8xPx1/An8tvul+8/7FPx1/NL8Hv2Q/TD+rv7m/g7/Jf8o
+/2P/ov+J/1v/QP83/4b/BgBqABgBEgK+Ah4DqQNYBK4EwAT2BBoFvwQxBNcDcwP3AsEC+AJTA6sD
+HwR9BLUE5gQPBS8FFAWsBEsEEgSyAyADmwL5ASMBiwBrAIsAtwD4AGIB5gFWApUCtgLIAqYCKwKC
+AQEBdgCX/7r+UP4y/hv+Df4H/kP+6f5c/xz/t/6k/qz+yv7E/gj+2Pzj+0D73/qx+of6UfpD+rb6
+g/sU/DX8G/wB/Az8NPws/NP7b/sr++f6qvqB+l36afqw+vD6QvvW+4f8Sf0c/q7+zv6u/nj+QP4D
+/s79qf2X/dv9b/7p/kX/yv9DAIsA+gCEAcQB8QFsApsCHwKqAU4BwgBhAD8ALwA2AHYAKgH5ATYC
+AQIJApkCIAMdAxsDZgNrAwYDlQJTAkQCTQJKAkECbwLyAmMDhwObA4ADRgNIAzQD2gKQAmICAwJ7
+AUIBWwFJAekApQCrAOMAOAF9AX8BQQH+ANQAsACBADQAw/9f//3+lv58/pD+V/7N/VL9Vf3X/Sf+
+Cv7r/eL9/f06/l3+ev6n/gH/5/8lASYCzwI0A4QDJQTcBCIFHQUEBQgFcQUKBloGWAZ8BksHigiP
+CZkKDwx4DWMODw+4DyoQRBATEGQPIw7aDOsLUQvvCpIKfQoHC/cL7QzWDe8OEBC6EAAR/hBxEJYP
+2Q4dDg4NqQs6ClAJEwnRCIYI7QjBCWAK6wp1C98LOQxTDBMMgAtLCqkIQQcUBr8EYgNnAt8BngGW
+Ad8BQQJ5ArIC3wK2AjQCYwFAAPv+jP3r+4L6h/mj+LT3E/cm9+z3zfhB+Wz5rPkV+l/6E/ox+RD4
+3/an9WL0MPNN8rzxVPEm8WLx9fGf8mHzXfRg9QP2P/Zs9or2Qfaj9eD0JvS783fzGvPc8vPyTvPy
+87P0YvUu9gb3q/cL+F740fj++K34c/ie+Jb4Lfjq9/73Uvi7+P/4Vfn3+aj6WfsX/L38Rv3z/Yn+
+kP5g/nn+q/6a/lf+G/4a/mD+xP5F/+H/WwCbANcAFAEtASAB0wBRAAwACQC2/xT/tf6H/hb+hP06
+/UH9WP1g/VT9Uv1m/WX9cf2d/aL9iP2E/W79I/3h/ND8iPwN/Bv8iPyW/E38Kvxm/K38m/yL/N/8
+E/3R/LT88vwc/Qn9yfyD/IH8jfxO/BT8RvzC/AL98fzl/Pv8Ov2I/cP9A/5i/u3+Yf9//6X//P9J
+AJ4A9QAoAT0BAwHYAIcBhgIVA2oDmAOrAwMEjQTfBPkE5QTRBEUF8gUoBikGaAaOBk4G8QW6BawF
+sAWuBZ0FmgXLBQEG4QXDBfMF+wXMBZ4FWgX7BKEEWQQEBKoDiAOUA58DwwM1BN8EKgXKBD0E2QNx
+Aw8D2QK1AkkCkwEWAdIAcwAoACMADgDf/9X/uf94/3T/kP8+/6b+Gv59/Rr9Dv3f/JH8X/wX/Mj7
+p/t1+yD75PrD+qX6sfoT+4D7jPtW+zj7Ofs1+0X7QvsV+zv7l/um+7/7JPxz/K/88Pw4/av9DP46
+/jj+B/7//R/+//2r/YX9n/3j/Uj+mP7k/mn/CQB4AIQAaABvAJQAoQCIAKUA5gCPAM3/vf90ANMA
+gwA9AFQArQAwAZ0BtgGzAdIB6QHgAdoB+wE6AnQCcQIzAgcCyQE9AasASwAKANv/s/+Q/4L/uv8A
+AOn/if8S/4v+Lf4k/iz+Gf7g/XD9A/3Z/M38p/yQ/LH8Cf15/cb9xf1y/ff8mvxK/M37b/tr+477
+rfub+zX7rvqA+tD6OPuc+5f8O/5//ycAwwA6AZgBDAJ6AscC1QLAAr8C1ALaAtoC7QILA0wDDQSa
+BaEHnAlqCw0NhQ7AD4wQ0hClECoQSA/oDXQMRAtnCuAJsgnaCXYKgQulDKgNrQ7qD+QQJhEJEasQ
+2w/XDugN9wzkC7sKjgmJCOkH0gcbCI8ISgltCsAL1gxVDRkN/wtiCtQIPgePBQ0E2AIeAhICaAKI
+AlwCLQIiAmoCsQJ6AhMC0AFqAY0ARf+9/eH77fmB+KP39PZg9hX2QPbb9pT3Kvi9+GH5y/m/+VT5
+nfiz95n2TPUa9FfzGfMY8wzzQPPp86X0JvWK9QL2tfaP9xj4Rfhf+GX4NvjC9zX3uPYp9rn16vV/
+9tr2JPew92n4Pfno+Rf6+fnw+e35I/qs+r/6dPqZ+hb7cvuX+9P7XPy+/Mn8I/3P/Vf+1P5K/5T/
+vv/Z//3/QACIALsAxwCJAFYAmQACASwBUwGvAdsBzgH0AR4C4gGBAVIBKwH3ANMAfgDY/4L/qv+b
+/w//mP6p/vD+FP8X//n+1P7X/uj+1f6L/vb9Yv08/Tn9/Pzk/An9EP0j/XH9df0i/Sj9Y/01/eT8
++Pw//U/9Qf1c/Wb9Qf0r/R79Hf1N/VX9EP3s/Ob8+vxT/av97f09/mP+WP50/t7+gf8QAFYAlgAi
+AdUBNwITAt8BKQKxAtoC1AL8AmADNARBBd0FywWeBcEFCwZ8BrgGTQbtBQYGMwZoBp8GzAYeB3AH
+mwfCB9IHpAdpB1gHRAfoBnsGTgYoBr8FYwVYBVMFNwUhBd4EiASfBOcE0wSNBDsE0AN6AxoDhQL+
+AZEBHgHFAKsA1ADmAJcATgDqAJEC5gPKA9gCrwEVADf+Kvzp+WT4m/h6+p/8HP57/7wAHgF5ABP/
+QP1Y+6n5ZPgw9+f1N/Vd9dD1WPYV9/P3pPgJ+YD5Jvpg+vb5a/n5+Fv4gPfT9mn2Afak9bv1Q/b8
+9if4nvmz+mf7Mvw4/Tf+1v7w/lv+Xf3B/ML80vyH/Af8uvv3++n8C/7D/mH/OAAaAdcBOwIMAjoB
+LgBb/6D+2v1B/SH9jf1V/jb//v9YAF0AigCwAGwA+//K/wkAbABsAPD/Qf+8/lr+0f0o/YT8I/xr
+/Fj9R/7P/hz/Yf+a/6L/Ov9U/l/90Px5/BL81fvo++/7yvvA+7D7a/su+w/77fre+hH7cvvC+877
+jvs/+/T6ovpQ+vr5svmp+e/5Vvrq+kX8gP58AJUBTgIpAwcEdgQZBAoDcgJRA7kEKwXTBA0FigbD
+CJEKKAtCCycMtA34DowPdw88D6gPhRDkEJ4QMRAXEEAQYxBREOgPrQ8kEO0QfBGMEUURNBF/EXwR
+zBDED+AOcQ5cDksOMg4yDnEO5g4sDwMPSw4yDSwMVQtqClsJmQghCI0HIgcxB2QHPwfQBpMGZAb8
+BcQFXgVOBFgDsALEAaEAYP///Rv9xPxR/M77XPvZ+sD6N/t5+w37dfoW+nP5VPg192z28fWw9ab1
+kfVB9Qb1MPWb9d31uvWG9b/1MPZS9i72F/Yk9kX2ZvZt9k72W/bV9nT3+feL+GT5YfpD+9b7LvyO
+/Pf8Nf0C/Yz8SPxL/Hz8zPwj/XL9s/0N/pL+3v73/in/Ov9f/xwAGgGiAbEBigF2AbkB1QFfAd8A
+5ABJAZkB6QFlAsIC5QIdA5ED8wMDBNIDsgPfAw8E/AP0AwYExwNpAz8D3gL2Af4AYQDx/57/mv+4
+/8b/qP8s/7T+dv4M/mr91/xw/Bb8uft2+0f7+PqW+lT6BfqA+SD5Ufmb+Xj5avm7+fj54vmP+SH5
+5fi++Fz4HPgi+O33k/e891z40fjo+Bf5dPln+R75Ufm4+eT5Gfp0+s/6Jftt+5D7m/u++wT8Zvzm
+/Ij9bP5I/3v/U/+s/3cAEwE5ASMBLQGeAWYCDANMA1sDRQNcAzcENAUkBUoEAATVBD4GYQfCB44H
+TwfCB9QIIQkbCOsGUwYQBhMGPAYRBsIFxgUHBhwGdgV+BEoEjQSNBHcEWgQWBK0DQwPyAmUChwHA
+ADAAqP8G/23+J/5E/oX+nP6a/sD+xP53/kP+8/3//Nr7Lfvy+tD6S/qa+Wr5fPl++YD5jvmz+dj5
+9Pn4+dH5pvle+cf4Nvj597v3ZPdr9533mvew97z3nPf399v4lPnQ+Yb5Jfk6+U351/he+H/4A/lr
++bT5DvpP+oD6Avup+y78wfxi/QL+nf7b/qj+iv6l/rb+6f5e/8b/AwBgAOAAPwGIAd4BPAJ/AooC
+dQJjAlgCMQLiAakB2gFMAnoCiwLXAv0CswJoAnYCjgJdAhAC3wGfAVABUQFTAesAlABnAPr/jP9f
+/xL/r/5f/vf92v0W/sv99PyU/Nn8Gv3x/IL8MPwq/IT8z/x4/Of7z/s+/KH8bvzW+5b7APyY/NL8
+c/ym+yL7Wvuo+3T7N/tU+6D7DfyS/P/8Vv0P/lf/fgA9AekBeQIBA5wDnAPJAhkCegL1A8gFJwfp
+BzwJzAvwDWgO+A2VDcINcw4ID1cP4A/gECYSRhPfE+oT/xNtFHwU+ROdE5gTnRPdE3QUshRPFPAT
+8BO7E7cSJhHADxkPQg+6DxQQhRBcEWUS/xK3EpAR4w8VDkUMawq/CHEHcwbfBe4FZAbRBgsH7Aac
+Bo4GsAZYBnIFvwR1BB8EYQMQAvH/Uv1u+5767PkX+cX4MvkT+t36P/sf+1n6NfkV+OP2d/U39Kzz
+vvPu89PzivOY8+XzKfRy9KD0tPTc9Az1T/Wv9c71bvUW9Q317vTQ9Pz0W/UF9uT2wffF+OX59frd
++3385vwz/Vv9WP09/QP9u/ys/Nb8Cf1E/Yv93P07/qL+Bf9//xUAcgCnADoB0gH3Ae4BrgE0AfcA
+CAH4APQAVwHMATACmQK8AnECDQLEAWEB/gDcALoAqwAeAdIBLgIVAr4BaQFJATgB1ABgAEgATgD8
+/1X/zf5E/kP9Bvwd+7L6gfox+t/55PkL+uP5Z/ny+J74Jfid9z/3Afe69lD24/Wf9aL18PUk9hX2
+S/bI9gD3q/b/9ZT1qvXB9Z/1pfXf9ST2g/by9jP3WveG95/3v/cm+M/4bPkK+qf6zfrN+hT7NPtE
++8D7ePzq/OD80PwZ/WP9cv2W/Sz+Kv8pAOsAmwFpAhEDHQODAvUBPAJrA6AE1QRSBFMENAU/BuMG
+5QY4BtQFxQY+CKsI5QcwB5UHCwl1CnYKhglZCRYKygqhCkUJugdZBwoIfwjOB2YGmQUSBsMGdwZ4
+BccE8wSfBdYFKwXsA+0CzALuAlUC7wB7/6v+QP6b/cD8KPwy/Lz8cf3+/QH+if0g/QL99Pyw/Cj8
+cvu4+lH6U/os+o75/PjZ+BT5dvnD+Q76jfoo+637DfxZ/Gj8JvzR+2T7r/rc+an5FPoz+iT6X/qq
++h37yvtd/L/8/vxV/f39k/56/sb9V/2E/aP9c/1c/YH9yP1R/jD//f9+AAMBrwEyAkUCGQIIAi0C
+NgLgAXsBagGrARECWwJwAqoCPwMSBK4EuASTBJYEsQSmBDgEtQNjA/cCjAJoAlYCNAL/Ad8B7QEM
+AgUCrgF3AWgBBQGMADEAlf/f/mL+9/2t/Xj9GP3C/JL8MvzW+/n7NPwZ/Ov70/uf+z779/rh+p36
+EvrO+S76jfpL+u/5Dfpt+pr6ZPoT+hD6dPrw+vD6avoi+sj68/uC/E78Yvx5/Tj/wQBXAQ4BQgHl
+ArAEFwV2BPMDVATrBfUH9AiqCMYIgwrbDEkOxQ7uDjcPKBCSEUMS+RHiEagSpxMHFKIT8BK4EkgT
+CBQ6FA4UOhTHFFAVPBVJFDQTnBJIEswR1hBrD0wOFA4eDrQNJg3TDAoNwQ02DuoNCQ33C+QK4wnM
+CGsHQAaIBdAEGwSSA/QCFAJJAeYAnQAxANP/af/U/mz+Nf6I/Sv8Bfs0+r34E/dJ9sP1wfTl85/z
+fvM58+PywPLd8sPyYfIR8trx3fFN8nLyuPEU8VXxu/GF8TfxhfEu8qny+fJf89fzZPQU9dz1uvaf
+92j45Pgw+Vb5XPmg+Qr6Rfpi+rH6ZftK/P/8ef0J/qf+Mf/T/3UA9QB8AfYBLAIhAvkB8QHvAakB
+gQGnAcEBzAEPAn8CrgKnArQCsAK2At4C9AIoAz4D2AKrAu0C1QI9AsgBoAFRAdkAZgDf/1X/+f4B
+/0P/Uf9I/zL/8f7V/sH+Of6K/TP98PxO/IH7x/rZ+eL4WPj99673jPdj9yv3Nvdz90T3k/YO9gr2
+PvZR9iP2yfWW9Y/1R/W09FT0dfTL9A31TvWd9Sz2EffW9zf4evil+J74u/gI+TT5Zvml+d75O/py
++kP6Gvpn+gP7p/tq/C39n/3q/ZT+ef/3/yQAaQDbAF0B4wFWAowCpwLyAmAD0wNGBJ0EAQV+BdkF
+IQaOBiQHnQffBwwIGwgoCJoIaQnRCWwJHgmrCagKRAvOCl8JighhCbUK6wr/CRkJRgleCicL0gqQ
+CbQITAkICm8JLAhfBz0HVwf2BvkFMQUZBSoFyATcA7IC8wEaApkCcQJjAVYAOwCqAJ8Azf+p/sn9
+Uf0p/R/9uvzU+zH7kfuA/BT9F/3m/P38TP12/X/9Xf3v/JL8pfzC/D78ePtf+8f7Bfwv/Iz8D/2n
+/Tf+mv74/lf/av+C/9L/wP8//8X+U/7R/WX9F/3+/C/9kP1Z/k3/o/+J/wQAIgHjAdsBmgGjAaQB
+SAHDACIAgP9A/zz/7v5m/jP+oP5u/0cA9wB/AUMCJQOHA0sDvgIpArsBRQFkAHP/Af/u/hX/Qf8K
+/5z+1v7A/04ALADE/3v/c/9V/9z+E/5P/e38e/yg++b6pvqb+l/69vnR+Rz6gvrP+vj64Pq1+rL6
+ffq2+cb4NPjc96H3sff/9yb4D/hG+P74xvlD+jv6wflw+WD5M/kQ+e74Xfij94D3+vdq+IH4ePhn
++KP4vflf+5P8GP3T/WT//gDSAf0BBAKYArQDVQQcBOcDhAS3BbUG7QbpBhcIYAr4C3EMAQ1bDjoQ
+2BFmEjUSUxLxEoETiBPlEicS7hELEhUSGBICEqoRchHXEZ4S4xKGEnwS7xIjE/ISZRJEEQcQNA9q
+DhcNeAs4CnQJ1QguCIAH5QaOBm0GRQYHBrMFRwXrBIgEwgN4AhEB6v/V/qr9bvwN+8j5F/nl+ML4
+nPie+M34FPk0+f34iPgh+Lv32PaH9Uz0RvO08o7yXfIf8u3x5/Fa8g3zVvNH85DzavRv9Q72NPYz
+9k/2kPbM9r/2cPZQ9qD2KvfU93j4BPnH+ff6bfyr/WD+3/6Y/3MAFgFqAX0BgQGyAfwBOwJwArQC
+LQOsAxsEoAQ4BesFpwYXByIHOgeFB5gHTQfGBhkGlgV0BT4FwwRYBA4E7QMHBDUEZwSQBGoELwQj
+BNUDOAPAAnkCFAJqAeMArgBgAO//mf9Q/xb/9v67/kL+of0V/aj8IPyG+0D7Wvsr+336A/oO+iD6
+0/lA+Zb4EvjM92H3qPbP9Qj1rPSw9J70dfRx9KD0FfWc9f31WvbJ9i/3i/fs9zz4VPgT+OH3GfgY
++Lb3uPc++PH43vnG+nn7P/wM/bH9Sv6+/u7+VP8SALoAWQElAsACzwKYAocCwwIUA1ADvQNWBOwE
+dwXJBecF8gXtBe4FNQbBBjYHXwckB7gGjQanBsQG0gbiBgIHUQfABwcI8gduB8oGyAZ6B8gHLwed
+BuoGwAdcCCEIxAZBBRMF8wU8BjkFygM0A/IDFQUcBeQD3QIQA/EDTgSCAxQCdAEeAoECfQH9/+n+
+Yf5F/g7+T/2O/Ib89/wv/SL9Fv05/ZL97/3g/Xr9Vv1+/W/9m/w6+zr6Lfqx+hj7LPsB+xX79Pvi
+/BL9Gv10/Qj+5/6x/+T/yf+u/33/Mf+w/iX+2f3R/Rr+Of6n/Tb9p/0//mr+mf7U/gn/qv9lAIkA
+LQC3/3r/qP+l/+L+E/7//XX+9P76/o3+K/4T/rT+zf9JACAAIACeAP4AjwCD/5v+Gf7C/ZT9Uf3F
+/HL8pvy9/ED8r/uh+w/8m/zR/JH8OvwN/PL7qvsR+2f6DvoT+jX6EPqO+Q/5FPml+d/5bvl2+Ub6
+qPpC+sb5YPkd+R35Dfmm+BP4z/cT+Gz4WfgF+Ar4cPjc+B/5Jvky+VP5Q/lK+Zb5r/lg+Qv5Hfln
++Zf5sPmw+ej5k/ox+2v7mfv0+z38Xvx6/H38QPzZ+4H7lfv3+xr8bfyv/XD/3QD4ASADZgTlBSoH
+UQcgBwQIYQnmCbgJdwkzCYoJxgouCzoKVQpaDEgOQA9AELoReBNPFa0WDRf3FvIWzhZdFnAVFRT6
+EpMSVRKZEcEQgBDGEBgRLxEWERARSRGZEc0RuxE4EV4QfQ94DugM7gr5CEgH4QWmBIIDdwLfAQwC
+bAJMAuIBjwGGAdIByAEdAXQAEwCf/9n+wv2B/EH7Efrw+Bn4kPcY9/j2Ifcw94H3U/hF+ev5N/pe
++pD6rfqD+ir6oPn4+H74Sfgl+PX3sfel9yL4xPhV+Qb60PqU+2H8Xv1m/hv/d/+m/+T/PwBsAE4A
+CADE/8H/EwCaABYBdgEhAiYD3QMvBLkEqQWdBlIHrQedB6kHHgg/CNEHbgciB7sGbwZhBk8G+QXL
+BSUGWwYjBs4FUQXuBN0EpATwAz0DvwJAAt0BLwEYAGL/If+7/hv+iP39/Hf8HvzN+2H7C/vQ+nj6
++Plp+dP4Vvj594f3Gvfu9tP2nvZs9lX2YfZc9g321PX29Qz22vWH9Sj1x/Si9L30zfTD9L/0wvTk
+9Bn1CvUD9YH1LPZZ9hn2Ovb29qT33Pfn9xj4avjx+HL5oPnT+VL6DvvT+2H8qvz0/H/94P0R/sH+
+zf94AOMAgwEsAtICiwO+A2kDfQPAA6YD0gNpBLkEvwTaBNAEngS5BBkFRgUdBTUF0AUlBtUFagUu
+BfIEaQTQA54DmwNkAwUD0QKNAtEBLwE4AWYBlwGgAsoDUQMHAu0BagIRAoUBKwFMAL3/fAD/AAkA
+0f5Q/mL+i/58/qb+VP8WAFkADwCr/1j/N/+2/48AuAD+/2b/Xv8p/2r+sP1T/Tf9b/3Q/Qr++f3g
+/TD+pf7e/jX/zv8HALD/Ov/s/uH+Df8C/5P+Cv6v/a/9I/6l/rD+n/4S/9b/SABnAMQATQFbAQgB
+GQG4ARkC1QF7ATQBfgCs/8j/jACwADwAYAA0AaoBfgFCAfwAdAAgADUARgAMAJn/Vf9T/xL/lP5n
+/nP+Q/4D/un93P3O/bv9qv2J/Sb9vfyh/K38g/wU/LP7l/uZ+3j7ZfuU+6X7gPuV+wH8afyV/Jr8
+gfxO/PX7h/tU+z/79/qq+o/6evpd+mf61/pN+z77Ift5+/r7R/yG/NP88fy8/Fn8FPz6+5X71vpp
++pP64vog+4P71fvm+x/8nfwM/UX9c/3P/RX+2v1O/QH9GP0O/dn8CP1x/aj9t/2z/cX9B/4p/lH+
+5/55/3T/VP+q/8j/Tf8v/wAAFQGuASECOAOcBG4F8gXXBn8HoQecCLQKFwwCDMoLYQwsDUcN7wzt
+DDsNbg2fDRIO2A6+D58Q0REXE8QTNhQLFcEVnRXuFI4UfhQPFDETlhImEiUR9g88D8sOPg6NDUcN
+YQ0zDe4MOA24DZwN1wzZC+IKyglsCOMGUwXSA5gC2AEwASEA5f7g/Sj9jvz8+6D7fPtr+2P7iPut
++2b7Cfv++ob6KPnj9233S/f99or2N/ZL9qr2CvdG9yz3+/ZH9+z3UfiQ+EP5F/pj+mj6uvpA+2z7
+WvtW+z77Qfuf+zP8tvwJ/XD9G/7i/ln/Tv9O/6P/9v80AJgAFgGcATYCqQLtAj4DkgO6A+YDKgRP
+BHwE5gRbBZgFowW3BfAFKwbgBSAF1ATwBMsEegQLBF0D8wLxAtUChgIaAp8BWQE7AQkB1AC5AIkA
+CAB3/xf/sv7r/d/8Bvw++2b63vmW+T/50vht+Cn4Bvjy97n3Mvey9qn24vb39rv2Tfb59b71YPXe
+9Gb0/POo83jzS/Mz81PzivPk80v0cfRw9IP0t/QK9S71DPX/9P304PQX9c31Xfaj9gb3ZPen9xj4
+0viJ+er5JPq1+q/7a/zJ/HL9UP7O/gL/RP9//5n/6v+IAPQAMgGeAQcCRQKUAu8CNgOjAxkEYgSu
+BOIE3gTxBCEFMQU6BT4FMQUnBSAFMwVXBUsF+ASJBDgEDgTDA1UDDQPZAnsC+gGhAYcBYwFEATsB
+DwFJAScCIwIbAe8AKQG6AMoAdgGAAR0B9ADYAJUA7//Z/lX+y/4x/4H/egBGAcYACQC0ADQC7QL5
+Am8D2ANYA4oC9wGLAU4BOwFVAVkB7wCdACAB5AHiAZEBiAF+AYcBqQGYAVUBJgHwAIEAPwBKAEUA
+WwDAAAUBIgF+Ab8BhwGDAQMCKQK6AbEBNgJdAg0C9wFFAoMCXgIZAh0CNgLnAZABkAFVAdcA+QDK
+AVkCVgJaAmwC/QFYAUQBtwHkAWoBsgBCAB4Avf/4/mf+K/7W/Yf9j/2x/Yr9Rv0+/U79L/3u/OP8
+E/0X/fj8B/38/Kz8WvwL/JT7D/vU+tf6ufp++mj6kvrS+gr7Rvtx+5H78/ul/ED9Z/1Q/VL9U/0u
+/cT8Hvy6+6/7yvsx/In8XPwz/I/8+PwF/fv8Ef0N/fr8WP30/RH+4P3m/eD9zP2k/RT9lvyo/Pj8
+Ff0a/RT9/Pwu/bT9EP4f/lD+x/4l/0j/XP8i/2b+wP28/c79Zf0e/Vf9uf1C/vj+m/8+ADUBkALo
+AxgFXwYzBzQHagdpCFsJlAl9CbYJSgoKC6ULswt3C3UL1wu2DNkNog4vDwkQHxEkEvESZxNsExcT
+wRKtErASYxKsEfsQfRC8D5UOeQ2hDNILDAufCogKcwobCswJ0gm1CTsJpQjxBxQHGgb4BKYDXwJc
+AZ8ADABW/zH+2fze+2D77fpQ+qr5KPnZ+PP4lvnR+Sb5SPir90r34vY/9pr1RfUX9QL1dfUX9iX2
+JPay9ib3OPdj95P3nPe89zL4u/j6+DD5g/mf+Zz5xfnu+Rj6pfpU+/77E/1E/jL/6f9UAIMAjAB8
+AKYACAFwAf0BdQKeArcC8wIhAyIDFgM2A5UD5APWA9YDbAQSBU8FmQX2Be0F2QUHBv0FxAWTBS4F
+sgRtBFUEOgTGA+kCSwIpArwB2gBJAEUAWwA+AAAArv86/7/+d/45/qT94vxH/M77ZPv4+nn66PlD
++bn4b/gG+ET3kfY09hr2JvY19kz2ZfYy9sD1Z/Ud9d304PQe9Vf1ifXK9fb18fWu9VT1T/WX9c/1
+L/a89tL22faH9zT4Y/il+Db5z/lp+vX6afvg+z38ifwA/YL9w/3a/QH+Mv5p/qj+9P5H/6b/UwBC
+AfQBZQLIAvwCKAOcAxIERgRmBI4EwQQiBYIFjQWVBbcFgQUjBSEFSQVNBXsF0AXxBfUF6AWWBTcF
+GwX7BHsEAATxA+oDsgPEA1EErQSFBHMEHgQ3A+4CYgNcAxADQgN/A58DrgNaA+cCjgI+AiACNgIF
+ApEBqwF7Ag4DvgItAiUCaAJgAhcCGAJLAiwC+AHeAYkBFAHLALYAowBaADEANwDu/4n/qP8uAH0A
+oQApAeQBOAIuAgUCCAIrAs0BIQHBAJYAegBKAOj/eP8q/xr/KP9V/8v/RQDeANEBXgI5Ah4CGQLR
+AXQBNgESAccAOwDq//b/2f+D/47/3v/b/8j/FQBiAC4A7f8bAEoA9P9y/07/Mf/c/o/+N/7c/Y/9
+Kf3m/Mj8fPw2/Dj8PvwJ/On7Ifwq/Lf7Vfs1+/L6Z/rR+aL53vkA+vj5CPov+kv6U/p3+s36DfsK
++/f6y/p4+o76/PrW+lf6KPoa+ir6dvqq+rX6BPuD+7v7t/uy+5P7TPsJ+9r6rfpn+g76wvnE+Tz6
+1foq+1n7t/sO/Cb8XvyZ/G/8SPxv/KT8y/wL/YD9uP1S/dL8z/wO/Rv9C/1V/db93/1b/QT9FP31
+/IT8mvzJ/S3/8/+TAHQBIgLRAhUEbgVWBiEHSQjtCVwL7gtCDLEMrgxGDBsMdwz6DAENyAxeDVcO
+RQ6vDfwNzQ42D6EPXBCtEH4QtRB5EcQRKhGZEHsQNRCOD7QOtQ22DKQLLgq5COwHYQejBvYFfwUh
+BdIEpARTBK8DVwOgA6YD2wIPAscBggG2AHz/fP7A/Y388Pqz+UT5GPl3+Jb3/Pax9lb24fW09a31
+pPW/9cr1uvUY9uP2gPfX9/v3DPhs+MP4Q/h094H3BPgQ+N/36vdL+P34z/mA+hn79PsC/b/9TP4X
+/xgAJgHpARsCHAJ7AvkC/QKLAioCSAK8AiwDvAOXBFYFhwWZBTYGDQdxB3YHkAfhBzgIYghVCO8H
+Xgc6B0YHwQblBcgFhgbSBlwGJQZeBo0GeAYPBqkFhQUtBaAEWAQrBN8DiQMAAzQCfQEeAbcAwf+U
+/vH9u/10/Rf9q/wJ/HP7HPvP+pj6bPoQ+q75ivmb+bH5rPlr+RL54fix+Gj4Avh99/T2gPY29uT1
+avUi9Uj1fvWN9cj1S/ao9qH2tfY39+33hPi++Kj4xPhY+bz5kflv+ZX55/lI+rD6E/tP+7v7hvxH
+/b39DP6G/i//yf+OAJYBTwKZAs4CQAPmAyQEzgNmA0ADVgNlA04DUgN2A2oDZgPdA1cEeAS2BBAF
+NgVQBX4FcwUSBbIElwTjBEsFJAW4BM4EEwXwBKsEvwQOBVcFcQUrBeQEBQXIBLgDJgOMA64DWAMG
+A4UCLQKhAi0D7QJVAjQCcgJmAtwBigHpAQECCwEAAMX/fv9+/s39z/2d/Ub9SP0t/Zf8Ofxb/Ev8
+1vus+xv8o/zd/Nz89vxK/WX9N/1T/b/97P3K/cf96f3k/Z79Of0m/YH94/0h/ln+bf5V/nr+1f7x
+/tn+Bf+J/8b/X//v/kT/8f/U/y3/2v6t/n/+xP5f/5j/Q/8M/1D/fv8R/3P+C/6b/Ur9eP2q/U/9
+Av1Z/c391/2S/W79h/1n/Sb9R/19/WD9Iv0C/fX8w/xj/B78+vu0+2v7V/tZ+zz7Efv6+un6/Ppj
++7L7a/sc+0/7m/t8+/z6gvp++r/6t/p2+jP66/ng+QT61/me+dL5+Pnz+Sr6X/pn+nD6WPog+gb6
+5Plc+dL41vj9+Nv4zvg2+fL5j/rf+hj7fPs7/AD9YP2b/aj9ef2I/bv9m/1E/SP9Q/1d/Xj9wP1T
+/iP/+v/5AE8CnANIBIQEEgUgBkcHUwhbCW0KtwspDXgOiA8+EM4QdRHxEQ0SBBLoEa8RghFGEdgQ
+bBAYENkP9w+oEGkRpBG5EVASJBOJE5wTqxOXE5ATtROmExQT6hFwECsP5A0YDCkKnAhaB0gGggXl
+BAoE4QLtAWYBAwF+AOv/qf+Q/xn/aP7N/Rf9M/x1++n6VfrJ+Vv57fg8+BP3x/XT9GD0GPR/8/Hy
+8PI885bz1vMF9FH0jvTd9IP1MvaY9uH2N/fJ95n4Gvku+TT5S/mP+Rn6d/pa+nv6PvsJ/Iv8J/0L
+/vj+4f/AAHMBCgKtAlUDBATPBIoFGQa9Bm4HAwiOCPAIEAkxCagJMgqNChcL3guNDBINjQ3fDcUN
+aQ0BDXkM+AunC0sL5AqeClcK1gkhCYQIGgjSB5EHTwf4Bl0GmQUQBaUE1APqAkYCqAE5ARQBpgCj
+/1D+Iv00/Df7Fvoh+YP48Pc494T28fVf9aL0KvRr9Nf05PTm9BX1B/W69ID0O/To87Xzm/Od84Dz
+EvOx8nTy+/E98bjw1fBb8drxUPLa8lfzrPP984P0PvXs9WT26vbL97j4UPnN+YH6EPtN+/z7CP1Z
+/Sj9hP0V/kz+q/40/5L/7v9VAMEAPwHCASwCjAJDA0AEIgXYBVAGfQaTBsMGvgZOBtkFdwUoBTUF
+TAUABbgEBwUnBm4HvweIB+kHXwgYCKMHrQfoB9MHQgdvBrsFJwWABMQDCwNJApcBWgFbAQEBsQDi
+AL0AAwC1//L/HADq/0//2v79/hH/c/5m/Xf84/tn+4T6W/ml+KL4r/hc+AT4Dvh3+LL4hPit+IT5
+X/qS+lj6vPqt+/f7lftY+1r7d/uV+2b7Cvv0+gr76Pqq+qf6BvvH+3v82fxw/Y7+gv+v/4P/u/9F
+AKEA2QAyAa8BMgJZAhQC4wHcAccBnQFGARoBfQHOAaUBogH6ASwCKwL3AUcBqACPAJgAmQCXAGsA
+NwABAGP/dv72/fL9sv0g/fn8av23/Zb9mv0D/mr+sP7T/oj+PP6G/rH+C/5R/TH9Mf3G/DD8CPw4
+/CD8bvut+qv6Lftk+0/7dvvw+2H8h/yJ/Kv84/zq/KH8Qfz8+9H7pvtf+w/73frH+sT6jPr8+b75
+EvpF+k76/PoP/Nb8sf2j/kD/s//l/8f/1P/3/7n/U/8o/wz/4f6q/l3+Jf4C/ib+6P4JACIBOwJ5
+A7AE1QURB3AI6QmLC0QNyA4CEDsRfhI0E1sTgRO+EzMUzxT0FKwUoBTFFJ8UKhTIE40TSxMWExAT
+GxMHE/MS9RIEEw4TwhKIEr0SqRLOEYMQPg/2DZoMUgsgCggJygd+BosFdwTiAmMBagDU/1f/6P6R
+/kD++f3G/X39+vw0/DL7Jvou+UT4fffi9lP2pfX19ID0KfSn8xDzofJU8k/ysfIi85TzD/Q69Af0
+oPMi8+jy+PLv8tzyPfMl9AH1gfUg9in3Mfj4+LX5g/pO++/7nfy5/df+l/9uAHEBRwLPAiwDpAMC
+BPID5QOPBHYFqQWjBSsG/wZ0B30HqgcYCMAIygnmCrQLRgy0DBMNcg2oDZkNVA31DJAMBwxCC1EK
+YgmdCOwHMwdsBrgFOQXKBGME+wM+A2cC9gHRAdMB6gHJAUsBpQADAFH/Vv49/XT8wvvB+rz51vjZ
+99z2zPWZ9KLz8fJW8vvx//Eg8hryB/IT8hDy7PHM8cbx5vEM8h3yNPJY8mfyVfJc8pry4/ID8wjz
+NPOj8zr0pvTT9Bv1kPVK9i33uPfw90P45/iU+Rb6t/qE+0T88/ye/Tz+3P6V/1EA7ABvAegBXgLw
+AoID3AMBBCMEWQSfBLcEjQRRBOIDmgPpAykEEwQ3BHQErwR8BZYGDgcQBzUHWAeUB+EH4gfPB8oH
+igcyByEHIgetBtwFSQUHBcAEXATDAywDEAPmAg8CJwHNAK0AUQDf/3H/Fv8L//3+hv7k/ZL9p/2e
+/Rf9iPx0/HL87Pvj+vr5z/nI+QX5I/gr+Kr4qPhX+HD45Pgl+Wj5Avpw+qT6Dftf+2P7l/vr+/H7
+wfuP+6z7Nvy6/Mf8ufwk/db9av7Z/iH/VP+b//L/PQCeAAMB3gBNAPH/yP/C/wsAcQCqAN8ASAG/
+AfwBIgJ2AsgC3QLeAhIDTQNLAxsDtAIaAowBAgFgAN//qP+m/63/iv9x/9H/TQBaACwATwDaAEYB
+DgGYALAA8QDAAFsA6f+P/4D/fP88/+T+sv6l/pP+Wv7x/ZH9X/0u/QP9Iv2L/aT9Uf1I/az9Af4c
+/gX+zf3P/Rj+LP7W/W79cP3F/dP9cv0j/UX9lf3G/fv9Q/6E/qz+mP5d/kH+Xf5t/ln+Xv6K/pb+
+Xf4R/t395v0m/hn+sv3B/UT+i/4O/yQANwE6Ak8DWQSBBfsGkQjgCfAKIQx9DbgOxw+sEJkRlhL9
+EscSxRIgE1ATORMzE0ETJxMzE24TdBNuE2UTIBPQEuISLxM7ExsTBROzEiASoREFEQAQ1Q7ADacM
+awspCuEIbgcRBucEwwOeAosBiwB1/1b+Xf18/MD7Gvtt+uH5bvnC+Az4lfft9uT18/Qp9BzzBfJj
+8TXxTvFk8Y3x8PEU8tHxtPEQ8mjyVvJL8mryRfIn8ojyA/M485DzPPTu9LX1l/Zq9zr4/Piv+X36
+TPsO/Nn8rf2m/uL/KwEnAsACGwNZA5QDqwOiA88DIgRLBH4EEQW+BSMGaQa1BvAGVQfXByUIcAih
+CJMInQi6CLYItQijCFQIQgiQCLcIjwghCHgH2gZPBqEFygTMA7ACxgEFAU4Arf/+/oX+mP7m/hX/
+G//u/mb+kP3Q/HD8OPza+1L7mPrP+Wf5Vvn8+C34S/ec9in20/V/9Uf1I/US9RX1yfRI9BP0FfQJ
+9N7zwPPg8zL0rPQh9Xb10vUk9jX2Z/YQ95X3zvcr+KH4Lfnh+WT6j/rC+gr7X/vf+yv8TPzM/Ib9
+Lv7R/kT/Wf9H/2D/ov/t/zoAlADmAC8BzAGWAvoCNgOjA/QDNQSnBNUEsATUBCgFZAXGBUMGqgYk
+B3EHOAcPB2YH2wcQCO8HfwcIB78GnQZiBqwFsQS6A7kCFwL6AcsBMwGNADQACwC6/13/Yv98/07/
+AP+h/mL+Uf4w/hv+AP5o/YX86vuJ+yz74vqZ+ir6xPnT+XX69fr0+hP7fPv5+6X8NP1j/Xr9k/2t
+/d790v2N/Z795P3F/Wn9av2+/Q/+Rv51/rL+9/4//2z/of///zQAJAATACoANAAQAAAAFgAcABAA
++//K/17/o/4U/gH+8f3S/QH+Pf56/vr+dv+x/5P/HP/W/tv+pv5M/hr+6v1//RL94vy0/I78i/y3
+/Dr9x/0P/jf+YP6O/sD+Ff+o/wAAwv+G/6f/r/9W/+X+mP5N/gz+/f0S/kj+l/6+/o7+NP4B/gf+
+Zv4g/7P/yP+X/4P/rf+s/23/iv/e/6//cv/t/1cAzP81/33/1v+2/53/sP+l/3r/nP8TAIEApgB0
+AEwAfACsAKYAgwA/AL//Ov8B/97+uP7M/kP/PAClAR8DjQT5BV0HuwhMChkMug34DvEPzhCvEYMS
+NxOsE7wTqxPSExAU4BM4E60SdRJIEvERqxGpEXUR9hCeEGoQMxD0D28Plw79DfgN2w0nDS4MKAs/
+CnoJaQgGB84F7AQ8BJkD3wL0AQkBOAAz/wj+Ov2P/F/7Cvo7+Zj4n/et9vP1N/WJ9PPzffM+8/jy
+ffJE8m3yhPKv8jXzsPPY8xD0lPQR9Tb1JfVB9XT1XPVA9Vr1QfXS9Hn0oPRK9Rn25Pb191H5q/r5
++yX9B/7f/g0ANAHaATwCjgL3AooDBAR9BPoEDAX1BEcFigVOBSAFWQWvBfkFRQaIBpMGSAYEBg0G
+JgYZBtgFigWLBe8FXAZaBvwFoAViBUAF+QRsBNEDUgPuAokCCQJpAc8AZAANAH7/sf7o/T/9vPxe
+/AD8ifsR+4H6uvk6+Uf5Rvno+IP4Nvgi+IX48fjK+GL4Wfhz+Fb4MPgV+AT44fet97z33/eV9yX3
+CPcx95L3Bfhf+J340vhE+Qj6qPr9+qT7ufyS/Sn+pP7h/jj/0P9cANwASgGJAbUB8gE+AmMCOQIX
+AmgCAwOkAzgEgwSjBO4EFAXVBHgEIgT1A+gDqQNhA28DhwN6A5cDtQN6A2gD3wMwBCoERwRzBJoE
+5wQOBecEwwR4BMUDNAMqAysDvgIlApwBEAHDAJAA6v8J/3/+P/7t/ZD9dP1l/RT9s/x3/JL8/vwn
+/dH8Z/wu/BD8F/wv/Pz7jvtI+0f7evut+6b7bPsG+6/6uPr9+lD7qvvy+zD8gPzh/C/9Uf1h/YX9
+hv1R/V796f2a/t/+vP69/uT+/f5I/9H/LwA4AE0AsQDyAI4A7/+4/77/wf+4/0//l/4l/jn+gv6s
+/r3+3v4W/z//R/9X/2v/kv96/6H+Cf7S/qn/+/7Y/cb9LP7o/TH9kPwk/Fv8LP18/dj8Kvz6++37
+BvxY/Hn8cPy4/D/9Xv3X/DT8Afw5/Kb8/vzG/GT8vvxW/V396Pw3/Mj7//tT/Df8H/x0/M/8vPxH
+/K37bvvf+2L8WPwP/Ab8EPwT/H78//zX/G78Yfya/BL9tP0v/lf+Xv6W/h3/s//Z/4X/Jv8H/0X/
+q//Q/6L/ev+U/6v/ov/e/0EAjQA0AVYCqANxBY8HBAmpCWIKowsRDUEORQ9fEHYRPhLuEtoTahRK
+FE0UqRT+FFkVtBXeFcgVpRWiFaQVjhUiFVQUiBPcEhYSMRFwEMwP+Q46DugNnQ3XDLILnAreCUAJ
+ZQh8B50GYwXxAxUDvgLOAff///1U/MP6afmM+K33k/bx9az19vT08yTzf/Lv8VzxrvAm8P/v8O+z
+76PvCfBj8E/wVvDl8Ibx8PFi8t7yPfOD88DzI/TA9CX1M/We9WX2Bfe696j4afkJ+gT7T/x+/VX+
+DP/s/+EA0wHNAtUDAQVGBkoH4Qd0CC0JuQkWCmMKmArRChkLRwtQCzULCgv0Ct8KrQpnCiwKywlF
+CR4JLwnMCAcIdgdQBzcH4AZ3BvQFcwVPBRIFTwSXA2oDLwNGAiMBPwBO/xv+8PwE/GP72PpZ+gz6
+pPnK+Of3gPdh91H3YPdS9/r2vfbm9gv31PaH9lX2IfYZ9kX2X/Zq9ov2vPbC9vj2i/e597X3MPjT
++CD5Qflr+Yn5v/ky+rT68/oD+237E/xn/Jr8Kf0R/vf+p/9UABEBtwE7AmwCPAJbAjID9QMqBEQE
+cwSzBAEFUQWxBecFuQWQBcgF8AWrBWEFOwUABd8EDQU3BfUEhwRTBCcE8gPoA9MDmwOQA9YDDgQq
+BI4E8AQGBRIFGQU2BbIFJwbpBfwE8gNUA/ECZQK2AQIBNwBI/4P+Iv7R/TD9fPwa/P375/u4+5z7
+rfun+1b75fpz+vn54vkn+jn6I/o2+oL6D/ug+8H7o/ub+6776/sO/Jj7sPoi+hb6DPrh+Z75ZPlZ
++ZL5L/ru+nr73/s3/HH86PzM/Wj+mP7G/t/+4v72/gD/yf5m/iX++v3U/dD94f0U/l/+mP7S/gj/
+G/8g/zH/O/8Y/+n+tP5A/q/9TP0I/aL8JvzR+/T7e/yr/I78rfyl/En8Vvyw/Lv8ivxI/Cn8J/zg
++4D7dPuV+1/7/voo+9z7lvwq/Yv9nf2c/c79/P37/e/9zf2H/YP9+f1q/m/+K/7Q/aT92f01/mf+
+aP5y/nj+Ev5+/Vb9Zf0M/Tn8ePso+wr77/o7+xT8nfxq/CX8NPyX/BT9Tv0X/ZD8Yfze/D/9xPzt
++1z7A/s++078Of0r/aH8jfwb/dj9kv6U/xIBwQJABHQFtQYuCJAJsApwC90LpAweDssPJxEVEqYS
+DRO/E9QU3BWcFhwXOhcIF+4W4RZ9Fs8VLhW4FD8UthMcE20S+hGyERsROxCRD0YP9g5sDqcNxAwV
+DIsL2AoHCjYJPAgCBwkGewW3BLwD/QIzAjABJgAK/9T9dPzt+pb5e/hD9wj2EvV79CD0q/M486ny
+1fFl8dDxXfJs8nry0/I585bzvfPC8xH0pPQs9Zf16/VL9r32Ovfc94P4Dfmc+U/6NPtJ/Cj9ZP1L
+/Yr9Nv7b/oX/bQBmAVQC9AIzA5YDVgQQBagFZwZNBxwIgAiyCD8JhQkACXsIagiYCPEIUwmoCfMJ
+GgpFCocKaArXCXQJjQnSCd8J0AnZCZUJvQj1B64HmweGBzgHmwb0BVAFiQSxA+cCQALYAcMBoQEj
+AZYAAAD4/s79//xS/JX7G/ve+of6Gfpt+YP4r/cT96X2VfYh9gL25PXS9cH1f/UP9aL0mPT39BX1
++PQm9WT1fvWb9bH10/UI9jL2jfYj96D3EPis+ET5sPki+r36Q/tW+1f70ftz/L/80/wa/Y398/1j
+/tn+Mv92/+X/jgAtAcUBcgIRA7cDfQQrBXMFawWFBbIFugW3BXoFAAWqBIIEYwQ0BPQD7AMWBCAE
+OATFBKQFLgYjBs0FXwURBTAFggVgBbYE4AMZA7wC2QINA/kCfQLjAXkBFwGCAOb/hP/n/rX9o/wq
+/Mz7QPvG+lz6ufk6+Vj5qfmt+XH5J/nz+BL5qPks+iv67Pm9+cL5Bfpi+ob6Ofq7+VL5Hvll+RH6
+cvo4+sr5tvkE+lP6n/rv+vb6vfrR+kD7cvtX+zz7CfsG+2v7yvsM/C/83fti+2/78Pt0/LH8jPxj
+/Gj8Sfw7/KL8Cf3r/KL80fxO/ZP9tv3c/cv9l/18/Wr9Ov0H/fv86fyr/Gb8Wvyr/Af9Jv08/Vn9
+ZP2G/fP9cv6j/q3+w/7r/ir/N//5/rn+ov7G/uP+7P4j/zv//v7N/uz+Fv/2/r7+sf6K/vP9TP0g
+/SD9vPwy/MX7jPvS+1r8mfyd/I/8ivzl/Gz9f/1t/cn9Jf7U/RX9uPyr/ID8g/y6/OL8B/0u/Vj9
+iv2y/aX9df2C/Yf9Ov0n/ZP9R/4i/xQA1QBbARcCKQN/BCcG5wdMCV0KYAuFDLkNyg7CD5wQNhHA
+EYISZxM9FAQVcBU+FR0V0RXJFggXkxbPFecUFxSAE+cSKhJNEUIQVg++DjkOxQ14DSgNhwzSC48L
+kAuHC20LGQtYCmoJpwj2B1EH/ga6BgEGRgXfBFsEqgPYAsgBpwC5//j+Kf5m/dn8JfwE+9H53/j9
+9yH3gfbl9Tv19PQi9Wb1dfVL9Tf1bfWr9dX1O/br9l33PvdA99v3fPi5+LX4C/n3+bf62Prn+kL7
+kvvX+0z81PxM/bj9G/5B/g/+6f0E/h7+af5j/3AAxQDbAEoB7gGGAgYDigMfBLkEfAVRBtcGAwcb
+B0sHmQf9B2gI1whOCdgJTAp4CmkKRAohChAKJgofCroJPAnRCE0ImwerBrIFGAW1BDwEqQP+AnAC
+TAJKAs0B8wBEAOv/u/91/xb/xv6O/mr+MP6m/cj8+fuA+yf70/qf+n76N/rR+XX5D/mI+OT3RffC
+9mf2T/ZD9vH1ePX29Hr0T/Rh9EX0EPQP9Ej0hfSP9J704/RL9bf1/fU49qv2RvfY90X4lfj++IX5
+3fkZ+o36EvtY+4z70PsW/EH8HPwK/Jb8N/1d/V79Zf2P/Wf+b/9U/57+yP55/6//av8B/+T+XP/o
+/wAA9v9DANEAUgHjAcUC1wO8BEcFpgUKBkIGIQYqBm4GJgZkBfME5gTDBDkEigNHA3wD1gMaBCsE
+/wOhAwwDRQKEAdEAKQCn/0r/8f5E/jj9Jfx3+7T7dPxv/Hn7+Pp9++z7xfub+2f7+vrc+g/7IPsm
++xH7zvoF+4z7fPs2+2L70/sy/Ev8Pfw9/Bn85PvF+3D7E/sK+wH7o/pK+jP6+vmw+an52Pln+kz7
+BPx2/M38GP1u/cH94f3e/QL+Wv6w/sH+pP6q/sH+3P4b/47/BABEAFwAcwCBAIUAlAC6AAIBUAFT
+ARUBsQDh/wn/qv5h/kr+qf7b/sP+1v7b/qv+rP7e/hj/m/9OAIwALwDY/9b/+v8eAEgAhADLAPsA
+8gCvAHMAhwC6ALgArADXACkBTwEQAbEAdQAxAOX/q/90/zj//f7c/tj+kv4F/rT9qP2Y/Xr9if20
+/Yv9Rv0F/Wz8/PsT/Bv8K/zY/JD9Zf3d/AT9qf1h/hz/wP9xAA8BdQENAtICbwMSBN4EewXpBZ0G
+pQeSCDoJ0AltCvgKowuiDJUNTg7gDkIPfw/ADzgQwRA1Ea8R7RGxEVMRORFcEaIR8hHbER8RSxAl
+EHgQOxBCD1AO0w2UDTsNCQ0GDZgMqwu7ChcKtwlzCRMJbgiWB5gG5QXXBe8FkwXKBPgDagNAAxYD
+YgJnAYgA9P+4/z//Zf7Z/Zf9Bv07/Jz7Evt8+vj5nvlI+cT4SfgK+Ob3tfd190n3LfcK9wj3Fffi
+9mz2+vXT9Q32ffby9kf3kvcY+Mv4ZPm1+ab5Vfk4+W754PmI+h77a/uV++j7efwy/c/9A/6//YT9
+6/12/oH+k/7O/oH+H/6Q/mH/4f8uAIkA6AAoAXMBBgKKArEC4gImA0QDbgOsA+oDMgRhBGcEkQQt
+BekFGQbbBdYFGAZMBkIGBgbHBYcFTgUhBeUEvQTJBMMEZwTMAykDawKCAeAAygCMAMj/OP8f/+T+
+Zv7o/Wj9/fzr/CD9H/2w/PH7AftW+ib60vkK+Vv4Rfih+Of4x/ho+Br4yvd793v3g/c49xr3i/ct
++JP4q/iC+Ab4bvc790j3C/fH9sf2s/ai9rj2ufa19sL23vYk93L3pvfZ9/j3AfgM+Bv4Qfhr+IX4
+w/hG+e/5ffrZ+j/7r/vn++z7/PtS/N38Qv1v/bb9LP7H/oj/FgAvADgA1ADJAUkCjQIKA20DdgNq
+A3EDTgMWAzUD1gNuBEkE5wPxA9QDiwOTA54DoAPAA8oDtgOiA6QDiwNIAywDUwNWA/8CwwLHAswC
+rwJjAvQBmQGiAeMB/gEDAhAC/wG5AYwBrAGhAVUBRQFPASQBBQH+AN0AngA2ALD/I/+1/rb+Av8Z
+/+n+lf40/iL+JP6k/dn8RPwI/A/8YvwK/W/9DP2a/NX8QP1L/S/9SP2W/fz9b/63/pH+LP4q/ov+
+lP5q/qX+Ef9R/3v/pv/h/0QAfACJAK8A5gAVAQwB4QCnAEsA9//t/yYAOwA0AHoAvQBuAPf/4f/V
+/43/Xf9u/4P/yf82ADYAGgBbAGwASwC0ABwB2QBrABUA2v/r//H/l/8y/xj/VP/L/zAAQwA8AGIA
+kgCjANAABQG2ADcALAAfAK7/Wv8Q/0H+ev2P/fn98P3B/eD9Nv6Y/v3+Qv9V/1r/S//w/lr++P0C
+/kr+bv5V/k3+jv7h/iT/nP8xAKgAJgHFAXICLwMLBN4ETwV7BdwFNAZ/BlIHIQgcCOEHKwjVCLAJ
+YAqFCoEK1QpgCxMM2wwVDZcMIQwMDAkMAwwyDFQMCwygC5UL6wsdDOULdAvjCjcKtgl5CTMJ2AhW
+CKoHFwfSBugGCQfkBm4GtAU4BW4FtgWIBScFswQ0BOYDwgNhA6oC/QGCASIBqAAXANT/uf9Q/9T+
+bf7d/Vv9Hv23/Ov7HPuE+gr6y/mu+Vr58PiP+E34Tfgq+Kv3JvfK9p32pvb+9oD3nfc/9xv3dPfU
+9yv4hPi0+Ov4OPlX+YD56fkg+hD6MfqT+vb6Ivs6+377uPvH+9X7Gfys/En9qv2q/YX9s/0Z/mL+
+jv6+/uP+wv6l/u7+Tf9G/x7/Qv9Y/0D/hf8aAEoAJQAiADEAXQCsAOUAKQF/AbYB9gFFAkQCHQJF
+AnUCdgKsAiUDVQMPA9EC3gLeApUCbQKFAosCZQISAssBzAHjAdEBiAESAakApQD5ABABpwAeANH/
+uP+U/0D/r/4F/o/9Z/1j/UH9/PzN/K38Xvzt+6T7v/vq+9H7p/tr+y37YvvE+5L7Ifvs+ov6RPp2
++oH6R/oa+ur57PkH+tv5iflz+Yb5bflw+cH5/fn8+SP6h/qf+l36Lvoz+lz6n/ro+jj7lvvW+wD8
+Wfy2/OL8H/10/Zr9sv0J/pX+H/+M/+D/IgBCAE4AdgDHADIBcgF5AcIBRAJtAm4CowLDAv0CiwPd
+A8QDqAPhA1EEdQRGBC0EOQQ6BDAEDQThA+ED9wPjA8QD6QMVBOQDowN9A0UDOANIAxID0QL9AoYD
+9APyA64DdwNOA0gDgwO6A8oDzQPPA9EDtQNAA4kCCwL8AQsC9gHJAbgB5gEbAhYC2QF8ARIBnAA6
+AAIA3//E/4P//v6V/pr+1v4X/zz/9/5e/h7+XP58/kX+9v23/a39xf3C/bj9yf3R/eT9K/5J/iD+
+Av4d/kX+OP4f/hf+5f23/ef9JP4B/rP9jv2B/ZX92P0F/g/+H/4P/s/9mf2B/XL9if2t/X/9S/11
+/Zr9if18/Yb9q/3E/e79aP71/lX/df9h/1H/Uf84/wj/0v6l/pb+qP66/sL+3f7q/sH+nv68/un+
+Av8h/1D/vP8xADgA6/9n/wT/Lf9b//H+Vv5K/oD+c/6O/hX/kv+7/9r/TQD5AHUBrwHZARACUAKU
+Av0CfwPOAwcEfQTxBCQFaQUTBtIGWwfnB5EIFAkxCTQJlQkWCi0KBgoECu8JiwkxCTUJPgnrCJwI
+lQhvCPgHrQfnB/4HaAfNBrgGzAanBjIGigXoBGsEHgQPBAAEowNCAzEDPgM/A0MDPgP/Ap0CXwJI
+Av0BfAFRAVkBAgGSAEQA8f/t/wkAyv+x/+z/y/9q/37/o/8W/2/+Tv4y/vP9vP1T/Zb85/u0+3/7
+w/oN+rr5nfmg+YH5V/lt+V/57vic+NP4Nvki+bD4cfht+FP4Jfje95r3x/cm+DH4W/gA+Y75uvnc
++RT6Pvp9+sH67/qE+2L8ofxg/JD8Kf11/W/9g/3n/X7+6P4V/0H/Xf9x/8T/MQBgAIAA3AAiAQkB
+3wDLAMsAAgE7AWcBrwHYAfcBPgKJAscCDANUA20DcAORA78D1QPTA8YD0AM5BNYECQXWBOcEDgXL
+BJwEqgRlBAkEBwT8A8gDkwMpA74CvgLhAqcCWgJCAvwBbQH8ANQAugCMAEcA2v+A/0P/2v56/lP+
+Pv4v/iz+Cv66/Yz9oP2e/Ur9B/0W/Sn9Iv0Z/Sf9P/0e/dX8p/x8/Er8Rfw8/Bj8F/z6+8b7zvvR
++8n74vvG+4X7uftS/MX82/yf/EP8OfyC/Kb8fvw9/Dz8mfwi/ZH9uv3Z/R7+Vf6D/un+S/9X/z//
+a//n/1sAtADeAN8AIQGWAe0BNwJtApMCwwLCApACdAKpAgkDIQMgA24DzQPtA/ED/QP/A+sDmAMl
+A+oCzwK9Ar0CtQJ4Av4BlwGKAbEBzgHaAdYBAgJ1ApACHAKeASgBtwCzAPgAMwFtAYMBfAGVAZ0B
+aQF0Ac4BygFHAeUA/QAdAeMAewAJAJT/XP9//7z/5v/h/7X/mv+T/2f/Av91/uP9sv31/Sr+H/4K
+/uz9uP2A/VL9Gf27/GP8UvxM/A/83vvq+/b78fv9+wz8PvyU/Lz8vfzg/An96PyF/Er8U/wn/OL7
+/vsf/C78jvzu/PH8zvzC/Mz8yfyx/Kr82/w3/aP98v3l/Yf9Of1M/aX91/3Q/az9if2D/aL9uv15
+/Qb93/wa/YP96/0o/lv+s/7W/o/+SP5r/ub+TP9p/2v/Tv8E/9n+7/4C/9T+g/6P/g7/j/+4/37/
+Q/9E/0H/If8E//L+Hf+O/+X/DABXALwAEwFwAcoBQwLoAlEDvANzBNkEqgSFBMsECgUYBW4FGgaa
+Bs4GLAfbB4oIEwlXCV4JkwkPCncKpgqaCk8K8AmLCR4J4gjhCNMIfQgOCNoH8gcBCKAH7QZRBu0F
+xwXHBdMF5AWuBRoFtgSmBHEECATBA50DiQOBA4QDeQMGA04CCgLyAWIB4ADeAPcAGAFrAXYBCQG3
+AKcAfgACAF//9f7Q/r7+l/40/qL9B/1j/Nv7pft/+xn7xfq/+sD6p/py+kD6F/rg+d/5O/p/+l/6
+J/rs+Zj5bPl7+Zv50fkq+oP6n/qv+uP6CPsq+2/7vPsK/F38nPzI/OH8/vxA/Vf9KP2O/aH+Hv/n
+/v3+V/9w/2v/W/9k/6z/2v8DAIoADgFIAaMBQQKsAsYC0QLqAgMDAQP0AuQC4AIQAzgDJgMTAxAD
+AgMyA8oDZgTVBCYFbQXABRoGUAYdBrEFbwU4BdIEewRKBBAEzwO5A+sDEgQGBAME+QPFA44DRAPE
+AlkCGQK7AS8BewDB/1j/bP9o/87+L/7p/az9jv2R/Xf9Rf0H/ej8AP3p/H38HPzv+9j7sfup+8/7
+wvuT+637+/sT/O37w/u1+7n7lPsx+9363vrr+sv6uvrA+pr6cfp3+n36iPqr+sn6vfqO+mv6Xfph
++o76yvrl+gD7Sfur+wn8TPxo/LL8Sv3b/SP+Lf5B/rf+fv/4/ycAbgCMAJMA3gA8AaMBEQJOArQC
+cwPwA/sDFQRhBHsETAQ1BE0EWQQuBPcDAgQ3BDQE9AO+A9gDRwSVBFUEzANkAycD9wLEApYCcgIr
+AsQBhwF+AWEBLQENAfoA/gAgAUUBUAE/AT0BOQEYAfAAowBJACQAIwATAPn/4v+Q//T+jP6J/mD+
+1P1z/XT9kP2h/Yn9OP23/Br8m/ty+z77vvpo+kz6IPr7+er54fnY+eH5Ivpg+lP6S/qS+sD6qvqs
++sD64/r++vf6E/sz+zX7XPvM+zf8UvxM/HT8vPzk/Of8zfyV/I/8z/z9/A/9KP0s/Rz9L/1C/ST9
+DP0u/W/9r/3q/RX+J/5E/nj+kP5w/kL+Qv52/qj+yv7s/vP+//4v/zb///7p/hn/TP9t/7L/MgCO
+AI8AfAB3AHUAbwA8ANb/h/97/6n/EwCIAKkAaAAiAAUA9v/0//P/4f/x/xkAKwA5AEUANgD3/87/
+DABvAL4AAAEyAYcB7wEkAloCygJMA6cD1wMcBJIEEQV9BfkFmQZDB8MHFAhmCOoIeAmeCaYJFQqp
+Ch8LbQtvC04LZAuJC3cLTQs0Cy0LFQsOC1gLfAsGC1oK4gmkCYwJRQnXCLMIwgi7CIMILQgFCAAI
+1wdpB8gGMwbCBYsFpQXfBe8FtgWUBX4FDAWiBHEENQQPBBIE8QOMA/wCbAILAtoBvQGEARkBxgCS
+ABkAcP/c/jn+cf2t/B/88/sC/P371fuO+/36T/oE+vX5w/l2+UL5M/kb+S/5hvm1+Zj5Tfke+Uz5
+ovnX+ff5JvpD+lf6p/oR+0D7Nfsy+z77Q/t5++z7XfzR/Dv9Vf1I/VT9kv3l/SL+af64/uT+//4V
+//3+zv65/rn+x/7y/kL/d/9Y/0X/xf9/ALcAuQD/ADMBXwG1AfQB9gGxAYQB5AE4AuwBrAH3AU0C
+cgKlAs8CxgLUAhsDYgOCA4IDiwOnA5UDTgMCA8kCoAJMAtoBwQHlAb4BVwH3ALMAfAAhAOD/1v+O
+/xD/0/7T/sD+ff4C/mz93/xo/Az8svtV+xf7Kfts+zL7hfqB+gH79Pqa+mf6LPrp+cn5vvmi+U75
+7vgB+U/5JPm5+Lf4+fgK+er48vgP+cv4Y/hW+Ij4lviF+Jv43fgr+WT5cvmE+cH53/nO+dT5C/p8
++vP6EPvp+ub6N/uY+9f7Q/zC/PT8Cv1b/bP99/1c/tj+gP9uAFcB8AFYApECjwKyAkkDBwRWBF8E
+4QSkBecFDQZ9Br8GuQbeBhcHBwfVBp4GWwYGBmUFswSLBP0EdQVnBbsE2QNVA1EDaQPyAvYBWQE0
+AQoBAQEcAQMBugB5AGcAeABWAPT/5f9KAI8AlACcAMUA7QDBAI8AsgCsAC0AoP9W/z7/K/8d/y7/
+Wf9m/xr/tv6q/rD+MP5h/Qr9Jf3y/HH8DPyg+xn7vvqS+o36tvro+hz7LPv2+sX67Ppg+7b7wPvg
++zH8UfxS/Hf8mvyu/PD8cf3r/VT+uv7t/gv/WP+v/7T/gP9r/3v/n//Y//z/4f/t/0cAOwDM/9f/
+SABaAAwAAAA4AEAANABcAGYAMwAGAO3/2v/j//r/GQAmAPH/9P+iAEYBcAGkAcIBlQGXAccBwQFa
+AcQAwgB8AeUBlwFYAYoBlAFDARQBCQH5APIA+gAAAcIAaQBPAEQAMgAxAEcAYgBRADAAHwAGAPT/
+DABPAJAAowCkAN8AOwGkAToCygIfA1IDjgPWAzcEqQQPBZkFYAYHBz0HYwerB8cHxQfbB/oHQwjj
+CIwJ4QkBCvwJswmICawJ2QkpCrwKNwtsC2ULEAuzCrAKwgpqCvIJ8wlFCiQKkQkiCdwIpQiFCGsI
+TAhPCF4IQAgTCPwHzwdVB7YGUQZWBoEGcAYjBskFYgXfBEAEcwN0Ao8BHwH7AMgAdgAWAL7/Uf/K
+/j/+r/0t/aP8AfyI+0j7z/oB+oT5aPkL+Yn4QPj296D3kfef95X3mPd79zr3H/cK9+n2CPeG9xf4
+Zfhu+Gz4XfhG+Gv4vfjt+AT5Mvlw+cX5BPrP+XH5ePnn+Vz6uvop+4b7u/vU+8j7zfsc/Hj83Px1
+/e39W/77/nX/lf+H/47/t//i/xUAagDHAPkAGwFpAbABmQFIAUQBzgF8AsoC+AI2AygD9gLvAuIC
+yAKpAq0C4QK9AhYCcgEmARIB5wB3AAkA1//A/9b//v/j/5D/bf92/27/W/8W/67+WP7X/UH9Df27
+/O77Vfs1+x775Pri+ij7Nvso+037Wvtj+337SPvb+qT6j/pC+sD5Uvka+f/48fj/+Df5ZflW+Un5
+Pvms+Ln3MfcC9532NfZF9r72avdA+Or4Kfkx+UP5dvmN+XT5ovk5+tj6ZvsA/Ij80vz7/GL9Cf6i
+/ib/qP/9/zQAigDTAPgAGQFEAZABVAJXA8gDtQOtA7kDwQMaBNgEWwVhBXwFEQbQBkoHaQddBz4H
+MgeLB0kIKwnPCQAK9wn3CfkJEgp7CuMKnArMCTEJ1AiPCFII0AfqBtEFDQXyBBwF2AQcBFcDlgLb
+AW8BOgHIAAEAQv/t/sX+dP4j/uD9nP1d/Sr9JP1e/b/9IP5Z/nv+xv5A/4v/bv9d/4X/k/+G/5D/
+hf9O/zP/Gv/t/uP+2P6g/jL+vv24/fP94P1x/fL8tvzT/Cj9Y/0C/R38vvsp/H38hvya/Jf8ePya
+/O38Rv2g/dr9If5+/pH+d/6V/s7+v/6m/tH+2P6m/rT+Df9B/xT/tf55/pf+5f7n/n3+/f3C/dL9
+CP5C/lj+V/5//sH+6P74/hb/V/+T/8v/IQBlAHIAcQB/AI0AkgCZAMIA4AC3AJEAtwD8AAUBsQAR
+AHj/Tv9v/3T/M/+9/lD+H/7//Yb9zPw9/Cf8q/xC/Vr9Pv06/Rb9qvxI/Fj8n/yz/Jr8e/x9/Mz8
+Kv1B/TH9Yv0E/rP+Q/+s/8H/qP+f/6z/HgAnAQMCGwLZAegBdwIsA9QDlARxBTMG9AblB7wITwm9
+CfQJCApgCiYL8wtADCAMFgxxDPYMXA3mDXoOYg7PDUsNwwyFDKgMfgz3C3ELKAtQC5wLYAt8CpAJ
+KAkQCdsIVAh8Bz4GtAS+A8gDKgQxBLwD/QIeAo4BnAG0AUwBswAhAG//1P6u/qP+EP7u/L77Evv5
++g773foY+gv5YPg8+EP4JvjX9zv3QvaP9Zf1tfVX9dX0nvR69Fn03/QX9tX2qfaD9s/2Wvca+L34
+BPkt+XL55/lj+tz6Wfuj+7r7Bfyj/HP9UP7A/sj+/v5c/6H/9/9rALcA2QALAVEB2AGSAv8CCwMz
+A4oDwAMjBO0EcwVeBS8FIwVYBQYGoQaeBjUG0AXBBRUGdgaFBnIGbQYsBtwF2gXNBVcFuARWBC0E
+2AMhA4ICQQLFAekAGwBr//f+1v6J/v39nP1e/TT9IP22/PL7Xfsc+/P60frL+pn6FPqa+YL5pPmW
++VP58PiA+Gf4xvgu+Sz54vis+Jn4m/i++Pb4FvnW+Ij4qPjj+PP4Mvmp+eT53fn0+Vb61Pon+0z7
+kvss/MX8Hf1V/XP9ef2L/cv9Nv6W/uX+Yv/4/3MA7ABPAV0BTAFVAVEBfAEAAmkCfgKFAnYCUQKL
+AhMDVgN6A9ED6AOtA68DKAShBHoE5gOJA6ID+AMoBDMEfQQoBccFGgY8BlAGqAY5B3YHJweUBioG
+TgbqBn0HmgcsB8QGuAagBoAGlQaQBi0GrwU7Ba4ETAQ8BPUDDQPXAekAewBoAHYAIgAI/8j9Tv2J
+/d396P2M/Sb99fzB/L78Hv0x/Yf8yPu0+xz8avx6/Fr8Hvwe/I78E/19/c391v3h/ST+Qf43/lT+
+W/7q/X39kv3U/ej9rv1P/R/9Wf3h/SX+9v2t/Xj9pv1J/qj+T/69/Zr9u/2a/X79n/1v/fL8zfzt
+/MX8aPxe/HL8QPwU/DX8evys/Kz8evxq/JH8rPzE/KP8Ifyy+6j72Pv9+xv8Kvzh+4f7z/up/E39
+SP0V/Vv98v07/tT9Gf3Y/BT9Ov1O/aL9Af4R/gf+Mv5g/mP+bv6X/mv+yf1e/XH9jP1A/aD8Fvy7
++5b73ftL/F38Lvwk/Ij8Lv2g/aP9M/19/AP8QvzI/LP8WfxC/C38KPxh/Ir8d/xa/EL8Wvyl/L78
+n/xp/E38fPzX/Gv99P3s/YL9Of1b/fb9nP7F/o3+oP5l/5wA2gG4AhADMAOBAz8ENAUHBrkGOgd5
+B88HsghUCoAMUA67DusNPg3JDVIPjRDBEIAQYhCFEPYQohEhEtIRgBBAD14PSxCoEE0Qjw+CDqgN
+cA3JDTIOrQ0VDIkKyQmcCaQJhQntCPMHCweRBkEGygU/BXgEUQNJAtMB1QGsAdMAYP/M/fT8Mv2z
+/Xf9Kfxa+hX50PhD+dr56/kx+UL40vfJ9/v3J/iv97L2HPZ59mH3B/gZ+Ln3Lfff9h735vev+K74
+EfjJ9/f3dfic+dr6Mvv4+tr6DvvJ+8T8Jf3m/Mf8QP2A/goAxQCVAIcAJAEVAvUCeQOOA4EDvwN6
+BGMFIwa4Bv8G/Ab6BiMHmAcjCEQI2gdgBzwHUgdkB4MHjAciB5AGdwbjBlsHTAenBtEFLgX6BPME
+pQQRBJADBgNFAtsBDAI4AsUB2QAGAHj/Lf8N/47+mP3S/F/84Pt5+zz78Pql+lL6/vnd+cn5d/kf
++fP4j/gM+Oz39fex9073Zffd9/r38vc5+HD4Wvg1+DX4bfjc+E35dvlp+YH5xPkx+n76K/q2+cf5
+L/qd+uv6A/vg+qb6rvox+xL89/yl/en96f09/vb+y/+bAAIBswBXAMgAygEsAnwBzgAgAUQCCwOi
+AiUC2wLRA6QDrQJaAlMDYARKBPwDxQREBlkHhwf+BnsGtAaLB/4HJAexBSUF0AWVBlIGTQW1BN4E
+7gSaBI0E2QTBBNcDsAI5AmICoQKyAvwBWwA9/7H/xQDjAKD/0P2f/JT88fzN/ED8wPtw+1n7g/ui
++3D7F/vH+m36PfrC+pb7gPun+vn5mfmG+ZX5hfle+Qn5y/gv+bT5l/k4+SH5YPmx+eX5I/pZ+mj6
+d/qn+g/7Avwf/U79mPwc/GL8G/2j/Y/9/fxl/Cn8Rfxo/IL8k/xs/DH8IPxK/H38dvxS/DT8GPw4
+/I38u/zi/CH9N/0U/cb8dPxd/Jz8Cf1r/ab9d/3a/HP8ffyh/KH8ivyD/MP8W/0l/uf+Nv/S/iH+
+t/3S/VX+1v76/t7+x/65/rP+i/42/hX+Y/7p/mL/yf8BAOr/iv8N/9T+Cf9Z/4z/rf99//P+kP6M
+/qD+mP6R/rL+Av9a/2T/7P4e/nD9Uf3P/XL+rP5l/vP9u/3h/U7+1P4k/yz/LP8b/yP/rf8fAPX/
+mP9F/zD/pP8yACcAa/+U/nr+OP/x/0QAdgB6AEkARACkAAwBJgE2ATcBCgE/ARUCJgMxBAcFewXR
+BZgG6gdmCSsLZg04DxQQhRDlEEAR1BHaEuwTchSiFOkULhU5FREVBxUoFU0VZBVVFUsVGRU+FBoT
+LxJrES8RihGsESERGhD2DhYOrQ1vDd0MGAxwC9AKGAoyCVoI+gfTBzgHDQbABJkDlALFATYBbAAl
+/zP+6v0+/Qf8Cftu+in6Efqp+e/4ZvhH+DH4tffz9j/22vWu9V/1CfUT9WD1i/V+9bb1efYX9wv3
+g/bq9dr1fvZT9+P3Lfg/+CH4Xfgt+f75ivoy+xP8hPx3/Ob85f2p/jL/6f+bADwB2wFcAukCaQOl
+A/ADoARVBZYFqQXiBRgGGgbdBbwFAQY8BhYG8gUfBoEGxwaqBmcGRgY6Bk0GXAYfBrMFcQVmBWcF
+QwXPBBkEXQPUApkCgAIeAm4BvAAlAJ//H//m/r3+9f2l/In7Afue+hD6o/kz+XH4zfeX91L3w/ZS
+9vX1lvWI9Xf1H/W39EH0CvRI9IP0S/Tn8+nzK/Q+9DT0MvQt9DX0dPT59GH1dPV+9bb1DfZR9oz2
++PaW9yn4qfg0+Zr57/mv+n/77vt7/Gb9MP67/jD/cv+x/xIAqABeAfYBjQLgAsACFQM/BJYFyAab
+B7cHWwchB0gHuAdOCLoIugivCMEIrQiPCFcIpQe+BlsGxgalB+4H1wbCBLUCbQEaAXwB3QFoAScA
+Af9r/ir+6P1c/W38Vfuc+ov6svqo+kT6VPk8+K33ivef9/L3AvjD97P32vcD+PP3zffO96f3Rff/
+9g73Yfez9xT4evhp+Bf4M/ij+BL5evnR+c75HflY+Hr4g/mP+uH6e/rt+c/5IPpw+pn6vPrK+sz6
+LvvO+wv8AvwF/O77wPvP+w38I/xM/OD8kv0U/nb+v/7S/sf+0P7d/gD/gf8YAGQAjwDYACgBRgE0
+ATEBWwFuAY8BEgKjAqUCQAI/AqIC8gIRA/0CywK8AuUCIAM2Aw4D9QL1As4CmAJ8AmUCVQJpAoYC
+ZAIgAhUCCQLuAQcCFgL4AcgBfgFLAR0BjwAQADIAVADn/4P/rf82AKUAkQAlAOH/EwCIAL0AtgDD
+AN0ADgFXAU8B4AC/AC0BfwFoAToBUwG8AQIC6wHQARACtQJ1A9EDegPtAhgD5AONBN4E7QSyBHME
+iAS6BIoEIQQUBIQE/wQ9BcIF3QblB0gIEQiJBz4Hbwe0B4gH4QZOBhAGygUbBdkDggJYAvYDcQZ6
+CIoJfwliCP4GnQaVB+8I+AndCqkLCAwrDKIMLg1bDZgNaA5fD5UP2w6IDegLUAozCfsIxQkRC7wL
+CQt8CUsIGAilCDsJSwnUCCAIgAcGB5MGVQZKBgAGXwUJBVwFggXpBCMEhQPdAjcCmgG3AIv/W/6Y
+/Zn91v2z/Vz96/xN/MD7a/sf+6L6Mfor+ir63/nN+SP6QPoV+k763fpJ+3P7GvtO+r35v/ke+nD6
+S/rC+Tj56vgA+XX5D/p/+nj6HvrF+bD5L/re+ir7G/sI+xz7TPu4+z38p/xA/TH+7/4Y/xz/Tf9J
+//v+zf6//pr+k/61/sX+6P4e/zP/LP/k/oX+mP7Z/vX+Tf/e/2cA0ADqAN4A8gDkAH4ACQDb//X/
+EgD//6b/I//O/t3+M/9V//7+gP4d/s79iv1a/S394/x3/Pv7wvvI+3j7+/r7+lb7e/uA+6H7sPuz
++9L7yvt0+yD7tfoE+p75sfmZ+Un5JPkT+QD54viU+Fn4fPj3+Oj5uvqX+gj68/mN+tr7Vv0T/uz9
+dP0J/df8Ff3d/dj+Xf8t/8/+xP7r/uz+kP71/dj92P5lAHYBRAHF/wX+If1j/Vr+Xf/5/+X/SP+H
+/vT96P1Z/oj+Cv6E/aH9Hf4+/sD9/fw5/JX7dvvu+2/8yvwe/Q79gvwt/Ej8X/x1/Lj83/yw/Fn8
+T/y+/AL9p/xV/Jr8EP1f/a797/2j/cL8/vu6+7T75ftx/NX8lvw3/G38+vyA/fP9G/4j/lP+Zv4+
+/h3+D/76/eb9Fv6g/k3/3P8gACEA7v+k/5D/m/+D/3X/pf8BAIMA5wDMAFwADQABAP3/FwCuAFcB
+dQFGARUBygCdAKgApgDLAIoBkgJGA2ADCwPJAt8C0wJWAhUCZAKkAoICdgK3AukC7QLqAv4CCgMA
+AyEDcQPEA+QDnQMUA4gCNwJYAqcC1gLoAggDUQOLA3QDBANrAhIC2wFVAcwAowC0AOIAGgH1AGAA
+7P8LALUAYgHEAckBTgH7AHABzgF+AQYBtADfAI0BPQKcAngC3AGVAe4BywESAREB0gFJAloClwID
+AzcDJwMOA+QCqwLEAgID1wKJApkCEQODA4ADQQMsAz0DfAP5A10EUQQ1BGIEcgQ4BMMDGQPHAh8D
+sgMVBCgE8AN/A98CMQLoASUCQgLSAWcBXwFmAWMBVwEOAbEA9wAVAiwDjQOAA2wDeAPsA7gEbgW+
+BboF0wXoBbkF/gUaB/YHuwcEB7IGBQelByUIXwg5CB0IwAjOCUkK7Qk0CasIrwhDCe4JMgoSCoYJ
+cwiGB1kHqgf+BwsI4AesB40HZQfZBuUFOQUiBREF2gRxBL4DEwOJAiUCBALhAWsB1ACWAJUAYADp
+/zn/g/7C/dP8VPw8/MT7SftR+3X7V/sw+037U/vB+t35b/nA+Tz6UvoL+qb5K/nI+Mb4Efla+Wn5
+Hvmg+Iz49vgb+fD4BPlW+bn5/Pn5+dn5yPnA+Zb5Pvkj+UX5Ovky+Xz52Pns+cD5t/nx+T76jPrj
++jD7ZfuY+/P7hPz+/Af9wfzU/KP9d/6F/kT+Wf6L/rb+6v4d/2n/if86/x//f/+r/5n/wv/k/7//
+uP8TAMUAeQGrAS0BbwD2/yEA4ABQAfsAWgD3/w8AXwBoAE4AdACeAJEAfwBGAMj/Wf/R/uL9PP1R
+/cf9EP6M/Wr8kvtq+8H7Hfw2/DD8Fvzc+6L7avst+w770/pp+nD65/rk+mz6G/qp+Qz5tvi++Bb5
+ffmi+Zb5evk4+eD47vhu+ar5ivmR+bv51PkN+lr6fvp1+nX6ufoP+3X77vsH/ND7wPvb+wn8QfxG
+/Bb8Ffxe/JP8z/xc/e39R/50/r3+Wf+x/3f/Pv9Z/6j/6P/i/9T/CwA6ABcACQBjALQAsQDiAGcB
+iAEgAe0AEgEKAdoA4QAsAYcBvQGyAZUBkwF1AXABwQEPAkgCowK4AhgCUQH5APAAAAFIAbcB0AGL
+AWMBjQHUARACLQIMArUBZgF4Ab0BwQHWAUQCogKeAhsCbAEoATEBGQH1ACAByAHYAn0DvgJQAaUA
+zgAgAWABgwGiAdsB2gFHAVwApv+4/5kAmwFBAlcCxgEfAe8AEwF7Ad8B5gEEAlUCSwLbAWgBAgG0
+APQAywGOAroChQJnAlECMQJJAnsCxwJAA7sDGAQRBI0DEAMOA0QDSgNVA6MD8QMEBNQDiQOKAwIE
+kAS3BGcELgRwBL0EngQjBLEDqwMGBBsEmgP9ArIC5AJXA0kD8wI1A4wDYgMeA9QCUALKAZABxAEu
+AlUCNAIaAicCbQLYAt0CZAI3AqMCTAO9A6YDVgMuAwUDxwKbAqsC3ALCAlEC1wGAAUUBBAGvAE0A
+BgAfAHUAgwAtAL//bf9d/6T/HQBbADkAAADD/37/Vf9J/3D/yf8MABoAJQBdAHkAMQC3/2j/Jv+k
+/ij+6f3C/X/9K/0V/Un9bv2Q/dP90/29/Sb+nP56/jv+g/7z/tn+a/5n/sf+/P4q/8L/UQB0AD4A
+3P/I/0oA9gA/ATQBVQHMASwCEALUAewBJwI+AiYC9wHtATMCqgL/Av0CzwLeAicDBAOMApUC7QK5
+AvsBawGMARYCUALwATYB0AASASsB7gAkAYkBlAFhAfsAqACnAIEAHAAbAJAABgEuAcsA+v9M/zH/
+ZP9x/1z/Wv9Y/zb/EP++/hD+df1I/Vb9WP1t/b396f3P/cj97f0w/nH+vP4v/2T/Hf+s/l3+g/4x
+/87/yf9G/93+3P4q/33/mf9//1P/Zv+i/4r/JP+0/lf+Bv7R/Rv+3P5S/xH/g/4n/jn+w/46///+
+q/4C/4v/w/+W/wX/l/6Q/mf+4f13/Vb9Nv0v/XX9e/3r/OT8KP6q/08AEgBA/2v+Q/6O/t3+B/+u
+/vD9i/2y/eP9iv2h/Bv8y/wc/sf+Lv7g/B78lPxz/c/9yf18/az85fvh+278r/wY/Gn7l/uN/H79
+Vf34++36Mvsg/NL8jfyY+0P71Ptd/Mz7LfpU+Vr6svu4+xr7IPsR/Fz9Ff6o/R/8xfpe+9/9JABg
+ANL+Gv27/NP9+f7P/rL9UP2O/j4ALwBZ/j/9LP7N/84AnQHdAmcDywHj/iz9B/4AANYArwApAZgB
+MwAI/jz92v3r/iYAvQFsA2cEXAMWAFH9ev1w//kAcgFGAUMBVwFvAM3+7f1v/pH/hQA3AQoCKANR
+A5kBsv+4/x4BFAJOAqECSwN8A1gCfABG/zf/xP8ZAGAATgGSAq8CwQB6/l7+PgDfAVsCpgIrAw4D
+gwFl/+P+PADpAPf/ef+0AH8C5gInAez+gf4jABUCyAJSAqoBOQHxANAAnAAbAP3/7QDxAe4BegFS
+AV0BhAH2AdICHQPGAQAAEABQAp0EqASiAgIB+QCjAVwC5QLKAhwCrAFHAsED6QSmBNMC+ABSAcAD
+rwVpBdgDAQOSA2AEMQRDA9ACUQMtBOoEHwU+BOgCYwKpArECAQKXAZUCOQSuBDsDMAGMAJQB1wL/
+AiACVAF9AWACeAK2AEH+bP14/9UCVwSdAmj/1P1L/8IBNwK1ANv/XQB6AFz/6v1X/ej94v6c/w8A
+mwA/ASoB8//V/gv/DgD9ANABkwKdAkwBKP+0/eX90P5q/z8AowFWAgcBYf7T/Lz9HwAUAmgCjQHp
+AEoBGQIwAkEBHwAJAGIBtQIkAiwATP81APIAlwA9AGIAsAAjAZsBxAHaAQ0CFgL0AfMBIALbAWwA
+V/6U/XH/XgK/A6MCZwBC/9v/RQGOAh0DDgMHAxkD8QJkAhcBcP8M/7IA/QKeAxUCZgB1AOUBqAJy
+AZP/LP9NAKcBvwEFAPv9X/32/Ur+vP1K/Rz+7//lAHT/zfzT+1H9Jf9T/zT+6vwi/Kb86/0M/i79
+J/0I/qf+ov4n/uD9HP46/pz9bPzV+9v87/43AJb/Iv60/Zb+eP9I/17+n/17/db9Hv72/Zj9Gf2r
+/AX9vv2O/bv8vvzV/er+LP/S/m/+I/5k/Xb8YP35ACAE/AKt/tn7n/xU/yoB3ACi/4b/oQBrASwB
+OgDW/nj9qv0rAOsCsgOXAkkBRAGfAXEAmf6a/mkAdgEIAGT9OvxW/fX+C/+b/Tz8FPz0/BD+Hf/9
+/73/3/0P/Gv8kP4LAJH/K/5d/ej9gP+hAPT/sv1s+8D6DPwV/lL/Ev9u/an7rfvP/eX/v//K/RD8
+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
+h/9MAZMCDAKuAL4A1wKuBKwDaQBD/nv/GAKjAicBagDfAa4DJQN9AFn+iv6OAJsCQAPuAYP/Jf60
+/vH/UgA//9n9/f2n/xcB7gBn/0D+1f53AKYBpgGFACj/Ev+aABECjgFC/7L97P6YAa4CGwGQ/pn9
++P7lADABVv8x/ZX9jwAdA/kCpABs/gP+LP92AHcADP/Q/Vf+YADbAbgAeP0S+wj8WP+oAUIBVP89
+/tP+jf/d/iz9b/w6/q4BoQMUAp3+MPwn/Mv9dv8YABYAJQBjAEYAu/4M/NP6JP1bAY4DSAKY/+H9
+5f0H/10AKgHEAEX/Jv7i/pgA/QBW/x/9UfzV/cMAjQK/AaP/Xf4I/6MAQQFJANb+eP52/6oA8AD0
+/4r+Rf6v/xwBbgA8/ir9Qf4eAP8AgACT/+L+Gf40/V39q/5y/2z/lP+m/x7/Uv7Q/TL+Rv/g/8r/
+t/+n/3P/I/9k/pz9I/4QAE4BdADn/pn+Fv/Q/hH+ef4uAIYBHgFM/6v9aP1w/tD/SwCn//3+Gf+f
+/7P/M//c/vf+K/8t/yT/cf/E/7n/u/8+AOQA2gAQAG7/mv80AIoAYAAZAI0A/gHXAnoB7v5u/dj9
+Xv8+ALj/GP+Q/3IAbABH/xr+Mv6L/wQBGgJ8AnwBmv+s/nH/VgAfAG//E/9H//j/ewAYAEf/TP8u
+AO4AJQH2AK4AigCDAMoAVAFkAdIAiADyAGgBVAG5ABUAKgD1AMoBXgKBAgoCWgEBARwBEwGGAAwA
+iQABAi4DzQL7ACr/5v4OAAsBMAH2AOEAawEbAtEByQDT/zD/ef/TANoBgAF9AMP/hP+I/7D/BgAx
+AD8AzACYAeEBdAGxADgAKQAmAIsAswGJAhkCGwGlACsBXwL3AvUBmQDYAGoCXgOXAt8ANgBXAc0C
++QKyATcA4f+2AKYB+AHpAfQBDwLVAS8BsQCXACsAd/+R/54AwgFUArwBNQAj/wf/Pf9t/8f/gwA5
+AQQBJQDa/woAdf9L/jn+yv9YAU0BfgCFAGYB/wFYAd//G/+w/8EANwH8AH0A3P8u/47+TP6//pD/
+RgDOANoAOABx/9P+av6Q/kL/DAB6AIsAggA6AHf/cf7M/Rn+dP81Ac0BtgBP/57+Wv4R/uX9Hf7m
+/mYA3wHwAToA6/2q/DH90P5TAOwAQQAS/8z+X/9H/xL+J/3z/bz/wwCXAOv/bP8K/7r+r/7k/on/
+pABlARAB1P9b/o/9/v03/zYAKwBj/xT/q//9/wv/fv3D/H799P7s//b/qv+b/5L/C/8p/rL9Cv7j
+/sT/LgDr/2n/Ov9Z/2j/Uv8F/43+l/4e/1b/Nf8T//b+zf57/uT9cv2x/UP+ff5//rf+zf5E/of9
+Av3J/Dz9OP7h/sb+O/71/VL+1v7l/pD+Z/7W/pb/DgAzACEAzf9j//r+s/76/oP/lf9n/6//SgCD
+AB4Abf/H/oH+3v6t/2IAswDCAKgAVADV/3X/a/96/1n/Y//C//b/3f+N/xz/HP+Y//T/FQAcAA8A
+CQDX/3L/nv9jAGsAnv8d/xD/D/8K//j+nf4k/kb+Lf/3/yAADAAaAEgATwAlAC4AlADOAHMA+f/b
+/yEAhgClAHkAQAAdACgASQBWAGEAoQAEATQBJwEEAc0AmgB0AC0Apv8r/zz/HQBLAa4BHAG3AC4B
+rQHEAQcCawJsAiwCBQK3AeIAgv9r/rj+4f+AAHkAQwDv/9P/UgDyADgBWQGdAbYBMQFyAAoAz/91
+/zz/af/G/+n/sv9q/2n/o//o/1YA4AA5AVgBjwEBAlMCPwK2Af8AsgAeAakBiAH3ALwAEAGEAY8B
+JQHzAIsBgQLvAoECvAFQAY4BHgIjAj4BTQDh/6n/l/+k/+H/VACXAL0AKQFqATgBDwHuAKUAqAAR
+AT0ByQAoACAAmwDWAHYAz/90/7b/QwCuANsAzQCbAJUAnwBNAAIAXQC/AHwAVQC1AAYBAgGYACAA
+YAD3AOAAZgB2APIAHwHGAEYAGQB8ACYBUAHTAJ8ADwFDAeEAdABWAKYALgE8AaYAHgARADkAJgDf
+/+b/agDDAFsAx//H/xMALQD1/5f/nv9eAAkB1QBTAIAAKgF1AWkBfAHTASMCIgIBAu4B9AHYAVEB
+xwDjAJAB9gGvASMB3QAeAaIB4gGTAQwBzwDKAKQAOgDZ/8j/wf+U/1j/av++/7b/X/9D/5n/9P+4
+/zj/+v64/j/+3P3I/eP9F/5X/mz+ev62/rr+ev6Y/ub+z/6J/lj+Jf7E/Xj9tv01/o7+sP55/u39
+cP1r/b/94/2z/Zn9z/0i/mv+gP4u/sb92P1l/uv+4P5D/rv9yf32/cn9k/2f/df9Jf5I/iv+Dv4P
+/hj+A/4C/l3+Av9J/4z+k/1c/Vj9LP0X/dL8sPx0/Yv+8f63/mf+Xv6h/of+8/3o/WH+IP4k/dH8
+gv0u/mT+Zf5J/o/+lP+ZALsAMwDx/1wAFgG8ATkCiQKoApgCggK5AkgDugOSAyQDJwOCA5sDWgMl
+A24DNQTLBLQEYASRBDoFoAWNBU0FJAVaBXoFBwWlBKsEhQT+A4gDNwOjAj8CfAKFAvQBjwHHASUC
+BQJZAZsAOwAmABAA//8IACIAQgA4AM//VP8O/77+NP6v/Xv9Wf0D/aD8Mfze+xP8lPyt/En8xvtt
++6r7avzT/J38VfxY/Jv8xfyR/Fb8Xfw7/MP7b/th+0D7IPsx+1n7lfvI++T70Ptz+yD7Fvvv+nf6
+Yvof+/b7I/zp+637jfuX+1L7wPqI+t/6m/sj/O/7cPtf+2T79/qo+gb7wPtX/MH8Qv3A/fH9FP5m
+/q/+2v77/vL+1f7i/gb/EP8M//n+2v7T/v/+Tv+D/6b/AACdANkAGwAl/xf/pv/a/53/iv/l/0QA
+NQDA/0D/H/+D/xsAfwClAMcAxQAsACb/Zf4U/iz+E/8KAOD/Pf9L/9P/DQCW/8b+sP67//4AzAF6
+AioDiAMLBHMFHgePB+gG+QZNCHUJqAmPCcQJWQosC7ELTQuBCqAK+ws+DXINcw0BDuYOwg/xD0MP
+xA50D6AQ8RBDEIMPPA/1Dh8OuwxeC+wKRQtcC8YK+glqCeEIKgjKB98HeAeTBicGGgazBcoEmAOp
+AnACNgI8AR8AsP/a/+//if8C/7H+jf5C/mX9E/zp+oL60voM+8b6O/r0+T/6evoK+lf5PvlD+mX7
+ePs0+1r7j/tT+5b6wflA+R/5Nvk6+Qj53/jr+Bn5XPm5+fz5Dfpi+iT78PuB/Nb85vyq/Lz8Nf0J
+/UD8CfyW/Dv9hP2D/Zn9+/2r/kz/Rf/f/gL/y/9UACUAAABnAMcA9QBXAdgBJgI6AmMCwAL9AtkC
+dQIKArABkgGAARgBcgCs/9X+a/6v/u3+0v7F/tn+yf6H/kz+Bf6R/Rz93PzW/AH9C/2n/Bz8sfuD
++2f7BPt0+jv6Zfps+hX6f/kX+Vf5wPmm+Yr5q/mE+WL5i/mn+cD58/kV+gP6yPl2+Vf5nfno+er5
+0/nS+cj51Plm+ij7aftc+3P7s/vs+x38ePwO/bb9Mf6M/vH+MP9E/4L/5P9DAKsA4gDyAFEBHQIJ
+A5EDdAN3A3AExQVfBlMGiQZEBw4IhQiFCDEIEgh0COEI7wiPCAkI7QcYCOMHZQcpB14HsAe9B5UH
+dgdZB9AGvAXMBC0ElwNMA1YDLANTAvAAlP+G/gX+7/2N/fP8B/26/RP+ZP2s+y369fla+oL6U/oA
++rL5d/kk+Zr4Nfhh+A75pfnU+Qn6dPqn+jf6dPkf+TL5V/la+e74Rfjz9zn4zfga+UP50vlD+gb6
+CPrR+uP6qfmy+Mf4Rvmq+av5UfkF+QH5ZfnL+XT55fhK+Vb63fra+vH6CfsA+yD7Vftb+2v7z/tA
+/Hr8rvzJ/Lb8G/31/Wv+qv4k/07//v4E/6D/IgA8AGEAFAHrATEC/QGWARsBtABqAIcAXgFOArAC
+nAI7AtwB2QHrAbYBWAEpAXAB1wG4ARoBYQCn/yX/T/86AK8BQwOCBMIFkQdKCVUK+QoXC+YKnQtH
+DXMOfQ4nDiIOTQ5uDpsO3w4yD9oPAxE+EikTyxP3E8YT8xN+FO8UBBVNFA8TKBKQEawQUQ/qDREN
+wAxgDHwLGQrVCDAI+gfNB30HGAfBBlQGcwVpBMADXAPvAogCRwLGAasArP84/8n+Kf5u/Zv8GPwD
+/MX7Jvts+tn5yfkx+nz6bPpZ+oj6xPrb+r/6RvqV+WH5//nC+gL7/PoB+wj75fpW+nf5w/iW+OD4
+W/nZ+Qv6Fvpj+rP6zvrv+jP7nPtk/IX9TP6d/h7/ov+R/yX/8v4H/yT/Wv+d/7T/2f9BALwA6ACl
+AFgARABmAOYAoQENAjICfQK0ArIC5AI3AykDmwLeAU0B4AA+AEf/fv5C/iT+5/2n/V/9Dv3Z/OL8
+9fzZ/Mb8AP1Y/UH9j/zR+337PfvK+nj6avqF+rX6lfoS+sT5mPk8+RH5Svmh+df57Pnm+cz51vkL
++gn6wPmr+SD6xPrz+sH6vfr1+uj6hvqZ+h77LfsN+0H7Fftc+uP59/lr+ub6Dfsn+577+PsB/Gz8
+Q/3V/R/+rP5D/1P/L/9r/7b/uv/c/z4AnwD0ADEBXAHGAXIC/gJhA7kD2QPiAyYEbwRVBBQEIQRX
+BGoEdARvBDME4wO8A+cDFwTiA3IDYwP+A3gE8gMjA2QDbATOBDwEtQPyA70ENQXlBEAEtgN+A6UD
+ugOHA2YDawN+A48DawMbA+oC2AKaAlsCkQL7AqoClAHZAM0AnwAcAMr/vP96/8T+If4T/gT+Mv0d
+/NH7UPzO/L38Hfxv+0X7fft1++L6Kfr++Yv6QPtZ+8b6bvq4+gz78vqY+pf6CvtJ+yH72Pqe+qP6
+xvq6+sn6+/q9+oT6pfqE+oD6Aft5+5f7kvu6+xH8C/xe+7H6ofrr+uL6gvp7+tv6D/sN+wj7+PoQ
++2D7avtC+6L7Q/xe/A/8vPuS+9v7Zvx0/D78f/zt/Pz8zfzo/JT9Yf7D/rz+nf7N/kb/jP9g/wH/
+4v76/u7+yf7k/nD/EgADAFv/Tv8fAMYA3gDqAO8AsABeABMAzv+5/7X/kv97/4f/1v9hAKAAPAC7
+/7X/7f8RACcAKABQALoARQEMAiIDbwTtBXMHugiLCfcJgAqSC6oMAQ3aDOQMFw1UDeANkA7KDp4O
+sA5lD20QNhG9EU0S3hJoE+8TdxQUFXUVUxXGFO4T1BJ3EQwQrQ4WDZsL6gqOCqMJSghnBxsH+QbK
+BjUGhgVRBWYFVwXYBP4DUwP/AmwCbAF7ANj/Vv+k/sb9E/16/N77qPvW++j7wvtz+xz77vru+jH7
+e/s6+7D6mfrQ+qT6C/pw+QL5zPiZ+DL4rfdP90L3SfcR95/2TvY+9mf23vZp99T3VfgC+bv5hvpS
++8v73/sZ/JT85vw1/cT9IP7i/Zz92/0M/qj9Sf2p/bT+yP9NAH8AIgFLAhID5wJZAi4ChALfAtkC
+iwJvAnYCTQL5AVoBjwAPAMz/Uf/L/qv+pf6Q/qz+2v7B/lj+3P2V/cH9Lv57/pH+kf6n/q/+Of5Y
+/ZL8OfxQ/If8X/wa/Bf88/uT+0n78frD+kX7yfus+5H73fsd/NP7Uvte+9P7DPwR/Bz8Cfyn+z/7
+7/pv+hb6OvpK+tb5jfkw+jT7tvu++9T7Kvya/Dj9B/60/ir/jf/M/+v/CgAZACIAUgC1ACcBfQHW
+AVoCyQLeAtcC+gIiA1gD8QOyBCsFbAWcBaIFgAV2BZ0FlgWUBQUGfAbABiUHaAfiBvwFpgWkBWgF
+TwWfBSkG0AZDB10HFQdFBnAFAQV+BOwDBQTMBH0FewXSBDEE5gOuA3oDdAN4A/wC9wH8AD4Aov8s
+/6b+0/0d/QX9M/0B/Xv8A/yr+0v79/r8+kb7bfs5+6L6y/n/+Hb4Gvj49/X3zffT9z74ifhq+BH4
+0/cF+FT4ovhc+RD6H/rl+eD57/m4+W/5gPm3+bn5tPnk+f75v/ma+fP5dvq4+t76IvsE+0P6xfkD
++jz67vmV+dD5hPr2+tX6lPqG+rz6MfuP+6z71fsj/Df89PuG+wH7jfp2+qz6/vpj+8b7JPxc/Hv8
+5/xx/X39Lv1l/Vj+A/93/l/9I/3S/Vf+8/0J/cv8gv3v/bz90P0w/in+wP2K/dr9m/5f/77/pP8E
+/0b+Kf6r/gn/wf4w/ub97P1y/n7/KQDn/zX/1f5J/y4AigBGAAAA+P8kALwAFwIWBCkGjgcpCAoJ
+9Ar7DOoN9Q0LDn0OAw9yD6APWQ8MDzMPkA/PDw8QsxC9EcYSjBNJFEAVKBaQFnMWBhZqFc4UCBTY
+EpsRehA9DxcOFA0zDMoLngsPCygKqQmnCXMJCwnICIoIGghyB6UG/wW3BTQFJwQbA18C4gFqAbkA
+uv/E/jX+ov3S/Dv8E/wO/M37TPvX+pH6n/rt+uT6QvqC+Sb5Ivkf+fv4uvhv+BP4nvd597j3nPfn
+9hj2lPVg9Rr14/Rq9Xf2PffR96n4tPne+vz7hfx+/FP8Rvyh/An9x/xI/Gb81fzR/Hf8WPyJ/PP8
+sP2o/qv/tQC1AVkCawIfAtYBBgKhAvYC6gL6AlEDnwN/A/ACTwLfAbkB4gEPAgcC5gGuAXYBWgET
+AacAjgDlADUBKAHuAOsAEwEBAbgAegDz//H+d/7p/hX/oP48/sH9Ff28/Ln8sPxt/Ar8CvyJ/Nz8
+2vzz/CP9R/18/bb9qP1Y/Sv98/x5/BH82fui+2H7L/sT+zL7lvvi+/f7Gfx2/Mj8yPze/Hr9OP5/
+/rL+VP+v/0v/A/9P/2r/CP/R/g//kP82ANAALgFtAbcB7wHrAfMBZQImA7IDygPzA2QEcwQmBCoE
+NgQ2BCQFrQb1BpgFtQS9BTwHTAcDBr4EbQT5BMIF9wUCBYgD7AJsA0MEBwWSBYAFzAQMBIcDlgNC
+BGMEOwPLARcBowDc/wr/Vv5F/dj7R/sC/M38rfz7+1r74Ppj+gL64/nw+Rj6Nvrc+fz4Efh19y33
+9/bi9hD3H/f99u329/bm9qH2q/bf9n32TfYj9wb4Vfh++MT4+vi5+ED4bvgo+VD5uPhC+Cz4Gvgc
++In4+Pj1+Av5gvmp+Sz51/go+Xn5R/n4+ED5C/qx+tv6p/qQ+tT6G/sW+/f6KPuj++771/tw+wf7
+Mvvt+3f8cvyd/Ib9Mv72/b/9Df5k/nj+Xf4O/pD9Ev2q/Mr8Zv2N/Vz9aP1Q/Uv9H/4X/x7/a/7+
+/af+of9V/yf+6P2o/gj/xv65/vj+1v6Z/uz+f/+r/3P/Yf/G/3QAuQBBAM//tf+g/73/PwCjAGEA
+//80AJsAfQBPAOgApQF7AQYB8AF1BLgGiAe6B4AI+glGC9gL6gsSDNIM3w2aDtkOEA+8D10QWhA0
+EHMQFxEREuwSXBPwE/MU4hVlFn8WGRacFVYVwhTAE9wSChKUEPEOaQ50DtMN/Qy3DJAM8ws3C7IK
+Hwq6CcIJoAn4CDkIvwdoB+IG/wUGBVoE8wNFAysCRQGaAK7/gf6G/Rn9yfwk/IP7S/tX+2/7e/tO
++/z6xPq6+oP6uvnz+MX4yfhN+Gr34Pbo9h33Mffk9n72s/Ys9xX3sfbB9lP33PcJ+C343fjg+YD6
+d/o3+qj6wPtd/EP8G/w0/Iv84PwN/Tr9if3q/Vn+5v6W/4MAdwHbAQMCpQJSA2YDRwNhA4UDeQNP
+A1cDrQMKBCgEBwTTA5kDSQPzAq0CeQJ7AscC3gKAAkcCPQIzAkwCEgJrARABJQEHAZAAFwC3/5v/
+lP9A/+z+/P5L/2//LP/J/qL+pP6d/lz+5/2U/Yj9fP0X/VX8zfvn+zP8QvwJ/Nb74vvE+2D7Gvv3
++r36bvpH+jj68Pm5+Qb6aPpm+lP6ePqx+ub6EPtA+3H7Xvth+837NPxe/Iv81PwQ/VH9u/09/r7+
+Mv9o/0j/Z/8VAOAAcwGxARACfANwBfQF6AR8BKsF/wZAB5QGaQWtBDsFcwb9BmsGygUYBuUGcgem
+B5wHaAdVB04H8Aa1BiYHiQe2BvsE1wOcAw0D1AHKAOb/wf4P/jj+Uf6h/bX8Svw//CL8zPtO+/T6
+4Pq7+hP6+vjt9wv3SvbJ9bH1zfWD9d30pvTr9AT19/RA9W31EPUe9f31vfbL9o32lfam9j72svWk
+9QX2VPY89hz2qvac9xD4CvgB+Az4S/jZ+Ab5SfiC95P3NPiR+Cr4cfdd9y/41/iI+AX4KvjN+Ib5
+Sfrk+g77G/ur+5T81vxu/Gf8+vyQ/dn9DP49/jr+LP5L/pT+u/6p/vf+iP9z/yH/RP9R/z3/Nv/A
+/kv+nv41/3H/mf+3/5X/ff/N/zAA4P/w/on+6P4K/8L+u/4G/yL/sv4w/oD+SP+W/5b/AQDgAIMB
+jgFuAYUBcgH1ANEAbAEEAt4BEQE2AL3/yf8ZAD4AHgAJAIUAmwFeAiwCjwFZAd4BpQITA9YDtAW/
+B60IfggzCNcIVApDCwsLyApJC3wM6Q2VDiAOeA16DQ4O0Q7VDw0RBBLsEmIUHhY9F5oXpRdwFyEX
+yxb9FdoUwBOvEsMRxRCID7UOpg7MDrgObw4aDucN0A2nDVIN1AxCDKYLKQu9ChcKGAnVB5sGpwXg
+BBAEGgNcAigCCAKDAdIAHgBI/7z+kf4q/s39F/6R/rT+a/60/ev8KPwl+xf6ZPny+JP4Yvg9+Az4
+BPg/+En4kven9lv2mvbf9vD2APdk9yP4t/jf+Ab5efkF+lb6Yfp/+un6dfvD+7H7g/ul+y/8pvzE
+/Pr8kv1M/vn+jf8HAI8A/QAdAScBSgF9AbUBGwJZAgsC5QE/AnACMQLHAXEBWwFkAVwBZQGPAbYB
+/gGqAi0D7wKXAq4CvAJ8Aj0C/gGlAW0BRAELAcwAnwB7AC8A5//a/+r/7v/s/9D/lP94/3H/Hv93
+/qX9xfwv/An8BvzY+5b7n/vm+9D7c/tD+9v6CfpS+Sv5m/kK+vP5hfk3+S35VPly+Uv5DfnB+I74
+/viW+cz5+/kB+sb58vnJ+sL7VfxY/GD8Pv2T/pP/AgDB/zX/bP+vAAsCRwJ8Ae4APgE1AkcDywOR
+AxwD/AJGAwoEGAWSBQUFNwQpBMgEhAUdBvAFggTqAmkClAJcArIBFgGrADwA0v/U/wAAyP+D/1f/
++/7N/uX+nP7i/Ub9t/wL/HP7w/r7+VD5nPge+Df4QfjN95H3kvdK9x73R/dR9/32gPZN9m/2mvbK
+9s72PfZ09S/1avW49cn1VvXA9L/0QPW59d711/US9mf2T/br9cT1A/Y99lL2avZZ9kb2yfax9xz4
+1PeO9+73e/id+JD4sfg2+eL5E/oI+lf6qPq5+uT6I/sx+0b7v/tg/Jf8tvw7/ab90v36/dr9pP3k
+/W/+0v7t/sX+lf7a/n3/qv82/+D+8f4K/wT/GP9f/7H/7v8AAN//uv/B/9f/3v/U/6j/kv/l/2kA
+mwBQAOz/JwA1AVMC1gL1Ag4DMgNfA3UDDgPfAcQAsQAuAUgB/ADqAH0BiAJGA5IDxQPWAwcETAQW
+BKkDwwP7A2wDigIrAkECsQIuA2QDyAPJBHcGhAjECcYJCAqfC4gNRg7DDVIN7w0zDzYQUhCvD2MP
+LxB3EVkSoRKcEtkSmROvFMAVeRYCF6QXIBjyFx4XMBY8FSQURhOZEqsRrBATEPkPEhDkD28P9Q5q
+DuYNpA15DSkNhAx4C0UKOAlhCGMHJQYzBYwE0QMwA7kCcwJ8AloCugElAbUA+/81/9P+qP5//nX+
+SP6X/a78Lfwd/NT70vqI+QD5Xvnb+dn5QPmt+LT4EPkB+Sz4C/eN9t/2Mffd9jb2DfaW9jb3ePd3
+95L3Pvg8+dP5Bvoq+oX6H/uH+377NPs2+9T7i/zg/An9Pv2M/UT+TP/o/83/jf+o/9r/uP9j/3P/
+MAAIAYcB1QHgAdIB8gHsAY8BKQEHAf8A1AC8APsAYQF1AT4B/QC8AKgA5gAxATAB6gC/ANcA8gDN
+AI4AfgBZAOf/j//F/1AAjwBcABoA8/+c/wD/Uv6+/Vb97fx3/B/85fu1+4H7UftD+yr73/qm+lr6
+q/kt+Vj5bPn6+K34sPic+JX4yvj5+AH55/jP+CX56/le+kD6TfrM+jD7aPv0+5z8Af2u/aT+C/84
+//L/6wCIAY4BOQEAATsBqwG2AWsBbAEAArcCDwMeA0MDnwMZBIYEoQSLBN4EaQUhBQ8EZwMcAzoC
+GAGUAHwA8f8M/wT/l/9t/9X+Ff/U/4//cf7W/aX9E/1L/JH79fqJ+hT6cvn1+M/4qPhC+AT4R/iN
++FH48/cP+HP4U/jR96b3v/eL9xr3Hvdj9xr3f/Zd9rP2x/Zr9hL2E/aF9gP3FPfY9sX2A/c99x33
+1vaf9lz2IPYI9sf1R/UP9cH18PZB98j26/bA9y/4C/jz9wn4Hfhy+DX5nfk6+Qj5cvm1+cv5OvoI
++/D7rfwl/Yb96P01/of+zf67/nX+gv7t/jz/Sf9h/6z/+f8uAH4A1wDqAMYAqwCdAJkAlwCQAKYA
+twB9ACoAJQB3AOYADQG3AGIAqgBDAXYBNwH5APwAPwGHAXABRAGTASkCdgJ4Al8CVAKlAg8DAAPF
+AqsCFAKGASACNgOBA8MC0QHLAY0CAwMnAzcD5wK2AhEDYANoA5UDAQQ3BPYDgwNzA2sEWAY/CAAJ
+sAjfCEcKAAw0DYoNOg0FDWQNdw6mDwkQvg9/D9oP3RD1EcgSehMSFJAUGhX1FRAXFxjRGMoYvRdp
+FpsVOBW+FM0TihKJESARSRFxEfkQeBCsEMEQ6w/hDkcOBA7zDZ4NtgycC7QKIgrFCfIIbgcwBsUF
+eAXkBGcEJgTUA4MDfQNUA6sCEgLRAWUBvgAHADz/mP4m/p/95/wW/Er7ufqG+lT6rPnJ+In4HPmx
++d/5pfnm+A/4cPfB9uf1EfWP9J/0KvXH9Sz2g/YO98T3A/h69x33svet+FL5mvmN+Sj52Pj4+FH5
+bPk1+TP55vn5+tj7gvwo/bb98/3o/RX+vv6C/yYAsQDuANkAzQDuANwASgB8/9/+ov7D/h3/d/+4
+//n/UgC9AAIBFQEsAUIBRwFtAXUBFwG6AH4AAwCR/3b/Z/9p/2z/GP+J/lD+p/7j/qH+Y/5R/u/9
+Qv0U/UL9yPzq+5L7kvuU+7X7yvu5+5D7PfvT+mz6CPqq+X35hflN+d74mvhU+Pb3vfez96f3kve5
+9yb4pPgR+U75cvnX+Yj6DPs5+yz7MvsF/Kf94P5u/uz8i/w2/nYANwEOAJP+X/6g/0YBxAG1AHf/
+iP/2AIkCZgOFAxgDfgI/ApICYAOpBKAFuQQhAioAAgBEALr/yf7h/f38svyg/eX+PP/K/nH+f/5r
+/uH9Zf1N/Tv9qfyp+wz7O/uD+xD7BPpX+Yn58/n0+dL5xvmR+YL5Nvrb+h36vPiD+Dj5avkT+eH4
+svg7+Nf33/cE+Ab44Pd79x/3UPf69134HPjJ97/3p/eG95b3U/eB9uz12PXb9dL10/WJ9uX3bPjr
+9/j3/fjk+Rb6wfln+Zb5F/ot+tL5gvms+Xz6gfsj/HP86fzH/cr+dv+k/53/vf8HABMAtf+J/9b/
+HgBOAIEAdwB5AAsBuwHNAWcBPwGhASoCVAIOAsMBvAHYAQEC7AFmARkBeAH/AQsCkwEuAXkBNgKY
+AlQCFwKpAp8DDATeA6EDqwPlA/IDwQOWA40DnQObA1cDQgP5A/AE4QSiA7YCWwOfBAMFggTDA0sD
+kwNJBH4EAwRqAwsD3wL3Ai8DKAMAAywDxQOPBIIFsgbnB58I7AjYCbsLRg1QDWQMDAz2DEsO9w6s
+DvoN8w3hDvIPghCwEN0QXxFREngTaxQ6FVIWDhdMFpgUXxMZEyQTxxIAEisRZBDrD1wQOBEsEVcQ
+xQ9+D/gOSA7nDbYNIA04DG4LhwqhCUQJAglZCM8HzQeuByMHtAZoBhYGvgUlBUAESwN4AvIBqAEp
+AUwAhP88/yD/cf5W/a78nvyd/Ev8lvv6+vn6NPsO+2T6lPn2+Bv41Pba9Tz1kvQO9KnzL/NK80j0
+NfW69RH2P/aw9nH3xfeC9yf33PaJ9kP2LfYn9h32fPY99+n3f/hE+Vz6kPuQ/DX9bP1p/Yb9vv2m
+/Tz93vzJ/Mr8l/xp/Iz87/xf/cn9E/77/cj9Ef6y/hz/Qf9t/6v/9v8zABQArf96/5r/k/8r/+v+
+L/9r/3P/uf8WADgAXgCMAGAA/P/B/7T/mP8d/1L+nv38/EH80vv3+x78C/xA/K38xPyb/L383/xL
+/FL7wfp7+if65PmE+RH59Pjw+OT4Gvl++e/5Xfqc+sf6K/ug+8/73fvF+3P7TvtD+wb76foy+4H7
+b/tj+xn8eP16/pr+WP5n/kP/cQDDAAAAP/8q/1n/j/+9/6f/a/+A//L/jgAnAb8BrwJDA2gCFQH0
+AIwBiQEAAXcA2/8t//T+Uf+J/0b/9f7K/qz+rP7T/hT/MP/Z/kf+vv08/dr8ifwZ/K/7rvv8+0D8
+a/xj/Df8C/zd+9n7z/tp+wb7UvsJ/C38uvtj+zb79vqp+lj6Fvrw+Zn53vhW+Ij4yfhw+NH3dPeA
+94f3NffU9p72e/aA9tX2EPe69nH2/Pbq90b4CfgO+J34Hflo+dH5HPo6+oX6uPqw+sT6OPvp+3H8
+u/z0/FX97v2a/hH/Gf/k/r/+w/7Q/tH+8P5J/5H/ef8w/0L/7P/PAHUBlwFQASoBfwElAocCMAKJ
+AWABxAFbAs0CswJiAokC4gKyAkYCSgLBAlgDlwN1A6IDPwSvBKMEQwTTA4sDswMYBPUDRwPtAk0D
+0APoA+MDIQSOBPMEFQX+BNkE6gRnBb8FIQUMBOkDygRWBQsFfAQZBB0EkgQjBWUFRQUKBQMFZwU1
+Bv8GWQdXB1AHsQeyCNgJnwroCsMKvQqFC8AMPQ3ZDIgMmAz7DN0N0Q43D0sPhQ8YEA0RHhIDE4YT
+cxO2EqQRABH5EOkQiBAdEJsPBA/0DrAPRxAFEFwPzA5eDtwNPA2uDCwMdwuhCu4JgwmCCZQJMwmO
+CB8I4QewB08HhQaSBQYF2wSDBMAD4QJMAgwC6gHKAY8BIgGrADUAj//L/uP9+PyI/Bj8M/uR+mj6
+Mvrf+YX5/PhQ+Jj32PZA9tf1VPXG9GH0BvTc8yP0rvQD9eL0y/RG9Q/2k/aX9k72FPb49dT1y/Ub
+9pb2Cvei9234LPmj+eP5EPox+kP6Ovok+iv6U/p3+oH6xPpl++D75Pu5+5v7uPsu/Gj8+fuF+377
+nvvU+yX8RPwj/GX8HP2E/aj97f02/p3+L/91/3T/l/+w/4r/gf+G/1//V/9W//H+nv7e/hn/pv4T
+/mj+j/9lADAAi/93/9H/ov/C/vH9jP0s/YH87fu/+677p/sG/Pz87P0j/tL9lf2o/WH9OfzW+hj6
+/Pn8+RT6gvo5++P7Kfww/Br8zfuj++L7O/yc/OL8vPyo/N78yvxE/I/7GPuF+9b8D/6O/rL+9/6j
+/7IAWQEAATEAsP/Y/1sAnACYAIIAeQCHAKQAHAEFAnoC6AEnARgBfAGxAaUBlwFcAcEAQQAwAD4A
+LgDg/3P/e/8YAJoAXwC8/2f/Rf8e/wf/5v6x/mr+EP7P/cf9sf1k/Tz9Af0u/Fv7hfs//EP8pvtQ
++3r76ftX/Hj8O/zo+6r7gPt7+zz7pfpD+iD6Avr2+ez5u/lt+Tj5K/kz+S/5GfkK+f349/jo+NX4
+9vhG+ZD5uPm3+c75Ffpd+nb6PvoW+mf69/pj+4z7ivuX+wD8t/w9/U39QP2E/RX+l/6y/mv+KP44
+/nv+ev4w/nX+f/9dAJ0AoQCKAHYAmACbAGEAFACy/4r/6v+IAA4BPAHfAI4A5QCTARgCTAKFAgQD
+ewONA24DnwMUBGQERQQSBHUEOAWwBbMFUgWyBCME6wPzAw4EUATMBDoFKwW6BH8EnQSeBDkEsANp
+A58DbQRoBcUFMgUwBKIDqwOaAyID4QIgAykDywLPAlwD3AMdBEIEmASoBUUHWAijCBEJ3QmeCh8L
+AgsvCpgJIwpaC0IMlwx9DC8MTwxeDdAOqg/QD94PFhBJECIQrw9GD94OSw6qDUgNJw1SDecNPg7H
+Df8Miwx1DGgMMwzIC0IL7graCqkKOwrjCdEJ1wmhCeEIwgfjBogGVAYMBtgFjwX5BHoETQQsBCkE
+PATfAx4DZAKiAZoAav9T/mv9xPxL/Mr7eft9+2T76vpp+gr6l/k3+SX5EPmU+P73tfeU9273U/dG
+91j3rffz98f3XPcQ9wz3GPfa9jr2vPUH9rT2+PYN95b3Xfit+KD4wfgM+U/5h/ma+Wj5Gfnx+AX5
+Hvn++Oz4IPlm+af52fn/+TT6Z/p3+ov6tfq9+uH6ivte/N387fzP/AD9YP1d/R39DP0K/QP9Nf2S
+/df9CP58/kv/6v8BAPX/GgBpAJwAiQBhAEoAKADj/5r/af8z/wH/Av81/13/Ov84/53/zv+b/0r/
+Fv/9/q3+IP6e/VL9Jf3x/ND80/z0/CT9Sv1M/VH9o/3v/ef9xv2Q/S791Py4/Kf8fPxM/Cb8RvyZ
+/Mj86Pwy/Yj9+/25/ov/CwAZANL/p/8DAKUAzAAKAOX+Wv7D/rn/bABmAAwACgC3ANYB2QJnA4cD
+YgMQA8ACmQKCAmcCLwKtAeEALgADABIA/////yYASwBwAJoAxAC6AGkACgDO/8T/iv/n/mz+LP7C
+/W/9Vv0T/cv80Pzs/Aj9Rf2f/dv9sv02/d38Ff1//Wn9AP2+/Jv8Zfwl/P771PuK+1z7aPt4+4H7
+dfsm+9b6o/pG+gb6Efrt+Z/5fvlf+f/4xfgJ+VD5Tfk5+Sr5JflW+d75bvqM+ln6Lfog+i36Pvo4
++hf6Bvoi+kD6iPo2+7P7vvvj+xz8Rfyx/B/9I/0p/Wf9lf3G/fj9GP5l/qz+jv6B/g7/sP+c/zf/
+Q/+l//7/GQAaAFIAxQAXAR4BQAGmAeABxAGpAdMBMAKoAh8DWwNVAyYD9wISA2gDtwPMA4QDSAOP
+AxQEXARfBHIE3wRgBW4FPgVBBWEFZwU4BdoEaQTzA4gDeAO2A5UDCgOIAh4C7AEWAm8C4gIpA+UC
+lgK2AtwC7wJNA7wDCgSQBF8FLQbIBkMH9gfXCEcJLwkECfsIMQmzCTAKfArpCqQLjQyYDYwOQw/B
+D74PRA+/DlAO8w29DZQNNA2aDDEMJgw7DFsMdAxIDOQLgwsdC5UKAAqHCTIJ4giPCJoIFglnCUAJ
+7AiVCA0IYAerBusFYAUNBcQEbQT5A7sDIQTRBPoEwgTeBC4FEQVxBK0D1ALZAfkAKgBJ/3r+7P2y
+/aT9f/0m/ZT8CPyf+0v7CfuG+tH5WPny+Gr4+ve/96n3y/cE+AP49Pc6+JL4hvhI+EL4V/g4+AT4
+//cg+Er4e/iY+HD4Mfh6+DX5afk0+T35Q/lf+Zf5jfl8+W35Xfmk+SL6Ufoe+hf6X/p3+kP6B/rN
++an55vmN+k370Psw/LD8Kv1m/Vn9PP1K/Wv9r/0e/nb+n/6//s/+xf7I/u7+Sv/b/3MA0wDPALsA
+GwGiAaMBVAEsAUcBiQGgAUQBfgAIAEoAigB5AEoA0v96/7D/wf85/6b+X/5Q/ov+wf6F/jH+Lv5o
+/qP+k/4x/v79U/6u/q7+kv5//jL+3P0V/rX++/7i/uT+FP+V/2sA0QA8AED/yv45/wsAZgAdAOH/
+/P8WAAsACgBXAOsAMAHNAGIAiwA9ARECIwI3AUcANADcAEQByADK/wj/4/4t/13/If+b/h/+BP5p
+/u/+E/8J/1H/sv/k/+P/xf++/6X/G/9X/uD9uv2u/ZP9Lf2F/B/8gPxb/dT9jP0k/UL9pP3d/e79
+yv1O/c/8pPyn/Hj83/s7+wn7Cfva+rT6x/rh+tn6vvqr+rP6zfrk+u/69frr+qj6a/qO+sH6nfop
++oj5I/lF+ar50flo+dL4q/gM+Vv5Qfk5+VX5d/m6+fD5Mfqp+uv6wPqa+o/6f/qm+v769/qG+n76
+LfvO+wP8JPx8/Bj9hv2h/cP97P0I/ib+Tf5Z/kH+Uf6H/sf+//7d/q/++/59//j/hgAEATYBTAGB
+AaIBggFdAWABfgGYAZ4BjgFwAV4BkwH7AVUClwKlArEC/wJbA7EDvAMbA3MCVgJsApMCzALFArUC
+5wIgA04DbQNeA0kDTQNSA1QDWAMeA5oCVALGApADCARfBBYFAQbiBsEHcwj+CIkJvQloCfsIrAhk
+CHUI4whfCe8JrAq+CxMNRQ4nD58PpQ9xDyAPuQ5PDtgNXw3kDF4MHAxfDLAMmgxwDH8MkgyXDF0M
+vAsWC60KUgoTCvcJ4AngCcwJfQlRCVYJ7ggFCEMH0waOBokGhwZNBgUG1gXYBfAF9gXoBaMFIAWq
+BCYEcgO/Ai8CxQFxATQBGwEbASMB6wBeAPD/tf9E/4n+xf02/bP8/ftU+xf7Jvsr+xj78vrM+sj6
+yPqf+lH67Pmd+ZT5ifkC+VP4Q/iI+Gz4TfiB+Ln4Dvme+Rf6XPpi+lX6qvoW++v6dfp++sj6tfqC
++nz6bPpB+kr6gfqh+sP6B/s5+137r/sc/G78s/z3/CH9TP2M/Zn9Yf08/UH9Bv3G/CD9yv1b/u7+
+jP8bAHoAqwDiACMBPAEkAfUAswBUAAUADwBTAHEAHwCE/0X/rf8gABQA7f/Y/8D/yf/Q/7b/c//+
+/pb+j/68/q3+bf5M/kL+L/4k/ir+Jf4d/lj+t/7Z/u/+Rf9v/yP/5v76/kj/rf/F/5f/jf+l/9L/
+UwDDAI0AAwC4/8v/HQB4AGcA0f80/+P+Af+J/woAKQAIAOv/+v95AEABqAFfAaQALQA5ABkAkP9o
+/5n/X/8K/wr/Cf8F/0//z/8OAPH/5f8gAEIA5P8u/6b+gf6L/o3+Xv7m/Wr9Zf29/cv9c/0G/ZX8
+V/xy/Lv88/zl/Ir8HPzj++37Evw4/Dz8DPzp+w78aPyQ/Fn87Ptw+wL7vPqt+pL6Ivqs+XP5XPl9
++Zv5YPkE+dP4xvjG+PX4LflM+Xz5kfl2+U/5Ifnm+KL4bfhW+Hj4uvjw+Cv5Kvm6+G34qPjo+M74
+xfgD+UL5bPmk+Qj6bPqC+m76ePq++iP7f/vk+0n8lvzq/D39Xv1T/T39Kf0Z/Qz9Hv1e/Yr9f/1n
+/WX9wv2S/mr/4//q/87/BADOAK0B6gGIAQMB0QALAWIBogGvAU0BjgAXAE0AzgA+AZMBlwFUAWgB
+IAIkA7oDkAMtAw4DNwNxA6EDpgMqA08C2gEHAl0CjwKqAsYC/QJxA9oD7APKA8YDNAQYBQEGkgYZ
+B/oH3AhKCXIJfQk0CagIJQjcB+QHPgjSCIkJXQojC+UL8ww/DlcP3g/CD2IP7w5zDjUOAw5uDY8M
+/wsKDDYMTQyBDIAMNgwcDCoMHQz2C6YLSQseC+YKeQpQCncKYQobCvMJwwlzCQsJsAhsCPkHaQcM
+B8wGeAZHBkQGKgYOBuwFswV2BSsFvQQoBJcDEwN8Au0BkAFwAW8BRgHiAHgAFgCK/8L+6P0c/XH8
+6Pt4+x371vrC+vD6Q/uE+3P7FPvs+kH7bfsg+7n6R/rR+Zj5i/lV+Qn52/jD+PL4Z/mm+Zr5yvlO
++rf6Cftl+4v7X/tZ+5/7svuC+0v7A/vb+gT7H/sT+xr7DvsD+zn7iPvR+zn80PxJ/V79N/0s/Wj9
+m/2c/bP92/3r/fP9Jf6G/t/+Gv9Z/6r/BACJABsBTAEhAf0A9wAJAQ8BxwCbAMUAkQAHANz/BAAs
+AB0AzP+k/87/yv+Q/3//hv9//1X/G//l/oz+P/5J/mL+R/46/lT+cf6a/s/+4v7l/vD+/v5E/83/
+IQD4/6v/hv9c/yv/Cv/1/t7+rf6i/s7+6P7m/vn+R/+x//f/DQAZACYALQBAAGQAXgAhAPH/v/9Q
+//P+J/+d/9z/6v/K/6j/3v9fAOwAagG6Aa8BggFOAeQAogCZABUAJv+V/oz+pv6i/pL+d/5M/kv+
+YP5H/gb+wP2A/U/9N/0t/RH9/PwN/RH97/zD/Hb8Gvzd+5T7ZPuC+5T7jvu3+8T7gftO+2v7pfuX
++0376Po/+nf55fhz+B74HPgh+CH4m/gy+Tb5z/hG+Kf3U/dh9z/38Paq9kP2+PXm9dn15/Uk9kj2
+NvZH9s/2hffS99r3E/ht+L/4MPm/+RX6QPph+lH6Ufqb+tH6nvpH+kL6ifqn+mr6T/rf+sr7UfxJ
+/Cr8P/xX/F78g/zj/HT9Dv5u/mb+P/48/mn+0/4m/yX/Mf99/8T/JQDBANMAOgDP/+T/YQAbAZUB
+oAGiAQkC9ALeAxsEuANJA0MDsQNzBCcFNgV4BHoDIAORA/wD4QNkA/ECFgOeA+8DFwQuBAIEsgOr
+AwsEnwRpBTsGyQZwB18ISAnmCTAKXgpWCtwJLQmfCE4IXwjKCGgJRgo3C+oLjgxrDVMORA9QEAER
+9RBUELoPVA/CDjsO9A2EDRENHQ1jDYwNhw00Dc8Mdgz+C58LogvWC+4L8gv0C98LtQusC8cLnQsc
+C4wKFAq9CXYJHgmRCA4I7gf1B+gH3AfCB5MHYgcYB5MG8wVaBcAECARoAykDBwPgAsoCrgKXAosC
+QgKYAdYAGABD/1P+TP1b/MH7UfvP+mP6IvoC+kP6pPqq+r36Dvs/+3T7tfuZ+y37ufo9+uH5uvmD
++Rr5o/gy+PT3CvhF+Hn4u/g9+fz5pvoL+137uPsE/DT8Nvwc/Aj83Pt/+y777PqU+kf6K/o5+mr6
+0/pT+9L7Zvzr/FP9ov3A/dr9CP4x/k7+S/4t/hX+Cf4i/mX+ef5c/pn+PP+s/4v/Of8M//D+Dv9Q
+/2H/bf9+/5L/yv/R/4z/Yv94/6f/vv+6/8D/u/+5/+L/+/+4/z//9/7k/sn+pf5P/uz9+f1R/pH+
+sv7p/kH/fP9p/yT/5f6i/lr+Bf6W/V39Xf0z/fT87Pw6/cv9QP5n/qf+Kv9x/1//Pf8S/8b+ff6L
+/sz+3v4D/2//jv9s/7f/OwCrAAABswDY/2P/n/81ALIAZwCO/yb/ev8WAJ8A+ADhAEAAvP/2/24A
+YgDa/y//u/6//hn/TP8O/4v+Jv4e/jT+/v2P/VD9Wv1j/VH9ff3S/c/9ff0m/ff83/y//I/8Ifyh
++0v7GvsA+9z6r/p/+jP6yfl++Zr5wfmt+Yb5/vhL+DX4dPhR+NT3Pfft9g73O/dh94n3W/fx9uH2
+P/d/91P37/aL9in26PUL9mX2mPZ89i72B/Y99s/2b/fQ9/33C/gs+Kr4Ufmn+Z35YPki+Un55Pl7
++rf60foX+3f70Psk/HT8wPwL/WH90v1D/pX+qf6L/of+jP6Z/tH+xv5b/kr+tv4I/zz/hP+5/+D/
+KwCwAG0BKQKJAqUCxwK7AnwCcwLJAhYD5AJcAhcCRQK8AngDJgRuBJUE7ARsBeUFDgbcBXkFKQUr
+BUgFUgUxBe8E0wSqBEsEKQRoBKsEugTDBCMF2QWuBqMHkQhRCd8JIwpLCnQKVArsCaIJnQmpCdcJ
+LQo3CkIKHwtZDCUNtQ0uDnkO5g54D5wPIA9cDqMNKA3fDIoMVAyADMoM5QzsDBkNTQ1JDTMNNg0v
+DRoNOQ19DZQNZg33DG4M9At8C8sK7QkvCasIbQhWCCUI6gfWB+4HCQgjCEoISAguCBEIgAeMBtAF
+OQVwBMQDcAMsA+YC0gLFAn0CNQLuAU4BiwAVAJL/rf7V/R79bvz8+6n7ZPtQ+z77IftT+7v71vu+
++8D7u/ts+/v6ovoO+i35ivhi+Fb4Ovg4+F/4mfjF+AH5b/ny+UL6WfqF+s76Bvsl+zL7HvvH+nb6
+YvpW+jT6E/oB+g76U/qO+pT6ofrB+iP7xfst/Dj8JPwp/Dn8Ivz/+w78M/xP/Lf8b/3W/fL9Ff4G
+/vv9Sv6U/pD+Wf4L/gf+Q/4c/rn9z/0z/lH+f/4I/2r/cP+L/+z/FQDD/27/UP8u//X+pf44/vD9
+Ef44/gX+rf1e/Sf9K/1e/Zj9zP3f/cL9pv2d/Zn9gv1l/W79n/3D/dX98/3o/a/9lP2i/aj9jf13
+/Yf9of2j/bT91/3x/Sn+Qv7v/Zj9l/0R/vb+v//7/+D/uP+9/zYA4ADpABUAIf+c/n/+m/7e/vD+
+fP5U/jf/jAB1AbgBdwH1ANQALgFRARUBugAmAIv/Wf92/3L/Jf+W/u79qf3a/fr99P30/Z39GP0f
+/aL91P1o/e38q/yD/LX8GP0o/ez8hvzE+xj7Zvs1/P771PoW+kv67/pB+xH7xfpm+sn5afl5+V35
+DPm/+Cz4hPdC92/3kvc999v2zPba9vr2Nvdm9zv33vbQ9gb3RveV96X3hvep9wD4avjc+D35evmT
++bv5HvqH+r762frr+s36r/rV+gj7I/sg+xf7WPvT+0D8ePyA/Ir8v/wg/Uz9Kv1m/SL+mv6W/or+
+kv6g/tv+Lf+H/wQAXgCvAD8BwAEHAkICiwLfAkQD2AOKBPkE8QTiBCIFaAWaBdIF1AW0BdQFIQZk
+BqgG1gaSBu8FrgUrBsMGxgZNBrwFZQWKBf8FXwZ0BuYFxgQ+BPYE1QXeBYwFigXXBW0GWQc4CNAI
+PAmXCQgKaAqACm8KGgqMCUcJWAl1CZkJCAriCtMLbQzrDLUNag6UDqQO/A4TD5wOCA6JDfAMQgzC
+C60L5gsADNgLqgupC4oLRwtTC2kLMgsFCx8LTgtqC4oLowt6CyYL9QrWCpAKMgrKCSsJaQjzBwYI
+LAj0B6UHfAd2B4UHQgeMBtQFVAXmBGgEuQPZAkoCFALHAYgBLAFjANf/yf+C/+D+JP47/ZL8kfx8
+/OH7TPsG++T6w/qO+kz68vmk+aX5sPmW+Z/5qPl4+Un5N/kp+SH5LPkx+Tz5Yvl0+Xf5ivmJ+Vb5
+EPkW+Vv5efln+WT5lvnL+c75yPnn+er5rvmF+XX5QPkY+Tz5evmi+cn58vnv+fr5bfr1+hH7EvtK
++4X7yvsh/FX8UPwo/Cf8ePyy/KX84/x2/aH9Y/19/fH9Ef4A/kL+if6J/oL+pf7h/gL/7v6c/lP+
+bP7O/jj/bv9F/8X+Y/5b/mz+ev6L/p7+tv7a/sr+ZP4O/t79gv0H/dL88PwY/Tb9V/2X/dr90P2V
+/Zz9H/6O/kz+2v0d/hL/n/9E/77+Zf4z/n3+E/9E/+L+UP7V/aH93v1g/sD+vf6e/gz/LQA4AX4B
+NgGoAPX/eP9h/1z/G//c/rT+jf6w/iX/dv9X/+/+ov64/gP/Ev/u/tX+xf7K/vD+HP8+/zD/1/5s
+/jf+IP4A/v79Af65/VX9Kf0a/ST9QP0T/cL8uvzE/Nj8IP38/Fb8xftm+2/7tvuH+w/72vrp+jX7
+lPun+zX7pPpT+g762fm0+X/5RfkC+er4O/mj+br5efkT+eP4Iflg+U75UPla+TD5Evnu+Nf4FPkl
++dP4pfjh+F75zPkQ+kf6hPq9+vn6MftQ+377ufvR++v7TvzD/OP81PwA/U39cv2N/aD9av0Z/Rv9
+Zv2j/fL9Yv6Y/sL+Cf8l/23/8/8+AJYA/QDwAMAABwGfAf4BJQJaAp4CCAPKA74ERQU5BT8FlAXu
+BTIGQwYCBqwFdQVLBV8FuQXHBXUFYQWaBcYF8wU1BmAGNgYABhYGCQaOBQEFnwREBPYD/wNTBLwE
+GgVaBc0FkwZIB+AHqgiqCUAKWgrLCkALBguTChkKjwlOCU8JgAnwCVIKhAoMCy4MQQ3fDWIO6A4R
+D70ONg6xDSQNqQxHDLkLJgvmCr4KvgokC1kLMwtWC9ELKAwbDLwLYQs/C/4KoQpzCk0K8wmICS4J
+0QiLCGUIGAiABxMHAgfjBrkGkgZUBiQGEAbhBYYFDAV0BAgE3wOgAxYDJAIYAaEAlQBcAO3/bv8U
+/9j+TP5//ef8evzp+1/7S/uJ+2f7vPo9+mT6n/p/+lL6Ifra+cj5vfl1+S751/hn+Cn4Bfj/9xT4
+/ffR9873//cy+Db4SPiJ+KP4nvi6+N34FPk8+SD5APkX+Un5Svkc+Rr5RflB+QP57fgt+Wf5UPlU
++bH53PnE+dH5IfqP+tD63foS+2b7ZPtV+7L7Hfw2/C78U/yk/N/88fwQ/TP9Pf1+/QD+j/4C/yX/
+Jf9O/5X/z//1/wAACQAXAPb/s/+K/4X/ff9s/2T/T/88/0L/MP/t/rz+yf7b/s7+wf7O/tL+pP5i
+/if+9/34/Rz+I/7o/cr9Cv43/mv+1f4A/w7/U/+J/5L/xP8HAAMA0f99/+/+tf4x/7r//P8cAAIA
+6f8nALoAUgFcAeQAYAACAP7/9v+D//X+uP7H/t/+Bf8s/zP/V/98/0T/+f70/vH+xf6V/nX+kf7m
+/lf/q/9u//L+2P7b/rH+Xv7H/UP9N/1K/Wf9tP2m/V39ev2t/af9mv1Y/aT8GPwV/C38KPzv+5T7
+lPu4+2D7DftO+6T7kPtB+0D7bPtL+zL7Y/ug+9n7APzZ+6X7uvvB+3L7C/vF+nj6DPq5+Y35dvlh
++Sj5BflP+fT5rfr2+qX6Wfp6+pv6efpv+qn63/rt+gz7Tft8+4P7bft6++n7YvyG/HX8Sfxb/AL9
+lP2g/ab94v0w/oT+1f4G/wP/0f6k/sv+Nv+t/xkAUgByALEADAE1AdoAXwBgALYA9wBNAdgBSQJu
+AmwC2AL1A/wELwXrBNsEQAUBBpcGmgYjBnQF3wS/BAgFPQUJBZsEcgSyBCUFnQXfBeIF7AUOBhsG
+HgYlBkIGgQaXBmwGDgZ8BUEFuAUWBhoGjgZdBw4IoAjPCKgIlwimCNsINwlGCeEIrwgVCYsJrAnC
+CcgJ0AlhCpkL4AyUDboNnQ2CDWgNDQ1wDL8LHwulCnAKZwpRClsKjgqHCkUKGgoQCvcJywmvCawJ
+vwnRCdIJ2AnXCcAJnglACaEIEgi0B1sH7QZcBp4FAwW6BJUEOASzA6YD2QOqA2wDYQMwA+UCsgJ1
+AvYBCQEPAJL/Ov+g/gP+lP0l/bL8bvxk/FP8EfzY++L71fty+yP7APv4+h77GvvZ+pn6Mfql+S75
+p/ge+OX33Pfq9x34RPhl+KX46Pgf+Wv5kPlb+SX5DvnY+I74Ufgr+DD4QfhD+H34+fg0+RH5O/nO
++RP68vnf+eH5w/mY+YH5X/k2+Un5nfkK+nH6o/q++g77dvu3+xb8zfwp/bT8Rfyp/Fj9s/3T/Yn9
+Kf1k/db9LP6Z/vv+Iv8j/0b/w/9XAJkAXwDc/77/KQBVAPH/lf+H/3n/Wv8w/+7+t/63/tz+Hf90
+/4v/LP/W/vr+I//w/sD+tP6J/pX+A/9Y/5P/0f/q/x0AjwDNAMoAvACWAHoAggB5AE0AZQD5AHsB
+rQHNAc4BnAF4AZUBmQFJAeAAeAA9AEgAMwCr/zD/R/92/1r/Hf/q/g//c/9z//v+l/6f/tD+xf6i
+/qH+nf6i/sH+q/5l/j7+PP4o/gX+CP4//mb+VP5M/lb+Kv4U/jH+wv0T/fP83Px0/AT8qPuh++b7
+8fvv+yT8Hfzt+/L78Puz+4D7SPvK+kn6Fvoh+i36RfqI+vn6cful+7H7xfvZ+9v7nvs6+wz78PqZ
++lv6ivq8+ov6bPqm+tX6BftU+2H7FvsG+4P79fvr+7j70PsR/Bf88/vx+w38I/wd/P379vv1++f7
+JvyW/ND88fwj/Uj9jv0b/pn+zf7O/tj+M/+v/6v/Rf89/2P/Iv/x/mH/+v9BAHwA4ABHAasBBwJL
+AooC5wI/Az0DJQNRA4kDogOfA6QD3gP3A8gD0AMmBGIEcQSbBNgE5wTxBB8FRAU8BSYFHgUCBd4E
+1ASkBFAEQwSDBMcE4gTQBAkFpwW9BTwFBAUVBQcF5QTmBD4FvAUeBpoGOAeqB+4HIQhDCGgIaghc
+CJQI4AgxCboJNgpvCqgKIgu0CwUMHgz3C30LIQvpCn8K/wmvCaoJqQl/CX0JngmLCWEJYAlhCUEJ
+CgnCCKAIjghJCOMHZQf+BvEG9wbBBngGKwbqBd8FxAVuBegEKgS0A+cDDgSaAwYDnQJIAlUCgAIq
+Ar8BawEBAfEADgGlAN//af9P/xv/jP7P/UH9y/xL/Pv71vua+0P79PrL+tr68voF+xb75/q4+vP6
+GvvK+nL6MfrH+V75KvkV+QH58/j++Pz4yfiR+I34w/gU+Wv5vvkA+i76I/rX+Yf5UPk5+WT5u/n2
++Tf6ivqQ+nf6kvqY+lz6MfpE+pn68Prx+ur6Oft0+2/7qPv6++j7zvsd/If8oPy7/Er90f3W/bn9
+w/3i/RL+Rv5t/rP+GP9X/3X/df9G/yb/XP+X/5T/wv9QAMUA1QDAAMwA6wD9AP4AFgFtAecBVgKX
+ApcCdwI/AtoBhQGZAbcBTQGmABIAtf8MAN8AMgHUAH0AjwA1AWYCawPHA5AD3gJrAsYCDgNvAmgB
+twB5AIEAjwBnAPb/k/+v/z0AzQArAWQBegGaAa8BlQGgAY4B3QAOAKv/dv9B/wn/y/6P/l/+UP5x
+/sP+KP9Q/zL/Ef/t/tf+7f7i/qH+W/4T/vj9Jf5e/m/+Tf7V/Sj9Gv2x/cD9FP1w/OX7jPug+7L7
+nPt/+0f7N/ul+xX8GfwL/A387vvM+8D7nvtl+zL7zfo0+vj5H/o6+lj6efpi+lT6q/oQ+yL7Mftm
++3j7bft3+3P7Xfto+2n7QPsf+zH7bft/+yz71PrV+vf6+Pr2+hf7VvuO+6r72/sh/Df8PfxS/Fb8
+bvyB/HL8j/y9/M78v/yW/M/8g/0b/k3+Sv5K/l3+df6K/qX+9f5v/5X/gf/k/5gA0gCZALUAUgHY
+ARUCPQI6AhQCGwJLAnUCpALOAtkC7gIzA3oDjwOVA8EDGARMBDAEFgQ0BE0EMgT/A+MD6wMDBDoE
+igTCBOEE/gQzBWgFbgVkBToF9AQsBcYF7wW9BXIFHAVNBe8FZAarBtYGzgbRBhAHOgc9B24HswfB
+B7MHxQfvBw0IIwhoCLgI1gjzCCwJZAl2CVwJTglWCTQJxQhoCGcIaghWCFkIQAgACNwH3wflB9IH
+qwd/Bz0H2waLBnEGXQZKBjUG+QXGBbwFqwV+BSUFwQSBBFIEHQSaA7ACCQL+AfQBkgEcAb4AoADA
+ANQAtwCGAFsAagCMADcAof9f/1T/+P5N/tv9sP1N/Z/8Gvze+7j7nPuI+1T7Dvsj+6L78vv2+xH8
+Gvzn+7z7qPuQ+1v77PpZ+gH6Dfoq+iD69vkB+n363vrU+un6SPt9+1b7I/sl+177Zfv0+pf6pfq1
++sr6BPvo+qb63Po5+0D7Nvtw+9f7Lfw7/Ez8vPwB/b/8gfyP/JP8Yfxr/NL8R/3b/ZD+D/8k/yH/
+i/9IAKEAagAwACYAQgBYAC8A+v/S/8n/JwDZAHwBugGcAXgBfAGAAWQBKQHhAMcA4gD+AAAB7gDT
+AOYAFgEhATUBjAHiAfkBPQLxAlwDSwNhA1wD4gKEAksC3QGGAToBtABwAMEASQHJARoCBALMAc0B
+2AG3AZcBlwFYAa0AHQAHAPH/cf/5/uz+LP+S/9z/vf9x/13/Y/9N/y7/B//v/vD+zP5U/uX94v3n
+/cX95/0E/rn9nP3i/R/+F/7k/cv9zf3f/dX9Y/3Y/JP8lPzG/Pn8+Pyu/GP8Tvw2/Ar89Pv0++77
+6vvy+wH8C/zU+1j7+vrC+lP66fn/+Sv6Bfr9+S36GPrx+WH6IPt4+4H7k/uc+7D7x/uS+y/79voD
++zX7Ufto+5776vsh/C/8SfxZ/Ef8Zvy7/Ov84fzR/ML8jfxO/DL8Gvwd/EX8SPwX/An8S/yJ/J/8
+tvzF/Mf81fzz/Az95/yX/LD8GP01/S39Rv2b/e798f0j/q3+GP94/+r/SQBiADYAMABfAIIAxwBY
+Ac0BtQEtAdEA9AA7AUoBUgGtATsCgAKDAqoCwgK6AtMC9gIuA5MD4wPtA7MDVgMOA+8C0AKWAoMC
+swLoAgUDGANPA8kDOQRmBJQE7wRWBZ0F4QUrBhUGwAW9Bd8FBAZKBmEGNQYMBiMGmAYBB/8G8QYp
+B4UHtwe2B8gH7wcECP0H3wfaBxIIWghVCO4HjgdzB3QHiAe4B8YHyAcFCPsHgQddB3oHVQcxBy4H
+GQcKB9oGaQYGBq8FTAUYBQ0F9gTeBNQEoQQ6BP4DzgOIA4QDbQMTA+0CrAIaAtkB8gHsAZUB+QCW
+AK4AlwDs/17/Zf+l/+L/5P+S/zz/GP8U/9j+af5M/nT+af44/h/+8v2N/Tz9If0A/e788/zO/IL8
+NfwU/Bj86vuq+8f7RPye/Iv8Xvw8/Az82Puv+5f7lPu5+/X7GPw+/IT8svyw/NL8Tv21/af9eP14
+/Wb9Rv13/ZH9Tf1Q/ab9u/2s/e/9af60/q7+o/65/qP+bf5b/ln+UP41/k/+2f4c/8H+lv7t/kz/
+k//I/8z/4v89AIgAswDsAPkArgB8AMUALgFlAWMBCwGhALwAXQHOAcIBqwG4AfwBdgKwAogCXwIt
+AvAB4wH9AfkBggHPAF4AOAArADIASAAxAOv//P9jAGcAMQAtABMA5P/t/w0A/f+o/zn/Gv89/xn/
+m/5P/nL+i/5Q/gn+Ev5R/o3+w/7g/gD/Kf8j/wr/6v6l/mL+S/5Q/kL+I/4e/ij+H/4h/j7+Y/5f
+/j7+N/49/kj+Rf4h/g3+BP7b/X79A/2s/HL8Lvzi+7z73/sP/CL8Bvyz+237hPuq+3z7Nvv9+sz6
+ufp++g762PnI+a356/l3+tP6MvvC+xD8A/zk++T7/vvw+9D7+fsu/C78N/xC/A/8tPud++P7P/yn
+/PT8EP0g/Rj9IP0u/ff8yfzp/BD9Cv33/O/87vzz/OT8v/y9/NL84PwM/Vn9i/2A/Wr9m/3x/Rr+
+K/5b/of+Wf5U/vP+cf+X/8H/2f/2/zUAVgBLAGsAqwDVAPYA9ADAAHAALQAmAE8AbQBiACsA8f8e
+AMMAagHTAe0B+wFQAoICdwKcAs4C2wLTAsUC6AJSA8MD+AP0A7UDcAOPAwgElAT1BAoFAAX5BP8E
+EAURBQgFDAUQBQIF+gQYBToFOgVDBUkF/QThBHoF9wW5BWEFRAVBBYMF1wXhBbwFlgWdBfMFNQbk
+BXsFwQVfBqMGtQb/BiAHvAZjBkQG9QVqBQYF/AQTBSoFDwXmBAAFCQXuBPAE4gS3BMAE9QTqBJIE
+TQQ/BBgEtQNPAwgDEgNwA68D0wMQBAYEqwNaAzQDBwOiAjoCywFIAfQAwgCRAEYA1P+m/+L/BAD0
+/wYAJQA6AGMAYAAoAPL/j/8S/9v+x/5p/u79tv2K/UT9N/1r/Yv9t/0q/q7+Ef83/zf/Lv8G/8T+
+cP47/j3+Ev6s/XL9fP15/WP9af2O/b39/v1O/pH+2f4k/1b/Sv/1/sz+B/8q/+7+nf5R/gD+8P0l
+/lL+V/47/jb+mf4u/1//Kf8c/0r/XP9y/6T/wv/R/8f/r//G//D/5//R/9b/w/+l/+H/YQC2ALIA
+jACSAN4ARgGIAWIB6wCUAHMAagBbAA4Ajv9B/1z/oP/S/9X/wP/G//D/LQBlAGQARgAkALr/VP90
+/5b/QP/j/s3+1P7k/tD+jv5v/oz+x/7+/gX/5P6Z/jP+AP71/dn9df3i/Mr8FP0d/QX9+/zQ/Lf8
+4PzW/I78jvzI/OL89fwW/Sr9Cf33/FT9mv1O/Rb9Kf0O/ez88Pze/LH8uPwM/VH9Qv0e/SX9Q/1T
+/Sn9yPyA/GL8aPx4/Ev8CPz5+wX8G/xJ/FD8Jfws/Gn8aPxI/Gn8VPz6+9/75fv6+yb8Hfzy+//7
+HPwI/Pr7Afz3++T73PsA/Er8Vvwk/Cv8Xfx7/IP8gfx+/IX8nfy//O38K/1l/Wv9L/35/Bj9Vv1t
+/Zf9xf20/Z/9s/3J/eH9KP6E/qD+fv6O/gb/p/8NAAAAtv+A/3D/iP+l/6L/rf8AAGQAfgBMACkA
+UgCKAI8AeAAuAMT/xP8mAFUAMgDv/8b/DACAAMQABwFNAVgBYAG/AQAC6gESAlYCKQLRAcMB8AEJ
+AhQCKgIlAhMCPwKLAswCIANLA2UDxwMVBA4EBQQ0BGQEbQROBAsE4APNA7QDrgPFA+wDDAQsBJEE
+JgWQBeUFJAYqBlQGpgaJBhYG/wVEBlEGDwagBQcFvgQUBXYFZwVFBUcFUwWVBd4FEwZTBkIGzgVd
+BQcFyQTABKMEBARWAzcDhwPMA74DqwPtA2UE1AT2BKgEIAS+A6gDhgMYA48CGgLKAbMBxAHnAfsB
+6gHdAQQCKAL+AZsBTQEzASAB3wB4ABgAyv+m/8X/+f8MABwAVgCWALcA6AATAbAAAgD//2MARACy
+/yD/xf6d/pL+mf6S/kT+5f33/Uj+Uf5I/ob+wf6//sn+BP8K/8n+v/7T/pT+K/7i/aL9gv2z/f79
+GP47/pj+7P4s/37/xf8EAGMAowCeAKoA1ADdANsAAgEVAcMAWABUAI8A4wBbAaYBuQG7AasBgwE5
+AfQAwAB+AGQAcQBxAKMA5gC6AGgAUABjAMYARAFtAXABfwFlASwB7QB+AN7/Zf9R/2b/U/8f/+f+
+x/7q/kP/e/9k/z3/N/9N/4X/sf+r/6T/of9x/zv/LP8L/8P+jv5t/jD+7/3h/SH+X/5K/hj++/3k
+/df90/3M/bv9k/1//Z79yf3K/Xb9GP38/P788fze/OD8ufx2/JL88PwV/QP9zfyR/M/8Rf0n/cj8
+vfzW/O/8/Pzl/Mr8zPzm/PL8+vwW/QL9ofx4/KP8q/x//E38Kfwk/D/8U/xM/HT8sPyv/K38+PxM
+/U39Q/1T/Tz9OP11/aj9mP1u/Yz9tv2e/Yr9iv2R/bb92P3f/dL9pf1U/S79Wf2Q/Z/9kf22/fb9
+xf1H/fv84/z4/B/9+vyu/Ln86Pz6/Bf9BP3S/O78GP0d/VP9vf3Y/XL9Nf2Z/Q3+Ov5S/if+6/0k
+/pL+sP6R/qP+5f4X/zD/VP+h/8j/i/9l/7b/8v/C/8P/KgBwAJEAzgDmAKoAegB/AGYASwB8AIcA
+KAAUAHoAuQCtALkAzQDaAEIB0wElAi8C4AF1AWkBkAGQAZEBgAFuAaEB5gH5AfEBBQIlAkMCngJQ
+A+8DzQMrAw8DYQN1A4gDyQPfA+ID9gP8A+4DzwPFA+QDCwQhBC0EJATwA6UDeQOYA9QD9APqA7gD
+rQPbA9UDlwOCA6EDvAO4A7YDxAOjA1UDKANLA6EDtQOfA78D0QOvA4kDQQPqAtoC2ALQAusC7wLY
+AtACrgJ5AqMC+gLzAqcCPwK1AUsBGQEJATYBXQFLAUsBmgEcAmoCUAIEAsMBxAH2AR8CMAImAggC
+9AH+ASECMAIqAikCKQJAAmECXgJGAkkCaAJfAjACMQJAAg0CqgFWAS0BFAEAAf4A4wBtABAAVQCg
+AGsAMwA2ACoAEgAdAFEAiQCZAJkAvwDWAIEAHQA5AIwAvQDHALYAxQDaAO4APQFWAR4BLAF2AZ4B
+jwE+AfYA/wAeASMBIwERAfIAIwF+AWIB9QDVABQBLAHzAM4A9wAjAeMAbQA7AEgAXQB3AI8AYQAM
+APP/xv9b/xP/7v61/n7+uv5U/5b/hP9g//z+av4h/ij+Ff7J/XL9dP3I/ef98v1I/qD+of58/qT+
+8v7m/qD+d/5S/g3+r/0i/Yz8Nvwg/A/8Evxl/Jv8fPxr/IT8xfzt/Kn8Zvxy/JD8pPyK/Ev8Hvzr
++577ZPtw+6n7wPu5+9P7DPwW/N/7uvu3+6P7mPuu+7z7rvvJ+/X7vfuG+7777/sU/F78avxf/Jr8
+4fwI/Rz9MP1T/Yv9u/20/ZT9dv0W/YT8ZvzO/Br9Q/2i/QP+K/5e/p3+lP5p/nX+rv7D/ob+G/6t
+/VT9LP0R/dz8u/zw/HX9xv2m/bf9Kf6s/gj/Kf83/zH/Mv90/6//nP93/4D/o/+7/+r/AQCM/wf/
+K/+C/1z/Gf8e/yz/Dv/J/nX+Rv5s/sT+EP89/0b/V/+D/3z/Qf81/x7/vf6r/kz/GgBwAFwATQBk
+AKAA0wC1AHUAcwCpAOQAMwGJAaEBgQFgAUkBLwEsAU0BdgG/ATACfQKxAtwCzQKiAnoCWAI8AhcC
+/gHxAdEBrwG4AdIBqAFhAVABQgEZAUgB7QF/ArsCwQKmApYClwKDAlkCEQK+AZwBnQGiAZ0BgQFj
+AV8BggHhATQCNQJcAscCCgMVAxEDNANwA3sDQwPjAqkCqgKUAl0CMAIaAj4CkQLJAtoCygKiAqIC
+wgLyAiIDGwMDAwEDCgMgAzoD4gIrAgQCTQIvAv0BTAJ0AvkB0QFHAk4C3QGUAVoBPQFsAZgBrwHK
+AbMBgAGTAaoBgAF3AXQBHQHJAOQAKgENAb4AqwClAIMAiQCoAKAAowCrAK8ADgGqAfIB4QHDAa0B
+vAH9AS4C+wGYAZ0B/wElAugBjgFsAZMBwAHIAbIBpQGpAaQBswHZAboBTQECATYBrgHzAegBiwEj
+ASYBcgGKAVUB4gB+AK0ABwH/AOkA9wAOAR8BCgG1AHQAhQB+AEoAWwCxAMIAawAtAF8AqwCmAH8A
+nADSAMMAiQB2AGoAFAC5/5z/d/82/yH/If/y/s7+1f7H/qf+pf7B/t/+3v6w/n7+Y/47/gr+A/4R
+/vP9sv2p/Qr+U/4m/u393P2t/Xf9VP0q/RP98fy0/MP8Cf0R/RP9Nf0A/cb88vwW/RD9E/0F/eH8
+x/y7/KP8Zfw3/GT8oPyl/LP86Pwl/VX9Zf1p/Y39s/2s/Z79m/2G/Wj9Vv1s/ab90/38/ST+Nv5Z
+/n3+bP5N/lf+YP5G/kb+fP6X/nP+UP5H/j/+Pv5e/oP+M/6V/Yr99P0Q/gL+MP5O/jD+M/47/iL+
+PP5W/j/+U/57/mD+OP4v/jT+Qf5I/iX+2/3V/U/+0f7P/qT+3v5D/2L/Hf/N/uL+E//p/qf+t/4G
+/yb/6P7a/hz/Bv/G/g7/tP8qAF0AjgDOAM8AlQCSAKAAQwDh/+j/BwAdADMAMAApADkASQD6/3f/
+q/9kAJwAUwD+/77/n/90/0L/Uv+b/+z/PQBoAGMAkADwAP4ArgB+ANEAZwGLAWkBlAHBAaYBdQE8
+AeAAlgCKAJQAsgDXAOEA9gAyAU0BHQHmANEAwgCtALAAywDTALAAkgC2APIA3QCpAMcAGwFuAagB
+xwGhAU0BSAF9AX4BVAFEATYBJAFIAY8BkgFFARMBCgERAVgBrgHPAdUBzwHXAe8BvAFgAVEBcAGE
+AXABLwH0AIUA+v8LAIEAwQDzAEABeAGiAbkBqgGqAZcBTQEWAQYB9wDWAKsAhgBaACYAFQBLAKQA
+8AATARABDgEfATEBLAEcASwBPwErAQcB4gCvAHoAiQDzAEUBOAEcATcBhgHLAcwBeAH0AK0ArwC4
+AK0AoACqAMAAAgFJASQBzwDaACgBQwEZAegA2gD3ACIBRQFYATIBCgENARUBSgGjAbYBiQF1AXMB
+QQHNAHgApAD9APIApgCZAOQALQEuAfEAyADnABcBQwGNAeIB8gHJAbQBpwF5ATEBEQEwAUEBHwEH
+ARUBDwHfANoAEQEvATsBRAEdAfEA7ADaAKUAdQBaAFcAeQB0AAUAkv9H/w7/Gv9k/5z/m/+e//r/
+bwCRAHIAbgCkAN0AygBnAAIAsv9s/2z/nv+b/17/Q/9M/y3/B/8y/6D/4v+8/6D/5/8cAPT/vv+p
+/37/Mf/u/t/+7f69/mr+eP7F/rj+l/4S/5P/TP/o/t7+sv6N/rT+w/6c/mX+Qv5X/ln+Df7P/d/9
+5/3R/eH9/v0a/jv+Nf4F/u/9EP45/jz+J/4h/jD+Pv47/jX+Jf4f/lb+lv6v/rj+lf5c/kX+av7D
+/vP+4f7d/vL+2v6g/n3+ZP5B/jv+ZP5t/j/+Qf5l/jn+DP5G/nP+Q/4p/pn+HP8l/xL/6/6G/m7+
+pv6y/pn+pv7K/uH+C/8m/yD//P6o/mX+jP4E/0f/LP/4/tb+y/7W/ub+4f7Q/tj+3/7A/rD+zv7+
+/kX/of/W/+v/CgAbANP/WP8t/zz/W/+F/3v/Tf8i/wn/MP+U/9n/zv/C/93/0/+w/7D/mv+N/9b/
+7//N/xoAcwAeAJ7/ef9x/3D/iP+O/4r/m/+w/77/wf+2/8z/+P/t//X/PQArAKn/R/87/23/kf+C
+/5j/xv/I/7z/vP/W//b/BgAYABsAHwBBAFwATABOAJgA1gDFAKUAvwDuAP4A9wDlAO4A7ADKANYA
+4wCwAIUAVwALACIAhgDDAPIAFgH+AL0ApACXAHIAcABPAPb/0f/4/0EAagBjAGAAjQDgAPQA1gAC
+AUUBMQEVAUMBPgHaAJkAmgCjALsA5QD1AP8AEAHxANoAAAEfATsBlQHKAXMBRAF7AWIBJgErATEB
+LQE+ASwB4ADIACQBagFUAUwBaAGKAaUBiwE1AQIBPgGhAeUBAQLIAVQBKQEuAdkAZAA7AEsAogAf
+AVYBXAFFARMBCwHrAJcAjQC/AMYAqwCiAMQACQEhAf4ABgFXAZ4B2AEdAjsCJQICAv8BJQJWAnoC
+fAJgAnQCzwLxAqQCLALGAZcBfgFCAeYAmAB8AIEAdgBxAJsAxwC/ALMA7QAwAT4BXwGQAXUBWQGW
+AYABuAAYAD0AigByAGIAjwCoAMcA+QABAQEBIwE/AUUBOwEuASgBOAFeAW4BbQFcARcB4gC9AH0A
+XABKAPj/pP+s/7X/cP9R/5//zv+g/4//j/9q/1b/bf+h/93/OgClAMYAogB7AFwAKQD9//3/IABO
+AGwAWwAsAAcAy/9g/yL/TP+j/97/5/+z/4L/sf+s/yb/2P7p/h7/Yf9X///+pP5B/uD9o/1u/Uv9
+T/1a/Tf99fzf/NL8fPxT/Lv8Rf1x/Wn9nP3U/en9FP4z/i/+LP47/kX+Uf5l/l/+df6y/qX+cf5m
+/k7+I/4p/kf+XP54/qP+3f4c/zr/Iv/0/tn+1f7C/pf+dv5S/iD+8f2r/W39U/0V/f78VP1+/WP9
+Yv1a/Vz9k/3O/fT98/0J/lb+jP6Y/oH+Uv4h/v/9EP5m/rf+qv6L/tP+Mv9P/2b/ef9v/3b/kP+o
+/5r/Tv/1/qb+g/6S/rD+3P7o/tH+4f4a/2b/oP+S/4z/wP/k/9n/r/+E/37/hf9s/1b/af+G/7X/
+EwBkAGwAdwDjAEoBKQHcAJcAFwDA/7L/YP/5/u/+Mf+g/+7/5v/c/xMAUgBTAGcArACtAHcAdwCI
+AIsArACnAGkAUwB3AKsA0gD8AD0BdAGjAewBMQI/AvoBnQFcAToBPQFNATUB7QC4AKMAjgCIAJgA
+mAB/AGkAYABTAFcAPgF2A4EFLAYCBkYFuAPeAZYADQDd/+j/ewBhASsChAIRAvkAzv8I/+v+fP8l
+AEwAbQDKAJsA8f9y/97+0/3q/Mf8Jf1//df9Uf6R/qT+//5c/3D/W/9E/4z/TwAXAawBBgIAAsIB
+cQE1AVkB2AFTAokChgKMAqoCmAIiAo4BWwFaAR0B0ACgAIcAlQCvAMIAlQBRAI4AzQC0AMYA1wDL
+AO4ACwH6AOAAsgCSAKUAbADN/4T/t//1/yAAZgDgAFQBiwG9AfMB/wEFAgoC9wEIAkgCUwLwAY4B
+rwHOAZYBjAG4AbgBPQFzABkAZgDVAPIA5AAYAW4BjgFvAUgBRQFGAS0BLgFoAaEBcwHhAI8AnQB8
+ADwAJQD5/8X/2//7/+r/3v/a/6z/ff+V/9L/2/+L/z7/j/8FALH/Dv8K/0v/GP+x/oP+Nf78/YD+
+Lv9Y/xj/2f4R/4r/vv+k/37/uP85AGIASgBSAEUADgDb/7//yv/W/8r/wv+6/9D/DQAgAP7/3v/U
+/+D/3/+d/zD/y/6O/qb+Df83/7j+Bf6z/cj9Pf7E/r/+Z/5r/qr+uf6G/iv+9f3t/c/9y/0S/hb+
+tP2w/SH+bv57/pn+7f5L/5D/w//t/wQAGAAoAP//Z/+k/iH+E/5Z/oj+bv5d/qz+I/9G/9T+F/7J
+/Tj+Ev+m/3f/5f6K/mX+KP7a/br9wf2//f/9xP5e/yj/e/7q/cL99v0h/jL+Lf4i/mP+mP4p/qj9
+1v1M/rT+Pf+//xgACwBn/6/+fP68/hv/cf+5/93/qv8m/2n+cP3I/Aj9zP1z/v/+jv/d/8T/V///
+/i3/r/8YADsAHADi/4z/Pv85/0H/HP8C/xL/Xf/t/5oADAEWAR0BgAENAm0CcQIVArwBrwGJATYB
+WgEBAl4CDwKAAUQBUgE+AUsBfwE+AfYAZQEFAkAC8wHaAID//f5I/9z/1gC4AccBlQHBAdYBMAES
+AIP/AQAKAQ0CwwLMAj0ChAH/AMcAhwBDAEMAtQCUAWcCxgJnAmsBlgBJAEAAVgC3AGUBIgJ0AiAC
+ewEnAVMBegFqAWYBawFqAXEBgQGUAXwBCQFbAKD/Bf8G/+L/vgCvAFsAigAKAZcBjQGLALv/KwCA
+AaMCZgLcAIj/df/8/7j/rv4s/uL+bAAnAk8DEgPHAewADAGKAeIB5AHIAa0BVwHxAOQA/gDWAE0A
+tv9//4//sf/7/00ASAAXAFcA9QAzAcEAOwAgAOT/MP8F/wEAFgEzAZAA7P/J/9P/Y//D/l3+Vv5s
+/38B0wJeAsQAU//v/j7/OP/a/vH+1/8jAegBgAFQABr/O/4P/qz+af/c/1gANAEWAj8CTwGc/0b+
+H/6t/i7/h/8pAIwBLwOuAzsChv9g/TT9q/6cAJECGgQkBMUCYgF/AJX/r/5A/o3+EADIAiEF5AQF
+Atn+av3x/QD/PP/W/ij/vwASAoUBsv8P/lv9p/1d/u3+ev/1/x4AGADF//j+Dv6r/d39EP5J/gL/
+9P+OAJ4AGwB0/x7/7v6k/sv+2v+1AE4AQv+h/r7+Fv8a/9X+b/4r/qb+zv8HAa8BKwHi//X+1v7m
+/r3+pv7X/jX/cf84/7/+zP69/4oA6/9T/j39T/1F/if/9v4k/v79gf6D/u39IP7D/+oBlwP5A7MC
+1QCJ/9r+Qv6k/cj9KP89AbkCMwIEAEL+Tf5I/4b/B/8K/xsAZwGqAYEAp/5Z/UP92/0j/sH9O/04
+/Zv9y/2D/d78QPwX/E/8kfy5/Pf8ov2e/l7/s/+Y/9X+yP0o/fL89PwW/hIBzAP6Agn/1vt9+6n8
+ev2G/Wb9/v1s//sA5QF1Adf/a/6o/jQADAGfACEASwDcAOkArf/k/Rz9yv0i/xUAHgC7/7f/pQBE
+AgkDEwKdAGEAowEUA0cDMgIuAXMByQLKA0kD+gGEARQCqQJiAlEB4AD3AVcDXANjAgMCpQJUAwED
+bgF0/9/+swCEAzgFyQRxAt//1v4y/6D/af82/2sA/QLtBHsE5QH0/n799f37/pn/SwBXAU4CoALX
+ATYAvf6D/uf/+QGYA1sEOQRTA64BUP9a/WX9Nv8aAQ4CKgLYAU0BkAB1/yP+1/2A//4BRANZAgQA
++P1O/d/93/6//2IA1QAYASUBAQGHALH/AP8S/+D/8QANAqgCswF9//f94P1K/ub+8/9FAW8C0gI7
+AiMB8v/u/hD/pAAWAkMCCwJ/AtACqgFi/1z9ufzJ/c//rgE8A24EaQT8Au0A+f75/Zb+MACqAaQC
++gJyAiMBff8t/qj9Cf4W/2IAxwGqAiQChQAo//P+bv/H/+///v9FAOEA0ACe/1f+Nf4h//X/4f8E
+/4L+Kf8ZAA8A5f6I/WH9zP5eAKQAlf9o/kH+9f5X/6/+0f3q/aX+uf7I/R79ov1+/s7+pP5H/gj+
+Af78/TT+8v7t/2wASwA1ADUA+f+r/2X/Pv9M/3n/x//c/2X/sP5R/n7+8/5l/63/yf/8/3EAxwDI
+AMMAzgDbAAMBBwGOAMb/8P4+/jz+4P5P/2n/b/9L//7+jv4f/h7+Zv6B/tf+uf9fABgAQ/+e/lb+
+WP6B/pL+q/5C/zwAywB/AKT/zP57/qn+0v7m/kL/nP99/y7/+v6n/kf+NP54/gX/r/8fADgA7/96
+/1//fP9c/xf/6v64/ij+Yv36/Af9Pv2O/TH+F/+c/0n/z/78/kL/V//B/x8AGAA9AJoAqwAbAA7/
+cP6k/gX/Lf8r/wX/vf6Q/p7+jP47/l7+Zv+BANYAhwDg/07/7/5r/gb+PP7N/lP/+v+KAGAA5v/c
+/wsARwCzAPUAzwC1APAAEgHOAGIACwD9/0EAzABoAaMBXwHVAGsAaAC2APwA9QDQAMEAqgCbALAA
+lwA3AAAAFABIAL0ATwF6ATkB/ADuAPUA4ACvALEA6QAGAecA0wANAS8B7QC7ANoAFwFoAa0BgAH5
+AMoAIAFwAZUBywEHAiQCDgLhAZ8BQgEYATQBVAFKAQYBpQCDALYAvAB9AIAA1QAaAVEBowHnAQsC
+EgL+AfkBAAITAiUC9QHeAd8BewENARIBLAH6AL8AeAA0AE4AeQCUAO0ANwEnAQMBCAFDAZMBvQF2
+AeEAxABJAaEBUgHaAJ0AlgC0AKgAWAAGAPD/MgC7AFIB0QEyAmgCSQLmAaEBjQFaASUBIAEiATAB
+DwGPACQAEgD8/6//lf/X/wkAGwA9AFMAgQDrACgBDQHPAFkAxf+Y/9L/0/9j/9P+gf6i/u7+2P52
+/j/+aP4D/8//PwBtAKsAnAAKAJH/r//D/1X/Mv+Z/93/zf+9/9H/xf+P/5j/x/+w/2b/Df/Q/uT+
+OP+f/9r/zf+i/5T/lv+U/6T/1/8iAFMAZQBpAD8A+v+q/3T/i/+U/yv/ov5c/kL+/v1v/TD92/3s
+/qf/AQDi/zn/uP6v/q7+lf5L/tb90/1O/mX+//2r/WL9Lv1w/Rf+uP4C//z+D/9g/8f/NgCYAOIA
+8wDHAL0A3gDAAGEA7/9X/+X+tf5f/gT+9v0s/q7+Yf/C/4H/Hv/3/t7+y/7w/mD/u//E/9T/6f+d
+/y7/D/8v/0z/Zv+G/4j/Wv9F/17/Hv99/i/+a/7Z/h7/Mf9S/4P/Z/8q/zz/aP9Y/0j/eP/A/+v/
+8P/q/7f/Nv/E/qX+kP6D/q7+yf68/uL+K/83/yT/Qv9u/6L/DAB0AKAAtwC5AG0AGQAWACAAAgD6
+/xsAJwANAPD/y/+z/8z/AwA1AGAAngDJAM8AzwCwAHQATAApAAoAKwBpAG8ATwBEADAAEADz/9D/
+4f8TADsAWQAoAMv/pf+v/9T/2f+P/2f/mf/f/1MA+gBNAUcBYgGfAbEBkwFjAR0B6gD+ABUBBwHQ
+AHkAagCXAIoATAAwAFwAqgADAWoBqQGzAb4B8gE0AjIC7AGxAZYBngGzAY4BLwHiAM0A4ADjAN4A
+rQAlAP3/jwAJAQcBQAHbAUsCnAIFA1ADOgO3Ai8CCQIDArkBJAGYAFYAMwAgAEEAdQC5AEsB/AF8
+ArUCkwI8AusBogFxAXIBewFIAdoAfABIABkA8v/n//j/IwBuANIAGQEcAR8BVAGDAUQBvQCOAKQA
+kQA6ANv/0P8cAGkAhABlADgAlgB1Ac8BgQFAARYB6ADIAKwAnwCPAEIAyv+k/93/+P/x//z/+P/q
+/zsA4AAsAd8AhACVANkA2wCrAG0A+v+K/4P/yv8UADYAJAAsAHUA1QA1AVgBAAF8AGQAgABDAOz/
+0//P/8v/HwCRAHgA6f9i/yb/Pv92/23/JP/2/vb+AP/s/sr+wf6c/mz+jP7a/gv/9f6R/k/+h/68
+/qT+lf5v/jL+Qf5s/lr+L/42/mX+kP7h/iT/5f6d/tP+Jf8c/9r+o/6B/o3+vf61/nD+V/6E/qz+
+mP4//tH9nf3C/Qb+Ff4T/jX+fv7Y/uL+iv5Q/mn+i/6W/p7+mf5//lz+Uv6W/uD+yv6U/mn+Lv43
+/nv+Uf7y/eb94/3t/R7+Iv4a/v79u/3z/YD+j/5h/n3+wP7k/tj+r/5v/jH+L/6J/vL+EP80/3P/
+Xf9I/7X/MAAvAAAA4//M/9P/z/+q/67/0//W/9X/BgAkANL/Z/91/83/AwAnAE8AVQA8ABMA7v/p
+/+b/yv/Y/wcAz/8r/83+1/62/kH+A/5l/u3+Gv/t/pb+jv7r/gr/4P7u/jH/nf8zAGoADwDK//b/
+EgDz//D/DgAXAP7/5P/L/5j/Rv8j/2j/3P81AFcAlgAKASYB5ADBANUA7ADMAFUA0P+q/+D/IQBL
+AFUARQBrANIAGQEmAScBWAGVAZABWQEbAd8AsQCzAM0A7ADxAPkAcwHeAXkB8gDhALcAeQB0AGcA
+gADUAO8A6gADAegAmABQAC4AWACqANoA1QDAAMsACwFTAXkBnwHvATYCUwKQAhMDcgMgAzgCYgHQ
+AHEAlwAuAYYBXQERARMBYQGfAX0BDAHMAPQAbQEZAmcCBgKTAXEBaQFhAUIBEAEoAXoBogHCAeQB
+jAEPAS8BbgFJAQ4BEAFDAVoBPwEbAfwAsABpALoAbwHWAeoBFAJaAm0C/QEgAUcAt/+G/6L/zP/0
+/xcAKwBCADYABwAWAE0AagCOAO0AjAHzAd8BhgEHAZoAZgBkAJAA1gDsAIUA+v8BAIcA6gDyANQA
+3wAVASoBEQHPAGAAJgByAL0AjQArAOL/2f8oAGYASQAEAMr/wv/G/4P/Fv/S/qr+uf4z/3b/C//W
+/j//Xv8j/yP/Mv8f/yb/ef/N/9T/2//V/4H/Jv8i/2L/hf9g/zb/S/9w/5v/4//7/43/7/67/sr+
+wv7H/vb+Pf+L/8j/+P8lAFUAfgB0AEYAPAA1AML/C/+Z/jj+uP2S/bX9p/2O/Zj9fv0h/fH8MP2w
+/VD+3P4R/x3/Lv8z/0z/Pf+8/h7+xP27/ab9Zf1L/Vv9YP12/fX9tf4Y/9X+Uv5I/sz+Lf8a/9H+
+af4D/s79yP3I/Yz9Rv0v/TP9h/0n/rP+Ev9D/0//Wv92/47/cf8W/7X+if6R/sL+//4g/zf/T/9M
+/yj/HP9b/6D/p/+m/5z/YP8k/wv/EP8M/9D+eP54/sX+4P70/lD/jv+S/9L/SwCrANEAtwBXAOH/
+0f8mAEgALQAlAAAAw//U/yUAfADHAP4ATwGeAYkBLgHlAMYAsQCZAIcAdQB0AIwArwDHALoAmwCK
+AH0AdQB+AIwAbgBGAG4AegAwAB8AHwCj/xf/Q//E/+r/9f8IACcAegDVAAwB6QBtACwASABLACgA
+HQAhAPb/xv8iAKIAbwAEACgAaQBIAEEAjgDMANwAzQC1AMMAwwBrADgAmAAAARYBRAGiAa4BdQGH
+AcIBxwGxAZQBdgFiAVkBVAFNAVIBZwGBAZgBrwH3AWUCbAIVAugB3QG2AYIBTAEBAc0AxADYAB8B
+VwFBAQsB6AANAWUBcQEQAboA5gBOAYEBswHNAWcB6wDmAAUBEAFHAY4BogGvAfUBIgIOAvkB0gGL
+AXgBmAF3ATQBBAG4AH8AgACfANAA8gDxANgAyADbAPQA8QD7ACkBKAHWAIIAawCGALgA4QDlANMA
+yACIAOH/h//c/yEA9f+7/7P/tP+5/9z/LACIAOsAfAHJAVABfAAUAN//Uf/u/vH+g/6u/cj9+P4G
+AIEAqgCnAMEAIAFkAUMBGQEXAdoALQBg/yL/pP9FAHgAQgADAOf/8v9AAPAAwAEkAuIBOgGnAJMA
+5gACAagALQDZ/8//EwAqAIz/kP7s/eL9c/5B/5D/m/8LAGAAMgDL/0T/zP50/jL+RP5p/kb+Pf50
+/nD+Hf7z/Tn+i/5t/jf+cP7z/j3/Af+L/lj+Xf5a/kP+Yf7k/mX/jP9S/+X+v/7X/rP+Qf7q/fv9
+WP6y/r/+af7O/Xj9p/3I/bz99P2a/kj/cv9B/xL/6P7V/tL+zf6//pP+N/6//Zf9nf0r/W/8+vvl
++xz8lvwP/VD9g/2h/Zf9ff1J/Sn9f/0O/jr+Ff4e/if+qv0D/bL8lfyu/BX9if3z/VD+hP6U/pL+
+eP4j/rv9tf0P/n/+5P4N/+r+2/4h/2v/av9Q/4X/3v/X/2X/7/7R/vL+Hf9Z/57/4/8hADYAHgAc
+AFIAtwAvAV0BbQHaAR8CtQEvAcoAYwBHAHYAvAAUAUUBUwFeARoBjQBPAGwAcwBMADEAWQDXAEwB
+ZgFnAUsBBwEVAWYBqwHwASgCKgIMAgUC8wHMAZUBPQEYAVUBlwGWAX0BbQFXAVUBkAH1AToCTAJu
+ApkCmwJ4Ak8COAICAqgBdAFcATYBCgHVAIMAKQDO/4L/rP8PAPv/y/8IAFwAqAAeAXkBmAGsAbcB
+0gH6AdABOQHEAKIAUADV/8j/JgBBAEIAxgB9AfgBTwKWAskC6gLzAuICrwJaAhkCGgJGAlYCLAL0
+AQcCdQK7ArsC5AIrA10DrgMTBA0EnAMoA7oCXQIhAtEBcQE2AUgBsAEVAhwC/gE4ArIC0AKlApcC
+kQKVAo0CWAIhAtsBfwFiAXQBVwE8AWQB3wFSAmUCfwLJAuYCzQK7AtMC8ALjArICcwI8AgECxwG4
+AbUBsQHNAQMCLwJlArwC6QLcAtIC3gLcAroCigJgAigC0QGeAawBqgFOAdcAnwClAJcAVgAZAOz/
+AAA6ABUAiP8N//T+Iv9a/0L/xv49/vD95/3v/c39hP04/RP9GP0h/fP8q/ym/LH8mvyx/AT9Hv37
+/BD9Uf1d/T79Bv2S/D78Rfwo/LP7TPtS+7/7Cfz3+/P7IvxV/Hr8bfw0/Bz8J/wu/EP8Ufwr/Nn7
+qPus+7T7z/sR/Ez8c/y5/P78D/0O/cf8PfwN/Fz8cvwB/Lr7vPuF+z77/Pq2+qP6uPrQ+tz61frD
++tr6CPvj+on6f/qw+o36O/pF+oX6cPom+jj6XfoP+t75SPrF+gH7I/sp+zD7UftG+zD7X/uI+3r7
+hfv5+5L8sfxD/Lj7bPuJ+xH81fyH/eP9Kv6M/qz+rP7U/gj/Ov9f/2D/Tv8b/7z+jf6y/tv+5P79
+/kX/hv+I/2D/Vf+W/+r/NwCVAIIA4f9q/1n/X/9F/yz/HP/T/pn+0f4X/yP/Ov9h/2n/mv8vAK8A
+swCGAGQASQCCAPMAHAEqAYcBEAJxAs0CpAPaBMkFdAagB0YJeQrtCrUKDgqyCeQJQwpJCtwJowm3
+CakJ0glDCmIKpAqqC7QMRw3KDf0NeQ2lDPMLYAurCtQJTgkbCbIIGwivB24HEAdiBsoFrgWhBVgF
+5AQcBFQD9QKxAkkC/gHGAZkB1QE3AvkBTwGQAH7/iP4P/pD92fwO/Ff71vpr+h76+fm5+X/5w/lr
++gr7jvv6+1T8ovy6/MD84fze/Lr82vwS/Qb9wvyV/PP8mv23/XL9h/3d/S3+s/5t/0sAJgFpAV8B
+rQElAo8CJwMTBOQEUgVwBTgFrQQXBKQDMwPaAtsCGgNuA+IDHATrA7gDoQOmA9MDMgTOBIQFAwbj
+BUcFmgQBBIoDQgMZA+MCpQJBAowBDgEjAQQBUgDE/5//eP8E/4L+X/57/rH+6f7Q/lr+6v3b/ez9
+uf1q/Rv9ovwx/Oz7nfsv+536I/ru+Z/5Lfko+ZD5AfqG+gj7Ifv0+vn6W/vb+0787PyH/eL9Iv5M
+/hT+pf2s/Qf+CP7Y/fr9Z/7V/v3+0v6P/n3+xf46/5T/BwDCADkBQgFUAYoBxAHpAecB6QHIAU4B
+2gCtAJgAbgAwAO3/pv9u/3v/wP+m/1L/cf/F/wUAUgBjAEkAbAByAEQAKQC5/x3/1f6F/gL+gP0Q
+/cL8qPzr/In9Qv7G/s7+lP6Q/sj+6v7Y/r/+pP50/lH+af5k/g/+1v0Q/tn+w/8iABYAEgAlAEoA
+lgDTAJgAEwDK/7v/vv+a/3L/mv8EAK0AdQE3AsUC0gKwArcCdgLgAZABewExAcMAdgBUACcA0P+L
+/4r/p/+Y/5//8v/3/5z/a/9m/x3/a/73/Qz+Gv7D/TT9xPx9/D/8+fvR+w78dvzL/A79AP3Q/Pn8
+Cf2S/FD8o/wI/Tf9QP1c/Yz9e/0s/QT9Fv0l/UX9mv3s/ev9g/0m/S79Rv05/U39av1Q/U79mP21
+/X79Ov3g/MT8UP3s/Sf+Qf5M/kr+bf6r/sb+rf5x/iT+8/32/f/9q/0N/eX8Vv2l/aT94f1r/rf+
+0v4K/wf/tP56/lf+B/6E/RX9Af0r/Sf93/yK/G38svzs/OP8Ef1d/Tz98/wT/Vz9hP2v/eL9Ef4/
+/pb+8v7e/nz+cf7f/lD/f/+B/5P/0v/5/+D/uv+v/9r/GwBTAM8ARwEJAd4AqQFhAkICLwKNAugC
+EANMA74DFQRWBKwEyASvBPAEYQVRBSIFmgVWBtAGQgfhB5kIMQmUCVMKtgv/DI4NeQ00DTINOw3k
+DGkMXgy1DLYMQgzqC+sL/wvYC4ELRgtBCxoL1QqSCgcKXwkICa4IzgenBscFXgVBBQoFWwR9A94C
+YgLwAVEBUwB3/+b+GP4Y/Vn88fuu+5D7r/vc++L7/vtd/KP8m/xB/Nr7vPug+1n7+/q0+sD68foN
++xj7FPst+6b7RPym/Bv94v2I/tP+GP91/7D/5f8pAEsAkwAqAZcB1QETAkICeQKZAl8C9wEKArIC
+PgNnA0ADDgNOA9gDKwQ9BDQEGAQXBGgErASZBKoE/QQNBdgE2gTqBHcE4gPRA84DbwPyAlECgQHK
+ADoA0//B/8//n/9C/wv/Cv/r/oH+CP6v/Xz9Uv37/J78cfxE/Nv7Qvuy+j766/nB+bH5zfkV+kH6
+Ofo8+mH6jPqq+qT6cPok+hf6afqb+o/6pvr5+lP7oPvq+yX8Z/yf/Lr8+vxT/Xv9ev2c/fH9Ev7t
+/eP96/3M/bv9A/6L/gP/Rv9i/3D/g/+S/7f/6v/X/6P/l/+m/5T/Rv/j/n/+Mv4m/lX+n/62/mn+
+Kv5b/qL+hf42/h/+Jf4E/uL9u/06/bf8q/y//J78hfxl/Ab80Pve+6r7Y/ug+xH8QPyL/PH8D/31
+/Lf8rvwT/WH9X/18/cn98f0P/iP+7f2v/fT9xv5p/2T/MP9Q/+//CwEKAjgC0QFtATcBPwGcARYC
+bQKGAj0CxQFlATIBJQERAQwBTgGrAdcB5wH4AesBnwFTAV0BcAE9AQAByAB3ACgA5P92/+7+gf4j
+/gH+Rf5v/jP+/v0V/jr+ZP53/kb+EP7D/Xn9tf0A/qv9DP2y/Ib8efzd/Gb9b/1D/Yf9Gv6A/qX+
+o/6c/tL+Kv9Z/17/Uf8+/yX/HP80/0P/Kv8z/3P/nv/K/xQATgB0AHgAPQAFAPb/5v/X/9X/w/+E
+/xr/sv5u/kL+Vf6l/rb+iP60/hz/J/8G/wD/+/4W/z3/Lv8D/8z+gv5r/pL+fv4Z/v79Wf5q/gD+
+4/0p/hH+wP3U/ST+oP4S/xD/8/4C/wT/Av8b/xf/Ov/Q/zYAPgB9AMoAoQBQAJQAZAEFAkIChAK2
+AoECJgL2AeYBBAJ+Av4CPwOWA90DoANjA8gDnQRgBdgFPgalBg0HlwcPCD8IdQgFCcsJywoeDPUM
+1QxoDBcMDQyKDCUNPA3TDF8MIAzhC4ELSQtZC34LlQtrC/gKowpxCvkJLAklCPkG1AXrBCkEWQNy
+AqMBCwGEAPX/Xf/L/kL+vf0m/U78W/uG+tv5XPnm+HX4C/i+9+33aPif+N/4TPlN+RH5Jflk+Yv5
+pvmS+Uv5Tvmp+fP5PPrH+m/7x/vy+4b8aP0y/u7+wP9YAGoAfgDhADMBYgGcAQMCeALGAiMDzwON
+BAIFVgXCBT4GzQZZB64H1AfVB4oHHgfLBnkGQwY8BhIGmAXzBHAELQTwA5wDKAN6At0BfgEkAc8A
+bgDb/zj/mf73/Xz9MP25/AL8eftM+wP7R/qh+V35HvnW+LX4wvjS+Nb4CvmX+Rf6CPq3+bX52vmz
++W/5ZPlk+WL5ovkQ+nv6DfvO+3v8D/20/TX+f/7m/mr/6v9kAKgAqgCRAHQAcwCXALkA0gAWAW8B
+mQGzAQYClALzAuACvAKiAj0CpAElAYwA4v+P/47/mf9p/+r+ov6c/j3+4/3G/Sb9S/y4+yT7xPqt
++nD6Y/ql+p36UPpQ+pH6hPo6+gf6uPkx+fX4WPnI+df53fkt+rT6QfuU+8L7Pfzq/GP9iv1D/fP8
+NP3X/VH+nf4M/7H/dQA0AdUBTQJxAnICtAIJAzQDLgPfAooCjwLCAswC0wIVA5gDNgTTBHIFiAXF
+BDYEVAQoBIEDGAOeAq0BFwELAesAlAACAHv/Y/93/1z/Nf8b/+T+f/4E/qD9OP2l/Dn8G/wI/NT7
+kft8+5f7xvvx+/r75Pu++8T76/vn++L7B/wk/DD8i/w5/eD9Yf7a/mz/9v83AC0ANgCQADIB9wF9
+Ar8C5wLqArYCSAIIAlMCwQLIAqAC1gJaA3wDEgOpAn0ChgK+AuMC4ALpAuMCmwI4ArYBMQHcAIEA
+HADq/8X/Zv/B/hT+rv2R/Xv9cf28/TX+e/59/ln+NP4n/hX+wv0o/Yf8M/wo/Of7UvsL+3r7NPzH
+/CX9Nf0o/WD9nP2J/Xz9k/2V/ZH9xP1G/sn+Bv8N/xT/F//z/ub+Mf+v/z0A5QA4Ad8AfACzADQB
+cwGCAWsBNwFXAdQBZQLJAp4CEAK+AbwB7gFUAosCNQK4Aa4BFgJ7Ar4C/wJdA94DMARKBLUEegXv
+BeIF5QU2BooGzgYbB4cH2Af0B48I9gmQC+kMqg2TDc0M+gvHC/0L8wucC/sKBQo1CcEInAjgCGAJ
+xgnrCfkJzwkACf0HfgchByEGeATWArUBwADt/5P/Qf9c/or9k/3R/ZD9F/2k/O/7B/tQ+qX5yPgI
++L33svdm9wz3H/eG91L4VPng+QT6IPpj+tv6N/s6+yT7IvsK+/r6QPv4+/P8v/1O/vP+qP9ZAPIA
+RwFkAYEBoAGYAasBIwLHAmID2QP9A/YDRAT+BHAFTQXqBHMEEwQGBCAE4gM2A5cCVgIgArIBVgFK
+AW0BewFDAREBBgG+ADoAx/9M/5P+o/2+/CX85vv3+wr8nPvc+oP6qPrD+rn6zfrE+mT64PmX+c35
+E/oY+hT6HvpO+pH6yfpH+wP8ifzG/MP8rvz3/Ij9Ef5D/kn+rv4B//H+Lf/D/yUAdgDzAGkBugHC
+AcMBJQKVArwCvAKjApQC7QJZAzgDxwKXAm4C5QFlAU8BXgE1AdgAfQBSAEoAEQCY/wr/oP52/lL+
+Gv7Y/Yf9Nf3Z/Er8tfta+yL7IvtB+xz77frz+tn6m/p4+nL6c/pt+n36vPrv+vn6D/tD+2D7d/ue
++6P7m/vS+1n85fwp/Tn9bf0T/v3+kf+9/+T/FQBrABQBhAFKASABiQHqAQ8CYALBAvUCLQN9A7UD
+9QNrBKgEgwRmBFgEKwT2A9ADtgOYA1QDAgPxAjMDwgOPBP0EiARzAzUCbgHCAeACggMaAy4CQQGP
+AGkAWQFNA0EFbgaaBs0FnwR3A2IC9gFQAoQCFQJAAR8A4P4p/kr++v7g/5gAtQAuAIn/Af+B/g7+
+uP2c/cb9GP5J/kz+a/6k/qn+sf4n/67/q/9Q//b+Pf4r/Wr8Cfzb+yb8Df0K/s/+fP8eAOwA2AFn
+ArkC8wLEAk8C1AE/AZAABgCz/3j/Rf8N//f+JP9///f/ZQCZAJkARQCM/xn/Ov8t/8z+oP53/lv+
+s/73/t3+2f7Q/pb+YP4V/pX9K/0B/cb8Ufy7+wf7ffpt+sP6Mfun+zj8pvzy/Hj9HP6X/ur+/P6g
+/uf9If3A/P78d/22/bj9g/1E/Sn9G/1A/bv9Tv6f/qf+sv7y/ij/Gf8t/3z/eP8l///+I/9W/3D/
+cf84/5r+7v2j/W/9F/0P/V/9Zf0G/an8dPx+/Pr8k/3u/fz9m/0u/S39W/1x/Zb95P38/cf9u/3c
+/cz9zf08/rP+B/9l/23/2P4x/vj94/2j/YP9vP1G/hL/wv8RAFMA0QBoAQsC0QKMAxAEeATbBBgF
+LgU3BUAFhwUMBlgGVAZdBvoGZAghCtgLTg3CDTcN0QwSDYkNEg61DuQOjw4aDkINEgwWC44KSgr0
+CTkJBwjTBtcF5gQuBMIDLQNtAuEBmQFbAQABtABlABYA3P9k/57+yv3u/OX75foM+jL5ifhB+An4
+3Pcc+JT41Pga+cL5k/pK+7T72Pv4+zP8b/x1/Hn80vxK/Z/9HP7g/mD/fv8AAPsAkwGtAesBWQKz
+AgMDLAMqA1UD3wOrBE4FbAVhBbEFIgZ3BpEGaQYtBtEFXQX8BJUEDgSZA04D9AJzAugBmwGpAcUB
+qgEuAX0AIwD1/4//9P4U/iz9e/wC/Nz75vvn+wH88/tp++X6zfrb+vX6HPs8+1D7/fpl+ij6ZPrb
++lj75vtF/E78u/yw/Xr+3P4B//n+/f5g/w0ArQD2AOQA/ABpAZsBiQGlAekBVgIDA5ADwAOjA4kD
+yQMFBM0DZwM/AzoDJAMHA8wCkAKEAloC4wFuARMBugBfAO//cf/5/mX+sP0i/dT8dPzs+2b7D/vU
++of6N/q4+SD5Hflp+V35RPlA+Sb5HvkR+fv4N/lj+RP56Pgq+Wj5nPm8+bL57fmp+nX77Psv/JH8
+Mv3//bv+XP/R/w0AYgDPAD8BwgH8AewBIwKoAkUD1QMyBHEEoAS/BOwENgVuBWYFOAUYBfcEswRq
+BEEEEwTQA6cDmQN7AywDtAJmAk4CFQKrAVgBLwHKABAAbv8M/8L+a/7t/Tz9nPyn/Ff96/0X/gH+
+q/1x/X79Yv2A/WP+h/9OAK8AjADV/2r/6//BALUBzAJcAxYDlwKVAtkC6AL/AnkDSwQ7BRcGzAYi
+B58GYAVqBE4EuwRCBXcF8ASoA0ICQgGfAGgAjwDJAN4AzgDDALIASACJ/8H+B/6E/VD9Kf3a/Fn8
+wvs8+8b6qfo7+8D7sPu2++T7y/vL+wn8JPzK++H6Kvpo+uX64PoP++v7qPz3/FH9x/00/n7+o/7H
+/vH+Lv+P/7b/cv9c/4T/eP9s/73/PQCpAO4A/QAQARoBxwBYACUAHAAXAOb/a//s/r3+qf50/kX+
+Kf4a/hX+Gv5C/kP+z/1S/R/99Pyr/Fb83PtC+y37oPuM+/v6wfrB+t36V/vk+zT8Nvz1+6z7bfs/
++0T7ifvi+yz8gPze/Bv9Jf0h/Tf9Qf0r/SD9Kf1e/eH9I/6l/TD9XP3B/TT+ov7R/tH+6P41/5H/
+q/9r/xX///5d/wwAmgDFAK8A0ABLAbQB9QFsAgsDVwNAAzMDNwP/AnsC9gGyAZsBvgFSAtwCtgIr
+AsABjQHcAdYC0wNjBHoEJQT8AzQEXwSsBGAF2AXhBRMGcAamBswGLwf5B2gILQhmCJ8JRgu0DKcN
+Nw5VDhAOBg59DuoO7Q6oDgoOzAxuC9AK7AoqCxoLogrpCRcJUgi7B2AHAQdqBp0FswTBA8kC0wHg
+ACUAxf98/yz/wf4N/jf91vzQ/D78eftH+xv7wPq3+tL6nfpG+lD60vpx++L7K/yE/Nv8AP01/b79
+av7P/gL/av8pAA4BlQG0AfcBfgLXAuECFAOBA70DsQOiA68DxgPxAykETwRgBJoECgUoBf8EHwV6
+BXUF1gQdBKQDPwPPAn0CSwLCAdIACABy//r+tf5g/hr+Ff66/Rj99/z5/Iv8A/x5+/P6hvrp+Wz5
+kPnN+Xj5y/hd+D/4Tfi8+Cz57Phc+Cz4d/j++HX5w/nj+cv5wfkP+p/6Pfu7+zb87fyU/fL9Iv42
+/pP+Tf/L/wIAQABzAJkAzQAFATwBjwG6AY4BVQE6AUUBOQG+ABQAtv+x/9j/4v+A/wD/8P74/nr+
+1P1n/fP8gvwp/Mr7avvv+kf65fm4+TX5nvhL+Cj4Lvh0+MH4tviD+Iv4wPjX+Mf4wfjN+Oj4J/lu
++bX5Bvo9+oT6/fpE+1P7oftD/Pn8if3u/V/+0v4S/0v/zP9rALAAwAAWAaIBLgKfAgcDaAOMA5MD
+qQOfA4EDgAOKA3EDSAM4AwQDlQJCAvMBoQGUAasB0AEBAskBOQHsAMYAogCfAI4AUQAWACIAZAA1
+AFn/T/5d/dH8EP2+/R7++v19/bn8EPwe/OP88/3Y/sX/CwH3ASIC5AFmARgBhQF3AmYDHQRFBJkD
+mAI7AuQC+wPQBDEFSwVUBUAFFQX3BN4E5gQRBfwE2wRiBRIGEQagBSQFywTbBCgFKgXKBEIEdQOP
+AiUC7QGOAWABKAGgAAUAmP+B/4v/yP9JAIYAUgADANf/rv9F/7/+eP6E/rj+zv6n/lH+7f3S/ef9
+tP1Y/R799vzS/L781fwM/U79qP0X/nX+of7B/gP/ef/S/6f/I/+6/oz+P/6s/RP9pPzb/Ob9xv4C
+/zz/fv97/37/o/+a/0//Ef85/6P/yP+W/17/D/+//rT+1P73/t3+mP5y/jr+Dv4n/k3+Wv5S/kD+
+/f2y/eH9QP4u/sj9hP1V/Sf9Hf39/Kz8c/yI/LD8evwD/M372PsP/Ir8E/2A/bb9vP3F/aL9T/1X
+/dL9M/4j/t79tP15/VX9qP3d/YD9Lf1P/an9D/5d/mP+GP54/ef89vx7/ez9Ov6V/vP+Uf/d/4QA
+ugCJAHwAfwBLAPT/ef8Y/17/PAAXAXQBLgFaAGj/9f5Q/1wArgGLAloCWwGAAF8A9gARAjwD/wNz
+BOcENwVFBWkFEgYhB+wHJwhQCDIJ2gqEDLcNVg6IDlwO8A0qDhYPmw9tD9EOxg3BDGcMWgwlDOML
+bgveCl0Kpwn4CL4IqAgHCMwGcwVCBCQDUwL+Aa4BIwGvAEsArP8X/67+Cv4p/XL8+Ptw+9b6WPr4
++aL5HvlY+Mj36PeA+C352Plw+ur6UPu9+x38IvwE/CD8Qvw5/DD8cPy+/Or8QP23/T/++f7M/0sA
+egD4AIkBwAElAqwC2AIJA3UDqgPIAyoEoQTgBMcEVQSSA8UCRQIjAmACsQJvArUBWwGKAYQBIwHm
+AMgAjgAEADr/yv6+/k7+V/1Y/IL76vqo+qf6kvpd+kb6SPpD+iL6+Pn0+er5sPla+fr4q/iM+Kb4
+BPmI+e75H/po+vj6cfvJ+6H8xv0g/sP9ov3N/SP+gP54/mP+fv5u/pr+Z/80AJoA6wBhAaEBpwHj
+AQ0C3QGtAZMBbQFHARsB8QDpAOUAvACJAHEAXABKAGsAowCNAP7/Sf+2/mv+UP7y/Vr99Py9/GP8
+8PuD+yD73/rF+sv6xPqV+oL6gPpC+v/5+vkd+mL6sPq5+qP6+/p9+437fPuX+7n78fuJ/F/95v0m
+/mn+v/5l/ykAbwCUACkBpgHFASoCwwLtAuUCOgOTA5gDwgMoBIQE/wSjBRwGOAZNBpkG0wbdBp8G
+SQYpBu8FdgUrBUIFaQUoBZ4ELQTKA1QD+wLTArcCoAJSAr0BTAEPAc0ArwC2AJoAXwALAKf/iv+d
+/2H/Ff8e/x3/6P68/rH+Qf+hAAMC3QJJAxcDVgIkAicDNwR6BF4EzgOAAl0BlQHIAqgDvgN5A58D
+UQQMBYEFnwVqBewEkwSQBI8ErwTIBDUEdgOUAzoEPQSXAx8DFQMNA7oCWAL9AVIBZQCt/zr/9P76
+/gz/8/7m/v/+J/9F/xn/qP52/mj+Dv7N/dT9uf1d/df8Svzx+wD8Z/y+/Lz8XfzO+3P7Uvs1+yn7
+PPtc+4n74vtF/HT8vvw+/Zz95v0q/hL+pv1o/YX9of1+/Wf9gf1//Wz9fP2K/YP9s/01/or+dv5O
+/kn+WP5f/lL+Iv6t/Qr9nfx9/E/8Avz7+wv86fvD+3P72PqK+tb6Kvsm++f6mvp8+qP6rvqL+nL6
+Qfoc+jX6cfqw+hH7lPuv+zj71/rs+jL7dvvJ+yX8Pvws/FD8fPx1/EX8Bfzv+wL8+/vZ+9T7Hvyp
+/Br9GP2o/D38Rfyo/Bb9ef2m/Wb95fx1/DT8Rfym/CT9nf38/Tb+q/6g/2cAhACJAMAAhQD1/0oA
+OQEjASkAff9M/4v/LwCHAFsAWAClAL0AygAxAbAB5wGnAWMB1wHtAukDLwQpBKwEYAXGBTsG2AaC
+Bz8IowhUCPsHUQhiCRkLNQ3BDhwPFQ8PD7EOuA6mD4kQiRDwD18P0A5eDpAOFA86D+kOLg4yDV0M
+8QuCC2EK8QgJCIEH1AYJBiwFPgSdAxEDGQIIAWIAAwCW/wv/QP5K/ZH8HPzI+5L7H/s/+tD5G/o9
++h/6M/op+rX5evn6+cn6VPuu+wj8TvyK/Kz8o/zI/D/91v1H/nD+nv4M/5n/MACgAMUA8AA5AYAB
+8QHUAu8DkQTEBBIFfQXhBU8GrgbNBocG/wWcBXUFdwWfBaMFRgWgBNEDWQOhAw8EFwTcA14DzQJ9
+AjwCvQEVAV4As/8x/7f+Hv6D/R396vyW/Cf85Put+3j7pPsc/Br8gPvg+oH6Z/px+ln6K/oF+rL5
+N/n1+A/5YfnG+Rj6P/pq+sv6UfvY+0D8efyy/Av9X/2o/SD+e/5J/u/93f3l/eT9Hv6Z/vj++f7y
+/pn/eACoAJgAxQDpAP0APAFcAR4B2wC+AKEAVwDe/43/l/+6/73/sv+//8D/cP/0/rn+tf6M/lH+
+B/6O/Sn9Bv3f/MP86/zk/Kr8x/wQ/TL9K/3f/Ez82fvG+/f7QPxr/D786vvb++X72vvu+xP8Mfxv
+/M38AP3U/JP81fxm/bn98f0M/s/95f2i/hv/E/8b/0H/ZP/C/18AxgD4ADsBiAHNAdcBfwESAc8A
+tgD1AJkBLQJsAnMCfAKdAq0CwQIDAzoDGAPFAmkC9gGYAXEBcQFnASIB1ADvAEQBUwFbAewB2wKf
+A+4DoQO+AuwB0AEcAmoCtAKNAoQBPQCh/7z/UQDsAO8AdwAmAPr/3f/C/yf/T/7m/dn9BP5Z/nz+
+Yf4o/uf97/1n/vj+X/+s/7n/bv8e/+P+c/7X/Yv9g/1+/bH99/0V/iL+P/6Y/hf/m/8iAIYAiAAi
+AOb/LwCJAIAAHgC2/13/Bf/8/ir/Dv+5/n7+UP4w/lT+nP63/qv+nP5V/tz9l/2K/ZT9tP3A/Yb9
+9Pww/Mr7Kfyl/I38NPwK/An8L/xx/Jj8cPwn/FX81/zY/Gr8UPx4/D/88fs4/Jv8Zvwa/FD8tvwe
+/ZH9y/3I/av9fP1c/XL9r/3N/bX9mP2B/WX9h/3R/fL9D/4X/gP+TP7G/gL/Ov+h/wkALQAEANH/
+o/9v/1X/Rf82/1D/cP9z/zn/yf7G/mX/1//J/9j/8f/F/9f/OABUAP//n/+T/6r/g/8d/6n+X/5F
+/jn+dv4t/9T/7P/S////SgC4AHMBMQKBAiwCfAH2AOYAPgGyARwCfQLaAikDSwMvA/MC9AJiA+ED
+FATdA1ADxwJZAtUBdgGlASsCiQKnArICowKGAp4CFQPEAx0ECATdA8UDJwTxBEoFDwXuBCwFqAVO
+BiwHowiiCnIMrQ1BDicOvg3ODX8ORw/SD+0Pcw97DnkNKw2tDVkOrg6TDlAOKw7/Dd8N9Q0DDroN
+Fw1TDJwLAAuSChsKVwmACOYHfQfxBgoG6wTGA4gCVQGcAFAA7f8u/1j+ff2N/OL7j/tV+x/7Ifsz
++6/6z/mK+a35WfnT+Lb4s/iB+F74W/hX+DX4F/gm+Cb46ffU91n4Avk3+V/5sfnJ+fT52fol/Nn8
+DP2W/Wf+Lv/r/2oAZQATAPv/SgDEACUBUwFWAUgBLAEXATgBeQHZAUECZwJwApECuALOAusCDQMb
+A/YCgwIPAvoBBQLHAS4BigAaAJz/Ef+7/lf+D/4X/rT9y/wZ/MT7o/ux+777uPt1+9r6j/q3+qD6
+Pfrd+Xf5CPnY+Pj4+viw+Fn4L/g0+EL4H/jH94b3lvfk9zD4YfiV+L344vgm+Uz5TPmG+f35cvrE
++g77cPvH++r7A/xf/LL8p/yd/L38v/zR/Dn9of2r/aP94P1u/jn/v//B/+b/cwCZABkA1//Z/5X/
+RP8O/+T+A/80/y3/Rf+O/6n/iP9//8n/VADcAN8AMABs/xP/AP/u/sf+lf46/t39sf2E/XT93v1b
+/oz+tP7s/iT/Sv8t/93+gf4h/u39BP4V/uz93P3o/fb9R/6//u3+zf61/tH+F/86/xr/AP8V/0z/
+k/+0/7D/3v9yAEoBMwL+Al8DdAOaA9wDRgTNBEUFsgXyBa8FIgXrBCMFfAXRBUYGzAb3BrcGkgac
+BkoGugV6BZoFqQVzBRQFrARxBFUEJgQkBCMEngMPA/oC+wKbAt8BCwFXAPf/z/+O/0D/P/+T/8D/
+k/92/47/bf8U/9P+nf51/mn+Tv7u/Xb9fP3W/cb9cv06/er8vPzp/Ab9Gv1I/TP9Ff0a/fX8Dv2l
+/Sf+Kf4W/mP+oP6H/pH+8f5A/0f/Rv9b/3j/uv/+/wMAEQBCAGIAbwBiADUAAAC9/3j/Vv9m/3T/
+Yv9y/6b/sP+2//P/8v+c/3T/iv+O/0f/5f6c/iz+wP3l/VP+Vv7//cr9lv1Q/az9cP6N/in+6/3U
+/f39Xv5q/hn+6P0Q/n3+5v76/s7+rv5+/jL+R/6c/p7+cf6Q/g//Tv8F/9T+Cf9y/8v/5f/X/7b/
+n/+f/5L/d/9m/13/P//t/rP+wv7S/sX+0f4o/7L/FAAoAAIAxf+V/5T/tf/A/5r/Vf8y/3L/1P9G
+ANUA1QBgAIQA/ADuAMIADAF6AaUBegErAfIA1wAaAdABKwLmAecBbAKyAncCTwKyAjkDQwMJAwMD
+/gLOAsIC6gLuArwCegIqAuwBzwHYAecBrQFxAZMBxAGZARkBtADIACwBfQGTAX8BegGAAXoBqwEO
+Aj4CRwKdAiYDnQNNBFgFKgZXBkYGSgYbBsoFGQb/Bo4HjAc0B8AGzgaKBxcIEwhBCIgIZAhqCNkI
+GAnZCHAICgiRB0IHHQeZBtYFdgVYBTQFOgVVBVsFSAXtBFAE/AMWBPkDgQMiA6QC7AF8Af4A/v8a
+/9H+tv5c/iH+Vf53/jj+7/3m/Qn+M/46/tL9K/2o/AX8EvtF+hv6U/p7+pn6d/r8+cr5Bfr6+ZL5
+WPl9+cn5y/lx+Rr53vix+Lr41fil+I/4JvkL+pz62PoM+w77t/qw+kz76/sO/Ov73/sJ/Gn8rvyg
+/Lb8NP2K/aP9Av6q/kb/av8v/y//jP/q/xkAEQDN/4v/jP8GAPEAsgGwAQoBiAB9AJAAjwCMAGoA
+7/9g/yD/If8q/xv/K/9+/5X/Yf+Y/zIAjQCsAJgAPQD0/+P/5//M/4L/Uf9w/6L/cP/V/mP+Xf6d
+/hf/vP8/ACgAcv+6/qr+Wv8QABcAjv/7/n3++v29/eP9D/4P/tf9hP13/dv9YP6O/kj+J/6Q/u3+
+4/7F/rf+jf5B/in+Y/6N/nr+T/5o/hL/AACUAJwAUwD6/+D/iwDPAawCqALyAQIBrgApAdABWwJ3
+At0BWAGJAc4BnAFGAR0BFgEwAX8B0wH2Ad0BgwEWAQQBaAGuAZUBTgHgAHkAbACGAD4AxP+X/83/
+SQDIAOsAnQA8AP7/7v8/AMwAGQHKAOD/3v5k/pL+5f7M/lf+Dv4m/lD+Mf70/dT9vP31/Xz+sv5h
+/tv9Tv0b/Z/9NP6A/pP+Vv5N/oj+eP48/kn+kf6b/m7+lP78/jH/Rf9b/yv/wf6G/ov+kP51/ln+
+JP64/Vn9Wf3P/Uv+XP6B/gD/SP8x/xv/HP8i/2z/vP+L/w3/vv6n/o3+mf7p/iH/UP+n/+v/HgBB
+ACcA6f+e/2L/jv/j/8T/cP9k/1//Ff+4/nX+Yv6o/hn/gv/m/wQArv9T/4v/EwBhAE4A8P+S/3L/
+mf/B/7b/w/8NAF8AngDLANEA0QDrAPUAGAFsAZoBjwFzATgB9QDSAJ0ASwARAPf/8/8YAFUALgCz
+/4P/wv8dAFAAeAClALEAlwBMANn/av82/zH/9P5u/jn+df6X/p/+pP6M/qX+KP/J/xwAAQDD/7v/
+4P/K/3n/f//T//T/8P/s/7D/Yv+k/1AAsQDMAP8AOAFQAXYBpQHEAeoBFwJUAo0CmQJ/AnQCkAKH
+AjMCCAIvAnIC0gIiAx0DBQMpA3MDsQPGA6cDigOWA4cDOAPKAm8CcQKqAsMCqgI/AgECbwLUAr0C
+ewJMAmkC4AItA+QCVgLJAWABSgFiAYsB4AEjAgIC5AERAkUCWgJbArcCVgOVA4sDbwMZA5YCKQIJ
+AlwC9gJaA1kDKAMFA9MCcQL/AasBkQGgAawBlgFGAd0AowCOAG0AfgDHAO0AAAFOAfMBegJTAu4B
+8AE2AnQChQI5ArABUAFgAYQBMwHCAKoAygDcAP4AXgGLAU0BNgFtAW0BMwEcATgBWwFcAUQBLwEi
+AQ0BxQBrACwABwDv/8f/wf8PAHgAqgC8ANUArgA7AN7/8P95AOcAyABqADIAEQDj/7j/0f88AI4A
+hABoAIwAyQDUAIoA//+F/zH/8f7V/tT+9v4t/1L/gf+8/wgAYABIAMr/c/88/xz/Mv9a/4L/Xv+8
+/iP+D/4V/sn9kf2s/cf9of1V/fr8nPyP/CT9yP3r/eP92f3i/UX+l/5M/sj90f1H/oD+Rf7o/dX9
+C/72/Ub9kPxp/Lj8Ov2t/QT+h/4H/wD/cf6//WX9vP2c/lH/JP87/mX9Gf0x/Sn9uvyC/Pn8Wf0n
+/fP8hfy4+7z7tfx7/b39z/3H/Zr9gP3B/Wb+3P5V/jb9n/zU/Dv9XP04/Qj9Jv2N/er9Lf58/tH+
+uf7i/ST9Vf0y/iT/ff/H/ob9rfzC/Fj9kf1D/dn84/yo/Yb+nP5S/pD+8P7P/mf+M/5i/p7+kv5x
+/o/+v/5n/pL9Uf0t/mj/HgDu/wL/Sf7B/jAA3QCL/2r92PxR/s7/i//z/dr8Z/36/jkAFwDb/l3+
+fP9lAIj/U/7n/r4AswG5ANz+TP7s/88BeQEO/yn9AP6kAFAC8gG8AG8AMwFYAREABv/f/7sBjQKi
+ARUAdv/c//T/V/8N/6r/wgBfAQYBUgDS/4X/2P9ZAeoCZALF/8n9cP5kANUAHv++/d3+SAEYAmAA
+mP4J/4UAbQCz/sv9yf5dAFYBXwGTAOD/KAD9AEEBpwAkAH0AIgFbAU0BLQHqALIAwgD7ABQBRgGp
+AZMB8QAZAc0CSARIA2oA5P6aAGYDHASfAjkBdQFqAksCNQEsAUgDdQXDBGgBAf98ACAErAXZA0IB
+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
+TwAEAQwBXAC9/3z/Zf9//w0A6ABOAfcAtQAhAXUBvwCQ/3//wgDGAdoBtwFmAVoAc/8aAHcBzAF3
+AZABaQHQ/8b9uP3p/8MBXwHT/23/8gA5Al8Am/ym+1L/1gPDBDkCKf9L/Uj9AP8uAE3/Sv7//lEA
+XADn/oz9cv2y/Z39Gf68/30BUAGM/jf8dP09AOIAjf+t/nL/9wB9AQYAn/3C/GP+ngA6Afb/D/5a
+/df+jACZ/zT9d/37AMMDFgIL/Rj6zPzaAaoDXQFx/lL+ZQB+AHL9kvvv/Z0BBwLJ/qv7Jvxg/3YB
+XwAJ/ub9DgCRAOP98fuA/QEAsQCZ/yT+lP4XAfUB8v6f+0j8hf/KAFX/Dv5x/lv/Mv9l/Tv7Lvsj
+/rQBgwK1/+/7B/uA/ar/x/6l/BX9aQBQAmUAv/1A/Qj+pv7w/vH+9P5H/1//ov6H/Tz9IP4t/3L/
+Ef/6/v//aQFYATX/ev27/hABxwBR/k39Vf+8ATQBZP7C/Pv9dwBNAYH/gf0V/pYArgHq/6v9dv0r
+/2MBxwIPAoT/7/1P/4kBLgEM/k372fsn/wQCRgJZABv+Wf1T/sj/wQAvARYBUwB4/5f/IQBa/6X9
+IP2u/iEBcAJeAdb+h/2m/lQA3ACqAKMACwHVATMCFQEH/9/9hf5YAPAB4wEEADf+5f6RAQEDzAH9
+/0f/ZP+DAGsC0wLLAGf+Kv5pAJECGQKD/5P9VP4BAcsCvAFr/w7/ZgG+AxIDQwAD/6cAyALQAgoB
+hP8Z/y7/aP/0/58A+ABIAQYCygJ7ApgAu/7M/68DxgVYA6v/0v6vAEsCowGL/37+JwAKA7YDlwG4
+/yAAeAHSAVsBUQH+AW4C7wEBAY8A+ACfAWQBbwAaAKIAgQEhAsIB3gB8AKAAQQFMAugCgAI3Aa3/
+Nf+ZAGwCdwLUAJD/yv/yAMcByAGgAZgBHwF/ANIAFQL2ArgCvQGGANP/qACcAlMDxwEYAE8AzAHZ
+Aj4CEwDU/pIADgPQAkYAcv4f/1wBmAI/AY3+xP04AMsC4AG6/qH9Vf/uAPwACQDH/lP+nv+aAckB
+pv/9/TL/5AHeAnwBof+i/gD/igDNAT4BTf87/hX/RgCYAKUAhwDO/1L/9f/iAMcA8P+l/+7/mv9q
+/vv9nf8MAt0CMAGk/tD9Ov8LAa4BCAEBALf/WgDyALwA7/9O/6b/8wDvAXwBJQAD/4D+3f6g/3n/
+ev5O/iz/cP+V/m/90vx0/TX/iAD//zf+of1O/8cAn/8T/Q78gv3b/8oAKv9u/Jn79v1VAcsB5/6Y
+/LL9ZQAuAXj/e/1f/U3/XwFsAf/+//tx+z7+cgGxAUv/BP3Z/Hf+6//a/6L+2/2f/hgAcABG/13+
+wf6O/+n/cP86/nL9IP5z/3b/2/1w/Ob8Rf9sAb4Aq/1p+038Sf+2AO7+ZfwU/Pz9z/+U/5b9Sfx+
+/dD/twAsAJ7/dv+N/w8AdwCQ/+79xf1y/7gAwv9a/eX79fyz/5sBPwE3/2T9xf38/zoB8//a/XH9
+1/41ABwAnP5S/cj9Ov+l/8T+ZP5//+MAMAE9APb+m/5i/18A9QD8AGwAaf9h/sX+yQC5AR8AXP4H
+/7gBTgMHAdX8l/tM/l4B4AEfAAv+Pf0n/qH/FwCI/9b+fv7O/sv/fwADADT/0P+QAVwCcwElABUA
+CQEjAbH/qf4/ABEDUgM2AHb9f/5gAgsF1ANrAMH+dwAZA1IDLAGX/18AGwItAv//Cf7G/pYB+QPQ
+Az4B+/4m//sAMwJcAT7/h/7bACsEqQSFAVj+xv7CAX4DxAJCAa0AVAEpAhcCCQG5/17/tgC6AmUD
+6AGC/2X+2P9qAiADLgHh/h7/DgJwBE8D2P8O/iIAuQN5BI8Bmf7b/qABqgMzA3kBsgC6AXcDCQTj
+AicBfwCcASIDNQP7AfQA9QB7AcoB1QFxAb4ApwAzAXYBDgFUACsAJQFVAksCnQBW/lz9wv7zAB4B
+Gf+g/V3+FgDLAN3/kf7B/gUBpwPZA2EBRP+y/3UBNwKAAbcAzgD1AD0A9/71/SX+yv+QAbsBQgDh
+/gD/GgB/AIn/jv6H/ygCvgN+AnT/Lf0Y/Xv+nv/C//H/4QAZASz/vfzP/EL/IAEKAQQAMP/p/tX+
+u/4x/y4A4wAsAT4B4wDk/1v+tPz3+0L9DgAsAvkB9v///ZH9cv4w/07/Rv8Q/4X+9f3M/Q/+jv6E
+/4IAUAAk/5z+g/+6AO0AXQADABQAEwCx/0n/Yv/n/zAA/v/n/0cAmwBRAGr/ff5O/vD+j/+D/wD/
+n/5g/sj9zfws/B39hf8AARAAKP4z/Wf95P0S/i/+nf46/8v/+v+M//z+3f4K//j+r/7O/nD/DwAe
+AIn/4f7L/kv/4f/c/3X/aP9i/wj/m/5F/hr+L/50/pf+Uv4n/rb+Of+n/o/9MP3N/dD+jP+a/1b/
+jP8XABsASv+M/iL/oQBLAW8ALf+z/gH/cv82/23+d/6h/4gAPQD7/t/9G/5W/xQAsf/A/lr+6v5t
+/wv/dP5u/rv+yf6d/uH+z/9sAOL/6/73/h0ATgHAAWgBtgD2/zn/+v5//yoAYAA5ACUAUgCAAF0A
+GgAxAKwARQF4AewAMwASAIAAzgCnAGEAXACmANoAfwDt/9r/IwBZADIAfv/w/kf/EwCoALoASQDR
+/9T/dABGAWUBuwB4APUAMgHnAIQANgANABIAPQBvAH8AkwDKANUAsQDoAJMBJQIkArgBWwE9AV0B
+ngGwAYIBXwFNASUB6AC2ALcA+QA2ATUBNgF+AesBSQJyAjYC3QGlAWoBLgEaATsBagGSAaEBjwFn
+AT0BYAG8AcYBhQFcAUwBRwFfAWwBQwHmAIQAcACZAJIAcgBzAK8ABgEEAY4A+//u/5UAQAGNAaQB
+4gFLAnYCTQLZAVsBRAFyAVYBCwEvAWsBMQHkAK8AdQCGAA0BrwEIAgMChQG8AGkAvgACAcEAUAAh
+AFsAxQDEADgA3/8PAGAAdQBgAFYAEABh/yL/o//w/9r/1f+p/37/kv+A/1//l//+/1AAkQC9AOoA
+HwHzAEkAu//e/zsA6P8k/7v+nf60/ir/f/9R/0v/yP8mAAYApv9J/z//qv8nAFEACgCL/wj/oP6T
+/gf/tf/y/4f/9f66/r3+vv7f/kD/v/8PAAoA9v/6/+3/qf8r/9L++/4z/wL/xf7l/iv/a/+c/17/
+rf5F/mD+av5E/iT+IP5Z/m7++/2B/Wf9ZP1p/Zv9Df6m/vP+9P78/vP+0f7Y/gz/Q/96/5L/f/9o
+/z//CP/u/rH+TP5S/sP+FP8W/9H+iv6h/gv/f/99/wf/1f4d/4P/xP/P/63/jf+6/+L/Z/+k/lD+
+Zv54/l/+Sv46/i3+dv7K/pf+Xv65/kL/g/+o/8n/3//I/0T/5v4U/y7//v7N/oP+FP7s/SX+Pf4j
+/pb+n/89AEEAGQDg/+//ZgCTACgAAQA8AA0ApP92/0j/Af8D/0L/Qv8z/37/wv+S/4n/PwALAQMB
+QwCx/7H/zP+M/xL/2P4R/2T/kf+b/3r/bP/5/+EAMwHKAEoARwDZAFIBGQGWAGEAigC9AJwAHwCP
+/6T/YACrAFYAJwBVAJwAswCnANEANgFzASQBaQDJ/6T/+/9lAIwAfABuAIIAgABaAG0A4gBQASMB
+cwDv//z/cQD8AEsBUQFFAToBIQEOAf0A9gAWAUkBXAFHATsBKQEGAQcBPQFYAScBRwHKAdABYgEi
+AfIArwC3AAIBDQHVAK0AxgDZAK4AmAC9AOsAFAFdAc4BDQLfAZYBjAGWAWQBEwEXAX0B7gERAscB
+XwFOAZ4B1QGgAVUBawHfAUkCUwIJAtYB3QHVAb8BowF3AUMBDgHOAH0AhQDzADsBPQE6AYkBCAIL
+ApwBcAGAAXQBkgG2AW0BCgHBAGcARwCCAKEAjQB3AGYAiACqAGkALQA9AEAANQBeAKcAzwCWACgA
+7f/b/+D/HQCaAP8ACwHdAKoAqADfAP0ACAEkAfgAeQAsAC4AUACcAPgAHwHxAMkA3wDIAFgA5P/i
+/0MAgABpAB8A1v/G/+D/wf9r/13/2/9dACwAeP8K/wT/6/61/ob+P/74/en9OP7R/hn/s/5r/vT+
+kf+C/y7/9P67/pH+l/6a/mH+MP5I/jj+3v0P/rP+4v6j/nD+kP7v/i7/Mv/5/rX+x/4H/wr/qf4x
+/gz+Ef4M/iP+Qv5E/kf+if7n/v7+w/5m/jX+bv7d/jT/Mf/W/kn+1f3O/d79lf1W/cL9d/7A/sz+
+0P6v/nj+F/6u/ZP9j/2a/eX91/09/fL8Hf1L/Zb9HP6N/pn+bP6C/sv+0P6r/tr+HP8F/+P++v5S
+/8b/0v9T/9/+3P4f/yj/vP5E/jj+rP4x/0L/yv4o/gf+ZP51/lD+i/4I/33/1P8XACYA4v+n/7f/
+yv+0/6z/rf+H/5v/+f/u/2r/Dv8K/yn/Zv/Y/1sAmQCCAFQALgACAOL/7v8UAFAArgDpAJsA6f9o
+/zf/Hf8N/wf/Gf9j/8D/1/+q/43/g/9d/0z/bf+z/1AAAQEcAcgAfQBxAIkAowC4AKoAeAA9AEsA
+qQDcAAIBRgFPASQBGwFWAY8BbAEwAXEBKAJAAnkBJwGSAbgBYgE/AYIBwwHfAasBAgGTAM8A2gBq
+AFwArAC1AKIAtwCuAIIAbgBqAJ0ANQHLAewBlQFgAeQBpgLYAp4CdwJDAsQBcgGrAcgBgAF/AckB
+zQGbAYIBYAElATQBoQEBAicCGgISAkECYQJpAjoCsQGJAdMBvgFVASABLgFNAToB+gC9AHEAcAAL
+AVUB8wD5AJcB5gGrAXUBbgFYAVcBVQExAR4B+gCqAD8A4P+i/3//kP/L/w0AXwChAKQAxAAtAVQB
+GwHcAOgAMwFCAeYAggBbAFoASAAvAC0ANABYAJ4ADwFcAUIBKgEgAccARADz/9z/1v+9/5j/hv95
+/4D/1f85AGoAgwB6AHYAxAD/AK4AIgC1/2b/Sv9F/zD/AP/c/ir/2f9BACMAIgCuACQBMwFRAWgB
+OwHlAIIAFwC+/6L/kf9r/1n/Yv9z/5j/yP++/4X/hP/I/woADQDP/5D/m//b/+D/kf8//xL/E/89
+/1f/Ov8c/1T/qf/R/9T/sv+F/2T/Pv8g/xz/Kf/y/l7++P3n/fX9Bf7k/aH9sv0U/mT+zP5A/0D/
+HP8v/xv//v4P/9r+ff5t/nv+Vf76/bH91f02/oj+9v5O/z7/F/9A/5j/pP9Z/y7/YP93/wj/mP6W
+/r/+8f4Y/yH/Nf9E/1P/kf+5/4L/MP8l/1j/ZP8S/77+u/6+/qD+o/7U/tz+vf7O/tT+nv6P/o7+
+Yv5K/k/+Yv5z/mf+Zv6D/rD+8/4l//f+oP6H/nf+U/48/iv+Qf6C/qD+gv52/sn+Qv9j/yz/P//E
+/xQA0P9Z/xf/I/9u/4f/Qv8B/9b+o/60/j3/tP+q/53/AwBGAPj/m/+S/6j/rf+t/6r/yf83AHsA
+QgD3/9H/1P8LAEEAIwD1/ysAZwAzAAEABADg/7n/1P8AAC0AVABmAJ4AyQBiANX/2v80AD4A8v+0
+/7X/xP/g/0MApADbADsBrgHJAXwBLQEbARcBFAEvASkB1ACNAKgAAwFnAa0BpAFnAU8BeQHNARkC
+LwIeAkICgQJjAu0BbwEyASsBDQH7AAEB8AD4ABsBCgErAc0BGQLIAYoBhwFYAfsArgCLAJkAoQCY
+AK0AxAD8AJYBMQJgAkICKAI9AkwCIgL6AdUBmwGPAWsB5wCLAI4AmgDOADsBagFeAXkBtQG7AZ4B
+pgGOATsBIgFgAWsBHgHXAM8ADQE8ATwBTwFRAUYBnQEJAuQBVgEcAV4BgAFHAQEBzgCdAKwAKgF+
+ATwB4ADcAPEAAgETAdEAcQBsAJwAqQCVAH8AdQBgADcA5f+M/4f/nP+R/7f/JAB0AFYAEwD+/x8A
+eAC1AKMAiACSAK8AuwCrAI8APwCy/2f/p/8GABEA1v+v/+n/bwC+AJYAUwA3ACwA7f+L/3n/mv+X
+/3v/gv+5/+j/0v+0/6b/Rv/y/hL/Kf8e/xX/0v6F/nD+U/4g/gH+2v3i/WL+1/7+/k3/oP+R/2//
+gP9X/9b+jP66/s/+hv6b/gT/Iv8q/yX/Av8c/2T/nP/c/zoAVADF/xD/vf6V/mT+Ov4k/jf+if7d
+/v7+//4w/6r/EQAoAO3/qP96/0P/6v6K/nH+k/68/uH+H/9P/wD/jP68/j7/ev+M/0//2/7z/nL/
+mf9S/97+V/77/er9u/03/d78Fv2H/e/9Ov4T/tb9MP7g/iD/2P6j/vD+d/+P/w3/ZP4F/uP92P3s
+/ff95P0H/on+/f4I//H+9f4b/4r/AAAAAKf/ev+Y/4f/Kv/z/vT+Dv8q/x7/EP8U/xr/Iv9I/8n/
+QwA0APz/9v/o/9//1/+p/6r/w/+P/2P/g/92/x7/Kf/C/xgA6v/A/9f/DAATANv/sP+k/6v/0v/v
+/8r/df96/wsAfQCBAHsAlQC4APoAKwEAAbQAqgDiACkBSAEHAXIADwAlAHkAzgD+AAwBGAFCAXYB
+aAERAasAeACSAJcAXQAjAAIAQQCtAL0AmAB6AF4AbQCnAMcA2wD+ABEBJAFCASQB0gCrAKAAlwDO
+AF8BxQGVAU4BgwELAlECGQLEAaQBpgG7Ad0BzAGNAZAB2gH2Ab8BjwGuAdgB3gHeAdMBqwFuAUcB
+QQFMAT4BAgEAAUsBdgFRARgBEgE5AVoBdwGrAbIBfgFYATgBQAFyAT8B3QCoAHEAhwDZALkAZgBQ
+AFoAjACrAF0A8f8IAHIAeABOAGUAlgBwABAAEgBcAGwARgA9AFgAjgC7AIcAMQA7AIcArACaAHkA
+dQCrANoA2ADiAOYAoQBGAFIA3wA/AfkAdgA5AFEAYABXAFAATABjAFoAIwAUABMA5v+l/4b/cv8g
+/9T+8f4S//b+/P4S/z7/qv/7/xcAIAATABYAKADc/1D/R/9+/z7/5v7k/ub+3P4g/4T/ov+9/x8A
+ZwBSACoAJgBAAF8AbABXACIA6v/c//n/5/96/yT/Qv+S/8v/+/8TACEAVwCIAHgAKQDA/4P/g/99
+/z3/6/7I/tX+3f7m/tP+b/5R/rv+8v7f/uD+5v7p/vT+2v6p/nn+/v1P/Qv9Mv1t/dz9Uv5Y/iD+
+Mv56/of+jf7n/iD/6/7T/gH/B//w/vT+6v7r/jf/sf8GAPv/nf9P/03/Rv/h/mz+Nf4V/gL+//3c
+/YT9Rv1h/Zn92v01/l/+Uf58/t3+B/8D/x3/Pv81/x7//P65/lz+Nv6B/pb+Mv4w/pT+ov56/nn+
+ov7x/hP/+/4s/4T/j/+L/7P/sv+c/8X/6P/L/4X/If/V/sj+yP6y/qn+3/5L/53/tf+s/4D/Wv+J
+/9L/0P+u/6z/tP+4/8n///8uACMAJgBWAFsAQwAhANj/qP/M/zEAbABgAFsAXgBmAHUAdgCJAKgA
+nQCkAOkAEgHwAJUADgDC//3/OwD8/5P/hv/q/1UAUwD9/+b/HwD0/13/Jv9h/3T/Xv+K/+P/IgBg
+ALIA8wAKAQcBBwFGAbIBHAJ2AngC4gEUAZoAWwADANL/FgB5AKsAsACqAMkA+AA+AaUBCgJvArgC
+lQIhAscBhQEzAdUAlQCOAJkAiABLAPr/3P9BAMUAuwCUAP8AfAGjAd8BGgIGAtsB+QF4AvkC+wJu
+AuQBvAGqAXsBagFtAUoBSgHRAY0CwwJ9AmACjAKLAjIC8gEUAjAC9gH1AVwCggJkAnwCjQJQAgEC
+AAI4AjECAgILAg8C1gGnAYMBVAEgAckAhgCtAPIA0QDCAEsBnAErAfgAWwGLAX0BcAFTAVABTAHv
+AG8AIQDt/9//7P/C/6P/9P9UADUA2v/n/1UApACyAJcAWAA8AFUAUAAWAMz/kf9i/0f/W/97/4L/
+kv+4//P/VgCcAHUASQCAAL0AhQAaAPr/5/+z/5v/fP9Y/3f/kP9P/+3+v/7F/sj+zf75/jD/Q/8t
+/xL/C/88/5D/kP9J/y3/G//L/nT+Vv5u/qf+t/6s/tb+8v66/ov+wv4g/zT/Uf/T//L/Zf8f/0X/
+RP8p/wH/zP7w/nf/xv97/+D+mv4W/93/AgDD//P/SgAWAJf/Zf9o/2n/Vf/9/qn+x/4j/3P/tf+/
+/6L/kv9x/27/rv/M/3j/B/8Q/y3/zP5s/lT+Sv6Y/vz+wv5m/m/+kv6p/qn+gf5q/nL+cf55/o/+
+d/5H/lf+nv7U/r/+df5F/j3+Uf5s/lj+F/7o/Qr+S/5n/oH+u/4k/4T/gv9B/xH/9f7N/sD+5v4I
+/yj/Tv9L/xv/5/7i/g3/Tf+W/6//jf+M/5n/of/S/9r/kv9o/47/ov9P/xv/aP+U/3H/aP9c/0f/
+Z/+g//L/UgBhADwAWQBlAPP/eP9j/2j/Nv/4/uH+z/68/ub+NP9c/5//FgBwAIgAbwBIADgARQAo
+AML/p//o//r/1v+o/3L/W/+B/5b/hf+k/wMAWwCAAKIAwQC7AK4ArAC/AMoAgQAbABAAVwBxAG0A
+rQDTALoA7wA/AQQBmgBrAFQAfAC7ALsAkwBUABYAOgC4AO0A4ADfAK0AgQDPAEYBdgF+AZ0BBAKB
+AqsCkQJgAk4CdgJ0Ag0CnQGBAYABRQH2AOkAJgFeAV4BVwGKAdwBGgIEArYB0AEeAu0BgAFOATQB
+JAFFAV0BEQHIAAMBmwEQAgsC1AGMAQYB9wCNAaUBRQFCAWoBdgGlAd4B0wG3AdgBKQJdAkkCaQJG
+A2EEDAUaBZAElAM4AvUAXQARANL/0f/3/1kAxQCeAMz/5P5e/hn+PP76/rj/KABIAPX/Zv+L/nj9
+xfyh/PD8f/3S/dD90P3V/a79if3F/Tn+0/6y/20AwgDHAF8Auv9s/4X/o/+l/7f/tf+C/5r/7v/k
+/2//+P7J/s/+6f7g/tP+A/8b/wX/KP+K/8r/u/9//zf/P//k/3UAVgAYAEcAjQCCADEA6f+x/4P/
+f/+M/6b/4P8GAAkAEAADAPD/EgBUAI4AuwDVANIAkQBCAFkAqgCFAO//lP+L/3j/Uv87/2P/xf/2
+/8b/nP/R/+3/lv9w/9r/IwAAANb/tf99/4L/2f8GAKf/+f6y/uv+Hf/4/qf+ff55/qj+BP9J/1z/
+R/9H/3b/w/8TABEAmv8q/0n/tf+q/9z+0v1k/ev9tf79/sb+af5A/nj+3v4L/+3+vP63/if/s/9+
+/8L+X/49/gP+o/0m/SL9Hv6R/0wA4P8b/9v+Nf/f/zEA6P/J/+//qP8C/2j+Gf4d/vL9kf3C/Yn+
+I/8+/93+Y/5//jL/x/+Q/9r+kf7n/h7/j/65/a/9o/6m/8z/S//y/i//IQA9AUsBHAAr/7H/HAHL
+ARgB3v8r/5//ugD3AOv/AP9t/6YAPwHIAEAAfAAAAbIAWP8j/lX+rv/NALwAy/8w/53/dgC9ANT/
+SP7U/SX/9gDRAUcBLwDi/3AAuAA1AG3/Hv99/0sA9wC7ALf/4/5I/xEBjwIfAloA5/7k/jkAZgEz
+AWkAlQDvARIDhQKaAF//BwByARAC3gGwAd4BDwLRATcBqQCXAEEBKwJ1AsYBsAAyALAAdgGiARwB
+xgBSAQECsgGHAJP/s//0ABgC0wG7ADkAnwBIAV8BlgC+/87/xwAaAu8CdQICARsAgwBbAaYBYgHr
+AIQAfQAAAX0BRwHCAM8AXAHBAb4BTwG7AHQAfQCfAOwAeAHmAe0BcwGBALv/2f/HAJIBhwFNAaEB
+NAKJAoECOgLvAZsBJAH2ACcBMwEiAVEBxQEcAsgBqwBi/7v+NP9EAPMAUgG1AbwBCwHP//X+QP/p
+/8v/aP/f/8EA3gD9/+T+g/41/54AoAFaAXMAAwA2ALgA7gB7AOf/zP8uAKoA7gDoAG8Amv89/w0A
+XAHaASAB+v+R/yAA2QDVABYAhv/X/5MAyAAvAFH/G/+X/8T/Qf+z/rH+5f6V/j3+5P4JAH0A8P/X
+/ij+rP60/6P/PP6+/G38pP1D/87/S//F/pb+lv6z/tX+uv5U/pj+7f/CAOP/S/6W/fX9j/6x/pj+
+7f5u/2P/WP7L/K387f59Ae8BfwDT/uv9EP6x/r/+Xv6T/iP/LP/I/kv+5v0R/tH+nP8kAHEATABb
+/+395Pyd/AT9Rf77/70A0f9D/mL9of3O/rX/kv84/3b/KQCcAHwABAAu/07+M/7z/qX/Kv+l/cT8
+bf2I/sX+HP5x/ZP9gv5x/7r/xf8IABwA3/+0/8f/0f9U/2v+Cv7o/mYACAEjAMT+O/6c/lf/6//0
+/7P/zf8OAMD/Rv+6/7wA8AAxAI7/pv8oAI4AbgDH/0f/XP+0/zUAzwCqAIv/iv7b/koA9QDU/1f+
+Dv7V/rn/6f8Z/zL+qP5RAIMBmQE7AYkAev/S/mn/tgAlASUABP9E/28AngBv/4L+Ev+7AAsCxwFM
+ACz/UP/e/7D/IP9P/4QAugHWARgBuwA7AacBKAFqAIkAYwHLAQgB/P9PAAACJAOJAskAJP+y/rj/
+6wAFAbIAFQHsAXACRwKaAUcBfAE/AX0AFQBFAIAAbwBgAI8ABgF4AWIBEwEjAVsBEwGHAM8A+AH+
+AkcD7AKEAjkCfQFDAHb/MgCJAl8ElQMMATb/TP/1AG0CDgK0AKEAEAJHAwwD6AEmAR0BOAElAScB
+bgHFAesBzAE/AVMAAgC2AD4BJAEpAVYBdgHcAZUC6wIKAjUACP+s/z4B7gFpAcYAtQDyALgA9f88
+/wj/hf8CABoAsgAlAlED3wL+AFT/Hv/W/w8A5v+jAGoCxANcA2UBdf/f/mL///9wAA0BtQHhAYAB
+4QAvAHr/3f6b/vn+6f/5AHgBzwBy/4r+iP7F/pv+rf7S/yUBYAHbAEQAX/82/p/9Gv49/0EAmwA1
+AJH/L/8N/8j+Kv6i/ev9MP+xAK8BzAEYATYAoP98/8//QABHAOv/3f9IAGMA2/9M/xT/Hf9W/8z/
+XQCFAB4AyP/I/8n/sv+7/9v/qv8O/27+f/5s/yoACgB3/yT/df/M/z3/Lf7e/Zn+cP+8/4n/6v4v
+/tj9wf2U/ZL9Gf5L/44A2ADY/1D+Qf0F/Vn9uf0L/rD+eP+m/+P+cv0q/Pz77PwQ/sz+TP+9/8//
+O/9s/gH+Iv6u/kj/n//O/8z/hf8p//D+7v7v/rL+ZP5t/tL+K/8d/8H+Z/45/mv+/f51/1v/7f7P
+/v7+H/8V/67+CP6I/W797f1x/hX+Rf3K/J/83/yZ/Sn+V/6g/mb/pAB1AdwAL//e/c/9cv64/j7+
+jv1N/Y/93/0E/mD+5/48/1v/a/+Y/7z/z//9/08AuAC3AO//3/42/v/9KP6r/jL/m//0//3/vP9v
+/0L/hv8lAL4ALAFkAT8BpQDQ/2H/of8jAJsAxwBaAL3/k/+O/zH/7f4u/+H/2ABnAUIBEQHnAGMA
+1f+g/9f/eAAVAeUADACi/+r/BgDA/+j/bgC0APIAaQHwAR0CuwEqAf8AUwGSAXsBNgH0ABMBkwG5
+AQ4BUQA+AJUA9ABFAU0BywAsAB8AoQAxAUwBUAHjAXUCZQLaAUQB/AATAW8BzgEWAlICBgL7ABoA
+zf+C/0v/ZP+e/xwA3ABhAWQBBAGwAKUAygD6AEQBqAHKAZcBhQG8AbkBCgElAOX/OgChAPEAIwFf
+AbYB6wHLAZUBdgFXAWMBrgH0AQoCvQHtAD0ARwDIAC4BawG5ARICbgKTAloCDQLcAbYBhAFZAWEB
+cgF0AXwBZgE/AS8BIgH+ABQBeQGpAdEBRAKFAokCdgIAAkUBtABsAH0A7wAvAcIAQAAaAPz/vf+X
+/8b/JQB2AOYAYAFuATkBEgH+AAcBCgEWATABHgHlALkArACCAEYAUwBdADEATQCPAGkAEADz/xwA
+XgBzAHgAowDEAKYASQDf/67/zf/j/4L/5/6+/gT/EP/R/rz+s/6b/tP+OP9g/1T/Kv8C/xz/Sf8s
+/97+of6m/gr/Vf/3/lL+Cv4z/qn+V//1/0AAQAA+AGsAfwAoAJb/O/8n//X+h/5a/nr+V/75/fj9
+b/7u/j7/av+x/xQAOAAsACYAAACz/2v/Ev+T/jX+KP4P/s79vP0Q/rf+Nf80/wr/Nf91/2n/b/+/
+/8P/c/9W/yr/uv5M/u39wf3D/Zr9Wv0t/Qf9D/1k/dr9OP52/rr+/P4H//T+5P7Y/uL++f70/r3+
+c/45/u/9rv3M/TX+tf4p/0j/M/9C/2b/hf+0/+T/4f/A/9T/8f/I/4X/LP/J/rX+5f7u/sz+EP+E
+/3T/Kv8H/+z+Jv+X/5r/aP9g/0n/Gv8t/2n/Sv8B/wj/Jf8i/zL/Sf8s//7+KP9k/y7/6v4e/3v/
+kP+k/9j/6//6/wQA0P+k/9f/IgA4AAAAlf9t/8L/FQDw/6H/u/8ZAEUATgA4AOf/0f84AHEAUgBX
+AF8AdgCxAKMAYQBwAKUApQCYAKIAlQA7ANz/uv+5/8X/2P8eAJ4A1QCqAG4AMADv/9T/BwBLAFEA
+PAA1ADIANQBMAJ8AIgFiAVMBTwFdATcB6QDYAMYAdQBmAJEAkQDDAFYBlAFhAVYBdAGaAcABoAFP
+ARsBCgH4AN4A6AAZAUsBagFhAWABqAHmAcEBZAE3ATkBKgE6AVYBOQEGAeEAyADAAMcA8wAuAf8A
+pgDlAFIBOQHWAIEAYgCzADkBfgGDAYEBmAHCAYwBxwBVAKwABwHPAGoAXQCKAKYAsQC2AOgAZwHN
+AdgBqQF0AV4BeAG6Ad8BxwGgAZwBogGBAVgBUwFKASYBFgEGAdsA0gD9ADsBUQEdAeYA7gD/AAgB
+EQHYAIIAdwCaAJgAYgAJAKb/fv/o/20AbgBbAE4ADwAMABYA3P+q/4H/gv/p/z4AUQCgAAkB4QB3
+AIIA0ADaAJUAZAB/AKwAqgBjAPr/qP+E/3f/cf9p/1L/ZP/S/00AXQACAJr/d/+b/9T/9/8AAAIA
+9P/J/3//Sf9g/3L/JP/P/u7+Kf8e/y7/g//d//v/1v+7/67/W//2/gP/Vv9v/0j/AP/R/gb/Vv9r
+/5H/wP/b//n/3v+V/3b/Z/8+/zX/TP9L/xP/0v7o/kr/w/8yAIcA3QA+AVkBJwENARMB8ADQAO8A
+CAEDARkBNQEiAfQA5QAVAXgBwQGgAV8BcAGkAcUB6AEfAkAC4AFAAfEA9QAoAVcBVQEYAd4AvgBP
+AL7/fv9T/wr/2/7M/p3+Uv4s/hj+5/22/b397v0H/vT9/f1Q/lL+0P2A/Yr9ef02/Tb9bf1W/Rr9
+G/0p/SL9Fv3s/JD8TPxd/IP8evxg/F78c/yF/Hf8e/yh/Jr8bvx7/ML83Py5/Kz80vwZ/Uj9Jf3x
+/Pr8C/3u/NX80/zi/Pr8//z6/Pb8xfxs/G78/fx+/ab9vP3U/Sb+uv4E/+D+mv48/ur96v3o/aD9
+eP2S/cr9Lf7K/lL/bv98/8//PwCXAKUApADLAPsA+ADVAOUA5gB2ABcARgB9AGwAYQBwAG8AcgCw
+ACQBiwG5AdEB8gEOAiQCKALoAXkBIQHhAMwA6gAUATgBEgHPAOIABgEfAWUBfQFoAbIBBQLVAWQB
++QCzAMgA8wDCAIAAbwBRAEYAewCKABYAuf/q/+7/gf+B/+r/AADu/wUACADf//D/LQABAJf/e/+g
+/7z/zP/W/9f/vP+M/3f/iP+9/+j/zv+q/7n/z/+4/2v/J/8n/1v/nf+y/5P/Zf87/zv/Zv+H/5j/
+qP+N/3//3v85AA0Ajv8Z//T+KP9m/5//6f8PADwAkgClAIoAqwDMAKQAfwCmAP8AbAE/ApQD1ARr
+BX0FlQXpBTYG4QUCBa0ECQVLBVQFeAX6BQoHdgiCCd4JMQrSCkkLPQvZCnsKQwr3CTwJHQgbB4oG
+jgYVB7AHDAhmCDkJVgomC4wLdAvpCnkK6QmTCBwHRAa9BVMFAQW5BNUEagXkBfIFwAWYBaAFzAX4
+BasFmgRjA5MCrwGaAPj/of8e/77+sP6U/n7+yP4W///+jf77/ZD9Nf2Z/N/7YvsW+7z6WvoG+rj5
+dPlF+Sr5B/nU+Kj4dvgt+Oz3v/eY95H3evcv9+P2gPb99b/14/Xs9WP1wPSu9LX0cPRW9Gr0a/S3
+9Gj1DPZ09tP2aPc1+Lj4qfiH+GP47feV98P3Q/im+N/4Y/kR+o/6/vp9+0n8Uf3z/S/+nf4g/17/
+S/8I//b+EP8A/6n+Uv59/ir/0/9SACEBLgLlAmQD7wMxBAEErwNvA0IDKQMUA/oCGQOKA+oDBQTp
+A5sDbgPIAywEFwQYBFEENAQBBCIEJwTbA1MDngIhAtIBcgE7ATIBCwHkANEAygDIAHQA9P+4/8b/
+DQB8ALgAhwAqAN7/1v/9/6T/z/5E/jP+Lf4A/q/9OP2o/EP8avzT/Nn8a/wR/C38cfxp/P77gvtI
++2L7nvu1+6j7p/uz+5X7ePu2++T7kvtn+9H7Ivz7+7H7evtV+137rfsY/H382fw8/aP91P3A/cD9
+EP6E/vr+dP/Q/9z/y//+/y8AEQANADgAOwBaAN8AhgH9AUkCgAKnAtoC3QK/AukCUgPMAwYEEgRk
+BMIE2wTmBPgEGgVxBfYFZwaJBoIGqwYcB9YHpwgBCbII/wc9B/cGUweYB2wHOAcFB7oG2wasB3QI
+xAjQCLQIsggDCVoJOAlBCJAG6wQzBGsEtwR4BJADZwL1Ab4CLAQVBf0EdwT7A64D2AMjBNIDCAMe
+AgYBGQC4/6X/iv9J/8T+T/6h/n3/2v9l/4X+Cf5n/hD/Pv+k/qf9z/w0/Oj7B/xI/Fv8KPye+xb7
+Bvte+7L7mfv++k/6I/pZ+lv6M/oH+t35IPrA+g775vq7+tv6Nvtl+1X7evuq+3r7APuc+qX6Dvub
++zv8yvwD/ef8x/zO/Pv8Hf0W/SX9QP07/Vb9kf2+/Qb+U/54/rn+B/8Q/xX/N/8i/x7/fP+g/0f/
+0f6T/p7+tf7y/oH/EAA/AEEAVwBsAIYAfQBCABUAEgAxAEIAAQCD/1b/jf98/xv/zf64/vz+O//0
+/rT+Mv+q/2b/A//6/v/+vP5g/i/+B/7L/aD9k/1s/Sb9Ff05/XP9tv2t/UT95fzu/D/9a/1I/f78
+8/wz/Sv9oPwN/BL8m/wo/YX9jP0y/aT8QPwO/PD7Jfyx/Cb9Rf1h/bz9CP4t/nP+jf4k/sz93/20
+/Sr9BP0+/av9kP6c/7kAKAIpAzUDIQOPAycEgARrBMoDBAPdAlsDBgSuBEIF2AWeBqoHyQjnCeAK
+Jgv3ChQLawteC5sKbwmICDMIPAiICPQIOwmECREK9woYDAANbg1iDdYM9AsICxoKLwmkCKMInwgz
+CNgH0wfiBzMI1AgVCd0IqwhFCGwHmAb+BW0F1QQGBBcDZAK6AeQANADr//n/QgCPAGoAm/+Y/hL+
+9f20/Sr9cvzK+3z7Qfu7+g36lfli+Tf5EvkV+Q/52/h2+Aj4v/eV96P3xve596f3yPfj98/35Pcr
++E34Nfjq95z3g/dm9yf3Kfdw96v36fc4+Gz4mPgY+df5WPqV+pH6Ofrn+ef5Nfqo+h37fvsD/Lv8
+NP2H/ST+9/6k/wAASwCqAM8AzAAPAWoBpAEDAoACswKiAqwCEwO9A08EywRgBcYF+wVQBoIGRwbj
+BaoFtgXkBQYGIQYcBukFCgaZBuQGywauBnkGHwblBaEFSAUeBQEFBAUeBbQE+wPmAxUEqQMCA4YC
+DAKtAWgBDQGsAGgAagBeANr/QP81/4X/eP8m/yT/V/8g/33+O/5s/k/+5/29/br9qP2a/V392/xU
+/Mb7Kfud+kX6IPoN+vP5wvmS+Y35r/m4+Yr5WPlG+Un5ePnE+dv5z/nU+en5GPon+tH5kPnO+RH6
+VPr1+lD77/qh+gn7uPsY/C38TPy7/Gz97/0U/i3+Y/7P/lr/p//K/z8A7wBLAU4BPQEkAegAqwDC
+AAwBNgE+ASUBBAFOAQoCgQKqAhMDpwM7BEYFyQaoB1EHZAbKBS8GNwd0BxsGUgTrA7MEBgWzBLAE
+eAXABogHeAd+BxwIewiQB9IFswTtBMgF0wVMBAYCDAETAmsDwwOOA00D4AKOAoUCbAIJAj8BYQCO
+/2f+kf3D/Rz+mP2v/Gr82vyO/eT9Xf2e/H784/wW/br8MPzA+zD7k/oX+rD5sPkG+v/5efkQ+Rn5
+R/l4+ZH5gPl9+Y75zPk4+m76b/q/+jT7Hvu2+n76ZPpz+nn6QPpD+qf66/qg+uD5gfnD+TT6/frZ
++/X7zPsh/I/88fyI/Qb+Tf5v/kP+D/7r/bP9nP2c/ZP93f2K/kP/6P9lANYAcwEvArUCmgILAq4B
+vAHDAXcBJQH+AOAA2AAWAV8BhQHGAS0CbgJzAoICiwJCAgMCJwJdAmgCUgIMAn0BBwEoAZQBvAHE
+ASECtgIVA+kCHQJsAY8BvwE0AZsAhgCuAJ8ACgBg/1v/vf8JAD0AFgCh/2D/XP8x/73+of4a/zf/
+wP6H/qr+vP7B/tj+DP9N/y//qP5b/pb+8v4b/zL/Vf+B/9L/BwC7/07/Qf9n/4z/0v8RAPr/q/+Q
+/9n/PwBzAIUAkwChAPQAWwEqAbkAywAgAUQBXgG8AQIC7QFCAhUDCQSLBRoHewcZB0sHRAg6CTkJ
+EQjVBpkG3warBnUGPAfbCIQKmAsCDFgMLg0MDhkOlA1WDZENpg3iDEILown5CEcJxgkoCocK1gp3
+C5sMrg0/DmAOMA6lDb8MVgt+CQ4IbQcKB2wGxAWCBa8F0gV3BfYEIgXIBfoFcQWNBL8DGgM7At0A
+a/9R/nX9pvzm+1r7Svu2+x78Vvxr/CX8fPu1+iH6uvko+YP4A/ie9z/3wfYj9qz1tPUB9gT21vXA
+9bX1efX19K/0BvWN9ar1PvW19G70fvTU9Eb1k/Wr9Qj2mva59nj2WPZ29qn28/Zv9xr4u/gQ+U/5
+t/lL+vn6c/tb+8j6Pvoy+qD62frZ+jn7yftb/Bz93P2h/oz/PQC3AE8BnQFtAVcBdgFhAUUBawF6
+AU4BTgGYAeABRgIcAzAEAgVcBYQFwwX1Bb0FFwWJBEoE/QOtA38DEwN0AjUCZQKhAtACCAMtA0ED
+MgPLAlECBQLTAX0B8wBtAOj/b/8q/+r+qf6F/i7+nv08/fT8jfwr/MP7Rvvh+pf6Rfrz+aP5c/mc
++bH5WPkN+RH5FvnK+Fv4RPhL+CL4QPib+MX43vgB+Sn5UPlH+R35BvkE+fz4/vgn+Vf5hPnJ+fL5
+zfmS+Xb5x/mk+nD7vPvZ+zH81fxl/ZP9jf2h/fT9iP5H/8//2v/d/zIAowAEAX0BEwJVAnwCUQMV
+BN4DuQNLBOAESQWkBdcFEwZCBuoFgwUFBvwGVgfkBiQGtwX5BZAGgQaaBT0FPQYlB9sGeAYpB64I
+mQkKCTAIXQgFCdkIkwdWBiIGUwa7BXEEwwNgBHMFFAZXBq0GOAebB0kHTgZSBeIEygRDBBUDqQFY
+AIz/jf/8/1MApgAsAZYBrgGWAR0BQwCa/w3/A/61/O77dfud+rz5oflH+vr6Uvta+4L7F/yq/O78
+B/33/O/8KP0Y/WL8kfsz+zX7Vful+xT8Tfxk/Mv8VP11/XT9zv1H/on+hv4//vv9Fv5z/sL+0v7M
+/hz/uv8tAFoAiQC6AN0A2wBxAMv/pf8gAIAAXQA9AJ0AKAFSAQwB6wBDAZ4BtwHMAdsBzgHQAcIB
+ewElAfcAKgFCAcgAaQCEAKUAoAClAJ4AaABKAGQAfwCvAO0A1gCnAPAAeAGjAVkB8ACSAEYAKADt
+/1T/uP5e/kf+Kf7W/cb9Ov68/uX+zP7h/ir/Mf/V/lX+Gf4h/sT99fxn/GP8pPy+/JT8Vfxh/C/9
+S/6E/t/9if2w/dP95v22/SH9tPzT/Cb9Vv1E/TD9qv1M/jD+9v2y/qv/sv8S/+n+d/8IABwAqv8v
+/zb/gv+e/57/5/9rANYAKAF1AbwBzQGnAYABXwF1Ae4BaQJjAh0CLwKEAn0CFwIWAoUCpgKeAuYC
+RgNUAxYD/wIMA+wC4QLjAo4CUAKiAv0COQPpA+0EoQX/BVMG7wbVBzAIhgd9BsEFdAVlBWYFzAX4
+Bl8IDgnrCNQIdQlWCnMKywlYCXIJlwkVCd0HswYBBpUFjwXtBRAGAwZgBgQHmgcqCJ8IxQiSCOAH
+lgYUBfwDgQMCA/8BDAHVACQBfgFFAXMAJQCzABQBtQD5/0//5/52/ov9YPx0+5j6sfkX+b74qvj3
++Hn5B/oU+ob5I/k6+TT5qvgG+H73IvcU9wv30/bC9jf36fck+OD3o/eV94r3X/cr9zb3hvcD+Hf4
+kPhw+ID4nfio+Pj4hPkO+rr6bPvF+8z7xPvc+xH8N/xO/Jv8Nv3G/Sb+nf5O/wgAtABZAasBewE6
+AU8BagFcAXUBjwGWAdABKAKIAv0CRQNfA7kDMgRkBHIEiQSSBJIEtQTFBGYE4gOeA40DlgPdA2EE
+yQTvBPEEwQR9BFsEGQSZAywD3AKKAj0C7AF8AfEAhwB6AHsALwDQ/3D/Ev8F/yX//f6B/uf9WP3/
+/KD86/td+2L7vfsF/Pr7mvs/+1f7hPtc+zz7Rvsq+9f6e/ov+vf5uPlT+Tr5ofkC+kL6oPr7+gX7
++/pG+8n7JPxd/NH8Y/2y/dn99f3n/bL9lv3u/av+Sv+Z//P/awDNACIBTAE0AQgB8QAcAV0BmgHh
+AewB2gEnAqMC0gL3AloDvQMmBJ0E0ATzBFsFmgVRBQMFAgXgBKMEogSKBDkEKQRaBHUEjQTBBNgE
+qARPBCAEWwSTBDIEfwM/A6IDPQTKBEkFjQVoBREFagSCAxkDAQONAvIBVgGXAAwAGQB6AMgABwH/
+ANsAWQEjAlACzAEEATsAnf9X/zT/n/6B/XD81fvg+3T8/vwu/Qr9w/yb/Lv8B/0O/b78Xfz7+4n7
+Rvt7+8n7pPtG+037nfvb+wD88/u8+4/7jvvg+1X8gPxn/Hf8sfzd/B39cv2N/X79of0Q/mf+cv6N
+/sz+7f7Q/mv+FP4c/lb+qP4b/37/lf+v/xwAfwB8ADMA9v/d/+n/HgAZAKX/QP9D/5r/BAAxACEA
+KgBIAB0Apv9D/0r/i/98/yr/2P5n/rj9D/3u/Aj9wvyM/H/8T/yM/BT9Jv3//O38/vwr/f38bfwl
+/FH8f/yE/JL8wfza/M384PwJ/f38zPy3/Nn8Ev0i/Qb9Cv00/Sj9AP0i/Wf9iP2a/b79Cv58/vL+
+L/8a/9n+fP4D/sn9FP6W/s/+sf61/hn/q/8xAHwAswAoAb4BCwL5AeQB/wH4AaMBYAE/AfUA1gDz
+ANIAtAAKAbgBdwLpAs8CoAIGA58DvANwAxED5QLdAsMCiAIeAscB1wHtAc0B3gEVAiwCOQI5AkAC
+pQJSA6YDdQMdA+kCDgMjA5MC3QG0AQUCKwLEAUkBMwFnAY0BbgFbAdIBcAJvAvUBzwENAjICUwJx
+AlECpgIVBNMF5AZRB00HVAcECOsIGwl5CM4Hwgf0B80HtwdmCGoJ0QmlCcIJuwoODLIMgwxNDI8M
+Hw1RDZgMaQtoCtUJpAlQCaoIKggWCB4IEQhcCO0IGAm9CCIIVgeQBkIGIAaXBasEwgNdA3gDUQNO
+AgsBeABzADMAkf/d/kT+0f1j/aL8tvtO+yL7gfrG+WD5Q/mA+bj5pPmJ+UL51Ph0+Kn3b/al9ZD1
+pvWK9S711vT79Lv1qfZD97D3avhG+cf59/kj+kf6UvpN+i36OfqH+pT6fvrF+j37u/t6/Gr9Sf4G
+/83/vwBvAWcB9QCrALMA5AD9AAcBSwGuAfcBHwJCAn8CsgKoApcCggJSAmMCxQIDA94CmgKRAtEC
+CgMLAxcDIQMBA+EC2AKXAvQBVAHnAGgAv/82/+3+p/6Z/gD/bf+E/37/dv8v/6f+E/6O/Qv9jvwf
+/JX7F/vn+rb6VPoG+t35hPnp+I/46fjN+YT6M/r3+B34nPic+XL5GfgJ9zL3TvhO+Vr5xPhJ+Ef4
+r/hH+dv55/mJ+bn5YPqG+j76MfqI+lT7APwI/CX83fyr/Sf+X/51/r/+lf+9AGYBNwETAYsBHAJ5
+ArICuAKbApgC1AIbA0QDUwNrA7MD6AP6AycEPwT3A3QDPAONAw8EMwThA4oDTwP1AqICcgI1AuIB
+7gG/AnwD9AKlAQUBNAE3AZ8AwP8G/3/+Cf70/X7+L/9O/4/+oP2R/Vr+B//6/kX+kv2u/Sr+8P1A
+/e/8rvzf+zz7EPzq/eD+lf40/iv+c/4w//v/IAB8/3P+wf0e/mX/igD3AMcAZAC0AOsB1AJ6AnsB
+AwFMAeMBhQIFAxcDgALIAacB+wFJAnICWgLdAWMBkgFIAuACJQMKA2YClQFWAaQByAGZAWYBSAFv
+AbwBfQHaAHcABwB1/1//rf/r/y4AagBOAPv/5P8uAH0AgwByAHsAZgA2AGAA3AAfAbUAu//w/rP+
+kf6B/tT+Hf8Y/zX/mP/m/6r/3P4z/kP+wv4x/3X/nv+u/5j/dv93/4P/hf9u/y//+f7P/rb+qP5m
+/vn9z/0B/vT9of3n/ab+6P7m/kn/1v8/AIEAhQBPAA8A3//O/7T/Jf9l/vH9pv2J/cr9ZP4I/0r/
+k/9kACoBWwEzASkBYAGeAcAB1wHQAXgBAAGnAG0AfgDGAOkA2wC8AM0AGgFGAScB/AAvAYUBVgG6
+AG4AiQCQAIQAmwC3AJ8AYwBvANsAHQHOAJIA8AA5AfQAsADQAPIA9wApAUkBHgHqAMkAuQCtAKEA
+wgAXAUIBHwEkAXwBpwFmATgBfgG+AaMBfgFNAfEAvQDsADoBSAEyAToBRgFtAdcBJwIdAtsBrAHU
+AS0CMAKeAdgAPAD9/1UAGgGTAWcB2QCEAMUAUAGKASoBkwBFADYANABPAJ8AHgESAqIDNQVPBhEH
+dweZB+sHfAgDCToJ0QjoB0QHQAdaBzoHPAeUBw4IggjbCCsJkQkFCkwKUQpoCpgKTApcCSUI5Ab2
+Ba8FoAUzBYgEzgMuAwkDDgN8AncBtABdAAMAaP/Q/kn+n/0O/Q39V/1H/bP8x/vu+pj6zfrk+mb6
+hPmX+Nr3Z/cm96n2APac9XX1lPUT9nz2hfad9vP2Zffz90r4HfjX99T3+fdr+Br5b/lU+Uz5rPk7
++pH6vPr++lT7tfsz/Mr8f/00/pz+1v5V/wEApAA7AXsBbAGjAS0CpQIAA00DZQMdA6ICSgIJAsoB
+xgH1AQsCGAIzAjwCAQJyAe4AwQCyAG8A8P9b/x7/WP9m/wv/yP6+/rz+hP4E/pT9R/3b/IL8dfxM
+/Lv7Ffu6+oX6O/oX+iT6HPo6+qL69fow+5j77fvm+7D7jfuJ+477ofuc+2L7UfuK+7f75/st/EP8
+XPy0/Az9Xf2+/S7+kP72/pz/KAA0AA8A+//y/xMAPABDAGgAxgAjAU0BKgE2AfABfgIxAucB9gHZ
+AcgB9wEzAmICTQIxAnACiwIqAtMB9AFeArgC8wIdAzgDMQMoAxYDwgJ0Al0CUgJPAjYC4AGMAVUB
+EgHbAMIAjABOACMA4v+f/3T/Qf8w/23/qv+6/43/9P49/t792v0n/n3+hv5w/nf+mP7s/nL/uP9t
+//T+8f4e/yb/vv+9ACMBbgEqAl0C6AHFAQ8ClQKzA40FcAc3CJAHmgZ7BgwHtAf+B3YHOgYtBeYE
+/AQCBUIFfgXhBB8EoQTPBfQFpgT1AvkBGAJAA5oE4AShA44Bp/+n/vz+NADrAFIAI/9Y/uP9W/3c
+/J/8cfwN/Oj7bvz9/Nv8R/zn+/77k/yP/YT+x/5Q/qn9xfzb+9/7yPyn/QP+u/0a/ZP8Kvwr/K78
+Ff0w/XD9wP28/eb9hP7c/qX+mf40/8f/o/84/x3/LP9C/5j/HQBwAEgAu//3/h/+qP29/cz9u/0L
+/qn+yv4t/o79PP2u/BH8JfzM/Gn9jf0t/av8Vfxb/Lv86fyQ/BX8xPtx+wP73/pG+5f7evu4+2z8
+uvyN/H38p/wX/f79sP66/rn+1v7F/m/+sf3r/NP8O/1o/a39eP7v/pn+Y/77/uj/cAB1ADUA0f9w
+/1L/VP9M/1f/Yf9T/2n/wP/4/7T/Xv+A/wYAvgCWAS8CGwKoAW4BZgFVAVsBlAGvAXUBRgGRASYC
+QwLKAWcBFgGBAFsAIAGeAQIBYABlAIMAcABYADwAyv8Q/7X+B/9E//D+yf4d/0L/LP+K/y4AXwBP
+AG4AhQBxAH4AjQAzAMD/oP/A//P/NgBwAIsAtQABAWMByAEUAiwCIwL+AaYBSQEOAQwBSAFdAU0B
+YAGUAQ4CwQJBA3ADWAMYAwkDjgPkBIwGygebCEcJiQmVCWYKpgs7DDwMCAzVC0AM/AxGDUEN8Axj
+DBAM/QvZC4QLKwvDCkEKHgp6Cp4KCQowCYcI8wdYB8IGQgbfBX0F9gRgBOIDWQORAmcBKwBu/yz/
+C/+v/ub98vwx/Jn7KPvc+nH60fkk+bD4n/jY+Cr5jPnt+f/57vkf+kv6NvpL+pL6x/ob+4/7ovtm
++1P7YvuA+7D7+/tz/OL8S/34/cz+cf/z/5UARQHEARICKwIOAhACaALwAl4DmwO7A9wDPgSQBFcE
+1gN6A2EDagNwA4EDdwMDA2UC6wFsAdwAhABpAD8A2P9W/wb/4/6i/j3+AP7k/Yz9Ef27/Hr8T/wc
+/L77X/sf++r6hPrY+Tz5DPkK+bb4OfgX+Gn4+viQ+fX5N/pd+nz64fpH+0D7H/te+9b7Dfwo/Kr8
+P/2B/c79Rv6V/sX+Cf9r/+b/TACKAJEAfwCbALoA1gAkAXUBtAHaAb0BoQHPAQACBAIWAjICOwJP
+AksCFAIHAiIC/wGjAQ4BOACE/wv/mv5A/uX9df0b/eX8FP1x/T79z/yI/Aj8nvuj+6X7avsT+8/6
+0vri+qD6U/pP+on63voq+3H7iPt6+8n7dPwS/YL9tv2x/bf96f1D/rL+3f5z/pb99vw3/Qr+y/4T
+/+D+5v6F/00A3AAZATgBXgF0AZQB8gFKAmMCMgLTAbwB9wFCAr8CPgNCA80CLQKMATUB6gHTA5UF
+JwbhBU8FzATLBMIFJgeuB9gGOwUfBDkEzAQKBa4EsQOaAiYCPgLZAXAAhf6d/A/7gPpU+578+/zf
+++H5V/hA+Dv5fvqL+/D7+/v/+7f7UftD+3z7fPs3+0P78Pus/NT8p/ye/NX8dv2M/rD/jQDuAKoA
+IQDK/8b/XwCbAaUCvAJJAhsCMQIVAq4BYgGLAd8BzwE+AaEAPQDU/0b/0f6l/sr+Gv85/+3+e/44
+/uP9Mv3M/Cv9l/18/T/9Mf0m/Qj92vyy/L/8CP1q/WT9gfxg+xj7mfsZ/ID87Pwx/UT9P/1i/er9
+j/76/iz/PP9A/3P/1//t/6n/bf9S/0b/Sf99/+T/NQBZAFYAEAAAAJ0ARAGMAeABHQLrAboB1AH0
+AQUC+gHFAYcBSQEcAfMAhwAwAGgAxgDnABUBnQFvAiMDRQMEA/kCQgOWA54DSwMwA1sDNwO1AiYC
+wAGgAesBRwI5At8BmwGsAQMCVgJDAtMBVgHVAFEA5P/V//X/sP9X/3P/vP8JAJwAbQGyASkBBwHp
+AasCcwLiAXABIwE5AXwBsAHtAdoBiwGWAeABTgLtAnEDtgPfAxcEXQSHBGUEDQTFA6YDnwONA0YD
+xgIvAsMBsgHbAQQC+gGwAXoBtAE/AqgChgIUAvABJwKDArsCaALuAe0BPAIGA6AEdQa+B0kImggl
+CbMJUQofC7gL6AvSC7ILlwuyCyYMPQycC9oKXAofChcKCgqyCQAJOgiqB1EH6AYTBvwEBQQQA0MC
+8QG+AVIB4gCkAFcAx/9J//n+lP4a/qf9R/38/Mj8mvwm/Gf7r/ot+gH64/lw+ev4s/i6+NP44/jN
++JL4iPjO+AP5Dfko+Wr5tPnt+R76Rvqo+jn7bftn+5/7IPz1/NH9Kv5O/qr+5v7y/hP/IP8O/xH/
+If8//4P/o/+E/4b/mP+R/63/8v/t/3r/Kf8+/2H/Vf8l/xf/QP9c/zr/3/6e/ov+cv5Q/in+Df7u
+/Y39x/zx+6H7wfup+y/7s/pt+h76ufmn+fH5M/oY+sz5pfmY+Zf5ivlb+V/5qPns+R36Zfqm+qD6
+v/pA+5f7ovvE+w/8cvwT/d39c/6P/m7+nf4P/zf/Df8Y/1r/Y/8//17/of+1/87/7P/f//r/aADE
+APMAGgEVAekAywCsAFoACADn/8P/kf9o/yr/uv5s/oP+tv7O/tX+z/62/oH+Pv73/cX9v/2u/Vr9
+0fxI/Bf8SfyI/K38wPyS/C78bPxf/QD+F/70/Z/9bf17/ZT9vP24/ZX9u/35/SL+sP6m/18AlQCo
+APgAYAG+AU4C1AK8Ak8CQwK+AnADxQNgA88C0wKBA2cE+AQMBfcECQUnBSAFCgUzBWYFEgVhBN0D
+EgRLBdcGtgeHB30GVQX7BL4F7gZcB6QGagUzBKcDWARHBRYFTgTgA3oDBAPAAlQCkgG7AAIAhv+B
+/9z/KAD//wD/m/3c/OD8FP1v/d/90f0F/d37AfvP+h/7tPtt/Bb9xv14/sr+y/7G/sT+8v5l/7L/
+6v9LAJUAlABKAAkAPgDqAMUBewL0Aj4DSgMqA/QCqAJuAmcCewJqAggCmAFWAfkAXADs//H/JQA1
+ABYA0P9E/5b+Cv6Q/S39If1N/WP9b/2D/Zb9f/32/FL8aPz+/Bz90vy1/KP8c/yB/OT8JP0W/Sr9
+d/2w/Sf+0/75/sn+mv5g/nj+5P46/3v/xf/f/6j/YP8u/x7/Zv/w/ygAGAAVABAAHgBIAFwAXQBv
+AEoAvv9c/1T/Yv+G/6j/lP9U/0X/T/9Q/8P/PwADAK3/xv/x/y4AkQClAC4Afv8G/+b+wP5g/if+
+Uf6m/t7+BP87/2f/p/8bAJ0ABQEPAagAHwDO/73/t/+t/43/I/+n/oX+k/6c/rb+uv59/k/+gv4K
+/7X/HQAJAMj/rP+Z/4D/qv/r/9b/gf8h/+7+EP9U/3f/nf/w/xEANADwAKEBmQFpAW8BeQG2ATYC
+SALhAZwBbgEmAeEAngB+AKsA5gDjAJwAUgAyACIALgBaAJ8A4gDyANQAkQBSADUAKABOANEArgEO
+A9sEWAY4B3cHUQeqB9EIEwrECuEK8wpGC/YLHQ1NDgEPBg9XDmQN3wzrDK0Megv2CewIdwg4CLMH
+vgZYBcgDmAK7AQoBlAALAFL/mP69/eP8afwS/JH7GvvK+q36HPvt+2L8O/zg+5H7Kvvl+jr7sfuW
++zj7D/sI+zL7f/uL+zb70vq0+tD66foU+2X7svvV++L7DPxU/MT8Y/3m/Tf+p/44/7j/EwBlAMkA
+OgGrARYCfgLqAm8D6wMwBHgE0wT3BP4E7wSiBEwE7QNVA6UC3AEdAaAAIwDB/77/pv8v/6L+Mv7Y
+/Wj94vx0/Ar8hvtD+4D7tPuh+6/7z/u4+3b7Kfs2+7H7Kvxx/Kz88PwA/bL8Svz4+9z7Gfx2/Jb8
+hPyL/JT8i/yN/Hr8WfxF/Cz8Ufz2/Kv9EP45/jz+TP6D/uT+Tf9c/y3/cf8+AOIAJAFYAZMB+QGn
+AkwDsAPbA/ADCAQgBAgEoAMnA6kC8gErAbQAdAAXALz/s/+4/4X/Xf9K/yL/9P7N/qL+b/47/v/9
+vf2i/cv95/2y/X79nf3e/e39zv2+/c/93v3l/Rf+af6U/pz+iv5M/hD+4P2I/Tn9WP2Y/bX9xv15
+/f78IP2T/dT9Tf76/kr/i/8kAJsAsgB4ABMAFABwAKcA4QBuAdkByQGyAfsBpAJdA/UDUgRTBEEE
+PQTzA3MD+gJ8AhgC9wH3AeQBwAGgAXMBQQETAcYAXAAAALH/Uf/5/s7+xf6v/of+e/6Z/rr+Lv98
+AEECnAP8A2IDkAJuAhUD0AMUBLQD5QJvAsYCaAOrA40DWwP/AqACjwJtAtsB3AC0/x7/Zf+7/4X/
+Ff+H/q393/x2/Er8Gvzr++r73fti+576EvoK+lv6uPoh+8j7pvxi/b39q/14/Zn97v0+/qP+Lf/W
+/1sAaQAlABUAWACLALQADgFQAU8BFwGcAPL/PP+u/lT+PP6T/jL/lv9X/8f+gP48/q/9ef2o/aD9
+dP0z/Z78Afyh+2j7cvua+677CPyp/Nj8UPzD+477Qfvp+hD7nvv++1D84vxi/aH9rP17/R797fwa
+/VL9ev2j/bf98f13/v7+X/+i/87/+f8aABUABAAbAG0A4QBHAZsBxQGeAXIBbwF5AYkBZgEMAc8A
+qwB1AEsAKQDN/3X/Wv/5/pP+tv45/+D/dgDKAOoA7gDGAMEAEQERAZUAUQCFALsA2QA+Aa8BygEB
+Ap4CGAMlAxQD6QKwAqQCogKUAqQCsAJ8AlwCmQKrAk4CBALrAbcBiQGkAegB+QGgAUQBTgFDAcIA
+SwBVALoA+gAMAQ8B4QDNADABwAEMAhEC/QEVAnACxALyAvwC2wLmAi4DYQOWA80D1gPJA6YDSwPo
+AtMCDAM4AywDEQPyArACUwIgAhgC4AFuAeQAaAA/AIUACwF2AX0BPAE8AcsBkgIlA30D8wPPBMwF
+hgb7Bj8HdAfoB5QIRQn3CXQKowqmCrAKNAs+DB8NTw0GDcIMrAyVDBQMDQvdCfYItgivCDoIagc/
+Bs8ElgOBAlsBqQB2ACYAsP8M/zv+nf0y/aL84/sz++T65/ra+gH7gfu9+3f7I/v/+vn6OvuC+277
+W/uu+0D8n/yE/Cb81/uG+yD7+voo+2P7ivu5+/L79fvH+5P7Z/ts+5z7x/sN/HX8wPwH/Wb9hP1d
+/Wb9kf3l/Zz+PP98/8X/QACRAK8A0gDcAOwAMAF+AaoBnQFgARMB7AC+ACMAiP9H//P+UP7B/Zf9
+bv0G/aH8Ffx0+xP7yfqQ+mz6EfqW+VH5LfkO+Rf5LPkk+UT5rPkX+n762vrw+tn6zfrO+vj6QfuQ
++/r7cPzO/AL9A/3K/JX8nfzR/Bz9X/1c/SD9E/0+/Tn98fyg/HD8ifz+/JX9F/5z/pD+l/68/rT+
+Y/5I/pH+4v4d/3P/2/8UAEEAlADFAKIAqgD7ABsBDQHuALQAigBoADoA8/+d/1j/MP8b/+n+bf7f
+/aH9hP07/Rj9Gf35/OX82vyR/DD8A/zx+/X7Lvxb/GL8gPzH/A/9Kf0F/cX8zvxY/f/9Sv55/sf+
+Av80/1b/Rv89/zn/MP+f/0kAcgBmALIACwESAQwBPgGNAe4BcQLFAq8CiwKNAoECVwIjAtcBhQF1
+AcYBOwJ/ApACtQIAAyYDHgMoAy0DHQMjAz0DcQOrA98DVgTmBAcFsQQmBLUD6gPlBPEFdQZSBngF
+fAQjBB8E1AN/A68D8AOBA48CgwGmAA4Alv9M/3D/EADLABABWAC8/jn9jfyK/IX8VPw5/Bz8yvtv
++y/7+PoH+3z7A/zS/DL+lf9iAIoARwAKADcA7ADpAcgCUwOUA8MD7QP3AwgEQQRmBFIEFwT4A0IE
+rQSZBOYDLgPsAqQC3wEjAeMA3wDFAGUAwf8D/3n+Yf5E/rr9R/1W/X39S/3q/J/8efx0/KH82PzR
+/Kn8pPz5/IH93f04/oj+Pv7C/Qr++f6Z/4r/ZP9p/2v/jv/L/8T/cP8o/y3/d//Q////GABbAKwA
+ugB3ABUAv/+W/9b/WgC6ABABlAEIAjECDwK6AWIBLwEJAdAAjQB1AKgA1ADAAKAAdAAcAND/3P8a
+AFYAqgDeAK4AYAAlAAkAAQDZ/63/u/+v/1j/LP9C/1j/dv/F/y4AVABHAIQABwF4AcIB8QEUAjcC
+RAI/Ak4CSALdATcB1QC9AK8AqQCvAJwAgwCmAOkA6AC7AKEAgQBZAF8AmACOABUAnf9t/3f/gv9t
+/1T/Z/+V/4//cP/T/68AKAHnAIIAiQDoACUBFgH3AAgBMwFeAY0BhAEyAeUA0gDTAKsAZAATAKn/
+IP+k/mj+Wf5E/gj+qP1T/Sf9Mf12/cX97P0O/mn+9P5j/4v/mv/U/2MASwFAAvMCewMSBMIEiwVi
+Bg4HkQdHCAwJkAlFCl0LIgxbDGQMQAzzC5cL7gr/CUsJMQlDCe4IZQi2B7kGxQXzBOADtALHAecA
+LwCF/2v+S/2o/Cn8XPt3+uj5q/mC+Wr5lfnL+cT5pfl4+Vj5bPmS+df5WfrP+hb7Yvuu+8r7x/vM
++8r7svu1++b7M/x//KT8kvxd/Bv83fvN+8b7gPtF+1r7f/uQ+577evs0+yv7PPtM+7r7YfzF/Bb9
+hv3R/R/+m/4H/13/rP8KAJ4AOgGfAfsBjgL/Ah4DUAN4A1gDLQMeAzgDUANPA1YDJQO8Am4CFQKW
+ASYB3ACQACsAx/9K/6H+E/6O/QD9vPyv/Jj8e/xi/Fb8VPxK/FH8j/zq/En9q/3v/QP++P31/Rv+
+Xv6a/q3+tv72/i7/Mf91/9H/zP/F/93/tf+N/7D/1//b/8v/w//O/8X/Zv/e/qX+qv6b/nT+ev6p
+/q7+p/7Q/g3/Pv+P//H/PACRAM8A9wBUAd0BQQJlApAC4gI1A0wDEwPUAtcCCQMWA/kC5QLDAp4C
+pAK5AogC/AFfAQcB3gCIAO7/Pf/0/hX/Bf+z/kz+4v3u/U/+Uf4M/tn9rP2i/bv9u/2T/YD9qP3u
+/Tj+Y/6T/v/+dP/I/xkAhwD3ADQBjAEwAq4C6gIcA08DhgOaA1MD+ALiAu4CLwPzA9gEHAWYBM0D
+MQMuA9oDlQTsBOgEoASEBOoEdQXTBQEG/AXqBdMFhgUABWoE6AOPA50DEgSFBHMEcQO1AT8Avv+1
+/2L/yf4y/pL9BP17/J/7w/pJ+j36mPrv+gb7D/sm+wL7cPrA+Tj5y/iK+LT4SvkL+rH6Eftd+8f7
+KfyL/PX8Zv31/bn+of9IAJQAwADfAPEACgFNAYsBbwE0AewAQwB8/yX/Lf8m/xb/F/8s/2D/O/9y
+/nj9m/wR/PT7/fvu+6/7L/vH+q36iPpx+pr6tfrI+gz7R/tj+4v7kft0+5L70PsI/ID8Gf1x/ZT9
+v/3k/e79Cf5S/oj+gv57/ob+ev57/pL+b/5A/mb+rv62/nz+Ov4U/u79sP12/Vv9dP22/Qb+b/7y
+/mP/o/8DAJQA6wDnALEAigB8AGQAKwDW/5//lf+V/67/7P8iAFQApQDzABIBJAE7AUgBbAGiAZYB
+SAH4ALUAhQBJAN7/k/+5/9n/qf+w//D//v8DAIEATgGyAbIBvwGvAX0BVgEsAS8BZgFuASQBxACV
+AJUAjAB3AHoAxgBdAe8BPwItArUBUgFjAXQBSwFKAVsBSAE2ATQBUQF9AbAB6QH9AfoB6AHhATQC
+cQITAqkBrAG0AakBxgHwARkCKwIMAu0BwQFtAUoBgAG1AcEB6QEmAi0CBAIYAosCGgPdA7QEGgUt
+BTAFKQWCBWQGaQdlCE4JJArpCm0LxAsiDIYM4AwvDWkNeg1nDVUNQg04DYMNGQ5wDjcOjQ2hDLwL
++wosClIJiwihB4MGgwWZBKoDCQOdAr4BfABc/3z+6f2w/W/9yfz4+zX7hvr0+VD5pvht+Kz47Pgo
++bX5Qfol+rD5yvlN+pD6wvos+377pvv7+1r8d/x0/Jn8zPzO/LL8wvwL/UL9Yv2O/bL9sv2Q/W79
+Qf3g/Hf8cPy5/PL8Ff0i/R/9Pv2Q/dv9+v0O/iX+Y/7A/gv/Yf/E/9v/tf/I/wEAPgCdAPYATwGx
+AekBIwJ3AqMCogKuAsUCwAK7AqoCNwKNAT4BTwE5AfMA3ADbAJgALAC9/x//ff4R/qH9B/2c/HL8
+Kvyq+yH7nfo7+hj6BPrk+cD5v/ng+dn51fka+nH6j/pz+l/6g/qo+qX6r/rX+uX6C/tq+277Kvtp
+++v7G/w3/Ev8FfwM/Hz8zvzt/A/9Iv1l/af9aP3x/Mb8yfyR/Db8JfxB/Eb8jPwO/U/9XP2E/bn9
+8f1D/oH+nf7R/hb/PP9d/4f/tP/4/zUAWQCIAJkAdwB7ALEA4QAEASsBPgFRAXYBbwFPAVgBawEm
+AXgA1/+E/0j/+f7O/sz+vP7a/l3/vP+L/zL/6P6V/mf+Tv4p/hH+2P2Q/Zb9s/2y/eD9JP4//m7+
+2/5G/3z/o/8xAFQBdwItA3wDWQMUAycDggPpA0AEYwRSBE0EgATfBDIFWQWlBQwGQQZYBhMGTgWD
+BDQEiQQiBZoF3AW7BQsFDwQMA/EBzQDj/2b/Ov8e/+H+T/5c/YH8L/wJ/I/7BvvC+pz6j/qT+mz6
+GPrI+bD54flO+gT78fvU/Hj9vf3B/cP9wf3K/Rr+k/7Z/vP+T//p/2sA2gBRAe4BrwJZA8YD1gOF
+AysDFgMkA94CPQLEAZcBggFtASUBggCt//j+mv62/hT/Zf+a/4P/LP/H/mX+Ff7b/en9Tf6//t/+
+hf5T/pX+jv49/jr+cv6z/vP+G/83/y3/BP8y/6z/xf+b/9L/MwBBABUAEAAGAOL/LQDcAC8B+QCs
+AIoAdgB8AJYAbQAmAB0ANgA6ACUAAgDh/8b/rP+S/4T/rv/s/w4APwBvAJgA6ABmAe0BOgJjAp0C
+pgJ7AlIC6wFIAdcAygDjAL8AkACbAH0AVADWAHIBdgGJAeMBCgIuAmwCagISApABRgFsAXkBDgGe
+AHgAYAA3AAoA6f/Z/+v/fQBqAeoBCQJIAocCjQJ2AmoCdwJlAgcCnwFvAU8BHQH/AO0A4gAGAVkB
+2AFoAtECAAPrArICdgI3AvEBogGNAXUBCQHNANoAwAC4AAUBJQHZAMkAKwFTAWUB4wFdAqIC5QIB
+A/8CDgNCA6ADFwSDBOYEdgUpBrwGUgcRCLYIBAk6CaMJAwoTCusJ3AkBCl0K9ApPCzkLHQsAC74K
+lQp5Ci0KrwkOCW0I2gdCB48GyAUZBWkEcgNkAo4B4QAoAGH/k/7N/Tn9uPzu++76EvqF+SP56PjX
++Hn4/ffy9+H3dPdE9073DvfJ9tr2LPeh9/L38vcI+Dj4M/g3+GD4afhx+Ln4FflS+Xr5yvk3+k36
+AvrO+dv5FfpS+lv6Wfp7+pv6pPqo+rb63fr8+uj61Pr/+kH7TPs/+137hful+8j7CPxo/Lb8+/wq
+/Vf9z/1D/o3++f5z/9T/LgBiAHEAswDgALIAzABeAccBBQJVApoC4AIMAwQDBAPfAlUCDAJlAqYC
+bwIIAr4BeQETAdEAogA9AM3/mf+J/1H/DP/Q/lP+0f2T/WL9S/0//Qj9xfxv/BX8AfwI/O77zfuu
++5n7kPuO+4X7b/uG+8r7EvxS/H78qfy7/JD8evyq/Mv8zfze/Nr8pPxg/Ff8q/za/Kn8iPyh/O78
+ZP3Z/Tj+f/6m/rv+4P7w/sb+sv7I/rT+l/7L/hf/F//4/h7/df/X/1wA+QCiAUYClwLFAhUDRgM4
+AyYDVQOOA4wDfQNxA1sDUQNgA3MDoAP8A2YE0QRFBasFwwWDBTkFLQVIBToF7gSaBIMEtwQGBTUF
+AwWcBJ0E1QSwBIUErwTYBAMFWQWFBTEFcASuA0oDKQMSAzkDsQMDBNoDkAN1A1MDKQMoA1oDjQOl
+A5MDAwMHAiUBdwC5//b+h/5K/hX+Af7s/cn9kP07/d/8pfzW/FT9qv2k/Wz9SP0k/dT8a/wf/Bb8
+OPx0/Kj8uvzv/D39b/2W/cv9EP5A/jz+Tf6p/qn+N/4K/gD+4/0I/jr+U/6t/gb/VP/n/zMA3f+b
+/8j/1/+h/1n/2P4P/nD9Wf14/YT9mv3O/SD+i/7i/g//QP93/7D/CQBZAFUAFwDM/2P/6/5p/vL9
+xv33/Wj+sv7P/h7/c/+R/5D/qP/c/+3/5v/k/3//1v6d/rb+zP79/gL/tv6+/gv/1P5s/nP+nv6r
+/pT+Tv4e/hX+6f2o/Y79k/3i/Vb+Zf5O/pD+0f6g/kX+Sv69/gb/z/65/gz/Nf8X/9z+dP4P/uH9
+4P33/Rj+Rf6S/ub+IP9L/0//JP8x/47/3P8NAEkAlADnAC0BPAEuARgB6QC3AJcAmwDQAP4A/QDr
+ANwA4gDWAIYAdADHAOQA2gAZAX4B4gFhAsMC4QLYApECQAIvAvIBZQEIAd0AmQA7ABMAYwDTADIB
+vwFPApgCkQJiAkwCUgJWAkMCDAK6AWQB8wBcAOv/w//G/97/DwB1APsAYwGkAccB/QFcArMCxAKd
+Ao4CqgLCArICrwL2AmUD5AN7BPsERwWMBSsG8gYgB7wGiAadBpYGdQZ4BqsG3AbqBvcGJAc8B/0G
+0wbgBq4GSgYoBjQG/wWeBXUFXQUZBc8EcAT0A5MDRwMeA0sDgANlAxgDyAKPAoACYQL5AXkBFwHi
+ALYAYwDu/2//Nf8x//r+1f78/iL/Bv+s/oP+p/57/u/9k/2X/bf9qv2H/Vv9C/3o/CD9Mv3j/Ir8
+Y/yn/Db9Yv0w/SH9Mf07/Tn9Nv0N/dz86/wc/VT9i/2M/Tj9+vw0/Wj9KP37/BL9+/zg/NX8uPyn
+/Ib8aPx//LH8y/y//M387/zW/Ln82fwb/Vn9k/3Z/Qr+Cf4A/h3+TP5n/nX+oP7O/tH+4f4j/2b/
+if9d/wD/KP+c/5T/Rv8O/+3+Ef+R//r/9P/c/wsAZgC1ALIAdABzAHsAPwAZADQAPAD2/5//rv/z
+/wsAEwAbAPj/4P8FAC4APgApAAgA2f+V/3//jv+A/zP/6v4X/6D/CgAnACgAQQBGAB4Azf9x/1P/
+Rv8h/xb/Iv/7/p/+V/5E/mL+ef5K/v/9rv1Z/XD98/0h/vD95f3s/RX+k/7h/sr+jf4v/v79MP46
+/sj9i/3U/QH+B/4+/nL+cv6M/gj/gv+k/8D/CQA+ADcAEADu/+D///9BAF4ARQAyAEAAaACCAIQA
+rAARAV8BVQFLAYIBqgGbAYIBZQEqAf4ABAHlAJ0AdwBoAFkATwBgAH4AXgAbAEEApwCsAH8AdgBR
+ABYAAQDp/6z/Yf8Z/x3/af+E/3H/sP8oAFoAZQCbANsA2QDBAN8A2ABxAAgAwP9y/x7/y/6M/oT+
+jP6e/sv+xf6l/qz+kv5F/iX+UP5+/mX+C/7L/cj9xP2l/Xv9ZP2F/bz99P1i/tv+Cf/9/vn+/f7V
+/or+Uv4V/sn91f0p/jT+/f3q/eH9tf27/QH+IP4j/jb+Pf5g/oj+VP4K/vL9x/2A/Wn9rf0C/gb+
+F/5+/tf+Cf8j/yH/NP9W/2T/df+K/2v/Kf8N/yf/Rf9C/zv/G//+/jP/eP/Q/04AkwB+AGwAlQCp
+AIsAhwClANAAEQEsAf8AwgCpAKcAogC0AMwAuACHAKYA9QC4AEkASgBhAEkAQwBoAKMA0wDSAPQA
+MAEAAakArQDcAPIAAgFFAY8BdQFSAacBDwIoAiQCHwI6Aq4CHAM2A0EDRwNmA6QDhgMXA+YC9QLx
+AtYC4AIXAzwDJAPzAvoCIwNCA20DowPjAwcE7APMA8ADtwOOAy8D6ALpAgMD/QLcAtcCxwKqAtcC
+HAMjAxoDJQMxA1EDVAMPA74CUALdAcwB1AGUAV8BdQGgAawBsgHoARQCEAJcAvUCSgNXA0gDJwMI
+A9oCnwJ4AmACLALxAe4B/gHIAWsBSAFuAaMBvgHYAfcBCwIdAh0C9gGvAW4BZgFIAe4AmQBEABQA
+MABFADMAQgBGABoAQADGAPIAxwDSAPQA8gDOAIMAQgAtAPX/qP+p/67/ZP9G/37/X/8S/0f/qv+f
+/1T/Vv+G/1//LP8//0H/Hf8W/zf/Tf9U/0z/aP/j/1MAggCmALEAqgDDANQArwCQAI8AhwBjACoA
+/P+y/1L/NP83/yX/Kv9A/zX/Dv8I/xr/9/7S/qX+L/4F/kf+Vf4r/vf9ov1o/X79nv2z/dz9Af4/
+/o7+eP4t/h/+Jv7m/bD95P0Z/vz95/0i/kL+GP7//e/9x/3C/dH9tf1z/UD9OP0p/f781/zU/Pf8
+/fzk/Or8Cf0c/Q79//z9/OL8q/yA/JD84/wh/Qv99PwD/Qb9Bv0r/Tz99fzW/Bv9NP0m/UD9HP3C
+/Lv84PzZ/LT8jPyM/Ln82Pzs/BT9NP1J/WX9e/2i/db97v30/er9Af5U/nr+ff6k/rb+tv7z/i7/
+Hv/8/iD/ef+6/9//+v8iAGEAiwB1AC4AGgAyADMATABwAH0AgQBiAEsAdQCRAIkAmADJAO8A8gDv
+ANUAnwCHAH4AMADR/+f/NAApABsAMAAKAAAARgCQANcAGQEoASsBSQFFAQQBtQBrACQAAgAYABEA
+tP+J//H/WgBiAHQAyQAhATcBEwH/ADQBhgGoAakBegEjAfkA8wC+AG0AWQCHALYA0wDoAPwAEAE1
+AW8BewE1AdEAfgA/ABkA5v+x/7r/6/8NAAcAu/9P/0D/t/8YABYAIgBBAFMAdwCUAJQATgC7/1z/
+a/+B/3v/cv9r/2//cP+S/+r/GAATAD4AnQDqAAYBBgEOARwBCQHuAPwAHwEyATcBMwEJAc4AoABn
+ACUA//8VAFoAdQBSADEAEgD3//b/+//x/+H/BQB5AAkBcAF9AWABWgFTAWEBewFKAc8AjADiAEcB
+JQHaAM0A5gATAUQBWAFWAVwBbwGGAYsBcwFfAWwBewF4AYYBogGPAS4B2wDxAB4BEAHfAMcA/QBf
+AZ0BngGjAa4BhwFrAXEBgQGiAckB7gHsAdQBxAGhAXkBTAE0AUwBTAE7AVIBVAE9AToBDgG1AF0A
+FwAMADUAYACNAM4A9gDMAKUAtACxAKcAuQDRANoAvwCJAFgAIADZ/7r/4/8PABYAXgDcAOEAdAAo
+AA4A6v/s/1gArACNAJEA8QAwAR0B8ADQANkA9AAFAQUB3wCWAG8AkgC5AI4AOAAkAD0AWACVAMoA
+1wDfAO8A/gAdARYBswBwAH8AaAA1AEcAcQBmADwAMQBhAHYAIwDY/xAAZgBDAOT/sP+n/9n/KQA4
+AAsAz//A//v/AQCa/0b/MP8e/xL/LP9c/0j/Cf8W/2T/g/9N/wf/+v4X/xn/DP8p/zP//P7U/tb+
+z/60/pT+hf6w/hH/Z/9g/xv/+/7u/sL+gv4n/s79vv2//YL9N/0T/Ub9nv2z/cX9Bf4X/sn9x/1M
+/mD+7v2W/V79Rv0n/f38A/0F/eP8Iv24/ej9yv30/V7+rP7W/hL/P/8d/8f+if5x/mH+Sv4b/uP9
+yf3S/cP92/1X/rv+8/5P/7L/DABwAJ8AhgByAFwAQQAqAP///P8DANL/tf+6/8L/+P8uAEQAqABZ
+AZIBPwEcASYBCAHdAMoApQApAMj/7v8LALT/Vv9A/2H/w/8qAEYAWACFAJMAlgCHAEkAFgALAOr/
+vP/A/9X/vf+U/7n/HQBwAMAABgEZASEBLAETAfIA6wDPAIMAPwAAAK7/l/+w/7T/r/+1/9v/GABM
+AHkAmwCNAIEAoQCxAI0AVgA6AF0AiACYAL0A7QDzALoAeQDJAIIBlQEVAeYA9QDuAOcA5gDwAPkA
+2gDIANkAtQBeAFkArADDAJcAjQCmAJoAhwCbALsA4gABAS4BdAGQAXYBWgFfAWYBQQEcATEBXAFx
+AXUBXwEmARIBTgF1AVEBMQE0AR4BxgB+AKwACwEAAaAAkwDGAK0AXgA5AE0AcgCTAJkAkwCGAB4A
+j/+S/9P/xv+5/7n/yf8qAJAAvADUANEAvwCvAFwAzf+J/7n/wf9t/zv/Wv+P/6j/1P8nAGcAoADi
+APYAzgCDAFMATQAtAOP/qf+w/8z/xf+l/4r/h/+R/5z/vf/z/zkAbgBWACMABgCz/0b/Sf9+/1D/
+9f7j/hP/KP8A//T+E//1/uv+Yv/g//X/uv99/13/Jf+6/mT+O/4S/g3+av68/r/+5v5O/6z/1v/P
+/9z/BgApAE0AYAAxAM7/Uf/m/qz+dv4g/tL9v/3+/XH+xf7P/rn+wv7i/tP+tv7a/hf/Ov8o/wz/
+Kv9J/xT/v/6y/tH+5f4X/1L/Xv9J/0L/Uf8//wD/zP7v/iT/3v6J/tT+Sf9U/1j/f/+n/9v/2f+O
+/2j/cv9e/13/e/+D/5v/w/+w/2//LP/y/rz+jf62/iT/iv/g/yIASABQAFsATQAJAPz/QAByAHAA
+TAAYAO7/zf+Z/0n/GP83/4v/7v80AE8AYQBtAHMAiQCbAK0AnABUABkACgD///v/AAD+/y0AdgBG
+AM3/wf/r/+L/6v8RABMA4f+k/3v/d/+M/7P/9/82AFgAlAD/AD0BNgEfAeEAagAXAD4AdgB3AIIA
+jgCTALMAzgCuAGMAPQBvANkAGwELAe4AAgErASAB1QChALYA4gATAWUBuAHuAR8CUQJ9ApoCgAIo
+AtEBswGsAaYBmwFqATYBJAEzAVMBYwFYAVMBjwHrARACAQLtAboBbwFgAYkBeQEXAd0A9wAKAekA
+oABxAHgAnQAeAbkB4QHhARwCcQKBAj4CFAInAkICPgL+AZABNwEAAcQAeQA6AEMAhgCsAKYAjACB
+ALYA6ACyAGwAYwBOACQA+P/N/8v/xv+N/z3/F/8f/zL/Xv+H/5H/ef9t/5v/pP90/33/n/+X/5z/
+qP+V/3z/Uf8y/2D/j/9w/1n/gv+i/4H/WP9z/5P/fP9s/4b/hv9q/3j/dv9V/2n/nP/J/+b/7/8U
+AFkAggCOAJYAkQB3AFkAVgB7AJsAoACZAI0AegBUAC0AMwA7AAAAs/+2/woAMgD1/7z/3f8ZABsA
+3P9r/xr/Jv8m//b+3f6o/jX++/0N/iz+Wv5+/pn+6f4a//P+2v7z/gP//P4O//v+ef4B/g7+LP7u
+/dT9Lv5//rv+Jv9n/0j/Cf/6/iL/M/83/zz/Hv/x/qb+YP5k/oT+mP7N/i3/hP+q/6r/t//p/wcA
++P/a/6f/VP8b/yv/R/8P/53+Pv75/Qj+a/6j/rf+1/79/kr/lP+s/6j/hf95/63/wv9z/y7/RP9U
+/zP/O/+F/63/d/9Q/3f/nv+s/87/8/8MACUAEwDa/9L/7//q/+D/9P8FAOH/u//g/xUAKwApAAAA
+3P/3/yAAHgDz/8D/yP8cAGkAcwA3APP/+/8YAAAAxP9X//X+/P7//pb+WP6f/qH+WP5o/oH+hv6+
+/vX+Qv+z/9P/sf+Y/0n/sf5V/o7+3v7E/o7+kv7I/gb/Rf+Q/77/zv8AAEoAdQBqADQACAAbAE4A
+WwBNAEcAPABeAJcAZwDp/8r/DgBBAH8A4gA0AUoBOAEnAfwAzAC4AKAArQDiAPYAFAFTAWoBZQFF
+Aa0ACQA+AMIAqgB3AHYATwA5AFwAewBiACcAAAAVAGAAfQCJANAA6QDoADEBngHNAb4B3wE2Al4C
+ZwJ/AksCwAEyAcsAxAAoAWgBUQFPAVcBPAEqARkB9gACATEBaQG+AeABkQE4ASwBCwGbAEQARwB7
+ALcA2gDTAMIA0ADnANIApACaAMEA5ADlAAUBZAGBARIBrQCcAJ0ArwDOANcA+wAmAR4BHAH9AKwA
+dwBhAF0AYQBfAGAASAANAP//OwBsAHMAngD+AG8B4AH3AbUBkwFpARYB+QAEAfMAxACUAIAAcABO
+ADoAMQAoADcAWACJANMACAEwAXsBqQGOAWUBMgEEAe0A1wDuADQBRwH9AJsAWgAhANn/lP9k/zz/
+MP8g/+7+0v7A/p3+zf5A/17/cf/z/1wAHACs/2z/CP+Z/or+1v4v/4T/0f8AACsATAAkALn/bv9K
+/yD/Kv9X/0z/Qf9d/0j/H/8z/1r/Zv9x/4n/rf/R/+///P/Z/5r/Yf8g/77+jP6d/oD+R/5T/pP+
+qv6L/nv+gP5x/m3+u/4Q/w//DP8n/yb/J/9O/1z/CP9//jv+Yf5O/r39Xf1y/a390f0E/mn+qv7V
+/lP/9f8jAMf/Zv9Z/3j/bf8v///+6/7C/pf+ov7M/ur+7P4E/07/g/+T/7T/5//u/87/rP+b/4z/
+aP9f/33/fv9E/w3/9P7T/tP+BP8y/zz/Bv/b/hv/Wf8o/93+oP5o/n3+ov6d/rz+tP5b/oX+Af/3
+/sH+zf7y/hX/Q/91/4H/Qv/+/gr/SP+D/53/kv+Q/6v/w//S/+X/BAAcACwATwBVACUA4f+//+L/
+BAAiAFYAdgBuAFcAZgCRALMA1QD/ABsBEgHzAMAAZgD8/8///v85AFgAbABlACoABQBPAHgAKwD5
+/+//7P8VADoAKwD6/9L/9f9ZAGwALAA0AIcAyQDzABgBFQHdALMA2wAZAQEB9QAkASMBDwElAVEB
+agFpAXMBhAGcAawBsQHGAcMBqwGEAUoBOAE/ASsBFAHwAKYAlQDIAOMA1gCqAJoA1AArAV0BRgH/
+APMAJgEcAQoBNwEqAdMAswC/AMoA+wAIAeAAEAFkAWkBegGkAYgBdQGbAZoBSgEEAf0A7AC7AL8A
+8AD/ACIBdAGLAV8BaAGoAaEBTgEgAVEBhAFgAUYBcwF5ASkB9wALARsBHgFDAWMBUwEiAeYA5QAI
+AfQArQBzAHMAiABtAC8ALwBgAHEAkwDOAKAAHwAJAFoAYwAjAPT/wv/E/zEAkQCfAIoAhgD1AHUB
+UgHSAIIAgQBZAOL/p/+i/2v/VP+f/8//xP/q/zYAYAB3AIUAkACyALMAawAcAO//z/+3/5z/Zv8x
+/yH/QP+D/8H/4f8OAF0AnQCwAK4AnwBbABYAEgAgAPb/nf93/4P/d/9L/wL/qv7E/nf/5/+2/5D/
+lf9z/zb/8f6m/kn+w/12/bj9B/7x/dH92P2+/Z394f1b/mv+VP66/jr/Rf8r/1D/hP+P/2P/Ef/m
+/vL+Af/8/sX+a/5H/kX+Gv7o/dv95v31/Q7+Nv5U/kf+Gf7n/cX94v0J/vf9C/6I/v/+FP/6/tn+
+yP7F/q3+iv5L/hH+Ov5j/hn+9f0u/in+F/5r/sr+//4k/yP/Of96/17/B/8X/2T/hv+T/7n/u/9s
+/xT/6f7a/r3+nP6Q/qn+AP9E/zz/Nf8p/wf/Jf9l/2T/dP++/8H/h/93/4n/j/97/1//b/+v/9P/
+y//V/wcAPgBeAHEAeABnAD8ACQDe/9L/5P/2/9z///+7AD0BCwHQAMYAvQDBALIAjQB9AIIApgDR
+AIQAxP88/zz/cP+C/3L/QP8p/3X//P9tAJYAjQB3AF8AeADOAOsAnwBhAHQAswC5AEEAvv+x/+v/
+GQBCAHIApgC9AIsAbgC/ABUBKgE8AYcB9wE0AhoC4AGxAYUBRgEHAfAA0AByABEA7//0/97/1P8O
+ADAAFgAPAFIA7QCCAcgB2wHJAaYBnAFsAe4AlwCDAHkAiADAAPkAGgEQASQBwQFrApUCeQJXAjgC
+AwKfAUcBJQHzAJ0AjgDWAAIBDQEQAe4A7gAkAT4BPQE7ARwB/gAWAT0BLQHoAK4AqACPAFEANQAq
+AD4AggCXAJAAogCoANkAIAHwAIsAjgCXAE8AOABPAEIATgBfAFwAngDXAMIA3QAdARwBLAF2AYIB
+SQEoAS0BLQEYAf4AzwClAKkAuADRAC4BeAFHAQIBCgEoARUBAwERAfkAxwCoAJQAmgC+ALMAcQBM
+AEgARwA5APz/kP9N/37/uP+j/3b/a/+A/2z/Vf9r/0n/LP+U/+7/x/96/yr/3P7W/hX/UP9k/1z/
+X/+U/7z/h/80/yH/P/9U/2L/gP+C/0//Nv9b/2b/TP9F/03/aP91/13/Ov8J/8j+0f42/2z/Q/8Z
+/zX/Z/9Y/yv/Kv84/1D/e/93/0P/Ef/+/iv/fP+j/57/Z/8Y/xP/Dv+x/nr+qv6z/mv+gP7q/uL+
+lv51/mn+U/41/kD+Zf5m/nP+vP7S/pX+dP56/nP+cP6W/qL+ZP4T/t79A/5X/mX+Sf46/i/+Mf42
+/jz+Y/6E/on+sv7Y/tn+8/4M/wn//f7y/gH/Kf8l/+T+0v4l/1P/Cv/b/vL+8v4D/zz/Zv+V/6//
+f/9N/zr/Mv8q/9z+U/4B/i7+a/5X/m/+yP7Y/rb+xP7v/g7/DP8L/3n////i/5L/bf8c/9v+4v7q
+/rX+Zf5e/qb+6f5C/+j/egDAANAAngBsAFsAJQDm/+n/HABTAJAAowBRAAEAGABHAFwAfwDDACAB
+YQFSAUIBYgFaAfYAjgCnAA0BKgEoAT8BKQH+AL4AFgCb/9X/AADD/77/2v/P/wYARQAaAO7/0P+C
+/3X/mv9h/03/z/9FAGgApgAXAVYBbAGvAfQBGgKCAvQCzQJ7AjkCnwEMAcwAnQBtAFQAaQCdAMUA
+/AAxASAB/wAqAXsBgAFOAUkBXQE+Ae8AlABMAEAAawCnAOwALQFiAZABngG2ARUCXAIOAqIB5wFB
+Av4B0QHTAbUB7QFbAnICaQJlAj4CJQI3AkUCKwIBAgcCHgLwAZQBMQHRAJkAfwBbADwAVAC5AD0B
+gwFmASgBDwEwAW8BtAHoAc8BhAFrAT0BqwA0AA8AGwBQAIcAtwDFALEAzQAZAUYBQQFGAWcBeQGF
+AYcBfwGRAZ4BagEbAekAzgC9AIsANwAYAC0AQwA+AA8Ax/+F/1j/Wf+j/+v/4v/b/w0AMAAIAMX/
+qf+s/7D/3P8fACwAKwB+APoAPAErAeoArQB2ACUA9P8aAEUANgArAEwASwABAMD/tP/V/zIAqwD7
+ABUBEQEbASIB6wB5AB8ABwDy/6T/SP8y/0f/Sf9C/zL/LP8y/xL/0f7T/iX/av+4/w4AMwBQAEUA
+3P98/0T/4P51/iv+2f2E/XL9kP2U/dD9SP5X/lb+0/5r/9b/8//R/9n/6v+m/0P/Ef8C/57+3/2N
+/aj9nf2e/cz95/0B/lf+w/77/vP+6f4M/xb/5/60/qz+qv5s/hX+8P33/fP9z/3V/Tb+YP4e/iz+
+kv6y/nr+K/7o/c394f3B/VP9JP0d/Qf9M/14/aj9AP50/pb+hv69/gj/8v6P/mH+dv6A/o/+tP7N
+/tD+xf7r/nT/+P8gABoAAADq/wcAQABBAAkA+f8IACEAQAAyAAMA5//r/9P/jv91/2X/If/V/rH+
+8P4t/+n+xv5G/73/uP+m/4b/O/86/3P/dv9e/0r/Hv8O/1L/pv/B/8X/0P/j/wkAEQDf/8//BgAo
+ABQAEAAqAA4Ay//C/7T/j/++/xEAMgBLAIgAoQB0AEYALQAYAPT/yv/V/ysAcgBAACgAsQAkAS8B
+NQErARQBDgEMASMBSgFXAUYBMQHwAIgAcACqANsA6QD8ACUBOAFVAY0BbwEkAQABrABdAGwAiACZ
+AJEAaQCPAPsAPQFLAVABVAFmAZkBvwG0AY0BWQEdAe0ACwFIAToBJgF9Af0BLgISAvwBHgJbAmsC
+LQLbAYsBJgHwABcBUQFPASYBIwFhAZ0BngGdAdQB/wEKAikCQgIjAsMBcQFjAWgBSAEBAckAkQBi
+AKIA/QD7AOwA7wDZAOMAFwFFAVUBJgHPALcA5wDEAEYACQAUAPn/tf+k/97/EAAqAJQAGAEsARkB
+VAGMAWMBHQHwAN4AwgBxACgA6/+e/7D/FwAoANz/+f+bAA4BDwHtANsA0AC/AKIAlgCWAEgA9P8J
+ACAA7P+n/4H/jP+0/7f/cf8w/3D//v8bAMz/kP+A/2v/P/8p/0T/SP8b/yH/a/+S/57/6P9BAFsA
+XgCFALkAxQC3ALoAsAB7ADAA7//W/5//Mv8L/yv/Pf9W/4D/iv+J/7D/2//R/8T/6P8HABAAEADu
+/6//hP9V/9D+Xv6U/gj/Wf+0/+j/s/9z/4v/t/+N/xj/yv67/o3+fP6s/rb+kf5//ov+r/7t/vz+
+xv64/sj+pf6O/pn+Z/4u/kT+RP7+/d39CP4O/q79af2m/Sj+i/6w/rT+uv6e/lL+Nf5K/mH+gv5k
+/gD+/v1F/ij+sf1//bn93/0E/nj+yf6r/p7+4/4Z/x7/QP98/3j/Qv8j/+/+if59/gD/c/90/13/
+PP/m/qf+hv5g/if+zf3I/T3+eP5U/oP+x/6N/mX+f/5g/lr+uf4X/1H/tv8JALb/Af/L/jj/hv9J
+/wv/HP81/1z/of+s/47/uv8oAIIAeAAHALn/r/+D/0n/aP+4/8//1f8CAFEAmgCkAJQAwwA4AacB
+1AHgAdABeAEUAfAA2wCrAI4AmACuAKYAbgB3APwARwFAAW0BsQHgAfEBzwGUATYBswBgAF4AZwA8
+ABEAGwAiABwANgB7AMsAHgGsAVsClAI8At0ByQGoATEBzADQAOUAswB4AIAAogCgAKIAuADfADoB
+oAHPAd4BAQIdAgsC3QGwAZIBewF6AWABAwGzAI8AkAC1AP4AVQFiAUwBqgFGAjECigFEAYIBxAGg
+AU0BSQFbAToBAQHPALYArQDBAPIA9gDaABEBcwGCAVkBPQEqATgBdgGSAWcBPAEpARYBEQH9AM4A
+qAC1APwAFAHuAN0AxACmAM8APgGBAWABPgFBATUBBAHbAOEA2wCZAFQAUQBHAAcA0f+y/7r/4//5
+//D/wv+1/wAAKQDx/8T/v/+v/8L/2v/N/9b/zv/A/x0AiQCAAE4AQABHADgACgDu//3/+/8JAFAA
+RADh//H/YgCEAFsAOgAtABMA5P/l/yUAUgBjAIEAlwCAAFwAWQBFABgADQAjABEAsv9v/4T/eP8r
+//f+7/4U/2L/v/8hAGgAewBoAEIAUgCgAGEAXf+R/mD+Tf4o/gP+6v3y/R/+Vf5w/lT+MP5V/pr+
+sP68/rT+df45/vz92P0Z/mr+ZP5X/oP+q/7W/vz+//4n/4H/u/+9/5j/c/+F/7D/of9e/0H/X/9z
+/0v/Kv9k/5b/ZP8u/z3/Xf9k/2n/W/9H/1L/V/81/xb/B//X/r3+qv44/v/9R/44/u39Gv48/g7+
+JP57/sT+4v7Q/sb+6f7p/rT+uv7y/vT+t/6B/mj+NP7//Sj+a/5c/kT+hf7+/k3/af+P/7j/z//B
+/4n/Zf9o/3z/nf+n/5b/oP/J/+X/+P8dAE4AaAB8ALEAvQCJAHwAlwBxAA0Ax/+f/37/l//J/+L/
+8v/F/4D/lf/G/7f/k/9s/1f/h//J//P/BgDr/73/nP9s/0j/VP+G/7L/wP/N//D/LgBSAGUAogDP
+AOQALAFmAS8BuQBsAFkAcQCqAMgArQCLAJMAuADJAMEApABpAEsAfgCsAGoA5/+v/9L/4P/I/7L/
+m//R/2wA3QARAWQB0gH8AbwBngHDAYQB7gDWAC4BDwGcAH0AfAB1AKoA4QDkABABbwGkAbwBwwG7
+AcsBAAIfAvkBugGUAW4BOwFBAX0BmgGhAZkBgAGhAdIBuAGaAYgBVAEzAUMBJQHcAOUAGQEOAcQA
+gACLAOMAPwFVATUB+ADQAP0ARAFlAWABPQESAcwAawAwADYAdgC3ANIA/wALAecAEAFjAVoBFwHx
+AOQA8QAPAfsAvQCKAGwAYgA7AN3/rP/T/wcAIgAdAPv/w/+2/xAAewCKAHYAhwCHAHYAngDPALgA
+jwB5AG4AfwCRAIYAdgBTADUAWQCmAPUACwHgAM8AwwCSAHMAeACqABQBUwE1AQIBxwBqAAYAsf9a
+/wj/5/4Y/zf/Bf8R/2T/eP9Z/0L/Ev/e/uP+/f4O/wT/4/7u/jD/Tv8g/wn/Qf+G/6z/2v8kADEA
++v/r/wsADwDn/7T/i/+K/7H/0P/n/+7/xv+f/6r/nf9V/y3/Lv8O/9P+2v4R/w3/0/6b/n/+a/4m
+/uP98/0m/kv+W/5U/lv+kf7G/sX+rf6T/mD+YP69/tT+kf6g/sv+pf5x/j3+DP4Z/h3+8/3z/eP9
+m/2p/ST+Zv5h/qT+H/9P/x//AP8F/9v+sf6t/qP+ef4w/gL+Jf5a/mn+fP7E/iP/X/9u/0//I/8s
+/0f/Jf/7/gr/Pf9o/2T/R/87/0P/If/S/q/+0P76/uv+tP6b/q/+yv7l/gv/Fv/m/uz+Pf85/x7/
+GP/b/tf+OP+N/8T/7f/u//X/HwAnAAwAGgA2ACwAIgAwABwA2v+k/6P/pP+K/63/4P/3/0EAiwCQ
+AGMAQwBqAJcAjQBxAGcAdwCGAG8ARAA0ADAAPABqAKUA1gDmAAIBTgF8AW8BYQFUAT8BJwELAfYA
+5ADKAJgAYwBwAJoAigBxAHkAhQC1AP4AGgEXARwBJQEtARwBywByAGkAgABhAEoAdwCQAH8AigDU
+ACsBUgFeAWsBeQGNAacBowGYAawBpQGDAXUBVwE5AVMBeQGCAaEB6AETAvIB2wEfAlQCHgLSAc4B
+6gHGAYcBpAHOAX0BAwHWAAgBOQEXAQQBIgH7ALAA1AANAcsAhAB0AE0AXwC7AAUBJgH6AKUAjACo
+AKwAjwCXAO4AOAE6AVQBewFJATIBiwHDAcYB1QHoAfkB5gGDAS4BMAEFAbEAuADkAOEA7AA1AWUB
+SAEoATwBWwFlAXoBmAG3AecBAwLhAZABFwFjANH/q/+O/1H/YP+9//r/FQAcAO7/6v9EAGAACQCi
+/zz/1v6e/pv+k/6J/nX+R/5y/ub+O/+k/zEAggB/AHYAkAB1AAoAvv+z/7f/vv+1/5v/gf9s/4r/
+0P/g/8j/7P8sAEAAQAAnANf/f/9U/y3/9P7l/vD+4v77/jL/Of8k/xL/BP/q/t/+Gf9H/yL/Ef8u
+//L+m/7Z/hH/tP55/tv+JP/W/n7+WP47/jT+Rv5S/kf+Wv6N/sv+Cf8Q/93+u/68/qr+e/5N/iL+
+D/4+/oX+iP5X/kH+Pf43/kD+NP4u/mf+qP7j/g3/Af++/oP+uP4L//n+wP69/uz+Dv8n/0T/P/9Q
+/57/0v+8/5z/hv9b/zP/Kf8o/yf/Qv9s/3//c/9B/8n+Rv5F/nf+T/4m/if+Mf5U/m3+W/5R/nD+
+r/4L/zD/L/9s/4f/Lv/A/oz+av4u/hr+bv7B/tH+EP9y/5b/nv+m/4v/e/+d/8P/4v8RADkAJADi
+/6H/X/8//2L/f/+o/y4AqADMAMEAuQDVANwAsgBqADsAXwBUAOz/vf/J/6z/hv99/2z/U/9Z/37/
+4v9nAJQAngC5ALUAvgC4AGkANQA7ACQAAADf/4v/Tv91/6D/j/+c/xYAnADPABgBogHqAdQBzQHl
+AcgBfQE9Ae8AigAnAPj/GwAkANv/uv/y/zsAkQDPAMAA1AA3AXYBdgFxAVUBJAEEAekAwwCDAFkA
+fQCvAKEAngDmABwBMAF+Ad8BzAFsAV0BjgGKAUwBFwEVAQ8B2wDRAPwAAAHbAOEALwFpAVcBRQFU
+AUIBDgHZAKgAjACtAOgA6wDDAKYAuAAGAWIBeAFEAUkBkgGiAWoBKAHjALQA2AAvAVEBJgEaAUwB
+ZwFuAY8BtgHVAeIB0wHhATECSgLoAYQBagFSAQsBxQCGAB0A0f8QAHAAZAAcANn/z/8cAHMAfwBw
+AF0ANgA/AEYA8f+z/8f/2v/i//r/FQD9/8v/BwCSAOsACwEQAR4BLwEUAesAvQCTAKYAzgDZAMAA
+rwDjAAoB3gCyALEArwCYAIoAlgCmAKEAewBZAEYALQAvAEYAQABKAIEAgQA6AAgA5/+g/3H/gP9z
+/0D/Lf8v/y//Cf/C/sn+9v7y/hb/Sv8l//j+IP8w/+n+wP6l/lf+Fv4n/nn+nv6A/ob+0f4r/2z/
+Z/8f/wj/Sf+L/67/zP/G/5v/eP9Y/zn/Of9R/2X/bf9v/2r/Yf83//v+AP9A/1D/H////gf/FP8J
+/9z+eP4R/vH93/3D/Y39Jv0H/Vf9pv3E/cH9kf2C/fb9hv6y/ob+dv7B/gT/z/5f/j3+bP6G/nj+
+d/56/m3+mf4J/z//Ov9a/4v/fv9T/17/iP+A/0v/J/8x/03/Wf9i/27/Xf8z/zX/dv+p/5//hv+o
+/+T/BQAiAC4ACwDe/7P/kf+L/3r/Sf8h/xP/FP/d/nn+gv4T/2//V/9W/2T/MP/p/sf+0v7W/q/+
+p/7Y/sv+h/6T/tv+4/6z/rH+6P4s/13/l//V//T/KAB1AKIArACXAFoAEwADADoATwAdAND/jv+T
+/57/eP92/7r/AQAuAFMAYwBiAG4AZQA8ABsAEgADAP//UQC2AKwAqQDoAO0A5gAVATQBAwGIAHYA
+FwFmAQsB6gAVAQ0BKwGLAZ0BfAGCAY0BsQHqAe8B5AHhAbgBhQFnATUB0QB7AIoA3AARASUBKwEX
+AQAB+wD+AA0BRwGeAfMBSwKOAtUC8gKRAggCjwE+AVEBjAGgAXcBPQEyAUMBSAFEAWMBsQH/AT0C
+YAJAAgEC5gHuAfMBBQIjAuYBsQHIAaMBagFLAfQArQC2AKgAawA0APr/2v8AABYA//8eAF8AcAB3
+ALMA8ADJAJsAyAAXATEBCAH0AAYBDwEEAegAzQC1ALAA8wBUAXABWwFQAVABMQHuAL0AsQCoAKIA
+pwDDAPQAFQE3AXABhQFgAS4BCAHgAI8AIgDX/5z/Yv8//zH/Mv8w/xj/SP+x/9L/6P8xAGAAggDM
+AOQAjwAqAOv/vv+h/27/Gv/2/vj+/f4q/4L/5P/0/+P/WADkANsAdgAZAAcALQA1ACsAGADW/5X/
+kv+V/2f/Ov84/13/gv+J/3v/X/9V/3X/l/+J/zf/xP5p/lr+dv59/oD+qf7X/tv+4P4J/z//J//Z
+/vn+Sf8c/5D+LP73/d39E/5n/mj+Kv4q/pj+BP8C/8r+xP7t/jT/e/9m/wf/vP58/j/+Jf4y/j7+
+F/7W/cb9yv2P/WX9mv3z/VT+s/7c/tL+3P7l/sf+s/7H/un+6v7i/gf/D//M/pT+n/67/rX+mv6U
+/sf+BP/m/o7+Uf4n/jr+pv7Q/on+jP72/j7/T/9I/yD/Df83/2D/jP/W/+H/kf9v/4r/e/9T/zj/
+H/8R/0f/sv+y/1L/R/93/3L/df/S/yEAHQATABkAHwAXAAQAKABaAEUANgB7AL0AkgAoAAgAOQBi
+AHMAdAB9AJ4AiAA7ADEAWQBZAFAAdAC0ANQA4gATAQ0BswB0AFgAgwDVANcAzwDZAJ8AVABKAG0A
+fABlAGYAnACrAFMAIQBYAFEAFwAtAFEAMAABAAgALwBPAIAAlABJABEATgCGAEgAAgAsAGgAkgDO
+AP4ARgGlAdYB/wF3AvAC8gKEAjMCWAJrAg0CtwHZASMCIQIJAjgCdQJTAgcCAwIjAhMC5gG3AUsB
+hwAaAFIAcwAxAOb/qf+Z/+v/WQCHAGwAIADk/wMAIQDF/1j/PP84/wv/2P69/rD+vP4K/4v/2f/4
+/yMARgB1AHcAFADk/zcAiAB4ADsA+v/f//X/2P+m/87/SQDmAHQB0wH8AQ4COwJxAoMCYQIIArAB
+oAGyAXEB9QCpAJkApAC0ALQAhQBiAKgACwEsARIBtABSADgACACK/yH/CP8b/0L/SP9l//b/cABj
+ADoANQBxAPgAQgElARUBKgEUAc8AhABAABIA6v/J/9P/CgBYAIAAfwBnAEYANwAsAAoA2f+5/5b/
+Qf/s/t7+2v6x/rv+3f7P/t3+HP8t/y//b//Q/wQA7P+9/3r/FP+9/n7+lP4g/1z/HP/8/gj/O/9h
+/xP/1v4c/2b/e/+s/6//B/9e/l/+mf6O/lf+Dv64/an9Cv5s/n7+cv63/kP/of/S/+f/xP+P/3v/
+aP8t/wD/7v7c/rn+ov7G/t/+1P74/kn/d/92/27/Xv9F/xr/8v7p/uf+2/7O/tn+If9T/zD/Pf9w
+/0P///4E/wz/5/69/qD+h/6P/qX+hv53/rD+BP98/6b/M/8Y/5f/vf+M/7r/4/9W/7H+1f5S/2D/
+VP+t//D/3v/X/7r/dP9L/zX/Of91/6v/sf+y/6n/k/+O/13/EP8Q/y7/cf/+/0IAFgDw//3/FADz
+/8T/vf+g/2//Sv8k/wn/Dv8k/0j/lP+4/2L/Q//Q/wUApv/Z/4YAugDcAEIBPgGeAAMA2f/I/3H/
+Kf86/y//7v4O/5j/+f8HACsAtQBXAbABpwE/AfsACwHZAEIA5f8EABUA2P+3/7v/ov+C/5j/9v98
+AOoARAGSAYEBRwExAewAmACpAPMA6QCnAJkAlgCAAIQAmwCjAIUATQARAOz/NwCAADUAJwCMAJUA
+dwDDACEBEQGzAJoA8QAwARIBDQFvAbgBXgHCAJ8A4wATATYBPgE2AWgBlgFpATUBWQGbAboBwQHM
+Ab8BoAGoAdYB7QG/AXsBbwFmAWoBsQHlAeIB0gHLAckB1gHvAewB0QG5AbIBsgGFASkB7wDYAL8A
+wwC7AF4AAAAhAHoAdABoAIIAZwCFAA4BYwFdAU4BMwEEAQYBEAHjALoAuwCzAKcAwwDOAKEAoQD2
+AEABXAFhAUcBKgEiAfYAmwBlAFgAJQD9/xsAKQAFAPH/8//4//T/8f8NAD4AZABtAE0AHgATACMA
+OwBDACoANQBhAGYAbwCYAJoAbQAnAK3/Yf+g/6X/KP8C/xX/6P7Z/un+zv7O/tv+xv7j/jH/V/9K
+/1H/e/+T/5X/jf9r/0b/Wv+C/4j/sP/z//X/y//N/xgAcQBwAB4A5v/n/+P/tv+d/6X/dP8n/x//
+QP9P/0P/O/9d/5v/vP+Q/zb/Cf8V/z3/Y/9G//D+mv57/q7+5/7e/s/+1v6b/lb+hP70/hf/1v5u
+/jj+of5g/7j/r/+m/43/mP/T/4z/yf5f/mP+Vf5N/pT+wP6E/kL+Wv7M/k//g/9b/zj/Vv+N/4n/
+Qf8R/zD/eP+2/9H/7P8MAAAA6f/Y/6v/m/+y/6H/mP/k/xgAuf8n//n+7v6w/oX+af4h/sv9jv1T
+/Rz9DP3y/P78j/0Z/kb+av5v/kP+Pv5t/nT+RP5O/rv+Dv8S/xv/Rv9Y/0n/Sv98/7b/xv+//+H/
+KgBSAG0AjwCYALAAyACYAEEAHQAaANH/Tv8S/0L/aP8//wL/9P4W/2P/0/8YABEAAgAbAE4AmgDt
+AA0B/QDyAAEBFgELAfcA7wDEAJAAiwCCADQA/f9PAJ4AZAAQAOz/5v8GAEEAUgAhAO3//v85AEIA
+MQBfAKkAtQCRAI4AiwBDAOX/sv/G/wIANQBnAJ4A1QAMARUB8ADkABABSQF/Aa0BtAGrAZ8BgAFi
+AVABLgEIARIBLQEoAQIBzQDCAPUAOgFyAa0B7gHhAXgBPgF0AZQBdAGFAcEBoQFXAWQBVgH8AN8A
+BwEgAR4BEQHTAF4AKgBNAHYAgwBtAHQAsgDVAMEArgCiAG8ASACBAPMARwFSAT0BPwF2AcQBuQFV
+ASQBUwGHAZQBmgGQAX4BiwGzAZoBMAEEAT8BfgG7ARoCVwJQAi8CHQIiAvsBzgHUAbcBbQEpAbcA
+HgDX//H/IQA3ABgA6/8cAIIAiAB+ALcA1gD+AGsBpQGLAVkBAQGsAHQAGwCt/3//dv8q/+X+Dv9V
+/4P/0v9MAMYAFgEcAeAAowCAAE0AHwAkACQA6f+u/5H/Yv8p/xX/P/+b/+X/FgBeAJgAkQBuAGwA
+ZgAbALv/jv9s/x7/zf66/tH+0P7C/uH+Df8F/+v+KP9w/zz/9P4H/w7/5f7G/pz+cf5z/ob+s/77
+/gf/AP9c/9D/6v/v/xkALQD//7H/cv8e/9T+2f7w/tb+vv7W/gb/TP+F/6//5v/r/7v/r//F/5f/
+Lf/R/sP+//4C/6P+af6X/s7+8v4a/yv/Kv8x/3b/+P9DAAoAkv9j/3r/bv9H/x3/wv53/pH+v/6u
+/n/+Pv4j/nr+yv7Q/s/+1/72/iT/LP/7/tP+1P6u/lf+RP5s/j3+7v38/Rf+Kf51/rL+n/5//oD+
+k/6m/pv+hf6G/nH+Wv6O/uv+Hv/v/rT+6v4o/x3/Gv9H/4r/y//z/+z/1//U/6n/Vf83/z3/Qf9W
+/33/l/93/zn/T//B//j/1f/C/2z/4f7g/tj+SP7s/cf9m/3S/R7+Cf4V/pn+9/7b/u/+Uf8t/4n+
+Wv7A/i3/jf/J/7n/sP/n/zwAbwBPADIAXQCNAIQAfAC0AK8AQgAPAFkAzwAJAeQArQDPADIBZwFo
+AXIBiQF7AUcBQwFdAUABDgH3ANEAhgA9AB0ADQCr/zD/TP+q/6T/i/+s/77/4f9bAMcAyACnAIEA
+SwAoAOP/l/+h/9X/+P8GABcAFAD5/xgAbQCZAJ8A4ABgAYgBVwEyATMBXwGTAZwBfQGOAdQB+AH6
+AQcCPgJ+Ao4CrgLkAs0CgwJvAp0C3wL9AucCtQJYAvQBtQFfAc4ARgAOAC4AVQAsAAcAQABhACsA
+7f+l/2j/hv+//7X/p/+//77/mf98/7H/TwDpACcBMwFMAXsBmwF3AUoBQgEwASoBKgH2ALYAmgCX
+ALAA3gASAU4BmgHZAc8BowGkAa8BhQFhAYcBuAGjAV4BIAH2AKMAMwAsAG0AbQBNAGwAewA6ACUA
+SwAmALr/jP+3/7r/lf/y/4EAhgBtAG8ANgAGAP7/+P8XAGUAogCZAGAAJgD//9T/g/84/xf/HP82
+/zX/L/9O/4H/pP+q/4n/Yf90/4r/dP+L/9T/9f/k/7//gv9u/5D/jP95/5H/sv/G/+P/EwA9AF0A
+pQAAASABEAHrAJYAHwC8/3v/YP+H/9H/8v/h/+H/3/93/wL/Hf9O/y3/N/9J/wb/of5B/gL+E/5k
+/rH+9v5B/2L/b/+N/33/FP+p/qr+4f4D/0f/lf+h/3v/Qv8r/1P/cP9f/zv/Jv9O/4z/ef8T/9D+
+1/6v/jP+wv2h/dT9CP4D/vv9Gv4t/iT+Qv6b/v/+Cv/K/r7+qv45/s79uv3o/Sf+P/5O/oH+tP7K
+/vf+Y/+f/5T/rv/e/+P/0/+U/xX/pP5e/kP+V/5h/j3+EP73/RX+mP4r/0T/9v7w/mn/vf+w/5D/
+Qv/r/gf/I//t/vn+C/+U/iT+bf7//h7/HP9Y/6D/DACYALoAXgAzAH0AsgCCAC0A+P+Y/wT/3f4N
+/xH/9P4T/3r/AwClABQBJQE9AaIB+QEfAjsCQQJnArAC4AITA14DjgOwAwAESARVBGMEYAQnBB4E
+jAT8BN0EjASQBIUEPgQaBA0E5QPSA+0D4QOYA4IDogOlA5kDmgOZA5oDpAOLAyoDtgJ0AlwCKQLX
+AboB2wHNAXABCgHPAKcAZQAcAN3/o/98/0z/5/6U/qP+c/62/Wn9pP2J/UP9/vyS/IT82PwO/Tf9
+dP20/QL+P/5K/nz+8v47/0P/b//G//3/GQBVAJMAqADNAA8BFwHxAAQBKgEcARABEAEWAT4BXgFV
+AV8BcQFQARgB3wDBANQAzwC1AK8AjQBzAKAAxQDFAPUARQFXAT8BaAGrAaIBcgFnAY4BqgGuAewB
+OAIrAu8BvAGTAZwBxAG3AZoBygEnAjQCBQIIAhwCCQIBAiMCLwIIAuMBuwFzATMBEQHqANEAqwBF
+AOL/if83/w//9v6y/oH+pP6a/g3+Sv2y/FL8/PvO+/j7K/wi/Pv76vvm+7n7fPuA+7T79/tu/ND8
+rPxW/Db8W/ya/Ln87Pwt/QH9tfzd/Av96/zV/OP87PwB/UP9k/2E/fn8ZvwM/NH7i/tS+1n7WftI
++2X7bPtV+2T7tfsh/GP8nvwL/Vn9ef2g/aT9kv2x/dD9q/2I/br9+P0E/gT+6f3E/cn9BP5h/pz+
+1P5O/83/CgA0AEsABQBg/8r+lf5b/tn9n/3r/UL+eP5//l7+pP49/2P/Av+N/jn+DP7c/ZT9Vv0r
+/Rr9L/1j/ZL90f1R/r/+9f5L/63/iv/P/i/+EP4U/sP9Mv3U/LT8ovyo/PT8XP1//Yz91f1B/o3+
+rP67/qj+df5H/jb+Tf5i/i/+2/3j/TD+VP5V/mr+j/64/gn/af+S/6X/8/96AB4B/wH9AsQDagQQ
+BdkFBAeJCEgK7gshDUEOoQ/TEJURLhK9EisTfBOWE1YTvBKwEVwQTA97DqgN1gzhC/8KSwo4CacH
+LgYhBVkElwPFAgoCUAF7AOP/iv/7/ln+I/4t/uH9Qv3p/AD9Iv0f/Tn9XP1a/WT9hv2R/V/99vyv
+/Kj8evwI/LL7fvs/+wf7ofrr+WD5Qfk0+f340/jm+Cn5nfkX+mb6xPpA+8L7s/wC/tP+Uv8xABoB
+qgE5Au8CZAPLA8UE4AVoBocGuAYKBycHCAfvBsUGTwajBTkFTQU/BakEAASIA+sCLgKyAW8BTAE+
+ASoBGwH1AKEAcgCEAKQAlQBIACQALAD//83/5P/2/7P/Z/9A/yP/B//J/qf+8P7//lP+l/0q/db8
+sfyl/IT8Pvx/+5v6TvpG+gH62Pk8+gL7s/tQ/PX8ZP2q/Sb+yf4a/0T/vf8XAMv/Pv8p/5H/0v/D
+/+z/dgD6AFUBkAF5ASwB8gDXAOIAAgHtAJEARgAuAPX/gP8K/8T+uP67/rf+xv4A/1X/of/1/04A
+cgCbAA8BRQHvAIkARADn/4n/V/8z/xP/4/6j/pD+b/7k/Wz9e/2S/Xz9ev1z/UL96vyJ/Ez8MvwQ
+/Ov79vsp/Gn8uPwN/VX9lP3k/Tb+gP7u/m//uf/I/+T/JgBaAE0AJwAfABQACgAMAPX/4f/z/9//
+jf+G/9D/3/+d/1r/X/+f/9D/zv+w/3n/Z//Y/zQA/f/I/9v///8lAD0AhAAhAYEBigGxAcQBggEX
+AbcAXgASAAQACQCn/x7/Ev8l/+P+o/57/j/+Lv5S/nX+if6G/oX+hf5q/kr+Tv5n/nv+ff5f/m3+
+r/66/sj+H/9H/xf/Ev9O/1r/M/8j/zr/Q/80/0n/cv+G/3P/Mv///hr/Yf9o/yf/BP/S/oP+kP6r
+/nv+Vv5d/qr+Qv+4/+n/HgCPAN8A4wDyAAoB9wDFAJgAfAB3AKsA+gAJAekA3gDqAOgA3ADHAIsA
+ZQBvADoA4P+k/1f/Lf9R/3z/iv+I/43/mv+i/6L/nf/H/w0AMABPAH0AgwBZADgAIgAJANf/u/8W
+AD8Ap/8u/3r/2//T/8j/zP/R////OwBcAD4AAAALADsA9v9g/0r/uP8CABAAKgBPAFYAfQDuAEgB
+iQHvAVwClAKAAjMC3QG/Ad8B9gHsAdsB2wH6ARoCNwJOAkUCYAKzAtcCyQLZAvoC7wK7ApcCVwLt
+AZUBMwHJAGYADQANAG0A6wBfAXUBNAFDAawBvQGNAaoBwgGRAZoB9gEQAsQBjQH1AfcC7AOhBIAF
+RQZfBi8GZAawBlEGjwUrBTcFLwXKBDIEkwM0A/cCigJeAo8CbwLOAS4B2QClAEAAi//S/mj+Xf5C
+/rj9Nf0W/R39Kf01/V79pf3J/en9GP4t/jL+Nv4u/hj+Iv5U/m/+N/7M/c/9Uf57/jr+Kf5P/n/+
+s/6d/kT+If4q/iz+T/6L/qn+wP7l/un+v/6d/qv+pv6a/jD/MQCgAFIA5P+3/6z/nf+n//D/PgBY
+AG8AeQAUAH//+P5M/sv9xP36/U3+hv5t/j7+Jv7o/Y/9ff3N/S7+T/5A/hr+6/27/YD9ZP1v/ZX9
+7P0P/sD9kv2v/bz9w/3k/fv9G/5O/mv+g/6H/n7+sP7q/tf+1f4f/1H/Rv8j/wL/0f54/lf+sv4H
+/xj/Qf96/6T/4P8PAAsA1P+i/7f/zv/P/8r/dP/5/tb+Bv8L/67+Xf46/hX+Iv5R/h3+zf32/T7+
+Rf5R/nL+Uf4F/uP98v0X/ij+Hf4y/n7+m/5X/iP+VP6W/qz+4v5B/2r/Xf9l/z7/1f6d/pD+e/5z
+/oP+l/63/ub+AP8M/0j/2v+JAEgBEwKSAqUCrQL7AiAD+ALlAgIDWQOaA20DEwPdArgCZAIcAmQC
+/gJDAz4DMgPtAnEC6QFWAd8AfwAJAJX/Qv/a/n3+ev6W/o3+a/5x/ov+af5u/hf/6v9OAIYA+ADE
+AcYCYAOFA80DMwSGBAwFjwVaBcQEywQXBeEEbQRVBGQEDgRkA+0CyQKgAlQC0wEgAcYA4wDjALgA
+rgC1AMMA0wC5AHwAWwB4ALwA6AD8AEUBzgEoAjoCbAKxAsQCswKQAmECJwLsAb0BTAGGAP//xf9q
+/wr/2v52/rP9QP12/az9iP1j/TL9Av0f/Ur9Rv0X/eL8MP3o/T/+P/5a/qX+9/44/8f/gwDXAAoB
+lgEOAvYBxQH0ASUCDQLhAdYB1QGlAUsB5gCSAGMAXQB2AIEAhgCDAEkAAgDn//L/+f/Y/7D/xf8Y
+AG0AiwBpACUAAgBFAKYA1ADsAPwAHAFDAQwBfQAlAAcAzP+E/zP/0v6A/iv+8/0A/hT+/P3n/dL9
+o/2X/bf9q/2E/Z391/3e/cf97f1j/sH+1v7f/hz/mf8KADMANgBOAHEAkwDXAAEB5gDjAPcA0wCj
+AJsAnwCIAGIAXwBfADIADgD8/9z/zP+//5f/nv/Q/9f/zP+v/3H/YP+h/6r/Nf8L/13/mP/G/+j/
+r/97/73/CgAyAE4AZACPAL8AxACNAEAA8/+3/7f/0v+8/3D/Uf+L/7H/hf9F/zn/c/+b/3f/aP+r
+//n/CgAUAEUAVgB2ANYACgH/ANkAuQDbAB0BKAEsAXkBwAGzAZABlAGiAYABQAFEAWEBIgEEAUcB
+RQECAaEA2f9m//X/kQCIAH4AzQDgAKAAdQCEAJ8ASADO/wMAbAA3APr/MwAnAJz/X/+q/9L/xP8P
+ALAA9QC6AMIA/wDIAEgA8f+z/1//Gv/u/pf+Fv7P/dz9zf1r/QT97Pw7/bT9B/79/cb9wv3R/bn9
+yf05/qv+3P76/h7/MP8//1z/Zf85//H+wv6O/jH+Fv5L/jH+3P3B/a/9r/0A/jH+A/7o/QD+8v3b
+/dT9nP16/a/9Bv5O/lj+//2H/Xb9uP3H/ZH9bv2A/bH9A/5D/ib+/v0F/tv9vf0D/kz+hf7c/g7/
+A/8F/yH/A/+W/j7+Ev7g/cP9z/3n/f/9Dv4U/if+Ov4+/lf+r/4Z/1T/jv/g/83/OP/O/sj+rf6a
+/uP+NP8q/wr/Ev8E/9P+lv5w/pr+8/4V/xr/Vv+N/1L/9f7c/sr+0f5c/yEAfwCSALwA8AAKAesA
+lwBEADQAhQDjAN4AswDQAPMAuABDAA8AOgCSAPwAgAHxAQsC1AGRAY0BuQHlAfUB1wGpAYABawF7
+AXIBFgGsAJcA+QCDAZ0BhwH5AYcChwJfAmUCUAJVAs8CXQOKA0ADFAOQAwwE/gPrAwME3QOYA5oD
+8AM/BDwEZwTmBBAFzwSOBGAEMgQQBMgDagNrA30DHwOWAg8CiwE7AR4BMwFRAUgBdgHaAdsBaAEi
+AXQB4gHsARoC+gLpAyMELwTABIAFEgavBqsHrAj2CAIJgQnlCZ0J+whgCP8H0QdgB7oGFgYiBSIE
+lwMsA4kCAgLcAcoBmwFOAdcAbQAzABMA/v/r/9n/3f8EAFwAqgCyAMgALQGzARwCSgJpApkCpwI/
+ApYBLQHUACsAX//I/m3+/v1S/Z78DPyx+5T7X/sT+y77cvtp+2/7oPuh+4f7jfu/+wL89vul+7z7
+PPyA/JH8wPwG/YP9Ov7g/lD/j//P/yEAMwDx/8X/0/+x/1D/Kf8z//j+e/5M/pT+vP6E/lX+d/6l
+/o/+Xv45/gj+0/3A/dP92f2k/Vz9Tf1o/Xz9of3i/SX+Vf6X/gP/N/8H/9X+4f4E//T+tP6A/ln+
+Mv7c/UH9tPws/KH7mfvg+5b79PrK+sr6qfqf+qr62PoO+yn7hvsN/A/8zfsF/Gn8i/yv/P/8Qv1S
+/W/94v1i/mn+LP4P/hj+Tf59/k/+1/2I/YP9dv1P/U/9gf24/cD9lf1o/Xj9xv0K/jX+Yv6O/rn+
+2P72/ij/U/8u//H+Cv9M/1j/P/9B/0L/Nv9H/2P/Tv/K/kX+UP5k/gL+kf1Q/R39Gv1L/YD9wf3i
+/b39uP39/Rf+8P3s/f790v2S/a79AP4b/jD+if76/ln/qf8DAGQAfwBaAGYAtADEAI4AjQDCAOcA
+zACEAFUARQBOAG4AkACrAL0AzQDaANoAvAClANkACgHtANgA5wDJAKcAtQCjAGMABQCk/+n/zABh
+AaAB7QEYAhkCBQLgAawBTwHsALsAsQC1ANsA+gDpAOAA9wAAARwBdgHaATsCVgIRAusB4gGaASYB
+nAAaAO3/EQBQAJ4A8gAwAWgBxAHzAboBigGcAdoBFAL3AZsBVAEzARkB+ADhAPoATwHEATMCZAJi
+AnECqQLRAs0CxgKoAnoCmAIVA44DkgNYAzcDKgOEAykEiwSxBLsE0AQMBfoEYwTwA9gDmQNLA20D
+lwMLA04CNwJSAuMBbwGkARQCZAK/AvEC4wKwAj0C0gHMARACMwLoAX0BVgFBAfMAqgCcAJgAgwCG
+AMsAIQFFAWYBngG1AYQBPgEUAcQAOQD4/xUAHwATADEANwD2/7f/uv/q/xcAOABFAEEAOgAOALn/
+hf9+/4L/iP+P/6f//P+DAO4AGwEUAe8AvQClAL0A0ADjABoBQAFAATABHQEMAcAAVgBDAHYAlACb
+AKMApwB1AAYAtf+Q/2H/Iv/1/u/+DP9L/4r/kP9X/xL///4D/+/+xf6Z/nD+VP5b/lv+G/7a/eH9
+0v2V/dP9ef6z/qH+r/6n/pL+lP6C/ij+uf2j/c792f2i/Rv9vfzP/O/8Ef1P/ab9IP6t/lP/yv+o
+/2H/XP9K/yz/Kv8k/+X+af4G/tj9o/1j/UH9UP2J/eP9S/6T/sL+7P73/t3+wf7G/r3+af7u/aL9
+nP2k/Zb9fv2X/fX9U/6S/ov+Mv4Z/l3+Uf4V/j/+V/4p/hL+/f3v/b39dv2L/dj9D/4v/kD+Zv6E
+/lD+If5A/ir+2P3W/Rb+W/50/j/+Ef46/pH+3/45/6r///8JANn/vP+7/3X/L/9a/5n/yv8FABAA
+8v/+/2UAsgBiABEATACQAG0AUABvAHgAawCDALYAJAHTAfsBLQFrAKIAFwENAe8A+ADrALwAnQC3
+AOcAxgBuAHQAyQDgALkAgwA+AAsALQB7AE8A2f/C/+D/0v+a/0//Jf9X/7z/zP99/1b/Z/9G/+T+
+nv6B/oT+uP7V/pX+Bf6M/Zn9uP2N/bv9RP6M/qP+vP7s/lz/6P9OAJkALQE8AlID5gNUBPEEOgVO
+Bf4FAQeGB6YH3QdgCLkIcAgdCC0IEAjAB8QHwQdbB/UGmAYRBp8FUAXVBBwEkAOIA5kDYwMsAwID
+ogJyAuICXANhAx4DxwKUAo0CaAIkAu4BtAFXARYBMgFBAeQAZQAgAPL/nv9Q/wb/oP5A/t/9aP3l
+/GH8G/wL/OH7pPuF+6T7v/td++H6E/u7+zv8qfwu/ZX90P09/gf/k/+N/47/DgCfAMMArgDDAAUB
+MgEwAVQBsQHpARICWAJ/Ao8CoQKJAmcCZQJJAvsBrgF1ASABxwCpAKcAlQB2AGgAbwCAAKUAzQDd
+AN0AwgC0ANUA2QCRADYA/f/n/9f/qv9y/1//kP/X/+v/rv8K/zv+4/3w/bD9Fv12/OP7i/tc+xb7
+9frr+rX6mfrW+ir7hvsF/GL8hvzJ/Fn91f0X/nX+Af+A/9X/OgC7AAAB4gCSADgACgAmAEwAHAC2
+/5P/vv+p/zL/6f7L/qD+sP7e/s/+ef5B/k/+Gf68/aH9ov20/eH9Jf53/tT+Iv81/yH/Fv8m//v+
+Tf7R/TL+o/5//jL+6/3Q/f/9Ov5d/lH+K/4U/h7+FP7T/ZX9V/0N/fn8/vzM/GX8HvxN/ML8/vzx
+/AH9T/25/Qv+Iv5c/sz+GP9E/2j/fv+F/4b/m/+v/5b/bP9+/9H/PgCxAMwAkgB2AIEApQDtAFkB
+8AF/AsAC0wL7Ai8DHgPeAiYD7QNIBEsE2gSrBb4FNAW3BEgE+wP+AwoE/APPA4MDKwOSAqYBtAAJ
+AKb/aP9H/xr/r/4c/pX9FP2N/Cn8+fvj+/T7QPxn/DL8OPyv/PD85fz5/C39gv35/T3+NP5d/tv+
+H/8a/0n/uf8nAHYAnwCpALIAzwDfAOQA8QDoANIAwQCgAEMAuP98/6n/tP92/4z/PwDyAE0BpwEM
+AlkCwQIYAx8DHQMAA6kCZAITAooBCgGcAC0AGACEAMYAcgBCALYAQAFhATYBCgHhAJYACABs/zb/
+NP/n/nn+Sv5A/jb+Tv6R/s/+/f42/4z//f9eAJUAtwDCALgAtQCzALIAkgBSACwALABCAG8AvQAZ
+AR0BwQDUADwBKQHrAOoA4ACtAI4AiQBCAN//2f8gABwAtf+4/0AAmgCfAKgA8wBLAWEBTwFEAS8B
+IAFGAV4BOgELAekA1ADfACkBXAExAe8AsACEAIUAZwD6/5H/kf/w/ysAFADp/+H/5P/E/53/hv9m
+/0P/Rv9Z/2r/nf/a/+X/4/8rAMsANwEDAdcAaAHuAawBWQFnAXQBYwFBAVQBywENAuQB6AEuAksC
+NgJJAncCcwJeAmcCWAI3AmcCpgJkAt4BvwHqAbwBfAGlAaIBLwHNAM4A7ACjACIA2/+p/2b/P/8S
+/8P+hf4s/rn9f/1m/UP9Iv0m/Wf9xP3Y/dX9U/42/xcAvgAoAaABJwKxAnEDNwS3BCcFmQX1BW8G
+vgZ/BkAGbQaXBoUGagZHBiMG7gV5BdsEDAQkA2MCmQG3ACUA1v9y//b+gP4m/un92/3//ST+VP6/
+/kL/if+o/+L/FgAiACcAVQC5AOsAzAC3AJsANwCZ/xH/xP5v/uz9cP0E/YX8APx9++b6UfoD+uv5
+xvmh+Vv5zfiU+Az5h/mk+c75QPrh+rH7gvwW/Yz9HP7t/tr/PQAsAFcAkgCMAI4AwQDkANQA0gD8
+AB0BKAE8ATgBAgHDAI8ARAD1/+P/3/+b/1z/V/8r/5z+NP5W/nf+Uf5a/qv+/v5E/4f/wP/z//b/
+uv+N/6L/4f/x/87/4v8LAN3/ZP/D/vX9Vf15/RX+Sv4f/gH+4P2k/Vv9Gv2i/K378vr0+h37IftB
++337p/vd+z78jvyq/OH8k/2F/jD/k/8HAI8AAgFMAVcBcAHdAWgCvgLCAokCMgK5ATMB7QDhAM0A
+xACxADMAkP9E/xn/tP5K/lr+xf4h/3z/2v8SAB4AMwCDANEA/AAtAXkBmAFBAQABHgEHAccAxACq
+AIYA0QAZAQcB7QC3AFUADwDj/7D/cv9M/03/Qv9E/0n/9f6C/kb+9v2o/bv9Df6O/gb/LP9K/5j/
+z//B/7D/5f82AIoACAGNAckBvgGaAaABuAGTAXABegGNAZYBlwGwAbQBmgGiAcsB4QG0AXkBjQHE
+AdgB6QHwAc0BqwHBAQwCLAIFAvcBDQI0Al4CWgIcAt8B1gHYAcIBpQF1AVkBZwFhAU4BQgEqAQEB
+BgFcAaQBngF0AVMBOAEeAe4AoAB6AGMANQAPAOj/2/8QADMA5f+C/3r/pP+s/4j/q/8FABAABgBO
+AJoAlQCcAO4ARQGDAZkBXQEcARoBEQHyANUAoQA7AKX/Y/+g/7X/tv///zAAOQBjALQA9ADgAMAA
+2QDlALYAeABSADAA9//Y/wsAYACaAPQAlwErAmQCTAILAuIBuQE3AcMAxQDWALIAgwBjAFkAUQAs
+ABkANwBaAIwA1ADcAGwA1f9S/+P+lP5E/vj93f3L/an9qP3D/b79w/0U/lH+K/4h/l7+UP7q/bD9
+r/26/cj9z/3z/TD+O/5B/nr+fP5T/oP+4P4W/0P/j//n/+z/mf+C/8D/4P/F/4r/Wf9i/3P/S/8z
+/37/vv+X/3r/sv/3/wYA1v+j/9X/NAAnAN3/xf/O/9P/1f+8/4n/Z/9J/xH/9/4c/y7/8v6i/pT+
+0f7//vL+/f4C/8n+7v5Z/xH/U/7X/YD9bP3J/Qf+2P29/c79t/1//VP9Yv2I/Xr9iP3m/TT+MP74
+/fL9hf4o/zL/+/7g/u/+Ff8k/xz/CP8Z/3D/sP+3/7z/u//M/+n/0f+//+D/AgACAPD/BAAkAPH/
+gf9E/2L/nv+//5L/Fv/h/kn/xv++/5H/+v+WAIUACgDU/8D/f/84/z7/rf8qADsA6f+A/0H/T/+N
+/8b/AwAyADQAKgAiABUA7f+1/6z/0//v/+v/1v+g/1P/Rf+L/wUAhwDaADUBvQEIAgYCLwKAAnMC
+GQL5ATYCjgKlAnYCZgJ8AmoCXQKqAhgDJAPiAtAC8ALXAnMCPgIkAsEBaAFSASUBuACSAMEArwCL
+AJ4AbQAAAN3/JACXALgAgAC2ADoBwQCQ/zP/c//v/sX9Pv2Z/dn9cv0A/TH9oP2l/Y39+P26/vL+
+gP6Q/qb/mwCqAKcAbgGrAlADGgNDA1sESQWMBf8FGwcZCGcIrQh+CUkKRQqnCUgJWglXCeQIRQjT
+B1MHoAb2BSkFAQQrA/wCpwL4AXkBEAGAAPz/mP9Y/xn/jP4R/l3+9v4b/y7/oP8zAI0AmgC7ACIB
+ZAFrAWsBPwHWACMAPf+R/gn+RP13/Pv7tPtZ++r6rfrB+tX6t/qh+p/6s/rs+ib7XPug+9j78Psj
+/ID88/xp/fD9vf6s/3IA/gBrAe4BXwKOApcCUALKAcwBhQLrApMCQQI5AkkCZgJYAhICywGRAWYB
+TwE8Ad4AKgCc/3z/Yv/v/m/+D/6t/YH9mv2p/a/9qv2t/fv9cf7H/vX+A/8C/w//D//z/uz+7/61
+/kz+6v1+/Rj95/zo/M/8V/zk+9b7/fsi/D38Qfwi/OL7mvte+zL7G/sI+x37kvs5/Jn8qPz1/JD9
+4v0U/pn+Dv9A/2b/k//C/9f/4f/3//v/2v+9//X/VwBcAC8AIwD2/5P/PP/8/pn+If4P/mP+o/6h
+/mX+B/6v/Xn9hP3R/Qj+Hf5t/uv+Ff/C/nv+jf7N/iP/fv/O////DwAwAF4AYAAZAJn/Kf8C/+3+
+nP4n/vT9A/4B/sz9kP1z/T/9Bv1C/b79/v0p/nH+vf4Y/4z/wP+l/5n/sP+9/8D/4P/8/+T/wv/f
+/zMAkwDwAFgB6wF9AtsCFgM1A0QDUQM4A/MCnQJNAhUCtgFAAQsB+AASAWABggGEAb8BEwJPAoEC
+sALdAg0DLwMEA7QC0wIjAxYD7QL5AkIDkQOYA5wDzwPFA6ID5gMuBC0EIQTiA5EDdANTA/sCXgLR
+AbEBwQGUAUEBKgEMAY8ANABNAEAAsv8Q/9n+CP8x/zL/D/+6/n3+ef6N/tf+Mv9g/4H/zP8aAC4A
+AgCY/xf/4/4H/0H/df+T/5//sP/s/2gA3AD8AOoA6QAVAXgBrQGAAUMBKgEsARcB1gCBADIAGwAx
+AFEASwDz/3b/HP8l/3b/r//G/8D/af8z/5H/wf9j/wP/4f7n/gf/PP9H/xP/IP+C/6L/jv+g/6v/
+tf/g////6P/g/xgAVQBpADQA4//h/yQAVQA4AOv/wv/F/9z/EQA3AAwAvv+e/8P/KQBlABIAqf/A
+/yAAVgBSACIA3f/B/+f/JABcAFEAAACl/1D/Rv9x/17/Tf9p/2z/d/+a/2T/3/62/uz+Dv8J/+T+
+rf6C/l3+Of4T/gH+Jv5h/o3+qP7o/mf/qv+m/73/CQBkAJoArwDGAMgAXwAHAIwAOgEhAeAATAHG
+AYQBCAH7AD4BQAHZAMIANwE8AWkAwf/U/83/Ff+H/rz+tf4B/q/9Ev5C/sn9IP30/GP9qP1w/Xj9
+xv3i/SX+iP5y/lT+0v5u/63/BAC0AFoB3AGOAmcD/gN3BCQFvwUpBpUG8wYvB4gHKwibCFkIrwdS
+B0wH4AbkBQQFogRQBMcDQQOjApYBWQCY/03/A/+j/jr+Cf4J/sb9Q/3j/NL8+PxK/c79WP6g/uD+
+cf/V/6X/U/8r/w3/+P7z/u3+xf5g/u39wf2v/V799fyS/CL84vvc+7/7nPup+8v74Pv7+z/8cfxe
+/Er8bfy4/AX9Sv2l/QH+Nv6N/lH/FgB/AL8ALwEBAr4CBgMvA2QDoAPNA9AD4AP/A+MDqAOMA3UD
+JQOpAkIC2wFPAa4APQDc///+IP79/eD9Nv2c/G/8h/zD/Of8+Pw3/Xn9j/3D/Sr+hf7b/j7/mv/F
+/7T/oP+U/33/iP+//+L/6f/l/8//3/8kADAAAwD4//H/sf9J//D+vP6Y/lX+4P1v/UT9Y/2n/fv9
+Pv5L/k3+if4K/8H/jABAAecBjQICAyIDKAOFAwAESgSuBP0E1wStBMQEmAT7AzcDhAIcAr4B8AA3
+APX/ov8w/9T+Tv6K/Qf9HP1K/Tf9If0J/dn8w/wI/Wj9jv2c/a793f1D/qb+5/4S/yH/Uf+s/8j/
+wv/a//D/DgAsADAAYADCAAIB7wDFALkAmwB/AJYAswChAGwAMgDt/7D/fP9G/xf/2P6l/pX+l/6n
+/oL+Uv6g/ib/gP8FALwACQFDAQICuwL3AuoCwwKoApcCTALLAVoBAwGzAJQApwCFAEcAcQDRAOgA
+wwCrAIwANwDX/4v/WP83/wL/mf4j/vr9+/3l/fD9PP6N/uH+XP/U/yEASwBlAG0AQwAfAC0APgA0
+ABUA9v/i/9//zv+k/57/tf+S/1z/r/9EAEkA8P+d/2b/hP/O/7P/Uf9Z/9L/KwAjAOf/xP/X//L/
+GwCBANsA1wDBAOMACwECAc4AqACLAEkADwDt/9//EQBpAHgAVgBzAIgAQQARAAQAwv95/1r/W/9G
+/+j+gf5P/jD+Df4S/kD+aP5S/jz+p/4T/+v+uP4I/6z/HQBAAF4AjwDOAB8BZgGkAfkBFgIPAnYC
+1gJ0AsQBwwFvAo8CugEdAVQBYAGkAO//yP+G/9H+eP7k/kj/G/+//p3+xv4L/yD/6/7V/jH/o//e
+/ykAiAB2ACQAGAAHAKX/S/9e/5z/s//A/9r/3P+b/zT/9/7m/sD+lP62/jj/lP+p/+H/4f9k/+b+
+0v78/u3+mP54/uX+Uf9J/xX///4N/xH/Lf+o/wYA+f8FAGIAkgA6AMj/0P8DAOr/vf/3/4UA2wDI
+ALwABwE0AfkA0QD9ABkB3AB5AGIAVwDW/3D/Zv8s//j+X/83AMUAdwD+/0wAgwAYAC0AkABYAC0A
+iwDtAAkB5wC8AKEAdgB2AMoA0gA4ANb/KgBRAAsAAQDs/6L/lP+k/7z/AgBDAFUAdQCsAIkAAADA
+/8n/kv9a/4n/mf9I/27/+v8ZAPf/+f8jAHkAoQBnAF8AuAC9ADkA5//l/8T/of+V/3f/WP9d/5n/
+z//K/9b/RwDIAM0AkACCAI4AhgBiAFcAbABUADcAUABeADAA3/+S/9D/ygB8AXgBgwGcAYcBnAGO
+AfoAaQAvAAcAAADm/2f/Df9B/5X/l/+O//D/RQApADUAuAAPAckAewDKAHgB1QGvAbMBIgJqAlcC
+OAJTAlsC8gGOAagB0QGSAWUBlAGbAUQB0ACCAEoA5v+q//H/KQDu/8T/+//9/3z/Ef8F/wT/yv6e
+/s7+G/+L/xgALAAZAKsAfAESAuwCPARABZMF8gXyBs8H0gfMB5UIZgl2CSsJ+AiJCJwHpgYeBrAF
+4wT/A1MDywJfAu8BJQEQACX/a/7A/TD9sPxl/F38M/y2+0H7IPsh++36nPqV+rr6s/q6+ur6P/vn
++6f8Iv2V/TT+aP4W/jX+2/45/0f/jP/3/xkAGAD0/2L/wP5X/vD9xf3Z/aj9Wf06/RX9Bf3+/LH8
+bPx+/MH8Vf0z/qn+wP4I/3r///+BAOAAIQFtAfMBugJ9A9QDygOWA1cDTAMxA5cC+gHFAXgB8gB+
+ABcAhf+u/vv9sP1x/Qv9sfx6/FP8DfzD+6f7bPv8+oD6CfrL+db51fmt+dn5Zvqb+rX6SvvS+xn8
+oPxq/Sz+4f6V/yUAeACOAHkAcAA6AJv/H/8j/yf/6/7P/uD+8/4o/3b/xf8vAH4AcAA9APT/fv8d
+/+z+p/5L/hb+Jv5W/nj+nv7f/ir/g//8/5UAJAFnAWQBPwEDAb8AfgBNABAAmf8Q/57+Uf5m/oH+
+Qf7z/ar9ev3A/QD+dv2l/HP8xPze/Ir8Ufx8/Kb8kvyx/Bf9Jf0X/X79/f1K/rT+W//H/93/LAC8
+AP8A+wAdAWQBjwG1ARMCoQIoA3YDqwMJBEAE/wOzA6sDrQOtA74DqANPAxQDCgO8AjICvQFnAUIB
+VQEyAcEAkwDQACUBRgErARcBRAGzAQcC0QFSAR0BKgEqARMBBQHtAMsA0QD/ADUBSgFDAUgBQAHs
+AHYAQwAZANL/2f/+/93/r/+c/5j/pf92/x7/If9s/8H/MwCHAHIAOAA8AH8AtgDLANgACgGhATwC
+ZQKDAhgD3gM/BDIETgTYBEoFUgVyBfcFVQYwBhUGYwZ4BvwFbAUuBR8F0AR5BJ8ElgTFA9ICQwLO
+ASABXQD9/yAAUQBbAFcA9P8m/4v+gP6Z/mD+7v2s/bD9sv22/dX9ov0L/cn8Ef11/av9sf2//Rj+
+p/4h/37/iP9j/4n/uv/f/1YA9QBEAU0BZwGNAY8BWgEBAbsAxQAjAasBIAJaAmkCWAIVAqcBUgFP
+AXEBXQFHAVABKQEmASkBpwAeAMj/WP8v/4n/qf8w/8z+yP6k/vr9P/3y/Nj8ufyJ/FT8VPxI/NH7
+Z/uN++n7/Pvu+xb8Z/yf/Kn8zPwj/Wb9bf1i/Y/9/v1i/nT+Uf5X/qP++/4e/yX/Vf+h/+D/IACD
+ANMAzQC8AOgAygBbAEgAPQDF/2L/RP/P/uj9b/2y/dL9f/10/br90/37/U3+b/4Q/mL9D/0W/e38
+tPzM/P789fz8/Er9Z/09/Vr9pf2n/ZD9vv0o/n7+b/45/kT+kv7o/gD/6f62/on+o/7k/gX/3f6Z
+/pv+4v4Z/wv/uv58/o7+oP51/l7+kf7j/jb/l//m//z//v8LADoAhQCpAH0AFQCO/2j/v/+//1H/
+H/9A/4L/0f8HAAMAyf99/2P/hv9q/y3/bv/e//f/+P9EAKcAggD5/8D/8f8pABQA3/8XAMcAOQEy
+ATUBaAGnAd0BAgI6Aq0CMgOAA5MDbwNZA3kDZAMfAwsDBAP2AgYDKANCA1sDWwMvAwwD0QJHAvIB
+HAIjAuIB0QGhAQIBngDBAPIA7gDfABIBagFlAQIBnQA7AN7/sP+l/6v/3f8wAH8AugDSANYADwGA
+AQwCygKWA0QE4gRwBeoFMgYuBhIGFQYqBkgGawZdBi8GNgZNBh0GpQX8BHMEbwScBIkETQQHBL8D
+iwNaA+8CZQL5AYQBDwHYALQAZgDm/0v/zf5H/qb9WP1F/SH9WP3R/db9nv2Z/af91P04/pj+1v4O
+/1L/kv/J/9H/m/9b/zb/Iv85/5L/x/+7//n/dwCuAIsAPwDx/9T/8f/4//D/GwApANn/mv+q/6H/
+iv+3/+v/KACcANQAvgDRABgBPwExATMBKAH1AB4BgwFgAeMA6QBZAYIBagFeATEB0QC5ALAADwBQ
+/+z+i/4Q/qL9O/3L/D/81vvh+/z7rPtV+3P7tvur+7T7NvyN/FL8Q/yZ/Jj8ZfyM/JH8TPxS/Kn8
+//xV/cb9Ov67/nT/EQBUAI8A4wAZAR8B2wBlACoADwC6/z3/1/7G/gb/P/8W/5/+Zf6L/qL+c/44
+/iz+OP4v/hv+9v2U/Sr9JP06/QT93/y0/Cv89Ptm/Mb88Pxa/bD9vP3i/fX90/3V/QP+EP73/QT+
+Ef7P/XD9Nv0Q/Q79NP1W/Wn9iP2o/Y39X/10/Zj9hf1g/UH9N/1O/VL9Lv0n/Xn9Av54/tn+Of+X
+/+z/GAAwAEwAUQBWAIQAwAC7AIIAiADJAOUA3wC8ALkAMwGFATYBxABuAFAAbwBmAB4A3v+s/5D/
+e/8t/7/+Xv4Z/gT+Ef4p/ib+Bf70/Qf+QP5f/kz+Uv6W/uP+D/9f/8P/2/+3/5z/rP/H/97/AQA/
+ANAAjAHWAcEB5AFEAqAC+gIiAxwDRgN2A6QD1AOKA8QCNQIzAlECYAJ5AmQCUgKAAmgC3QGDAYkB
+gQFtAX4BXwEiAUIBiwGkAW0B2QByAIgAggBGAF4AoQDDAMUAvgC3AIYAUABpAKUA0QAYAWIBhgGZ
+AYUBWgFNAUABCQG8AL4AVQEOAjoC2AFSAaQA+/8lAKgBeAOLA+0BAQHQAQIDLwMnAvAAqAAcAZwB
+IQK1AuACGgKpAJP/ov/pAFIC+wHy/43+Rv9QAbMCDwJEADD/I/+N/y0AkQB3ADoAPACAAAMB2AGU
+AoUC0gFwAcMBmQKtA0EE1QPjAhwCoAFoAX8BjQE/AfEAGwGUAfEBFALqAZoBTgEZAUwBiwFRAdoA
+egAPAHX/4v6m/rL+uP65/sn+7/4u/0L/F/8B/x//Fv/+/mH/0/+l/1T/Uf+I//n/UgAyAPL/EAB8
+AN4A8ADBAJoAqgDEALgAhwAxAOD/jf8u/xn/Gv8D/zr/hf+M/5n/2/8vAGYAUQARAOz/5//U/6j/
+cv8J/2b+Af4G/ir+Uf5z/lv+Hf4a/oP+3P6w/nX+ev55/nz+hv5I/rf9PP01/Yz9/f09/h3+5v3Q
+/bD9e/1v/YT9V/0P/QX9M/19/aL9oP3C/cz9jP2r/Wf+Cf9C/17/dP9e/0D/af+Z/1H/1v6e/qb+
+7f5P/2b/Jv/D/nb+av6C/or+m/7Z/g//I/9I/33/cP84/zL/Ov9O/3//rf/n/0IAnQCwAK4AuQCN
+AC0A5P/S/9f/4P/Y/9r//P/W/3H/i/9GANgA5QDnADABigG6AasBVQEBAeQA0wCwAGgAEADu/9P/
+d/8v/1L/tP/S/9T/XgAAAQ4B9AAbATwBHgH6AAsBXAGmAYwBMQHsAPIASQHTAVkCuAIZA4sD6QMf
+BEwEfARyBFMEhwTxBDIFGwWxBC0EzAOTA2kDEQORAlgCHQJfAb4AfgDM/9n+mP5+/uL9b/0w/a78
+G/yo+3P7a/sy+8n61vpd+3n7N/te++X7T/yY/Pj8ev0b/tH+cP+j/5X/2f91AAcBRgFUAWoBhQHQ
+ATwCVgI+AkUCWgJnAm8CbwJnAlkCMQL6AcwBmAFWAf8AjgA6ABwA8P+b/1b/TP9e/1f/Tv90/47/
+ef/J/1sAYAAWAOn/yP/l/zQAXgBjAGgAjADbAP0AgwDI/43/vv/L/7f/oP9k/xz/BP/1/pH+AP6/
+/cv93f3M/Yz9Qv0j/VL9eP1V/WL9w/0O/iv+V/6a/u/+W/+w/+f/AgAWAEgAfwDEABEBMgFEAXgB
+5AF3AukCGgMVAxQDbQPmA8QDVQNvA3kD+wJyAuoBegE0AdgAjwBlACgADAAtADgA6f+O/5D/pP+B
+/2L/Rv/1/oj+Pf42/k3+af6P/pf+f/6m/hT/ZP+3/xAANABjALwADgEzASgBKwFKAWsBfQFIAe8A
+/QAkAd4AngDDAO8A6ADYAMYAsQCsAL8A0AC7AJ8AiQBWABUA2v+//+b/BADn/7X/bf8d/yX/lv8E
+ABgAFQB1ACQBiAE9AdUA0wDZAJgAJwDZ/8H/gf83/zz/Uv8//zf/Pv85/3n/+/8VAMf/uf/J/4b/
+Qf9P/6H/CQD+/yD/LP4m/vb+vv8AANb/wv/y/xoAiQBGAVYBsgAqAOn/FgDbAJQBfwG5AAsAnf9Y
+/5T/+v/h/6v/9v9oAIoAYAAHALT/kf91/z3/zf5C/jb+1P5Q/wn/Tv7W/d39Of7i/oX/gv/l/nD+
+hv4B/1j/Bv85/pv9w/22/r3/DACF/93+3/5i/9z/HgAlACsAeADVAOIAlwBIAAQAi/8e/yL/SP9H
+/zf/QP9u/4f/cv9q/27/g/+L/0L//v7y/qH+HP7o/e/9HP5q/pT+oP7H/gX/R/+s/93/cv///iv/
+hv9u/yP/Gf8d/wX/Jf+D/5j/Wf8i/xL/Of9b/17/c/9v/1j/eP+b/5H/Xf8G/+L+BP8+/5X/7v8T
+ABQAAwDU/8H/3//e/7v/t//S/+//IQAqAKr/Jv9X/8//2P/G/87/sv/l/3wArQBpAGYAqADYAAUB
+NAFLASwB+wAzAasByAGSAVsBKQH/APwADwH5AKUAhgDzAHQBowGeAXEBKwH2AOEA5ADXALEAuwDv
+APYAvgBkAB4A/P/W/67/tv8EAFYAfgCkANkA3ACtAIAAZgBmAIAAxQAfAToBAgHOANoAAgH2AKAA
+agCCAFQABABBAH0AOgAYAB0AFABQALUA4wDPAJ0AmADRAN4AiwBYAI4AzgDCAKMAsQCCAB8ALQC1
+ADUBNgHYALYA8QAJAbsAbABVADEADwAQABEAEAASAA8AAAD1/woALQBNAHMAiQCLAI4AkQCQAHYA
+bgCYAKwAkABqAEUAJgA+AIgAyQDwACABmAHKAUkB3wDnAAEB5QChAIIAfwBlAFQAeQCOAEYA8/8T
+AHEAlwCTAHoAUwBsANUADQHIAGoATQBVAGsAdgB2AH0AiQCsAOIAFAFIAVUBSAFdAXABdwGDAYUB
+hAGdAb8BjAEXAd4A8AAIAeoAdwD3/97/KAB6AGwAJgAvAGAAYwBlAF0A/v+v/9f/BgAQAA8Awf9U
+/17/tv/+/yEAAADy/0UAcgAkALv/jf94/3v/yv8BALz/Vf9J/3X/j/+G/1r/L/8x/0n/Of/8/r7+
+kP6C/oL+b/5a/oX+7/4x/yv/L/9U/2D/Uv9E/1b/hv+V/5L/vv8AAB8ACQDo/+f///8aABsA/P/B
+/3L/a/+Z/1f/3P7E/tr+1P7E/pz+ev6Y/p3+ff6S/on+XP6F/tb++/4H/wn/8v61/pf+2v4c/yP/
+M/9L/0n/b//T//H/zP/X/wIAMgBJAEIASQBfAFwAMgAuAFUAUAD7/5j/gP+Y/5z/mf+t/7f/sP+u
+/8f/9f/8/6P/H//o/tj+lv5l/lf+C/6K/V/9sP3S/ZH9Uv0X/QT9Sf2V/dv9QP6C/rn+Ov+G/0X/
+JP9W/13/P/8//2f/hf+E/77/PQCjAPIANQFcAYwBugHQAfcBQQJ7AoACaAJOAkQCHQK6AT8B0gCg
+AJEAbABLAC0A7v+W/zj/+v7O/ob+Ov4U/hf+Cf7I/YX9Tf0a/Qb9Cf3x/P78q/2L/s3+mP5w/lP+
+cP7Y/g3/Af8N/z7/iP/f//n/1v/P/87/vP/x/4QAJAF1AaEB8gEoAj4CmAIOAyoD7gK7AskC4QKo
+AhQCWAHTALwAowAmAKP/d/+H/6P/tf++/5r/Wv9M/0b/Bf+w/o7+ov6y/rz+t/6V/pz+1/7o/sH+
+zP4C//r+3/4B/xP/3/7B/q3+lf7+/qv/5v+z/33/Z/9k/0//JP8f/2T/7/93ALUApwBxAC8A9v/X
+/83/wf+f/4j/qf/g/wYAKABYAH0AkQCrANQAKQFvAUUB8QDYAPMA7gCVAFMAZgBPANj/iv+n/7L/
+sv8RAHYAqwDZAMAAYQAxAGIArQDBALQAnwByAHAA0QAlAQUBtQCrAPsATwFlAUEB+wCwAJkAlwBC
+AOX/AgBaAGEAJAAXADsAKQAMAF0AtACvAMEAIAGZAeoB4wGaAUkBKgE1ARYB1gCxAJ8AkwB1ACoA
+3f/A/+v/RABoAE4AagCbAJwAugAAAUcBcgFUARMB0QCJAFsARQAiAPP/uv+N/6L/tv9u/0n/mf8E
+AIIAIQG9AX4CSAOvA+sDLgRPBJMEKQVfBewEiQRSBAoE/gNnBP0EVAWyBY8GTQdpB14Hjwe+B2EH
+kQb8BZ8F7ATtA/oCFwI6AYEA7P9m/+3+af7j/Yb9N/3F/ED8zPti+9j6LPqI+QH5lPhI+Cf4KPg7
++HP46PhP+V/5kflu+nX7+/ta/OH8IP0u/XH9tv0H/mL+iP6//ij/Zf+O/93/FgBMAMAAXgHDAbAB
+jAHFAQAC4AGvAYMBLQH+AAsB9gDBAIUAKgDr////IwD//67/hf9j/wX/sv6W/of+Vv7y/cP95f31
+/db9sP2d/av97f0z/hz+1P3f/Rn+Mv5V/nD+Rf4+/qb+9v7p/q7+X/41/lf+kP6b/ob+iP6r/rX+
+hf4e/sr90f3z/Rn+Zv6W/nD+S/6T/hL/Lv/1/t7+Fv9//9z/CQAkAFYAgQCqABYBnAH5AToChgIF
+A4cD2AMRBEIEXwRpBF0ECwSTA1YDTQM/AxID4wK+AmIC5gGqAZ4BhgFdAQ8BdwDT/5n/iv8f/4b+
+9P1f/QP93Pyq/Hz8W/xF/GD8lvzC/Bj9lf3B/cj9D/5Y/l3+Pv5J/oP+xv7v/g3/Xv/N/y8AqQAx
+AaQBAQJKAqMCBQNBA2oDgQNrA1UDZANnAycDwgKJArEC0QKKAj0CEAL5ARsCMwI0AkECKALuAcsB
+lgE2AfAAsAAIADb/B/9s/43/U/8n//3+9P4z/2n/hv9+/2H/sf9TAIEADwDE/9r/wf+P/4f/cv9L
+/zT/Tf+P/7b/s//O/wwAOwBPAF0AjACtAH8AKwABAOv/uf+l/7f/m/9o/07/Ov9C/0T/Cf/V/uf+
+Qv+s////TwCpAAQBRgFUAUgBXAGAAZgBlAEuAaEAhQCTAEcAKwB6ALgA6QAkAVoBlgGHARoB1ACQ
+APj/jP+N/3//Kf/q/gT/Lf86/2b/h/9c/y7/Ov9f/2b/SP8I/7n+sv7v/gj/6P6e/k/+OP5F/lz+
+bf5Z/kz+Sf4l/vH9w/2s/ZT9Zv1l/ar9+/1W/sP+Cv8r/1j/pv/x/x0ANQBWAJIAawDJ/4b/uP+F
+/wj//f49/3n/wv/3//v//f/i/8D/3v/4//D/EgBoAJsAZAAeAB0A1P8z//3+C/+7/kz+QP5w/rf+
+BP8g/yL/Bf+z/sP+PP91/4//r/+U/3f/fv9s/z3/L/9R/3H/a/9J/0b/b/+A/27/gv+9/9b/tP93
+/1T/Of8f/0f/Uf/3/uH+VP+g/6L/1P/y/9b/5f/3//j/QwC/APoAjABu/4z+u/6Q/x0AKQAHANH/
+nv/W/3EA3wC/AFcAQgC7AJEBOAIWAlcBpgBSAF0AgABxAEwAKgD9/77/fv+E/9b/CADd/37/T/9a
+/3L/uP8OADUALAALAP7/BwD1/7H/kP+g/7X/BwCNAPYA9QCUAGEAeACAAKYADgFcAagBLgKbAsEC
+0gLkAgsDTwNnA1QDcQOrA70DogNnAxUDzALAAgEDRgMuA7gCNQL9AQsC6QFzAScBMAE3AREB6wDH
+AHgALgAQAAEABQAzAIEAugCpAJ0A9AA2Af8AwgDGAPoASgFUARMB9AARAXEBBwKAAqYCqALsAl0D
+pQOwA2cDtwIcAhkCXwJqAiQCtwF7AXQBTwEAAdsACwHwAGcAQgBxAEoA7f+v/5z/fP8O/5n+Wf4q
+/gr+6v3W/fH9GP41/nr+8f5R/3X/aP9D/0H/dP/b/ygAEgDu/+r/CwBTAIoAoQCQAFIAVgCzAPcA
+6wCgAIwA5QAVAQABCAHrAGYAEgAZAPL/qv9z/yT/2f7Y/vv++v7L/oz+e/50/jH++v0S/iz+D/4N
+/lL+Wv4I/uT9Af4I/uf93f30/fb9Cf49/jP+9v3c/e39Cv4d/iL+Rv6V/sP+l/5h/nj+w/7//gT/
++f4N/yL/I/9A/27/f/91/2b/bP98/4n/nf++/8H/fv9c/6r/zv9M/9j+3P67/oD+hf6W/pj+mP6B
+/mP+WP5T/mn+mv6v/oz+V/43/hT+1f2U/XX9fP2m/e39Gf4s/kz+fP68/gD/J/8+/2D/eP+B/5b/
+k/9Z/xj/Bv8T/xH/Av8K/0j/m//F/9z/CAAxACgA+f/b/+b/7P/D/2f//v7y/hz/GP8G/83+gf61
+/j7/cP9W/03/UP9n/4n/gv94/3r/e/+t//3/7f95/zj/XP9t/y//7v7R/qr+l/7V/ir/Zv+i/9v/
+/v///+r/8P/9/9P/xf8TADIA8//R/97/0v+4/9n/PgCFAIoAjgB/AE8AUwB/AKUAxQDjAAoBAQGe
+ABYAxP/t/04AmwDvABUB9AAZAVsBBQFiAPr/zv/6/0sAaQCTAMwAywDMAPEA5gDFAPEANQFDATwB
+RgFPATMBKwGAAfABQgKgAgEDJgMFA9QCowJ2AjkCngHPADcAAgBYAMYAzAC2AM4ADgFJAVoBRQEH
+Ac8A1wAHAQkB2gC9AJwAXAAjACAAZADGAO8A/ABFAYcBPwGoAHwAxwDpALsAmgC6AA8BeAGeAUkB
+4gDgADIBrQEWAjUCXwKoApUCAQJXAdgARADR/+j/IwAcAAAAIAB2AJkAewBtAJgA6QBRAa8B6gES
+AiICDALEAVoB/AC+ALYA9QA+ATcB9QDRAP4AaQGqAaABlwGiAaIBoAGTAWYBRwFVAWsBggGZAVsB
+2gDjAGABWwHzALYAfwBTAFgAWwAvANj/lv+z/+r/0f+w/8z/7//h/7j/qv+K/0b/VP/J/w8ABAAm
+AHkAiQBSACUA//+9/4b/av9W/1T/dv+U/5//vP/K/7b/tf/m/xoAQAB6AIgAWQBVAIAAlwB2ACYA
+zP9+/y3/xf5w/jL+Bv4I/hH+A/7+/eL9nv2m/f79N/5Y/m3+ff7j/l7/ff9o/zL/4P66/rj+Wv6c
+/Rj9/vwK/SL9Uv18/Yn93v3B/oP/qf+u/73/sP+w/5j/Uv8N/7j+W/78/Zr9Sv1E/Zj99f03/l/+
+ff6o/sH+3P4E//L+lf42/vL9xf26/Z79Zv1P/Wn9ov3X/fP9Av4m/nT+vv7H/qn+ef43/hj+K/4R
+/r79m/2j/aX9v/3S/dr9Hf6E/rH+j/57/rX+2f6p/o7+f/5R/kX+SP45/k7+fP6l/uT+M/91/4n/
+lf/d/0MAdgBlADMA+P/k//D/7v/y/x8ATgA7AAgA7/8BABUAAQAFADEALADg/7D/z/8CABMA9f+O
+/wn/Ef+d/+j/y/+A/z3/VP+u/+H//P8kADsATQB0AJcAhQBQAF0AtgAQAT8BKQHRAI4ApQDDAKwA
+sADaAP4AJQFMAVwBWAFTAU8BRQEtASABOwFbAWABUQFCAUoBgAG/AcsBqwF3AUkBMwEuASwBLQE9
+AVcBggG0AdYBEwIzAu0BsgGjAXcBdgHAAbwBQgHgALsAsADEAN0AEQFPAX0B5gE9Au8BagFtAbsB
+ugGBAVUBQQE4ARsBDgFNAYcBjgG0AQQCMgIlAiUCNQIwAksCngL2AgYD3gKyAlgCEAI6AnECYAI6
+AkQCbAJ8AlYCGQIRAjwCXQJkAlMCRQJAAggCuQGPAUMB3ADcAAkBugBBAG0A8gAQAesA4wD3ADYB
+iAGoAbkBzAGhAXsBnwGXAUgBQgFYARoB6wAIASoBBwHQAPEAEAHxAPsAJgEmAQEB7ADqAPAA/wD9
+APIA5gDOAKsAbQAoAAIA4v/K/9D/1P/a////AAD6/ysAOAAIANj/8/9/APQA3QCbAJsAsgCuAKEA
+dwBsAOEAcwHxAXsCpwJLAuIBvAHEAc0BpwGGAXsBHgHDAOcAIAHlAGoANAA8ACYA8P/U/87/hv8K
+/7r+kP5c/iD++v3j/aD9Q/0p/TP9H/0O/cv8JPyV+277gvu8++z7uvtT+1P7qvv9+1X8j/y1/A79
+ov1E/rH+5f4S/0P/QP/7/t/+G/8a/8n+3f4p//r+r/67/tX+7v4g/z7/Sv9b/1P/NP/k/m/+Q/5S
+/nf+uP7k/tD+dP4g/v39uv1B/eH8zfzS/NH84vzP/Iv8ffyE/Gz8cPyI/LT8HP15/Wr9Gv3u/PH8
+AP0Z/Sv9DP3R/LX8t/zQ/Pf8HP1b/d39c/60/qT+nP6p/qT+xf47/2T/A/8q/wYAawAxAOD/j/9S
+/zf/KP8c/xL/HP9y/9X/0f+E/1D/Vf82/93+y/4e/1X/f/8AAFwAIwC7/1z///7f/vL+C/9E/67/
+AwAAAMD/jf+C/3r/Nv/R/qD+1/5E/2n/Pf8u/2b/nP+/////PAB3AM4AGwFJAWgBYgEAAXwANAAu
+ABEAxP+J/zv//v5O/7D/nv+f/+j/RQD0AMcBNwJKAioCHAJmAocC9wFIARwBMAEfAeMAmQBYAEEA
+hQA3AQACXwKQAgoDkQO7A4ADJAPHAkwC6QHHAYwBFwHcANoAqQB7AHAAewC8ABEBXQGHAXgBWAFF
+ATMBEAHkAK4AgACPAKkAjgCwADUBRwHNAB4BPAJ7AuQBrwHeAf4BCgIHAv0BEwIkAhIC5gGgAYAB
+rwHHAagBwwEPAiACzwFmAUkBKgHQAKsAyQDnAAUBDwEEAQsBHwFAAW4BpgHGAdAB5wHQAZYBgQF8
+AVUBHgEoAXoBkwE9AeIAwwDZAAMBEAEJARABPAFyAYIBcgFrAZkB5QHsAY8BTgF2AYkBGgGXAEAA
+8/8DAGMAqgDgABcBRgFcAT0BCgEAAe4ApwB6AKUA9ADnAHoAUwCWAK0AdABfAIQAlgBuAD4AVAB4
+AD4ADQBNAGkAFgDy/xQAHgAPAPP/6/8DAP//1//W//T/5v+u/47/k/+V/6f/2v/Z/5b/dP9z/2X/
+SP9F/1X/Tv9Q/3D/hf9v/y3/5f7i/hv/Lv/d/nj+a/6T/q3+tv6w/r/+7/72/q/+e/6W/pb+iv68
+/tH+o/6d/sz+xP6c/ov+dv58/oz+jf60/un+7f7L/s/+7v7s/vj+H/8w/w7/5P7a/sb+j/4+/hL+
+K/5G/mj+of61/qL+iP5z/nH+l/7L/uv+6P6m/lb+Xv6k/rf+Vv6P/fz8DP1T/Xn9dP1Y/Wz9vv0O
+/iv+O/5//sP+q/5a/i/+Hf74/cr9qP3F/Rn+VP5g/mb+gv6x/uH+Df87/1z/cv+D/4n/sf/n/+v/
+1f+1/5v/r/+k/0D/2f7D/tX+2v7c/sf+of6q/uL++/7n/uz+B//+/gD/Q/9H/8n+jf7H/t/+1f7h
+/v/+Z/8CAI0ACQEbAbsAeABpAD4A+P/N/6n/cv9r/5z/s/+i/6r/8v9lANIALgFnAUYB8gCsAJsA
+zQD0AMwAqAC5ANQAIAFGAeMAjQCMAHoAWACGAMIAmABXAEMANgAzAF4AqgC6AJUAsgDjAPQAMgGB
+AXsBSAEXAbUAbACDAEMAof9d/33/yP8oAHMAjwCgALgA2wAYATMBKQE4AXMB1gEmAi4CBgLDAW4B
+SgFrAXEBOgH5ANQABwFlAWkBTgFtAYMBVQERAdMA2wBWAacBggF2Aa0B2gHXAccBzQG/AZcBqQER
+AnECdwJQAiwCFQLkAX4BSAFYAV4BeQHGAdgBigFxAbEB2wHpAfIB8AHtARsCVQIpArgBOQG+AI0A
+kgBSABkAdwDpAPQA8gDjAH8AQgCXABMBMwH6APAAZwHTAcoBbgHeAJ0A3wAmAUwBZgFIASABOQE8
+AeIAqADEANoA5gDwAPEACAEkARwBDgEsAUYBLgETAQIB5QCbADAADAD+/7L/e/98/13/Ef8V/0v/
+IP/D/qP+tP7c/i7/jf+u/5T/d/+e/wUADwC3/3H/Sf9S/4L/jP+L/7v/0P+//+r/AwDB/5v/wv/1
+/wQA8P+7/4P/eP+B/23/Rv9D/5L/+P/3/7r/wf/6/xQA5/+w/6z/m/9R//r+wf60/rX+l/57/of+
+uv7c/sv+8P4y//3+nP6W/o/+Tv4g/u/9l/17/ZT9cP0w/UH9uP0u/jb+Af4i/pH+7f4r/2n/pv+i
+/zL/vv6T/nb+Wf5B/hj+7v3J/c79Mv60/uv+8v4Q/x3/F/8j/zX/PP8b/+P+z/7h/sr+gP5W/kv+
+Vv6D/rr+7f7s/uD+If9l/1H/G/8I/xT/KP8t/zT/Qv86/zD/Nf8N/67+aP5i/q7+Hv9H/xr/4v7e
+/vn+2P6n/q7+6P5R/5b/s//J/5n/L/8M/3n/3P/E/6L/u//3/z4ANgDP/4j/pP/p/wsA3v+n/+b/
+PAAdAM7/yv/2/wAA7v/R/9z/BQDq/8P//f9sAMEA3wDaAMIAhAA+ACcALQAqAAMAuP+N/9P/KwAJ
+AL//qv++/wkAYgCSAK8AxADhABkBMQEFAegA9ADXAIoARAAOAOf/5P8HADoAiQDfAO0A4AAGAS8B
+LQEZAQEB7QAAAf8A0wDEAOcADQH7ANsA9wA7AZABzAHPAdYB+wH0AcwB0QEJAjUCFQLDAU0B6wDd
+AOUA3QDMAMsAzwCTAHEA3wBWAU8BKgE2ASkB+ADnAOYAvQBpAGoA1gDpAHgAHAA4AH4AdwB2ALwA
+4ADYAOIA+gAFARwBXAGXAagBrwGmAYEBbAFpAVwBRAEpATkBdAGeAbkBpQGcAcABqwGaAbEBmAFa
+AUIBVwFzAXABLwHgALgAkABMACkAXgCaALMAswB2ADAARQCSAJEASgAPAMr/pv+9/6T/Xf8S/73+
+uv4K/y3/Lv+Y/08AlQBTADwAcAB/AH0AvAAcAVQBfwGFAScBwAB+ADAA6P/G/8L/tv+p/7T/z//Y
+/6n/cv9v/2j/O/9B/37/hP9e/2n/hf9U//H+wv7J/vf+V/+C/03/TP+T/5f/Tf8o/wf/kf5J/rD+
+LP8p/wT/6P7R/g3/Mf/i/sv+/v4v/4T/t/97/xL/2f6u/l/+Fv7l/bD9hP2h/eX9A/71/QD+OP5r
+/qr+6/4M/yv/Ov87/0r/EP+X/l/+R/4P/gT+RP55/qb+9/49/1D/Qf83/yP/Af8Z/17/cf9n/2n/
+bP9W//z+sv60/u/+S/9K/yX/qP8gAM//Xv8V/8f+nP6A/nj+kP6P/qz+Af8I/67+dv5//pD+nv7G
+/gv/Qf9p/8D/EwABAKz/Xf8y/xH/6f7s/hz/QP9a/4r/vP/Q/+L/8v/h/8X/uv/c/zsAnACjAHoA
+ZgBJABcA+P8YAHkAvQDEAMEAygCrAGYAIgDh/8L/zf/g/+H/nv8z/yX/Xf9Q/z7/cv+b/87/OwCJ
+AI8AaAAoAAcADADU/1f/Hv8w/zX/Gf8E/wb/9f7t/k//BwCQAL4A+ABzAbkBjQFgATwB2wCYAHMA
+MgAmADQA/f+w/5v/y/8TAFoAqgD9AD4BewGqAZwBeQGKAa0BbAHlALAAsQCEAGEAgwChAGwAZAAU
+AZIBLAHfACsBXQEuAecA0wD+AAUB0AC9AL0AhgBWAFkAdQCMAKAAygDbAOEAIAFJAUEBXwGfAbYB
+pAGMAWcBNgEWAfcA6wASAS8BIgEyAVIBQAEdARcBHAEEAe0ACQEqAQ8B9QAVASoB/QDOAN4A+wAA
+ARsBQQFBATcBOgFAAVUBOAHWAL4A7gDKAHoAWgA0ACAAJgAcACoASgBEAEcAgACPAEQABwAcAB4A
+5v/k/xkAEgDw/wYADwDx//z/IgBMAIwAoAB4AGoAhQCcAK0AyQDsAAQBCwEEAdgApgCEAHMAgACI
+AJwArQB4ACsAIABiAKwAzgC+AJ0AtQDXALkAewA0AAYABgBIAJ0AYQDR/5r/eP87/zf/Qv8c/+n+
+2f4A/yL///6+/rf+Df+F/9D/2//M/6r/ev9O/yf/HP8v/zP/H/80/2T/cP96/6D/ff8T/xb/dP+Y
+/4n/jP+0/9r/8/8ZACsABADE/6H/rP/B/8b/q/9o/yr/GP8a/wX/2v6+/q7+u/4N/3r/uP+x/2X/
+Cf8v/6X/h//v/o3+XP4+/kP+NP4x/l7+jf4F/5r/ev/T/r3+OP9B/+X+2/7s/tr+4/7h/sv+4P4C
+/wf/EP83/2v/fP9Y/zH/RP94/47/m//f/zcAXQBGABkA/f/n/8P/d/8d//j+Cv8i/yX/MP9u/8j/
+CgBAAG4AgwBoADEA+/+Q/+r+t/4g/yb/rf6p/sr+Xf4B/iP+Zf6t/vv+Gv/w/q/+vv4h/yr/s/56
+/rz+Cf9A/3X/m/+J/0r/XP/U/0EAbABLAOH/q//1/z8AOADa/0f/IP+a/xgAWACZAM4A0QDaAPIA
+zwBOAL7/hv+Q/4//b/9G/yL/Jv96/8z/3v/K/8v/GQCRANoAuABXAFUAsgC9AFwABAAQAFoAcAB2
+AKcAwACkAJYArwCvAJEAgQCHAIoAyQBqAcABfwFBAUABBQGTAGkAkwDaAA4BEwEZARwB8AC+AMMA
+8QAdAUcBYAFzAXUBHAG0ANMAKwEeAdwA5QATARcBKwGIAf4BaAKnAoMCAgKIAUcBEgHfAMQA5wAe
+AfMAygAzAZkBTgHkAAABawH8AVACLgLwAa4BYwEMAWAAk/9y//P/HQDM/8b/FAAbACUAsQA2ATkB
+HwELAZ0AOQBrAMUArgByAJ0A7QD8AOQA1QDTAMYAugDaAOsAtQBrAEEAWwCqANcAwwCdAJMAogCg
+AJUAowC7ANcA9QDhAHEACgD6//n/w/85/+P+bv8YAPP/if9X/0X/dP+e/5P/lP+S/5b/3f85AF8A
+OwAAAPT/AgAaAEkAcgCAAJcA/wBiAT8B6QCrAFwAIQAEAOr/4f/W/8v/wP+P/3L/qv/+/xYAJQB4
+AMcA0QC6AJoAVgD1/77/sP+Z/3r/ZP9r/4P/jP+A/2v/bv+Q/67/uf+h/5b/vf+y/2P/I//S/n7+
+Z/5M/hH++f3//Q/+Kv4h/hX+Pv5V/jf+O/6f/g//D/+3/qb+6v72/sP+kP5T/hn+BP4O/jz+m/7e
+/uv+GP9t/57/lf9y/1z/hP+q/5D/iv+B/0v/PP9F/yf/6P65/qz+tf7+/lf/TP8A/93+9P4X/yz/
+Mv8d//b+CP8n//P+nf4+/vv9Cf4d/jH+cP6R/pb+r/7C/pb+aP52/mr+T/6E/tr+1f56/nb+2P78
+/tX+1f4S/1L/nP/m/wAA3v+N/0v/PP8w/xj/N/9y/4//mv+T/5r/uv/F/8D/yv/g/+b/zv+h/4H/
+gv+A/43/vf/s/xkAWgCEAIIAggCJAJwAxwDkAL0AYAAWABwAYACDAI0AtAC+AK8AzgDxAMoAkACu
+AO0A4QCZAGoAcABfADoAbQDCAN8A7wARATwBZQFmAUcBKgERARUBPwFSASABGAFjAWUBCQHiABcB
+SQFDAT4BVgFIAQUB9AA3AWEBXAFvAXwBgQGsAcYBqgGGAXEBagF9AXcBGQHbABQBSQFJAVMBUwFK
+AZcBDAIoAgQCzAGYAXUBNgHXAJIAdgA6AOD/zv///xQALgCJAMgAxgDXAP8AEgH6ANAA1QAIASkB
+IwEsAToBOgFkAZcBkQFvAWYBbwGKAcYBAwIrAkECOQImAiAC/wG9AXMBKgH6AMEAgACFAK0AyQDZ
+ALQAYwBbAJ8AgQAuABgA8P/R//z/EAD+/+T/oP97/8b/8/+4/6T/5/8sAEEAVQB8AHMAdQDcAC8B
+FQEFAU0BagEgAcIAVgD3/7T/UP/9/uj+0f7O/gr/Qv84/yD/S/+i/7//if9n/5r/1f+5/1L/D//7
+/tb+3f4i/0H/UP+M/7P/mP+c/9H/4P+T/xf/+f5B/1T/JP8Q//P+0f4V/4D/zf8FAOD/rf8GAIIA
+iAA7ABgAKgD4/2z/3f5n/hn+D/44/nv+wv7x/gz/Jf9a/6f/6v8AAOP/zv/a/+T/3//G/4//RP8S
+/xf/Tv+I/5D/bv9K/1T/dP9d/xT/9/4x/2L/aP9n/1H/K/8Y/xL/EP8r/z7/I/9E/7f/0/+H/2H/
+Pv/y/tH+uP6T/on+jf6q/u7+9/6G/jz+df6a/of+mv61/s3+Ef9e/2X/Ef+V/kf+a/67/t/+6/7m
+/uP+LP98/0j/1P6m/pf+eP51/pP+xf7k/tv+5/4G/wL//v4p/2X/qf8NAGUAagBOAEAA8v9b/9L+
+ff5b/jz+Df7h/X79OP2o/Sn+O/5s/tL+Nf+n/+X/5f/7/+b/nP+B/0//wP5a/n3+rf6J/pL+9/4E
+/7j++P63/yoAeQAOAX8BkAFzARgBzADQALUAZwAkAOn/3P/5/9r/kP94/6j/+P8uAEgAdwCzANcA
+4gDcAM0AvQCgAGwAXABpAGYATwAhAA0A///F/9j/UACSAJMAvgDUAIoAYwCcAL4AyADdAPIALQFL
+AQsB1QDeANoAsQC8AAQB/ACoAKAAzADCAM0AFAEwAS0BRAE6ARQBIAFFAU4BVwGGAdQBDAIJAukB
+4QHdAbsBvgHkAfsBDwIKAuABmQFdAVABKQHiAOEAEQELAewA8gDjAN0AHQE6AQsB6ADsAO4A5wDf
+AKEAWgCBAM8A1gDcACUBVAFjAVYB+gDCAOYABwEPARcBQwGHAZABaAFOAUsBXAFxAVUBGgH5AM0A
+egBPAIgAzQDmAPgA9gDmAPMAFQEuARwB+AD1APoA0gB0ACUADQAWACwANgBAADwANgBQAGMAaABy
+AHQAewB4AFEATABrADUA7v/c/6z/kv+Z/2L/Pv9z/6b/t//J/8P/uf/s/xMAGAA2AD8AMgAhAAMA
+DAAfABQAAQDS/7b/6f8VAOn/sP+4/8z/4f8kAF4ARQAJAPP/7v/Z/+P/9f/J/4T/YP9R/yj/4/7V
+/hf/Uv9u/3b/Y/9g/2//VP8M/+T+Av80/yP/qP77/bT9CP5C/iv+Kf42/k7+df6O/qP+mP5q/on+
+5/7n/pD+fv6s/p/+b/57/pv+e/40/iz+bP6f/r/+3f7Z/uz+Kf9P/0D/H//5/tT+3f4V/zj/Iv/u
+/qz+hv7T/kn/Zv9h/1f/FP/P/rL+lf51/mH+Pf4v/lf+bf5w/qP+6P73/tr+h/4d/hD+JP7d/Yn9
+Yf0p/SH9kv0I/hX+G/5n/sD+Bv8e/yr/Zf90/xj/xP7z/k//Mv/h/gD/PP9F/4b/6P8WABYA7f/X
+//H/FgBLAFIADgDf/+r/EgAlAPf/yP/g/xkASQBgAGEARAAbAAgA5//H/8v/xv+5/7n/1v8jAHQA
+hwBxAH8AwwDfAJEASwBjAHEANADm/6H/d/90/5X/uv/B/8X/5P8CAPP/u//N/1IAnACHALMADQEz
+ATsBWgF+AYIBdwFaARYB4QDwABkBNwFXAXMBfAFtAVMBTgFaAV0BOQECARIBUgFpAWYBagFYATkB
+PwFNAUIBTAF8AcABEgJJAkICFwL5AeYBxgG4Aa0BdAFHAXUBwwHCAaYBwwHWAesBIgIkAgsCGAIW
+AgYC9QGlASwB3ACXAEQAJgA8AD4AJQBgAOoAKQH5ALkAqgDeADEBYgGNAc4B+AENAhsCHQIzAk0C
+QAIBAr8BvgHqAfwB9wH7AeABqAGKAaEB4AH+AecBuQGjAcIBrQE8AdAAlQCbALAAkAB1AHkAJwCU
+/3//wv+f/07/Sv+X/wwAXwBoAEwAFgDY//v/ZQBnAB8AHwBCADoAHwAMAPr/uv+S/8D/8/8MABMA
+DwAJAPD/4P/0//T/rP9w/6v/+v/f/7n/2P/u/+f/AgAfABEAHwAwAA4A4f+d/3D/fv9g/wH/lv5m
+/pj+u/6O/mz+l/6o/q/+VP/+//n/tP98/0H/IP8K/9r+n/5R/iT+Z/6+/q7+mP4D/4H/ef9T/4v/
+wv+b/03/Jf9N/7H/+f/m/5b/Q/8l/zX/R/9U/2T/a/9V/zn/Rf9f/zj/5P7E/u/+Jf8i/wn/FP8r
+/yP/Hf8e//f+q/6A/on+g/5m/lj+Wv55/rH+3P70/vH+v/6n/vb+IP/D/lX+Cv72/Sf+UP5c/lv+
+bP6w/vH+4/6i/pr+0v79/vz+IP9i/0r/Hf9J/4T/cv8+/xz/GP9H/4H/i/9U/+H+dv57/sD+z/6s
+/mn+M/5E/mb+W/5Y/qb+Bf8Z/xz/Mf8m/w//FP8S//7+BP8l/yf/E/9F/57/tv+7/+//+P/Q/+n/
+3v93/07/Uf8h//T+2v7W/vv+//7m/gr/X/+7/xEANwAQANv/3f/8/+j/sP+Z/7P/3v8MADoASgBZ
+AIcAuwDhAOsA9gAYAVkBmQGnAYEBRwE5ATcBBwHsAAUBFAEKAf0A6gC5AJcApQChAI0AhQB8AGMA
+PAA5ADwADwAQAEUA/P9x/6P/QQBzAFEAGwDd/97/MwBzAH8AnAC7ANEAJgFlASIB3wDnAPIA3ACn
+AFEA/f/i//T/IgBgAIUAnQC+AMsAwQC+APwAdgGyAakBtQG5AbABzQHEAXgBQgFtAbABmQF7AZQB
+zQEVAjICHwI3AnICTQL3AeUB5QHQAcEBpQFrATkBCgGnAFQAnAAyAW0BWAE6ARcBJwFQATEB+ACv
+AHwApQCtAHUAdQCYAI0AbwCAAKgAxQAZAZ0B4AHeAdMB3wELAioCAwK6AaoB2QHvAbQBTAHoAKcA
+oQCbAGsATQBaAJsACgE+AQ4BxgByADEAJAAkADAAZADEACgBTwEYAcsAwgDIAKYAmgB2AAIAyP8p
+AKoAqgBQABAA6//c/yQAdQBkADwAIgAaACQA7v+Y/53/8v9FAJMA5QDjAFUAsP9Q/wj/wP6D/m3+
+nf7o/hn/If8w/4H/wv+4/7H/xv/3/zwAIwCu/3f/ff9e/yb/7P6f/lf+Jv4E/hj+Pv4+/mz+9P5Y
+/0X/Jf8u/xX/7f70/gz//f65/pL+0/4B/+/+Ff8w/+j+sf6p/ov+b/5r/nr+r/6+/l/+B/4C/v39
+3/3e/fr9Fv5K/tn+cP97/1T/Sv8u/y3/Tf9K/yv/Fv8d/0n/PP+k/vP9oP2Z/YL9Sv1h/df9HP4G
+/hr+Yf59/ob+qf7b/gX/J/8+/2P/nf+i/2H/+v6l/p/+q/6K/kf+uf0r/Uf9ff0x/QL9Ov29/X/+
+NP+i/83/0//A/8z/6f+x/0b/5v6D/kf+Of4Y/u79z/3i/W7+NP+5//P/IQBmAKwA1QDcALkAaAAN
+AOP/x/+O/0n/BP/d/sb+l/6g/in/vf8GADoAagCDAHAAXAB6AHsAJgDG/6j/tP+s/4D/cv+J/2T/
+cP8dAJ8AkAB/AGUAEgDr/wAAJQAaAMz/m/+h/5b/Xv9B/2D/kf+7/+n/NABaAEAAPABjAIIAkACJ
+AFkANgBfAH8AYwBpAKkA6gAfAVUBqAEBAvwBxAHRAfgB3wGmAZUBoQGjAYEBTAE5AVEBfgGRAXMB
+YAFzAY4BmwGoAcgB8AEJAvsB3AHFAbAB4gEiAs8BVwEpAREBLgFsAXUBfwGyAbwBsQHLAdcBzgHU
+AdYB6QE0AnECRwLlAb8B2wHVAcEBxAGsAZ0B1gERAvgB1gHtAQQCBwIGAvUB6AH9Af4BxgGcAZcB
+fwFhAWMBhgG3AcUBtQGrAagBoQGZAZMBlgGoAZwBQQHcAL4AmgA7ADMAigB6AB0AAwD2/8X/nP+V
+/6//z//p/x8AWgBnAGsAiACxAMQArgCYAIQASgAWACcAQQAiAP//+/8IACsALQD9//b/HwAzAFwA
+tQDdAMsAuACrAJYAbAA5AP//xP+m/7T/uv+E/07/g/8SAIAAlACOAKAAjgAvAM7/l/9u/zz/F/8O
+/8j+lv7t/iD//f7u/tz+wv7g/jb/cf+U/7X/nv99/27/Nf/+/vL+4v6m/mf+Yf5I/g7+F/5J/lL+
+Qv5r/tX+Q/92/3P/fv+w/9X/vv+N/4v/sP+l/2D/Fv8O/zP/NP8b///+9P4O/y7/N/83/2H/q//a
+//P/2v9F/3j+Bf7l/bj9mf20/dn9Kf6q/sf+af4Z/uv9sf3C/SL+Uv5b/kX+Af4B/iP+6/3N/Rj+
+Rv41/kX+ef6G/p7+7/43/3D/w/8oAHkAmgCdAH4AJwDF/2P/t/4H/tf9FP5r/o3+ev6D/rb+7P4H
+/wX/9/7j/hf/pf/w/8T/f/9H/yL/D//0/tX+4v48/5v/rv+2/9n/qv8z/xf/Rf9K/yz/Df/2/v7+
+A//3/gv/7P67/hX/k//V/yEAjgDYAMAAdgAmAJv/5v6a/sb+4v7f/ur+6f7S/rv+m/6T/vD+kP8h
+AIIAwADyAAUB5wCjAFoANgAsADUAZABxADcACgADAAcALABrAKEA1AAZAUcBMAElAUMBSgFbAYQB
+YgHJAFIAXwB4AGoAiADDAMMAzgDzANYAgwAiAAAAKAAiAO7/9P8zAFYAUQB2ALgAugC4AD8B9QE0
+AhEC7gHcAbkBkAFlAREBpgBmAHMAjgBvAFQAmgAbAVsBSwFRAXMBigG5AdoBtAGdAc4B5wHSAd0B
+AwISAgsC9wHVAbYBhgFGATsBOgH7AO4APgFTASgBMQE6ARABCAE2AY8BIgKHAoECWgIzAgQCxQFk
+AfQAoAByAFgAdADtAG0BqgG1AdkBVQK2ApoCVgIjAg8C/QGkAUgBKwHrAHcAUwCSANEAAQEjASIB
+OwGDAaMBkgFnASYB/ADaAJEAIwDS/+H/AwAAAAcAPwClAA4BUwGDAYUBVwFhAXoBHwGfAGMAFwCr
+/3r/X/9C/zn/Iv8y/5b/xf+Z/6P/0P/C/7r/9f8yAA4AsP93/2z/df9W/wj/3/7v/gH/Cv84/4T/
+l/+g//H/IAAYABwAIgAYAP//w/98/2j/aP9Y/0n/Hv/u/uX++P4z/1P/E//m/h3/Pf/x/qf+s/7B
+/pf+YP4x/iX+e/64/m/+Cv7F/cX9AP4g/iL+OP5Z/mX+kv7z/gv/wP6R/o/+m/7X/iv/Ov/o/pP+
+if6J/mz+cP6P/p7+tf7n/hf/Iv/7/sD+rv7A/tD+7/4B/9f+oP6n/tr+zv55/lj+gv6s/qf+nv7Q
+/v7+8v76/ib/Df/W/vb+Nv80//f+rv6c/tL+4v6c/mX+Tv75/bz93v3K/Y39uv0c/mj+gP5c/kH+
+bv6z/qX+ev6J/oL+Pv4T/kj+lv6w/sr+E/9U/33/qP+4/6D/pf/V//P/9//6/w0AOAAwANP/mP/f
+/z0ATQBYAH8AkwCCAHIAigChAKcAqACHAFQAFgDU/7X/tf+t/43/kv/M/7T/SP9I/47/f/+B/7v/
+wP+/////QgBPACMA5P/0/zEADQDG/8///v8IAAoAMABoAK4ACQFLAWcBjAG2AcABogFcAS8BLAEo
+ASIB/QDDAMcA/wBMAZQBhwFAATYBawF8AWEBRwFYAbgBJgJPAh0CjAG+ACQAIwBiAG0AjgATAbwB
+QAKDAj0CoAGHAd4BtQFOAUEBMgEUAQIBxwCZAH0AVgCWADUBjgGPAZsBugGYAUwBMAE+AUIBVgGi
+ARMCeAKyApoCKgK6AWQB9wCzAKMAZAANAP3/NwB6AIUAdQB5AJEA1wAvAVQBbAGZAaMBYAEFAdQA
+owBaAEcAhwDoACsBOAE6ATsBEQHRALcAmwBPADEAggClADoA1P/L/9z/CQBeAJsAwwDzAD8BpgGu
+ASMBsACCAC4Ayv+O/2b/Ef+U/oL+DP9v/1v/Uf+C//D/lwATAUQBdQF0AR0B2wDEAJoAZgA0AAoA
+/f/4/+v/7v8KAC4ATQAgAM//7P9aAK8AzQDcAPUA+gDKAHEALAAKAO3/y//P/9//yv/I/7v/Xf8I
+/+n+wv6m/q7+nP6Z/uv+I/8K/xX/OP8M/+z+Of+B/4r/if9H/+f+5P4y/0X/AP8K/3H/pf+k/6H/
+kP+F/4r/dv9P/yf/6/7J/g3/Tv8v/xD/D/8A//T+/v4H//3+C/9P/7//LgBNAAAAsP98/yL/yv6m
+/oD+Mf7w/en9F/47/gr+7f1C/pH+z/5q//z/EgAMAAEAqf8x/9f+jf5f/iv+yP2S/ar9pP1//Xj9
+i/2q/c/9Lf7M/iz/KP8I//3+Ev8o/yL/Cv/m/pv+Tv5h/o/+iv5u/kL+Ff4U/mT+5f4b///+HP94
+/63/l/9+/5H/yv/u/7v/ef8//wr/Fv9y/8b/mf8y/2j/IABwAFIAKQAGABgADgDV/wIALQDB/3j/
+z/8hABcA4/+N/0v/df/L/93/pf+B/7///f/k/7X/l/+F/7X/DQA8AGgAqQDCAMEA3wD+AAIB9gDY
+ALkAoACjANcACgEkAVoBwAEMAvABigFWAWEBIwHEAMAA2QDQALYAoQCSAJUAvAC5AHAAYACrAOEA
+zgCaAEwAHwBtANQAtABYAE8AjADVAPQA3QDKAN4ABgE5AWQBbQFNASsBVAGQAVwB4wCmALYA4wAa
+AT0BLgEVARYBEgESASgBLQEwAVwBdgFqAX4BjAFMAQoBGgE5ARQB+AAdATMBFQENATgBQgE/AXoB
+nQFmATYBTQFOAVkB0AEQAsMBlwGVAWABNgEdAeEAzwDUAK8AtADXALkAqgDtAB0BDAH5AAkBJQEl
+ARQBCgHdALMAugC3ALIAvwDBAL4A0ADwAAoBKwFRAT8B/QDVAMIAtgC4AJoAggChALwAuwC9ALMA
+jgBpAEMAOQBRAFoAZgCIAKIAyADrAOUArwBSAA4A0P80/6n+yP76/r7+jf6C/l7+hv4Q/3H/rv/W
+/+H//v/q/4D/RP9G/x7/5P7W/sL+jP5x/nX+Y/5t/rP+6P77/hH/NP9i/47/lv9w/0T/Tf98/1v/
+6/6g/qL+sf6W/oP+of66/sb+8/4o/zb/Tf+W/67/af8u/yH/9v7h/gv/BP/U/o/+I/4L/nH+zv7c
+/s3+rP6N/rj+DP9G/2D/T/8x/0b/Q//k/qj+m/4//un9E/5//sb+s/6X/sP+7/4B/1P/5P85ACAA
+zv9t/xX/Af8X/+z+gv58/hP/c/9T/zX/KP8H//P+7f7E/oT+U/4l/tn9pf2x/cH96/1K/pv+pP6T
+/tD+N/9v/4T/n/+S/x//x/7d/rv+HP6T/U79Mf16/Qb+X/5l/mX+tv4Y/y7/Jv9B/37/rv+7/7f/
+qP98/y//5P6l/pb+0f4X/zv/fP++/6D/cP9z/3v/e/96/4P/q/8DAGYAaQD6/4//fv+g/8H/2//0
+/xAAKwBIAIYA2wArAUwBKAHpAI4ADADO//f/GAAkACkA+P/w/1cAiwBCABIASgDHAEMBaQEGAVsA
+CQAhADAA5/9x/3D/6P83ADgAKAAfAB0AXwD+AIcBkQFCAfIA2AAiAXMBSwH1AOUAGgFJAVYBQgE3
+AX0B2QHWAaUBsgHaAdQBqgGFAX4BgQF8AWoBTwE2AS0BOQFPAW0BlQG3AbABiAF4AYABfQGeAcUB
+kgFyAYIBOAHCAJsAkQBoAHIAtwDiAPsAIgFJAWkBhgGaAaUBtQHUAd0B1wHmAc0BsQHOAdMBrgGO
+AXwBgQGoAbIBhQGMAbgBegEiARMB7wC5AL0A2gDdAN8AAgEoATsBIwH+AAIB8QDAAKYAngCyAMAA
+rgDBAPgAIgEvASQBYgHjAekBvQH7AQICiQEnAfkAtQBeABgA9v8NAFAAjQCcAF4AHwBWAKwAnwCL
+AMEA6QDNAJQAVgAIANb/7f/b/4D/YP90/27/jv/k/wMA6f/t/0AApwDJAMoA0ADrAC0BYQFhASsB
+sgBDABkADAAnAH0AhgALAL3/9f9FAEcAGgAOACIAGwAHAOv/hP8z/1//hf+E/4T/Pf/q/s3+rf6n
+/s3+y/7O/iX/W/8p/wD/If9N/2D/df9Z//H+xP4X/2n/Xv85/z3/X/9u/4f/o/9//3f/qf+g/1r/
+Gf8X/0j/Vf9N/0L/G/8K//v+vv6k/qb+df5b/qz+Gv82/wz/7/75/uv+u/64/tD+wv6d/lr+F/4z
+/o3+yf7J/n3+Lf5N/pz+yf74/gL/5P75/iH/8v6V/nf+aP5d/or+uP6f/kf+Hv4t/lb+zf5D/1z/
+Uv9a/2b/P//3/sf+vf7p/hj/KP8w/xj/7f70/if/Yv+H/57/v//C/4r/R/8z/z//NP8l/0D/bv9p
+/yT//f4m/zv/Af/C/qf+kf5S/k/+1P4j///+Dv9X/4T/qf/Q/+j/7f/a/8z/tv9Z/8/+nv7u/lD/
+hP+v//n/NwBXAHwAagAuAD0AhACjAG4ACQDM/6z/l/+s/57/n/8hAJ4A1wDOAF0AAQACACQAQwBR
+AGYAuwApAVYBQwEHAaIAXwBeAEcACQC5/57/9f9QAH4AkQBeAFoABAGYAYsBVAEjAboATgAqABoA
+8P+7/9H/WACoAGYAXgDcABMB8gAhAZwByQFzAf4A3gAUAVMBZwEkAc8AzAD6ADYBXQFOATgBPgEg
+AeMA1wC1AFYALQBTAIoAswC+AKsAtAAFAUEBGAGpAEYATACjAN4A4gDEAMgACQEeAeMAtACZAFEA
+SwCvAOYACwFKAVABSgF0AZQBrwHRAboBbAEmAfIA2gDjANgAmABeAFEAVwBcAFYAQAA+AFIAVwB2
+AM4AAQHqAMkAzAD4ACQBMAEIAbcApADoAP0ApAA/AB0AKgBpAL4A0gCmAIkAjwCSAKEAugCZAEMA
+EgA2AGsAcwCFAJ0AcwB3AM0AlADb/4f/k/+r/9n////i/7H/cf8e/xb/W/+w/+L/y/+x//7/kADC
+AE8Ayv+l/2z/4f68/hb/PP80/1L/ov8FAD8AIADS/7T/v/+l/4z/mf/O/xYA/v9x///+yf6i/q/+
+Jf+v/7v/kv+S/8b/PQCRAJEAbgBAADUAFgCc/xj/w/6i/rf+3/72/sP+Qf4I/nH+5f40/8D/JgAX
+AAAADQAKAKn/Iv/6/gD/1P53/iL+BP4K/hD+Ov6S/ub+R//R/0EAWwA5AAYA5f/s/+H/pv95/03/
+Cf/i/vH+/f7h/uv+H/8i/w3/Fv9c/6n/lf9S/0f/b/+P/6H/q/+V/4L/e/9k/zX/8f6k/n3+vP7h
+/m7+P/6y/tL+b/46/lH+Rf4a/jH+if64/pr+nf7j/uv+sf6q/t/+7v6T/kr+kP7U/rb+tP7C/rz+
+3f4C///+4v7g/hD/V/+x//n//v/V/6n/oP+9/9X/vv+A/1P/Sf9g/3D/av9g/2D/gf+V/4n/n//T
+/9j/zP/o/wgACgDs/93/9/8MAPr/zf/I/xgAaQBGAAEA9/8eAHUAmwBtAHsA3AAQAfYAswBeAC4A
+OgBVAD4AFgBGAIcAbgBKAFkAYQBlAKcA8QAOAQgB1QCrALUAzADLAMAAyADJALsA5AAsATYBFgEj
+AWoBoQGYAXwBXwEZAdwA+gBKAVgBBwGrAI0AogDIAL0AgwB8AKIAuwDhABwBFgHMAKQAdgAfAAcA
+QAB2AGwAZACsAP0ADwEdAU8BXQEhAfgAEwFUAXQBXAFTAU8BUQGrARsCNgImAgsC4gHTAegB0gGp
+Ad0BIwIaAvMByAGMAVcBPgEdAfEA+AA9AZoBswFqAWEBmAGCAVcBZAGMAb4B0gGfAV8BXgF6AUgB
+tAAaAAAAjQDsAJUAIADj/6r/sf8pAKsA2wDIAK8AsQC2AIcAGwDW/+n/5/+4/7P/r/+J/6D/AwBI
+AHIApQCKADwANgBbAHIAqQDdANoAyQCzAJgAlwCPAGAAPAAjAA8ALABzAJAAWgBQALwADgHqAKIA
+jAB2AEIAQABFAAkAzv+I/x3/7f7U/qr+9v6I/5D/MP/5/tH+qf7E/sX+Rf7l/Qr+Qf5a/lf+F/64
+/bD9Ev55/tz+M/8Q/8f+F/9+/17/Vf+v//z/HAAVAN7/sP+//6//Nv+9/qv+uP5+/i3+Rf6z/sv+
+i/6O/tX+Cv8v/0X/If/E/pf+mf5o/lj+nf7A/qr+kP5v/jH+6v3c/Q7+/f23/Sf+x/5w/u79IP5y
+/n/+r/4I/xD/0P61/vj+Kv/1/tj+Fv9j/4f/jv+Q/zX/dP4k/nr+pP6B/pD+3v5R/6P/dv8G//H+
+Jf8c//v+AP8i/2H/h/9g/zX/P/9S/2v/pP/e//3/3P9B/1n+3v0R/nT+0/5C/6z/3v+q/3T/nv/B
+/9L/LwB8AGIAQgA5AAYAuf9r/wj/rv6j/g7/nv/U/8n/yP+v/2H/Rf+E/5b/bv9w/0//9f72/oT/
+9v/c/8f/CgBEAFoAbwBeADEAPgCtAD4BSgGYANn/rf/J/8f/3P8oAGUAcAB6AHQARQBKAJsAAQFZ
+AY0BzAEOAjoCWQI1As8BhwFqASwB2QDHANkAjwD//+b/LwAwABQAPgCRACIB3wFaAmcCHQLVAd4B
+/gG/AUUBGQEAAY0ATgCLALkAmACxAGUBMAJ5AmECgQLYAusCnwIqAtwB1gHoAd0BmwEzAecAyADX
+AA0BSQF2AaMB4wEXAisCKQIAAqwBhgG9AfoB9gHBAZUBdQFsAaAB3QHRAXABKgFjAacBUAGqAF4A
+UwBIAGoAnACeAJMArgD6AC4B8gCcAKEAzwDSAKwAhgBwAEsAMgBxAN8ABwH9AAgB9AC2AJsAlgCB
+AFYAKAA2AGwAjwCXAHsAXABZAGwAkwCvALgAwwDEALYAmQBcACkAGQD6/+X/9//0/83/pP+B/3D/
+qP8BAB4AGgD4/7//4f87AD8A5v9Y//X+Ef9t/83/8f+n/z//R/+D/4j/lP+x/6X/l//h/1kAgABU
+AFEAcQBnAD4A8/94/x//L/9X/0n/Lf8Z/wj/K/9+/7r/2f8JAEEARwAmAP3/uv98/1j/Hf/f/tn+
+8f70/tP+zP7g/tr+Af9m/6//wP+o/4b/SP8k/2f/af/v/s/+BP/1/sb+u/69/qj+gf5z/ov+nf6D
+/o3+Bf9S/w//3v7k/sz+zf7t/gz//v6x/oD+if6e/qT+j/5u/n/+zP4i/3f/pf+t/83/8P8GAAoA
+8f/Z/7n/jP9K//b+z/7G/r3+7v4Y/+7+4f4S/xH/zv6a/ov+g/52/nT+p/6w/h/+pf27/dv94P3R
+/Xn9M/1t/dj9Tv7m/ib/AP8l/3b/Yv9P/4v/nv9m/zf/LP8q/yj/M/8u//n+4v4w/6D/EQBnAFAA
+GgA7AJUA0QDiAOkAvQBmAEEARAAOALb/y/8RAAcA/f8nAGIAggBrAEwAUQBoAHMAQQDo/63/pv/G
+/8n/mv89/6H+cv4w/93/7P/1//f/1P/R/8j/j/9Z/yD/8P4t/47/jP95/5D/if9w/7L/PgCDAGQA
+aQDFAP0A/AAQATMBJQH8APwAEwElATABLQEhAQAB0ACOAAAAXv9o/zsAEwFEAf0AnwByAI8AlQCC
+AKkA8wA1AYYBCAJnAjECtAGNAZkBfwGBAawBhQESAfYAOAH8ADEAvP/E/xcAuQAkAQoB9wA1AYEB
+ggEmAekAJAGMAcgB4QHhAYYB3AB5AHYAdgB3AGwAPABPANIAOwFHASIB8wDcAPYANgFjAYABwQHx
+AdEBoAGfAcUB4wHRAYcBOQEhAQwB3ADDANgAIgGOAdoBuQFPAQgB0gC/APYAPwFtAVkBXwHaAS8C
+9wGOASoBzwCmAJQAaQBfAHAAfgC3AN4ApgBSADAAKwD5/9X/HACCALoA9QAuAfIAcQAhAPP/7v8S
+ACsALwA6AFUAaABYACYACQAdAB8A0/+I/5H/s/+0/6X/pP/H/wwASwBvAHgAcQCEAJcAfgBfAE8A
+FACt/0n/+/7N/sH+x/6U/vL9mP0P/pT+r/69/vn+ev/z/zAAOwD0/5D/WP9o/5H/bf/2/oL+PP44
+/oT+z/7N/r/+I//T/y0ALABHAGwARgD4/7//oP9g/wr/5/4E/yT/8P6l/qH+s/7B/g3/e/+8/+L/
+EgAyAAIAfP/w/q7+sf6r/lX+4P23/bj90P08/q7+zv7U/g7/Pv8J/9T+y/6u/pL+b/4m/t/9s/2S
+/Yj9kf1r/VL9lP3e/fn9IP6W/iP/J/+8/oL+jf6Z/qD+nv6a/r3+wf6B/l/+gP63/vX+G/8e/z3/
+Wf85/yr/J//3/vD+Ov9+/3r/Uf80/xL/7/74/v/+2v7t/jb/Tv9B/yb/+v7x/gb/AP/k/gr/gf/N
+/87/t/9p/+7+nP6L/qf+zf78/in/S/9z/1T/Ev9B/8n/FgApAGAAbAAeAAAAKwAdAM//xf/v//X/
+/f8eABIA4v/C/+D/VgDBAMcAsADMAAoBIQEEAf8A/QDMALYA2wDnALYAmwCYAKEA4AAHAQQBAgHR
+ALAA7QAaAQsBHAEbAd4A4gAFAdAAmgCQAHAAWwBuAKoA7wDPAIkA1ABcAWQBKgEUATYBfQGUAWkB
+JgH6AAcBNAFLAUcBVQFqAXMBdwF8AZcBngGQAYEBYAE9ATwBZwGUAZsBbAH8ALAA1QAkAWkBigFX
+AQgBDQFWAYIBlQG8AQgCUwJPAvYBggFDAUkBOgEdAewAaAAUADIAVQBtAH0AQAD5/18A+AAGATgB
+mAGgAcMBzwFTAdcAkQBIAPr/vv/T/x4ATgBgAIAAsADRAAsBdAHAAc4BugGaAYwBbgEIAbEAuwDp
+AOwAtAB4AHMAlACIAFkAZwCnAM4A1ADfAPcAFQEJAaAAGQDX/73/wv/p//T/OAC/AJsA9v/h/x8A
+2/9l/07/UP9m/8T/5v+7/7H/vv/B/57/Qv8S/1r/wf/t/97/1f/5/zUAoAAgAU8BIAH5ABoBKwHZ
+AGAABADJ/4r/Nv/B/jb+9/1C/t7+Tf9a/1P/mf/v/9P/ff9k/33/hf9F/7z+X/55/pX+i/6h/rv+
+yP7e/vr+Hv8+/0D/9/48/pv9zv1o/nb+OP5e/on+nf7w/hT/5/7D/q3+0f42/3b/ev95/3D/Kf+u
+/lD+IP69/Uv9Tf2e/er9Kf5i/pb+wf7j/gL/Ov+e//3/KwBKAF4ANQDK/z3/wP56/lz+NP4A/vv9
+Mf5t/pr+4/4u/yv//P4A/z7/XP8o//j+Ev9M/1z/OP8b/wL/5P4S/3n/m/9l/w//5f4S/zv/KP/g
+/nz+Rf51/t3+Dv85/5b/s/+L/4n/nP+B/yr/3f4Q/43/tP+O/3H/c/+U/6D/X//0/rL+4/4+/x3/
+tP69/g3/Hv8Z/zj/gv/U/wUANQCSABMBdwGEAWIBcwGhAYUBKwHKAF4AAQD//z4AUQAdAP3/DgAD
+AL//2/9jAGoAHAAzAF4AXwCPAOwAHgHtAKMArAC9AHwAIQDf/5r/Vf9Q/5v/9f9IAJUA3wAuAUcB
+VgGbAd8BGAInAuEBkgFPAf0AwwC/ALsAfABDAGMAoQC4AMcA9AApAVEBZgFkAWsBdQFXAT4BTgFK
+ARYB4QC4AKgA7wB6AcoBhwFbAe8BeAIuApQBRgEzATQBHwHhALAAigBxAJkAzwDDAJkAfQB+AJYA
+wgAQATgBDgHUALQApADBAAgBGAH9ACYBWAFQAV0BjgG7AbwBiQF3AagByQGUAV8BgQGoAY8BaAFA
+AR4BKAEeAdUAqQCkAIUATAA+AIkA4QDTAHgAIwD6/w0AXACrAKsAWAAnADsAPAAaAMf/bf+v/0cA
+cwBSADoANQBXAJkAnwBbAFEAkwC1ALMAyADEAHEAUwCyAOcAwACmAJkAcgBdAGcAQQDs/7f/uf/U
+/9v/2P8XAHkAnQCUAGoATgBcAGQAWAA3AAgA5//I/7b/0P/4/wIA/f/1/wAATAC6APwA4wCQAFIA
+TABeACEAkP9O/1//Rv8i/xH/D/8s/y7/L/9v/2j/7/7J/hD/Rf9W/17/OP/m/r/+3P4H//H+mf5z
+/pH+zP4X/yP/1/6F/mP+bf6I/pf+lv6o/rb+rv7g/lD/o/+3/6v/ov+W/6L/uv+c/5T/uf+0/4X/
+Wv9D/yr/Ff/p/nb+G/4L/gX+5P2d/a79Kf5s/nD+cv5T/hz+Iv5h/pf+iP5V/mr+lf5X/vj9Mv7k
+/jT/9v7E/sT+xP7p/iz/Rf9O/5b/6//l/4X/Df/f/gf/Jf85/2j/kf+3/7v/dv8V/8X+p/7k/pH/
+bwDgALYAkACWAEcArP8x/87+cv52/tf+Nf9W/1L/Wv9R/0f/Q/8e/yr/lP8DAD4ARADn/z3/+f4g
+/0b/b/+Q/9f/dgDWAJUASgA0ANr/Jf/E/hb/h/+n/6P/w/8XAHcAjAA9AAAAFgAeAAYAKgBtAIUA
+fgBlAD0ALgAzAC4AQgCLAO4AKQEYAewAvQBiAPz/x//i/zgAmgD+AEMBSAEzATwBYwFjAVwBfgFw
+ARABzQCaAP//Y/9V/3//zv9qAPYAEgHOAIYAigCXAF0AOgB7ANgACAEEAc4AUACz/5P/FACFAIwA
+lQDMAPgAKQE6AeQAkQCrACgBnQGaAVEBQwF5AXIBKgERAQ4BBwErAZQB5AHNAaEBkAGGAbEB+AEJ
+At8BmwF0AXMBaAE3Ae4A1AD6AAwB7QAXAY0BcAHoALkArQCcAMkACAEkATsBTgFlAXYBSgHKAF0A
+fwDtADABXQFlARMBzwDUANMAqwCPAJAAsQAGAVUBUAEeAQgB8gC+AKEAgwBVAHAAqQCxAKkAZwDr
+/67/0/8JADIAZQCHAHsAnAAJAR4BygCYAI4AgwBwAFYAPQANAMT/mf+d/47/Zv+W/xgASQAfAAQA
+//8VAEcARAAAALT/eP9d/0b/8P5+/lj+lf7n/h//Tv9X/0D/hf84AH8AHADF/67/rv+o/4X/af+B
+/4D/Of/0/tP+xv64/sT+8/4i/2z/vf/n/xcAPQAjAOn/sP+A/z7/8P69/qX+nf55/kD+O/57/tz+
+Jv8O/7r+0P5Z/5j/df9o/0n/9/61/oz+kv6n/nf+Pf5q/rP+m/5z/oz+qP6K/on+yf60/lP+O/5K
+/m7+rv6U/jz+OP5j/nX+m/7C/s3+6P4n/4D/mf8//9n+of6a/rv+9v5k/7v/i/9A/1//i/9y/yz/
+7f65/pH+pv6+/oL+Ev7L/d/9K/5b/jn+/f0L/k3+VP5C/j7+Iv4m/jX+Kv48/jL+5v22/aX9jf2t
+/RL+TP5P/nT+0v4r/0j/dv/N/wUAFwATAB8AMQAsACsAOABQAIMAswDSAMEAZAAsAEwAhACwAKwA
+fgBiAHoArACjAGAAKwATACgAaQB+AEUAFQD+/+j/DAA6AA0AwP+v/8f/8P9GAIsAgABTABQA5f/l
+/8P/mP/G/w4AHQAnAEkATQBbAMAAPQGUAeAB2wFkAQwBGgE6AUkBTgEyAQYBEAFTAVQB8gC1ALsA
+zADkAPsAKQFbATYB8ADpAOEA6gAqAQ4BrQCXAKsArwCsAMMAxACnAMYACwFcAa8BtQFtASMBIgFy
+AZgBOAGqAGoAkgC9AKEAaAASALH/uf89ALwA5QDFAK0AAwFkAS0BswBuAEkAQQB1AMEA0AB0AAcA
+9v8YAGEAwwDZALAAugDqACEBRwEVAeUAPAHEARUCAwKIAfcAoACWALAAwQDNAOYAMQGTAc0BEgJo
+AnsCYAJrApQCggIdAtQB8AH+AbUBQgHFAKAAygCyAIYAlACeAKQAzADZAKwAYwAnAEgAmQB4AA8A
+BQBFAGMATwA8ADwAPwBgAKoA2QC4AJEA0wBBAWMBOQHsAJ4AegB7AIAAYwA1AFMApgC4AJYAdwB0
+AHgAdgB8AEIA0v+s/9f/1v98/xn/9v4D//v+zP7R/jb/p//m//L/AQA9ACcApf9t/53/sv+F/0v/
+Af/D/uX+HP8I/+j+5/7s/gf/V/+N/53/xP/P/8L/7P8eAOv/bv86/0j/IP/M/p/+vf4T/1n/Wv9E
+/zv/If/9/vT+5v7c/g3/JP8Q/yz/TP8z/w7/Ff9C/1n/Wf9T/0D/Tf+h/xMAXAB3AIQAPwCH/+7+
+qv6K/r7+Bf/y/vn+cv+p/yT/kf5e/l/+hv6//vz+DP/L/oD+X/4n/rv9m/3d/RT+SP6N/pf+Wf5H
+/qv+Df8O/w//LP9F/3z/p/+U/3n/ff+j/+n/GgADAOv/6P+s/2L/cf/j/0YARwAdAPL/vf+N/2P/
+M/8f/07/ff90/1b/Rv9D/yP/8v7e/tX+zv7J/s7+2P7o/hT/Hf/e/rf+of54/r/+WP+p/5r/Q//d
+/r7+4/76/hD/Wv+x/+b/AwAdACUABAAlAL0AHgHjAIIAWwBZAEYAMgBnANsAEQHgAJkAPwDy//r/
+GgAlAHcAMQHWAfcBmgEqAdgAnABtADcAEgD0/9H/xP/I/9z/DQBaAIwAiwCFAKEA8gA/ASABuAB0
+AIcAugChAGUAVgBOAEMAUwBmAFkAQwB2AOYAEgEAARoBaQFvAf8AwwDaAOsAHQE/AegAdwBrAJwA
+qQCSAIcAigC4AB4BfAHAAcwBnAGKAY0BdwF8AcgBFwITAsEBVQEQAQMBIwFOAUUBUwGzAdIBeAFM
+AYcBrQGwAcABmgEvAfIA3wCSACUA3//Z/xgASwA/AEcAigDFAPQA+wCeAD0AYwCjAHQARQBhAHIA
+PgA1AHQAYAA5AGoAmQCrAM0AywCbAK0A6QC/AFQAEwAGAEkAlwB3ADIALwAzABAACwAkAAoAx//M
+/wsAAQDT//T/TQC5AAgBAwHSAJ8AYQD//2P///5M/8L/yP+P/13/I/8J/3//KABhAEEAGQBHALYA
+xgB9AE4AJgDZ/7f/AwBNAB8A1f/n/wIA1v/P/yYAhwDDAMIAcwAwADEAIADF/23/ZP+5/wwA4/9g
+/xD/Hf80/xz/AP8l/43/yf+s/6z/x/+6/6X/kv+F/2v/H//S/qL+fv5//q/+1P6g/jf+L/6N/qf+
+df6m/i3/bf9//7P/7f8DAMn/ZP8//wz/iP5C/mv+gv5m/mz+nP6r/oz+nf7O/qH+kP4c/4X/Yf8m
+/wb/4P7T/sz+p/6w/t3+Df9b/4H/Tv8V/zL/af9e/13/nv/l/wkAIwAvAAMAmP8r/wX/7P6p/nb+
+dP6O/rP+1P6h/jr+Wv7Y/vv++v4e//r+lv6G/qb+p/6H/hz+yf09/gH/Yf+s//f/1v+Z/93/XABe
+ABYAMwCDAKAAtADIAJwANwAJAFAAnwCOAG0AjAClAIIAZABGAPz/4/89AJcAjwBlAE4ANwA8AD4A
+9/+v/8T/AgD8/+7/NABOADAAVwCyANwAvgC1AJ4ABACN/9//SgAxAPH/z//X/ysAawBiAD4AFAA2
+AHgAWQDw/6L/qP/N/9P/vP+o/37/Ov80/07/Vv+J/+n/XQDmAFABSAHeAKAAkgB6AH0AeQBlAHIA
+sgD5AOQAawAYAFUAywAYATsBPwFKAWQBaAFrAXYBQwHoAMkA2gAPAWsBaQETARgBVQFGAeMAqQDb
+ANkAagAmAAUAxv+z/6z/ev9o/4v/0v9MAL4A6gD7ABsBMwEgAc8ASwDO/8//OABlAFYAYwCPALAA
+rQC1ALoAgABsAKsAywCjAGoAhAD2ABwBtgBAADsAkQDRAPoANQFfAW4BiAGbAXMBKwH2AMYAjABg
+AFIAVgAxANj/lf+T/7f/2f/8/0wAogC8AMIA4AABAQgBCgESAfoAlQARANn/xP+Y/2T/HP+//qr+
+IP/k/2MAPwAbAIQA/QALAbIAOgAZAE0ASQAEAN//r/8n/7n+2v4S/w//Fv81/2j/0P9SAKAAxQDb
+AMkApQCgAJ0AnACUAEMA5P+w/5D/cv9H/zP/VP90/1j/CP8r/83/5P+H/2X/aP92/2X/Jf8V/yP/
+Cv8g/03/Jv///iL/Sv9r/3j/gf+h/4v/Wf9S/3f/pP+v/5f/kf+r/5b/ff+8/zcApQC2AHYATgBv
+AIsAJwB6/x7/Fv8n/zH/Hf8R/yT/L/8l/1j/y/8AAOD/v/+//8T/n/8k/+v+Nf9v/2n/IP+e/oT+
+G/9x/zP/IP8s/xP/NP+C/5r/j/9P//L+3f66/jf+xv3O/RP+R/5w/m7+Ev7W/Vv+Dv85/yX/JP8z
+/0j/Q/8e/wv/JP9O/0f/B//N/rr+2/47/4r/mv+1/9z/2//J/7v/of95/zj/Af8s/47/qP9W/wb/
+FP9K/67/HQAIAK//r/+y/2z/Uv9M/wD/xf61/pX+lf7B/uH+9/4I/yz/hP/V//P/HAA5ADQAHAD6
+/w4AGQDG/2//ef/B/+7/CAAzAHoA2QD1ALgAoQDHAAQBYwGDATgBAwH1AMsAqwDOAAgB+ADSAOYA
+CgEWAfsAzwDaAEMBqwGlAX4BcwFAAekApQB6AHMAhwBpAAoA9v9NAGgATABoAGEAQwCWABQBUwFW
+AQ8B3wAgAUEBBgHIAKsAvADPAL0AgQAJANj/LQCIAKEAsAD1AHcBDAIzAtoBqwGmAVsBHAEtAUEB
+MQESAfYA7wADAScBOAEzAVABkwHJAa8BhwHOATcCMQKrASwBDwH4AJoAVwCCAKkAowDTAAsBKwGN
+Ac4BdAEPAegArAB2AGAAMgAzAFcAQABBAF8ATQBnAMkACwEVAREBOAGNAbcBngGQAaIBowHFAR4C
+RwITArYBeAFIAQgB2wCqAGgARgBVAIQAiQA/ABsAbADCALsAmwCWAIQAbQCCAKYAnQByAFsAewCb
+AIsAdgCpAP8AAgHCAI4AJQB3/0X/vP8JAMz/ef9p/4X/r//M/8D/h/9v/8r/QQBdAAcAjf9S/1H/
+Xv9C//X+y/6//qn+gP5k/nz+k/6s/v/+bv+y/7P/r//C/+f/LQBaADUA/v/f/9f/wP+D/2H/W/9P
+/zz/A//E/sL+9f4j/0D/qv8xAFYAPAD4/7X/rf+e/5D/zf8BAMj/g/+c/7n/h/8//+j+mP6U/qD+
+tv79/hL/7P74/u/+c/4m/m7+tP6//vj+W/9m/yn/Lv9i/z7/0f6o/sP+8P5O/5j/d/9E/0X/Wv9P
+/wP/tf6l/r7+w/6v/qv+pv6o/rn+0v7x/gL/G/9J/3X/nP+z/5X/Xf9I/y7/3f6F/mX+af5k/lz+
+Wv4y/sb9pf36/SP+NP6W/uD+7v46/47/e/9I/0H/N/8S/+v+0f67/p7+iP6M/q3+0f7c/gv/iP/r
+/w8AFADj/6v/kP+H/5D/hP9V/y3/L/9Q/1b/YP+K/3z/R/9e/7X/AQAcAAAA3P+8/57/jP9n/yD/
+8P79/gT/6/7W/s7+5P4U/zD/Jv89/7L/BgACAP3/4f/G/wIAQQAtAPj/2/8DADIACgDV/9P/3P/d
+/+L/+f8ZABMA5v/T/+v/CwAZABAADwAeAAwA4v/p/yMAXgCIAJoAhQCIANUAAgH6AAcBHQEyAU4B
+ZAFsAWEBQwEXAfMAMQGlAaYBZQF4AcsB5AGLASkBKwFWAVUBUAFbAUUBIwFgAagBbAEpATQBNwFF
+AVoBHgG7AIMAlQDyAC0B8ACnAMYAFwFSAZoB1gGhAUcBVQGEAYQBbAFNAQUBtwC4AMEAmACRAK8A
+vQDgACMBTAFbAU0BJQEAAdkA+QBpAZ0BWgHXAH0AZABqAIEAiACNAKMAvwDgABEBRAFMAUABTAFI
+ARwBGgFWAVQB5wB9AFoAVQA1ABEAMwBmAHcAlACiAHIARABfAI8AkQCZAMUAvgBcABIAIAAoABwA
+SACoAAcBFgHJAHAATwBWAE0AQABCAE4AfgCeAH0AVQBcAJYA1AAEASYBMQEwASMBDwECAf0ACAEd
+ATsBKAHFAIYAfABNAPr/pf+C/5X/dv9W/47/nv9e/0//cf+I/53/of/A/xMAIQDf/+7/MAABAJD/
+Xf9A/wf/2v65/p7+of7X/i//U/9S/17/T/9E/2j/j/++/wYAFQDe/7f/lP9k/1//Zf9Q/1P/bf9m
+/0j/Ef/h/v3+TP97/3v/iP+6/8H/XP/p/pP+KP7w/S/+q/72/uv+2v4U/5T/2v+Z/0D/6v5i/in+
+Z/6S/nj+G/6y/bz9If5q/qX+1/7O/tv+Qv+Y/4v/bf+X/+P/AAAPAEUAcAB4AJIA0ADFAEYAtv8q
+/8L+xP7l/tn+zv7d/vv+Of+J/7n/sv94/yv/Gf9K/2X/Vf81//r+/v5k/5b/Vf/4/sr+3/4n/0v/
+Gv/W/sv+Iv9Q/9/+h/63/uX+Ef9n/4f/gP+S/7P/1f/F/5v/nv+0/9z/BgD0/7D/PP+I/hz+Tf5r
+/jf+Lf5X/oX+uv7o/gL/R/+l/9L/zv/C/8n/CwBxAI8AXwArABEAGAA8AEkAAwCf/4f/3v9SAHYA
+agCfAPwA/gB+APP/yv/2/yQALQAmACEAPQB+AK0AgQAsAP3/3P/T/+b/7f/5/w0ACgD5/+f/1f/a
+/xEAVgBoAHsAsgC8ALsAHQGiAacBQgEDAQMBHQFVAYcBfQFRAUUBeAGQASIBXwDF/5L/wP/x////
+FwAbABQARACIAJoAhgCSANIAIwFvAakBugGqAY0BbgFlAV0BPQEMAd0AugByAPP/0P9fAOAA+gAf
+AUQBZwG4AfYB9gHmAbQBVQEvARYBpwAwAOP/rP+f/7v/7v////n/QQDMAD0BfAGkAa0BkwFqATsB
+DAEMATIBCQGoAGEAKQAJACcAVQBxAMYAPQGCAbABzwHTAdABvgF1ARoBBQERAdIAcwBgAHgAqAAD
+ATgBJwEAAfEAEwEEAa0AigCHAEkA///V/9b/AADr/3b/Qv+Q/9T/0//l/+//of+D/8n/7P/J/5X/
+hP+K/5T/uv/Y/+b//v8VAEsAtgAVATkBWQGFAZ0BoQF2AQsBpACAAHUAYABZAEIAAgDx//H/tf+B
+/4z/wv/i/+P/AwAGAJv/TP+D/77/yv/O/53/Wf9W/0v/8v6b/nr+Yv6H/tz+7v79/hP/Af8f/1X/
+Mf/7/hH/Iv/3/uv+Jv8m/7L+e/7R/h//H/8T/y7/W/+I/97/LQAQAKD/S/8y/wT/yv7J/t3+7/4T
+/zP/MP8M/+P+0f7B/rz+0f7D/oj+Tv4s/jf+ZP5s/kb+MP5R/oD+c/5R/l7+gf6J/l3+Pf5a/kv+
+Ff4o/lf+bf6G/nj+X/6g/gf/O/90/8P/2f/N/9j/6/+//1j/K/9O/33/lf+T/5j/vf/h/+X/8//x
+/7L/kf+0/9f/7f/8/8j/gf+e/+z/DQAlAFUAZQBVADwAEwAuAJEAtQB8ACEA6P/w/wAA9f/d/7j/
+gv9o/2//Pf8A/yH/Q/8Y/wn/Kf8J/83+3P4j/4j/2v/d/9r/BAD8/6f/mP/3/wUApP+L/7b/jf9C
+/z7/ZP+s/woAXQB+AE8ALABsAMsA6ADDAIYASAA7AHUAzAAAAewAqgBrAGgAowDwACgBLAFHAYUB
+VQHrANEAtwBiAE0AngDmAAEBLwF8AXkByQABABIAkQCHAEQARABTAH0AxwDFAHsAEwB+/0j/rP/u
+/8//rP+q/7L/vP/6/1MAhwCuABgBrwEDAj4CmQKfAikCjgH3AIsAeAB6AE0AMgB7AOoAIwEjAR0B
+OQFeAYsBywHqAcoBmAFRAccALADg/9P/0//v/zIATgAzAEwAnQDBAKgAjQB8ADYA9P8eAFMAHADj
+/+v/9P///yIAWADIAC8BQgFjAZoBhQFcAVkBNgH5AN8A1gCcAAkAgv9k/1//Pv9W/7//RgCnAL0A
+zAAfAXgBZQEYAfcA0QB5AC0A8f+b/1j/Xv+b//H/GQAFABQAPAAyAC4AXgCSAMcAHgFsAVEBvgBK
+AE4AagB3AJMAiABTAHAA2gDbAG4AJAD9/9f/1//c/77/nv9e/xv/Ev/8/uz+I/+C/8v/8/8WACAA
+CAD2//r/8/+y/4X/0P9cAKIAXQDS/2n/FP/I/sj+CP9D/4X/wf/Q/9v/2v+C/wL/4v4l/3r/lP+B
+/6T/3//5/+z/zP/S/8X/gv9f/2n/eP+Y/7b/if9I/w7/j/47/nj+sP7W/lX/u//a/x8AbABuAFEA
+GwCs/27/a/8w/9P+hv4w/ub9+f1K/nb+l/4V/8j/HAAPABIANgA8AAAAov9t/1b/Lv8F/8P+f/6K
+/qP+nP6l/tv+Rv+x/8f/kv9u/3b/f/94/3H/lP/c/+T/nP9L/yn/J/8H/+L+8f7y/sL+3/41/yv/
+4v7V/gH/IP8h/xf/IP8L/9H+8v5l/5P/XP8y/yX/6P6d/pH+zf4A/9n+sv7m/lv/z//e/6f/m/+t
+/73/x/+//63/sf/S/9z/1v8AADUAGwDP/7H/4P86AJkA0gDMAK0AnwCdAJoAoACuAKcAfQBIAAoA
+6f8SAFkAZwBMADQAAADq/0oArwCtAIAAQAAdAEUAYgBDAAMAyf+r/83/FQAwADkAZQB7AIUAzgAZ
+ARgB9QDsAOkAxgClALAAzADFAKsAegAzAEYAowDPAN4AFwFrAdIBLQIjAt0BrAGoAc4B+AEqAjwC
+wAH5ALgA/wAqARkBIAFPAWsBVQFXAZ0BvQGiAXABQwGCAdwBpQEYAZwAJAAAAFwAvQAJATUBGAEP
+AUwBXAEtASQBFQHUAJUAgwCiAJ4AZwBvAIoAewC2AAQB+wDoAPEA/wAnAWoBlQGnAaEBbwE4ARoB
+/gDUAMYA9QAxARgBuQBoADwAEADv/zcAvgAPATQBYAFkASUB4gDLANMA7wAdAS0B/QCNAAIA1P8e
+AEoAIgDt/8z/CwCRAMUAnABmAEAAWgCbAGsA3//R/ywAKQDC/3f/df9n/0//nv8RAFUAkwC8AK8A
+iwBxAHoAnwCsAIgAcAB7AIYAoACnAGcAEgDi/+T/FwBEAFsAhgCxAMAAqwBoABQA1f+9/7//n/9n
+/2//n/+W/yP/YP6a/T/9kf38/er91/0o/nz+rf7p/iH/9P5T/sP9s/3q/eT9o/2M/Zb9iv2l/fD9
+B/7y/Sb+pf72/hv/Xv+L/1X/+/7F/rn+5v4V/yT/Qf9b/1v/aP9X/+f+Yf4m/kj+ev5i/gn+kP03
+/U79tf0O/h/+Ff5X/vL+ev+I/0H/Cv/l/qT+c/51/mX++P2i/db9AP7L/af9uv2m/aj9TP7y/tb+
+Yv5a/sH+8P6s/o7+4/5B/5P/+/8IAJL/A//N/vD+DP/x/pP+Sv6m/mP/+f8iAM3/b/9Y/2D/b/93
+/4z/s/+t/3z/av+D/4P/R/8w/2n/XP8N/wD/Iv8H/8j+C/+z//n/z/+Y/1//Mv8p/z7/Xv9G/0v/
+6v9sAFAADADq/+X/8f/p/7j/cv9q/9L/TwB2ABoAhP8l/yb/aP+W/6n/uP/W/1YABgE8AfEAqgDP
+ADcBiAGmAYsBZAFyAY4BhAFdAUIBRAEUAboAqQDPAM8AtwC4AL0AyQAWAXMBfgFyAcABNgJyAnwC
+gAJpAhYCwQGVAWIB8gBrACUABADI/9j/UwB6AEMAUACeAAgBjAHhAe0B3AG5Aa8BvwF9Ae8AmgBv
+ABoA5v/9/wMA2//t/5EAUwG9AR8CiwLBAr0CiwJLAjICLgLjAV8BFwEHAeoA7gAfASoBCwEFAUoB
+sgHUAeEBDgIIAsQBeAFeAV8B+wBsAEIAcgC4AP8AZAHAAfIBMQJrAkIC6QG4AakBpgF6ASsB6ADK
+ANQA2QC/AH8ALAAzALIAJAEvASQBJQEEAf8AGQELAdcAjABPAAsAq/90/2X/Z/+e//f/aADYAPcA
+4gD2AO0AjgBoAJ0AxgCwAGQAGADk/6n/Xv80/0X/af94/1z/Sf+R/+v/5v/K/+b/AwAXAEkASgDO
+/17/Ov8F/wn/Vf8u/5X+LP4k/mj+vP7g/vT+CP/4/gD/Qv9y/1v/M/9L/1r/Ef/n/ir/Yv82//T+
+5f4M/1b/lf+k/4f/WP9V/5D/uP+l/4L/fP+Y/5//Zf80/1b/iv+s/+P/HAAmADgAcQBoADMAGAD5
+/7D/ZP+B/7v/jf9I/0L/Qv8X//n+9/7O/qz+of5V/h/+Q/5u/oL+Zf4i/iD+Wf58/pj+yv7V/tX+
+IP+B/5D/O//n/uX+4P7Q/hj/Wv9Q/0n/W/+G/5//pv/A/7z/lP+B/6r/0P+Y/1f/bf+P/4r/Zv8q
+/wX/5v64/pf+gv5j/kb+eP7f/ib/IP/N/oD+sv5B/4b/cv8a/3r+P/6V/ov++f2g/ZX9pf3x/XL+
+/v5V/3D/nP+w/4H/U/9X/2D/L//k/rX+qf6j/nv+Xv56/sj+N//J/0gASQDf/6X/2P8tAE4ALAAD
+AP3/DAAkAAsAsP9s/2H/X/93/7//4//L/+//YADAAPcAEQEMAe0AqAA/AOD/zP8FAEMAbACkAMUA
+0AD5AN0AhQB+AJYAeQBaAEAANgA6ABgAAwARAP7/0P/v/0wAYABHAIUA5QDkAMYAGAGiAeUBHAKG
+AosCGgLXAcYBjAEIAVoA1/+k/7H/2//1/wAANwC0AFUB0QEcAhcCpgFsAb0BCgL4AagBTgEFAdgA
+tgB7AC8AEwBlAOQAIgFFAW8BTgEdAVsBcwH9AKEAZQAtAGoA8QBkAZYBhwGSAbsBrwGGAcABfgIy
+A1IDDAO0AhgCUQHDAFYA8f/S/+P/7v8hAH8A2gBAAYUBdQFbAXwBswHIAeAB9QGoASYBrAA8ABkA
+LgAgAOX/rv/j/30A5gAJASsBSQFiAWwBZgFlAVIBFgHLALkA6ADPAEIA9f8wAIEA6gBvAZoBVAG4
+APf/nv+3/67/fv9W/yT/Kf+f//z/1f+U/33/dv9z/6v/SADDANEA2gDuAPUA+wCzAAMAc/9G/2L/
+yP8cABAAFABFADcA7P+7/87/7f8AAAsACgApAHkAvwDcAOcA0gBzAPD/fP9B/zD//v6Y/jn+Gf4j
+/jX+SP43/u/9xP3U/fb9WP75/oD/8f9kAJYAZQAAAIr/HP/C/oT+dv5x/kT+Ff43/rn+VP+7/9n/
+BgBSAFoANwAyAD0ADQB0/+H+kf41/sT9gP1p/U/9aP3F/R/+Yv6y/gP/Jv9I/3b/ev9Q/xj/z/5+
+/m7+pP7C/pr+jf7N/hP/Pv9M/w//i/5f/sv+9v6d/pD+yv6d/lL+Wf5Y/hX+uP2u/R7+aP5m/pX+
+9P4p/wj/2f7P/u3+Iv9F/2z/gf98/2P/Ev+q/nr+sP4r/5P/zP/3/yMATABhAGcAOQDM/47/rf/K
+/5L/KP8M/1H/av8n//f+Av8Z/03/sv8hAFsAQQDp/7L/7/9DAFMAPQASALL/f//J//7/yf9u/zj/
+Yf+M/2T/X/+v/9v/0P/L/6L/dv+r/wIAAwDS/7j/s/+T/2r/i//i/w4AIABOAIEAoQCZAG4AfwDl
+APoAmAA6AD8AwwAoAe4AsQDrACgBBwHQAPgAHQHLAJ4AzQD5AEABkQGOAVcBKQEWAUYBggFHAc8A
+oACqAL4A0AC+AIwATADt/5//xv8sAGkAkACwAL8AwQCaAHIAjwDYAAwBJwEwAe8AXgDY/7v//f9d
+ALwA4gD5ADsBUQE0ASYBTAGnAfQB3AFmAS4BcAGNAUsBJQFQAXoBZgFSAXEBmAGNAWYBhQHmAQoC
+xwGCAWcBOwEPAQYB6ACkAI4A0QATAdQAQQAmAKkAGgE3ASsB/wDsAAwBEQHkALcAjgCAAKcAoQBN
+ACQAOwASALr/4P9UAEYA7/8RAGoAewBqAKYA/ADOAGMAOABNAHkAcgA4APP/wv/W/wIACAAnAH8A
+xQDvAA0BIwE6ASEByQBtADwADQCu/3L/nP/b//3/EgAdABYA6/+w/4L/Wf9k/7X/2f+o/4z/cf8i
+/wn/N/9n/37/Tf82/6D/1/94/17/5P8mAOf/7f80AFwAiwC6AL4AqgCSAG0AHwCk/0D/Gf/4/uH+
+G/9q/2T/Pf9E/2P/ef+K/4f/fP+b/8P/hP/q/qr+3/7c/rD+0P4L/xX/LP9//7f/pf+5/yEARwAD
+ALX/UP/Z/t/+Z/97//P+zv4B/wX/MP96/6T/1f/o/9v/3v+1/2f/Qv8y/yz/J//P/l/+SP4v/vD9
+8/0l/k3+e/7a/k3/qv/V/87/3f/D/1D/BP/0/rL+U/4c/u39z/3b/fr9T/7t/kr/Lf8m/1b/Xv8g
+/9z+1v4Y/4//8//0/3v/5v7S/i3/df+w/8T/mf+h/7f/fP8Z/7H+d/5x/oT+rv6o/lb+OP6Z/u3+
+1v6h/pD+n/6+/u7+IP81/0T/cv+J/1j/Jv9E/3b/Zv9y/9H/8v/H/9b/GgAMAHb/4f4c//v/gQBd
+AAcADwCXAPQAvABWAB4APgC4AFABowFtAQAB7gAuATcBzgBCAPX///8uAEMASAAyAOH/uP/3/zMA
+XACaAO8AhQEYAgoCcAH+ANAAjQBYADwADgDs/7z/ZP83/1P/lv/j/yAAigAvAcMBCQLyAdMB9wH9
+AccB0gHUAXcBRAFaAVMBKgEWARYB9wDMAPwAfAHVAdgB0wHoAdYBuwHgASoCPQLzAZsBlgHYAfsB
+wgE7Ac0AowCBAGoAdABqAD8AJQAxAHAAyQAPAUwBYAE1ASwBYQFLAckAggC3AP8ALwFPATwBDgH5
+APoAMAGCAagBoAF1AWIBdgGAAZMBkAE/Af4AFgExATkBQgEyASgBWQFrAT0BKwEPAeAAxwCfAHMA
+VwAtAO//3v8ZAE4ASQBEAEIAIwAZAEsApQDoAMIAhACxAOwAzABfAML/n/84AKgAnQCEAFUAOwCZ
+APwA/gDEAH8AWwBgAI8A2ADUAHgAPAA5ACoA+/+z/3T/iP/P/wAAEwAAAOH/3v/n/+//FABRAFgA
+EQDU/8//4f/F/5P/hv+H/3L/Tf9F/1v/Uf87/2T/pv/E/9f/AgAeAA0ABwAAAMz/rv+2/6v/wP/v
+/8P/Xv/7/q3+qf67/q3+u/71/vb+zv7t/h7/J/8z/wz/o/5v/ov+ov50/kf+aP6X/rP+6v4V/xb/
+GP8V/xD/GP8c/xD/+P79/vj+y/65/s/+9P4k/0H/OP8M/9r+6f4f/zH/Lf8d/wv/+/7A/oD+fP6U
+/of+Zf54/pf+S/77/Tj+W/4y/j3+MP78/SP+lf73/hL/yf6I/rX+2/6m/ob+sv7g/tv+x/6X/jL+
+Av4t/ln+Y/6J/ub+P/96/5T/XP8c/1X/0f8aAAwA3f/k/wUAyv86/8v+nP6d/sb+8P4w/63/GAAx
+AAQAtv9o/yj/Cv8W//3+p/6c/tj+uf5p/kf+Dv7c/Un+7P4x/33/6f8oADQAEwDL/2X/7v6a/pz+
+z/74/i7/Z/9A/9f+vv4z/9z/NgBLAGgAdgB9AKUAzQDAAJEAsQAeAWgBcwFBAeIAlQCPALYA0QDN
+AJYAYwBxAIAAXAAPANv/BgBPAGoAnQD9AD8BjgH4ARQCxgFzAW8BjQF6AWoBegFFAfIABwFMATwB
+EwEpAUkBMAEcAU8BlQG8AasBhgGaAaoBjwGMAaIBpAGLAXQBUgHwAFsA/f/x/+7/+P82AKAAIgFE
+AdsAewBYAGMAqAALAVQBZgFAAfYAtwC+AOQAswB4AI0AnQCjANgADAHuAJQAagB4AIwAwgDtAMQA
+tQArAcsB+QHCAXMBAQG6ACsBqAEvAWQAMgBqALcAyQBgAPL/7f8oAG0AkwCGAHoAsgDnANkAnwAS
+ADT/qP4A/+r/jACsAMEAzgDCAN8A7gCfADUAEAAsAEgAOQALAMb/aP8h/zv/rf8iAHIAqgANAcUB
+XAJWAgAC4AHlAdkBzgGmATsBxgBGANH/1P9TANQA8gDNAJYAUwBLAJMAogBrAGcAVwASAP7/KgBo
+AHQAVgBvAK0AiwD4/2//Vf96/4//0/9DAE4ADgAZAFIAVQAOAIX/Ff8n/1//Xv9//8D/j/9l/9v/
+NQATAO7/5P/h/wcAHgDO/0z/EP8//3T/VP8o/0X/ZP8i/7v+qP7g/kr/xf/3//b/CwDi/4X/qP/q
+/4v/Bv/i/uH+3/63/lb+Mv5d/nf+mf7a/sr+a/5w/sT+vf6J/rr+BP/g/qn+yP79/v3+4P64/of+
+bv51/pn+1P4Q/1H/gP+V/93/SAB8AGYAJgDl/6T/bP9L/y7/NP9K//n+iP6L/rL+iP5T/nb+wv7D
+/qv+zf7n/tb+yv7R/qb+bv7U/m7/W//n/m7+DP44/r3+2/6u/sr+M/+g/wQAZgByAAkAoP9x/3H/
+kf+T/zD/s/7C/jv/af8k//L+Ov+x/+r/5P/S/67/oP/j//H/p/+C/6n///8eAOD/oP+G/2v/c//Y
+/ywA/v/M//f/MQBpAIsAkwCeAJYAfgA+AMT/h/+t/7//w/8KACkA2P+u/7P/aP8p/1D/hP+1/wcA
+RQBmAE0A4f+m/9X/EgApABYAAAAIADMAcQBzAD4ATQCkAOIAAwFEAXIBTgEVAfUA9gAHAQ8BAgHr
+AOkA2gCzANMAVwHAAdEB7gEeAj4CLgLtAdAB1gG6AYUBbAFuAXcBhgF1AUMBPAFlAVQB0ABYAEoA
+awBlAC8AMgB2AF0ABgA2AMUAHAEjAQMBHQFKAQYBjgBhAHsAjgBvADYAOQCtAC4BEwGZAHwAtQDP
+AKcAfAB4AI8AuwDvAPUA1wDLAKUATgAyAFMAYABkAGkAeQCoANoAEwE6AVEBogHkAZEByAAaAPn/
+OwB8AHUAJgAJAE8AaAAgADcAvAABAQMBvgANAHf/Wf9p/1P/I/8m/17/mf+c/63/NgC4AMoAwgDy
+AEYBTAEFAeEAxQByACMALACLAL0AigB3AKUA1AD/ANIAawBaALoAJQEnAdQAeABEAFQAjgCsAJEA
+SQAfAFoAmgA/AI7/Wv/G/0kAcQA6AN3/g/9S/1D/X/9P//D+bv6w/sf/QgDb/4H/gP+2/93/f//h
+/qr+yP4D/z7/Wv9F/+X+lP6R/o3+oP60/jL+oP3f/Xf+vf7c/gv/KP8b/wn/6/6J/iT+8P3x/Uz+
+yP4N/wD/lv4m/h7+X/6w/gr/NP8T/xD/Q/9G//z+rv6z/gb/T/9D//z+wv7E/ur+Af8M/x3/I/8d
+/y//Lv/F/h/+zv3c/f/9Lf46/kn+a/5U/kX+bP6T/sL+Iv93/5j/oP+B/xT/jv42/hz+MP5p/uL+
+a/+e/3z/hf/s/ycA9/+5/63/yf+//4j/mP+1/2j/Ev8j/1z/ff+0/woAWwCIAHQAVgB4ALUAxgCY
+ADgA2P+//6//Q//g/g7/Y/9G/wL/9v4L/0L/bf9d/0z/bf+2/xoAkgC0AD0Akv9K/4P/vP+S/0n/
+Jv8c/yf/Xv+m/7T/w/9PABIBXgEzAfoAyQCVAGIAVQCaAAcBHQHAAHQAVwA7AEoAbQBaADgAbQDk
+AC8BIgHUAJ0A0gAnAR0B7gD5AO0AmwBEABEANQCoAAgBDQHKANEAhQEdAvsBxwHFAaABogHFAa8B
+qwGxAV4B8QC1AF8ABgANAFEAhQC+AAwBBQGnAIIAwQD9AAsB+ADSAOgAJwEjAeQA1AARAUkBYwGR
+AckB5wH8Af4BxAGUAbkB6AHXAboBzwHRAZgBcAFtAWcBUQEpAesA3gAUASUBAwHpALgAdQByAIMA
+XAAtADEAQwA7AFMAeQBkAGIAogDhABQBKgEXAQEB5ADDAJkAWwA/AFwAfgCPAJMAlgC0AMgAsQCb
+ALcA7QAEAegAogBJAPr/6v8MABgA/v/d/+r/VADYAOAAjQCSALwAlAB5AIAAQgDa/6j/3P8lABQA
+tf9u/5z/PQDcAOQAeQAqAAUA5P/4/0cAHAB5/yj/Iv8r/2T/n/+Y/3T/cP+N/7n/uv+K/4j/vv/n
+/+n/o/8i/7f+nP7I/tn+tf7K/kL/pP9j/9L+nf7g/n3/8f/g/7j/pf+k/9r/DQACANn/3f8AAOb/
+lf9V/zr/G/8A/yH/df+0/9T/CQBaAJIAoACFAE0AKgA1ADIAxv8C/2L+Tf5t/lP+Of7y/ZH93f2A
+/pj+cf5r/nb+yv46/0H/+P7u/gj/s/49/iz+KP7g/aX9pf3E/fn9XP7h/kz/mf/K//H/KgBNADIA
+7v+h/2b/bP9j//H+f/5V/m7+xv4a/x//HP9t/7f/1f/+/wMABgBJAIMASACR/+b+1P4m/0T/DP+d
+/vn9pv0v/sf+1v7f/tb+yv49/93//f95/8n+X/46/iP+LP5c/lX+BP7d/Rz+m/4C/xj/LP+J//7/
+ZwDZACMB/gCKAA8A5f8fAHEAxAD9AAcBEwEmAREB1ACdAJUAvAClACYAx/+z/7z/0v/0////wf9/
+/5f/0v/6/xgAOgBfAFYAKwAgAOL/Z/9i/6T/lv9t/2v/XP8r/w3/Jv93/5z/m//+/4MAjwBBAC0A
+ZgCEAIAAfwA7AM7/z/8cABMAw/+N/3f/if/5/4cAvgCWAHQAowAPAUgBAwHdADgBbAFUATUBFQEi
+AVABeAGzAcoBcgEMARkBbQGRAYoBjgF2ATQB/gDuANsAkQBZAMcAYwFvAV8BlwG1AZcBiAFqATkB
+SgFtAWcBcAFmAS8BOQFqATEB5QAQAVEBfQGpAZ4BbgFHAWUBmwF3AT4BQwGBAQECZwJNAuYBsgHZ
+AQEC+AG8AWYBQgEpAbIAJADk/9P/6P8vAGYAXgBnAKkA0wDNANoATAHsARoC0gGXAY0BTAHTAIoA
+YQBVAJoAwwCgAOAAYQFYAR4BHQH2ALkAxwANATgBLgEeASgBDwGUAB0AIABDAEIAdADTAPQAfQDs
+/wsAkgDWAMQAXwDQ/4//uf///0IAaABrAIoAsQCQACIArP9//5//0f8EADwATQAUAL//kv+N/37/
+Z/8+/9b+ZP5R/pz+6P4T/0H/h/+s/4j/X/9//7b/pv9f/wf/y/7B/qv+mP61/tH+xf7H/vv+EP/s
+/vT+Nf9+/9f/RQBsAPf/Yf8s/yL/8/6Z/ln+av6v/q7+Tf4c/n3+B/8p/xv/Qv+S/+H/EQAJAMf/
+fv9X/y3/6f7F/pH+Ff6//dH9Jf58/pL+lf7J/gj/JP///qD+Wf5N/if+5/2//cT9FP4+/vD9ff0j
+/Sn9wf05/h3+Df42/k7+ev7O/u3+vf6T/oj+m/7i/g//v/4+/kL+yv4x/z7/JP8T/yX/RP9l/3j/
+YP9J/3D/mf98/2//jv9u///+nf6o/v/+Gv/3/vP+Cf8O/+/+wv7A/gD/O/80/xb/J/9o/6b/p/93
+/0f/JP/3/uD+Av8n/1b/fP9O/0b/wP8wAD0AIAAIAPn/6v+9/4j/hv+f/67/1P8LABAAyP9y/2v/
+s/8AADwAZAB/ALAA5ADrALYAggCyADIBiQGDAVUBSQFXAUEBHgElAVEBkwHtATgCQQISAu4B2gGp
+AYUBlwGdAWUBBgG3AIUAWgA5AC0ANwAnANf/zf9ZAMgAwgCvAKYAogC9ABUBjAGiAUMB7ADqAPAA
+uQCaAKAAmQCdAMMA8wAAARIBUgGCAXcBVQFoAZYBmQGAAXkBtgHvAdEBowGJAWYBaAG7AeoBvAGy
+AdsB5AHRAcUB1gEHAi4CIALWAXkBMgEBAeMA3wDtAAQBJAFQAYEBngFpAfIA0AAoAWEBQwEyASIB
+9ADiAK8ASwAbABkALgBmAHQATACAAPQA+ACnAKYA4wDwANoA8QBgAbkBqwGHAW8BVgEtAbMAFADd
+//n///8JAE8AiQCwAN4AswBWAGAAjwB3AFcARQAuACcACADL/4T/Uv9d/4L/n//B/+7//f/t//v/
+FQApAAQAcP/0/in/rv+6/4P/Wf8P/yT/oP/W/+n/HQA/AG8AxADYAKMAaQAwAP7/7P/Y/4L/3f5N
+/lH+kv6m/t7+S/+C/3j/gP+S/53/sf/N/+T/vP92/2b/UP8F/8v+wf6k/nf+ov4h/1r/D//d/vj+
+B/8S/y3/R/9m/6f/1P+c/zD/yP5Q/vn9//0s/jj+c/7+/jT/C/8I//n+qf5p/lL+ef7X/v/+5/7T
+/p/+Qv5K/sH+5v6//gX/hf+i/5D/f/8s/8f+pv6l/qD+t/7S/t7+B/8J/73+iv5L/s39t/0u/pr+
+rf6A/l7+Xf5c/nj+2P5A/1r/PP9M/6j/+v/u/7P/s////zQADwCh/yb/0v6I/lT+Qv7+/bT9+/1n
+/l/+e/76/k7/p/8yAHAABgA5/8/+5/7S/lr+Av4b/mn+qv7e/gT/C/8j/5v/OQC5ABsBLAH3AOAA
+0QCLAHQAwADoAMAAmACSAJMAfABGAAMA4f/l/wAAXwDVAPYA2ADDAKQAdgBtAH4AdwBDAOD/a/8e
+/xj/Rv+F/6L/ev93/9//GADv/+3/EQAYADwAiACkAIcAYABQAFsALwC2/3f/rv/0/xYAaADkACIB
+IQEYASgBTgFaATUBDwELAf4AxACKAJoA+gBSAXkBlgG4AdcB0wG2AZ8BnQHAAQcCJQLYAWUBIgEf
+ATABRgFRAU8BZAGMAacBggEZAcMAyAApAYoBcgEIAQQBpQEzAvoBOAF4APr/BwCSAMwAkACBALsA
+IAGGAY0BTAEHAd8A5gAUAVcBRwG8AFgAdwC5AMkAzgDpAOoAzgCrAKAAoACNAJ8AzQDeANEAwgDY
+APUA4gCkAIIAnwDbAAgB7wCnAGkAUQB4AOMANgEgAd4AwQDWABABOgEvAQMBxACdANoALQElAQAB
+0wBXAOT/yP+t/3z/U/8l/zr/vP8aACUASABuAGUAawB/AFYA5P+R/7H/2//s/xIAIAAIAAMAOwCG
+AK8AwwDuACkBGAGuAHAAfgBTABEALgBFAAUAzP/J/8b/rf+D/z3/B//+/iD/bP/E//P/zf+R/5j/
+l/9h/0T/NP8P//X+rv54/tr+HP+7/lX+G/4A/lr+2/4d/y7/A//r/j//f/81/wL/UP+H/1n/KP8b
+/+b+lv6O/rn+z/7a/hL/Tv8v//f+E/9o/8P/7P/x/wEA7P+9/63/d/8C/8/+2v60/pL+wf4k/3D/
+e/+Y/8//q/9A//f+3f7i/gT/If8r/y//HP/Y/lr++v06/s7+HP9P/4P/l//O/wwA9v+S/yj/1P6g
+/qL+t/7O/gb/L/8R/+b+3v7M/r3+7f5m/83/1P/J//j/MgBCABMAz//m/2YA1wDMAEQA4P/2/+z/
+d//y/q3+5f4v//j+u/70/k//Yv8v//v+/f5T/7//CgBYAIQAlgC+AKcALgCr/23/Y/8b/9X+MP+c
+/3//Sv9K/2z/qf+2/5P/k/+6/+n/CQAIAP7/FwAmAAEA2//f/wsAGwDS/5X/tP+r/0D/5v7j/ij/
+a/+P/5v/df9C/1r/kv+4/wcAbgCBAGgArwAeAS4B+QC8AIcAgQCCADkA2v/O/w0AaADRABoBHwHw
+ALAAgQCAAKkAtQCVAFQAFwCFAFoBbgHzAOIAEwEYAfUAqQBsAG8AlgC9AKgALgC1/5z/r/+9/9L/
+y/+i/6//GAChAAUBEgHiAO8AZwHFAaoBUwETARkBRwFhAT4BAwEOATUBFAHVAMMA0gDJAJAAjQDo
+ACUBLgFtAccByAGdAYcBZgFqAY4BcAEXAdAApABcAAsA8//8//P/7/8hAHIAwwAgAWABZQF7AZYB
+dAFVAUwBVwGFAYEBPQH2ALUAdAA6AA4A8f/t/zgA2wBuAZYBfgF6AWsBOQEIAd8AwQCkAGoALwAt
+AE4AJwDI/5f/s/8DAFEAfACRAJ4ArQCyAKsAiwAsAMH/p/+2/4//Vv9P/1H/Yf+n/wAATQBwAIIA
+0AD3AJYALgAMAAAABAAYABoAGAAEAMf/qv+2/5D/bP+H/4f/Uv9S/8D/GQDc/2f/KP8L//j+1/6N
+/kr+T/6c/vv+J/8p/1H/tP/1//T/8P/g/7L/gf9d/2r/r//y/wcA+//g/7X/iP9e/1D/R/82/2L/
+fP8g/77+zf4Y/zz/OP8E/7H+0v5P/1T/4P5v/gr+9f1e/qT+c/4a/gj+hv4M//H+nf6z/hP/PP8/
+/3P/bP/z/oX+hP63/qL+d/6T/sv+8f4N/x7/IP8p/0r/WP82/zH/Xv92/2T/R/8+/2T/oP+6/6n/
+df8d/7v+hv6y/vz+7/6U/mP+pv4I/yP/HP8b/wL/0/7Y/gr/Lf9F/x3/wP6B/k3+L/4T/tf9Dv67
+/ur+mf6s/iH/Y/9//47/if+M/4//ev82/+/+4v78/gb/IP+f/z4AggB8AJkA7AAoAQYBlgBaAHMA
+awAbAMH/lv/D/zcAiQCpAMQA4QAMASEBAAHeAOIA8gAjAWcBcAEyAb4AawBxAI8AggBOACEAz/9l
+/2//xf/W/7z/0v/r//j/SwC7ANUApQCJAMoAQwFXAQoB5QDHAHcAXQCpAPYA9gDAAKEAuADfAB4B
+gAGwAXcBBQHNAPYANwFRATIBCwETAVEBlgGdAXsBcAGAAYABWAFKAXcBpQHSARMCVAJsAkQC7AGR
+AT0B/gAUAW4BsAG5AZoBPgEDATsBMwHCAI8AbAAaAAcAHgAoAEUAHwC2/9j/bACMAGMAsQA7AVgB
+PwFFAUQBUwGkARICYQKXAuACDAPXAl0CuAEDAWYA4P+Y/6z/sv+m//3/cwCNAGwATwBiAJIAqADD
+AOgA6ADLAJcAUwAeAPH/6P84AK8A7ADkAOkAAwHZAIUATQBfAI8AZgA+AG8AWwAgAGkAzgDmAO0A
+8QDmAOEA0ADaADsBXQHcAGEAPADx/33/Jv/S/mz+Mf5z/gT/Uf9o/7r/MAB9AIIAYgBeAHQAXAAX
+AP3//v/l/8b/if9A/z3/dP+h/5//iP+V/6H/mP+//+r/3v/Y//L/+v/d/8L/rf+a/6r/6P9DAH4A
+PgDl/+3/vf8f/8n+qP5o/kz+OP4S/if+Uv5W/oT+rP5y/nX+9v5T/2P/bf9J//D+1/4r/2j/Iv/X
+/g3/bP+V/4r/YP9B/0L/af+Z/3n/+f6Y/tD+Uv9l/xP/9f4S/yz/P/8o/+/+4/4N/xz/Ef8w/0L/
+Ef8A/yn/Hf/D/oL+iP6L/kn+9P33/ST+9P3P/Tz+wP4O/17/gf+P//b/LQDf/4D/Hv++/oj+O/7V
+/ar9u/21/a79Bv6P/tn+A/+S/1MAuQDXAM0AsQChAJIAlgCPADUAm/8F/7f+yf7q/tX+xv70/i3/
+bf/R/ykANwAFANr/0v/W/9L/4v/2/77/UP8y/1v/Vv8//3L/tv+m/4z/0P8eAAUAyf/B/4v/H/8I
+/0v/d/9y/1L/M/9A/1L/Vf+H/9L/2//E/wMAcABMAK3/av+X/8b/+/8dAOv/qf+2/+7/JQBAADMA
+SAB5AGUA+/+V/5P/yv/v/xQAXwDIAAsBGQEPAeoA4gAPATkBSAFHAVQBbQE6AbIAUABqAOIAZQG3
+AawBSgH0AA0BUQFAAfwAzQCwALkAvgCZAKkAxQCfAKcACQE8AS4BQwFiAT4BHwFnAY8BPAEFAQIB
+1QCBAEMAQgB8ANAA/gAFASYBRQFUAV4BRQEuAUMBXAGHAcAB2gHgAdABwgHbAdEBgwE8AS8BMgEa
+AQkBFQEaAQ8BDgEyAWoBhAGBAWIBMgE6AWUBSQEAAcgAmQB8AFoANQA3ACoA7P8CAH4AsgCwAMAA
+jwBBAEAAVAAfAOr/GwBWADoAAwD8/yAARABhAJIAzQD3ABEBAQHJAJkAhACaAKQAXQAxAF8AcAB1
+ALMA0QC5AMAA2gDZAOoAHwEoAf4A5ADWALEAjwCUAJMAWAD4/63/jf9c/x7/Rf+q/8n/yP++/2z/
+Xf///4MAZgAAAMD/yP/C/3//Of/0/rv+zf7l/uD+1v6S/mH+nP77/lb/n/+s/4f/aP97/87/MQBG
+APz/wP/S/9P/kv9H///+vv61/gT/UP9N/0T/cP+//wgAMADU//b+Zv5G/h3+zv2R/a/9E/5l/nv+
+Wv4Z/gP+aP7l/t7+af7m/ZH9lv2v/ZL9cv0//Qr9Jv1Y/WL9ef21/f39af7o/j7/Rf8R///+K/9y
+/8r/IgBXADcAw/82/8P+aP4I/ub9Mv5l/iX+9f0e/lT+dP6j/ur+Kv88/xH/5P7p/vf+5P7q/vf+
+u/6E/qH+1f7c/vb+Qf9p/27/k/+v/2T/3P66/vn+Cf/g/rL+k/7N/lf/qf/F/+X/6P8AAD0AaQBp
+AFUASwAkAOn/0f+z/2L/H/8l/zP/IP8b/yP/Kv9M/5r/AwB1AMgA5gACAR0BJQE9ATkB6ACGAD8A
+FwAOAAIADgAtAAMA1/8FADQANABqAPAAYQGNAZMBSAHHAIwAgQCWANsA6gDfADIBlAGGAUAB/ACu
+AIoAngCfAGoAFgDu/wsAEADX/7b/6f8kAEMAcACpALUAmwC5AAwBMgEBAcQA4gBIAZgBrAGNAUYB
+HgFqAcQBpAFTAUYBfAGwAdgB5AG+AZcBhgGRAcsB8wG6AWYBfAHeARkCHgISAukBpgFnARYBvwCE
+AGMAeQCyAMwAqQClAAUBVQFWAX8B9wFgAo0CowKmAlwCzwF7AXwBPQGIAOn/tv+5/8b/9f9KAJcA
+ygAsAbYB8AHgAbkBgAFfAVYBMQH2AKsAbgBuAGAAIgABABQAPgB/ALMAvwDtACgBEwHWANcAAAHz
+ALAAfwBkAC8A6P+p/4f/hv+k/9L/4/+w/3D/sv9yAK4AOQD2/wAAJABSAC8Az/+T/13/Of9c/3r/
+Y/9Y/3f/k/+w/wYAfgCmAGMAOQB4ALcAlQBCAOv/pP+Y/7f/6/8qAFMAZwB6AH8AhgCQAHIAPgAm
+ABsA6v+s/6X/7v9RAG0AQQAiACoAMQAlACwATwBPAPb/if+A/5j/U////hv/Uv8w/x//VP9T/yP/
+Bf/d/tT+H/9g/1L/KP8s/1z/gf+B/07/BP/q/gj/Pf92/5n/s//P/8b/kf9P/zn/aP+Q/47/hf9X
+///+sP57/pH+1v4F/yb/Jf8C/wX/Gf/7/tT+sv6Z/sP+8v6w/kz+Wv6P/pT+jP6g/ur+Cf/b/s7+
+9P4f/xv/5f6o/qj+1v7K/qD+dP4n/vT94f3G/dX9J/6L/sv+6/4J//v+z/7i/hb/Gf8H//f+2P6s
+/oD+bP5y/pf+2/4c/z3/Ov9E/3X/lv+L/4b/q//Y/+//3/+Z/2X/fP+M/3n/iP+N/2z/f/+n/73/
+FgCHAJoAbABwALEA1QDBAJMAcQBXAEcAMgDK/2X/ev9z//z+vv7c/vP+A/8j/3n/EABrAEkAKQA9
+ACAAx/+S/6H/rv+m/57/cf8x/zf/Tv8j/xL/V//R/zAAMAAaAG4AEQFpAVgBJQH6APAAHAFUAUMB
++wC6AJgArwDqABgBLwExAU8BnwHZAcEBiQGBAZEBcQETAa0AfAB7AI8AugC/AHUAdwDvABYBvABa
+ADcAXwCPAJUArACtAFcABgDn/7v/lv/I/z4AdwBRAGUA2QAmAUQBewG/AeQB4wElAscCDwOzAhcC
+jQE4AfwAygClAKIAuADIAMoAoABqAHgA2ABJAXcBWQFFAV4BcwGFAXoBLwHwAO0A5ACiAGIAdQDV
+ADcBUAE3AQoBvgCgANYA9wCxAHsArQDHALwAwwCeAHYAlwDHAPgANQFGAWwBywH4AesBuAEsAW8A
+5/+q/7T/6v8DAAoANwBrAGEAJgAGAAsAJQCLABIBRgErAecAoABZAPf/lP9O/zX/Zv+U/2X/GP/z
+/vz+Rv/X/3AArwCvAMcAtgB1AGUAYwA1AAwAGQD9/33/aP/S/8f/Z/95/73/xP/I/7T/WP/z/sH+
+1P7//uf+w/73/kz/bf93/5j/ev8O/9f+IP+h/+H/2f/J/9v/6f+d/xD/qv6w/vT+HP/+/sj+3P4+
+/2n/Df+P/m3+n/7y/j7/cv+V/63/3/8cABsAAAAUAEQAVAAGAGv/8f7p/iD/Fv/S/rz+x/62/rX+
+9P4o/xH/Fv9H/33/BQBnAC8A4P+P/yn/6f6m/jz+9P3B/Wj9OP12/f/9X/5z/q3+IP9Y/0//d//A
+/+z/5/98/+3+1/7U/mn+Bf7A/XH9ev3p/TT+TP6E/sT+z/7J/uH+E/86/yL/vf5O/jj+PP7t/ZX9
+jP2x/fD9U/6v/sP+zP5G/8D/lf8u//f+3f7p/u3+qf6N/rr+zP4K/2v/W/8V/zX/lf+t/4n/mP/X
+/+H/wf+2/5L/Xv9q/4D/Wv9J/3P/jP/B/yUAQgBUALoAHQFJASkBugBvAHcAiACjAMoAtQB/AJcA
+1ADBAHUAMQAsAGEAkwDWABEB/ADTAN8A+wDzAOEA9QDzAK8AoQDmAPcAmwA8ACcAVACWAMAA0wDX
+ALgAqADDALQAmQDCAOIA1gAHAWsBfQEgAdwAFAFnAYwBogHIAfoBRwKRAngCNAIXAt4BgwFkAWkB
+cAGXAZwBdAFsAYQBtgHbAbsBnAHCAfUB9AHjAdIBfQH+AMkA6gATASUBJgESAfgA7gDFAJIAkQCg
+AM0ABQHkAIoAdwCHAHwAfQBzAJYACQE4ARMBKgE9AdgAjQC5AMAAfwB9AMMA8wAEAUMBgQF7AXgB
+XQEQAQEBKAElAQMBJgFlASgBogBbAEsASwBYAIcAvgC/AKUAmwBwAEIAcAC1AL8AzwAFARoB6wCp
+AIUAbwBeAGIAWQA4APT/c/8Z/1L/rf/R/+H/yP/G/zoAwADpAMMAdgBVAIUAeQD4/4//kP/A/9X/
+uv+V/2P/Nv9F/1D/a//i/zEAIgAEAOL/tf+n/9f//P/g/+D/DgApABkAzP93/2P/kf/o/y4AVwB5
+AJEApgCfAFEA1v9v/y//Cf/1/sb+if65/jv/gv+N/3v/P/82/5X/z/+n/5X/g/82/x7/Jv/a/nP+
+G/7P/ev9RP5i/o3+8f4Z/wH/+v4U/zb/K/8i/1P/d/+F/8r////T/5v/QP/A/p3+rP6x/sH+u/7S
+/jX/aP8Y/7j+t/7w/hX/8f7J/v7+Xf+E/1X/6f6W/pT+zP4L/w7/+v4a/yb/5v6s/q3+m/47/iH+
+bv54/nf+v/7Z/r7+xP7c/un+Iv9w/4j/i/+F/4P/xf/p/3v/Av/n/sr+cv4d/vb96P3w/SP+SP4m
+/jn+qf4M/17/rP+0/3b/fP/a/wMA6P+k/xf/p/7d/lf/iv90/1n/Yf+R//T/NQD8/5j/kf/J/+7/
+BgAEAOT/1P/d/9b/vv+w/5v/iv+n/8//2//r/+T/u/+Q/2z/iv/R/8//sP++/7j/nv+q/7P/yP8V
+AHMAmwBxAEQAZgDMAPoAqgA/AA4ASQDbADoBJAHeALYAywD8APUAsQChANMA5gDYAN0AGQFiAXIB
+XAFJATIBBgECAV0BvQHUAeEB+gHlAcQBrgFUAcEAawBnAF0ANwAKAOP/DwCNAKoAbQBvAMEALAGl
+AQUC9wGUAUwBbwGvAXYBzQAyAAgALgBIADcAKwBTAK4ALgG2AQIC+QHUAboBrQGjAZkBjgFDAb8A
+cAByAGcAPQA0AE4AegC4ABQBgQGzAcIB/QFAAmcCUQIJAt8BxgGoAaYBmAFuAWABcQF/AXMBNgEM
+AWQB3gG/AU0BLwEsAe4AyQDXAPMADgHlAKoAvAC9AGgANgBjAJEAnwDBANAAiwAxAD0AoQDRALkA
+pgCAAC8A7//7/z8AeACJAHUAVQBVAG8AcwAnAMv/0v/9/woAKQBjAI8AigBUACsAMwAoABIADgDv
+/8L/n/9R//D+5P4S/zz/cf9v/zT/RP+H/2r/Jv8b/+r+lv56/mb+Mv5A/nn+jP6n/pP+WP6E/uH+
+8/74/lP/rf+L/0b/Qf9K/yn//f4C/zv/b/9Y/wz/4v7b/s/+8f49/1T/Nf8r/zj/LP8W/xH/9P69
+/rX+4/4G//r+1v7V/g//Sf9Y/0//Tf9N/yb/B//1/tT+4v7q/rP+lP6e/sT+H/80/8b+cf5l/l7+
+hP67/p3+Zv5j/oP+wf4I/xP/9v76/gL/xv5R/iT+ev6//qr+kP6m/uz+Cv+9/ov+vv7R/p7+jP7A
+/iv/k/+a/3T/if+Z/1j/O/9b/2D/Y/9R//X+qP7N/iz/YP9A/xP/Lf9T/1X/X/9N/wX/Df+P/9j/
+fv8B//b+Fv/j/pv+gP6B/sH+JP9Q/0//W/+f/xoAdABmADEACgDU/5f/cv9a/0r/Wf+V/9L/0v+/
+//H/QABFAPX/sP/l/2kAvwC2AIcAlgDNAPMAEgEZAQQBBgEUAewAvADKANIAowCNAL4ADAE5ASAB
+/QANASwBHwEBAVYB6wEAAn0BqwAdAEsAvADNAKsAqADDABQBmQHdAa0BJgG7APUAaAFiARAB2gCt
+AHIAUABdAHYAZQB4APcAXgGPAfsBigKyAm8CKwIXAiQCOAI8AgICngGMAeIBIgIBApcBMAELARUB
+LAFLAWEBZAFHAf0AxADYABoBYgHFATICVwJFAl0CkQKNAlsCLQLhAX8BcAGhAXUB8wC1ALsAuQDB
+ANMA3wDuAPEADwE/ARQBpQB4AKkA8AD8ANQA1wDtAL4AdAApANz/nv+D/8H/OwCMAI8AcwB7AFsA
+6//G//7/RwCxABUBIQHmAMIAyAC+AK8AzQDmALkAcwBTAB8Auf+h//j/VwB2AFwASwA3AA0A1/+n
+/7H/0f/6/3EA1wCvAHwAewBUADgAPgBNAHgAeQApAO7/zP9m//r+/P4v/0P/SP8z//3+DP+J/+X/
+sv9o/5z/CQATANP/z/8JACIAHQAiAAMAjf/7/u/+ev/a/6D/Hv/S/tv+/f74/uL+/v45/4X/5f8p
+ACUA5P+l/4L/Xf9Q/2f/fP9k/wf/nf42/oT9xfzG/C79HP0U/Zf99/0J/jX+cv6z/tL+o/6H/pz+
+gv5O/iv+w/0y/Qr9X/2o/Z/9yf1+/kX/sv/t/wUA2f+D/0T/SP9n/zj/yf6b/sf+2/6y/ob+a/5v
+/pn+0P4B/yH/Hv/w/rT+gf47/uj9u/3F/fL9If4y/lj+vP4c/1r/if+i/7//AAALAJH/D//5/hz/
+Gf/e/qP+jv6e/tT+Mv9Y//j+sP4O/33/hP9u/3n/pv++/8b/vv9Z/9P+nP6O/m3+Y/6X/vT+Yv+u
+/87/9f8fACIAGAAnACQAEAAEAOD/0v/o/8L/hf9b/y3/L/9H/2D/qf/v/yMAWwBqAD8AIwAvAAYA
+y//O/63/aP+W/wAACwDr/+P/uv+l//v/RAAbANn/+f9gAJcAfQAxAOr/1/8AAFAAmACWACoA9f9h
+ANQAzwCHAFgAZQCNAMAA2gCkAGUAjAAHATQB8QDTAPwANAFwAYcBbAFlAagBFwI4AvkBtAF2AXQB
+2QE3AhsCtQGLAaoBvgHTAeABswGSAXcBXgGLAZABSgEpAfgAtwDEANsA4ADtAMwAtQD7ACAB2ADG
+ABcBPAE+AY4B2AGJAQwBKQGdAcwBsQGGAXgBhAG2AQwCOwIhAt0BuwHgAQsCPAJnAhkClAGGAdsB
+AALFAWsBOgFhAaABhAEwARYBNQFsAa4B1wHPAY4BTwFIAUoBJwHjAI4AUwAcAP//bwDkAKgAXwBc
+AEwAaQC3AO0AJAFOAVIBYQFoARkBmwBtAFoA9v+b/3T/TP86/0r/d//Q/1kA6QD/AKgAhQBlAPf/
+kf9f/1n/dv93/0b/D//d/sD+1v4L/yr/HP8S/1z/3P84AHEAigBTAPv/1//K/43/Nv8g/z7/av+8
+/wUAtf/o/pv+4v7Z/qD+4/4u//7+6/4y/yT/oP47/hf+BP4N/h3+Ov5g/kH+5/3D/SP+lP7T/lH/
+1f8EAEgAuADLAEcAnf8z//X+w/61/rT+lf6H/rj+EP9a/3z/d/9g/3D/mP+Z/4D/RP/y/rj+ev5C
+/i7+FP4N/lf+df4r/if+rP45/0T/Av/u/sH+TP4r/oT+mP5S/hv+Bf5I/rT+2v7M/sT+4/4z/5j/
+sv8+/7z+nf6M/m3+cP5H/tL9nv3I/c/9xf3z/Sz+d/7E/tT+9P5G/17/Rf9V/3L/Zv9A/xr/3f6Z
+/oT+kv6w/uf+D/8L//3+C/8r/yz/Gf86/33/vP/G/2v/+f7H/sT+8P5O/6b/vv99/0z/m//M/2f/
+B//2/v/+Nf90/2f/Tf9t/5r/kf9I/xD/VP/X/y8AiQDeANcAmgChAPAA8QByAPz/2//1/0EAjQCD
+ADUA5P+1/8P/3P/L/7n/GAC7ANsAewA5AE8AagAnANb/FwDHAFYBsQHqAewBzAG+Ac4B0QGEASoB
+HgE0AREBoAA0ABEAEwAKAD4AugAGATUBegGqAe8BQwIlAqEBZQGWAdYB0AFbAcAAdgB8AGcANwBH
+AHgA4wCwAVACZAIzAv4B2AHjAUAC6AKwAy4EqgPnAcD/dP6C/qH/EAJsBZEGhgNu/8j+fgIeCEgM
+jgzjCQsIEQggBywDb/1Q+BD1PPTy9ZD5+P24AeADpgSNBQwIpwvcDvYPkw15CFMCOfvP8n7qd+UP
+5ubr1vR+/j0HUw5YE0IWuxadE9wMoAT3/GX2GvHf7UHt2u4a8lf2lPqt/k8DlghnDSsQqRAzEFcP
+5AwBCKQBYvs09qHy6/Ac8QTzSvaN+gz/VANvBw4L4w3AD04QKw8sDMIHlQIc/QT4LvQj8gDybPNh
+9gn7fgCqBUkKCg4+EHAQ1Q4ZDLMIiATj/9T7/Pgj9yf2P/Zd9wr5Kfsc/ooBhgSoBgQIsgjYCIAI
+ZQdrBX0C5v6m+zP5oPdx9+L4dPt9/moBxgOHBckGAweqBaED3gFJABr/iP7B/UD8z/op+vb50Plq
++j38V/7g/+MAXQHxAKL/xf17+xb57/Yx9QH0dPO48+D0dvbU99H4t/mY+nT7nfzf/Vj+of0j/G76
+z/i093P35fcI+eT6yPwf/jj/egDMARQDIwRwBPAD4gJQAY//5f2A/Lr73vsS/e3+ogDhAdcCjAP4
+A2AE0QT+BLQECgQ3A0IC9wAV/wD9l/v8+s36Cfus+z78xvzE/SX/vABfApwDWASOBDMEjgOfAkMB
+/f88/8P+dv6g/kT/y/+7/5r/BQCWAPIAbQEbArUCJgMmA24CZgGZAAUAjf9H//7+ef4E/vj9Cf6v
+/RH9qvya/PH8sf2A/gH/Wf/O/xcADgD3/+7/qP/K/tf9av04/Sr9kP0B/h3+P/5q/nr+yf4i/97+
+Uv4p/k3+ff7Y/kn/cf81//f+D/8t/97+Sf75/Sf+lf4H/7H/swCfAUMC8gJbAwQDlAJ3Al4CNgIG
+At4B9AE8AncChQJPAgQC+gEYAhYC9AHRAcIB3wEgAkcCBQJ/ATcBVAGMAaQB1gEwAmoCrAL+AhwD
+BwOqAu0BUgE6AVIBbQHIAWICywLnAgADBwO9AmUCVQJhAhECcAH8AOEA/wASAR4BVwGeAdAB2QF9
+AdEAXgBPAFsAUQA4AAgAnv8r/xT/Mv9N/4j/7v9eALkA5QD+AF0B1wH5AcwBZwHTAGsAbgCTAI0A
+PgD0/wgAPgBqAKAAzwAWAV8BaAFlAVkBAgGoALoALQGFAZ4B0wEPAvkBzAHWAeUByQGJASkB2ACU
+AEAA8P+M/w//0f4e/4//gP9P/5f/HgC3AFkBtgF9AdYARwAdADcAWQB7AJkAvAABAWwBwQGkAU8B
+JQEoAR8B1ACKAIkAowCZAIcAbgAuANr/h/+b/1EAGAFhAWUBegFpAQUBlgBIANH/Df9K/v79Av6w
+/U79Zv2p/QL+kf7e/un+Pf/H/yIAHADO/6T/rf+H/xv/rP6L/of+Pv4h/lv+M/7+/WD+1v4m/5b/
+7f8AAOH/h/9D/2X/lv90/zv/I/8C/+j+zP56/jL+PP5n/qH+5P7l/rz+0f4Y/yP/wP5Q/jb+MP4M
+/vT9/f0P/hf+Kf5A/lT+Ov76/RH+X/6a/s7+0P6v/p/+pP7B/tT+vv6u/s3+AP8k/z3/W/87/9H+
+of7i/jn/S/9D/1X/Qv8g/yD/9f6e/mb+Qv4y/mr+4f47/2j/if+S/2//Gf/Z/tD+sf56/l/+bP5p
+/jr+LP4//iH+7v3i/QL+W/7K/sb+Wv5E/qL+8P7u/uH++f7i/oz+rP5W/3X/zf5m/sP+aP++/7H/
+rv/m/wcAAADh/5H/SP87/zH/Jf80/yf/D/9O/6//0P+4/4v/hf+1/8r/rv+p/7L/p/+H/2//mf8I
+AH8AwgDEAJwAeACSANoABgEFAeQAzwAAATABLwEVAdUArwDRACsBkgGfAWkBZAGsAQ4CLALTAXcB
+fQF/AT0BEgEPAQQB1QCFAFcAZQBXADIAZQCaAHkAbgCYAMsACgE0AUEBSgFoAakBvAGmAbQBugFp
+AeoApADHAAsBJQFBAXwBnQGyAe0BDgLjAbEBngG4AfIB+gHLAbwB0QGkAV4BWQFhAWYBYQFIAWQB
+kwF1AUUBYwGKAXABVgFIAQwB8QAgAQYBpwBkAAYAmf+d/wkAhgAAAR8BvQCFANAAOgFZAVYBXAEs
+Ae0A2ADCAJ4AmQCoAJcAuAAxAXIBSwEuAU4BcAGAAbABswFZAUcBtAEyAmECBwKCAXUBswG3AYEB
+MQHzAPIAAgH4ANMAqwCxAOgAFQH1AIUAPAB2ALAAegBCAB4Az/+2//P/5P+Y/2T/5/6E/vr+wv8D
+AMH/hf/D/zMARgD//6H/M//h/sf+7/5f/7v/y//B/6r/hv+w/ycAZABZAC4A5P/N/xcASAAhAN//
+rP+p/8//3v+u/27/bf+E/2z/R/8M/47+F/7F/Zz9y/0Z/i/+K/44/kf+OP4o/lT+tf47/8v/5v8/
+/4v+o/7+/tv+iP5e/ob++/5N/zn/s/72/a79Dv50/n7+hv7E/hn/Z/+j/7D/Tf/U/tj+4/5f/tj9
+uf2O/XX9rv3A/an92P0f/j7+dP6t/pf+Qf4C/jT+hP6G/mT+Nv4L/gL+L/56/oj+R/4d/mT+9v5w
+/6H/gv8u/+r+yv62/rz+5P4U/0j/lf/V/9P/vP+i/2j/T/90/5P/sf/a/+7/1/+B/+H+Vf5h/rT+
+p/5b/lX+g/58/n3+2f4k/x3/Bf8W/0//k//n/z8AWwAzAPj/z/+x/4L/bf94/4v/oP+s/8T/9P8+
+AIcAoACiALAAyQDQALUAmABsAFUAhQCsAK0AogBrADYASQBaAE4AdQBrAAQA8/8gAAIA1f/u/xIA
+EQAKABUAFgDo/8f/AgBhAIYAaABmAJoAlwB3AHkAowAPAaQBOwKOAlQC3AGJAXYBowHBAa8BxwEH
+AjECKQLbAVMBAAE9AbsBHQJKAksCSwJDAgsC2QHDAYABDwG8AKoAqgCJAEwAEwApAGAAeQDAAAgB
+BQEaAYUB2QHGAYoBYQE/AQsB0ACfAKUA6QApAV0BbgFBATIBcwGLAWABWwGhAd0BpQE6AQoBCwE7
+AZ0BrgFmATcBFQHtANcA3AAMAWIBkQGdAc0B2gGNAV0BnwH3AfkB1gHVAfQBEAIQAu0BngFcAUoB
+HQHjAPAAFAEEAeYA+AA8AYABZwHwAI0AmgAFATgB5ABhAB4AIwAtAB4A+v/1/yUAZwB/AD8A3f+n
+/5H/dv+a/yUAmwB+ABIAEgBqAGsADwDC/8D/EABMAAAAYP8Y/0n/Qf/r/uL+C/85/4X/s/+8/8j/
+DgB7AIMAGgCR/yv/Gf9O/43/lv+N/6//w//C/+b/AgDn/6n/kP+a/17/Av8H/x7/3P6F/kz+L/5r
+/rT+k/5I/jD+bP6v/rz+2v4K/wf/2f6H/gf+tP20/bL9wP39/T/+cf6L/pD+sv73/ib/Mf8y/xj/
+5/7L/q/+iP6F/pj+pP6x/sb+yv6z/pr+qv7L/qD+YP6S/vf+/P7e/vz+B//Z/sb+0v6u/mX+Nv4k
+/gD+1f0C/mL+df5c/k3+Mf4v/mP+nv7n/iv/Nv9G/37/df8N/+H+/v7Q/mL+Iv4u/mL+jP6d/sv+
+FP8+/2v/vP/2/+f/0f/4//n/rP9m/zv/Kv9k/+T/GADk/8L/uf96/zH/M/9+/8H/1f/x/xgAGQDc
+/3z/QP8i//7+Dv9X/3X/fP/I/8X/EP/C/lb/h//f/m/+ff6g/sH+j/4u/mb+7f4G/wX/S/+c/+P/
+IwAvAAwACgBZAL8A4QARAYcBywGzAXkBWQFQAQYBaQAHACEAUgBHAAIAwv+p/7j/yP+7/8H/0//o
+/z8AsQDyAPsA4ADEAKQAfABgAEIAOACLAOQA0ACbAIcAkQDOAA8B8QCGAIIAEAGIAZkBeAFxAYwB
+mAGCAXEBZAE3ARsBXAHPAdgBVQHjAAABegGlAUUB2wCqALMA2gDQAMIAAQEfAekA4wA0AYsBzQEU
+AlQCZQJcAmoCZAI4AjkCNwLQAXUBiAGVAWMBOAErATUBVwGDAZ4BnwGxAfABJAIPArsBbgFDASIB
+MwGjAfsBqAFBAW4BxgHwAcQBRAH8ADcBmQGfAUkB5gCIADwA/f/A/+f/YQCVAIUAewCHAH8AMgAD
+ABsAFgAiAHcAuQDUAM8AdwAjACsAOwAUAOH/0/8KAHgAtgCAABIA1f/r/x4AKgAAAPD/PACbAMQA
+0QDoABQBXQHIAQsC9gGqARABMwCd/1T/JP8o/xT/2/4i/7///f8DAC0AbwDhAHwBzQGKAccA8v+S
+/3//MP+s/mP+YP5V/lj+h/6p/sn+SP8UAJsApgCHAGAAJwD5/87/dP8E/9/+Bf8m/zr/Hv+3/pH+
+CP+X/7X/ff9A/y7/Zv+9/8f/fv89/1L/mP+U/zv//v4F/wf/5v7W/r7+V/7u/T3+HP94/zX/Hv82
+/zT/Qv9F/zD/NP8h/wL/Av/g/pb+U/5G/m7+eP57/qD+hP4z/h7+Tf6e/gn/T/9J/yP/yf5X/kT+
+kf7T/vH+IP83/xr/Cv/o/of+V/6A/qP+0/4W/wH/lv5J/lT+aP5N/k3+XP5K/kz+Xf5d/m3+g/6Z
+/qv+w/7Y/oj+C/4a/pP+2v7Q/p3+bP6Q/gH/Kv8G/wP/Lv9n/2X/AP/j/mT/zP/l/xwAUQAWAJP/
+bv+p/5r/TP8w/0v/i//f/xEA/P/A/4b/bP+X/9n/7P/0/xEANABjAKkA2gDFAG0AFgAAAO//t/+z
+/wkAYAB2AGMAUwBrAIoAngDEANIArQCYAM4AQAGKAUwB3QDIANcAxACjAGEAJQAcABgAFQA3AD8A
+FgAxAHoAcgBTAIMAnwA7AO//OQClAMAApgCSAH8AewCiANoA9AAEAS8BUQF9AdoBMQJEAhoC5gGj
+AXkBqAGqATwBBwFQAaMBsAGJAVQBLAETASEBSgE8AfsA1ADHANIA/AAGAcgAbwALAL3/DgC1APkA
+8QDCAKgAEwGKAXQBPAEqARgBXwH5AQICbgEvAUgBHAHlAOwA9ADNAJgA0gBGAUoBJQEzAUoBSQE7
+AUMBnwEJAuEBcQF0AcIBwwGLAW4BdgGIAXIBMAEFAQQBJwFmAWsBSQFbAY4BgwEXAaIAWwAhABcA
+bwDUAMUASgD4/zEAiAB0ABoA2f+7/7j/1v8AAP7/sv+P//n/UQAbAOb/MwByADgA7//F/6j/qf/V
+/w0AEwDm/+H/FQA0AAAArf+R/6H/tP/r/1cAfAAvAOz/u/9H/+n+Mv+w/8//zf/h//L/IgCgAM8A
+JwBL/xD/Pv9S/1H/Rv9D/1X/ff+2/9b/CwB4AJMAMgATAEIACQCN/zj/GP9R/63/2P/M/4//bv+l
+/6j/8/47/lb+4v5H/3v/ev8d/5H+b/7U/v/+l/4g/gH+Lv5o/pb+z/4O/xb/0v6j/qL+nv6a/mb+
+Kf5R/sf+Lf9X/27/af8n/+L+1P7n/gf/L/9P/2n/oP/I/5b/U/87/yj/CP8A/y7/KP/Q/tj+Yv+c
+/z7/yv6Q/nn+TP4i/lT+xf4g/5T/BQC5/wP/8v5E/+z+GP7I/e799v0n/sb+LP8e/zf/eP9+/23/
+cP9g/0z/dv+3/6f/Pv/s/uH+3v7f/vD++v4t/4r/xf/H/8b/o/85//7+IP8k/8P+PP7R/bP9//2O
+/ib/gv+h/77/s/9F/7b+af6G/tL+6/7z/if/Lf/0/gz/Yv+S/67/uv+5//X/QgAYAJn/X/93/6D/
+1//7/9H/hv+h/xkAXwBdAFcAjQD0APwAowBpAEwAIADW/3j/Nf8h/zP/QP8l/xb/Yv/4/3gAsACu
+AKgAugDvAEQBdwFcAfIAZAA0AHYAfwAdAPD/QACbALoA3AAuAWMBOgEWATcBJgHzAO0AjgDL/0b/
+N/+s/0MAQQAAAAwAIQAmACwATwCbAKkAkgCiAKQAlgClALsAvwDQAPcAEgEmATUBQwGCAfgBVwJ+
+AowCZgIZAv4BHgJIAksCMAIeAhkCEwLfAV8BAgEXAVABgwF7ARAB1QAFARwBBAEMARwB3ACnAOsA
+FAHQAKYAkQBhAGUAkACsAL0AxgD4AFABUgH/AOsA8QCyANQAhAHMAXIBDgEAASoBRAE1AewAowC/
+ADkBigFxASAB4gAYAYYBigFNAUUBbwGSAYUBTgETAfEA9QDnALwAoQBqACcATwC5ANAAlwCKAMwA
+DwFBAVwBJwHVAKIAcgBxALIArgBVABgA4/+4/97/DgD//9n/2f8gAHMATgD8/xAAVABWACAA6P+I
+/wf/xf7m/kv/lv+H/1P/Tf+X/9X/tf9//4P/uP/z/yIAHQDn/7P/e/9X/3b/o/+S/1L/Lv9l/8n/
+4/+z/6T/0P/m/7L/jf/K/wYAvv8a/6z+wP4k/2D/Ov/L/mD+XP6I/k/+2v2k/av9+P2H/tf+xP69
+/vL+Q/+F/4r/Qv/w/t7+9v7l/oT+5P1r/Xb95P1A/lj+jP77/ln/dP9Z/0r/Z/9Y//7+1f4P/1r/
+Xv8b/9v+vf6i/pf+xv4M/yj/O/9o/2P/P/9q/4b/GP+b/oL+lv5y/kD+V/5V/kr+o/7W/o/+jv77
+/iv/Ev/N/kz+Bv4q/mH+tf4S/yT/Mv8p/6z+Z/7c/kb/E//R/gz/mf8KADoAcQDEABgBWQFRASMB
+GQEZAfgAqAAJAFf/B//g/n/+Vf6U/s3+Ef+C/+f/LwBUAEgAFgDh/+b/KwBIABEAv/+N/5z/p/+M
+/5v/AACnACcBQQFAASgB2ACGAHcAZAAAAMn/FABfAIUApACJAE0AIgACAAAAMgCIAOkALQEkAesA
+rwB6AA4AZf8V/wz/tP5U/m7+5P5k/8n/9v8fAKwATQGYAdcBOQKbAusC5gJrAt0BgAFUAScBywCA
+AHIAcACAAK8AAAFyAc8BBgIYAikCIwLPAYwBigGUAY8BYAEFAcYA6wAUAckAcwB1AH4AlQDbAOgA
+yADZAN4AzADGAIUASACAAPEALAEJAdoA0gDWABsBoQH7ATMCYgJwAnMCOAKoAfgAhwDCACQBIgEa
+AVsBnwFpAfkA1gC4AJ4A4AA1AYEB1gHsAc0B2wEDAucBeQERAQEBKQEaAaQAIwAGAEkAXgAOANL/
+mP8q/xT/hf/c/ycAoQC5ALkAMAGnAbsBgwETAb8ArQBiALn/S/8s/9r+nf7s/nn/wf/l/1YA2wAE
+AdgApQCEAGsAPgDd/2z/B/+b/l7+Vv4t/iz+v/5+/wcAYwDBABwBSQFBAQ8B8wDnALYAbQAxABEA
+7P+B/wj/Dv99/9X/+/8OAP3/5P8YAEgACwC0/5v/nv9u//H+Tv7Q/aH9ov3D/e396v3I/fD9Yv6j
+/sf+1f5e/q/9gv3z/Yb+uv6I/k3+Tf5//rH+4P4v/23/f/+Q/6n/nP8//7b+XP5a/lX++v2i/Yv9
+l/3g/S3+Vf6C/rb+3/7j/uH+GP9l/2b/E/+k/ir+uP2L/aX9wv3F/eT9Pv5M/t/9pf2u/bj9B/5u
+/rD+4/7V/pz+m/6j/mH+FP79/RX+Wv6g/qv+av4M/hH+kP7Q/o7+df7X/k3/l/+w/6n/u/+g/yb/
+6/4M/zT/eP+p/23/Hv8h/yz//v7D/r3+x/6d/nf+pv71/hn/K/88/zL/KP9F/2v/av87/wT/0v7X
+/kz/gv8t/xP/K/8C/wP/R/9h/5H/5P8UAF8AmQCHAK8A+wDiAJAAWwA6APz/w//m/w8A1/+e/+H/
+PgBcAIMAsQDVAAEBAQHeANsA+wAWARABCQH9AAABTwGCAUwBMgFbAXUBmAHgAQcC+QHqAfUBBgL3
+AdoB4wEEAgkC1QFbAdYAtwDjAKYABgAAALkARAF0AY0BXQEeATEBXgGDAbAB1wHiAcABegEvAQYB
+7gCxAG0AWABTAFMAlwAzAb8B/AEcAkECUwJDAhIC1wG1AaIBjwGUAbIBtAGHAY8B4gERAikCVgJp
+AlYCPQIKArQBggF0AXoBvwENAi8CIALCAUUBBwEXASYBGQEsAUIBWwG3AeIBZAHJAJAAigCwAOwA
+AQHpAK4AxQBIAVEBpwBUANYARQEaAQYBQQFDAR0BUQGtAcoBygH6AUwCeAJQAtMBTgH8ANYA0gCZ
+AFEAlQAJAREB2gCYACkAoP9+/+D/KQAPAOL/+v9NAKkA0ACKADwAhgAJARUB9QABASEBTAFuAVkB
+ogCK/0L/xv/R/1v/Qf9//7b/yv+//5P/Lf/b/vD+Fv/e/sf+cP9EAJsAkwBgAP//UP+D/hP+Av4b
+/l/+f/50/rT+C/8M//D+Bf9P/6r/2//M/97/JwACAIL/gv+//4j/Nv8c/wn/1/5o/gT+Jv58/pD+
+sP5J/xIAJwCd/zP/B//r/pb+Lf5A/sb+Mf9s/6P/nv87/8D+cf6p/j//fP9l/yv/8/4V///+O/6I
+/Xb91v1i/t7+E/8H/w7/E//p/sv+vv6y/rX+uv7a/iD/Hf+Q/v/91f3p/fb91P3G/RL+Vv5A/vL9
+rv2q/dj9LP5//on+jP7s/lz/bP9O/1H/Xf9o/4j/ev8V/4j+If4Z/jb+Tf4k/qL9YP24/RL+EP4g
+/l3+1f6g/yQACgC5/37/Vf83/wf/s/6V/pn+WP4g/kL+i/6k/rL+Kv/3/5wAwgDCAP0AFQHlANgA
+BQHrAFkA2P+2/6H/av9E/1n/hP+Y/7r/BwApABEAJwBkAHcAZwBGABsACgAeADoARABKAG4AoQC/
+AK4AawBvAPIAHgG6AKgA9QAaAQMBqgBmAJYAsQB0AGIAaQAnAPr/JwBbAGQATQAkABIAMgBkAIwA
+ngC0AAcBOAHDACIA7P8DACoAMgADAPH/WwDpABkBEgEPAUQBtwHgAdsB/QEWAvgBtwGJAU4B/gDl
+APcA7wDjAAkBGAHrANgA5QD1ACUBeAGPAUMBDAHtAJkAlQCwACMAr/8KAKwAEQEKAbwAnQC4ALQA
+iwCYAK8AgQCaACUBmAGTATwBMgFyAakB4QHpAcQBzgHrAcABbgFCAUoBWgFfAXcBkAGkAcQB0gHD
+AeMBPgJ4AnUCVgIjAsEBWgFIAU8BQgFTAWYBXwE+ASYBYgGHASYB1ADjAM8AfQBUAEYAPgBMAFIA
+UgBVAGsAmgCoAIUArgApAVgBLgHwAKEARwD8/+v/5P+b/1j/g//r/0wAngCYAEgAOwBiAFQAIgD6
+/8v/nv+S/8L/AAD1/7z/u//1/xwAQgBZAA8ArP+G/3b/hv/T/w8AAADe/+P/CAAvAAwAtv+y/wAA
+QwBcACQAi//3/sj+wf6U/mz+O/4S/mf+8v5E/3v/g/9g/2H/Xv8Z/+z+Bv/+/qn+Yv5M/hT+i/02
+/XT9z/0G/kT+m/7t/hz/K/9E/4P/q/+j/5P/cP9P/17/TP/q/qj+sv7Z/gH/E/8Z/y3/YP+Y/53/
+af8q/wz/+v7k/sn+j/55/rn+0/6J/uH96/yV/G/9Xv61/ur+Cf/8/g3/5f5L/tf9d/0g/Uz9nf2y
+/eP9Uv6M/mL+T/6r/hX/Rf+S////NABfAI8AdQBAAAkAi/8h/1T/3P8hABYA0f+S/6b/rf9W/+v+
+sP6+/vH+2f54/kL+N/4d/h7+cv4C/3b/of+t/6r/nP+c/5f/c/9P/2D/kf9c/7H+W/6V/s/+1v7w
+/h//Qf+I/9n/9v/6/9f/r//R/yUAIwDk/wAAYQCxAMIAhAAdALH/OP/C/nX+Uf5c/rj+RP+y/9r/
+sf9o/y//Gv9x/+z/8v/k/z0AhwBTABYAMwA8AB8ANgA9ADgAkAARAWABcAFuAXMBZgE6AfIAsACa
+AK4A8ABcAYEBKQHhAAgBbwHJAdkBmwF7AWcB3AA2AMn/Uv89/7T/CQA1AJUA5QDFAHgAjwDiAPIA
+9wBPAbwB1gHTAQACLgIxAvkBtAG5AesBCgIiAjcC+wF9AWEBiQE8AaMATgBSAJsACAGHAe4BDQL1
+AcoB4AEWAvEBtwG2AZIBQQESAdIAcwBsAKQAxwDXALcAoQDxAEoBMwHrAOoALAGJAckBvwHDAeIB
++wEiAgkClwFIATEBHAEVASkBUAFRAesAfgCFAKgAdgAeABQAcwDdAPAAxQCkAHoALQAFAB4AOgBP
+AIkA5QApAU8BVwERAeIADQEnARsB5ACKAIkAtgCqAKUAwwDWAOgAIwFZAWMBWwEVAZ4AqAAHAeoA
+TQB//9f+vf4R/17/af8//yv/af+//+j/GwBEAAoAoP9I/yH/Jf8I/9v+5v4L/yP/DP+r/lT+RP5H
+/nD+4/5e/5//wv/x/wQA+/8MADEAHQDQ/4r/Yv9K/yT/5/6u/pH+rP7O/sv+rv6M/rr+Mf9M//P+
+sP7Q/iL/Pf8c/wj/CP8q/0//Ev+l/nf+Yv5s/rv+4f7d/g3/Nf8i//v+v/6J/pL+1v4e/z//Iv/f
+/rP+s/7r/kD/dP+F/47/pv+v/3H/CP/A/uL+LP83/zH/M/8c//P+2/7Z/tf+8P41/3P/lv+v/43/
+Of8Y/zD/J//1/tf+5P4L/yX/Cv/Z/sn+yv69/qf+tv4D/zX/IP///tP+pP6T/n/+Zf5o/m/+iv7Y
+/tj+Wv4J/iP+Sf5H/lP+kv7J/vr+Xv+u/4//U/9n/6H/5v8mAAkAsv+L/5P/mP9N//H+D/9X/2r/
+aP96/6v/0v/S/6j/h/+Q/5n/r//j/xQAIADe/5D/m//E/9H/4/8MAEoAhwDJABUBBgFbAMj/5P8f
+AAcADQBCAFIAYgCKALAAzgC1AIYAyQAtAQMBpwCIAGcAUgCdAO8A6wDFALEAlQBQAEEAmQDsAAAB
+DwExAUMBIgHRAJMAmQDcAD4BgAFvATwBGQEIAQUBGQFQAakBFgJIAh0C3QGWARIBkwCSAAMBRgEb
+AQIBRwGzAfcBwwEHAaYACgEgAaYAagBSABoAEgASAO//4P++/4H/hP/B/zUADAGzAaIBRAH/AMgA
+fwAxAEMAsAAAAScBUgFlAVABOgEoATYBeAGaAWoBMgE7AXoBfwEmAdYA9QBfAYkBYwEzASMBVQGW
+AZgBUAHaAGcAHgAfAF8AhgB6AKAACgEUAb0AsQDcAMsA0ABqAf4B3AFuAQQBlAB9AMQA1gCuAJsA
+nACQAFMACQDL/5H/sf8TAB8A3f/J/9j/5f8XAB4Asf96/5P/Xv8q/zL/Rf+r/zAASQAcAPv/0P/B
+/xcAawBRAB0AEQAaAEYAhQCEAGEAVgBKAEMAUQBVABsAs/97/4j/oP+3/8f/mP8+/x3/Hf/3/u3+
+O/9p/0T/Mv8e/wD/HP8k/xv/Zv+z/77/ov9a/0X/uP8MAMb/U//8/q3+b/5b/oX+9P50/8H/7v8Q
+AAoA6v+V//b+hv7E/kv/aP8z/xT/LP9L/yD/wP6L/oH+hf6s/gD/a/+L/0j/TP/X/zoA+/9S/8D+
+if6i/pX+Uf5r/rv+p/5p/oL+0P7d/sX+Fv+q/y8AhABTAOT/t/+F/x7/5/7X/qf+av4P/q39w/0a
+/iP+Sf7g/mv/p/+r/4n/Vf8U//H+7f7a/rv+o/67/vT+8f6h/nX+rf7y/ub+0v4Q/1v/if/E/wsA
+SAB6AJ0AfwBLAD4AEgDP/7X/qf+f/57/lP+T/6z/sv+A/0f/bv+0/5L/Yf9k/1H/W/+///n/z/+g
+/3L/N/8s/1H/Xv9S/1H/X/9//77/BwAkAPP/pv+F/4P/q//7/wgA1P++/+T/PwCQAIkAYgBvAJoA
+pwCAAC0Axv+Y/8T//v8LAA8AIgAsAEQAnwAQATMBDAHUALUA2AD0AKsAVgBhAI0AkACNAIwASwAV
+AHcADQFDATkB9QCOAIEA0wAsAVsBZAFdAUQBGwHiAM8A8wD9AAYBYwG7AYUBBwHPAPcAPwFpAWwB
+RAEmAV4BuAG8AYwBmQHFAdoB2wG0AakB2QHFAWMBHQEcAUgBcwGVAaMBjQF9AXQBawFcATgBIwE4
+AU4BRQFAAVgBLgG1AJsA1gChAEUAMwAxAFAAiwCiAJgAgAB9AH0ALQDU/xQAlgCvAJcAlgCBAGAA
+WwBbAEMAQwCRAP0AMAEqARoB+ADUAAEBVwGBAYABRAHnAMYA6wDoAKMAbABpAIcAuQDlAP0ABQHh
+ALEAuADAALQAyADNAHUALABaAIkAYwA2ABYAzv+r/+v/GwDf/1j/Nf/A/0sAWgBEADcAJQBIAFsA
+/v+Z/2f/Qf9f/4j/I/+j/pn+rv65/t3+Df8M/+H+B/9k/4D/dv+X/9T/yP9l/yn/O/9L/0X/Uf+G
+/7//xv+e/1j/F//7/v7+LP9+/9D/QACoALYAhgAVAJL/UP8G/4/+Mf4y/oj+Af9d/2//gv91/xz/
+PP+a/2L/K/84/9r+Uv4L/rD9Z/2N/RD+5v6A/2b/Zf///4sAkwBFAPz/hv+o/hz+R/58/n3+ef5c
+/l3+uP4W/xD/2f7l/h7/Mv8G/9P+yv6i/jz+BP41/lz+Tf45/hb+Kf6f/hb/Lv/3/rv+q/7v/m7/
+u/+W/1n/df+5/8H/kf9o/1D/RP+Y/0cAcADj/4f/ff9i/1P/RP8U/9r+v/79/mL/ZP/g/k/+Kv4s
+/jH+X/5v/lT+YP6k/uj+0f5p/j3+hv7r/k//4v9XAEwA+//F/7j/u/+z/4P/Qv8//2r/ef9u/4r/
+AgBuAHcAcwCTAKUAZAAdAFUA0AATAfYAhAAAALz/sf+C/2n/yv/i/13/Xv8sAJ0ALABo/x//uv9b
+AEgAAAD2/zoAvwA0AUgBJAEYAQUBmAAEAOf/TwDCAAcBRwFmAV0BbAGOAZIBWwEJAd4A2ADAAKEA
+pACqAJ0AtwDsAPAA3wDuABcBKQEmAVcBmwGAASwBAgHzAP4A/QDNANgAQwGbAb0B4wHvAewB5gGb
+AVABOgE6AXwB0AGhATEBAgGqABwAGgCIAKQAUwAkAH0A+QAIAc4ApgC3APMALwFRAVcBWAFtAZgB
+yQHfAdEBuAGzAb8BjwEvASUBggG9AZMBawGEAa0B3gH+AfkB1wGnAbQBCAJRAl8CSwImAuoBrAFl
+AQgBrQB5AGoAZwCbAAABYwGNAS4B9wCNAecBaQEcAVgBdwF/AX8BLQG4AFEACgALAC0AQgBbAGEA
+fQC1AJ4AYQBCABoA5f+2/17/2P51/n3++f5//8T/3f/2/wUA3/+u/3f/+/6s/vX+Wv+c//v/VwBU
+AAoAmf8J/6f+fv56/rX++/4c/wf/xv7D/gv/7P4V/i39ofwB/EH7wvqH+qP6TvtY/ET98/2Z/h//
+RP/q/jT+m/1b/VT9gf3R/Q==
+EOF
+       open FP, "> $filename" or die "Failed to write to $!";
+       print FP $wav;
+       close FP;
+}
diff --git a/test/testcolor.sdlpl b/test/testcolor.sdlpl
new file mode 100644 (file)
index 0000000..e7b644c
--- /dev/null
@@ -0,0 +1,92 @@
+#!/usr/bin/env perl
+#
+# testcolor.pl
+#
+# Copyright (C) 2005 David J. Goehrig <dgoehrig@cpan.org>
+#
+# ------------------------------------------------------------------------------
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+# 
+# This library 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
+# Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+#
+# ------------------------------------------------------------------------------
+#
+# Please feel free to send questions, suggestions or improvements to:
+#
+#      David J. Goehrig
+#      dgoehrig@cpan.org
+#
+
+use SDL;
+use SDL::App;
+use SDL::Event;
+
+use vars qw/ $app /;
+
+print STDERR <<USAGE;
+       Right click on any pixel to get its color values
+       Left click on any pixel to set its value to the last selected
+USAGE
+
+SDL::Init(SDL_INIT_ALL);
+
+$app = new SDL::App -width => 320, -height => 240, -depth => 8;
+
+my %colors = (
+       red => (new SDL::Color -r => 255, -g => 0, -b => 0 ),
+       green => (new SDL::Color -r => 0, -g => 255, -b => 0),
+       blue => (new SDL::Color -r => 0, -g => 0, -b => 255),
+       yellow => (new SDL::Color -r => 255, -g => 255, -b => 0),
+       purple => (new SDL::Color -r => 255, -g => 0, -b => 255),
+       white => (new SDL::Color -r => 255, -g => 255, -b => 255)
+);
+
+
+$x = 0; $y = 0;
+$rect = new SDL::Rect -x => $x, -y => $y, 
+       -w => $app->width / scalar(keys %colors), -h => $app->height();
+
+print "Sorted colors:\n";
+
+for ( sort keys %colors ) {
+       print "$_ " . join (",",$colors{$_}->r(), $colors{$_}->g(), 
+               $colors{$_}->b()) . "\n";
+}
+
+for ( sort keys %colors ) {
+       $rect->x($x);
+       $x += $rect->width();
+       $app->fill($rect,$colors{$_});
+}
+
+$app->sync();
+
+$last = new SDL::Color -r => 128, -g => 128, -b => 128;
+
+$app->sync();
+$app->loop( {
+       SDL_QUIT() => sub { exit(0); },
+       SDL_KEYDOWN() => sub { $app->fullscreen(); },
+       SDL_MOUSEBUTTONDOWN() => sub { 
+               my $e = shift; 
+               if ($e->button == 3) {
+                       $last = $app->pixel($e->button_x(),$e->button_y());
+                       print STDERR "X: ", $e->button_x(), " Y: ", $e->button_y(), 
+                               " R: ", $last->r(), " G: ", $last->g(), 
+                               " B: ", $last->b(), "\n";
+               } else {
+                       $app->pixel($e->button_x(),$e->button_y(),$last);
+               }
+       },
+});
diff --git a/test/testfonttool.sdlpl b/test/testfonttool.sdlpl
new file mode 100644 (file)
index 0000000..1bebd9a
--- /dev/null
@@ -0,0 +1,2168 @@
+#!/usr/bin/env perl
+#
+# testfonttool.pl
+#
+# Copyright (C) 2005 David J. Goehrig <dgoehrig@cpan.org>
+#
+# ------------------------------------------------------------------------------
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+# 
+# This library 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
+# Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+#
+# ------------------------------------------------------------------------------
+#
+# Please feel free to send questions, suggestions or improvements to:
+#
+#      David J. Goehrig
+#      dgoehrig@cpan.org
+#
+
+use strict;
+use SDL;
+use SDL::App;
+use SDL::Event;
+use SDL::Tool::Font;
+use SDL::Color;
+use MIME::Base64 qw(decode_base64);
+
+my (%options,$app,$mode);
+
+$options{-flags} = SDL_SWSURFACE;
+$options{-title} = $0;
+$options{-width}  ||= 800;
+$options{-height} ||= 600;
+$options{-depth} ||= $options{-bpp} || 32;
+
+$app = new SDL::App  %options;
+
+my %ttfonts = (
+       'ttf1.ttf' => 0,
+       'ttf2.ttf' => 0,
+);
+
+my %sfonts = (
+       'sfont1.png' => 0,
+       'sfont2.png' => 0,
+);
+
+my @fonts;
+
+write_fonts();
+
+for ( reverse keys %ttfonts ) {
+       for $mode ( qw/ -normal -bold -italic -underline / ) {
+               if (-e "/tmp/$_") {
+                       print STDERR "Loading $_\n";
+                       $ttfonts{"$_$mode"} = new SDL::Tool::Font 
+                                               $mode => 1,
+                                               -ttfont => "/tmp/$_", 
+                                               -size => 20, 
+                                               -fg => $SDL::Color::black,
+                                               -bg => $SDL::Color::black;
+                       push @fonts,  $ttfonts{"$_$mode"};
+               }
+       }
+}
+
+%ttfonts = reverse %ttfonts;
+
+for ( reverse keys %sfonts) {
+       if (-e "/tmp/$_") {
+               print STDERR "Loading $_\n";
+               $sfonts{$_} = new SDL::Tool::Font -sfont => "/tmp/$_";
+               push @fonts,  $sfonts{$_};
+       }
+}
+
+%sfonts = reverse %sfonts;
+
+sub DrawFonts {
+       $app->fill(0,$SDL::Color::white);
+       my ($x,$y) = @_;
+       for my $font ( @fonts) {
+               $font->print($app,$x,$y,"SDLperl font test. ",
+                       "This is " . ($ttfonts{$font} || $sfonts{$font}));
+               $y += 40;
+       }
+       $app->flip();
+}
+
+DrawFonts(10,10);
+
+$app->loop( {
+       SDL_KEYDOWN() => sub { 
+               my ($event) = @_;
+               $app->warp($options{-width}/2,$options{-height}/2)  if ($event->key_sym() == SDLK_SPACE);
+               $app->fullscreen() if ($event->key_sym() == SDLK_f);
+               exit(0) if ($event->key_sym() == SDLK_ESCAPE);  
+       },
+       SDL_QUIT() => sub { exit(0); }
+} );
+
+
+sub write_fonts() {
+       my $ttf1  = decode_base64 <<EOF;
+AAEAAAAQAEAABADAT1MvMpkqgWkAAEjUAAAATlBDTFQPFzzAAABJJAAAADZjbWFw7I1UDAAARDQA
+AAJkY3Z0IBJ0FOEAAEhQAAAAgmZwZ22YXNyiAAAEfAAAAGRnbHlmem5l1QAABdwAADuaaGRteLVY
+hLMAAElcAAAHCGhlYWTIUZb+AAABDAAAADZoaGVhAnQFHQAAAUQAAAAkaG10eAWdzysAAEaYAAAB
+uGtlcm4jFChUAABQZAAAA8Zsb2NhAAw+7gAAQXgAAAG8bWF4cAGuAQ8AAAFoAAAAIG5hbWXdG2uj
+AAABiAAAAvRwb3N0DSMNEQAAQzQAAAD+cHJlcLVFFbAAAATgAAAA+wABAAAAAQAAPgO1AV8PPPUA
+AAPoAAAAADG0K/8AAAAAMbQr//9d/tcCrAMUAAAAAwACAAEAAAAAAAEAAAMU/tcAAAMs/10AAAKs
+AAEAAAAAAAAAAAAAAAAAAABuAAEAAABuAEkABQAAAAAAAgAIAEAACgAAAIkBIQABAAEAAAAVAQIA
+AAAAAAAAAAB0ADoAAAAAAAAAAQAMALQAAAAAAAAAAgAeAM8AAAAAAAAAAwA2AQgAAAAAAAAABAAs
+AVQAAAAAAAAABQAgAZAAAAAAAAAABgAsAcYAAQAAAAAAAAA6AAAAAQAAAAAAAQAGAK4AAQAAAAAA
+AgAPAMAAAQAAAAAAAwAbAO0AAQAAAAAABAAWAT4AAQAAAAAABQAQAYAAAQAAAAAABgAWAbAAAwAB
+BAkAAAB0ADoAAwABBAkAAQAMALQAAwABBAkAAgAeAM8AAwABBAkAAwA2AQgAAwABBAkABAAsAVQA
+AwABBAkABQAgAZAAAwABBAkABgAsAcYgRnJlZXdhcmUgdHlwZWZhY2UgYnkgUmF5IExhcmFiaWUg
+MTk5Ni4gRGlzdHJpYnV0ZSBmcmVlbHkuACAARgByAGUAZQB3AGEAcgBlACAAdAB5AHAAZQBmAGEA
+YwBlACAAYgB5ACAAUgBhAHkAIABMAGEAcgBhAGIAaQBlACAAMQA5ADkANgAuACAARABpAHMAdABy
+AGkAYgB1AHQAZQAgAGYAcgBlAGUAbAB5AC5BaXJDdXQAQQBpAHIAQwB1AHRPbmVIdW5kZWRhbmRP
+bmUATwBuAGUASAB1AG4AZABlAGQAYQBuAGQATwBuAGVMQVJBOkFpckN1dCBPbmVIdW5kZWRhbmRP
+bmUATABBAFIAQQA6AEEAaQByAEMAdQB0ACAATwBuAGUASAB1AG4AZABlAGQAYQBuAGQATwBuAGVB
+aXJDdXQgT25lSHVuZGVkYW5kT25lAEEAaQByAEMAdQB0ACAATwBuAGUASAB1AG4AZABlAGQAYQBu
+AGQATwBuAGUxLjMgSnVuZSA0ICAxOTk2ADEALgAzACAASgB1AG4AZQAgADQAIAAgADEAOQA5ADZB
+aXJDdXQtT25lSHVuZGVkYW5kT25lAEEAaQByAEMAdQB0AC0ATwBuAGUASAB1AG4AZABlAGQAYQBu
+AGQATwBuAGVABQUEAwIALHZFILADJUUjYWgYI2hgRC0sRSCwAyVFI2FoI2hgRC0sICC4/8A4ErFA
+ATY4LSwgILBAOBKwATa4/8A4LSwBsEZ2IEdoGCNGYWggWCCwAyUjOLACJRKwATZlOFktQA4oKCcn
+EBADAwAAExNFAI24Af+FdkVoRBizAQBGACuzAgBGACuzBANGACuzBQBGACuzBgBGACuzBxBGACuz
+CANGACuzCQBGACuzCgBGACuzCxBGACuzDBNGACuzDQNGACuzDhBGACuzDxBGACuzERBGACuzEgNG
+ACuzFBNGACuzFRNGACuzFgNGACuzFxBGACuzGBNGACuzGQNGACuzGgNGACuzGxBGACuzHBNGACuz
+HQNGACuzHhNGACuzHxNGACuzIBNGACuzIQNGACuzIhBGACuzIxNGACuzJANGACuzJRNGACuzJhNG
+ACtFaERFaERFaERFaERFaEQAAAIAHwAAAdUDFAADAAcAPUAbBwQoAAYFKAEFBCcDAgcGJwEAAgEJ
+AwAQAQBGdi83GAA/PD88AS88/TwvPP08ABD9PBD9PDEwsggABSszESERJxEhER8Bth/+iAMU/Owf
+Atb9KgACAAr/7AB5AjkABwAVADlAGBMCAQgJCCgPDAADJwECJwEGAhAPEQETRnYvNxgAPzw/AS/9
+EP0v1gAQ/TwQ1jwBLjEwshYTBSsTAyMDPgEzMgMzMhYVFAYrASImNTQ2aRMpEg0pAxUsCRUeHhUJ
+EyAeAjb+VAGsAQL+GR4VFR4eFRYdAAACAAgBbQFbAlsAAwAHAC9AFQQnBQEnAAUEAQMABgcGAwMC
+HQEARnYvNxgAPxc8Pxc8AS/9L/0AMTCyCAAFKxMzByM3MwcjCIIhP6+CIj0CW+7u7gACAAb//QFx
+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
+AycCAQwHEQAFBgUnCAcREAEHBgMDAiYBDEZ2LzcYAD8XPD88AS88/TwQ3TwQ3TEvPP08ABD9Fzwx
+MLISDAUrASMRIxEjESMRJicmNTQ3NjsBASohIj8iOCUpIy9ShgHw/WoClv1qAWAKLDJMNDBAAAAC
+ADH/JwGLAcoACwA2AEVAIBwcGwM0KDcDKAklKBAGJwAiJxMwJwwpJwwJCBAVARNGdi83GAA/PwEv
+/RD9L/0v/QAQ/RD9EP0Q1jwBLjEwsjcTBSsBFAYjIiY1NDYzMhYTFAcGIyImNTQ3Nj8BPgE3MxQP
+AQ4BFRQWMzI3NjU0JicmJyY1NDc2MzIWAR4jFhUlIxcVJG0zLUFUZRgJLB4aIQQSIxISGDc0Ihsh
+AwgMDAQcCwcWFwGQGCEjFhcjIv4LRCYiVUUsKxA7JiNMKElQKSpTIDVMDxIeBw8JDg0IChoJAyQA
+//8AAAAAAAAAZAAAAGQAAABkAAAAZAAAAOgAAAE8AAACwAAAA5YAAASkAAAFeAAABa4AAAY8AAAG
+ugAAB4IAAAf4AAAILAAACGQAAAiyAAAI8gAACYoAAAnEAAAKSgAACvgAAAt4AAAMGAAADNQAAA0y
+AAAODgAADsYAAA9QAAAP1gAAEEQAABCgAAARDgAAEc4AABKUAAATGgAAE+AAABSCAAAVLgAAFa4A
+ABYeAAAWyAAAF0AAABd6AAAX6AAAGIAAABjMAAAZfAAAGfQAABp6AAAbAgAAG5wAABxKAAAdDgAA
+HW4AAB3iAAAeNgAAHtQAAB+AAAAf6gAAIGgAACCsAAAg7AAAIS4AACFsAAAhvAAAIfwAACKyAAAj
+SgAAI7IAACROAAAk4gAAJVwAACYeAAAmsAAAJw4AACeSAAAoFAAAKE4AACkaAAAppAAAKhwAACqu
+AAArQgAAK7QAACyCAAAtGAAALZgAAC3qAAAuiAAAL0IAAC+0AAAwHgAAMOgAADEiAAAx0AAAMmwA
+ADL0AAAzfAAANHwAADV6AAA1sgAANyoAADcqAAA3rAAAOMgAADosAAA6tAAAO5oAAgAAAAAAAP97
+ABQAAAAAAAAAAAAAAAAAAAAAAAAAAABuAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8A
+EAARABIAEwAUABUAFgAXABgAGQAaABsAHAAdAB4AHwAgACEAIgAjACQAJQAmACcAKAApACoAKwAs
+AC0ALgAvADAAMQAyADMANAA1ADYANwA4ADkAOgA7ADwAPQA+AD8AQABBAEIAQwBEAEUARgBHAEgA
+SQBKAEsATABNAE4ATwBQAFEAUgBTAFQAVQBWAFcAWABZAFoAWwBcAF0AXgBfAGAAYQC2ALcAtAC1
+ALMAjACsAKMAiwCKAIgAogAAAAAAAwAAAAAAAAEkAAEAAAAAABwAAwABAAABJAAAAQYAAAEAAAAA
+AAAAAQMAAAACAAAAAAAAAAAAAAAAAAAAAQAAAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8g
+ISIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZ
+WltcXV5fYGEAAAAAAAAAAAAAAAAAAAAAAABiY2RlAABmAGcAAAAAAABoaQAAAAAAAABqAAAAAGsA
+AAAAAAAAbAAAAAAAAAAAbQAAAAAAAAAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAUAAAAAWABAAAwAGAH4AoQCpAK4AtgC/IBQgGSAd
+ISL//wAAACAAoACpAK4AtgC/IBQgGCAcISL//wAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAFgDSANQA
+1ADUANQA1ADUANYA2AAAAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8AEAARABIAEwAUABUAFgAX
+ABgAGQAaABsAHAAdAB4AHwAgACEAIgAjACQAJQAmACcAKAApACoAKwAsAC0ALgAvADAAMQAyADMA
+NAA1ADYANwA4ADkAOgA7ADwAPQA+AD8AQABBAEIAQwBEAEUARgBHAEgASQBKAEsATABNAE4ATwBQ
+AFEAUgBTAFQAVQBWAFcAWABZAFoAWwBcAF0AXgBfAGAAYQBoAGkAagBrAGwAbQBmAGIAYwBkAGUA
+ZwAAAfQAHwAAAAACDAAAAgwAAADtAAoB1wAIAfAABgIOAAkCfQAIAh8ABwEEAAoBKwAMASsADgHP
+AAkBogAKAV4AEgHXAA0BGAAUAfgADwH+AA4AtAAQAi0AAgJGAAwBywARAi0AAwIoABECAgAPAgIA
+DwIzAAIBFAAUAWAADQJcAA4CRAANAlYAEAHnABEB7QARAn0AEQIpABICJwASAikAEQIaABICDgAO
+AlYADgHvABMAsgAQAf4ACgIAABMB8gARAloADwIbABECdwAMAfgADgJ9AAwCJwASAhIADgJSABAC
+GgAPAlAAAwJaAAICfwARAhgADAIdABABGAAQAfAACAEQAAsB9gASArz/8wEUAA4CGAAVAkYAEQIx
+AA8CTAASAlwAEwHuABACNwARAfQAEQDMABABFP9dAcIAFAC+ABUCXgATAfYAEwJOAAwCQwARAkMA
+DgF+ABQCAAAPAdD//QHvAA8CDgAFAjcAAQJkAAUCDwAFAfoADQElAAwAtAAQASEADAH+AAsA2wAM
+ANsABQGQAAwBkAAHAvgAMQMsAA4AoAAAAbEAbQLcACkC3AAoAc4AAAIgADECaAIUAj4BsQF9AnsC
+UAAAAcoCvgKUAJP/FwE4AHYApQAA//EBef+E/23/JwGOACX+7gD9AfwAwP9LAWj/OP+d/78A2wCD
+/tcA6v+v/1oAKQApAKcAXwApAIQA0QCSALQA8gB2AIIAZwDkAHAAhwDAAE8ARABfAJkAsQA4ABcA
+ewApAAAAAAHwASwABQABArwCigAAAI8CvAKKAAABxQAyAQMAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAQWx0cwBAACAhIgMUANQAAAMUASkAAAABAAAAAAAAAgwBfQAAbdQCEgAAQWlyQ3V0ANyP
+K9cr65UIAgAAAAAAAAAAQWlyUjAwAAABAAAAAAAAEAAAAHAJBwUABQUCBAQFBgUCAwMEBAMEAwUF
+AgUFBAUFBQUFAgMFBQUEBAYFBQUFBQUEAgUFBAUFBgUGBQUFBQUFBgUFAwQCBQYCBQUFBQUEBQUC
+AgQCBQUFBQUDBQQEBQUGBQUDAgMFAgIEBAcHAQQHBwQFCggFAAUFAgUFBQYFAwMDBQQEBQMFBQIG
+BgUGBgUFBgMEBgYGBQUGBgYGBQUGBQIFBQUGBQYFBgYFBgUGBgYFBQMFAwUHAwUGBgYGBQYFAgMF
+AgYFBgYGBAUFBQUGBgUFAwIDBQICBAQICAIEBwcFBQsJBgAGBgMFBQYHBgMDAwUFBAUDBgYCBgYF
+BgYGBgYDBAcGBwUFBwYGBgYGBwUCBgYFBwYHBgcGBgcGBwcHBgYDBQMGCAMGBgYGBwUGBgIDBQIH
+BgYGBgQGBQUGBgcGBgMCAwYCAgQECAkCBQgIBQYMCgYABgYDBgYGCAcDBAQGBQQGAwYGAgcHBgcH
+BgYHAwQHBwcGBggHBwcGBgcGAgYGBgcGCAYIBwYHBgcHCAYGAwYDBggDBgcHBwcGBwYCAwUCBwYH
+BwcFBgYGBgcHBgYEAgMGAwMFBQkKAgUJCQYHDQsHAAcHAwYGBwgHAwQEBgUFBgQHBwIHCAYHBwcH
+BwQFCAgIBgYIBwcHBwcIBgIHBwYIBwgHCAcHCAcICAgHBwQGBAcJBAcIBwgIBgcHAwQGAggHCAgI
+BQcGBgcHCAcHBAIEBwMDBQUKCwIGCgoGBw4LBwAHBwMHBwcJCAQEBAYGBQcEBwcDCAgGCAgHBwgE
+BQgICAcHCQgICAgHCAcCBwcHCAgJBwkIBwgICAgJCAgEBwQHCgQICAgICAcIBwMEBgMIBwgICAUH
+BgcHCAkHBwQDBAcDAwYGCwsCBgoKBggPDAgACAgEBwcICggEBAQHBgUHBAgIAwgJBwgICAgIBAUJ
+CQkHBwoICAgICAkHAwgIBwkICQgKCAgJCAkJCggIBAcECAsECAkICQkHCQgDBAcDCQgJCQkGCAcH
+CAkJCAgEAwQIAwMGBgsMAgYLCwcIEA0IAAgIBAgICAoJBAUFBwcGCAQICAMJCQcJCQgICQQGCgkK
+CAgKCQkJCQgKCAMICAgKCQoICgkICgkJCgoJCQQIBAgLBAkJCQkKCAkIAwQHAwoICQkJBggHCAgJ
+CggIBQMFCAQEBgYMDQMHDAwHCREOCQAJCQQICAkLCQQFBQgHBggFCQkDCQoICQkJCQoFBgoKCggI
+CwkJCQkJCggDCQkICgkLCQsJCQoJCgoLCQkFCAUJDAUJCgoKCggKCQMFCAMKCQoKCgYJCAgJCgoJ
+CQUDBQkEBAcHDQ4DBwwMCAkSDwkACQkECAkJCwoFBQUICAYIBQkJAwoKCAoKCQkKBQYLCgsJCQsK
+CgoKCQsJAwkJCQsKCwkLCgoLCgsLDAoKBQkFCQ0FCgoKCwsJCgkEBQgDCwkLCgoHCQgJCQoLCQkF
+AwUJBAQHBw4PAwgNDQgKEw8KAAoKBQkJCgwKBQYGCQgHCQUKCgMLCwkLCgoKCwUHCwsLCQkMCwoL
+CgoLCQMKCgkLCgwKDAoKCwoLCwwKCgUJBQoNBQoLCwsLCQsKBAUJBAwKCwsLBwoJCQoLDAoKBgMF
+CgQECAgODwMIDg4JChQQCgAKCgUJCgsNCwUGBgkIBwkGCgoECwwJCwsKCgsGBwwMDAoKDQsLCwsL
+DAoECgoKDAsNCg0LCwwLDAwNCwsGCgUKDgYLDAsMDAoLCgQGCQQMCgwMDAgKCQoLCwwLCgYEBgoE
+BAgIDxADCQ8PCQsVEQsACwsFCgoLDQsFBgYKCQcKBgsLBAwMCgwMCwsMBgcNDA0KCg0MDAwLCw0K
+BAsLCg0LDQsNDAsMCwwNDQsLBgoGCw8GCwwMDA0KDAsEBgkEDQsMDAwICwoKCwwNCwsGBAYLBQUI
+CBARAwkPDwoLFhILAAwMBQoLDA4MBgcHCgkICgYLCwQMDQoMDAsLDAYIDQ0NCwsODAwMDAwNCwQL
+CwsNDA4LDgwMDQwNDQ4MDAYLBgsPBgwNDA0NCwwLBAYKBA0LDQ0NCAsKCwwMDQwLBgQGCwUFCQkR
+EgQKEBAKDBcTDAAMDAULCwwPDAYHBwsKCAsGDAwEDQ0LDQ0MDA0GCA4NDgsLDw0NDQwMDgsEDAwL
+DgwPDA8NDA4MDg4PDAwGCwYMEAYMDQ0ODgsNDAUGCgQODA4NDQkMCwsMDQ4MDAcEBwwFBQkJERME
+ChERCw0YEwwADQ0GCwwNDw0GBwcLCggLBwwMBA0OCw0NDAwOBwgODg4MDA8NDQ0NDQ4MBAwMDA4N
+DwwPDQ0ODQ4ODw0NBwwHDBEHDQ4NDg4MDgwFBwsFDwwODg4JDAsMDQ4PDQwHBAcMBQUKChITBAoS
+EgsNAAAAAQAAA7wAAQCdACoABwOEACQAN/+BACQAOP+cACQAOf9zACQAOv9zACQAPP96ACcAJP+3
+ACcAOP/YACcARP/mACcAUv/sACgAVf/jACgAVv/pACgAV//jACgAWP/pACgAWf/eACgAWv/GACgA
+W//pACgAXP/LACkAJP+VACkARP+wACkASP+3ACkAUv/LACkAVf+6ACkAWP/EACkAXP/EACoAOP/s
+AC8AN/+BAC8AOP/RAC8AS//jADIAOP/fADIAPP+qADMAJP96ADMAOP/fADMARP+9ADMASP+wADMA
+UP/LADMAUf/YADMAUv+2ADMAVf/DADMAVv+2ADMAV//fADMAWP/YADMAXP/RADQAOP/RADUAOP/R
+ADcAJP+BADcARP87ADcASP80ADcATP/oADcAUv8wADcAVf96ADcAWP8+ADcAWv9hADgARP/YADgA
+Rv/YADgAR//RADgASP/YADgASv/YADgATf/fADgAUP/RADgAUf/LADgAUv/RADgAU//YADgAVP/R
+ADgAVf/YADgAVv/LADgAV//LADgAWf/YADgAWv/RADgAW//RADgAXP/RADgAXf/YADkAEf+iADkA
+JP+wADkARP+WADkASP+BADkATP/YADkAUv/zADkAVf+bADkAWP+HADkAXP/zADoAEf9zADoAJP9R
+ADoARP9IADoASP9dADoATP/EADoAUv9jADoAVf9RADoAWP9uADwAD/+OADwAEf+VADwAJP9zADwA
+Mv+bADwARP+OADwAR/+iADwASP+IADwASv+OADwATP/sADwATf/fADwATwCbADwAUP+VADwAUf+V
+ADwAUv+HADwAU/+OADwAVP+HADwAVf+OADwAVv+OADwAV/+bADwAWP+AADwAWf+HADwAXf+iAEQA
+WP/6AEQAXP/YAEYAXP/jAEgAXP/dAEsAWP/YAEsAXP/jAEwAXP/jAE4AXP/dAFAAWP/ZAFAAXP/X
+AFEAWP/YAFEAXP/dAFIAWf/LAFIAWv/ZAFIAXP/XAFMAXP/dAFYAXP/dAFcAXP/pAFgARf/QAFgA
+Wf/fAFgAXP/pAFkAD//LAFkAEf/RAFkARP+/AFkASAAGAFkAUQAvAFkAUv/RAFkAVwAuAFkAWAAd
+AFkAWQAuAFkAWgAvAFoAD/+iAFoAEf+3AFoARP/RAFoAR//RAFoASP/QAFoAUv/fAFwAD/+9AFwA
+Ef9fAFwARP/ZAFwAR//jAFwASP/fAFwASv/jAFwATv/jAFwAT//dAFwAUv/fAFwAVv/pBwkJCQgI
+AAA=
+EOF
+
+       my $ttf2 = decode_base64 <<EOF;
+AAEAAAAPADAAAwDAT1MvMlEZe7UAAEFIAAAAVlBDTFRtHQydAABBoAAAADZjbWFwl0GcIwAAODwA
+AALEY3Z0IF4sCaMAAAREAAAAImZwZ22DM8JPAAAEMAAAABRnbHlmmcAKegAABLwAAC+iaGRteGh1
+tdsAADsAAAAGSGhlYWTEZQ4fAABB2AAAADZoaGVhBfgDfAAAQhAAAAAkaG10eM9JFKwAADXgAAAB
+fGxvY2EACn2MAAA0YAAAAYBtYXhwAPsBpwAAQjQAAAAgbmFtZYcMAFoAAAD8AAADM3Bvc3QJrwpg
+AAA3XAAAAOBwcmVwftAnYQAABGgAAABSAAAAGAEmAAAAAAAAAAAAWgAtAAAAAAAAAAEAHgCWAAAA
+AAAAAAIADgC7AAAAAAAAAAMAVgEhAAAAAAAAAAQAHgDYAAAAAAAAAAUARgGaAAAAAAAAAAYAHgHv
+AAAAAAAAAAcAAAINAAEAAAAAAAAALQAAAAEAAAAAAAEADwCHAAEAAAAAAAIABwC0AAEAAAAAAAMA
+KwD2AAEAAAAAAAQADwDJAAEAAAAAAAUAIwF3AAEAAAAAAAYADwHgAAEAAAAAAAcAAAINAAMAAQQJ
+AAAAWgAtAAMAAQQJAAEAHgCWAAMAAQQJAAIADgC7AAMAAQQJAAMAVgEhAAMAAQQJAAQAHgDYAAMA
+AQQJAAUARgGaAAMAAQQJAAYAHgHvAAMAAQQJAAcAAAINUmF5IExhcmFiaWUgLSBmcmVld2FyZSAt
+IHJsYXJhYmllQGhvdG1haWwuY29tAFIAYQB5ACAATABhAHIAYQBiAGkAZQAgAC0AIABmAHIAZQBl
+AHcAYQByAGUAIAAtACAAcgBsAGEAcgBhAGIAaQBlAEAAaABvAHQAbQBhAGkAbAAuAGMAbwBtRWxl
+Y3Ryb2hhcm1vbml4AEUAbABlAGMAdAByAG8AaABhAHIAbQBvAG4AaQB4UmVndWxhcgBSAGUAZwB1
+AGwAYQByRWxlY3Ryb2hhcm1vbml4AEUAbABlAGMAdAByAG8AaABhAHIAbQBvAG4AaQB4TWFjcm9t
+ZWRpYSBGb250b2dyYXBoZXIgNC4xIEVsZWN0cm9oYXJtb25peABNAGEAYwByAG8AbQBlAGQAaQBh
+ACAARgBvAG4AdABvAGcAcgBhAHAAaABlAHIAIAA0AC4AMQAgAEUAbABlAGMAdAByAG8AaABhAHIA
+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
+ETe5AAT/wDhZEwcnN+JJTUkByyu1KwABAEUBoADbAoAAAwA1QA0BBARABQICAAMBAQBGdi83GAAv
+LwEuLgAxMAFJaLkAAAAESWhhsEBSWDgRN7kABP/AOFkTFzcnRUlNSQHLK7UrAAIATAGgAU4CgAAD
+AAcAdkA0AQgIQAkABgQEBwQFBwUGBwcEBgYHBwYHBAYEBQYGBwUFBgIBAgMAAQAFAgUHAQMCAQEG
+RnYvNxgAPzw/LxD9PAEvPP08hy4IxAj8CMSHLgjECPwIxAEuLgAxMAFJaLkABgAISWhhsEBSWDgR
+N7kACP/AOFkBIzUzDwEnNwFOUVFsSU1JAbDApSu1KwAAAgBbAaABXQKAAAMABwBFQBUBCAhACQYD
+AgEABgQDAgEABwUBAEZ2LzcYAC8vAS4uLi4uLgAuLi4uMTABSWi5AAAACEloYbBAUlg4ETe5AAj/
+wDhZEzM1Ix8BNydbUVFsSU1JAbDApSu1KwAABABKAAACpgDwACMAKwAzADsAaEAqATw8QD0AOjYy
+LiomLAIoMAI0OAISJAIADAYEAx4YBBUhGxUPCQMAARJGdi83GAA/PDwvPDwQ/TwQ/TwBL/0v/S/9
+L/0ALi4uLi4uMTABSWi5ABIAPEloYbBAUlg4ETe5ADz/wDhZJRQGIyImJw4BIyImJw4BIyImNTQ2
+MzIWFz4BMzIWFz4BMzIWBzQjIhUUMzInNCMiFRQzMic0IyIVFDMyAqY8KiU4Bwg4JCU4Bwg4JCs7
+OyskOAgHOCUkOAgHOCUqPFIUFRUUyBQVFRTIFBUVFHgyRjcpKTc3KSk3RjIyRjcpKTc3KSk3RjIY
+GBgYGBgYGBgYGAAAAAAAAAAAAAB8AAAAfAAAAHwAAAB8AAABRgAAAeQAAALwAAAEEAAABIwAAAUG
+AAAFgAAABtgAAAeCAAAH6gAACG4AAAj0AAAJVAAACdQAAApYAAALMgAAC8YAAAysAAANjAAADk4A
+AA76AAAQEgAAENAAABGCAAASNAAAEr4AABM6AAATxgAAFHgAABR4AAAVGAAAFi4AABbgAAAXpgAA
+GGwAABk2AAAZ7gAAGp4AABt+AAAcWgAAHUQAAB4mAAAe/AAAH8IAACBaAAAhLAAAIhIAACLqAAAj
+oAAAJFoAACUUAAAloAAAJmAAACb2AAAnlgAAKHoAACh6AAAo1gAAKSwAAComAAAqNgAAKtIAACri
+AAAq8gAAKwIAACsSAAArIgAAKzIAACtCAAArUgAAK94AACvuAAAr/gAALA4AACweAAAsLgAALD4A
+ACxOAAAsXgAALG4AACx+AAAsjgAALJ4AACyuAAAsvgAALL4AAC06AAAtigAALigAAC6UAAAvogH0
+AD8AAAAAAXgAAAF4AAABiQBCAZoATAKXADUCfwAvASIARgGAAFQBYgBFAf0ASgHoAFEBVABIAhkA
+QAFfAEoCMwAqAnEARAFZAD4CjAA1Ak4ARwJnADICpQA8AogAOAJQADMCdgBFAl4APAFvAEEBigBO
+AXYANAJrAEEBgwA6Ai4AOAF4AAACcAAGAnAAPQJQACwCZQA+AlgANwJoAD8CVAA1AmMAPQJLADEC
+hgBEAlYAJgJMADgCwgBDAnEARAJ3AFkCSwAxAm4AQgJbADECmgBEAj0ALwJ1AEYCTwAuAnYARgJc
+AC0CVAApApAAMgF4AAACMwAhAtf//gJxAEQCaAA9AlAAKAJlAD4CWAA3AmgAPwJUADUCYwA9AksA
+MQKGAEQCRwAmAi8AUgLCAEMCcQBEAncAWQJLADECbgBCAlsAMQKaAEQCPQAvAnUARgJPAC4CdgBG
+AlwALQJUACkCkAAyA+gAAAFGAEwBLwBFAZoATAGaAFsC6ABKAAIAAAAAAAD/ewAUAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAXwAAAAEAAgADAAQABQAGAAgACgALAAwADQAOAA8AEAARABIAEwAUABUAFgAX
+ABgAGQAaABsAHAAdAB4AHwAgACEAIgAjACQAJQAmACcAKAApACoAKwAsAC0ALgAvADAAMQAyADMA
+NAA1ADYANwA4ADkAOgA7ADwAPQA+AD8AQgBEAEUARgBHAEgASQBKAEsATABNAE4ATwBQAFEAUgBT
+AFQAVQBWAFcAWABZAFoAWwBcAF0AXwC2ALcAtAC1AKsAAAADAAAAAAAAAaAAAQAAAAAAHAADAAEA
+AAGgAAYBhAAAAAAAvQABAAAAAAAAAAAAAAAAAAAAAQADAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAQAAAAAAAwAEAAUABgAAAAcAAABbAAkACgALAAwADQAOAA8AEAARABIA
+EwAUABUAFgAXABgAGQAaABsAHAAdAB4AHwAgACEAIgAjACQAJQAmACcAKAApACoAKwAsAC0ALgAv
+ADAAMQAyADMANAA1ADYANwA4ADkAOgA7ADwAPQAAAAAAPgBaAD8AQABBAEIAQwBEAEUARgBHAEgA
+SQBKAEsATABNAE4ATwBQAFEAUgBTAFQAVQBWAFcAWAAAAFkAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAgAXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABdAAAAXgAEASQAAAAW
+ABAAAwAGACMAJQBcAF8AegB8IBAgGSAdICb//wAAACAAJQAnAF8AYQB8IBAgGCAcICb//wAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAEAFgAcABwAhgCGALgAuAC4ALoAvP//AAMABAAFAAYABwAIAAkACgAL
+AAwADQAOAA8AEAARABIAEwAUABUAFgAXABgAGQAaABsAHAAdAB4AHwAgACEAIgAjACQAJQAmACcA
+KAApACoAKwAsAC0ALgAvADAAMQAyADMANAA1ADYANwA4ADkAOgA7ADwAPQA+AD8AQABBAEIAQwBE
+AEUARgBHAEgASQBKAEsATABNAE4ATwBQAFEAUgBTAFQAVQBWAFcAWABZAA4AWgBbAFwAXQBeAAAA
+AAAQAAAAZAkJBQADAwQEBgYDAwMFBAMFAwUGAwYFBgYGBQYFAwQDBgMFAwYGBQYFBgUFBQYFBQYG
+BgUGBQYFBgUGBQUGAwUHBgYFBgUGBQUFBgUFBgYGBQYFBgUGBQYFBQYJAwMEBAcAAAAKCgUABAQE
+BAcGAwQEBQUDBQQGBgMHBgYHBgYGBgQEBAYEBgQGBgYGBgYGBgYGBgYHBgYGBgYHBgYGBgYGBwQG
+BwYGBgYGBgYGBgYGBgcGBgYGBgcGBgYGBgYHCgMDBAQHAAAACwsGAAQEBAUHBwMEBAYFBAYEBgcE
+BwYHBwcHBwcEBAQHBAYEBwcHBwcHBwcGBwcGCAcHBgcHBwYHBwcHBwcEBggHBwcHBwcHBwYHBgYI
+BwcGBwcHBgcHBwcHBwsEAwUFCAAAAAwMBgAFBQUFCAgDBQQGBgQGBAcIBAgHBwgIBwgHBAUEBwUH
+BQcHBwcHBwcHBwgHBwgICAcHBwgHCAcIBwcIBQcJCAcHBwcHBwcHCAcHCAgIBwcHCAcIBwgHBwgM
+BAQFBQkAAAANDQcABQUFBQkIBAUFBwYEBwUHCAQICAgJCAgICAUFBQgFBwUICAgICAgICAgICAgJ
+CAgICAgJBwgICAgICQUHCQgICAgICAgICAgIBwkICAgICAkHCAgICAgJDQQEBQUKAAAADg4HAAUF
+BgYJCQQFBQcHBQgFCAkFCQgJCQkICQgFBgUJBQgFCQkICQgJCAkICQgICgkJCAkICQgJCAkICAkF
+CAoJCQgJCAkICQgJCAgKCQkICQgJCAkICQgICQ4FBAYGCgAAAA8PCAAGBgYGCgoEBgUIBwUIBQgJ
+BQoJCQoKCQkJBgYGCQYIBgkJCQkJCQkJCQoJCQsJCQkJCQoJCQkJCQkKBggLCQkJCQkJCQkJCgkI
+CwkJCQkJCgkJCQkJCQoPBQUGBgsAAAAQEAgABgYGBwsKBQYGCAgFCQYJCgYKCQoLCgkKCgYGBgoG
+CQYKCgkKCgoKCgkKCgkLCgoJCgoLCQoJCgoKCgYJDAoKCQoKCgoKCQoJCQsKCgkKCgsJCgkKCgoK
+EAUFBwcMAAAAEREJAAYGBwcLCwUHBgkIBgkGCgsGCwoKDAsKCwoGBwYLBwkGCwsKCgoKCgoKCwoK
+DAsLCgsKCwoLCgsKCgsGCgwLCgoKCgoKCgoLCgoMCwsKCwoLCgsKCwoKCxEGBQcHDQAAABISCQAH
+BwcHDAwFBwYJCQYKBgoLBgwLCwwMCwsLBwcHCwcKBwsLCwsLCwsLCwwLCw0LCwsLCwwKCwsLCwsM
+BwoNCwsLCwsLCwsLDAoKDQsLCwsLDAoLCwsLCwwSBgUHBw0AAAATEwoABwcHCA0MBgcHCgkGCgcL
+DAcMCwwNDAsMDAcHBwwHCwcMDAsMCwwLDAsMCwsNDAwLDAsNCwwLDAsLDAcLDgwMCwwLDAsMCwwL
+Cw0MDAsMCw0LDAsMCwsMEwYGCAgOAAAAFBQKAAgICAgNDQYIBwoKBwsHCw0HDQwMDg0MDQwHCAcM
+CAsIDAwMDAwMDAwMDQwMDg0NDAwMDQsNDA0MDA0ICw8NDAwMDAwMDAwNDAsODQ0MDAwNCw0MDQwM
+DRQHBggIDwAAABUVCwAICAgJDg0GCAcLCgcLBwwNBw4MDQ4ODA0NCAgIDQgMCA0NDA0NDQ0NDA4N
+DA8NDQwNDQ4MDQwNDQ0OCAwPDQ0MDQ0NDQ0MDgwMDw0NDA0NDgwNDA0NDQ4VBwYJCRAAAAAWFgsA
+CAgJCQ8OBggICwsHDAgMDggODQ4PDg0ODQgJCA4JDAgODg0NDQ4NDQ0ODQ0QDg4NDg0PDQ4NDg0N
+DggMEA4ODQ0NDg0NDQ4NDBAODg0ODQ8NDg0ODQ0OFgcHCQkQAAAAFxcMAAkJCQkPDwcJCAwLCAwI
+DQ4IDw4OEA8ODg4ICQkOCQ0JDg4ODg4ODg4ODw4OEA4PDg4ODw0ODg4ODg8JDREODg4ODg4ODg4P
+DQ0QDg8ODg4PDQ4ODg4ODxcHBwkJEQAAABgYDAAJCQkKEA8HCQgMDAgNCA4PCBAODxAQDg8PCQkJ
+DwkNCQ8PDg8ODw4PDhAODhEPDw4PDhAODw4PDg4QCQ4RDw8ODw4PDg8OEA4NEQ8PDg8OEA4PDg8O
+DhAYCAcKChIAAAAAAQI7AZAABQACArwCigAAAI8CvAKKAAABxQAyAQMAAAAABAAAAAAAAAAAAAAD
+AAAAAAAAAAAAAAAATUFDUgBAACAgJgLk/0AAAALkAMAAAAABAAAAAAAAAAEAAIAAAAABeAJ/AABg
+AAK2AnVFbGVjdHJvaGFybW8gICAg/////zf///5FTEVSMDAAAAAAAAAAAQAAAAEAAOwG77VfDzz1
+AAAD6AAAAACxPeVvAAAAALE95W///v9AAtcDIAAAAAMAAgABAAAAAAABAAADIP84AAAD6P/+//wC
+1wABAAAAAAAAAAAAAAAAAAAAXwABAAAAXwA8AAQANQADAAIACABAAAoAAACBAPMAAQAB
+EOF
+
+       my $sfont1 = decode_base64 <<EOF;
+iVBORw0KGgoAAAANSUhEUgAAC08AAAAkCAYAAADrJuBbAAAABGdBTUEAALGPC/xhBQAAAAZiS0dE
+AP8A/wD/oL2nkwAAAAlwSFlzAAALEQAACxEBf2RfkQAAAAd0SU1FB9ALCQ4jBRBvZvAAACAASURB
+VHic7L17eFVXmfj/WXvvc8nJyTk7F0iAFEISSIAAaQEbLVS0qDjFKVp06IiPONKf1GFG+h20zMiM
+qKjUokWtSkeqdESLlSptqdKWtpSmLeVSbuHaBAKEa24n93PZZ6/fH/vkRqAlOSeE6v48Dw85++y9
+13vWXnu973rXu94lJFIKhOAakUh5ref25r43Snk3Uvm9Kbs/yu8NvZUVrq+8iXyO1+O3XksZ/XHP
+92NZ/SFHIttAf9fdtdy/v/qSa73vQPeN8coQT3uOt+wrMdC6YaDL760cf2u//++5/BvB1ugPvdJf
+uqq/730t2OUPXJsd6DHU1egPG7c/ZWlnoHXZ9ZClnRtNphtFnoGWY6D1/9UY6Hq5Ev0t0/ulb++P
+8q+Fgepbb8S22JUb9dndyPV2o8h2o8hxJW5E3TDQtt6NVCc3kizwt9GWB3LuoysD3c57K8vlDLRd
+kmg5unI99G2i22t/tP8bwe64UeeR+8uXdiP4H/+WbGvb/3x9fv97lTPQvyvRcrzf5osHur76Kkt/
+xFhcy337i/ebrXUjvLd/K33yQLTV6z3OuFH0TaLKibfcRJbdFxneD7F+AzlPdiPM0cUrw/UoK1Hv
+240m60DrFpt+IHfZFkY+sGmgxbCxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGx
+sbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGx
+sbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGx
+sbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxiXHwvhR58L4UOdBy2NjY2NjY2NjY2NjY2NjY2NjY
+2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY/L2hDbQAf2+kJYmBFsHGxsbGxsbGxsbGxsbGxsbGxsbG
+xsbGxsbGxsbGxsbGxsbGxsbGxsbGxubvkh6RvK/O98oMj0B3C0wJQUMSNGD8L5v6FPV78L4U6dbA
+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
+EOF
+       my $sfont2 = decode_base64 <<EOF;
+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
+EOF
+
+       open FP, "> /tmp/ttf1.ttf" or die "Failed to write font $!\n";
+       print FP $ttf2;
+       close FP;
+       open FP, "> /tmp/ttf2.ttf" or die "Failed to write font $!\n";
+       print FP $ttf2;
+       close FP;
+       open FP, "> /tmp/sfont1.png" or die "Failed to write font $!\n";
+       print FP $sfont1;
+       close FP;
+       open FP, "> /tmp/sfont2.png" or die "Failed to write font $!\n";
+       print FP $sfont2;
+       close FP;
+}
diff --git a/test/testgfxprim.sdlpl b/test/testgfxprim.sdlpl
new file mode 100644 (file)
index 0000000..859ebbb
--- /dev/null
@@ -0,0 +1,275 @@
+#!/usr/bin/env perl
+#
+# testgfxprim.pl
+#
+# Copyright (C) 2005 David J. Goehrig <dgoehrig@cpan.org>
+#
+# ------------------------------------------------------------------------------
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+# 
+# This library 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
+# Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+#
+# ------------------------------------------------------------------------------
+#
+# Please feel free to send questions, suggestions or improvements to:
+#
+#      David J. Goehrig
+#      dgoehrig@cpan.org
+#
+
+use strict;
+use Getopt::Long;
+use Data::Dumper;
+use MIME::Base64 qw(decode_base64);
+
+use SDL;
+use SDL::App;
+use SDL::Event;
+use SDL::Surface;
+use SDL::Color;
+use SDL::Rect;
+use SDL::Config;
+
+use vars qw/ $app $app_rect $background $event $sprite $sprite_rect $videoflags /;
+
+die "Your system is not configured with SDL_gfx support!\n"
+       unless (SDL::Config->has('SDL_gfx'));
+
+## User tweakable settings (via cmd-line)
+my %settings = (
+       'numsprites'            => 10,
+       'screen_width'  => 640,
+       'screen_height' => 480,
+       'video_bpp'              => 8,
+       'fast'                                  => 0,
+       'hw'                                            => 0,
+       'fullscreen'            => 0,
+       'bpp'                                    => undef,
+);
+
+## Process commandline arguments
+
+sub get_cmd_args
+{
+       GetOptions(     "width:i"       => \$settings{screen_width},
+                        "height:i" => \$settings{screen_height},
+                        "bpp:i"                => \$settings{bpp},
+                        "fast!"         => \$settings{fast},
+                        "hw!"           => \$settings{hw},
+                        "fullscreen!" => \$settings{fullscreen},
+                        "numsprites=i" => \$settings{numsprites},
+               );
+}
+
+## Initialize application options
+
+sub set_app_args
+{
+       $settings{bpp} ||= 8;           # default to 8 bits per pix
+
+       $videoflags |= SDL_HWACCEL               if $settings{hw};      
+       $videoflags |= SDL_FULLSCREEN   if $settings{fullscreen}; 
+}
+
+## Setup 
+
+sub init_game_context
+{
+       $app = new SDL::App 
+                       -width => $settings{screen_width}, 
+                       -height=> $settings{screen_height}, 
+                       -title => "testsprite",
+                       -flags => $videoflags;
+
+       $app_rect= new SDL::Rect
+                               -height => $settings{screen_height}, 
+                               -width  => $settings{screen_width};
+
+       $background = $SDL::Color::black;
+
+       $sprite = new SDL::Surface -name =>"/tmp/icon.bmp"; 
+
+       # Set transparent pixel as the pixel at (0,0) 
+       $sprite->set_color_key(SDL_SRCCOLORKEY,$sprite->pixel(0,0));    
+
+       print STDERR "Got past that\n";
+
+       $sprite->display_format();
+
+       $sprite_rect = new SDL::Rect    
+                               -x => 0, 
+                               -y => 0,
+                               -width => $sprite->width,
+                               -height=> $sprite->height;
+       
+       $event = new SDL::Event();
+}
+
+## Prints diagnostics
+
+sub instruments
+{
+       if ( ($app->flags & SDL_HWSURFACE) == SDL_HWSURFACE ) {
+               printf("Screen is in video memory\n");
+       } else {
+               printf("Screen is in system memory\n");
+       }
+
+       if ( ($app->flags & SDL_DOUBLEBUF) == SDL_DOUBLEBUF ) {
+               printf("Screen has double-buffering enabled\n");
+       }
+
+       if ( ($sprite->flags & SDL_HWSURFACE) == SDL_HWSURFACE ) {
+               printf("Sprite is in video memory\n");
+       } else {
+               printf("Sprite is in system memory\n");
+       }
+       
+       # Run a sample blit to trigger blit (if posssible)
+       # acceleration before the check just after 
+       $sprite->blit(0,$app,0);
+       
+       if ( ($sprite->flags & SDL_HWACCEL) == SDL_HWACCEL ) {
+               printf("Sprite blit uses hardware acceleration\n");
+       }
+       if ( ($sprite->flags & SDL_RLEACCEL) == SDL_RLEACCEL ) {
+               printf("Sprite blit uses RLE acceleration\n");
+       }
+       
+}
+
+sub game_loop
+{
+       my $surf = $$app;
+       my $surfWidth=$settings{screen_width};
+       my $surfHeight=$settings{screen_height};
+       my $surfMidWidth=$settings{screen_width}>>1;;
+       my $surfMidHeight=$settings{screen_height}>>1; 
+               
+       $app->fill($app_rect, $background);
+
+       # TODO: polygon's, GFX*Color
+
+       #lines
+       
+       SDL::GFXHlineRGBA($surf, 
+                                0,$surfWidth, 
+                                $surfMidHeight,
+                                255,255,255,255);
+
+       SDL::GFXVlineRGBA($surf, 
+                                $surfMidWidth, 
+                                0,$surfHeight,
+                                255,255,255,255);
+
+       # rectangles
+
+       SDL::GFXRectangleRGBA($surf, 
+                        0,0,
+                        $surfMidWidth/2,$surfMidHeight/2,
+                        255,0,0,255);
+
+       SDL::GFXBoxRGBA($surf, 
+                        0,0,
+                        $surfMidWidth/3,$surfMidHeight/3,
+                        0,255,0,255);
+
+       SDL::GFXLineRGBA($surf, 
+                               0,0,
+                               $surfWidth,$surfHeight,
+                               0,255,255,255);
+       
+       SDL::GFXAalineRGBA($surf, $surfWidth,0,0,$surfHeight,0,255,255,255);
+       
+       # circles
+
+       SDL::GFXCircleRGBA( $surf,$surfMidWidth*.3, $surfMidHeight,
+               $surfMidWidth*.3, 255,255,0,255);
+
+
+       SDL::GFXAacircleRGBA($surf, $surfMidWidth*.6, $surfMidHeight,
+               $surfMidWidth*.3, 255,255,0,255);
+       
+
+       SDL::GFXFilledCircleRGBA($surf,$surfMidWidth*.3, $surfMidHeight,
+               $surfMidWidth*.25,255,255,0,255);
+       
+
+       # ellipses
+
+       SDL::GFXEllipseRGBA($surf,$surfWidth- $surfMidWidth*.3, $surfMidHeight,
+               $surfMidWidth*.3,$surfMidHeight*.15, 255,255,0,255);
+
+       SDL::GFXAaellipseRGBA($surf,$surfWidth- $surfMidWidth*.6, $surfMidHeight,
+               $surfMidWidth*.3,$surfMidHeight*.15,255,255,0,255);
+
+       SDL::GFXFilledEllipseRGBA($surf,$surfWidth- $surfMidWidth*.3, $surfMidHeight,
+               $surfMidWidth*.25,$surfMidHeight*.10,255,255,0,255);
+
+       # pie slices
+       SDL::GFXFilledPieRGBA($surf,$surfMidWidth,$surfMidHeight, $surfMidWidth*.1,
+               0,90,0,0,255,255);
+
+       SDL::GFXFilledPieRGBA($surf,$surfMidWidth,$surfMidHeight, $surfMidWidth*.1,
+               180,270,0,0,255,255);
+
+       # polygons
+
+       # TBD...
+
+       
+       # characters & strings
+
+       SDL::GFXCharacterRGBA($surf,$surfMidWidth,0,
+               "!",255,255,255,255);
+
+       SDL::GFXStringRGBA($surf,$surfMidWidth,$surfHeight*.75,
+               "SDL_Perl Primitive Test.",255,255,255,255);
+
+       $app->flip();
+
+       $app->loop({    
+               SDL_QUIT() => sub { exit(0); },
+               SDL_KEYDOWN() => sub { exit(0) if (SDL::GetKeyState(SDLK_ESCAPE)); }, 
+       });
+}
+
+## Main program loop
+
+write_bmp();
+get_cmd_args();
+set_app_args();
+init_game_context();
+instruments();
+game_loop();
+
+sub write_bmp {
+       my $bmp = decode_base64 <<EOF;
+Qk1CAgAAAAAAAEIAAAAoAAAAIAAAACAAAAABAAQAAAAAAAACAABtCwAAbQsAAAMAAAADAAAA////
+AAAAAAAA//8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAABEREREAAAAAAAAAAAAAABEiIiIiEQAAAAAAAAAAAAEiIRER
+EiIQAAAAAAAAAAASIRERERESIQAAAAAAAAABIhERERERESIQAAAAAAAAEiERIiIiIhESIQAAAAAA
+ABIiIiIiIiIiIiEAAAAAAAEiIiIiIiIiIiIiEAAAAAABIiIiIiESIiIiIhAAAAAAASIiIiIhEiIi
+IiIQAAAAAAEiIiIiIiIiIiIiEAAAAAABIiIiIiIiIiIiIhAAAAAAASIiEREiIhERIiIQAAAAAAEi
+IhEBIiIRASIiEAAAAAAAEiIRESIiEREiIQAAAAAAABIiIiIiIiIiIiEAAAAAAAABIiIiIiIiIiIQ
+AAAAAAAAABIiIiIiIiIhAAAAAAAAAAABIiIiIiIiEAAAAAAAAAAAABEiIiIiEQAAAAAAAAAAAAAA
+EREREQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAA=
+EOF
+       open FP, "> /tmp/icon.bmp";
+       print FP $bmp;
+       close FP;
+}
+       
diff --git a/test/testgfxroto.sdlpl b/test/testgfxroto.sdlpl
new file mode 100644 (file)
index 0000000..1aaf518
--- /dev/null
@@ -0,0 +1,396 @@
+#!/usr/bin/env perl
+#
+# testgfxroto.pl
+#
+# Copyright (C) 2005 David J. Goehrig <dgoehrig@cpan.org>
+#
+# ------------------------------------------------------------------------------
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+# 
+# This library 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
+# Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+#
+# ------------------------------------------------------------------------------
+#
+# Please feel free to send questions, suggestions or improvements to:
+#
+#      David J. Goehrig
+#      dgoehrig@cpan.org
+#
+
+use strict;
+use Getopt::Long;
+use Data::Dumper;
+use MIME::Base64 qw(decode_base64);
+
+use SDL;
+use SDL::App;
+use SDL::Event;
+use SDL::Surface;
+use SDL::Color;
+use SDL::Rect;
+use SDL::Config;
+
+use vars qw/ $app $app_rect $background $event $sprite $sprite_rect $videoflags /;
+
+## Test for SDL_gfx support
+
+die "Your system was not configured with SDL_gfx support!\n"
+       unless SDL::Config->has('SDL_gfx');
+
+
+## User tweakable settings (via cmd-line)
+my %settings = (
+       'numsprites'            => 10,
+       'screen_width'  => 200,
+       'screen_height' => 200,
+       'video_bpp'              => 8,
+       'fast'                                  => 0,
+       'hw'                                            => 0,
+       'flip'                                  => 1,
+       'fullscreen'            => 0,
+       'bpp'                                    => undef,
+);
+
+## Process commandline arguments
+
+sub get_cmd_args
+{
+       GetOptions("width:i"    => \$settings{screen_width},
+                        "height:i" => \$settings{screen_height},
+                        "bpp:i"                => \$settings{bpp},
+                        "fast!"         => \$settings{fast},
+                        "hw!"           => \$settings{hw},
+                        "flip!"                => \$settings{flip},
+                        "fullscreen!" => \$settings{fullscreen},
+                        "numsprites=i" => \$settings{numsprites},
+                       );
+}
+
+## Initialize application options
+
+sub set_app_args
+{
+       $settings{bpp} ||= 8;           # default to 8 bits per pix
+
+       $videoflags |= SDL_HWACCEL               if $settings{hw};      
+       $videoflags |= SDL_DOUBLEBUF     if $settings{flip};    
+       $videoflags |= SDL_FULLSCREEN   if $settings{fullscreen}; 
+}
+
+## Setup 
+
+sub    init_game_context
+{
+       $app = new SDL::App (
+                                        -width => $settings{screen_width}, 
+                                        -height=> $settings{screen_height}, 
+                                        -title => "testsprite",
+                                        -flags => $videoflags,
+                       );
+
+       $app_rect= new SDL::Rect(
+                                -height => $settings{screen_height}, 
+                                -width => $settings{screen_width},
+                               );
+
+       $background = $SDL::Color::black;
+
+       $sprite = new SDL::Surface -name =>"/tmp/spiral.png"; 
+
+       $sprite->display_format();
+
+       SDL::SetColorKey($$sprite, SDL_SRCCOLORKEY, SDL::SurfacePixel($$sprite,0,0));
+
+       $sprite_rect = new SDL::Rect(-x          => 0, 
+                                                -y              => 0,
+                                                -width => $sprite->width,
+                                                -height=> $sprite->height,
+                                               );
+       
+       $event = new SDL::Event();
+}
+
+## Prints diagnostics
+
+sub instruments
+{
+       if ( ($app->flags & SDL_HWSURFACE) == SDL_HWSURFACE ) {
+               printf("Screen is in video memory\n");
+       } else {
+               printf("Screen is in system memory\n");
+       }
+
+       if ( ($app->flags & SDL_DOUBLEBUF) == SDL_DOUBLEBUF ) {
+               printf("Screen has double-buffering enabled\n");
+       }
+
+       if ( ($sprite->flags & SDL_HWSURFACE) == SDL_HWSURFACE ) {
+               printf("Sprite is in video memory\n");
+       } else {
+               printf("Sprite is in system memory\n");
+       }
+       
+       # Run a sample blit to trigger blit (if posssible)
+       # acceleration before the check just after 
+       put_sprite_rotated($sprite,
+                       $settings{screen_width}/2, $settings{screen_height}/2,
+                       0,0,0);
+       
+       if ( ($sprite->flags & SDL_HWACCEL) == SDL_HWACCEL ) {
+               printf("Sprite blit uses hardware acceleration\n");
+       }
+       if ( ($sprite->flags & SDL_RLEACCEL) == SDL_RLEACCEL ) {
+               printf("Sprite blit uses RLE acceleration\n");
+       }
+       
+}
+
+
+
+
+# this can     get silly in terms of
+# memory usage, and maybe key lookup.
+# it would be better to 'tie' the hash
+# to an object which can
+# better manage memory usage.
+
+my %rotate_cache =();
+
+sub generate_sprite_rotated
+{
+       my ($surface, $angle, $zoom, $smooth) = @_;
+
+       $angle %= 360;
+       my $key = "$surface$angle$zoom$smooth";
+
+       if ( $rotate_cache{$key} )
+       {
+               return $rotate_cache{$key};
+       }
+       else
+       {
+                my $sur = SDL::GFXRotoZoom($surface, $angle, $zoom, $smooth);
+
+                $rotate_cache{$key}= SDL::DisplayFormat($sur);
+       }
+       return $rotate_cache{$key};
+}
+
+sub put_sprite_rotated
+{
+       my ($surface, $x, $y, $angle, $zoom, $smooth) = @_;
+
+       my $roto = generate_sprite_rotated($$surface, $angle, $zoom, $smooth);
+
+       die "Failed to create rotozoom surface" unless $roto;
+
+       my ($w,$h) = (SDL::SurfaceW($roto),SDL::SurfaceH($roto));;       
+       
+
+       my $dest_rect = new SDL::Rect
+                               -x => $x - ($w/2),
+                               -y => $y - ($h/2),
+                               -width  => $w,
+                               -height => $h;
+
+       
+       SDL::BlitSurface($roto, 0, $$app, $$dest_rect); 
+}
+
+
+sub game_loop
+{
+       my $ox=$settings{screen_width}>>1;;
+       my $oy=$settings{screen_height}>>1;
+       my $sectors = 12;
+       my $angleDelta = 360/$sectors;;
+       my $zoom        = 1;
+       my $smooth =1;
+
+       my $angle        =0;
+       my $radius      =128;
+
+ FRAME:
+       while (1) 
+       {
+               # process event queue
+               $event->pump;
+               if ($event->poll)
+               {
+                       my $etype=$event->type();                       
+                       
+                       # handle quit events
+                       last FRAME if ($etype == SDL_QUIT() );
+                       last FRAME if (SDL::GetKeyState(SDLK_ESCAPE));
+               }
+
+               # needed for HW surface locking
+               #$app->lock() if $app->lockp(); 
+               #$app->unlock();
+               $app->flip if $settings{flip};
+
+               ################################################
+               # do some drawing 
+               
+               $app->fill($app_rect, $background);
+
+               $angle += 16;
+
+               put_sprite_rotated($sprite, 
+                       $settings{screen_width}/2, $settings{screen_height}/2,
+                       $angle, $zoom, $smooth);
+                       
+       }
+       print "Cache entries: " . scalar(keys %rotate_cache) . "\n";
+}
+
+
+
+## Main program loop
+
+write_spiral();
+get_cmd_args();
+set_app_args();
+init_game_context();
+instruments();
+game_loop();
+exit(0);
+
+sub write_spiral {
+       my $png = decode_base64 <<EOF;
+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
+EOF
+       open FP, "> /tmp/spiral.png";
+       print FP $png;
+       close FP;
+}
diff --git a/test/testgraphictool.sdlpl b/test/testgraphictool.sdlpl
new file mode 100644 (file)
index 0000000..e7b8ccc
--- /dev/null
@@ -0,0 +1,216 @@
+#!/usr/bin/env perl
+#
+# testgraphictool.pl
+#
+# Copyright (C) 2005 David J. Goehrig <dgoehrig@cpan.org>
+#
+# ------------------------------------------------------------------------------
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+# 
+# This library 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
+# Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+#
+# ------------------------------------------------------------------------------
+#
+# Please feel free to send questions, suggestions or improvements to:
+#
+#      David J. Goehrig
+#      dgoehrig@cpan.org
+#
+
+use strict;
+use warnings;
+use MIME::Base64 qw(decode_base64);
+use SDL;
+use SDL::Surface;
+use SDL::App;
+use SDL::Tool::Graphic;
+
+my $app = new SDL::App(-title  => "Graphic Tool Test",
+                      -width   => 640,
+                      -height  => 480,
+                      -depth   => 16,
+                      -fullscreen => 0);
+my $app_rect = new SDL::Rect(  -x=>0,
+                               -y=>0,
+                               -width=>$app->width,
+                               -height=>$app->height);
+
+write_spiral();
+my $sprite = new SDL::Surface(-name => "/tmp/spiral.png");
+$sprite->display_format();
+
+#Test Zoom
+my $graphicTool = new SDL::Tool::Graphic();
+$graphicTool->zoom($sprite, .5, .5, 1);
+
+my $sprite_rect = new SDL::Rect(       -x=>0,
+                               -y=>0,
+                               -width=>$sprite->width,
+                               -height=>$sprite->height);
+$sprite->blit($sprite_rect, $app, $sprite_rect);
+$app->flip();
+sleep 4;
+$app->fill($app_rect, $SDL::Color::black);
+
+
+#Test Rotate
+$graphicTool->rotoZoom($sprite, 90, 1, 1);
+
+$sprite_rect = new SDL::Rect(  -x=>0,
+                               -y=>0,
+                               -width=>$sprite->width,
+                               -height=>$sprite->height);
+$sprite->blit($sprite_rect, $app, $sprite_rect);
+$app->flip();
+sleep 4;
+
++print "GrayScaling\n";
++$app->fill($app_rect, $SDL::Color::black);
+
+#Test GrayScale
+$graphicTool->grayScale($sprite);
+
+$sprite->blit($sprite_rect, $app, $sprite_rect);
+$app->flip();
+sleep 4;
+
+
+
+sub write_spiral {
+       my $png = decode_base64 <<EOF;
+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
+EOF
+       open FP, "> /tmp/spiral.png";
+       print FP $png;
+       close FP;
+}
diff --git a/test/testjoystick.sdlpl b/test/testjoystick.sdlpl
new file mode 100644 (file)
index 0000000..b7167e1
--- /dev/null
@@ -0,0 +1,240 @@
+#!/usr/bin/env perl
+#
+# testjoystick.pl
+#
+# Copyright (C) 2005 David J. Goehrig <dgoehrig@cpan.org>
+#
+# ------------------------------------------------------------------------------
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+# 
+# This library 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
+# Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+#
+# ------------------------------------------------------------------------------
+#
+# Please feel free to send questions, suggestions or improvements to:
+#
+#      David J. Goehrig
+#      dgoehrig@cpan.org
+#
+
+use strict;
+use SDL;
+use SDL::App;
+use SDL::Rect;
+use SDL::Event;
+
+
+sub WatchJoystick($){
+       (my $joystick) = @_;
+       my $screenWidth = 640;
+       my $screenHeight = 480;
+
+       my $app = new SDL::App(-title => "Joystick Test",
+                              -width => $screenWidth,
+                              -height => $screenHeight,
+                              -depth=> 16 );
+       #Print information about the joystick we are watching
+       my $name = SDL::JoystickName(SDL::JoystickIndex($joystick));
+       print "Watching joystick ".SDL::JoystickIndex($joystick).
+             ": (".($name ? $name : "Unknown Joystick" ).")\n";
+       print "Joystick has ".SDL::JoystickNumAxes($joystick)." axes, ".
+             SDL::JoystickNumHats($joystick)." hats, ".
+             SDL::JoystickNumBalls($joystick)." balls, and ".
+             SDL::JoystickNumButtons($joystick)." buttons\n";
+       
+       my $event = new SDL::Event;
+       my $done = 0;   
+       my $colorWhite = new SDL::Color(-r=>255, -g=>255, -b=>255);
+       my $colorBlack = new SDL::Color();
+       my @axisRect = ();
+       my $numAxes=SDL::JoystickNumAxes($joystick);
+
+
+       while(!$done)
+         {
+               while($event->poll())
+                 {
+                       if($event->type() eq SDL::JOYAXISMOTION())
+                         {
+                               print "Joystick ".SDL::JoyAxisEventWhich($$event).
+                                 " axis ".SDL::JoyAxisEventAxis($$event).
+                                       " value: ".SDL::JoyAxisEventValue($$event)."\n";
+                         } 
+                       elsif($event->type() eq SDL::JOYHATMOTION())
+                         {
+                               print "Joystick ".SDL::JoyHatEventWhich($$event).
+                                 " hat ".SDL::JoyHatEventHat($$event);
+                               if(SDL::JoyHatEventValue($$event) == SDL::HAT_CENTERED() )
+                                 {
+                                       print " centered";
+                                 } elsif(SDL::JoyHatEventValue($$event) == SDL::HAT_UP() ) { 
+                                       print " up";
+                                 } elsif(SDL::JoyHatEventValue($$event) == SDL::HAT_RIGHT() ) {
+                                       print " right";
+                                 } elsif(SDL::JoyHatEventValue($$event) == SDL::HAT_DOWN() ) {
+                                       print " down";
+                                 } elsif(SDL::JoyHatEventValue($$event) == SDL::HAT_LEFT()) {
+                                       print " left";
+                                 } elsif(SDL::JoyHatEventValue($$event) == SDL::HAT_RIGHTUP() ) { 
+                                       print " right & up";
+                                 } elsif(SDL::JoyHatEventValue($$event) == SDL::HAT_RIGHTDOWN() ) {
+                                       print " right & down";
+                                 } elsif(SDL::JoyHatEventValue($$event) == SDL::HAT_LEFTDOWN() ) {
+                                       print " left & down";
+                                 } elsif(SDL::JoyHatEventValue($$event) == SDL::HAT_LEFTUP()) {
+                                       print " left & up";
+                                 }
+                               print "\n";
+                         } elsif($event->type() eq SDL::JOYBALLMOTION()){
+                               print "Joystick ".SDL::JoyBallEventWhich($$event).
+                                 " ball ".SDL::JoyBallEventBall($$event).
+                                     " delta: (".SDL::JoyBallEventXrel($$event).
+                                     ",".SDL::JoyBallEventYrel($$event)."\n";
+                       } elsif($event->type() eq SDL::JOYBUTTONDOWN()){
+                               print "Joystick ".SDL::JoyButtonEventWhich($$event).
+                                     " button ".SDL::JoyButtonEventButton($$event)." down\n";
+                       } elsif($event->type() eq SDL::JOYBUTTONUP()){
+                               print "Joystick ".SDL::JoyButtonEventWhich($$event).
+                                     " button ".SDL::JoyButtonEventButton($$event)." up\n";
+                       } elsif($event->type() eq SDL_QUIT() or 
+                               ($event->type() eq SDL_KEYDOWN() and 
+                                $event->key_sym() == SDLK_ESCAPE)){
+                               $done = 1;
+                       }
+                       
+
+
+                       #Update visual joystick state
+                       for(my $i =0; $i < SDL::JoystickNumButtons($joystick); $i++)
+                         {
+                               my $rect = new SDL::Rect( -width => 32,
+                                                                                 -height => 32,
+                                                                                 -x => $i*34,
+                                                                                 -y => $screenHeight-34); 
+                               if(SDL::JoystickGetButton($joystick, $i) eq SDL::PRESSED())
+                                 {
+                                       $app->fill($rect, $colorWhite); 
+                                 } else {
+                                       $app->fill($rect, $colorBlack); 
+                                 }
+                               $app->update($rect);
+                         }
+
+
+                         for (my $i = 0; $i < $numAxes; $i+=1)
+                               {
+                                 #Remove previous axis box
+                                 if($axisRect[$i]){
+                                       $app->fill($axisRect[$i], $colorBlack);
+                                       $app->update($axisRect[$i]);
+                                 }
+                                 # Draw the axis
+                                 my $ox = SDL::JoystickGetAxis($joystick, $i);
+                                 my $x= abs ($ox/256);
+                                 if( $x < 0) {
+                                       $x=0;
+                                 } elsif ( $x > ($screenWidth-16) ){
+                                       $x = $screenWidth-16;
+                                 }
+
+
+                                 if ($ox < 0)
+                                       {
+                                         $axisRect[$i] = new SDL::Rect( -width=> $x,
+                                                                                                        -height=> 32,
+                                                                                                        -x => ($screenWidth/2) - $x,
+                                                                                                        -y => $i*34
+                                                                                                  );
+                                       }
+                                 else
+                                       {
+                                         $axisRect[$i] = new SDL::Rect( -width=> $x,
+                                                                                                        -height=> 32,
+                                                                                                        -x => $screenWidth/2 ,
+                                                                                                        -y => $i*34
+                                                                                                  );
+                                       }
+
+
+                                 $app->fill($axisRect[$i], $colorWhite);
+                                 $app->update($axisRect[$i]);
+                               }
+                 }
+         }
+  }
+                               
+die "Could not initialize SDL: ", SDL::GetError()
+       if( 0 > SDL::Init(SDL_INIT_JOYSTICK()));
+
+printf "There are %d joysticks attched\n", SDL::NumJoysticks();
+for(my $i = 0; $i < SDL::NumJoysticks(); $i++){
+       my $name = SDL::JoystickName($i);
+       print "Joystick ".$i.": ".($name ? $name : "Unknown Joystick")."\n"; 
+}
+
+if ( $ARGV[0] ne undef){
+       my $joystick = SDL::JoystickOpen($ARGV[0]);
+       if(!$joystick){
+               print "Couldn't open joystick ".$ARGV[0].": ".SDL::GetError()."\n";
+       } else {
+               WatchJoystick($joystick);
+               SDL::JoystickClose($joystick);
+       }
+       SDL::QuitSubSystem(SDL_INIT_JOYSTICK());
+}
+
+
+exit;
+
+sub draw_axis_method_2()
+{
+}
+
+__DATA__
+sub draw_axis_method_1()
+{
+                               for (my $i = 0; $i < ($numAxes/2); $i+=2)
+                                 {
+                                       #Remove previous axis box
+                                       if($axisRect[$i]){
+                                         $app->fill($axisRect[$i], $colorBlack);
+                                         $app->update($axisRect[$i]);
+                                       }
+                                       # Draw the X/Y axis
+                                       my $x = SDL::JoystickGetAxis($joystick, $i)+32768;
+                                       $x *= $screenWidth;
+                                       $x /= 65535;
+                                       if( $x < 0) {
+                                         $x=0;
+                                       } elsif ( $x > ($screenWidth-16) ){
+                                         $x = $screenWidth-16;
+                                       }
+                                       my $y = SDL::JoystickGetAxis($joystick, $i+1)+32768;
+                                       $y *= $screenHeight;
+                                       $y /= 65535;
+                                       if( $y < 0) {
+                                         $y=0;
+                                       } elsif ( $y > ($screenHeight-16) ){
+                                         $y = $screenHeight-16; 
+                                       }
+                                       $axisRect[$i] = new SDL::Rect( -width=> 16,
+                                                                                                  -height=> 16,
+                                                                                                  -x => $x,
+                                                                                                  -y => $y);
+                                       $app->fill($axisRect[$i], $colorWhite);
+                                       $app->update($axisRect[$i]);
+                                 }
+                         }
+
+}
diff --git a/test/testmenu.sdlpl b/test/testmenu.sdlpl
new file mode 100644 (file)
index 0000000..67aaaf8
--- /dev/null
@@ -0,0 +1,994 @@
+#!/usr/bin/env perl
+#
+# testmenu.pl
+#
+# Copyright (C) 2005 David J. Goehrig <dgoehrig@cpan.org>
+#
+# ------------------------------------------------------------------------------
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+# 
+# This library 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
+# Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+#
+# ------------------------------------------------------------------------------
+#
+# Please feel free to send questions, suggestions or improvements to:
+#
+#      David J. Goehrig
+#      dgoehrig@cpan.org
+#
+
+use SDL;
+use SDL::App;
+use SDL::Surface;
+use SDL::Rect;
+use SDL::Event;
+use MIME::Base64 qw/ decode_base64 /;
+
+write_pngs();
+
+my $menu = new SDL::Surface -name => '/tmp/menu.png';
+
+my $app = new SDL::App -w => $menu->width(), -h => $menu->height(), -resizeable => 1;
+
+my $hilight = new SDL::Surface -name => '/tmp/highlight.png';
+
+my %menu = (
+       'start' => [ 115, 30, 160, 40 ],
+       'help' => [ 120, 100, 120, 40 ],
+       'giveup' => [ 120, 230, 120, 40 ],
+       'spawnserver' => [ 115, 170, 165, 40 ], 
+       'credits' => [ 115, 285, 160, 40 ],
+);
+
+my $needblit;
+sub drawMenu {
+       my ($a,$dx,$dy,$no,$hi,%m) = @_;
+       for (keys %m) {
+               my ($x,$y,$w,$h) = @{$m{$_}};
+               next unless $dx >= $x && $dx <= $x+$w
+                        && $dy >= $y && $dy <= $y+$h;
+               unless ($needblit) {
+                       my $rect = new SDL::Rect -w => $w, -h => $h, 
+                                        -x => $x, -y => $y;
+                       $hi->blit($rect,$a,$rect);
+                       $needblit = 1;
+               }
+               return $_;
+       }
+       $no->blit(NULL,$a,NULL) if $needblit;
+       $needblit = 0;
+       return 0;
+}
+
+sub help {
+       print STDERR <<USAGE;
+This should print a help message
+
+USAGE
+
+}
+
+sub credits {
+       print STDERR <<CREDITS;
+David J. Goehrig
+
+CREDITS
+
+}
+
+sub spawnserver {
+       print STDERR <<SPAWN;
+Spawinging new server...
+
+SPAWN
+
+}
+
+sub start  {
+       print STDERR <<START;
+This should start the game
+
+START
+
+}
+
+sub giveup {
+       print STDERR <<GIVEUP;
+Giving up
+
+GIVEUP
+
+       exit(0);
+}
+
+my %events = (
+       SDL_MOUSEMOTION() =>  sub {
+               my ($e) = @_;
+               drawMenu($app,
+                        $e->motion_x(),
+                        $e->motion_y(),
+                        $menu,
+                        $hilight,
+                        %menu);
+       },
+       SDL_MOUSEBUTTONUP() => sub {
+               my ($e) = @_;
+               my $routine = drawMenu($app,
+                        $e->motion_x(),
+                        $e->motion_y(),
+                        $menu,
+                        $hilight,
+                        %menu);
+               &{$routine} if ($routine);
+       },
+       SDL_QUIT() => sub { exit(0); },
+       SDL_KEYDOWN() => sub { 
+               my ($e) = @_;
+               exit(0) if ($e->key_sym() == SDLK_ESCAPE);
+       },
+);
+
+$menu->blit(NULL,$app,NULL);
+$app->sync();
+$app->loop(\%events);
+
+sub write_pngs {
+       $png1 = decode_base64 <<PNG;
+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
+AAAAAElFTkSuQmCC
+PNG
+
+       $png2 = decode_base64 <<PNG2;
+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
+PNG2
+
+       open FP, "> /tmp/highlight.png" or die "$!\n";
+       print FP $png1;
+       close FP;
+       open FP, "> /tmp/menu.png" or die "$!\n";
+       print FP $png2;
+       close FP;
+}
diff --git a/test/testsprite.sdlpl b/test/testsprite.sdlpl
new file mode 100644 (file)
index 0000000..69e0af6
--- /dev/null
@@ -0,0 +1,222 @@
+#!/usr/bin/env perl
+#
+# testsprite.pl
+#
+# Copyright (C) 2005 David J. Goehrig <dgoehrig@cpan.org>
+#
+# ------------------------------------------------------------------------------
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+# 
+# This library 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
+# Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+#
+# ------------------------------------------------------------------------------
+#
+# Please feel free to send questions, suggestions or improvements to:
+#
+#      David J. Goehrig
+#      dgoehrig@cpan.org
+#
+
+use strict;
+use Data::Dumper;
+use MIME::Base64 qw(decode_base64);
+
+use SDL;
+use SDL::App;
+use SDL::Event;
+use SDL::Surface;
+use SDL::Color;
+use SDL::Rect;
+
+use vars qw/ $app $app_rect $background $event $sprite $sprite_rect $videoflags /;
+
+## User tweakable settings (via cmd-line)
+my %settings = (
+       'numsprites'    => 75,
+       'screen_width'  => 640,
+       'screen_height' => 480,
+       'video_bpp'     => 8,
+       'fast'          => 0,
+       'hw'            => 0,
+       'flip'          => 1,
+       'fullscreen'    => 0,
+       'bpp'           => undef,
+);
+
+## Initialize application options
+
+sub set_app_args
+{
+  $settings{bpp} ||= 8;        # default to 8 bits per pix
+  $videoflags |= SDL_HWACCEL     if $settings{hw};  
+  $videoflags |= SDL_DOUBLEBUF   if $settings{flip};  
+  $videoflags |= SDL_FULLSCREEN  if $settings{fullscreen}; 
+}
+
+## Setup 
+
+our $bmp;
+
+sub  init_game_context
+{
+  write_bmp();
+  $app = new SDL::App (
+                      -width => $settings{screen_width}, 
+                      -height=> $settings{screen_height}, 
+                      -title => "testsprite",
+                      -icon  => "/tmp/icon.bmp",
+                      -flags => $videoflags,
+                       );
+
+  $app_rect= new SDL::Rect(
+                          -height => $settings{screen_height}, 
+                          -width  => $settings{screen_width},
+                         );
+
+  $background = $SDL::Color::black;
+
+  $sprite = new SDL::Surface(-name => '/tmp/icon.bmp');
+
+  # Set transparent pixel as the pixel at (0,0) 
+  
+  $sprite->display_format();
+
+  $sprite->set_color_key(SDL_SRCCOLORKEY,$sprite->pixel(0,0)); # sets the transparent color to that at (0,0)
+
+
+  $sprite_rect = new SDL::Rect(-x     => 0, 
+                              -y     => 0,
+                              -width => $sprite->width,
+                              -height=> $sprite->height,
+                             );
+  
+  $event = new SDL::Event();
+}
+
+## Prints diagnostics
+
+sub instruments
+{
+  if ( ($app->flags & SDL_HWSURFACE) == SDL_HWSURFACE ) {
+    printf("Screen is in video memory\n");
+  } else {
+    printf("Screen is in system memory\n");
+  }
+
+  if ( ($app->flags & SDL_DOUBLEBUF) == SDL_DOUBLEBUF ) {
+    printf("Screen has double-buffering enabled\n");
+  }
+
+  if ( ($sprite->flags & SDL_HWSURFACE) == SDL_HWSURFACE ) {
+    printf("Sprite is in video memory\n");
+  } else {
+    printf("Sprite is in system memory\n");
+  }
+  
+  # Run a sample blit to trigger blit (if posssible)
+  # acceleration before the check just after 
+  put_sprite(0,0);
+  
+  if ( ($sprite->flags & SDL_HWACCEL) == SDL_HWACCEL ) {
+    printf("Sprite blit uses hardware acceleration\n");
+  }
+  if ( ($sprite->flags & SDL_RLEACCEL) == SDL_RLEACCEL ) {
+    printf("Sprite blit uses RLE acceleration\n");
+  }
+  
+}
+
+
+
+
+sub put_sprite
+{
+  my ($x,$y) = @_;
+
+  my $dest_rect = new SDL::Rect(-x => $x,
+                              -y => $y,
+                              -width  => $sprite->width,
+                              -height => $sprite->height,
+                             );
+  $sprite->blit($sprite_rect, $app, $dest_rect);  
+}
+
+
+
+sub game_loop
+{
+  my $x=0;
+  my $y=$settings{screen_height}>>1;
+  my $i=0;
+
+  while (1) 
+  {
+    # process event queue
+    $event->pump;
+    $event->poll;
+    my $etype=$event->type;      
+
+    # handle user events
+    last if ($etype eq SDL_QUIT );
+    last if (SDL::GetKeyState(SDLK_ESCAPE));
+
+    #$app->lock() if $app->lockp();  
+
+    # page flip
+
+    # __draw gfx
+    
+    $app->fill($app_rect, $background);
+
+    foreach (1..$settings{numsprites})
+    {
+      put_sprite( $_*8, $y + (sin(($i+$_)*0.2)*($settings{screen_height}/3)));
+    }
+    $i+=30;
+
+    # __graw gfx end
+    #$app->unlock();
+    $app->flip if $settings{flip};
+  }
+}
+
+## Main program loop
+
+set_app_args();
+init_game_context();
+instruments();
+game_loop();
+system 'rm /tmp/icon.bmp';
+exit(0);
+
+
+sub write_bmp {
+       $bmp = decode_base64 <<EOF;
+Qk1CAgAAAAAAAEIAAAAoAAAAIAAAACAAAAABAAQAAAAAAAACAABtCwAAbQsAAAMAAAADAAAA////
+AAAAAAAA//8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAABEREREAAAAAAAAAAAAAABEiIiIiEQAAAAAAAAAAAAEiIRER
+EiIQAAAAAAAAAAASIRERERESIQAAAAAAAAABIhERERERESIQAAAAAAAAEiERIiIiIhESIQAAAAAA
+ABIiIiIiIiIiIiEAAAAAAAEiIiIiIiIiIiIiEAAAAAABIiIiIiESIiIiIhAAAAAAASIiIiIhEiIi
+IiIQAAAAAAEiIiIiIiIiIiIiEAAAAAABIiIiIiIiIiIiIhAAAAAAASIiEREiIhERIiIQAAAAAAEi
+IhEBIiIRASIiEAAAAAAAEiIRESIiEREiIQAAAAAAABIiIiIiIiIiIiEAAAAAAAABIiIiIiIiIiIQ
+AAAAAAAAABIiIiIiIiIhAAAAAAAAAAABIiIiIiIiEAAAAAAAAAAAABEiIiIiEQAAAAAAAAAAAAAA
+EREREQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAA=
+EOF
+       open FP, "> /tmp/icon.bmp";
+       print FP $bmp;
+       close FP;
+}
+       
diff --git a/test/testtimer.sdlpl b/test/testtimer.sdlpl
new file mode 100644 (file)
index 0000000..efe3a20
--- /dev/null
@@ -0,0 +1,58 @@
+#!/usr/bin/env perl
+#
+# testtimer.pl
+#
+# Copyright (C) 2005 David J. Goehrig <dgoehrig@cpan.org>
+#
+# ------------------------------------------------------------------------------
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+# 
+# This library 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
+# Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+#
+# ------------------------------------------------------------------------------
+#
+# Please feel free to send questions, suggestions or improvements to:
+#
+#      David J. Goehrig
+#      dgoehrig@cpan.org
+#
+
+use SDL;
+use SDL::Timer;
+
+die "usage: $0\n" if in($ARGV[0], qw/ -? -h --help/);
+
+SDL::Init(SDL_INIT_EVERYTHING());
+
+print STDERR "Waiting 4 seconds\n";
+SDL::Delay(4000);
+
+$a = new SDL::Timer sub { my $timer = shift;
+                         print STDERR "Timer A: $$timer{-times} runs\n" }, 
+               -delay => 1000, 
+               -times => 10;
+
+$b = new SDL::Timer sub { print STDERR "Timer B: ", ++$i,"\n" }, -delay => 3000;
+                       
+$c = new SDL::Timer sub { print STDERR "Timer C: restarting Timer A\n"; $a->run(1000,10) },
+               -delay => 19000,
+               -times => 1;
+
+SDL::Delay(30000);
+
+print STDERR "Cleaning up...\n";
+SDL::Delay(300);
+
+SDL::Quit();
+
diff --git a/typemap b/typemap
new file mode 100644 (file)
index 0000000..392972f
--- /dev/null
+++ b/typemap
@@ -0,0 +1,69 @@
+TYPEMAP
+const Uint16 *         T_PTR
+Uint8                  T_U_CHAR
+Uint8 *                        T_PTR
+const Uint8*           T_PTR
+Uint8 **               T_PTR
+Uint16                 T_UV
+Uint16 *               T_PTR
+Uint32                 T_UV
+Uint32 *               T_PTR
+SDLKey                 T_UV
+Sint16                 T_IV
+Sint16 *               T_PTR
+Sint32                 T_IV
+Sint32 *               T_PTR
+SDL_Event *            T_PTR
+SDL_Surface *          T_PTR
+SDL_SysWMmsg *         T_PTR
+SDL_CD *               T_PTR
+SDL_CDtrack *          T_PTR
+SDL_TimerCallback      T_PTR
+SDL_Rect *             T_PTR
+SDL_Color *            T_PTR
+SDL_Palette *          T_PTR
+SDL_PixelFormat *      T_PTR
+SDL_Cursor *           T_PTR
+SDL_AudioSpec *                T_PTR
+SDL_AudioCVT *         T_PTR
+Mix_Fading             T_UV
+Mix_Chunk *            T_PTR
+Mix_Music *            T_PTR
+SDL_GLattr              T_IV
+int *                  T_PTR
+void *                 T_PTR
+SDL_TimerID            T_PTR
+SDL_NewTimerCallback   T_PTR
+SDL_Joystick *         T_PTR
+SDLNet_SocketSet       T_PTR
+TCPsocket              T_PTR
+UDPsocket              T_PTR
+UDPpacket *            T_PTR
+UDPpacket **           T_PTR
+IPaddress*             T_PTR
+SDLNet_GenericSocket   T_PTR
+TTF_Font *             T_PTR
+SDL_Overlay *          T_PTR
+SMPEG_Info *           T_PTR
+SMPEG *                        T_PTR
+SMPEGstatus            T_IV
+SDL_mutex *            T_PTR
+GLbitfield             T_IV
+GLenum                 T_IV
+ConsoleInformation *   T_PTR
+GLboolean              T_U_CHAR
+GLUnurbsObj *          T_PTR
+GLUtesselator *                T_PTR
+GLuint                 T_UV
+GLuint*                        T_PTR
+GLint                  T_IV
+GLint*                 T_PTR
+float *                        T_PTR
+float                  T_NV
+GLfloat                        T_NV
+Sound_DecoderInfo *    T_PTR
+const Sound_DecoderInfo *      T_PTR
+Sound_Sample *         T_PTR
+Sound_AudioInfo *      T_PTR
+SDL_RWops*             T_PTR
+SDL_svg_context*       T_PTR