esdl-1.2/0000755000076400010400000000000011540750060014222 5ustar familjenAdministratöreresdl-1.2/Configure-cygwin-mingw.sh0000755000076400010400000001562411540750057021135 0ustar familjenAdministratörer#! /bin/sh # Note that this script expects the cygwin version of echo etc OS=`uname -o` if [ X$OS != XCygwin ]; then echo "This script is supposed to be run in the" \ "cygwin environement on windows only." >&2 exit 1 fi echo -n "Checking basic sanity... " WORKDIR=`pwd` if [ ! -f "$WORKDIR/README-SDL.txt" ]; then echo "no." echo "You should have the esdl root directory as current when running" "this script." >&2 exit 1 fi echo "ok." echo -n "Trying to locate MinGW gcc... " MINGW32GCC=`which mingw32-gcc 2>/dev/null` if [ -z "$MINGW32GCC" ]; then echo "no." echo "You need MinGW in your path." >&2 echo "Alter your PATH either globally or in cygwin to include MinGW" >&2 exit 1 fi echo $MINGW32GCC echo -n "Checking some more about MinGW... " MINGWROOT=`echo $MINGW32GCC | sed 's,/bin/mingw32-gcc$,,g'` if [ -z "$MINGWROOT" ] ; then echo "failure." echo "The MinGW root directory cannot be located (!)" >&2 exit 1 fi GLINCLUDE=$MINGWROOT/include/GL if [ ! -f $GLINCLUDE/gl.h ]; then echo "failure." echo "gl.h not found in" $GLINCLUDE >&2 exit 1 fi GLLIB=$MINGWROOT/lib if [ ! -f $GLLIB/libopengl32.a ]; then echo "failure." echo "No libopengl32.a found in" $GLLIB >&2 exit 1 fi WMINGWROOT=`cygpath -m $MINGWROOT` WGLINCLUDE=`cygpath -m $GLINCLUDE` WGLLIB=`cygpath -m $GLLIB` echo "ok." echo -n "Checking for SDL..." SDLDLL=`which SDL.dll 2>/dev/null` if [ -z "$SDLDLL" ]; then echo "no." echo "The SDL.dll shared library is not in PATH" >&2 echo "The development version of the SDL libraries is needed" >&2 echo "and the DLL itself should be in the PATH, alter PATH" \ "globally or in cygwin" >&2 exit 1 fi echo $SDLDLL SDLROOT=`echo $SDLDLL | sed 's,/lib/SDL.dll$,,g'` SDLROOT=`echo $SDLROOT | sed 's,/bin/SDL.dll$,,g'` echo SDLROOT is $SDLROOT echo -n "checking some more on SDL..." if [ -z "$SDLROOT" ]; then echo "failed." echo "Could not locate root of SDL installation." >&2 echo "You probably do not have the development version of the" \ "SDL libraries" >&2 echo "early enough in your PATH. Alter the PATH to include the LIB of " >&2 echo "the *development libraries* before any other SDL.dll." >&2 exit 1 fi WSDLROOT=`cygpath -m $SDLROOT` SDLLIB=$SDLROOT/lib if [ -f $SDLLIB/SDL.lib ]; then SDL_LIBTYPE="msvc" SDL_LIBFLAGS=$WSDLROOT/lib/SDL.lib WSDLLIB=$WSDLROOT/lib elif [ -f $SDLLIB/libSDL.a ]; then SDL_LIBTYPE="mingw" SDL_LIBFLAGS="-L$WSDLROOT/lib -lSDL" WSDLLIB=$WSDLROOT/lib elif [ -f $SDLLIB/libSDL.dll.a ]; then SDL_LIBTYPE="mingw" SDL_LIBFLAGS="-L$WSDLROOT/lib -lSDL" WSDLLIB=$WSDLROOT/lib else echo "failed." echo "Could not find any import library for SDL." >&2 echo "Is this *really* the *development libraries* of SDL in the PATH?" >&2 exit 1 fi SDLINCLUDE=$SDLROOT/include if [ -f $SDLINCLUDE/SDL.h ]; then echo "ok." elif [ -f $SDLINCLUDE/SDL/SDL.h ]; then SDLINCLUDE=$SDLINCLUDE/SDL echo "ok." else echo "failed." echo "The header files are missing from SDL." >&2 echo "Is this *really* the *development libraries* of SDL in the PATH?" >&2 exit 1 fi WSDLINCLUDE=`cygpath -m $SDLINCLUDE` echo -n "Checking make... " CYGMAKE=`which make 2>/dev/null` if [ -z "$CYGMAKE" ]; then echo "no." echo "Unable to find make. It seems you need to install more cygwin" \ "packages..." >&2 exit 1 fi gnutest=`make --version | head -1 | awk '{print $1}'` if [ X$gnutest != XGNU ]; then echo "no." echo "The make you have in your path is not a GNU make." >&2 echo "Make sure Cygwin's GNU make is installed and prior to any other" \ "make in your path." >&2 exit 1 fi echo "ok." echo -n "Looking for working erlang... " ERLC=`which erlc 2>/dev/null` ERL=`which erl 2>/dev/null` require_major=5 require_minor=3 if [ -z "$ERLC" -o -z "$ERL" ]; then echo "no." echo "You need an erlang version of $require_major.$require_minor" \ "or higher in your PATH." >&2 exit 1 fi ERLTOP=`echo $ERL | sed 's,/bin/erl$,,g'` WERLTOP=`cygpath -d "$ERLTOP"` ERLTOP=`cygpath -u $WERLTOP` ERLC=$ERLTOP/bin/erlc ERL=$ERLTOP/bin/erl ERLINC=$ERLTOP/usr/include if [ ! -f $ERL -o ! -f $ERLC -o ! -d $ERLINC ]; then echo "no." echo "Path conversion failed. Unable to locate ERL_TOP correctly" \ "(bug?)." >&2 exit 1 fi major=0 minor=0 for x in $ERLTOP/erts-*; do ver=`echo $x | sed "s,^$ERLTOP/erts-,,g"` maj=`echo $ver | awk -F. '{print $1}'` min=`echo $ver | awk -F. '{print $2}'` if [ $maj -gt $major ]; then major=$maj fi if [ $min -gt $minor ]; then minor=$min fi done if [ $major -lt $require_major -o \ \( $major = $require_major -a $minor -lt $require_minor \) ]; then echo "no." echo "Your erlang version in PATH is too old." >&2 echo "At least $require_major.$require_minor is required." >&2 exit 1 fi echo "ok." echo echo "Found out:" echo "MinGW is in $MINGWROOT" echo "MinGWGCC is $MINGW32GCC" echo "OpenGL include dir $GLINCLUDE" echo "OpenGL lib dir $GLLIB" echo "SDL in $SDLROOT" echo "SDL style is $SDL_LIBTYPE" echo "SDL linkflags $SDL_LIBFLAGS" echo "SDL Include dir $SDLINCLUDE" echo "Cygwin Make is in $CYGMAKE" echo "Erlang is in $ERLTOP" echo echo -n "Creating some directories if non-existing... " CONFDIR="$WORKDIR/win32_conf" EBIN="$WORKDIR/ebin" PRIV="$WORKDIR/priv" for x in "$CONFDIR" "$EBIN" "$PRIV"; do if [ ! -d "$x" ]; then echo -n "$x" mkdir "$x" fi done WCONFDIR=`cygpath -m "$CONFDIR"` echo "ok." echo -n "Converting erlang headers for MinGW... " sed 's,##Params, Params,g' "$ERLINC/erl_win_dyn_driver.h" \ > "$CONFDIR/erl_win_dyn_driver.h" cp "$ERLINC/erl_driver.h" "$CONFDIR/erl_driver.h" echo "ok." MINGW_MAKEVARS="$CONFDIR/mingw_vars.mk" echo -n "Creating $MINGW_MAKEVARS... " echo '# Auto-generated -- DO NOT EDIT.' > "$MINGW_MAKEVARS" cat >> "$MINGW_MAKEVARS" < "$BUILDSCRIPT" echo '# Auto-generated, do not edit.' >> "$BUILDSCRIPT" cat >> "$BUILDSCRIPT" <&2 exit 1 fi echo -n "Checking basic sanity... " WORKDIR=`pwd` if [ ! -f "$WORKDIR/README-SDL.txt" ]; then echo "no." echo "You should have the esdl root directory as current when running" "this script." >&2 exit 1 fi echo "ok." echo -n "Trying to locate MinGW gcc... " MINGW32GCC=`which mingw32-gcc 2>/dev/null | sed 's,.exe$,,g'` if [ -z "$MINGW32GCC" ]; then echo "no." echo "You need MinGW in your path." >&2 echo "Alter your PATH either globally or in msys to include MinGW" >&2 exit 1 fi echo $MINGW32GCC echo -n "Checking some more about MinGW... " MINGWROOT=`echo $MINGW32GCC | sed 's,/bin/mingw32-gcc$,,g'` if [ -z "$MINGWROOT" ] ; then echo "failure." echo "The MinGW root directory cannot be located (!)" >&2 exit 1 fi GLINCLUDE=$MINGWROOT/include/GL if [ ! -f $GLINCLUDE/gl.h ]; then echo "failure." echo "gl.h not found in" $GLINCLUDE >&2 exit 1 fi GLLIB=$MINGWROOT/lib if [ ! -f $GLLIB/libopengl32.a ]; then echo "failure." echo "No libopengl32.a found in" $GLLIB >&2 exit 1 fi echo "ok." echo -n "Checking for SDL..." SDLDLL=`which SDL.dll 2>/dev/null` if [ -z "$SDLDLL" ]; then echo "no." echo "The SDL.dll shared library is not in PATH" >&2 echo "The development version of the SDL libraries is needed" >&2 echo "and the DLL itself should be in the PATH, alter PATH" \ "globally or in msys" >&2 exit 1 fi echo $SDLDLL SDLROOT=`echo $SDLDLL | sed 's,/lib/SDL.dll$,,g'` SDLROOT=`echo $SDLROOT | sed 's,/bin/SDL.dll$,,g'` echo SDLROOT is $SDLROOT echo -n "checking some more on SDL..." if [ -z "$SDLROOT" ]; then echo "failed." echo "Could not locate root of SDL installation." >&2 echo "You probably do not have the development version of the" \ "SDL libraries" >&2 echo "early enough in your PATH. Alter the PATH to include the LIB of " >&2 echo "the *development libraries* before any other SDL.dll." >&2 exit 1 fi SDLLIB=$SDLROOT/lib if [ -f $SDLLIB/SDL.lib ]; then SDL_LIBTYPE="msvc" SDL_LIBFLAGS=$SDLROOT/lib/SDL.lib WSDLLIB=$WSDLROOT/lib elif [ -f $SDLLIB/libSDL.a ]; then SDL_LIBTYPE="mingw" SDL_LIBFLAGS="-L$SDLROOT/lib -lSDL" WSDLLIB=$WSDLROOT/lib elif [ -f $SDLLIB/libSDL.dll.a ]; then SDL_LIBTYPE="mingw" SDL_LIBFLAGS="-L$SDLROOT/lib -lSDL" WSDLLIB=$WSDLROOT/lib else echo "failed." echo "Could not find any import library for SDL." >&2 echo "Is this *really* the *development libraries* of SDL in the PATH?" >&2 exit 1 fi SDLINCLUDE=$SDLROOT/include if [ -f $SDLINCLUDE/SDL.h ]; then echo "ok." elif [ -f $SDLINCLUDE/SDL/SDL.h ]; then SDLINCLUDE=$SDLINCLUDE/SDL echo "ok." else echo "failed." echo "The header files are missing from SDL." >&2 echo "Is this *really* the *development libraries* of SDL in the PATH?" >&2 exit 1 fi echo -n "Checking make... " CYGMAKE=`which make 2>/dev/null | sed 's,.exe$,,g'` if [ -z "$CYGMAKE" ]; then echo "no." echo "Unable to find make. It seems you need to install more msys packages" \ "packages..." >&2 exit 1 fi gnutest=`make --version | head -1 | awk '{print $1}'` if [ X$gnutest != XGNU ]; then echo "no." echo "The make you have in your path is not a GNU make." >&2 echo "Make sure GNU make is installed and prior to any other" \ "make in your path." >&2 exit 1 fi echo "ok." echo -n "Looking for working erlang... " ERLC=`which erlc 2>/dev/null | sed 's,.exe$,,g'` ERL=`which erl 2>/dev/null | sed 's,.exe$,,g'` require_major=5 require_minor=3 if [ -z "$ERLC" -o -z "$ERL" ]; then echo "no." echo "You need an erlang version of $require_major.$require_minor" \ "or higher in your PATH." >&2 exit 1 fi ERLTOP=`echo $ERL | sed 's,/bin/erl$,,g'` ERLINC=$ERLTOP/usr/include echo "ok." echo echo "Found out:" echo "MinGW is in $MINGWROOT" echo "MinGWGCC is $MINGW32GCC" echo "OpenGL include dir $GLINCLUDE" echo "OpenGL lib dir $GLLIB" echo "SDL in $SDLROOT" echo "SDL style is $SDL_LIBTYPE" echo "SDL linkflags $SDL_LIBFLAGS" echo "SDL Include dir $SDLINCLUDE" echo "Make is in $CYGMAKE" echo "Erlang is in $ERLTOP" echo echo -n "Creating some directories if non-existing... " CONFDIR="$WORKDIR/win32_conf" EBIN="$WORKDIR/ebin" PRIV="$WORKDIR/priv" for x in "$CONFDIR" "$EBIN" "$PRIV"; do if [ ! -d "$x" ]; then echo -n "$x" mkdir "$x" fi done echo "ok." echo -n "Converting erlang headers for MinGW... " sed 's,##Params, Params,g' "$ERLINC/erl_win_dyn_driver.h" \ > "$CONFDIR/erl_win_dyn_driver.h" cp "$ERLINC/erl_driver.h" "$CONFDIR/erl_driver.h" echo "ok." MINGW_MAKEVARS="$CONFDIR/mingw_vars.mk" echo -n "Creating $MINGW_MAKEVARS... " echo '# Auto-generated -- DO NOT EDIT.' > "$MINGW_MAKEVARS" cat >> "$MINGW_MAKEVARS" < "$BUILDSCRIPT" echo '# Auto-generated, do not edit.' >> "$BUILDSCRIPT" cat >> "$BUILDSCRIPT" < #ifdef WIN32 #include /* needed by Windows' gl.h etc */ #endif #include #include "esdl_conv.h" #define MAXBUFF 8000000 /* Covers 1600x1200x4 (32bits) */ #define error() {fprintf(stderr, "Error in %s:%d \n\r", __FILE__, __LINE__); return;} typedef struct sdl_data_def *sdl_data_ptr; typedef void (*sdl_fun)(sdl_data_ptr, int, char*); typedef sdl_fun (*sdl_load_fun)(void); typedef struct { char* base; size_t size; ErlDrvBinary* bin; } EsdlBinRef; typedef struct sdl_data_def { void* driver_data; /* Port or Driver specific data */ int use_smp; /* Use a thread for opengl commands */ sdl_fun* fun_tab; /* Pointers to functions */ char** str_tab; /* Pointers to function names */ int op; /* Current (or last) function */ int len; /* Length of message buffer */ void* buff; /* Pointer to message buffer */ void* temp_bin; /* Temporary binary */ EsdlBinRef bin[3]; /* Argument binaries */ int next_bin; /* Next binary */ #ifdef _OSX_COCOA void* release_pool; void* app; #endif } sdl_data; void sdl_send(sdl_data *, int); char* sdl_getbuff(sdl_data*, int); char* sdl_get_temp_buff(sdl_data*, int); void sdl_free_binaries(sdl_data*); void init_fps(sdl_data*); void gl_dispatch(sdl_data *, int, int, char *); void es_init_opengl(sdl_data *, int, char *); void start_opengl_thread(sdl_data *); void stop_opengl_thread(); void * esdl_gl_sync(); /* These must exactly match those in src/esdl.hrl */ #define SDL_H 20 #define VIDEO_H 30 #define EVENTS_H 100 #define MOUSE_H 110 #define KEYBOARD_H 120 #define ACTIVE_H 130 #define JOYSTICK_H 133 #define AUDIO_H 150 #define SDL_UTIL_H 180 #define TTF_H 200 #define IMG_H 300 #define MAX_FUNCTIONS_H 400 /* Current Max.. Increase if needed */ #define OPENGL_START 5000 /* see wx/c_src/wxe_driver.h */ #define SDL_InitFunc (SDL_H + 1) #define SDL_QuitFunc (SDL_InitFunc + 1) #define SDL_GetErrorFunc (SDL_QuitFunc + 1) #define ESDL_OpenglInitFunc (SDL_GetErrorFunc + 1) #include "esdl_video.h" #include "esdl_events.h" #include "esdl_audio.h" #include "esdl_util.h" #include "esdl_ttf.h" #include "esdl_img.h" void es_init(sdl_data *sd, int len, char * buff); void es_quit(sdl_data *sd, int len, char * buff); void es_getError(sdl_data *sd, int len, char *buff); void esdl_init_native_gui(); #endif #ifdef __cplusplus } #endif esdl-1.2/c_src/esdl_audio.c0000644000076400010400000001430611540750057017601 0ustar familjenAdministratörer/* * Copyright (c) 2001 Dan Gudmundsson * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * * $Id$ */ /* Map erl esdl_events calls to C sdl calls */ #include "esdl.h" #include #include struct { Uint8 *sound; /* Pointer to wave data */ Uint32 soundlen; /* Length of wave data */ int repeat; /* Play sample 'repeat' times */ int soundpos; /* Current play position */ Uint8 silence; } wave; void play_audio(sdl_data *sd, int len, char *buff) { char *bp, *start; int sendlen; void * sbuff; bp = buff; SDL_LockAudio(); POPGLPTR(sbuff, bp); wave.sound = sbuff; wave.soundlen = get32be(bp); wave.repeat = get32be(bp); wave.soundpos = 0; SDL_UnlockAudio(); bp = start = sdl_getbuff(sd, 0); sendlen = bp - start; sdl_send(sd, sendlen); } void myaudiomixer(void *mydata, Uint8 *stream, int len) { Uint8 *waveptr; int waveleft; if(wave.sound != NULL && wave.repeat != 0) { /* Set up the pointers */ waveptr = wave.sound + wave.soundpos; waveleft = wave.soundlen - wave.soundpos; /* fprintf(stderr, "ED1 0x%X %d 0x%X %d repeat %d\n\r", stream, len, waveptr, waveleft, wave.repeat); */ /* Go! */ while( waveleft < len ) { memcpy(stream, waveptr, waveleft); /* SDL_MixAudio(stream, waveptr, waveleft, SDL_MIX_MAXVOLUME); */ stream += waveleft; len -= waveleft; waveptr = wave.sound; waveleft = wave.soundlen; wave.soundpos = 0; if((wave.repeat -= 1) == 0) { memset(stream, wave.silence, len); break; } } if(wave.repeat != 0) { /* fprintf(stderr, "ED2 0x%X %d 0x%X %d repeat %d\n\r", stream, len, waveptr, waveleft, wave.repeat); */ memcpy(stream, waveptr, len); /* SDL_MixAudio(stream, waveptr, len, SDL_MIX_MAXVOLUME); */ wave.soundpos += len; } } else { memset(stream, wave.silence, len); } } /* API */ void es_audioDriverName(sdl_data *sd, int len, char *bp) { int sendlen = 0; bp = sdl_get_temp_buff(sd, 256); if (SDL_AudioDriverName(bp, 256) != NULL) { sendlen = strlen(bp); } sdl_send(sd, sendlen); } void es_openAudio(sdl_data *sd, int len, char *buff) { int sendlen; char *bp, *start; int ff; SDL_AudioSpec desired, obtained, *obptr; bp = buff; ff = get8(bp); desired.freq = get32be(bp); desired.format = get16be(bp); desired.channels = get8(bp); desired.samples = get16be(bp); desired.padding = get16be(bp); desired.callback = myaudiomixer; /* Init the global data structures */ wave.sound = NULL; wave.soundpos = 0; wave.soundlen = 0; if(ff == 1) /* Force the requested format */ obptr = NULL; else obptr = &obtained; bp = start = sdl_getbuff(sd, 16); if( SDL_OpenAudio(&desired, obptr) < 0 ) { fprintf(stderr, "Couldn't open audio: %s\n", SDL_GetError()); } else { if(ff == 1) obptr = &desired; put32be(bp, obptr->freq); put16be(bp, obptr->format); put8(bp, obptr->channels); put8(bp, obptr->silence); put16be(bp, obptr->samples); put16be(bp, obptr->padding); put32be(bp, obptr->size); wave.silence = obptr->silence; } sendlen = bp - start; sdl_send(sd, sendlen); } void es_getAudioStatus(sdl_data *sd, int len, char *buff) { int sendlen; char *bp, *start; SDL_audiostatus s; s = SDL_GetAudioStatus(); start = bp = sdl_getbuff(sd, 1); put8(bp, s); sendlen = bp - start; sdl_send(sd, sendlen); } void es_pauseAudio(sdl_data *sd, int len, char *buff) { char *bp; int pause; bp = buff; pause = get8(bp); SDL_PauseAudio(pause); } void es_loadWAV(sdl_data *sd, int len, char *bp) { int sendlen; char *name, *start; SDL_AudioSpec obtained; Uint8 * ptr; Uint32 blen; name = bp; bp = start = sdl_get_temp_buff(sd, 28); if(NULL != SDL_LoadWAV(name, &obtained, &ptr, &blen)) { put32be(bp, obtained.freq); put16be(bp, obtained.format); put8(bp, obtained.channels); put8(bp, obtained.silence); put16be(bp, obtained.samples); put16be(bp, obtained.padding); put32be(bp, obtained.size); PUSHGLPTR(ptr, bp); put32be(bp, blen); } sendlen = bp - start; sdl_send(sd, sendlen); } void es_loadWAVRW(sdl_data *sd, int len, char *buff) { error(); } void es_freeWAV(sdl_data *sd, int len, char *buff) { char *bp; void *ptr; bp = buff; POPGLPTR(ptr, bp); SDL_FreeWAV(ptr); } void es_buildAudioCVT(sdl_data *sd, int len, char *buff) { error(); } void es_convertAudio(sdl_data *sd, int len, char *buff) { char *bp, *start; void *mptr; Uint16 oformat, nformat; Uint8 ochannels, nchannels; int ofreq, nfreq, osize, nsize; SDL_AudioCVT wav_cvt; int sendlen; bp = buff; oformat = get16be(bp); ochannels = get8(bp); ofreq = get32be(bp); nformat = get16be(bp); nchannels = get8(bp); nfreq = get32be(bp); POPGLPTR(mptr, bp); osize = get32be(bp); bp = start = sdl_getbuff(sd, 12); /* Build AudioCVT */ if(SDL_BuildAudioCVT(&wav_cvt,oformat, ochannels, ofreq, nformat, nchannels, nfreq) >= 0) { /* Setup for conversion */ nsize = osize*wav_cvt.len_mult; wav_cvt.buf=(Uint8 *)malloc(nsize); if(wav_cvt.buf != NULL) { wav_cvt.len=osize; memcpy(wav_cvt.buf, mptr, osize); if (SDL_ConvertAudio(&wav_cvt) >= 0) { PUSHGLPTR(wav_cvt.buf, bp); put32be(bp, nsize); } } } sendlen = bp - start; sdl_send(sd, sendlen); } void es_mixAudio(sdl_data *sd, int len, char *buff) { error(); } void es_lockAudio(sdl_data *sd, int len, char *buff) { error(); } void es_unlockAudio(sdl_data *sd, int len, char *buff) { error(); } void es_closeAudio(sdl_data *sd, int len, char *buff) { SDL_CloseAudio(); } esdl-1.2/c_src/esdl_audio.h0000644000076400010400000000336411540750057017610 0ustar familjenAdministratörer/* * Copyright (c) 2001 Dan Gudmundsson * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * * * $Id$ */ /* Defines the audio functions */ /* Used for switching */ #ifdef __cplusplus extern "C" { #endif #define SDL_AudioDriverNameFunc AUDIO_H +1 void es_audioDriverName(sdl_data *, int, char *); #define SDL_OpenAudioFunc SDL_AudioDriverNameFunc +1 void es_openAudio(sdl_data *, int, char *); #define SDL_GetAudioStatusFunc SDL_OpenAudioFunc +1 void es_getAudioStatus(sdl_data *, int, char *); #define SDL_PauseAudioFunc SDL_GetAudioStatusFunc +1 void es_pauseAudio(sdl_data *, int, char *); #define SDL_LoadWAVFunc SDL_PauseAudioFunc +1 void es_loadWAV(sdl_data *, int, char *); #define SDL_LoadWAV_RWFunc SDL_LoadWAVFunc +1 void es_loadWAV(sdl_data *, int, char *); #define SDL_FreeWAVFunc SDL_LoadWAV_RWFunc +1 void es_freeWAV(sdl_data *, int, char *); #define SDL_BuildAudioCVTFunc SDL_FreeWAVFunc +1 void es_buildAudioCVT(sdl_data *, int, char *); #define SDL_ConvertAudioFunc SDL_BuildAudioCVTFunc +1 void es_convertAudio(sdl_data *, int, char *); #define SDL_MixAudioFunc SDL_ConvertAudioFunc +1 void es_mixAudio(sdl_data *, int, char *); #define SDL_LockAudioFunc SDL_MixAudioFunc +1 void es_lockAudio(sdl_data *, int, char *); #define SDL_UnlockAudioFunc SDL_LockAudioFunc +1 void es_unlockAudio(sdl_data *, int, char *); #define SDL_CloseAudioFunc SDL_UnlockAudioFunc +1 void es_closeAudio(sdl_data *, int, char *); #define play_audioFunc SDL_CloseAudioFunc +1 void play_audio(sdl_data *, int, char *); #ifdef __cplusplus } #endif esdl-1.2/c_src/esdl_conv.h0000644000076400010400000000612411540750057017451 0ustar familjenAdministratörer/* * Copyright (c) 2001 Dan Gudmundsson * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * * $Id$ */ /*************************** Some Macros to the byte conversion between the byte buffer and real types. This code is borrowed from the erl_interface file putget.h ****************************/ #ifdef __cplusplus extern "C" { #endif #ifndef BYTECONV_H #define BYTECONV_H #ifndef FLAVOUR_WOGGLE #include #endif #define put8(s,n) do { \ (s)[0] = (char)((n) & 0xff); \ (s) += 1; \ } while (0) #define put16le(s,n) do { \ (s)[0] = (n) & 0xff; \ (s)[1] = ((n) >> 8) & 0xff; \ (s) += 2; \ } while (0) \ #define put32le(s,n) do { \ (s)[0] = (n) & 0xff; \ (s)[1] = ((n) >> 8) & 0xff; \ (s)[2] = ((n) >> 16) & 0xff; \ (s)[3] = ((n) >> 24) & 0xff; \ (s) += 4; \ } while (0) #define put16be(s,n) do { \ (s)[0] = ((n) >> 8) & 0xff; \ (s)[1] = (n) & 0xff; \ (s) += 2; \ } while (0) #define put32be(s,n) do { \ (s)[0] = ((n) >> 24) & 0xff; \ (s)[1] = ((n) >> 16) & 0xff; \ (s)[2] = ((n) >> 8) & 0xff; \ (s)[3] = (n) & 0xff; \ (s) += 4; \ } while (0) #define get8(s) \ ((s) += 1, \ ((unsigned char *)(s))[-1] & 0xff) #define get16le(s) \ ((s) += 2, \ (((((unsigned char *)(s))[-1] << 8) | \ ((unsigned char *)(s))[-2])) & 0xffff) #define get32le(s) \ ((s) += 4, \ ((((unsigned char *)(s))[-1] << 24) | \ (((unsigned char *)(s))[-2] << 16) | \ (((unsigned char *)(s))[-3] << 8) | \ ((unsigned char *)(s))[-4])) #define get16be(s) \ ((s) += 2, \ (((((unsigned char *)(s))[-2] << 8) | \ ((unsigned char *)(s))[-1])) & 0xffff) #define get32be(s) \ ((s) += 4, \ ((((unsigned char *)(s))[-4] << 24) | \ (((unsigned char *)(s))[-3] << 16) | \ (((unsigned char *)(s))[-2] << 8) | \ ((unsigned char *)(s))[-1])) #if SDL_BYTEORDER == SDL_BIG_ENDIAN #define putFloat32be(s,n) do { \ unsigned char * t = (unsigned char *) &n; \ (s)[0] = t[0]; \ (s)[1] = t[1];\ (s)[2] = t[2];\ (s)[3] = t[3];\ (s) += 4; \ } while (0) #define putFloat64be(s,n) do { \ unsigned char * t = (unsigned char *) &n; \ (s)[0] = t[0]; \ (s)[1] = t[1]; \ (s)[2] = t[2]; \ (s)[3] = t[3]; \ (s)[4] = t[4]; \ (s)[5] = t[5]; \ (s)[6] = t[6]; \ (s)[7] = t[7]; \ (s) += 8; \ } while (0) #else #define putFloat32be(s,n) do { \ unsigned char * t = (unsigned char *) &n; \ (s)[3] = t[0];\ (s)[2] = t[1];\ (s)[1] = t[2];\ (s)[0] = t[3];\ (s) += 4; \ } while (0) #define putFloat64be(s,n) do { \ unsigned char * t = (unsigned char *) &n; \ (s)[7] = t[0]; \ (s)[6] = t[1]; \ (s)[5] = t[2]; \ (s)[4] = t[3]; \ (s)[3] = t[4]; \ (s)[2] = t[5]; \ (s)[1] = t[6]; \ (s)[0] = t[7]; \ (s) += 8; \ } while (0) #endif #endif #ifdef __cplusplus } #endif esdl-1.2/c_src/esdl_driver.c0000644000076400010400000001764711540750057020006 0ustar familjenAdministratörer/* * Copyright (c) 2001 Dan Gudmundsson * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * * $Id$ */ #ifdef HAVE_CONFIG_H # include "config.h" #endif #include #include #include #ifdef _WIN32 #include #include #else #include #endif #ifdef _OSX_COCOA //#include "CPS.h" //#include "SDLMain.h" #include #include #endif #include #include #include #include "esdl.h" #define TEMP_BINARY_SIZE 512 static ErlDrvData sdl_driver_start(ErlDrvPort port, char *buff); static void sdl_driver_stop(ErlDrvData handle); static void sdl_driver_finish(void); static int sdl_driver_control(ErlDrvData handle, unsigned int command, char* buf, int count, char** res, int res_size); static int sdl_driver_debug_control(ErlDrvData handle, unsigned int command, char* buf, int count, char** res, int res_size); static void standard_outputv(ErlDrvData drv_data, ErlIOVec *ev); /* ** The driver struct */ static ErlDrvEntry sdl_driver_entry = { NULL, /* F_PTR init, N/A */ sdl_driver_start, /* L_PTR start, called when port is opened */ sdl_driver_stop, /* F_PTR stop, called when port is closed */ NULL, /* F_PTR output, called when erlang has sent */ NULL, /* F_PTR ready_input, called when input descriptor ready */ NULL, /* F_PTR ready_output, called when output descriptor ready */ "sdl_driver", /* char *driver_name, the argument to open_port */ sdl_driver_finish, /* F_PTR finish, called when unloaded */ NULL, /* void * that is not used (BC) */ sdl_driver_control, /* F_PTR control, port_control callback */ NULL, /* F_PTR timeout, reserved */ standard_outputv, /* F_PTR outputv, reserved */ }; DRIVER_INIT(sdl_driver) { return &sdl_driver_entry; } static ErlDrvData sdl_driver_start(ErlDrvPort port, char *buff) { sdl_data *data; ErlDrvSysInfo info; #ifdef _WIN32 if ( SDL_RegisterApp("Erlang SDL", CS_BYTEALIGNCLIENT, GetModuleHandle(NULL)) < 0 ) { fprintf(stderr, "WinMain() error %s \n", SDL_GetError()); return(ERL_DRV_ERROR_GENERAL); } #endif /* _WIN32 */ data = malloc(sizeof(sdl_data)); if (data == NULL) { fprintf(stderr, " Couldn't alloc mem\r\n"); return(ERL_DRV_ERROR_GENERAL); /* ENOMEM */ } set_port_control_flags(port, PORT_CONTROL_FLAG_BINARY); data->driver_data = port; // data->fns = init_fps(); data->op = 0; data->len = 0; data->buff = NULL; data->temp_bin = driver_alloc_binary(TEMP_BINARY_SIZE); data->next_bin = 0; driver_system_info(&info, sizeof(ErlDrvSysInfo)); #ifdef _OSX_COCOA data->use_smp = info.smp_support; #else data->use_smp = info.smp_support && info.scheduler_threads > 1; #endif // fprintf(stderr, "Use smp %d\r\n", data->use_smp); if(data->use_smp) { start_opengl_thread(data); } else { // The following code needs to called from main thread esdl_init_native_gui(); } init_fps(data); return (ErlDrvData) data; } #ifdef _OSX_COCOA extern OSErr CPSSetProcessName (ProcessSerialNumber *psn, char *processname); #endif void esdl_init_native_gui() { #ifdef _OSX_COCOA ProcessSerialNumber psn; NSAutoreleasePool *pool; // [[NSProcessInfo processInfo] setProcessName:@"Erlang"]; // Enable GUI GetCurrentProcess(&psn); CPSSetProcessName(&psn, "Erlang"); // Undocumented function (but above doesn't work) TransformProcessType(&psn, kProcessTransformToForegroundApplication); SetFrontProcess(&psn); // Enable Cocoa calls from Carbon app NSApplicationLoad(); // Setup and enable gui pool = [[NSAutoreleasePool alloc] init]; NSApplication *app = [NSApplication sharedApplication]; // Load and set icon //NSMutableString *file = [[NSMutableString alloc] init]; //[file appendFormat:@"%s/%s", erl_wx_privdir, "erlang-logo64.png"]; //[file appendFormat:@"%s/%s", "/usr/local/lib/erlang/lib/wx-0.98.8/priv", "erlang-logo64.png"]; //NSImage *icon = [[NSImage alloc] initWithContentsOfFile: file]; //[app setApplicationIconImage: icon]; [app activateIgnoringOtherApps: YES]; #endif /* _OSX_COCOA */ } static void sdl_driver_stop(ErlDrvData handle) { sdl_data *sd = ((sdl_data *)handle); if(sd->use_smp) stop_opengl_thread(); else SDL_Quit(); free(sd->fun_tab); free(sd->str_tab); #ifdef _WIN32 UnregisterClass("Erlang SDL", GetModuleHandle(NULL)); #endif /* _WIN32 */ free(handle); } static void sdl_driver_finish(void) { } static int sdl_driver_control(ErlDrvData handle, unsigned op, char* buf, int count, char** res, int res_size) { sdl_data* sd = (sdl_data *) handle; sdl_fun func; sd->buff = NULL; sd->len = 0; sd->op = op; if(op < OPENGL_START) { // fprintf(stderr, "Command:%d:%s: ", op, sd->str_tab[op]);fflush(stderr); func = sd->fun_tab[op]; func(sd, count, buf); } else { // fprintf(stderr, "Command:%d:gl_??\r\n", op); fflush(stderr); gl_dispatch(sd, op, count, buf); sdl_free_binaries(sd); } // fprintf(stderr, "%s:%d: Eed %d\r\n", __FILE__,__LINE__,op); fflush(stderr); (*res) = sd->buff; return sd->len; } static int sdl_driver_debug_control(ErlDrvData handle, unsigned op, char* buf, int count, char** res, int res_size) { sdl_data* sd = (sdl_data *) handle; sdl_fun func; int len; sd->buff = NULL; sd->len = 0; sd->op = op; if(op < OPENGL_START) { fprintf(stderr, "Command:%d:%s: ", op, sd->str_tab[op]);fflush(stderr); func = sd->fun_tab[op]; func(sd, count, buf); if ((len = sd->len) >= 0) { fprintf(stderr, "ok %d %p\r\n", len, sd->buff);fflush(stderr); (*res) = sd->buff; return len; } else { fprintf(stderr, "error\r\n");fflush(stderr); *res = 0; return -1; } } else { fprintf(stderr, "Command:%d ", op);fflush(stderr); gl_dispatch(sd, op, count, buf); sdl_free_binaries(sd); fprintf(stderr, "\r\n");fflush(stderr); return 0; } } void sdl_send(sdl_data *sd, int len) { if (sd->buff == NULL) { fprintf(stderr, "ESDL INTERNAL ERROR: sdl_send in %s sent NULL buffer: %d\r\n", sd->str_tab[sd->op], len); abort(); } if (len > sd->len) { fprintf(stderr, "ESDL INTERNAL ERROR: sdl_send in %s allocated %d sent %d\r\n", sd->str_tab[sd->op], sd->len, len); abort(); } /* Workaround that driver_control doesn't check length */ ((ErlDrvBinary *) sd->buff)->orig_size = len; sd->len = len; } char* sdl_getbuff(sdl_data *sd, int size) { ErlDrvBinary* bin; sd->len = size; bin = driver_alloc_binary(size); sd->buff = bin; /* And return the pointer to the bytes */ return bin->orig_bytes; } char* sdl_get_temp_buff(sdl_data* sd, int size) { if (size > TEMP_BINARY_SIZE) { return sdl_getbuff(sd, size); } else { ErlDrvBinary* bin = (ErlDrvBinary *) sd->temp_bin; driver_binary_inc_refc(bin); sd->buff = bin; sd->len = size; return bin->orig_bytes; } } void sdl_util_debug(sdl_data *sd, int len, char* bp) { if (*bp) { sdl_driver_entry.control = sdl_driver_debug_control; } else { sdl_driver_entry.control = sdl_driver_control; } } static void standard_outputv(ErlDrvData drv_data, ErlIOVec* ev) { sdl_data* sd = (sdl_data *) drv_data; ErlDrvBinary* bin; if (ev->vsize == 2) { int i = sd->next_bin; sd->bin[i].base = ev->iov[1].iov_base; sd->bin[i].size = ev->iov[1].iov_len; bin = ev->binv[1]; driver_binary_inc_refc(bin); /* Otherwise it could get deallocated */ sd->bin[i].bin = bin; sd->next_bin++; } } void sdl_free_binaries(sdl_data* sd) { int i; for (i = sd->next_bin - 1; i >= 0; i--) { driver_free_binary(sd->bin[i].bin); } sd->next_bin = 0; } esdl-1.2/c_src/esdl_events.c0000644000076400010400000003733511540750057020013 0ustar familjenAdministratörer/* * Copyright (c) 2001 Dan Gudmundsson * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * * * $Id$ */ /* * Map erl esdl_events calls to C sdl calls */ #include "esdl.h" #include #define MAX_EVENT_SIZE 13 /* Foward decls */ static char* encode_event(const SDL_Event * , char *); /* API */ void es_pumpEvents(sdl_data *sd, int len, char *buff) { if(sd->use_smp) gl_dispatch(sd, SDL_PumpEventsFunc, len, buff); else SDL_PumpEvents(); } void es_peepEvents(sdl_data *sd, int len, char *bp) { if(sd->use_smp) gl_dispatch(sd, SDL_PeepEventsFunc, len, bp); else es_peepEvents2(sd->driver_data, driver_caller(sd->driver_data), bp); } void es_peepEvents2(ErlDrvPort port, ErlDrvTermData caller, char *bp) { SDL_Event events[256]; int numevents, res, i, sz; Uint32 mask; char *start; ErlDrvBinary * bin; ErlDrvTermData rt[8]; mask = * (Uint32 *) bp; bp += sizeof(Uint32); numevents = *bp++; SDL_PumpEvents(); res = SDL_PeepEvents(events, numevents, SDL_GETEVENT, mask); bin = driver_alloc_binary(res*MAX_EVENT_SIZE); bp = start = bin->orig_bytes; for (i = 0; i < res; i++) { bp = encode_event(&(events[i]), bp); } sz = bp-start; rt[0] = ERL_DRV_ATOM; rt[1]=driver_mk_atom((char *) "_esdl_result_"); rt[2] = ERL_DRV_BINARY; rt[3] = (ErlDrvTermData) bin; rt[4] = sz; rt[5] = 0; rt[6] = ERL_DRV_TUPLE; rt[7] = 2; driver_send_term(port,caller,rt,8); driver_free_binary(bin); } void es_pollEvent(sdl_data *sd, int len, char *buff) { if(sd->use_smp) gl_dispatch(sd, SDL_PollEventFunc, len, buff); else es_pollEvent2(sd->driver_data, driver_caller(sd->driver_data)); } void es_pollEvent2(ErlDrvPort port, ErlDrvTermData caller) { SDL_Event event; ErlDrvTermData rt[8]; ErlDrvBinary * bin; char *bp, *start; int sz; bin = driver_alloc_binary(MAX_EVENT_SIZE); bp = start = bin->orig_bytes; if (SDL_PollEvent(&event)) { bp = encode_event(&event, bp); } sz = bp-start; rt[0] = ERL_DRV_ATOM; rt[1]=driver_mk_atom((char *) "_esdl_result_"); rt[2] = ERL_DRV_BINARY; rt[3] = (ErlDrvTermData) bin; rt[4] = sz; rt[5] = 0; rt[6] = ERL_DRV_TUPLE; rt[7] = 2; driver_send_term(port,caller,rt,8); driver_free_binary(bin); } void es_waitEvent(sdl_data *sd, int len,char *buff) { if(sd->use_smp) gl_dispatch(sd, SDL_WaitEventFunc, len, buff); else es_waitEvent2(sd->driver_data, driver_caller(sd->driver_data)); } void es_waitEvent2(ErlDrvPort port, ErlDrvTermData caller) { SDL_Event event; ErlDrvBinary * bin; ErlDrvTermData rt[8]; char *bp, *start; int sz; bin = driver_alloc_binary(MAX_EVENT_SIZE); bp = start = bin->orig_bytes; SDL_WaitEvent(&event); bp = encode_event(&event, bp); sz = bp-start; rt[0] = ERL_DRV_ATOM; rt[1]=driver_mk_atom((char *) "_esdl_result_"); rt[2] = ERL_DRV_BINARY; rt[3] = (ErlDrvTermData) bin; rt[4] = sz; rt[5] = 0; rt[6] = ERL_DRV_TUPLE; rt[7] = 2; driver_send_term(port,caller,rt,8); driver_free_binary(bin); } void es_eventState(sdl_data *sd, int len, char *bp) { Uint8 type, res; int sendlen, state; char *start; type = get8(bp); state = get8(bp); res = SDL_EventState(type, state); bp = start = sdl_get_temp_buff(sd, 1); put8(bp, res); sendlen = bp - start; sdl_send(sd, sendlen); } /* API from the other files e.g. mouse keyboard active */ void es_getAppState(sdl_data *sd, int len,char *buff) { int sendlen; char *bp, *start; Uint8 state; bp = start = sdl_get_temp_buff(sd, 1); state = SDL_GetAppState(); put8(bp, state); sendlen = bp - start; sdl_send(sd, sendlen); } void es_enableUNICODE(sdl_data *sd, int len,char *buff) { int sendlen; char *bp, *start; Uint8 enable; bp = buff; enable = get8(bp); bp = start = sdl_get_temp_buff(sd, 1); enable = SDL_EnableUNICODE(enable); put8(bp, enable); sendlen = bp - start; sdl_send(sd, sendlen); } void es_enableKeyRepeat(sdl_data *sd, int len,char *buff) { int sendlen; char *bp, *start; Uint16 delay, intv, res; bp = buff; delay = get16be(bp); intv = get16be(bp); bp = start = sdl_get_temp_buff(sd, 1); res = SDL_EnableKeyRepeat(delay, intv); put8(bp, res); sendlen = bp - start; sdl_send(sd, sendlen); } void es_getKeyName(sdl_data *sd, int len,char *buff) { int sendlen; char *bp, *start, *name; Uint16 key; bp = buff; key = get16be(bp); bp = start = sdl_get_temp_buff(sd, 128); name = SDL_GetKeyName(key); while(*name != '\0') { put8(bp, *name); name++; } sendlen = bp - start; sdl_send(sd, sendlen); } void es_getKeyState(sdl_data *sd, int len,char *buff) { Uint8 * keys; char *bp, *start; int length, sendlen, i; keys = SDL_GetKeyState(&length); bp = start = sdl_get_temp_buff(sd, length); for(i=0; iuse_smp) { es_showCursor2(sd->driver_data, driver_caller(sd->driver_data), bp); } else { gl_dispatch(sd, SDL_ShowCursorFunc, len, bp); } } void es_showCursor2(ErlDrvPort port, ErlDrvTermData caller, char *bp) { Uint8 bool; ErlDrvTermData rt[8]; bool = (Uint8) *bp; bool = SDL_ShowCursor(bool); rt[0] = ERL_DRV_ATOM; rt[1]=driver_mk_atom((char *) "_esdl_result_"); rt[2] = ERL_DRV_INT; rt[3] = bool; rt[4] = ERL_DRV_TUPLE; rt[5] = 2; driver_send_term(port,caller,rt,6); } void es_numJoysticks(sdl_data *sd, int len,char *buff) { int sendlen; char *bp, *start; int joys; bp = buff; bp = start = sdl_get_temp_buff(sd, 1); joys = SDL_NumJoysticks(); put8(bp, joys); sendlen = bp - start; sdl_send(sd, sendlen); } void es_joystick_name(sdl_data *sd, int len,char *buff) { int sendlen; char *bp, *start; int index; const char * name; bp = buff; index = get8(bp); bp = start = sdl_get_temp_buff(sd, 256); name = SDL_JoystickName(index); index = 0; while(*name != '\0' && index++ < 256) { put8(bp, *name); name++; } sendlen = bp - start; sdl_send(sd, sendlen); } void es_joystick_open(sdl_data *sd, int len,char *buff) { int sendlen; char *bp, *start; SDL_Joystick *joy; int index; bp = buff; index = get8(bp); bp = start = sdl_get_temp_buff(sd, 8); if((joy = SDL_JoystickOpen(index)) != NULL) { PUSHGLPTR(joy, bp); } sendlen = bp - start; sdl_send(sd, sendlen); } void es_joystick_opened(sdl_data *sd, int len,char *buff) { int sendlen; char *bp, *start; int index, bool; bp = buff; index = get8(bp); bp = start = sdl_get_temp_buff(sd, 1); bool = SDL_JoystickOpened(index); put8(bp, bool); sendlen = bp - start; sdl_send(sd, sendlen); } void es_joystick_index(sdl_data *sd, int len,char *buff) { int sendlen; char *bp, *start; SDL_Joystick *joy; int index; bp = buff; POPGLPTR(joy, bp); bp = start = sdl_get_temp_buff(sd, 1); index = SDL_JoystickIndex(joy); put8(bp,index); sendlen = bp - start; sdl_send(sd, sendlen); } void es_joystick_numAxes(sdl_data *sd, int len,char *buff) { int sendlen; char *bp, *start; SDL_Joystick *joy; int axes; bp = buff; POPGLPTR(joy, bp); bp = start = sdl_get_temp_buff(sd, 1); axes = SDL_JoystickNumAxes(joy); put8(bp,axes); sendlen = bp - start; sdl_send(sd, sendlen); } void es_joystick_numBalls(sdl_data *sd, int len,char *buff) { int sendlen; char *bp, *start; SDL_Joystick *joy; int balls; bp = buff; POPGLPTR(joy, bp); bp = start = sdl_get_temp_buff(sd, 1); balls = SDL_JoystickNumBalls(joy); put8(bp,balls); sendlen = bp - start; sdl_send(sd, sendlen); } void es_joystick_numHats(sdl_data *sd, int len,char *buff) { int sendlen; char *bp, *start; SDL_Joystick *joy; int hats; bp = buff; POPGLPTR(joy, bp); bp = start = sdl_get_temp_buff(sd, 1); hats = SDL_JoystickNumHats(joy); put8(bp,hats); sendlen = bp - start; sdl_send(sd, sendlen); } void es_joystick_numButtons(sdl_data *sd, int len,char *buff) { int sendlen; char *bp, *start; SDL_Joystick *joy; int buttons; bp = buff; POPGLPTR(joy, bp); bp = start = sdl_get_temp_buff(sd, 1); buttons = SDL_JoystickNumButtons(joy); put8(bp,buttons); sendlen = bp - start; sdl_send(sd, sendlen); } void es_joystick_update(sdl_data *sd, int len,char *buff) { SDL_JoystickUpdate(); } void es_joystick_eventState(sdl_data *sd, int len,char *buff) { int sendlen; char *bp, *start; int state; bp = buff; state = get32be(bp); bp = start = sdl_get_temp_buff(sd, 4); state = SDL_JoystickEventState(state); put32be(bp, state); sendlen = bp - start; sdl_send(sd, sendlen); } void es_joystick_getAxis(sdl_data *sd, int len,char *buff) { int sendlen; char *bp, *start; SDL_Joystick *joy; int state, axis; bp = buff; POPGLPTR(joy, bp); axis = get8(bp); bp = start = sdl_get_temp_buff(sd, 4); state = SDL_JoystickGetAxis(joy, axis); put32be(bp, state); sendlen = bp - start; sdl_send(sd, sendlen); } void es_joystick_getHat(sdl_data *sd, int len,char *buff) { int sendlen; char *bp, *start; SDL_Joystick *joy; int state; Uint8 hat; bp = buff; POPGLPTR(joy, bp); hat = get8(bp); bp = start = sdl_get_temp_buff(sd, 1); state = SDL_JoystickGetHat(joy, hat); put8(bp,state); sendlen = bp - start; sdl_send(sd, sendlen); } void es_joystick_getButton(sdl_data *sd, int len,char *buff) { int sendlen; char *bp, *start; SDL_Joystick *joy; int state; Uint8 button; bp = buff; POPGLPTR(joy, bp); button = get8(bp); bp = start = sdl_get_temp_buff(sd, 1); state = SDL_JoystickGetButton(joy, button); put8(bp,state); sendlen = bp - start; sdl_send(sd, sendlen); } void es_joystick_getBall(sdl_data *sd, int len,char *buff) { int sendlen; char *bp, *start; SDL_Joystick *joy; int dx, dy; Uint8 ball; bp = buff; POPGLPTR(joy, bp); ball = get8(bp); bp = start = sdl_get_temp_buff(sd, 8); if(0 == SDL_JoystickGetBall(joy, ball, &dx, &dy)) { put32be(bp, dx); put32be(bp, dy); } sendlen = bp - start; sdl_send(sd, sendlen); } void es_joystick_close(sdl_data *sd, int len,char *buff) { char *bp; SDL_Joystick *joy; bp = buff; POPGLPTR(joy, bp); SDL_JoystickClose(joy); } /* Internals */ static char* encode_event(const SDL_Event * ev, char * bp) { switch(ev->type) { case SDL_ACTIVEEVENT: /* Application loses/gains visibility */ put8(bp, SDL_ACTIVEEVENT); put8(bp, ev->active.gain); put8(bp, ev->active.state); break; case SDL_KEYDOWN: /* Keys pressed */ case SDL_KEYUP: /* Keys released */ put8(bp, SDL_KEYDOWN); /* Using same for both */ put8(bp, ev->key.which); put8(bp, ev->key.state); put8(bp, ev->key.keysym.scancode); put16be(bp, ev->key.keysym.sym); put16be(bp, ev->key.keysym.mod); put16be(bp, ev->key.keysym.unicode); break; case SDL_MOUSEMOTION: /* Mouse moved */ put8(bp, SDL_MOUSEMOTION); put8(bp, ev->motion.which); put8(bp, ev->motion.state); put16be(bp, SDL_GetModState()); put16be(bp, ev->motion.x); put16be(bp, ev->motion.y); put16be(bp, ev->motion.xrel); put16be(bp, ev->motion.yrel); break; case SDL_MOUSEBUTTONDOWN:/* Mouse button pressed */ case SDL_MOUSEBUTTONUP:/* Mouse button released */ put8(bp, SDL_MOUSEBUTTONDOWN); put8(bp, ev->button.which); put8(bp, ev->button.button); put8(bp, ev->button.state); put16be(bp, SDL_GetModState()); put16be(bp, ev->button.x); put16be(bp, ev->button.y); break; case SDL_JOYAXISMOTION:/* Joystick axis motion */ put8(bp, SDL_JOYAXISMOTION); put8(bp, ev->jaxis.which); put8(bp, ev->jaxis.axis); put16be(bp, ev->jaxis.value); break; case SDL_JOYBALLMOTION:/* Joystick trackball motion */ put8(bp, SDL_JOYBALLMOTION); put8(bp, ev->jball.which); put8(bp, ev->jball.ball); put16be(bp, ev->jball.xrel); put16be(bp, ev->jball.yrel); break; case SDL_JOYHATMOTION:/* Joystick hat position change */ put8(bp, SDL_JOYHATMOTION); put8(bp, ev->jhat.which); put8(bp, ev->jhat.hat); put16be(bp, ev->jhat.value); break; case SDL_JOYBUTTONDOWN:/* Joystick button pressed */ case SDL_JOYBUTTONUP: /* Joystick button released */ put8(bp, SDL_JOYBUTTONDOWN); put8(bp, ev->jbutton.which); put8(bp, ev->jbutton.button); put8(bp, ev->jbutton.state); break; case SDL_QUIT: /* User-requested quit */ put8(bp, SDL_QUIT); break; case SDL_VIDEORESIZE: put8(bp, SDL_VIDEORESIZE); put16be(bp, ev->resize.w); put16be(bp, ev->resize.h); break; case SDL_VIDEOEXPOSE: put8(bp, SDL_VIDEOEXPOSE); break; case SDL_SYSWMEVENT: /* System specific event */ break; default: /* Forward compatible */ fprintf(stderr, "ESDL received unsupported event type %x \n", ev->type); put8(bp, SDL_NOEVENT); break; } return bp; } esdl-1.2/c_src/esdl_events.h0000644000076400010400000001036311540750057020010 0ustar familjenAdministratörer/* * Copyright (c) 2001 Dan Gudmundsson * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * * * $Id$ */ #ifdef __cplusplus extern "C" { #endif #define SDL_PumpEventsFunc (EVENTS_H + 1) void es_pumpEvents(sdl_data *, int , char *); #define SDL_PeepEventsFunc SDL_PumpEventsFunc+1 void es_peepEvents(sdl_data *, int , char *); void es_peepEvents2(ErlDrvPort port, ErlDrvTermData caller, char *bp); #define SDL_PollEventFunc SDL_PeepEventsFunc+1 void es_pollEvent(sdl_data *, int , char *); void es_pollEvent2(ErlDrvPort port, ErlDrvTermData caller); #define SDL_WaitEventFunc SDL_PollEventFunc +1 void es_waitEvent(sdl_data *, int , char *); void es_waitEvent2(ErlDrvPort port, ErlDrvTermData caller); #define SDL_EventStateFunc SDL_WaitEventFunc +1 void es_eventState(sdl_data *, int , char *); #define SDL_GetMouseStateFunc MOUSE_H +1 void es_getMouseState(sdl_data *, int , char *); #define SDL_GetRelativeMouseStateFunc SDL_GetMouseStateFunc+1 void es_getRelativeMouseState(sdl_data *, int , char *); #define SDL_WarpMouseFunc SDL_GetRelativeMouseStateFunc +1 void es_warpMouse(sdl_data *, int len, char *buff); #define SDL_CreateCursorFunc SDL_WarpMouseFunc +1 void es_createCursor(sdl_data *, int len, char *buff); #define SDL_SetCursorFunc SDL_CreateCursorFunc+1 void es_setCursor(sdl_data *, int len, char *buff); #define SDL_GetCursorFunc SDL_SetCursorFunc+1 void es_getCursor(sdl_data *, int len, char *buff); #define SDL_FreeCursorFunc SDL_GetCursorFunc+1 void es_freeCursor(sdl_data *, int len, char *buff); #define SDL_ShowCursorFunc SDL_FreeCursorFunc+1 void es_showCursor(sdl_data *, int len, char *buff); void es_showCursor2(ErlDrvPort port, ErlDrvTermData caller, char *buff); #define SDL_GetWMInfoFunc SDL_ShowCursorFunc+1 void es_getWMInfo(sdl_data *, int , char *); #define SDL_EnableUNICODEFunc KEYBOARD_H +1 void es_enableUNICODE(sdl_data *, int , char *); #define SDL_EnableKeyRepeatFunc SDL_EnableUNICODEFunc+1 void es_enableKeyRepeat(sdl_data *, int , char *); #define SDL_GetKeyNameFunc SDL_EnableKeyRepeatFunc+1 void es_getKeyName(sdl_data *, int , char *); #define SDL_GetKeyStateFunc SDL_GetKeyNameFunc+1 void es_getKeyState(sdl_data *, int , char *); #define SDL_GetModStateFunc SDL_GetKeyStateFunc+1 void es_getModState(sdl_data *, int , char *); #define SDL_SetModStateFunc SDL_GetModStateFunc+1 void es_setModState(sdl_data *, int , char *); #define SDL_GetAppStateFunc ACTIVE_H +1 void es_getAppState(sdl_data *, int , char *); #define SDL_NumJoysticksFunc JOYSTICK_H +1 void es_numJoysticks(sdl_data *, int , char *); #define SDL_JoystickNameFunc SDL_NumJoysticksFunc + 1 void es_joystick_name(sdl_data *, int , char *); #define SDL_JoystickOpenFunc SDL_JoystickNameFunc + 1 void es_joystick_open(sdl_data *, int , char *); #define SDL_JoystickOpenedFunc SDL_JoystickOpenFunc + 1 void es_joystick_opened(sdl_data *, int , char *); #define SDL_JoystickIndexFunc SDL_JoystickOpenedFunc + 1 void es_joystick_index(sdl_data *, int , char *); #define SDL_JoystickNumAxesFunc SDL_JoystickIndexFunc + 1 void es_joystick_numAxes(sdl_data *, int , char *); #define SDL_JoystickNumBallsFunc SDL_JoystickNumAxesFunc + 1 void es_joystick_numBalls(sdl_data *, int , char *); #define SDL_JoystickNumHatsFunc SDL_JoystickNumBallsFunc + 1 void es_joystick_numHats(sdl_data *, int , char *); #define SDL_JoystickNumButtonsFunc SDL_JoystickNumHatsFunc + 1 void es_joystick_numButtons(sdl_data *, int , char *); #define SDL_JoystickUpdateFunc SDL_JoystickNumButtonsFunc + 1 void es_joystick_update(sdl_data *, int , char *); #define SDL_JoystickEventStateFunc SDL_JoystickUpdateFunc + 1 void es_joystick_eventState(sdl_data *, int , char *); #define SDL_JoystickGetAxisFunc SDL_JoystickEventStateFunc + 1 void es_joystick_getAxis(sdl_data *, int , char *); #define SDL_JoystickGetHatFunc SDL_JoystickGetAxisFunc + 1 void es_joystick_getHat(sdl_data *, int , char *); #define SDL_JoystickGetButtonFunc SDL_JoystickGetHatFunc + 1 void es_joystick_getButton(sdl_data *, int , char *); #define SDL_JoystickGetBallFunc SDL_JoystickGetButtonFunc + 1 void es_joystick_getBall(sdl_data *, int , char *); #define SDL_JoystickCloseFunc SDL_JoystickGetBallFunc + 1 void es_joystick_close(sdl_data *, int , char *); esdl-1.2/c_src/esdl_gen.c0000644000076400010400000000156511540750057017254 0ustar familjenAdministratörer/* * Copyright (c) 2001 Dan Gudmundsson * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * * $Id$ */ /* * General SDL functions. */ #include "esdl.h" #include void es_init(sdl_data *sd, int len, char *bp) { Uint32 mode; mode = * (Uint32 *) bp; if (SDL_Init(mode) < 0) { char* e = SDL_GetError(); fprintf(stderr, "Couldn't initialize SDL: %s\n\r", e); } } void es_quit(sdl_data *sd, int len, char * buff) { SDL_Quit(); } void es_getError(sdl_data *sd, int len, char *buff) { char * err, *bp, *start; int length; err = SDL_GetError(); length = strlen(err); bp = start = sdl_getbuff(sd, length); while(*err != '\0') { put8(bp, *err++); } sdl_send(sd, bp - start); } esdl-1.2/c_src/esdl_gl.c0000644000076400010400000002452011540750057017101 0ustar familjenAdministratörer/* * Copyright (c) 2010 Dan Gudmundsson * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * * $Id$ */ #include #include #ifndef _WIN32 #include #endif #include "esdl.h" #include "esdl_events.h" #ifdef _OSX_COCOA int erl_drv_stolen_main_thread_join(ErlDrvTid tid, void **respp); int erl_drv_steal_main_thread(char *name, ErlDrvTid *dtid, void* (*func)(void*), void* arg, ErlDrvThreadOpts *opts); #endif int esdl_gl_initiated = 0; ErlDrvTid esdl_thread; ErlDrvMutex * esdl_batch_locker_m; ErlDrvCond * esdl_batch_locker_c; void * esdl_result; void * esdl_gl_main_loop(void * ); int es_init_opengl2(ErlDrvPort, ErlDrvTermData, char *bp); typedef struct { ErlDrvTermData caller; int op; char *buff; int no_bins; char *base[3]; ErlDrvBinary *bin[3]; int size[3]; } esdl_q_t; #define MAX_Q 1024 int esdl_q_first, esdl_q_n; esdl_q_t esdl_q[MAX_Q]; /* See wx/c_src/egl_impl.h */ typedef void (*ESDL_GL_DISPATCH) (int, char *, ErlDrvPort, ErlDrvTermData, char **, int *); ESDL_GL_DISPATCH esdl_gl_dispatch; typedef int (*ESDL_GL_INIT) (void *); /*** WIN32 ***/ #ifdef _WIN32 #define RTLD_LAZY 0 typedef HMODULE DL_LIB_P; void * dlsym(HMODULE Lib, const char *func) { void * funcp; funcp = (void *) GetProcAddress(Lib, func); return funcp; } HMODULE dlopen(const char *DLL, int unused) { return LoadLibrary(DLL); } void DisplayErrorMsg() { // Retrieve the system error message for the last-error code LPVOID lpMsgBuf; DWORD dw = GetLastError(); FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, dw, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &lpMsgBuf, 0, NULL ); MessageBox(NULL, (LPCTSTR)lpMsgBuf, TEXT("Error"), MB_OK); LocalFree(lpMsgBuf); } #else typedef void * DL_LIB_P; void DisplayErrorMsg() { } #endif /** Initialization code **/ void es_init_opengl(sdl_data *sd, int len, char *bp) { if(!sd->use_smp) { es_init_opengl2(sd->driver_data, driver_caller(sd->driver_data), bp); } else { gl_dispatch(sd, ESDL_OpenglInitFunc, len, bp); } } int es_init_opengl2(ErlDrvPort port, ErlDrvTermData caller, char *bp) { DL_LIB_P LIBhandle; ESDL_GL_INIT init_opengl; int res = 0; ErlDrvTermData rt[8]; #ifdef _WIN32 void * erlCallbacks = &WinDynDriverCallbacks; #else void * erlCallbacks = NULL; #endif if(esdl_gl_initiated == 0) { if((LIBhandle = dlopen(bp, RTLD_LAZY))) { init_opengl = (ESDL_GL_INIT) dlsym(LIBhandle, "egl_init_opengl"); esdl_gl_dispatch = (ESDL_GL_DISPATCH) dlsym(LIBhandle, "egl_dispatch"); if(init_opengl && esdl_gl_dispatch) { init_opengl(erlCallbacks); esdl_gl_initiated = 1; res = 1; } else { fprintf(stderr, "In lib %s:\r\n", bp); if(!init_opengl) fprintf(stderr, " function not found egl_init_opengl\r\n"); if(!esdl_gl_dispatch) fprintf(stderr, " function not found egl_dispatch\r\n"); fflush(stderr); res = 0; } } else { fprintf(stderr, "Failed locating lib %s:\r\n", bp); DisplayErrorMsg(); fflush(stderr); res = 0; } } else { res = 2; } rt[0] = ERL_DRV_ATOM; rt[1]=driver_mk_atom((char *) "_esdl_result_"); rt[2] = ERL_DRV_INT; rt[3] = res; rt[4] = ERL_DRV_TUPLE; rt[5] = 2; driver_send_term(port,caller,rt,6); return res; } void gl_dispatch(sdl_data *sd, int op, int len, char *bp) { int i; if(!sd->use_smp) { /* Not SMP invoke directly */ char * bs[3]; int bs_sz[3]; for(i=0; i<3; i++) { bs[i] = sd->bin[i].base; bs_sz[i] = sd->bin[i].size; } esdl_gl_dispatch(op, bp, sd->driver_data, driver_caller(sd->driver_data), bs, bs_sz); } else { //printf("Dispatch cmd %d \r\n", op); /* SMP * copy everything and queue request to thread */ int pos; erl_drv_mutex_lock(esdl_batch_locker_m); while(esdl_q_n == MAX_Q) { /* queue is full wait */ //fprintf(stderr, "%d: Wait \r\n", __LINE__); fflush(stderr); erl_drv_cond_wait(esdl_batch_locker_c, esdl_batch_locker_m); //fprintf(stderr, "%d: Wait done\r\n", __LINE__); fflush(stderr); } pos = (esdl_q_first + esdl_q_n) % MAX_Q; esdl_q[pos].op = op; esdl_q[pos].buff = driver_alloc(len); //fprintf(stderr, "%d: Q %d %d %d\r\n", __LINE__, op, pos, esdl_q_n); fflush(stderr); memcpy(esdl_q[pos].buff, bp, len); esdl_q[pos].caller = driver_caller(sd->driver_data); for(i=0; i< sd->next_bin; i++) { esdl_q[pos].base[i] = sd->bin[i].base; esdl_q[pos].bin[i] = sd->bin[i].bin; esdl_q[pos].size[i] = sd->bin[i].size; driver_binary_inc_refc(sd->bin[i].bin); } esdl_q[pos].no_bins = sd->next_bin; esdl_q_n++; erl_drv_cond_signal(esdl_batch_locker_c); erl_drv_mutex_unlock(esdl_batch_locker_m); } } void start_opengl_thread(sdl_data *sd) { int res; esdl_batch_locker_m = erl_drv_mutex_create((char *)"esdl_batch_locker_m"); esdl_batch_locker_c = erl_drv_cond_create((char *)"esdl_batch_locker_c"); esdl_q_first = 0; esdl_q_n = 0; esdl_result = (void *) -1; erl_drv_mutex_lock(esdl_batch_locker_m); #ifdef _OSX_COCOA res = erl_drv_steal_main_thread("ESDL OpenGL dispatcher", &esdl_thread, esdl_gl_main_loop, (void *) sd, NULL); #else res = erl_drv_thread_create("ESDL OpenGL dispatcher", &esdl_thread, esdl_gl_main_loop, (void *) sd, NULL); #endif if(res == 0) { erl_drv_cond_wait(esdl_batch_locker_c, esdl_batch_locker_m); erl_drv_mutex_unlock(esdl_batch_locker_m); } } void stop_opengl_thread() { erl_drv_mutex_lock(esdl_batch_locker_m); esdl_q_n = -(esdl_q_n+1); erl_drv_cond_signal(esdl_batch_locker_c); erl_drv_mutex_unlock(esdl_batch_locker_m); #ifdef _OSX_COCOA erl_drv_stolen_main_thread_join(esdl_thread, NULL); #else erl_drv_thread_join(esdl_thread, NULL); #endif erl_drv_mutex_destroy(esdl_batch_locker_m); erl_drv_cond_destroy(esdl_batch_locker_c); } void * esdl_gl_main_loop(void *sd) { char * bs[3]; int bs_sz[3]; int i,j,pos; ErlDrvPort port = ((sdl_data *)sd)->driver_data; esdl_init_native_gui(); erl_drv_mutex_lock(esdl_batch_locker_m); SDL_Init(SDL_INIT_AUDIO | SDL_INIT_VIDEO | SDL_INIT_JOYSTICK ); while(1) { if(esdl_q_n > 0) { for(i=0; i<3; i++) { bs[i] = esdl_q[esdl_q_first].base[i]; bs_sz[i] = esdl_q[esdl_q_first].size[i]; } //fprintf(stderr, "%d: X %d %d %d\r\n", __LINE__, esdl_q[esdl_q_first].op, //esdl_q_first, esdl_q_n); fflush(stderr); if(esdl_q[esdl_q_first].op >= OPENGL_START) { esdl_gl_dispatch(esdl_q[esdl_q_first].op, esdl_q[esdl_q_first].buff, port, esdl_q[esdl_q_first].caller, bs, bs_sz); } else { /* OpenGL must be initilized in the thread */ switch(esdl_q[esdl_q_first].op) { case SDL_GL_SwapBuffersFunc: SDL_GL_SwapBuffers(); break; /* Events must be handled in this thread on windows */ case SDL_PumpEventsFunc: SDL_PumpEvents(); break; case SDL_PeepEventsFunc: es_peepEvents2(port, esdl_q[esdl_q_first].caller, esdl_q[esdl_q_first].buff); break; case SDL_PollEventFunc: es_pollEvent2(port, esdl_q[esdl_q_first].caller); break; case SDL_WaitEventFunc: es_waitEvent2(port, esdl_q[esdl_q_first].caller); break; /* Other gl related functions */ case SDL_SetVideoModeFunc: es_setVideoMode2(port, esdl_q[esdl_q_first].caller, esdl_q[esdl_q_first].buff); break; case SDL_VideoModeOKFunc: es_videoModeOK2(port, esdl_q[esdl_q_first].caller, esdl_q[esdl_q_first].buff); break; case SDL_WM_ToggleFullScreenFunc: es_wm_toggleFullScreen2(port, esdl_q[esdl_q_first].caller, esdl_q[esdl_q_first].buff); break; case ESDL_OpenglInitFunc: es_init_opengl2(port, esdl_q[esdl_q_first].caller, esdl_q[esdl_q_first].buff); break; case SDL_GL_GetAttributeFunc: es_gl_getAttribute2(port, esdl_q[esdl_q_first].caller, esdl_q[esdl_q_first].buff); break; case SDL_GL_SetAttributeFunc: es_gl_setAttribute2(port, esdl_q[esdl_q_first].caller, esdl_q[esdl_q_first].buff); break; case SDL_ShowCursorFunc: es_showCursor2(port, esdl_q[esdl_q_first].caller, esdl_q[esdl_q_first].buff); break; case SDL_WM_SetCaptionFunc: es_wm_setCaption2(esdl_q[esdl_q_first].buff); break; case SDL_WM_GetInfoFunc: es_wm_getInfo2(port, esdl_q[esdl_q_first].caller, esdl_q[esdl_q_first].buff); break; case SDL_WM_MaximizeFunc: es_wm_maximize2(port, esdl_q[esdl_q_first].caller, esdl_q[esdl_q_first].buff); break; } } for(i=0; i < esdl_q[esdl_q_first].no_bins; i++) driver_free_binary(esdl_q[esdl_q_first].bin[i]); driver_free(esdl_q[esdl_q_first].buff); // fprintf(stderr, "%d: Xed %d \r\n", __LINE__, esdl_q[esdl_q_first].op); fflush(stderr); esdl_q_first++; esdl_q_first %= MAX_Q; esdl_q_n--; } else { erl_drv_cond_signal(esdl_batch_locker_c); // fprintf(stderr, "%d: TW\r\n", __LINE__); fflush(stderr); while(esdl_q_n == 0) { erl_drv_cond_wait(esdl_batch_locker_c, esdl_batch_locker_m); } // fprintf(stderr, "%d: TWed\r\n", __LINE__); fflush(stderr); if(esdl_q_n < 0) { /* Time to quit */ // fprintf(stderr, "%d: T Quit\r\n", __LINE__); fflush(stderr); esdl_q_n = -esdl_q_n-1; break; } } } /* Free all unused memory */ for(i=0; i #include #include void es_img_linkedVersion(sdl_data *sd, int len, char *buff) { char *bp, *start; int sendlen; const SDL_version *version; version = IMG_Linked_Version(); bp = start = sdl_get_temp_buff(sd, 3); put8(bp, version->major); put8(bp, version->minor); put8(bp, version->patch); sendlen = bp - start; sdl_send(sd, sendlen); } void es_img_loadTypedRW(sdl_data *sd, int len, char *buff) { } void es_img_load(sdl_data *sd, int len, char *buff) { char *file, *bp, *start; int sendlen; SDL_Surface *surface; file = buff; surface = IMG_Load(file); bp = start = sdl_get_temp_buff(sd, 8); PUSHGLPTR(surface, bp); sendlen = bp - start; sdl_send(sd, sendlen); } void es_img_loadRW(sdl_data *sd, int len, char *buff) { } void es_img_invertAlpha(sdl_data *sd, int len, char *buff) { } void es_img_isBMP(sdl_data *sd, int len, char *buff) { } void es_img_isPNM(sdl_data *sd, int len, char *buff) { } void es_img_isXPM(sdl_data *sd, int len, char *buff) { } void es_img_isXCF(sdl_data *sd, int len, char *buff) { } void es_img_isPCX(sdl_data *sd, int len, char *buff) { } void es_img_isGIF(sdl_data *sd, int len, char *buff) { } void es_img_isJPG(sdl_data *sd, int len, char *buff) { } void es_img_isTIF(sdl_data *sd, int len, char *buff) { } void es_img_isPNG(sdl_data *sd, int len, char *buff) { } void es_img_isLBM(sdl_data *sd, int len, char *buff) { } void es_img_loadBMPRW(sdl_data *sd, int len, char *buff) { } void es_img_loadPNMRW(sdl_data *sd, int len, char *buff) { } void es_img_loadXPMRW(sdl_data *sd, int len, char *buff) { } void es_img_loadXCFRW(sdl_data *sd, int len, char *buff) { } void es_img_loadPCXRW(sdl_data *sd, int len, char *buff) { } void es_img_loadGIFRW(sdl_data *sd, int len, char *buff) { } void es_img_loadJPGRW(sdl_data *sd, int len, char *buff) { } void es_img_loadTIFRW(sdl_data *sd, int len, char *buff) { } void es_img_loadPNGRW(sdl_data *sd, int len, char *buff) { } void es_img_loadTGARW(sdl_data *sd, int len, char *buff) { } void es_img_loadLBMRW(sdl_data *sd, int len, char *buff) { } void es_img_readXPMFromArray(sdl_data *sd, int len, char *buff) { } void es_img_setError(sdl_data *sd, int len, char *buff) { // not implemented } void es_img_getError(sdl_data *sd, int len, char *buff) { char *err, *bp, *start; int length; err = IMG_GetError(); length = strlen(err); bp = start = sdl_getbuff(sd, length); while(*err != '\0') { put8(bp, *err++); } sdl_send(sd, bp - start); } esdl-1.2/c_src/esdl_img.h0000644000076400010400000000722011540750057017256 0ustar familjenAdministratörer/* * Copyright (c) 2007 Klas Johansson * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * * * $Id$ */ /* Defines the image functions */ #ifdef _USE_SDL_IMAGE #ifdef __cplusplus extern "C" { #endif #define SDL_IMG_LinkedVersionFunc IMG_H +1 void es_img_linkedVersion(sdl_data *, int, char *); #define SDL_IMG_LoadTypedRWFunc SDL_IMG_LinkedVersionFunc +1 void es_img_loadTypedRW(sdl_data *, int, char *); #define SDL_IMG_LoadFunc SDL_IMG_LoadTypedRWFunc +1 void es_img_load(sdl_data *, int, char *); #define SDL_IMG_LoadRWFunc SDL_IMG_LoadFunc +1 void es_img_loadRW(sdl_data *, int, char *); #define SDL_IMG_InvertAlphaFunc SDL_IMG_LoadRWFunc +1 void es_img_invertAlpha(sdl_data *, int, char *); #define SDL_IMG_isBMPFunc SDL_IMG_InvertAlphaFunc +1 void es_img_isBMP(sdl_data *, int, char *); #define SDL_IMG_isPNMFunc SDL_IMG_isBMPFunc +1 void es_img_isPNM(sdl_data *, int, char *); #define SDL_IMG_isXPMFunc SDL_IMG_isPNMFunc +1 void es_img_isXPM(sdl_data *, int, char *); #define SDL_IMG_isXCFFunc SDL_IMG_isXPMFunc +1 void es_img_isXCF(sdl_data *, int, char *); #define SDL_IMG_isPCXFunc SDL_IMG_isXCFFunc +1 void es_img_isPCX(sdl_data *, int, char *); #define SDL_IMG_isGIFFunc SDL_IMG_isPCXFunc +1 void es_img_isGIF(sdl_data *, int, char *); #define SDL_IMG_isJPGFunc SDL_IMG_isGIFFunc +1 void es_img_isJPG(sdl_data *, int, char *); #define SDL_IMG_isTIFFunc SDL_IMG_isJPGFunc +1 void es_img_isTIF(sdl_data *, int, char *); #define SDL_IMG_isPNGFunc SDL_IMG_isTIFFunc +1 void es_img_isPNG(sdl_data *, int, char *); #define SDL_IMG_isLBMFunc SDL_IMG_isPNGFunc +1 void es_img_isLBM(sdl_data *, int, char *); #define SDL_IMG_LoadBMPRWFunc SDL_IMG_isLBMFunc +1 void es_img_loadBMPRW(sdl_data *, int, char *); #define SDL_IMG_LoadPNMRWFunc SDL_IMG_LoadBMPRWFunc +1 void es_img_loadPNMRW(sdl_data *, int, char *); #define SDL_IMG_LoadXPMRWFunc SDL_IMG_LoadPNMRWFunc +1 void es_img_loadXPMRW(sdl_data *, int, char *); #define SDL_IMG_LoadXCFRWFunc SDL_IMG_LoadXPMRWFunc +1 void es_img_loadXCFRW(sdl_data *, int, char *); #define SDL_IMG_LoadPCXRWFunc SDL_IMG_LoadXCFRWFunc +1 void es_img_loadPCXRW(sdl_data *, int, char *); #define SDL_IMG_LoadGIFRWFunc SDL_IMG_LoadPCXRWFunc +1 void es_img_loadGIFRW(sdl_data *, int, char *); #define SDL_IMG_LoadJPGRWFunc SDL_IMG_LoadGIFRWFunc +1 void es_img_loadJPGRW(sdl_data *, int, char *); #define SDL_IMG_LoadTIFRWFunc SDL_IMG_LoadJPGRWFunc +1 void es_img_loadTIFRW(sdl_data *, int, char *); #define SDL_IMG_LoadPNGRWFunc SDL_IMG_LoadTIFRWFunc +1 void es_img_loadPNGRW(sdl_data *, int, char *); #define SDL_IMG_LoadTGARWFunc SDL_IMG_LoadPNGRWFunc +1 void es_img_loadTGARW(sdl_data *, int, char *); #define SDL_IMG_LoadLBMRWFunc SDL_IMG_LoadTGARWFunc +1 void es_img_loadLBMRW(sdl_data *, int, char *); #define SDL_IMG_ReadXPMFromArrayFunc SDL_IMG_LoadLBMRWFunc +1 void es_img_readXPMFromArray(sdl_data *, int, char *); #define SDL_IMG_SetErrorFunc SDL_IMG_ReadXPMFromArrayFunc +1 void es_img_setError(sdl_data *, int, char *); #define SDL_IMG_GetErrorFunc SDL_IMG_SetErrorFunc +1 void es_img_getError(sdl_data *, int, char *); #ifdef __cplusplus } #endif #endif /* _USE_SDL_IMAGE */ esdl-1.2/c_src/esdl_sdl_fp.h0000644000076400010400000003101711540750057017752 0ustar familjenAdministratörer/* * Copyright (c) 2001 Dan Gudmundsson * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * * $Id$ * Function pointers for sdl functions */ { SDL_InitFunc, "SDL_InitFunc", es_init }, { SDL_QuitFunc, "SDL_QuitFunc", es_quit }, { SDL_GetErrorFunc, "SDL_GetErrorFunc", es_getError }, { ESDL_OpenglInitFunc, "ESDL_opengl_init", es_init_opengl}, { SDL_SetVideoModeFunc, "SDL_SetVideoModeFunc", es_setVideoMode }, { SDL_VideoDriverNameFunc, "SDL_VideoDriverNameFunc", es_videoDriverName }, { SDL_GetVideoSurfaceFunc, "SDL_GetVideoSurfaceFunc", es_getVideoSurface }, { SDL_GetVideoInfoFunc, "SDL_GetVideoInfoFunc", es_getVideoInfo }, { SDL_VideoModeOKFunc, "SDL_VideoModeOKFunc", es_videoModeOK }, { SDL_ListModesFunc, "SDL_ListModesFunc", es_listModes }, { SDL_SetColorKeyFunc, "SDL_SetColorKeyFunc", es_setColorKey }, { SDL_DisplayFormatFunc, "SDL_DisplayFormatFunc", es_displayFormat }, { SDL_BlitSurfaceFunc, "SDL_BlitSurfaceFunc", es_blitSurface }, { SDL_FillRectFunc, "SDL_FillRectFunc", es_fillRect }, { SDL_UpdateRectsFunc, "SDL_UpdateRectsFunc", es_updateRects }, { SDL_FlipFunc, "SDL_FlipFunc", es_flip }, { SDL_SetColorsFunc, "SDL_SetColorsFunc", es_setColors }, { SDL_MapRGBFunc, "SDL_MapRGBFunc", es_mapRGB }, { SDL_GetRGBFunc, "SDL_GetRGBFunc", es_getRGB }, { SDL_CreateRGBSurfaceFunc, "SDL_CreateRGBSurfaceFunc", es_createRGBSurface }, { SDL_CreateRGBSurfaceFromFunc, "SDL_CreateRGBSurfaceFromFunc", es_createRGBSurfaceFrom }, { SDL_FreeSurfaceFunc, "SDL_FreeSurfaceFunc", es_freeSurface }, { SDL_LockSurfaceFunc, "SDL_LockSurfaceFunc", es_lockSurface }, { SDL_UnlockSurfaceFunc, "SDL_UnlockSurfaceFunc", es_unlockSurface }, { SDL_LoadBMPFunc, "SDL_LoadBMPFunc", es_loadBMP }, { SDL_SaveBMPFunc, "SDL_SaveBMPFunc", es_saveBMP }, { SDL_SetAlphaFunc, "SDL_SetAlphaFunc", es_setAlpha }, /* { SDL_SetClippingFunc, "SDL_SetClippingFunc", es_setClipping }, Removed */ { SDL_SetGammaFunc, "SDL_SetGamma", es_setGamma }, { SDL_SetGammaRampFunc, "SDL_SetGammaRamp", es_setGammaRamp }, { SDL_GetGammaRampFunc, "SDL_GetGamma", es_getGammaRamp }, { SDL_MapRGBAFunc, "SDL_MapRGBAFunc", es_mapRGBA }, { SDL_GetRGBAFunc, "SDL_GetRGBAFunc", es_getRGBA}, { SDL_GetClipRectFunc, "SDL_GetClipRectFunc", es_getClipRect}, { SDL_SetClipRectFunc, "SDL_SetClipRectFunc", es_setClipRect}, { SDL_DisplayFormatAlphaFunc, "SDL_DisplayFormatAlphaFunc", es_displayFormatAlpha}, { SDL_WM_SetCaptionFunc, "SDL_WM_SetCaptionFunc", es_wm_setCaption }, { SDL_WM_GetCaptionFunc, "SDL_WM_GetCaptionFunc", es_wm_getCaption }, { SDL_WM_SetIconFunc, "SDL_WM_SetIconFunc", es_wm_setIcon }, { SDL_WM_IconifyWindowFunc, "SDL_WM_IconifyWindowFunc", es_wm_iconifyWindow }, { SDL_WM_ToggleFullScreenFunc, "SDL_WM_ToggleFullScreenFunc", es_wm_toggleFullScreen }, { SDL_WM_GrabInputFunc, "SDL_WM_GrabInputFunc", es_wm_grabInput }, { SDL_WM_GetInfoFunc, "SDL_WM_GetInfoFunc", es_wm_getInfo }, { SDL_WM_IsMaximizedFunc, "SDL_WM_IsMaximizedFunc", es_wm_isMaximized }, { SDL_WM_MaximizeFunc, "SDL_WM_MaximizeFunc", es_wm_maximize }, /** EVENT FUNCTIONS */ { SDL_PumpEventsFunc, "SDL_PumpEventsFunc", es_pumpEvents }, { SDL_PeepEventsFunc, "SDL_PeepEventsFunc", es_peepEvents }, { SDL_PollEventFunc, "SDL_PollEventFunc", es_pollEvent }, { SDL_WaitEventFunc, "SDL_WaitEventFunc", es_waitEvent }, { SDL_EventStateFunc, "SDL_EventStateFunc", es_eventState }, { SDL_GetAppStateFunc, "SDL_GetAppStateFunc", es_getAppState }, { SDL_GetModStateFunc, "SDL_GetModStateFunc", es_getModState }, { SDL_SetModStateFunc, "SDL_SetModStateFunc", es_setModState }, { SDL_GetKeyStateFunc, "SDL_GetKeyStateFunc", es_getKeyState }, { SDL_EnableUNICODEFunc, "SDL_EnableUNICODEFunc", es_enableUNICODE }, { SDL_GetKeyNameFunc, "SDL_GetKeyNameFunc", es_getKeyName }, { SDL_EnableKeyRepeatFunc, "SDL_EnableKeyRepeatFunc", es_enableKeyRepeat }, /* Mouse Functions */ { SDL_GetMouseStateFunc, "SDL_GetMouseStateFunc", es_getMouseState }, { SDL_GetRelativeMouseStateFunc, "SDL_GetRelativeMouseStateFunc", es_getRelativeMouseState }, { SDL_WarpMouseFunc, "SDL_WarpMouseFunc", es_warpMouse }, { SDL_CreateCursorFunc, "SDL_CreateCursorFunc", es_createCursor }, { SDL_SetCursorFunc, "SDL_SetCursorFunc", es_setCursor }, { SDL_GetCursorFunc, "SDL_GetCursorFunc", es_getCursor }, { SDL_FreeCursorFunc, "SDL_FreeCursorFunc", es_freeCursor }, { SDL_ShowCursorFunc, "SDL_ShowCursorFunc", es_showCursor }, /* Joystick functions */ { SDL_NumJoysticksFunc, "SDL_NumJoysticksFunc", es_numJoysticks }, { SDL_JoystickNameFunc, "SDL_JoystickNameFunc", es_joystick_name }, { SDL_JoystickOpenFunc, "SDL_JoystickOpenFunc", es_joystick_open }, { SDL_JoystickOpenedFunc, "SDL_JoystickOpenedFunc", es_joystick_opened }, { SDL_JoystickIndexFunc, "SDL_JoystickIndexFunc", es_joystick_index }, { SDL_JoystickNumAxesFunc, "SDL_JoystickNumAxesFunc", es_joystick_numAxes }, { SDL_JoystickNumBallsFunc, "SDL_JoystickNumBallsFunc", es_joystick_numBalls }, { SDL_JoystickNumHatsFunc, "SDL_JoystickNumHatsFunc", es_joystick_numHats }, { SDL_JoystickNumButtonsFunc, "SDL_JoystickNumButtonsFunc", es_joystick_numButtons }, { SDL_JoystickUpdateFunc, "SDL_JoystickUpdateFunc", es_joystick_update }, { SDL_JoystickEventStateFunc, "SDL_JoystickEventStateFunc", es_joystick_eventState }, { SDL_JoystickGetAxisFunc, "SDL_JoystickGetAxisFunc", es_joystick_getAxis }, { SDL_JoystickGetHatFunc, "SDL_JoystickGetHatFunc", es_joystick_getHat }, { SDL_JoystickGetButtonFunc, "SDL_JoystickGetButtonFunc", es_joystick_getButton }, { SDL_JoystickGetBallFunc, "SDL_JoystickGetBallFunc", es_joystick_getBall }, { SDL_JoystickCloseFunc, "SDL_JoystickCloseFunc", es_joystick_close }, /* SDL open gl support funcs */ { SDL_GL_SetAttributeFunc, "SDL_GL_SetAttributeFunc", es_gl_setAttribute }, { SDL_GL_GetAttributeFunc, "SDL_GL_GetAttributeFunc", es_gl_getAttribute }, { SDL_GL_SwapBuffersFunc, "SDL_GL_SwapBuffersFunc", es_gl_swapBuffers }, /* Erl sdl functions */ { ESDL_getSurfaceFunc, "ESDL_getSurfaceFunc", es_getSurface }, { ESDL_getPixelFormatFunc, "ESDL_getPixelFormatFunc", es_getPixelFormat }, { ESDL_getPaletteFunc, "ESDL_getPaletteFunc", es_getPalette }, { ESDL_getPixelsFunc, "ESDL_getPixelsFunc", es_getPixels }, { SDL_UTIL_copySdlImage2GLArrayFunc, "SDL_UTIL_copySdlImage2GLArrayFunc", copySdlImage2GLArray }, { SDL_UTIL_DebugFunc, "SDL_UTIL_DebugFunc", sdl_util_debug}, /* SDL AUDIO functions */ { SDL_AudioDriverNameFunc, "SDL_AudioDriverNameFunc", es_audioDriverName }, { SDL_OpenAudioFunc, "SDL_OpenAudioFunc", es_openAudio }, { SDL_GetAudioStatusFunc, "SDL_GetAudioStatusFunc", es_getAudioStatus }, { SDL_PauseAudioFunc, "SDL_PauseAudioFunc", es_pauseAudio }, { SDL_LoadWAVFunc, "SDL_LoadWAVFunc", es_loadWAV }, { SDL_FreeWAVFunc, "SDL_FreeWAVFunc", es_freeWAV }, { SDL_BuildAudioCVTFunc, "SDL_BuildAudioCVTFunc", es_buildAudioCVT }, { SDL_ConvertAudioFunc, "SDL_ConvertAudioFunc", es_convertAudio }, { SDL_MixAudioFunc, "SDL_MixAudioFunc", es_mixAudio }, { SDL_LockAudioFunc, "SDL_LockAudioFunc", es_lockAudio }, { SDL_UnlockAudioFunc, "SDL_UnlockAudioFunc", es_unlockAudio }, { SDL_CloseAudioFunc, "SDL_CloseAudioFunc", es_closeAudio }, { play_audioFunc, "play_audioFunc", play_audio }, /* MY GL memory handling funcs */ { mygl_allocFunc, "mygl_allocFunc", mygl_alloc }, { mygl_writeFunc, "mygl_writeFunc", mygl_write }, /* SDL TTF functions */ #ifdef _USE_SDL_TTF { SDL_TTF_Linked_VersionFunc, "SDL_TTF_Linked_VersionFunc", es_ttf_linkedVersion }, { SDL_TTF_ByteSwappedUNICODEFunc, "SDL_TTF_ByteSwappedUNICODEFunc", es_ttf_byteSwappedUNICODE }, { SDL_TTF_InitFunc, "SDL_TTF_InitFunc", es_ttf_init }, { SDL_TTF_OpenFontFunc, "SDL_TTF_OpenFontFunc", es_ttf_openFont }, { SDL_TTF_OpenFontIndexFunc, "SDL_TTF_OpenFontIndexFunc", es_ttf_openFontIndex }, { SDL_TTF_OpenFontRWFunc, "SDL_TTF_OpenFontRWFunc", es_ttf_openFontRW }, { SDL_TTF_OpenFontIndexRWFunc, "SDL_TTF_OpenFontIndexRWFunc", es_ttf_openFontIndexRW }, { SDL_TTF_GetFontStyleFunc, "SDL_TTF_GetFontStyleFunc", es_ttf_getFontStyle }, { SDL_TTF_SetFontStyleFunc, "SDL_TTF_SetFontStyleFunc", es_ttf_setFontStyle }, { SDL_TTF_FontHeightFunc, "SDL_TTF_FontHeightFunc", es_ttf_fontHeight }, { SDL_TTF_FontAscentFunc, "SDL_TTF_FontAscentFunc", es_ttf_fontAscent }, { SDL_TTF_FontDescentFunc, "SDL_TTF_FontDescentFunc", es_ttf_fontDescent }, { SDL_TTF_FontLineSkipFunc, "SDL_TTF_FontLineSkipFunc", es_ttf_fontLineSkip }, { SDL_TTF_FontFacesFunc, "SDL_TTF_FontFacesFunc", es_ttf_fontFaces }, { SDL_TTF_FontFaceIsFixedWidthFunc, "SDL_TTF_FontFaceIsFixedWidthFunc", es_ttf_fontFaceIsFixedWidth }, { SDL_TTF_FontFaceFamilyNameFunc, "SDL_TTF_FontFaceFamilyNameFunc", es_ttf_fontFaceFamilyName }, { SDL_TTF_FontFaceStyleNameFunc, "SDL_TTF_FontFaceStyleNameFunc", es_ttf_fontFaceStyleName }, { SDL_TTF_GlyphMetricsFunc, "SDL_TTF_GlyphMetricsFunc", es_ttf_glyphMetrics }, { SDL_TTF_SizeTextFunc, "SDL_TTF_SizeTextFunc", es_ttf_sizeText }, { SDL_TTF_SizeUTF8Func, "SDL_TTF_SizeUTF8Func", es_ttf_sizeUTF8 }, { SDL_TTF_SizeUNICODEFunc, "SDL_TTF_SizeUNICODEFunc", es_ttf_sizeUNICODE }, { SDL_TTF_RenderText_SolidFunc, "SDL_TTF_RenderText_SolidFunc", es_ttf_renderTextSolid }, { SDL_TTF_RenderUTF8_SolidFunc, "SDL_TTF_RenderUTF8_SolidFunc", es_ttf_renderUTF8Solid }, { SDL_TTF_RenderUNICODE_SolidFunc, "SDL_TTF_RenderUNICODE_SolidFunc", es_ttf_renderUNICODESolid }, { SDL_TTF_RenderGlyph_SolidFunc, "SDL_TTF_RenderGlyph_SolidFunc", es_ttf_renderGlyphSolid }, { SDL_TTF_RenderText_ShadedFunc, "SDL_TTF_RenderText_ShadedFunc", es_ttf_renderTextShaded }, { SDL_TTF_RenderUTF8_ShadedFunc, "SDL_TTF_RenderUTF8_ShadedFunc", es_ttf_renderUTF8Shaded }, { SDL_TTF_RenderUNICODE_ShadedFunc, "SDL_TTF_RenderUNICODE_ShadedFunc", es_ttf_renderUNICODEShaded }, { SDL_TTF_RenderGlyph_ShadedFunc, "SDL_TTF_RenderGlyph_ShadedFunc", es_ttf_renderGlyphShaded }, { SDL_TTF_RenderText_BlendedFunc, "SDL_TTF_RenderText_BlendedFunc", es_ttf_renderTextBlended }, { SDL_TTF_RenderUTF8_BlendedFunc, "SDL_TTF_RenderUTF8_BlendedFunc", es_ttf_renderUTF8Blended }, { SDL_TTF_RenderUNICODE_BlendedFunc, "SDL_TTF_RenderUNICODE_BlendedFunc", es_ttf_renderUNICODEBlended }, { SDL_TTF_RenderGlyph_BlendedFunc, "SDL_TTF_RenderGlyph_BlendedFunc", es_ttf_renderGlyphBlended }, { SDL_TTF_CloseFontFunc, "SDL_TTF_CloseFontFunc", es_ttf_closeFont }, { SDL_TTF_QuitFunc, "SDL_TTF_QuitFunc", es_ttf_quit }, { SDL_TTF_WasInitFunc, "SDL_TTF_WasInitFunc", es_ttf_wasInit }, { SDL_TTF_SetErrorFunc, "SDL_TTF_SetErrorFunc", es_ttf_setError }, { SDL_TTF_GetErrorFunc, "SDL_TTF_GetErrorFunc", es_ttf_getError }, #endif /*_USE_SDL_TTF */ /* SDL image functions */ #ifdef _USE_SDL_IMAGE { SDL_IMG_LinkedVersionFunc, "SDL_IMG_LinkedVersionFunc", es_img_linkedVersion }, { SDL_IMG_LoadTypedRWFunc, "SDL_IMG_LoadTypedRWFunc", es_img_loadTypedRW }, { SDL_IMG_LoadFunc, "SDL_IMG_LoadFunc", es_img_load }, { SDL_IMG_LoadRWFunc, "SDL_IMG_LoadRWFunc", es_img_loadRW }, { SDL_IMG_InvertAlphaFunc, "SDL_IMG_InvertAlphaFunc", es_img_invertAlpha }, { SDL_IMG_isBMPFunc, "SDL_IMG_isBMPFunc", es_img_isBMP }, { SDL_IMG_isPNMFunc, "SDL_IMG_isPNMFunc", es_img_isPNM }, { SDL_IMG_isXPMFunc, "SDL_IMG_isXPMFunc", es_img_isXPM }, { SDL_IMG_isXCFFunc, "SDL_IMG_isXCFFunc", es_img_isXCF }, { SDL_IMG_isPCXFunc, "SDL_IMG_isPCXFunc", es_img_isPCX }, { SDL_IMG_isGIFFunc, "SDL_IMG_isGIFFunc", es_img_isGIF }, { SDL_IMG_isJPGFunc, "SDL_IMG_isJPGFunc", es_img_isJPG }, { SDL_IMG_isTIFFunc, "SDL_IMG_isTIFFunc", es_img_isTIF }, { SDL_IMG_isPNGFunc, "SDL_IMG_isPNGFunc", es_img_isPNG }, { SDL_IMG_isLBMFunc, "SDL_IMG_isLBMFunc", es_img_isLBM }, { SDL_IMG_LoadBMPRWFunc, "SDL_IMG_LoadBMPRWFunc", es_img_loadBMPRW }, { SDL_IMG_LoadPNMRWFunc, "SDL_IMG_LoadPNMRWFunc", es_img_loadPNMRW }, { SDL_IMG_LoadXPMRWFunc, "SDL_IMG_LoadXPMRWFunc", es_img_loadXPMRW }, { SDL_IMG_LoadXCFRWFunc, "SDL_IMG_LoadXCFRWFunc", es_img_loadXCFRW }, { SDL_IMG_LoadPCXRWFunc, "SDL_IMG_LoadPCXRWFunc", es_img_loadPCXRW }, { SDL_IMG_LoadGIFRWFunc, "SDL_IMG_LoadGIFRWFunc", es_img_loadGIFRW }, { SDL_IMG_LoadJPGRWFunc, "SDL_IMG_LoadJPGRWFunc", es_img_loadJPGRW }, { SDL_IMG_LoadTIFRWFunc, "SDL_IMG_LoadTIFRWFunc", es_img_loadTIFRW }, { SDL_IMG_LoadPNGRWFunc, "SDL_IMG_LoadPNGRWFunc", es_img_loadPNGRW }, { SDL_IMG_LoadTGARWFunc, "SDL_IMG_LoadTGARWFunc", es_img_loadTGARW }, { SDL_IMG_LoadLBMRWFunc, "SDL_IMG_LoadLBMRWFunc", es_img_loadLBMRW }, { SDL_IMG_ReadXPMFromArrayFunc, "SDL_IMG_ReadXPMFromArrayFunc", es_img_readXPMFromArray }, { SDL_IMG_SetErrorFunc, "SDL_IMG_SetErrorFunc", es_img_setError }, { SDL_IMG_GetErrorFunc, "SDL_IMG_GetErrorFunc", es_img_getError }, #endif /* _USE_SDL_IMAGE */ esdl-1.2/c_src/esdl_spec.c0000644000076400010400000001060211540750057017425 0ustar familjenAdministratörer/* * Copyright (c) 2001 Dan Gudmundsson * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * * * $Id$ */ /* The special functions */ #include "esdl.h" void es_getSurface(sdl_data *sd, int len, char * buff) { char *bp, *start; int sendlen; SDL_Surface *screen; bp = buff; POPGLPTR(screen, bp); if(screen == NULL) { error(); } bp = start = sdl_getbuff(sd, 4*4+2+8*2); put32be(bp, screen->flags); PUSHGLPTR(screen->format, bp); put32be(bp, screen->w); put32be(bp, screen->h); put16be(bp, screen->pitch); PUSHGLPTR(screen->pixels, bp); put32be(bp, screen->offset); /* put32be(bp, screen->clip_minx); */ /* put32be(bp, screen->clip_maxx); */ /* put32be(bp, screen->clip_miny); */ /* put32be(bp, screen->clip_maxy); */ sendlen = bp - start; sdl_send(sd, sendlen); } void es_getPixelFormat(sdl_data *sd, int len, char * buff) { char *bp, *start; int sendlen; SDL_Surface * sptr; SDL_PixelFormat *format; bp = buff; POPGLPTR(sptr, bp); if(sptr == NULL) error(); format = sptr->format; if(format == NULL) error(); bp = start = sdl_get_temp_buff(sd, 8+5*4+11); PUSHGLPTR(format->palette, bp); put8(bp, format->BitsPerPixel); put8(bp, format->BytesPerPixel); put8(bp, format->Rloss); put8(bp, format->Gloss); put8(bp, format->Bloss); put8(bp, format->Aloss); put8(bp, format->Rshift); put8(bp, format->Gshift); put8(bp, format->Bshift); put8(bp, format->Ashift); put32be(bp, format->Rmask); put32be(bp, format->Gmask); put32be(bp, format->Bmask); put32be(bp, format->Amask); put32be(bp, format->colorkey); put8(bp, format->alpha); sendlen = bp - start; sdl_send(sd, sendlen); } void es_getPalette(sdl_data *sd, int len, char * buff) { char *bp, *start; int sendlen; SDL_Palette *palette; SDL_Surface *sptr; int i; bp = buff; POPGLPTR(sptr, bp); palette = sptr->format->palette; if(palette == NULL) { bp = start = sdl_getbuff(sd, 2); put16be(bp, 0); sendlen = bp - start; sdl_send(sd, sendlen); return; } bp = start = sdl_getbuff(sd, 2 + palette->ncolors * 3); put16be(bp, palette->ncolors); for(i = 0; i < palette->ncolors; i++) { put8(bp, palette->colors[i].r); put8(bp, palette->colors[i].g); put8(bp, palette->colors[i].b); } sendlen = bp - start; sdl_send(sd, sendlen); } void es_getPixels(sdl_data *sd, int len, char * buff) { char *bp, *start; SDL_Surface *sptr; int sendlen, x, y, w, h, xi, yi; Uint8 *row; bp = buff; POPGLPTR(sptr, bp); if(sptr == NULL) error(); x = get16be(bp); y = get16be(bp); w = get16be(bp); h = get16be(bp); if(sptr->pixels == NULL) error(); /* see /usr/local/src/SDL-1.1.3/src/video/SDL_surface.c FillRect */ start = bp = sdl_getbuff(sd, w*h*sptr->format->BytesPerPixel); row = (Uint8 *) sptr->pixels + y * sptr->pitch + x * sptr->format->BytesPerPixel; switch(sptr->format->BytesPerPixel) { case 1: { Uint8 *pixels; for(yi = h; yi; --yi){ pixels = (Uint8 *) row; for(xi = w; xi; --xi){ put8(bp, *pixels); pixels += 1; } row += sptr->pitch; } break; } case 2: { Uint16 *pixels; for(yi = h; yi; --yi){ pixels = (Uint16 *) row; for(xi = w; xi; --xi){ put16be(bp, *pixels); pixels++; } row += sptr->pitch; } } break; case 3: { Uint8 *pixels; for(yi = h; yi; --yi){ pixels = (Uint8 *) row; for(xi = w; xi; --xi){ put8(bp, *pixels); put8(bp, *(pixels+1)); put8(bp, *(pixels+2)); pixels += 3; } row += sptr->pitch; } } break; case 4: { Uint32 *pixels; for(yi = h; yi; --yi){ pixels = (Uint32 *) row; for(xi = w; xi; --xi){ put32be(bp, *pixels); pixels++; } row += sptr->pitch; } } break; } sendlen = bp - start; sdl_send(sd, sendlen); } esdl-1.2/c_src/esdl_ttf.c0000644000076400010400000004272111540750057017277 0ustar familjenAdministratörer/* * Copyright (c) 2007 Klas Johanssson * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * * $Id$ */ /* Map erl esdl_ttf calls to C sdl ttf calls */ #include "esdl.h" #include #include #include void es_ttf_linkedVersion(sdl_data *sd, int len, char *buff) { char *bp, *start; int sendlen; const SDL_version *version; version = TTF_Linked_Version(); bp = start = sdl_get_temp_buff(sd, 3); put8(bp, version->major); put8(bp, version->minor); put8(bp, version->patch); sendlen = bp - start; sdl_send(sd, sendlen); } void es_ttf_byteSwappedUNICODE(sdl_data *sd, int len, char *buff) { char *bp; int byteswap; bp = buff; byteswap = get16be(bp); TTF_ByteSwappedUNICODE(byteswap); } void es_ttf_init(sdl_data *sd, int len, char *buff) { char *bp, *start; int sendlen; int result; result = TTF_Init(); bp = start = sdl_get_temp_buff(sd, 2); put16be(bp, result); sendlen = bp - start; sdl_send(sd, sendlen); } void es_ttf_openFont(sdl_data *sd, int len, char *buff) { char *file, *bp, *start; int pointsize; int sendlen; TTF_Font *font; // read filename and pointsize file = buff; bp = file + strlen(file) + 1; pointsize = get16be(bp); // load font font = TTF_OpenFont(file, pointsize); // return a font pointer bp = start = sdl_get_temp_buff(sd, 8); PUSHGLPTR(font, bp); sendlen = bp - start; sdl_send(sd, sendlen); } void es_ttf_openFontIndex(sdl_data *sd, int len, char *buff) { char *file, *bp, *start; int pointsize; long index; int sendlen; TTF_Font *font; // read filename and pointsize file = buff; bp = file + strlen(file) + 1; pointsize = get16be(bp); index = get32be(bp); // load font font = TTF_OpenFontIndex(file, pointsize, index); // return a font pointer bp = start = sdl_get_temp_buff(sd, 8); PUSHGLPTR(font, bp); sendlen = bp - start; sdl_send(sd, sendlen); } void es_ttf_openFontRW(sdl_data *sd, int len, char *buff) { // not implemented } void es_ttf_openFontIndexRW(sdl_data *sd, int len, char *buff) { // not implemented } void es_ttf_getFontStyle(sdl_data *sd, int len, char *buff) { char *bp, *start; int sendlen; TTF_Font *font; int fontstyle; bp = buff; POPGLPTR(font, bp); fontstyle = TTF_GetFontStyle(font); start = bp = sdl_get_temp_buff(sd, 2); put16be(bp, fontstyle); sendlen = bp - start; sdl_send(sd, sendlen); } void es_ttf_setFontStyle(sdl_data *sd, int len, char *buff) { char *bp; TTF_Font *font; int fontstyle; bp = buff; POPGLPTR(font, bp); fontstyle = get16be(bp); TTF_SetFontStyle(font, fontstyle); } void es_ttf_fontHeight(sdl_data *sd, int len, char *buff) { char *bp, *start; int sendlen; TTF_Font *font; int fontheight; bp = buff; POPGLPTR(font, bp); fontheight = TTF_FontHeight(font); start = bp = sdl_get_temp_buff(sd, 2); put16be(bp, fontheight); sendlen = bp - start; sdl_send(sd, sendlen); } void es_ttf_fontAscent(sdl_data *sd, int len, char *buff) { char *bp, *start; int sendlen; TTF_Font *font; int fontascent; bp = buff; POPGLPTR(font, bp); fontascent = TTF_FontAscent(font); start = bp = sdl_get_temp_buff(sd, 2); put16be(bp, fontascent); sendlen = bp - start; sdl_send(sd, sendlen); } void es_ttf_fontDescent(sdl_data *sd, int len, char *buff) { char *bp, *start; int sendlen; TTF_Font *font; int fontdescent; bp = buff; POPGLPTR(font, bp); fontdescent = TTF_FontDescent(font); start = bp = sdl_get_temp_buff(sd, 2); put16be(bp, fontdescent); sendlen = bp - start; sdl_send(sd, sendlen); } void es_ttf_fontLineSkip(sdl_data *sd, int len, char *buff) { char *bp, *start; int sendlen; TTF_Font *font; int fontlineskip; bp = buff; POPGLPTR(font, bp); fontlineskip = TTF_FontLineSkip(font); start = bp = sdl_get_temp_buff(sd, 2); put16be(bp, fontlineskip); sendlen = bp - start; sdl_send(sd, sendlen); } void es_ttf_fontFaces(sdl_data *sd, int len, char *buff) { char *bp, *start; int sendlen; TTF_Font *font; long numfaces; bp = buff; POPGLPTR(font, bp); numfaces = TTF_FontFaces(font); start = bp = sdl_get_temp_buff(sd, 4); put32be(bp, numfaces); sendlen = bp - start; sdl_send(sd, sendlen); } void es_ttf_fontFaceIsFixedWidth(sdl_data *sd, int len, char *buff) { char *bp, *start; int sendlen; TTF_Font *font; int isfixed; bp = buff; POPGLPTR(font, bp); isfixed = TTF_FontFaceIsFixedWidth(font); start = bp = sdl_get_temp_buff(sd, 2); put16be(bp, isfixed); sendlen = bp - start; sdl_send(sd, sendlen); } void es_ttf_fontFaceFamilyName(sdl_data *sd, int len, char *buff) { char *bp, *start; int sendlen = 0; TTF_Font *font; char *familyname; bp = buff; POPGLPTR(font, bp); familyname = TTF_FontFaceFamilyName(font); if (familyname) { sendlen = strlen(familyname); bp = start = sdl_getbuff(sd, sendlen); while(*familyname != '\0') { put8(bp, *familyname++); } } sdl_send(sd, sendlen); } void es_ttf_fontFaceStyleName(sdl_data *sd, int len, char *buff) { char *bp, *start; int sendlen = 0; TTF_Font *font; char *stylename; bp = buff; POPGLPTR(font, bp); stylename = TTF_FontFaceStyleName(font); if (stylename) { sendlen = strlen(stylename); bp = start = sdl_getbuff(sd, sendlen); while(*stylename != '\0') { put8(bp, *stylename++); } } sdl_send(sd, sendlen); } void es_ttf_glyphMetrics(sdl_data *sd, int len, char *buff) { char *bp, *start; int sendlen; TTF_Font *font; Uint16 ch; int minx, maxx, miny, maxy, advance; int res; bp = buff; POPGLPTR(font, bp); ch = get16be(bp); res = TTF_GlyphMetrics(font, ch, &minx, &maxx, &miny, &maxy, &advance); bp = start = sdl_get_temp_buff(sd, 12); put16be(bp, res); put16be(bp, minx); put16be(bp, maxx); put16be(bp, miny); put16be(bp, maxy); put16be(bp, advance); sendlen = bp - start; sdl_send(sd, sendlen); } void es_ttf_sizeText(sdl_data *sd, int len, char *buff) { char *text, *bp, *start; int sendlen; TTF_Font *font; int res, w, h; bp = buff; POPGLPTR(font, bp); text = bp; res = TTF_SizeText(font, text, &w, &h); bp = start = sdl_get_temp_buff(sd, 6); put16be(bp, res); put16be(bp, w); put16be(bp, h); sendlen = bp - start; sdl_send(sd, sendlen); } void es_ttf_sizeUTF8(sdl_data *sd, int len, char *buff) { char *text, *bp, *start; int sendlen; TTF_Font *font; int res, w, h; bp = buff; POPGLPTR(font, bp); text = bp; res = TTF_SizeUTF8(font, text, &w, &h); bp = start = sdl_get_temp_buff(sd, 6); put16be(bp, res); put16be(bp, w); put16be(bp, h); sendlen = bp - start; sdl_send(sd, sendlen); } void es_ttf_sizeUNICODE(sdl_data *sd, int len, char *buff) { char *bp, *start; Uint16 *text; int sendlen; TTF_Font *font; int res, w, h; bp = buff; POPGLPTR(font, bp); text = (Uint16 *) bp; res = TTF_SizeUNICODE(font, text, &w, &h); bp = start = sdl_get_temp_buff(sd, 6); put16be(bp, res); put16be(bp, w); put16be(bp, h); sendlen = bp - start; sdl_send(sd, sendlen); } void es_ttf_renderTextSolid(sdl_data *sd, int len, char *buff) { char *text, *bp, *start; int sendlen; TTF_Font *font; SDL_Surface *surface; SDL_Color fgcolor; bp = buff; // read input // note: The order in which the arguments arrive and are passed to // the TTF function differ. We're avoiding a strlen (and the // like) by having the text as the last parameter. POPGLPTR(font, bp); fgcolor.r = get8(bp); fgcolor.g = get8(bp); fgcolor.b = get8(bp); text = bp; // render text surface = TTF_RenderText_Solid(font, text, fgcolor); // return a surface pointer bp = start = sdl_get_temp_buff(sd, 8); PUSHGLPTR(surface, bp); sendlen = bp - start; sdl_send(sd, sendlen); } void es_ttf_renderUTF8Solid(sdl_data *sd, int len, char *buff) { char *text, *bp, *start; int sendlen; TTF_Font *font; SDL_Surface *surface; SDL_Color fgcolor; bp = buff; // read input // note: note: see note on parameter ordering in es_ttf_renderTextSolid POPGLPTR(font, bp); fgcolor.r = get8(bp); fgcolor.g = get8(bp); fgcolor.b = get8(bp); text = bp; // render text surface = TTF_RenderUTF8_Solid(font, text, fgcolor); // return a surface pointer bp = start = sdl_get_temp_buff(sd, 8); PUSHGLPTR(surface, bp); sendlen = bp - start; sdl_send(sd, sendlen); } void es_ttf_renderUNICODESolid(sdl_data *sd, int len, char *buff) { char *bp, *start; Uint16 *text; int sendlen; TTF_Font *font; SDL_Surface *surface; SDL_Color fgcolor; bp = buff; // read input // note: note: see note on parameter ordering in es_ttf_renderTextSolid POPGLPTR(font, bp); fgcolor.r = get8(bp); fgcolor.g = get8(bp); fgcolor.b = get8(bp); text = (Uint16 *) bp; // render text surface = TTF_RenderUNICODE_Solid(font, text, fgcolor); // return a surface pointer bp = start = sdl_get_temp_buff(sd, 8); PUSHGLPTR(surface, bp); sendlen = bp - start; sdl_send(sd, sendlen); } void es_ttf_renderGlyphSolid(sdl_data *sd, int len, char *buff) { char *bp, *start; Uint16 ch; int sendlen; TTF_Font *font; SDL_Surface *surface; SDL_Color fgcolor; bp = buff; // read input // note: note: see note on parameter ordering in es_ttf_renderTextSolid POPGLPTR(font, bp); fgcolor.r = get8(bp); fgcolor.g = get8(bp); fgcolor.b = get8(bp); ch = get16be(bp); // render glyph surface = TTF_RenderGlyph_Solid(font, ch, fgcolor); // return a surface pointer bp = start = sdl_get_temp_buff(sd, 8); PUSHGLPTR(surface, bp); sendlen = bp - start; sdl_send(sd, sendlen); } void es_ttf_renderTextShaded(sdl_data *sd, int len, char *buff) { char *text, *bp, *start; int sendlen; TTF_Font *font; SDL_Surface *surface; SDL_Color fgcolor, bgcolor; bp = buff; // read input // note: note: see note on parameter ordering in es_ttf_renderTextSolid POPGLPTR(font, bp); fgcolor.r = get8(bp); fgcolor.g = get8(bp); fgcolor.b = get8(bp); bgcolor.r = get8(bp); bgcolor.g = get8(bp); bgcolor.b = get8(bp); text = bp; // render text surface = TTF_RenderText_Shaded(font, text, fgcolor, bgcolor); // return a surface pointer bp = start = sdl_get_temp_buff(sd, 8); PUSHGLPTR(surface, bp); sendlen = bp - start; sdl_send(sd, sendlen); } void es_ttf_renderUTF8Shaded(sdl_data *sd, int len, char *buff) { char *text, *bp, *start; int sendlen; TTF_Font *font; SDL_Surface *surface; SDL_Color fgcolor, bgcolor; bp = buff; // read input // note: note: see note on parameter ordering in es_ttf_renderTextSolid POPGLPTR(font, bp); fgcolor.r = get8(bp); fgcolor.g = get8(bp); fgcolor.b = get8(bp); bgcolor.r = get8(bp); bgcolor.g = get8(bp); bgcolor.b = get8(bp); text = bp; // render text surface = TTF_RenderUTF8_Shaded(font, text, fgcolor, bgcolor); // return a surface pointer bp = start = sdl_get_temp_buff(sd, 8); PUSHGLPTR(surface, bp); sendlen = bp - start; sdl_send(sd, sendlen); } void es_ttf_renderUNICODEShaded(sdl_data *sd, int len, char *buff) { char *bp, *start; Uint16 *text; int sendlen; TTF_Font *font; SDL_Surface *surface; SDL_Color fgcolor, bgcolor; bp = buff; // read input // note: note: see note on parameter ordering in es_ttf_renderTextSolid POPGLPTR(font, bp); fgcolor.r = get8(bp); fgcolor.g = get8(bp); fgcolor.b = get8(bp); bgcolor.r = get8(bp); bgcolor.g = get8(bp); bgcolor.b = get8(bp); text = (Uint16 *) bp; // render text surface = TTF_RenderUNICODE_Shaded(font, text, fgcolor, bgcolor); // return a surface pointer bp = start = sdl_get_temp_buff(sd, 8); PUSHGLPTR(surface, bp); sendlen = bp - start; sdl_send(sd, sendlen); } void es_ttf_renderGlyphShaded(sdl_data *sd, int len, char *buff) { char *bp, *start; Uint16 ch; int sendlen; TTF_Font *font; SDL_Surface *surface; SDL_Color fgcolor, bgcolor; bp = buff; // read input // note: note: see note on parameter ordering in es_ttf_renderTextSolid POPGLPTR(font, bp); fgcolor.r = get8(bp); fgcolor.g = get8(bp); fgcolor.b = get8(bp); bgcolor.r = get8(bp); bgcolor.g = get8(bp); bgcolor.b = get8(bp); ch = get16be(bp); // render glyph surface = TTF_RenderGlyph_Shaded(font, ch, fgcolor, bgcolor); // return a surface pointer bp = start = sdl_get_temp_buff(sd, 8); PUSHGLPTR(surface, bp); sendlen = bp - start; sdl_send(sd, sendlen); } void es_ttf_renderTextBlended(sdl_data *sd, int len, char *buff) { char *text, *bp, *start; int sendlen; TTF_Font *font; SDL_Surface *surface; SDL_Color fgcolor; bp = buff; // read input // note: note: see note on parameter ordering in es_ttf_renderTextSolid POPGLPTR(font, bp); fgcolor.r = get8(bp); fgcolor.g = get8(bp); fgcolor.b = get8(bp); text = bp; // render text surface = TTF_RenderText_Blended(font, text, fgcolor); // return a surface pointer bp = start = sdl_get_temp_buff(sd, 8); PUSHGLPTR(surface, bp); sendlen = bp - start; sdl_send(sd, sendlen); } void es_ttf_renderUTF8Blended(sdl_data *sd, int len, char *buff) { char *text, *bp, *start; int sendlen; TTF_Font *font; SDL_Surface *surface; SDL_Color fgcolor; bp = buff; // read input // note: note: see note on parameter ordering in es_ttf_renderTextSolid POPGLPTR(font, bp); fgcolor.r = get8(bp); fgcolor.g = get8(bp); fgcolor.b = get8(bp); text = bp; // render text surface = TTF_RenderText_Blended(font, text, fgcolor); // return a surface pointer bp = start = sdl_get_temp_buff(sd, 8); PUSHGLPTR(surface, bp); sendlen = bp - start; sdl_send(sd, sendlen); } void es_ttf_renderUNICODEBlended(sdl_data *sd, int len, char *buff) { char *bp, *start; Uint16 *text; int sendlen; TTF_Font *font; SDL_Surface *surface; SDL_Color fgcolor; bp = buff; // read input // note: note: see note on parameter ordering in es_ttf_renderTextSolid POPGLPTR(font, bp); fgcolor.r = get8(bp); fgcolor.g = get8(bp); fgcolor.b = get8(bp); text = (Uint16 *) bp; // render text surface = TTF_RenderUNICODE_Blended(font, text, fgcolor); // return a surface pointer bp = start = sdl_get_temp_buff(sd, 8); PUSHGLPTR(surface, bp); sendlen = bp - start; sdl_send(sd, sendlen); } void es_ttf_renderGlyphBlended(sdl_data *sd, int len, char *buff) { char *bp, *start; Uint16 ch; int sendlen; TTF_Font *font; SDL_Surface *surface; SDL_Color fgcolor; bp = buff; // read input // note: note: see note on parameter ordering in es_ttf_renderTextSolid POPGLPTR(font, bp); fgcolor.r = get8(bp); fgcolor.g = get8(bp); fgcolor.b = get8(bp); ch = get16be(bp); // render glyph surface = TTF_RenderGlyph_Blended(font, ch, fgcolor); // return a surface pointer bp = start = sdl_get_temp_buff(sd, 8); PUSHGLPTR(surface, bp); sendlen = bp - start; sdl_send(sd, sendlen); } void es_ttf_closeFont(sdl_data *sd, int len, char *buff) { char *bp; TTF_Font *font; bp = buff; POPGLPTR(font, bp); TTF_CloseFont(font); } void es_ttf_quit(sdl_data *sd, int len, char *buff) { TTF_Quit(); } void es_ttf_wasInit(sdl_data *sd, int len, char *buff) { char *bp, *start; int res; int sendlen; res = TTF_WasInit(); bp = start = sdl_get_temp_buff(sd, 2); put16be(bp, res); sendlen = bp - start; sdl_send(sd, sendlen); } void es_ttf_setError(sdl_data *sd, int len, char *buff) { // not implemented } void es_ttf_getError(sdl_data *sd, int len, char *buff) { char *err, *bp, *start; int length; err = TTF_GetError(); length = strlen(err); bp = start = sdl_getbuff(sd, length); while(*err != '\0') { put8(bp, *err++); } sdl_send(sd, bp - start); } esdl-1.2/c_src/esdl_ttf.h0000644000076400010400000001206211540750057017277 0ustar familjenAdministratörer/* * Copyright (c) 2007 Klas Johansson * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * * * $Id$ */ /* Defines the text/ttf functions */ #ifdef _USE_SDL_TTF #ifdef __cplusplus extern "C" { #endif #define SDL_TTF_Linked_VersionFunc TTF_H +1 void es_ttf_linkedVersion(sdl_data *, int, char *); #define SDL_TTF_ByteSwappedUNICODEFunc SDL_TTF_Linked_VersionFunc +1 void es_ttf_byteSwappedUNICODE(sdl_data *, int, char *); #define SDL_TTF_InitFunc SDL_TTF_ByteSwappedUNICODEFunc +1 void es_ttf_init(sdl_data *, int, char *); #define SDL_TTF_OpenFontFunc SDL_TTF_InitFunc +1 void es_ttf_openFont(sdl_data *, int, char *); #define SDL_TTF_OpenFontIndexFunc SDL_TTF_OpenFontFunc +1 void es_ttf_openFontIndex(sdl_data *, int, char *); #define SDL_TTF_OpenFontRWFunc SDL_TTF_OpenFontIndexFunc +1 void es_ttf_openFontRW(sdl_data *, int, char *); #define SDL_TTF_OpenFontIndexRWFunc SDL_TTF_OpenFontRWFunc +1 void es_ttf_openFontIndexRW(sdl_data *, int, char *); #define SDL_TTF_GetFontStyleFunc SDL_TTF_OpenFontIndexRWFunc +1 void es_ttf_getFontStyle(sdl_data *, int, char *); #define SDL_TTF_SetFontStyleFunc SDL_TTF_GetFontStyleFunc +1 void es_ttf_setFontStyle(sdl_data *, int, char *); #define SDL_TTF_FontHeightFunc SDL_TTF_SetFontStyleFunc +1 void es_ttf_fontHeight(sdl_data *, int, char *); #define SDL_TTF_FontAscentFunc SDL_TTF_FontHeightFunc +1 void es_ttf_fontAscent(sdl_data *, int, char *); #define SDL_TTF_FontDescentFunc SDL_TTF_FontAscentFunc +1 void es_ttf_fontDescent(sdl_data *, int, char *); #define SDL_TTF_FontLineSkipFunc SDL_TTF_FontDescentFunc +1 void es_ttf_fontLineSkip(sdl_data *, int, char *); #define SDL_TTF_FontFacesFunc SDL_TTF_FontLineSkipFunc +1 void es_ttf_fontFaces(sdl_data *, int, char *); #define SDL_TTF_FontFaceIsFixedWidthFunc SDL_TTF_FontFacesFunc +1 void es_ttf_fontFaceIsFixedWidth(sdl_data *, int, char *); #define SDL_TTF_FontFaceFamilyNameFunc SDL_TTF_FontFaceIsFixedWidthFunc +1 void es_ttf_fontFaceFamilyName(sdl_data *, int, char *); #define SDL_TTF_FontFaceStyleNameFunc SDL_TTF_FontFaceFamilyNameFunc +1 void es_ttf_fontFaceStyleName(sdl_data *, int, char *); #define SDL_TTF_GlyphMetricsFunc SDL_TTF_FontFaceStyleNameFunc +1 void es_ttf_glyphMetrics(sdl_data *, int, char *); #define SDL_TTF_SizeTextFunc SDL_TTF_GlyphMetricsFunc +1 void es_ttf_sizeText(sdl_data *, int, char *); #define SDL_TTF_SizeUTF8Func SDL_TTF_SizeTextFunc +1 void es_ttf_sizeUTF8(sdl_data *, int, char *); #define SDL_TTF_SizeUNICODEFunc SDL_TTF_SizeUTF8Func +1 void es_ttf_sizeUNICODE(sdl_data *, int, char *); #define SDL_TTF_RenderText_SolidFunc SDL_TTF_SizeUNICODEFunc +1 void es_ttf_renderTextSolid(sdl_data *, int, char *); #define SDL_TTF_RenderUTF8_SolidFunc SDL_TTF_RenderText_SolidFunc +1 void es_ttf_renderUTF8Solid(sdl_data *, int, char *); #define SDL_TTF_RenderUNICODE_SolidFunc SDL_TTF_RenderUTF8_SolidFunc +1 void es_ttf_renderUNICODESolid(sdl_data *, int, char *); #define SDL_TTF_RenderGlyph_SolidFunc SDL_TTF_RenderUNICODE_SolidFunc +1 void es_ttf_renderGlyphSolid(sdl_data *, int, char *); #define SDL_TTF_RenderText_ShadedFunc SDL_TTF_RenderGlyph_SolidFunc +1 void es_ttf_renderTextShaded(sdl_data *, int, char *); #define SDL_TTF_RenderUTF8_ShadedFunc SDL_TTF_RenderText_ShadedFunc +1 void es_ttf_renderUTF8Shaded(sdl_data *, int, char *); #define SDL_TTF_RenderUNICODE_ShadedFunc SDL_TTF_RenderUTF8_ShadedFunc +1 void es_ttf_renderUNICODEShaded(sdl_data *, int, char *); #define SDL_TTF_RenderGlyph_ShadedFunc SDL_TTF_RenderUNICODE_ShadedFunc +1 void es_ttf_renderGlyphShaded(sdl_data *, int, char *); #define SDL_TTF_RenderText_BlendedFunc SDL_TTF_RenderGlyph_ShadedFunc +1 void es_ttf_renderTextBlended(sdl_data *, int, char *); #define SDL_TTF_RenderUTF8_BlendedFunc SDL_TTF_RenderText_BlendedFunc +1 void es_ttf_renderUTF8Blended(sdl_data *, int, char *); #define SDL_TTF_RenderUNICODE_BlendedFunc SDL_TTF_RenderUTF8_BlendedFunc +1 void es_ttf_renderUNICODEBlended(sdl_data *, int, char *); #define SDL_TTF_RenderGlyph_BlendedFunc SDL_TTF_RenderUNICODE_BlendedFunc +1 void es_ttf_renderGlyphBlended(sdl_data *, int, char *); #define SDL_TTF_CloseFontFunc SDL_TTF_RenderGlyph_BlendedFunc +1 void es_ttf_closeFont(sdl_data *, int, char *); #define SDL_TTF_QuitFunc SDL_TTF_CloseFontFunc +1 void es_ttf_quit(sdl_data *, int, char *); #define SDL_TTF_WasInitFunc SDL_TTF_QuitFunc +1 void es_ttf_wasInit(sdl_data *, int, char *); #define SDL_TTF_SetErrorFunc SDL_TTF_WasInitFunc +1 void es_ttf_setError(sdl_data *, int, char *); #define SDL_TTF_GetErrorFunc SDL_TTF_SetErrorFunc +1 void es_ttf_getError(sdl_data *, int, char *); #ifdef __cplusplus } #endif #endif /* _USE_SDL_TTF */ esdl-1.2/c_src/esdl_util.c0000644000076400010400000000513711540750057017457 0ustar familjenAdministratörer/* * Copyright (c) 2001 Dan Gudmundsson * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * * $Id$ */ /* * Some useful extra functions */ #ifdef _WIN32 #include #endif #include #include /* malloc */ #ifdef FLAVOUR_WOGGLE #include #else #include "esdl.h" #endif void mygl_alloc(sdl_data *sd, int len, char *bp) { char *start; unsigned size; size = * (unsigned *) bp; bp = start = sdl_getbuff(sd, size); sdl_send(sd, size); } void mygl_write(sdl_data *sd, int len, char *bp) { if (sd->next_bin == 1) { memcpy(sd->bin[0].base, bp, len); } else if (sd->next_bin == 2) { memcpy(sd->bin[0].base, sd->bin[1].base, sd->bin[1].size); } sdl_free_binaries(sd); } #ifndef FLAVOUR_WOGGLE void copySdlImage2GLArray(sdl_data *sd, int len, char * buff) { Uint8 *rowhi, *rowlo, type; SDL_Surface *image; unsigned char * mem; char *bp, *start; int i, j = 0, k; Uint8 rs,bs,gs,as; bp = buff; POPGLPTR(image, bp); type = *bp; if (sd->next_bin == 1) { mem = (unsigned char *) sd->bin[0].base; #if SDL_BYTEORDER == SDL_BIG_ENDIAN rs = (2 - image->format->Rshift/8); gs = (2 - image->format->Gshift/8); bs = (2 - image->format->Bshift/8); as = (2 - image->format->Ashift/8); #else rs = image->format->Rshift/8; gs = image->format->Gshift/8; bs = image->format->Bshift/8; as = image->format->Ashift/8; #endif /* GL surfaces are upsidedown (according to SDL examples)?? */ k = 0; rowhi = (Uint8 *)image->pixels; rowlo = rowhi + (image->h * image->pitch) - image->pitch; for(i=0; ih; ++i ) { for(j=0; jw; ++j ) { switch(image->format->BytesPerPixel) { case 1: mem[k++] = image->format->palette->colors[rowlo[j]].r; mem[k++] = image->format->palette->colors[rowlo[j]].g; mem[k++] = image->format->palette->colors[rowlo[j]].b; if(type == 4) mem[k++] = 0; break; case 3: mem[k++] = rowlo[j*3 + rs]; mem[k++] = rowlo[j*3 + gs]; mem[k++] = rowlo[j*3 + bs]; if(type == 4) mem[k++] = 0; break; case 4: mem[k++] = rowlo[j*4 + rs]; mem[k++] = rowlo[j*4 + gs]; mem[k++] = rowlo[j*4 + bs]; if(type == 4) mem[k++] = rowlo[j*4 + as]; break; } } rowlo -= image->pitch; } /* fprintf(stderr, "i %d, j %d k%d\n\r", i, j, k); */ start = sdl_get_temp_buff(sd, 2); start[0] = 1; sdl_send(sd, 1); sdl_free_binaries(sd); } } #endif esdl-1.2/c_src/esdl_util.h0000644000076400010400000000210211540750057017451 0ustar familjenAdministratörer/* * Copyright (c) 2001 Dan Gudmundsson * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * * $Id$ */ #ifdef __cplusplus extern "C" { #endif #include #define getPointer(bp) ((void *) get32be((bp))) #define putPointer(bp, ptr) put32be((bp), ((int) (ptr))) /* We always use 8 bytes to store pointers */ #define POPGLPTR(dstp, srcp) \ do { memcpy(&dstp,srcp,sizeof(void *)); srcp += 8; } while (0) #define PUSHGLPTR(srcp,dstp) \ do { memset(dstp,0,8);memcpy(dstp,&srcp,sizeof(void *)); dstp += 8; } while (0) #define SDL_UTIL_copySdlImage2GLArrayFunc (SDL_UTIL_H+1) void copySdlImage2GLArray(sdl_data *, int, char *); #define SDL_UTIL_DebugFunc (SDL_UTIL_H+2) void sdl_util_debug(sdl_data *sd, int len, char * buff); #define mygl_allocFunc (SDL_UTIL_H+3) void mygl_alloc(sdl_data *, int, char *); #define mygl_writeFunc (SDL_UTIL_H+4) void mygl_write(sdl_data *, int, char *); #ifdef __cplusplus } #endif esdl-1.2/c_src/esdl_video.c0000644000076400010400000005524511540750057017615 0ustar familjenAdministratörer/* * Copyright (c) 2001 Dan Gudmundsson * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * * $Id$ */ /* * sdl_video functions */ #include #include #include "esdl.h" #include void es_setVideoMode(sdl_data *sd, int len, char* bp) { if(!sd->use_smp) { es_setVideoMode2(sd->driver_data, driver_caller(sd->driver_data), bp); } else { /* opengl initialization must be called from thread */ gl_dispatch(sd, SDL_SetVideoModeFunc, len, bp); } } void es_setVideoMode2(ErlDrvPort port, ErlDrvTermData caller, char* bp) { int w, h, bpp, type; SDL_Surface *screen; ErlDrvTermData rt[8]; w = get16be(bp); h = get16be(bp); bpp = get16be(bp); type = get32be(bp); screen = SDL_SetVideoMode(w, h, bpp, type), rt[0] = ERL_DRV_ATOM; rt[1]=driver_mk_atom((char *) "_esdl_result_"); rt[2] = ERL_DRV_UINT; rt[3] = (ErlDrvUInt) screen; rt[4] = ERL_DRV_TUPLE; rt[5] = 2; driver_send_term(port,caller,rt,6); } void es_videoDriverName(sdl_data *sd, int len, char *buff) { char *bp; int sendlen = 0; bp = sdl_get_temp_buff(sd, 512); if (SDL_VideoDriverName(bp, 512) != NULL) { sendlen = strlen(bp); } sdl_send(sd, sendlen); } void es_getVideoSurface(sdl_data *sd, int len, char *buff) { char *bp, *start; int sendlen; SDL_Surface *ref; bp = start = sdl_get_temp_buff(sd, 8); ref = SDL_GetVideoSurface(); PUSHGLPTR(ref, bp); sendlen = bp - start; sdl_send(sd, sendlen); } void es_getVideoInfo(sdl_data *sd, int len, char *buff) { char *bp, *start; int sendlen; const SDL_VideoInfo *vi; bp = start = sdl_get_temp_buff(sd, 9+2*8); vi = SDL_GetVideoInfo(); if(vi->hw_available) put8(bp, 1); else put8(bp, 0); if(vi->wm_available) put8(bp, 1); else put8(bp, 0); if(vi->blit_hw) put8(bp, 1); else put8(bp, 0); if(vi->blit_hw_CC) put8(bp, 1); else put8(bp, 0); if(vi->blit_hw_A) put8(bp, 1); else put8(bp, 0); if(vi->blit_sw) put8(bp, 1); else put8(bp, 0); if(vi->blit_sw_CC) put8(bp, 1); else put8(bp, 0); if(vi->blit_sw_A) put8(bp, 1); else put8(bp, 0); if(vi->blit_fill) put8(bp, 1); else put8(bp, 0); put32be(bp, vi->video_mem); PUSHGLPTR(vi->vfmt, bp); sendlen = bp - start; sdl_send(sd, sendlen); } void es_videoModeOK(sdl_data *sd, int len, char *bp) { if(!sd->use_smp) { es_videoModeOK2(sd->driver_data, driver_caller(sd->driver_data), bp); } else { gl_dispatch(sd, SDL_VideoModeOKFunc, len, bp); } } void es_videoModeOK2(ErlDrvPort port, ErlDrvTermData caller, char *buff) { char *bp; int w, h, bpp, type; int res; ErlDrvTermData rt[8]; bp = buff; w = get16be(bp); h = get16be(bp); bpp = get16be(bp); type = get32be(bp); res = SDL_VideoModeOK(w,h,bpp,type); rt[0] = ERL_DRV_ATOM; rt[1]=driver_mk_atom((char *) "_esdl_result_"); rt[2] = ERL_DRV_INT; rt[3] = res; rt[4] = ERL_DRV_TUPLE; rt[5] = 2; driver_send_term(port,caller,rt,6); } void es_listModes(sdl_data *sd, int len, char *buff) { char *bp, *start; int sendlen, i; Uint32 flags; SDL_PixelFormat *pfp, pf; SDL_Rect ** res; bp = buff; flags = get32be(bp); switch(get8(bp)) { case 0: POPGLPTR(pfp, bp); break; case 1: POPGLPTR(pf.palette, bp); pf.BitsPerPixel = get8(bp); pf.BytesPerPixel = get8(bp); pf.Rloss = get8(bp); pf.Gloss = get8(bp); pf.Bloss = get8(bp); pf.Aloss = get8(bp); pf.Rshift = get8(bp); pf.Gshift = get8(bp); pf.Bshift = get8(bp); pf.Ashift = get8(bp); pf.Rmask = get32be(bp); pf.Gmask = get32be(bp); pf.Bmask = get32be(bp); pf.Amask = get32be(bp); pf.colorkey= get32be(bp); pf.alpha= get8(bp); pfp = &pf; default: error(); } bp = start = sdl_get_temp_buff(sd, 128*2*4+1); res = SDL_ListModes(pfp, flags); switch((long)res) { case 0: /* NULL */ put8(bp, 0); break; case -1: put8(bp,-1); break; default: put8(bp,0); /* Wasted byte :- )*/ for(i=0; res[i]; i++) { put16be(bp, res[i]->x); put16be(bp, res[i]->y); put16be(bp, res[i]->w); put16be(bp, res[i]->h); } } sendlen = bp - start; sdl_send(sd, sendlen); } void es_flip(sdl_data *sd, int len, char *buff) { char *bp, *start; int sendlen, res; SDL_Surface *ref; bp = buff; POPGLPTR(ref, bp); res = SDL_Flip(ref); start = bp = sdl_get_temp_buff(sd, 1); put8(bp, res); sendlen = bp - start; sdl_send(sd, sendlen); } void es_setColors(sdl_data *sd, int len, char *buff) { char *bp, *start; int sendlen, res = 1, first, length, i, tot =0; SDL_Surface *ref; SDL_Color colors[256]; bp = buff; POPGLPTR(ref, bp); first = get32be(bp); length = get32be(bp); do { for(i = 0; i < length && i < 256; i++) { colors[i].r = get8(bp); colors[i].b = get8(bp); colors[i].g = get8(bp); }; res &= SDL_SetColors(ref, colors, first, i); tot += i; first += i; } while(tot < length); start = bp = sdl_get_temp_buff(sd, 1); put8(bp, res); sendlen = bp - start; sdl_send(sd, sendlen); } void es_mapRGB(sdl_data *sd, int len, char *buff) { char *bp, *start; int sendlen; SDL_Surface * sptr; Uint32 res; Uint8 r,g,b; bp = buff; POPGLPTR(sptr, bp); r = get8(bp); g = get8(bp); b = get8(bp); if(sptr == NULL || sptr->format == NULL) error(); res = SDL_MapRGB(sptr->format, r,g,b); bp = start = sdl_get_temp_buff(sd, 4); put32be(bp, res); sendlen = bp - start; sdl_send(sd, sendlen); } void es_getRGB(sdl_data *sd, int len, char *buff) { error(); } void es_blitSurface(sdl_data *sd, int len, char * buff) { char *bp, *start; int sendlen; char type, res; SDL_Surface *sptr, *dptr; SDL_Rect s, d, *src, *dest; bp = buff; POPGLPTR(sptr, bp); POPGLPTR(dptr, bp); src = &s; dest = &d; switch get8(bp) { case 0: src = NULL; dest= NULL; type = 0; break; case 1: src->x = get16be(bp); src->y = get16be(bp); src->w = get16be(bp); src->h = get16be(bp); dest = NULL; type = 1; break; case 2: dest->x = get16be(bp); dest->y = get16be(bp); dest->w = get16be(bp); dest->h = get16be(bp); src = NULL; type = 2; break; case 3: src->x = get16be(bp); src->y = get16be(bp); src->w = get16be(bp); src->h = get16be(bp); dest->x = get16be(bp); dest->y = get16be(bp); dest->w = get16be(bp); dest->h = get16be(bp); type = 3; break; default: error(); }; res = SDL_BlitSurface(sptr, src, dptr, dest); bp = start = sdl_get_temp_buff(sd, 9*2); put8(bp, res); put8(bp, type); switch(type) { case 0: break; case 1: put16be(bp, src->x); put16be(bp, src->y); put16be(bp, src->w); put16be(bp, src->h); break; case 2: put16be(bp, dest->x); put16be(bp, dest->y); put16be(bp, dest->w); put16be(bp, dest->h); break; case 3: put16be(bp, src->x); put16be(bp, src->y); put16be(bp, src->w); put16be(bp, src->h); put16be(bp, dest->x); put16be(bp, dest->y); put16be(bp, dest->w); put16be(bp, dest->h); break; default: error(); }; sendlen = bp - start; sdl_send(sd, sendlen); } void print_rect(SDL_Rect * r) { if(r) fprintf(stderr, "x %d y %d w %d h %d \n\r", r->x, r->y, r->w, r->h); else fprintf(stderr, "Rect is null\n\r"); } void es_fillRect(sdl_data *sd, int len, char * buff) { char *bp, *start; int sendlen; char res; SDL_Surface *sptr; SDL_Rect s, *src; Uint32 color; src = &s; bp = buff; POPGLPTR(sptr, bp); color = get32be(bp); if(get8(bp) == 0) { src = NULL; } else { src->x = get16be(bp); src->y = get16be(bp); src->w = get16be(bp); src->h = get16be(bp); } res = SDL_FillRect(sptr, src, color); bp = start = sdl_get_temp_buff(sd, 1); put8(bp, res); sendlen = bp - start; sdl_send(sd, sendlen); } void es_updateRects(sdl_data *sd, int len, char * buff) { char *bp; int length, i, all; SDL_Surface *sptr; SDL_Rect s[64], *sr; bp = buff; POPGLPTR(sptr, bp); length = get16be(bp); all = 0; while(all < length) { sr = s; for(i = 0; i < 64 && all < length; i++, all++) { sr->x = get16be(bp); sr->y = get16be(bp); sr->w = get16be(bp); sr->h = get16be(bp); sr++; } SDL_UpdateRects(sptr, i, s); } } void es_setColorKey(sdl_data *sd, int len, char * buff) { char *bp, *start; int sendlen; SDL_Surface * sptr; Uint32 flag, key; int res; bp = buff; POPGLPTR(sptr, bp); if(sptr == NULL) error(); flag = get32be(bp); key = get32be(bp); res = SDL_SetColorKey(sptr, flag, key); bp = start = sdl_get_temp_buff(sd, 1); put8(bp, res); sendlen = bp - start; sdl_send(sd, sendlen); } void es_displayFormat(sdl_data *sd, int len, char * buff) { char *bp, *start; int sendlen; SDL_Surface * sptr, *new; bp = buff; POPGLPTR(sptr, bp); if(sptr == NULL) error(); new = SDL_DisplayFormat(sptr); bp = start = sdl_get_temp_buff(sd, 8); PUSHGLPTR(new, bp); sendlen = bp - start; sdl_send(sd, sendlen); } void es_createRGBSurface(sdl_data *sd, int len, char *buff){ char *bp, *start; int sendlen; SDL_Surface * sptr; int width, height, depth, def; Uint32 flags, rmask, gmask, bmask, amask; bp = buff; flags = get32be(bp); width = get16be(bp); height = get16be(bp); depth = get8(bp); def = get8(bp); if (def==1) { rmask = get32be(bp); gmask = get32be(bp); bmask = get32be(bp); amask = get32be(bp); } else { #if SDL_BYTEORDER == SDL_LIL_ENDIAN /* OpenGL RGBA masks */ rmask = 0x000000FF; gmask = 0x0000FF00; bmask = 0x00FF0000; amask = 0xFF000000; #else rmask = 0xFF000000; gmask = 0x00FF0000; bmask = 0x0000FF00; amask = 0x000000FF; #endif }; sptr = SDL_CreateRGBSurface(flags, width, height, depth, rmask, gmask, bmask, amask); bp = start = sdl_get_temp_buff(sd, 8); PUSHGLPTR(sptr, bp); sendlen = bp - start; sdl_send(sd, sendlen); } void es_createRGBSurfaceFrom(sdl_data *sd, int len, char *buff){ char *bp, *start; int sendlen; SDL_Surface * sptr; void * pixels; int width, height, depth, pitch, size; Uint32 rmask, gmask, bmask, amask; bp = buff; width = get16be(bp); height = get16be(bp); depth = get8(bp); pitch = get16be(bp); rmask = get32be(bp); gmask = get32be(bp); bmask = get32be(bp); amask = get16be(bp); size = get32be(bp); if(size == -1) { POPGLPTR(pixels, bp); } else { /* Get Pixels */ if((pixels = malloc(size)) == NULL){ bp = start = sdl_get_temp_buff(sd, 8); sptr = NULL; PUSHGLPTR(sptr, bp); sendlen = bp - start; sdl_send(sd, sendlen); return; } memcpy(pixels, (void *) bp, size); }; sptr = SDL_CreateRGBSurfaceFrom(pixels, width, height, depth, pitch, rmask, gmask, bmask, amask); bp = start = sdl_get_temp_buff(sd, 8); PUSHGLPTR(sptr, bp); sendlen = bp - start; sdl_send(sd, sendlen); } void es_freeSurface(sdl_data *sd, int len, char * buff) { char *bp; SDL_Surface * sptr; bp = buff; POPGLPTR(sptr, bp); if(sptr == NULL) error(); SDL_FreeSurface(sptr); } void es_lockSurface(sdl_data *sd, int len, char * buff) { char *bp, *start; SDL_Surface * sptr; int sendlen, res; bp = buff; POPGLPTR(sptr, bp); if(sptr == NULL) error(); res = SDL_LockSurface(sptr); bp = start = sdl_get_temp_buff(sd, 1); put8(bp, res); sendlen = bp - start; sdl_send(sd, sendlen); } void es_unlockSurface(sdl_data *sd, int len, char * buff) { char *bp; SDL_Surface * sptr; bp = buff; POPGLPTR(sptr, bp); SDL_UnlockSurface(sptr); } void es_loadBMP(sdl_data *sd, int len, char* bp) { char *start; SDL_Surface *bmpSurface; int sendlen; bmpSurface = SDL_LoadBMP(bp); bp = start = sdl_get_temp_buff(sd, 8); PUSHGLPTR(bmpSurface, bp); sendlen = bp - start; sdl_send(sd, sendlen); } void es_saveBMP(sdl_data *sd, int len, char* bp) { char *start; SDL_Surface *sptr; int sendlen, res; POPGLPTR(sptr, bp); res = SDL_SaveBMP(sptr, bp); bp = start = sdl_get_temp_buff(sd, 1); put8(bp, res); sendlen = bp - start; sdl_send(sd, sendlen); } void es_setAlpha(sdl_data *sd, int len, char *buff) { char *bp, *start; SDL_Surface *sptr; int sendlen, res; Uint32 flag, alpha; bp = buff; POPGLPTR(sptr, bp); flag = get32be(bp); alpha = get32be(bp); res = SDL_SetAlpha(sptr, flag, alpha); bp = start = sdl_get_temp_buff(sd, 4); put32be(bp, res); sendlen = bp - start; sdl_send(sd, sendlen); } void es_setClipping(sdl_data *sd, int len, char *buff) { error(); } void es_setGamma(sdl_data *sd, int len, char *bp) { char *start; int sendlen, res; float red, green, blue; red = * (float *) bp; bp += sizeof(float); green = * (float *) bp; bp += sizeof(float); blue = * (float *) bp; bp += sizeof(float); res = SDL_SetGamma(red, green, blue); bp = start = sdl_get_temp_buff(sd, 4); * (float *) bp = res; sendlen = bp - start; sdl_send(sd, sendlen); } void es_setGammaRamp(sdl_data *sd, int len, char * buff) { char *bp, *start; int sendlen, res; Uint16 *red,*green,*blue; bp = buff; red = (Uint16 *) bp; bp += 256*sizeof(Uint16); green = (Uint16 *) bp; bp += 256*sizeof(Uint16); blue = (Uint16 *) bp; bp += 256*sizeof(Uint16); res = SDL_SetGammaRamp(red,green,blue); bp = start = sdl_get_temp_buff(sd, 4); put32be(bp, res); sendlen = bp - start; sdl_send(sd, sendlen); } void es_getGammaRamp(sdl_data *sd, int len, char * buff) { char *bp, *start; int sendlen, res, i; Uint16 red[256], green[256],blue[256]; res = SDL_GetGammaRamp(red,green,blue); bp = start = sdl_getbuff(sd, 4 + 256*2*3); put32be(bp, res); for(i=0; i<256; i++) { put16be(bp, red[i]); } for(i=0; i<256; i++) { put16be(bp, green[i]); } for(i=0; i<256; i++) { put16be(bp, blue[i]); } sendlen = bp - start; sdl_send(sd, sendlen); } void es_wm_setCaption(sdl_data *sd, int len, char *bp) { if(!sd->use_smp) { es_wm_setCaption2(bp); } else { gl_dispatch(sd, SDL_WM_SetCaptionFunc, len, bp); } } void es_wm_setCaption2(char *bp) { char* title; char* icon; title = bp; icon = title + strlen(title) + 1; SDL_WM_SetCaption(title, icon); } void es_wm_getCaption(sdl_data *sd, int len, char *buff) { char * title, *icon, *bp, *start; int i, titlelen, iconlen, sendlen; SDL_WM_GetCaption(&title, &icon); for(titlelen = 0; title[titlelen] != '\0'; titlelen++); for(iconlen = 0; icon[iconlen] != '\0'; iconlen++); bp = start = sdl_get_temp_buff(sd, 4+titlelen+iconlen); put16be(bp, titlelen); put16be(bp, iconlen); for(i = 0; i < titlelen; i++) put8(bp, title[i]); for(i = 0; i < iconlen; i++) put8(bp, icon[i]); sendlen = bp - start; sdl_send(sd, sendlen); } void es_wm_setIcon(sdl_data *sd, int len, char *buff) { char *bp; SDL_Surface *sptr; Uint16 size; bp = buff; POPGLPTR(sptr, bp); size = get16be(bp); if (size > 0) { SDL_WM_SetIcon(sptr, (Uint8 *) bp); } else { SDL_WM_SetIcon(sptr, NULL); } } void es_wm_iconifyWindow(sdl_data *sd, int len, char *buff) { SDL_WM_IconifyWindow(); } void es_wm_toggleFullScreen(sdl_data *sd, int len, char *bp) { if(!sd->use_smp) { es_wm_toggleFullScreen2(sd->driver_data, driver_caller(sd->driver_data), bp); } else { gl_dispatch(sd, SDL_WM_ToggleFullScreenFunc, len, bp); } } void es_wm_toggleFullScreen2(ErlDrvPort port, ErlDrvTermData caller, char *buff) { char *bp; SDL_Surface *sptr; int res; ErlDrvTermData rt[8]; bp = buff; POPGLPTR(sptr, bp); res = SDL_WM_ToggleFullScreen(sptr); rt[0] = ERL_DRV_ATOM; rt[1]=driver_mk_atom((char *) "_esdl_result_"); rt[2] = ERL_DRV_INT; rt[3] = res; rt[4] = ERL_DRV_TUPLE; rt[5] = 2; driver_send_term(port,caller,rt,6); } void es_wm_grabInput(sdl_data *sd, int len, char *bp) { char *start; SDL_GrabMode mode; int sendlen; mode = (SDL_GrabMode) *bp; mode = SDL_WM_GrabInput(mode); bp = start = sdl_get_temp_buff(sd, 1); *bp++ = mode; sendlen = bp - start; sdl_send(sd, sendlen); } void es_wm_getInfo(sdl_data *sd, int len, char *bp) { if(!sd->use_smp) { es_wm_getInfo2(sd->driver_data, driver_caller(sd->driver_data), bp); } else { gl_dispatch(sd, SDL_WM_GetInfoFunc, len, bp); } } void es_wm_getInfo2(ErlDrvPort port, ErlDrvTermData caller, char *buff) { int res; SDL_SysWMinfo info; ErlDrvTermData rt[12]; SDL_VERSION(&info.version); SDL_GetWMInfo(&info); rt[0] = ERL_DRV_ATOM; rt[1]=driver_mk_atom((char *) "_esdl_result_"); rt[2] = ERL_DRV_INT; rt[3] = info.version.major; rt[4] = ERL_DRV_INT; rt[5] = info.version.minor; rt[6] = ERL_DRV_INT; rt[7] = info.version.patch; #ifdef WIN32 if(sizeof(info.window) == 4) { rt[8] = ERL_DRV_UINT; rt[9] = (unsigned int) info.window; } else { rt[8] = ERL_DRV_UINT; rt[9] = 0; } #else rt[8] = ERL_DRV_UINT; rt[9] = 0; #endif rt[10] = ERL_DRV_TUPLE; rt[11] = 5; res = driver_send_term(port,caller,rt,12); } void es_wm_isMaximized(sdl_data *sd, int len, char *buff) { int sendlen; char *bp, *start; int s; #ifdef _WIN32 { SDL_SysWMinfo info; SDL_VERSION(&info.version); SDL_GetWMInfo(&info); s = IsZoomed(info.window); } #else { /* Workaround for missing functions, window manager dep functions */ /* SDL_Surface *screen; */ /* SDL_Rect **modes; */ s = 0; /* screen = SDL_GetVideoSurface(); */ /* Get available fullscreen modes, I think it gives the max resolution */ /* modes = SDL_ListModes(screen->format, screen->flags | SDL_FULLSCREEN); */ /* Check is there are any modes available */ /* if(modes == (SDL_Rect **)0 || modes == (SDL_Rect **)-1) { */ /* s = 0; */ /* We don't know ?? */ /* } */ /* else { */ /* if ( screen->w >= modes[0]->w && screen->h >= modes[0]->h) */ /* s = 1; */ /* else */ /* s = 0; */ /* } */ } #endif start = bp = sdl_get_temp_buff(sd, 1); put8(bp, s); sendlen = bp - start; sdl_send(sd, sendlen); } void es_wm_maximize(sdl_data *sd, int len, char *bp) { if(!sd->use_smp) { es_wm_maximize2(sd->driver_data, driver_caller(sd->driver_data), bp); } else { gl_dispatch(sd, SDL_WM_MaximizeFunc, len, bp); } } void es_wm_maximize2(ErlDrvPort port, ErlDrvTermData caller, char *buff) { #ifdef _WIN32 SDL_SysWMinfo info; SDL_GetWMInfo(&info); ShowWindow(info.window, SW_SHOWMAXIMIZED); #endif } void es_gl_setAttribute(sdl_data *sd, int len, char *bp) { if(!sd->use_smp) { es_gl_setAttribute2(sd->driver_data, driver_caller(sd->driver_data), bp); } else { gl_dispatch(sd, SDL_GL_SetAttributeFunc, len, bp); } } void es_gl_setAttribute2(ErlDrvPort port, ErlDrvTermData caller, char *buff) { char *bp; int attr, val; bp = buff; attr = get16be(bp); val = get32be(bp); SDL_GL_SetAttribute(attr, val); } void es_gl_getAttribute(sdl_data *sd, int len, char *bp) { if(!sd->use_smp) { es_gl_getAttribute2(sd->driver_data, driver_caller(sd->driver_data), bp); } else { gl_dispatch(sd, SDL_GL_GetAttributeFunc, len, bp); } } void es_gl_getAttribute2(ErlDrvPort port, ErlDrvTermData caller, char *buff) { char *bp; int attr, val; ErlDrvTermData rt[8]; bp = buff; attr = get16be(bp); SDL_GL_GetAttribute(attr, &val); rt[0] = ERL_DRV_ATOM; rt[1]=driver_mk_atom((char *) "_esdl_result_"); rt[2] = ERL_DRV_INT; rt[3] = val; rt[4] = ERL_DRV_TUPLE; rt[5] = 2; driver_send_term(port,caller,rt,6); } void es_gl_swapBuffers(sdl_data *sd, int len, char *buff) { char *bp, *start; int sendlen; Uint32 ts; if(!sd->use_smp) SDL_GL_SwapBuffers(); else gl_dispatch(sd, SDL_GL_SwapBuffersFunc, len, buff); /* Timer is removed it a bad idea anyway (works if vsync is on only I believe) */ bp = start = sdl_get_temp_buff(sd, 4); ts = 0; put32be(bp, ts); sendlen = bp - start; sdl_send(sd, sendlen); } void es_mapRGBA(sdl_data *sd, int len, char *buff) { char *bp, *start; int sendlen; SDL_Surface * sptr; Uint32 res; Uint8 r,g,b,a; bp = buff; POPGLPTR(sptr, bp); r = get8(bp); g = get8(bp); b = get8(bp); a = get8(bp); if(sptr == NULL || sptr->format == NULL) error(); res = SDL_MapRGBA(sptr->format, r,g,b,a); bp = start = sdl_get_temp_buff(sd, 4); put32be(bp, res); sendlen = bp - start; sdl_send(sd, sendlen); } void es_getRGBA(sdl_data *sd, int len, char *buff) { error(); } void es_getClipRect(sdl_data *sd, int len, char *buff) { char *bp, *start; int sendlen; SDL_Surface * sptr; SDL_Rect rect; bp = buff; POPGLPTR(sptr, bp); if(sptr == NULL) error(); SDL_GetClipRect(sptr, &rect); bp = start = sdl_get_temp_buff(sd, 8); put16be(bp, rect.x); put16be(bp, rect.y); put16be(bp, rect.w); put16be(bp, rect.h); sendlen = bp - start; sdl_send(sd, sendlen); } void es_setClipRect(sdl_data *sd, int len, char *buff) { char *bp; SDL_Surface * sptr; SDL_Rect rect; bp = buff; POPGLPTR(sptr, bp); rect.x = get16be(bp); rect.y = get16be(bp); rect.w = get16be(bp); rect.h = get16be(bp); if(sptr == NULL) error(); SDL_SetClipRect(sptr, &rect); } void es_displayFormatAlpha(sdl_data *sd, int len, char * buff) { char *bp, *start; int sendlen; SDL_Surface * sptr, *new; bp = buff; POPGLPTR(sptr, bp); if(sptr == NULL) error(); new = SDL_DisplayFormatAlpha(sptr); bp = start = sdl_get_temp_buff(sd, 8); PUSHGLPTR(new, bp); sendlen = bp - start; sdl_send(sd, sendlen); } esdl-1.2/c_src/esdl_video.h0000644000076400010400000001526011540750057017613 0ustar familjenAdministratörer/* * Copyright (c) 2001 Dan Gudmundsson * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * * $Id$ */ /* The video functions */ #ifdef __cplusplus extern "C" { #endif #define SDL_VideoDriverNameFunc (VIDEO_H + 1) void es_videoDriverName(sdl_data *, int, char *); #define SDL_GetVideoSurfaceFunc (SDL_VideoDriverNameFunc + 1) void es_getVideoSurface(sdl_data *, int len, char *buff); #define SDL_GetVideoInfoFunc (SDL_GetVideoSurfaceFunc + 1) void es_getVideoInfo(sdl_data *, int len, char*buff); #define SDL_VideoModeOKFunc (SDL_GetVideoInfoFunc + 1) void es_videoModeOK(sdl_data *, int len, char*buff); void es_videoModeOK2(ErlDrvPort, ErlDrvTermData, char *); #define SDL_ListModesFunc (SDL_VideoModeOKFunc + 1) void es_listModes(sdl_data *, int len, char *buff); #define SDL_SetVideoModeFunc (SDL_ListModesFunc + 1) void es_setVideoMode(sdl_data *, int len, char * buff); void es_setVideoMode2(ErlDrvPort, ErlDrvTermData, char * buff); #define SDL_UpdateRectFunc (SDL_SetVideoModeFunc + 1) /* Done from erlang using UpdateRectsFunc */ #define SDL_UpdateRectsFunc (SDL_UpdateRectFunc + 1) void es_updateRects(sdl_data *, int len, char * buff); #define SDL_FlipFunc (SDL_UpdateRectsFunc + 1) void es_flip(sdl_data *, int len, char *buff); #define SDL_SetColorsFunc (SDL_FlipFunc + 1) void es_setColors(sdl_data *, int, char *); #define SDL_MapRGBFunc (SDL_SetColorsFunc + 1) void es_mapRGB(sdl_data *, int len, char *buff); #define SDL_GetRGBFunc (SDL_MapRGBFunc + 1) void es_getRGB(sdl_data *, int len, char *buff); #define SDL_CreateRGBSurfaceFunc (SDL_GetRGBFunc + 1) void es_createRGBSurface(sdl_data *, int, char *); #define SDL_CreateRGBSurfaceFromFunc (SDL_CreateRGBSurfaceFunc + 1) void es_createRGBSurfaceFrom(sdl_data *, int, char *); #define SDL_FreeSurfaceFunc (SDL_CreateRGBSurfaceFromFunc + 1) void es_freeSurface(sdl_data *, int len, char * buff); #define SDL_MUSTLOCKFunc (0) /* Needed ? */ #define SDL_LockSurfaceFunc (SDL_FreeSurfaceFunc + 1) void es_lockSurface(sdl_data *, int len, char * buff); #define SDL_UnlockSurfaceFunc (SDL_LockSurfaceFunc + 1) void es_unlockSurface(sdl_data *, int len, char * buff); #define SDL_LoadBMP_RWFunc (SDL_UnlockSurfaceFunc + 1) #define SDL_LoadBMPFunc (SDL_LoadBMP_RWFunc + 1) void es_loadBMP(sdl_data *, int len, char * buff); #define SDL_SaveBMP_RWFunc (SDL_LoadBMPFunc + 1) #define SDL_SaveBMPFunc (SDL_SaveBMP_RWFunc + 1) void es_saveBMP(sdl_data *, int len, char * buff); #define SDL_SetColorKeyFunc (SDL_SaveBMPFunc + 1) void es_setColorKey(sdl_data *, int len, char * buff); #define SDL_SetAlphaFunc (SDL_SetColorKeyFunc + 1) void es_setAlpha(sdl_data *, int len, char *buff); #define SDL_SetClippingFunc (SDL_SetAlphaFunc + 1) /* void es_setClipping(sdl_data *, int len, char *buff); removed */ #define SDL_ConvertSurfaceFunc (SDL_SetClippingFunc + 1 ) /* SDL_internal */ #define SDL_BlitSurfaceFunc (SDL_ConvertSurfaceFunc + 1) void es_blitSurface(sdl_data *, int len, char * buff); #define SDL_UpperBlitFunc (SDL_BlitSurfaceFunc + 1) /* blitSurface is just a macro that does upperblit */ #define SDL_LowerBlitFunc (SDL_UpperBlitFunc + 1 ) /* SDL_semi private */ #define SDL_FillRectFunc (SDL_LowerBlitFunc + 1) void es_fillRect(sdl_data *, int len, char * buff); #define SDL_DisplayFormatFunc (SDL_FillRectFunc + 1) void es_displayFormat(sdl_data *, int len, char * buff); #define SDL_WM_SetCaptionFunc (SDL_DisplayFormatFunc +1) void es_wm_setCaption(sdl_data *, int len, char *buff); void es_wm_setCaption2(char *buff); #define SDL_WM_GetCaptionFunc (SDL_WM_SetCaptionFunc +1) void es_wm_getCaption(sdl_data *, int len, char *buff); #define SDL_WM_SetIconFunc (SDL_WM_GetCaptionFunc +1) void es_wm_setIcon(sdl_data *, int len, char *buff); #define SDL_WM_IconifyWindowFunc (SDL_WM_SetIconFunc +1) void es_wm_iconifyWindow(sdl_data *, int len, char *buff); #define SDL_WM_ToggleFullScreenFunc (SDL_WM_IconifyWindowFunc +1) void es_wm_toggleFullScreen(sdl_data *, int len, char *buff); void es_wm_toggleFullScreen2(ErlDrvPort, ErlDrvTermData, char *); #define SDL_WM_GrabInputFunc (SDL_WM_ToggleFullScreenFunc +1) void es_wm_grabInput(sdl_data *, int len, char *buff); #define SDL_WM_GetInfoFunc (SDL_WM_GrabInputFunc +1) void es_wm_getInfo(sdl_data *, int len, char *buff); void es_wm_getInfo2(ErlDrvPort, ErlDrvTermData, char *); #define SDL_GL_SetAttributeFunc (SDL_WM_GetInfoFunc + 1) void es_gl_setAttribute(sdl_data *, int, char *); void es_gl_setAttribute2(ErlDrvPort, ErlDrvTermData, char *); #define SDL_GL_GetAttributeFunc (SDL_GL_SetAttributeFunc + 1) void es_gl_getAttribute(sdl_data *, int, char *); void es_gl_getAttribute2(ErlDrvPort, ErlDrvTermData, char *); #define SDL_GL_SwapBuffersFunc (SDL_GL_GetAttributeFunc + 1) void es_gl_swapBuffers(sdl_data *, int, char *); /* Erl sdl special functions */ #define ESDL_getSurfaceFunc (SDL_GL_SwapBuffersFunc +1) void es_getSurface(sdl_data *, int len, char * buff); #define ESDL_getPaletteFunc (ESDL_getSurfaceFunc + 1) void es_getPalette(sdl_data *, int len, char * buff); #define ESDL_getPixelFormatFunc (ESDL_getPaletteFunc +1) void es_getPixelFormat(sdl_data *, int len, char * buff); #define ESDL_getPixelsFunc (ESDL_getPixelFormatFunc +1) void es_getPixels(sdl_data *, int len, char * buff); #define SDL_WM_IsMaximizedFunc (ESDL_getPixelsFunc +1) void es_wm_isMaximized(sdl_data *, int len, char * buff); /* SDL additions since SDL 1.1 */ #define SDL_SetGammaFunc (SDL_WM_IsMaximizedFunc +1) void es_setGamma(sdl_data *, int len, char * buff); #define SDL_SetGammaRampFunc (SDL_SetGammaFunc +1) void es_setGammaRamp(sdl_data *, int len, char * buff); #define SDL_GetGammaRampFunc (SDL_SetGammaRampFunc +1) void es_getGammaRamp(sdl_data *, int len, char * buff); #define SDL_MapRGBAFunc (SDL_GetGammaRampFunc + 1) void es_mapRGBA(sdl_data *, int len, char *buff); #define SDL_GetRGBAFunc (SDL_MapRGBAFunc + 1) void es_getRGBA(sdl_data *, int len, char *buff); #define SDL_GetClipRectFunc (SDL_GetRGBAFunc + 1) void es_getClipRect(sdl_data *, int len, char *buff); #define SDL_SetClipRectFunc (SDL_GetClipRectFunc + 1) void es_setClipRect(sdl_data *, int len, char *buff); #define SDL_DisplayFormatAlphaFunc (SDL_SetClipRectFunc + 1) void es_displayFormatAlpha(sdl_data *, int len, char * buff); #define SDL_WM_MaximizeFunc (SDL_DisplayFormatAlphaFunc + 1) void es_wm_maximize(sdl_data *, int len, char * buff); void es_wm_maximize2(ErlDrvPort, ErlDrvTermData, char *); #ifdef __cplusplus } #endif esdl-1.2/c_src/esdl_wrapper.c0000644000076400010400000000257411540750057020164 0ustar familjenAdministratörer/* * Copyright (c) 2001 Dan Gudmundsson * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * * $Id$ */ /* Command Handler Dispatch the work on the functions */ #include #include #include "esdl.h" #include "esdl_util.h" #ifndef APIENTRY # define APIENTRY #endif typedef struct sdl_code_fn_def { int op; char *str; sdl_fun fn; } sdl_code_fn; static sdl_code_fn code_fns[] = { #include "esdl_sdl_fp.h" { 0, "LastFunction", NULL}}; static void undefined_function(sdl_data *sd, int len, char *buff) { sd->len = -2; } void init_fps(sdl_data* sd) { int i; int n = MAX_FUNCTIONS_H; /* Must be greater than then the last function op */ int op; sdl_fun* fun_tab; char** str_tab; fun_tab = sd->fun_tab = malloc((n+1) * sizeof(sdl_fun)); str_tab = sd->str_tab = malloc((n+1) * sizeof(char*)); for (i = 0; i < MAX_FUNCTIONS_H; i++) { fun_tab[i] = undefined_function; str_tab[i] = "unknown function"; } for (i = 0; ((op = code_fns[i].op) != 0); i++) { if (fun_tab[op] == undefined_function) { fun_tab[op] = code_fns[i].fn; str_tab[op] = code_fns[i].str; } else { fprintf(stderr, "FParray mismatch in initialization: %d '%s' %d '%s'\r\n", i, str_tab[op], op, code_fns[i].str); } } } esdl-1.2/c_src/Makefile0000644000076400010400000000451611540750057016767 0ustar familjenAdministratörer# Copyright (c) 2001 Dan Gudmundsson # See the file "license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. # # $Id$ # OS_FLAG = unix ifeq ($(OS_FLAG), mingw) include ../win32_conf/mingw_vars.mk else OGLDIR = /usr # Uncomment these if your opengl header is located in another directory than # the usual $(OGLDIR)/include/GL/gl.h #GL_INCLUDE_DIR = OpenGL #USE_GL_INCLUDE_DIR = -DFULL_PATH_TO_GL_INCLUDE_DIR GL_LIBS = -L$(OGLDIR)/lib -lGL -lGLU GL_INCS = -I$(OGLDIR)/include/$(GL_INCLUDE_DIR) SDL_LIBS = $(shell sdl-config --libs) SDL_INCS = $(shell sdl-config --cflags) ifeq ($(ENABLE_SDL_TTF), yes) SDL_TTF_LIBS = -lSDL_ttf SDL_TTF_INCS = # specify if different from SDL SDL_TTF_HELPER = esdl_ttf USE_SDL_TTF = -D_USE_SDL_TTF endif ifeq ($(ENABLE_SDL_IMAGE), yes) SDL_IMAGE_LIBS = -lSDL_image SDL_IMAGE_INCS = # specify if different from SDL SDL_IMAGE_HELPER = esdl_img USE_SDL_IMAGE = -D_USE_SDL_IMAGE endif LIBS = $(GL_LIBS) $(SDL_LIBS) $(SDL_TTF_LIBS) \ $(SDL_IMAGE_LIBS) -lm INCS = $(GL_INCS) $(SDL_INCS) $(SDL_TTF_INCS) \ $(SDL_IMAGE_INCS) $(ERL_INCS) CFLAGS = -g -O2 -funroll-loops -Wall -ffast-math -fpic \ -fomit-frame-pointer $(USE_GL_INCLUDE_DIR) -DSHM \ $(USE_SDL_TTF) $(USE_SDL_IMAGE) \ -DPTHREADS $(INCS) CLINKFLAGS = -fpic -shared SOEXT = so ## The driver part needs erlang includes ERL_DIR := $(shell erl -noshell -eval "io:format([126,115,126,110],[code:root_dir()])" -s erlang halt) ERL_INCS = -I$(ERL_DIR)/usr/include CC = gcc endif TARGETDIR = ../priv GCC_O = $(CC) -c $(CFLAGS) $< # Files Helpers = esdl_wrapper esdl_gen esdl_spec esdl_util \ esdl_video esdl_events esdl_audio \ esdl_gl \ $(SDL_TTF_HELPER) $(SDL_IMAGE_HELPER) HelpersObjects = $(Helpers:%=%.o) # Targets target: $(TARGETDIR)/sdl_driver.$(SOEXT) clean: rm -f $(HelpersObjects) rm -f ../priv/*.$(SOEXT) ../priv/sdlwrapper *.o rm -f *~ erl_crash.dump %.o: %.c $(GCC_O) $(TARGETDIR)/sdl_driver.$(SOEXT): esdl_driver.c $(HelpersObjects) $(CC) $(CFLAGS) $(CLINKFLAGS) $(ERL_INCS) $< $(HelpersObjects) \ $(LIBS) -o $@ esdl-1.2/c_src/Makefile.macosx0000644000076400010400000000361411540750057020256 0ustar familjenAdministratörer# -*- makefile -*- # # Copyright (c) 2001-2009 Dan Gudmundsson, Bjorn Gustavsson # # See the file "license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. # # Uncomment the two lines beginning with UNIVERSAL below if you want # to build universal binaries that will work on both Tiger and Leopard. # # You will also need to do # # export MACOSX_DEPLOYMENT_TARGET=10.4 # # in a bash shell before running this Makefile. # #UNIVERSAL_SDK = -isysroot /Developer/SDKs/MacOSX10.4u.sdk #UNIVERSAL_FLAGS = $(UNIVERSAL_SDK) -arch i386 -arch ppc # or UNIVERSAL_FLAGS = -arch i386 CC = cc # # The settings of CFLAGS and LDFLAGS that follows assume # the SDL framework has been installed in /Library/Frameworks. # CFLAGS = -g -O2 -Wall -ObjC -D_THREAD_SAFE -D_REENTRANT -D_OSX_COCOA -I/Library/Frameworks/SDL.framework/Headers -F/Library/Frameworks $(ERLINC) $(UNIVERSAL_FLAGS) LDFLAGS = -F/Library/Frameworks -framework SDL -framework IOKit -framework Carbon -framework Cocoa -L. $(UNIVERSAL_FLAGS) TARGETDIR = ../priv ## The driver part needs erlang includes ERL_DIR := $(shell echo 'io:format("~s~n",[code:root_dir()]),halt().' | erl | sed 's,^[0-9]*> *,,g' | tail +2) ERLINC = -I$(ERL_DIR)/usr/include # Files COMMON = esdl_wrapper esdl_gen esdl_spec esdl_util \ esdl_video esdl_events esdl_audio \ esdl_gl COMMON_OBJ = $(COMMON:%=%.o) # Targets target: $(TARGETDIR)/sdl_driver.so clean: rm -f $(COMMON_OBJ) rm -f ../priv/*.so ../priv/sdlwrapper *.o libsdlmain.a rm -f *~ erl_crash.dump ## ## %.o: %.c $(CC) -c $(CFLAGS) $< %.o: %.m $(CC) -c -I/Library/Frameworks/SDL.framework/Headers $(CFLAGS) $< esdl_driver.o : esdl_driver.c $(CC) -c -ObjC $(CFLAGS) $(ERLINC) $< ## ## sdl_driver.so $(TARGETDIR)/sdl_driver.so: esdl_driver.o $(COMMON_OBJ) $(CC) $< $(COMMON_OBJ) $(LDFLAGS) -bundle -flat_namespace -undefined suppress -o $@ esdl-1.2/doc/0000755000076400010400000000000011540750057014775 5ustar familjenAdministratöreresdl-1.2/doc/gl.html0000644000076400010400000000030511540750057016263 0ustar familjenAdministratörergl

Header File

The header file may include additional information gl.hrl

Exports

esdl-1.2/doc/glu.html0000644000076400010400000003726711540750057016471 0ustar familjenAdministratörerglu

Header File

The header file may include additional information glu.hrl

Exports

tessBeginPolygon(#tessPtr{ptr=Tobj})

tessCallback(#tessPtr{ptr=Tobj}, Which, ESDL_TESSCB)

tessVertex(#tessPtr{ptr=Tobj}, {X,Y,Z})

    Args: Tobj, Coords[, VtxData]
    Returns: ok
    C-API: void gluTessVertex(GLUtesselator *tobj, GLdouble coords[3], void *vertex_data)
    Desc:
    VtxData is a tuple-list of extra data supported types are [{normal, {X,Y,Z}}, {color, {R,G,B[,A]}}, {texcoord2, {U,V}}] Use ?ESDL_TESSCB_VERTEX_DATA callback to call apropriate gl functions on the extra data.

beginCurve(Nurb=#nurbsPtr{})

beginSurface(Nurb=#nurbsPtr{})

beginTrim(Nurb=#nurbsPtr{})

build1DMipmaps(Target, InternalFormat, Width, Format, Type, Data)

build2DMipmaps(Target, InternalFormat, Width, Height, Format, Type, Data)

cylinder(Quad=#quadricPtr{}, Base, Top, Height, Slices, Stacks)

deleteNurbsRenderer(Nurb=#nurbsPtr{})

deleteQuadric(Quad=#quadricPtr{})

deleteTess(Tess=#tessPtr{})

disk(Quad=#quadricPtr{}, Inner, Outer, Slices, Loops)

endCurve(Nurb=#nurbsPtr{})

endSurface(Nurb=#nurbsPtr{})

endTrim(Nurb=#nurbsPtr{})

errorString(Error)

getNurbsProperty(Nurb=#nurbsPtr{}, Property)

getString(Name)

getTessProperty(Tess=#tessPtr{}, Which)

loadSamplingMatrices(Nurb=#nurbsPtr{}, Model, Perspective, View)

lookAt(EyeX, EyeY, EyeZ, CenterX, CenterY, CenterZ, UpX, UpY, UpZ)

newNurbsRenderer()

newQuadric()

newTess()

nurbsCurve(Nurb=#nurbsPtr{}, KnotCount, Knots, Stride, Control, Order, Type)

nurbsProperty(Nurb=#nurbsPtr{}, Property, Value)

nurbsSurface(Nurb=#nurbsPtr{}, SKnotCount, SKnots, TKnotCount, TKnots, SStride, TStride, Control, SOrder, TOrder, Type)

ortho2D(Left, Right, Bottom, Top)

partialDisk(Quad=#quadricPtr{}, Inner, Outer, Slices, Loops, Start, Sweep)

perspective(Fovy, Aspect, ZNear, ZFar)

pickMatrix(X, Y, DelX, DelY, Viewport)

project(ObjX, ObjY, ObjZ, Model, Proj, View)

pwlCurve(Nurb=#nurbsPtr{}, Count, Data, Stride, Type)

quadricDrawStyle(Quad=#quadricPtr{}, Draw)

quadricNormals(Quad=#quadricPtr{}, Normal)

quadricOrientation(Quad=#quadricPtr{}, Orientation)

quadricTexture(Quad=#quadricPtr{}, Texture)

scaleImage(Format, WIn, HIn, TypeIn, DataIn, WOut, HOut, TypeOut, #sdlmem{bin=DataOut})

sphere(Quad=#quadricPtr{}, Radius, Slices, Stacks)

tessBeginContour(#tessPtr{ptr=Ptr})

tessEndContour(#tessPtr{ptr=Ptr})

tessEndPolygon(#tessPtr{ptr=Ptr})

tessNormal(#tessPtr{ptr=Ptr}, ValueX, ValueY, ValueZ)

tessProperty(Tess=#tessPtr{}, Which, Data)

unProject(WinX, WinY, WinZ, Model, Proj, View)

triangulate(N, Ps)

esdl-1.2/doc/index.html0000644000076400010400000000474311540750057017002 0ustar familjenAdministratörerESDL - SDL and OpenGL for Erlang

ESDL Introduction

ESDL is an api which invokes corresponding functions in the Sdl and Opengl libraries.

Since most of the functions are 1 to 1 mapping to the original libraries, the descriptions (if any) are brief. For detailed descriptions and manual pages take a look at the SDL and Opengl sites which should be able guide you to the documentation. I have tried to generate link to the descriptions on net, but may have failed in some cases.

With some common sense you should be able to figure out the arguments and return values to the functions. Arguments in the 'C' libraries that are used as out parameters, are often returned as a tuple with values. C functions that take pointer to an array as argument takes a list as argument in erlang (and/or tuple).

The thing that differs are of course the memory handling and memory references, check out the examples.

If you have complaints of non trivial (or errors) arguments or return values, send me an email and I'll try to update the documentation or (the fast way) check the source.

SDL commands

Init and Quit Functions
Video Functions
Audio Functions
General Event Functions
TTF Functions
Image Functions

OpenGL

Opengl functions that uses pointers requires that you use the memory functions in sdl_util to handle the memory references.
GL Functions
GLU Functions

Additions

Memory and Utility functions
esdl-1.2/doc/makedoc.erl0000644000076400010400000002613511540750057017113 0ustar familjenAdministratörer%%%---------------------------------------------------------------------- %%% File : makedoc.erl %%% Author : Dan Gudmundsson %%% Purpose : %%% Created : 29 Nov 2000 by Dan Gudmundsson %%%---------------------------------------------------------------------- -module(makedoc). -author('dgud@erix.ericsson.se'). %%-compile(export_all). -export([start/0, start/1]). -record(f, {func, args, ret, capi, desc, ef}). -define(sdl_www, "http://www.libsdl.org/docs/html/"). -define(sdl_ttf_www, "http://jcatki.no-ip.org/SDL_ttf/"). -define(sdl_img_www, "http://jcatki.no-ip.org/SDL_image/"). -define(gl_www, "http://www.sun.com/software/graphics/OpenGL/manpages/"). start() -> make(sdl, ?sdl_www), make(sdl_active, ?sdl_www), make(sdl_audio, ?sdl_www), make(sdl_events, ?sdl_www), make(sdl_keyboard, ?sdl_www), make(sdl_mouse, ?sdl_www), make(sdl_video, ?sdl_www), make(sdl_ttf, ?sdl_ttf_www), make(sdl_img, ?sdl_img_www), make(gl, ?gl_www), make(glu, ?gl_www), make(sdl_util, ""), ok. start([File]) -> case File of '../src/sdl.erl' -> make(sdl, ?sdl_www); '../src/sdl_active.erl' -> make(sdl_active, ?sdl_www); '../src/sdl_audio.erl' -> make(sdl_audio, ?sdl_www); '../src/sdl_events.erl' -> make(sdl_events, ?sdl_www); '../src/sdl_keyboard.erl' -> make(sdl_keyboard, ?sdl_www); '../src/sdl_mouse.erl' -> make(sdl_mouse, ?sdl_www); '../src/sdl_joystick.erl' -> make(sdl_joystick, ?sdl_www); '../src/sdl_video.erl' -> make(sdl_video, ?sdl_www); '../src/sdl_ttf.erl' -> make(sdl_ttf, ?sdl_ttf_www); '../src/sdl_img.erl' -> make(sdl_img, ?sdl_img_www); '../src/gl.erl' -> make(gl, ?gl_www); '../src/glu.erl' -> make(glu, ?gl_www); '../src/sdl_util.erl' -> make(sdl_util, "") end, ok. make(Module, WWW) -> Mod = atom_to_list(Module), Infile = filename:join(["../src/", Mod ++ ".erl"]), Outfile = Mod ++ ".html", io:format("Making ~p => ~p ~n", [Infile, Outfile]), {ok, In} = file:open(Infile, [read]), {ok, Out} = file:open(Outfile, [write]), insert_header(Mod, Out), Next = fun() -> io:get_line(In, "[Reading]") end, create_doc(Next(), Next, WWW, Out, undef, Module, 1, undef), insert_footer(Out), file:close(In), file:close(Out). %%create_doc(Line, NextLineFun, WWWRef, OutFile, Acc) create_doc(eof, N, W, O, Acc, M, L, FD) -> ok; create_doc("%% Func:" ++ Func, N, W, O, undef, M, L, undef) -> case strip(Func) of [] -> io:format("~s:~p: Empty func desc ~n", [M, L]), create_doc(N(), N, W, O, func, M, L + 1, undef); F -> create_doc(N(), N, W, O, func, M, L + 1, #f{func = F}) end; create_doc("%% Args:" ++ Arg, N, W, O, func, M, L, FD) -> case strip(Arg) of [] -> create_doc(N(), N, W, O, args, M, L + 1, FD); Args -> %% io:format(O, "Args: ~s ~n", [Args]), create_doc(N(), N, W, O, args, M, L + 1, FD#f{args = Args}) end; create_doc("%% Returns:" ++ Value, N, W, O, args, M, L, FD) -> case strip(Value) of [] -> create_doc(N(), N, W, O, ret, M, L + 1, FD); V -> %% io:format(O, "Returns: ~s ~n", [V]), create_doc(N(), N, W, O, ret, M, L + 1, FD#f{ret = V}) end; create_doc("%% Desc:" ++ Value, N, W, O, State, M, L, FD) -> case strip(Value) of [] -> create_doc(N(), N, W, O, desc, M, L + 1, FD); V -> %% io:format(O, "Description: ~s ~n", [V]), create_doc(N(), N, W, O, desc, M, L + 1, FD#f{desc = V}) end; create_doc("%% C-API func:" ++ Value, N, W, O, ret, M, L, FD) -> case strip(Value) of [] -> io:format("~s:~p: Missing Ref to C-API~n", [M, L]), create_doc(N(), N, W, O, capi, M, L + 1, FD); V -> %% io:format(O, "C_API REF: ~s ~n", [W, V]), create_doc(N(), N, W, O, capi, M, L + 1, FD#f{capi = V}) end; create_doc("%%" ++ Rest, N, W, O, undef, M, L, undef) -> create_doc(N(), N, W, O, undef, M, L + 1, undef); create_doc("%%" ++ Value, N, W, O, State, M, L, FD) -> case strip(Value) of [] -> create_doc(N(), N, W, O, State, M, L + 1, FD); V -> %% io:format(O, "~s ~n", [V]), create_doc(N(), N, W, O, State, M, L + 1, add_line(V, State, FD)) end; create_doc(Else, N, W, O, undef, M, L, undef) -> create_doc(N(), N, W, O, undef, M, L + 1, undef); create_doc(Else, N, W, O, capi, M, L, FD) -> EF = strip(Else), NewL = write_doc(FD#f{ef = EF}, N, W, O, M, L), create_doc(N(), N, W, O, undef, M, NewL + 1, undef); create_doc(Else, N, W, O, desc, M, L, FD) -> EF = strip(Else), NewL = write_doc(FD#f{ef = EF}, N, W, O, M, L), create_doc(N(), N, W, O, undef, M, NewL + 1, undef); create_doc(Else, N, W, O, S, M, L, FD) -> io:format("~s:~p: Error in parsing got ~p ~p ~n", [M, L, Else, FD]), create_doc(N(), N, W, O, undef, M, L + 1, undef). write_doc(FD, N, W, O, M, L) -> case get_func_clause(FD#f.ef, []) of false -> NextLine = strip(N()), % io:format("~s:~p: Incomplete func header ~p ~n", [M, L, FD#f.ef]) 1 + write_doc(add_line(NextLine, ef, FD), N, W, O, M, L); FC when is_list(FC) -> case strip(N()) of "exit(nyi)" ++ _IgnoreRest -> io:format("~s:~p: Not implemented Ignoring ~p~n", [M,L, FD#f.func]), L; Next -> io:format(O, "

~n", [FD#f.func]), io:format(O, " ~s ", [FC]), io:format(O, "

~n", []), L + 1 end end. write_type(O, Desc, undefined) -> ok; write_type(O, Desc, Str) -> io:format(O, "~s ~s
~n", [Desc, Str]). add_line(V, func, FD) -> FD#f{func = FD#f.func ++ [$ | V]}; add_line(V, args, FD) -> FD#f{args = FD#f.args ++ [$ | V]}; add_line(V, ret, FD) -> FD#f{ret = FD#f.ret ++ [$ | V]}; add_line(V, capi, FD) -> FD#f{capi = FD#f.capi ++ [$ | V]}; add_line(V, desc, FD) -> FD#f{desc = FD#f.desc ++ [$ | V]}; add_line(V, ef, FD) -> FD#f{ef = FD#f.ef ++ [$ | V]}. gen_ext_ref(gl, Func, W) -> "
C-API:"; gen_ext_ref(glu, Func, W) -> "C-API:"; gen_ext_ref(sdl_ttf, Func, W) -> "C-API:"; gen_ext_ref(sdl_img, Func, W) -> "C-API:"; gen_ext_ref(_, Func, W) -> "C-API:". get_capi_funcname(Func) -> get_capi_funcname(Func, [$#]). get_capi_funcname([], _)-> []; get_capi_funcname(undefined, _)-> []; get_capi_funcname([$( | Rest], Acc) -> New = strip_gl(Acc), lists:reverse(New); get_capi_funcname([$ | Rest], Acc) -> get_capi_funcname(Rest, []); get_capi_funcname([$* | Rest], Acc) -> get_capi_funcname(Rest, []); get_capi_funcname([H|R], Acc) -> get_capi_funcname(R, [H |Acc]). lc([]) -> []; lc([$_|R]) -> lc(R); lc([A|R]) when A >= $A, A < $a -> [(A - $A + $a) | lc(R)]; lc([A|R]) -> [A|lc(R)]. get_func_clause([], _) -> false; get_func_clause("when" ++ RFunc, Acc) -> lists:reverse(Acc); get_func_clause("->" ++ Rest, Acc) -> lists:reverse(Acc); get_func_clause([H|R], Acc) -> get_func_clause(R, [H|Acc]). insert_header(Mod, Out) -> io:format(Out, "~s~n" "~n", [Mod]), io:format(Out, "

Header File

~n", []), io:format(Out, "The header file may include additional information " "~s.hrl~n", [Mod, Mod]), io:format(Out, "

Exports

~n", []). insert_footer(Out) -> io:format(Out, "", []). strip(String) -> Temp = strip1(lists:reverse(String)), strip1(lists:reverse(Temp)). strip1([$ | Rest]) -> strip(Rest); strip1([$\n |Rest]) -> strip(Rest); strip1([$\t |Rest]) -> strip(Rest); strip1([$\r |Rest]) -> strip(Rest); strip1(Rest) -> Rest. strip_gl("b1" ++ Rest) -> Rest; strip_gl("b2" ++ Rest) -> Rest; strip_gl("b3" ++ Rest) -> Rest; strip_gl("b4" ++ Rest) -> Rest; strip_gl("bu1" ++ Rest) -> Rest; strip_gl("bu2" ++ Rest) -> Rest; strip_gl("bu3" ++ Rest) -> Rest; strip_gl("bu4" ++ Rest) -> Rest; strip_gl("s1" ++ Rest) -> Rest; strip_gl("s2" ++ Rest) -> Rest; strip_gl("s3" ++ Rest) -> Rest; strip_gl("s4" ++ Rest) -> Rest; strip_gl("su1" ++ Rest) -> Rest; strip_gl("su2" ++ Rest) -> Rest; strip_gl("su3" ++ Rest) -> Rest; strip_gl("su4" ++ Rest) -> Rest; strip_gl("i1" ++ Rest) -> Rest; strip_gl("i2" ++ Rest) -> Rest; strip_gl("i3" ++ Rest) -> Rest; strip_gl("i4" ++ Rest) -> Rest; strip_gl("iu1" ++ Rest) -> Rest; strip_gl("iu2" ++ Rest) -> Rest; strip_gl("iu3" ++ Rest) -> Rest; strip_gl("iu4" ++ Rest) -> Rest; strip_gl("f1" ++ Rest) -> Rest; strip_gl("f2" ++ Rest) -> Rest; strip_gl("f3" ++ Rest) -> Rest; strip_gl("f4" ++ Rest) -> Rest; strip_gl("d1" ++ Rest) -> Rest; strip_gl("d2" ++ Rest) -> Rest; strip_gl("d3" ++ Rest) -> Rest; strip_gl("d4" ++ Rest) -> Rest; strip_gl("vb1" ++ Rest) -> Rest; strip_gl("vb2" ++ Rest) -> Rest; strip_gl("vb3" ++ Rest) -> Rest; strip_gl("vb4" ++ Rest) -> Rest; strip_gl("vbu1" ++ Rest) -> Rest; strip_gl("vbu2" ++ Rest) -> Rest; strip_gl("vbu3" ++ Rest) -> Rest; strip_gl("vbu4" ++ Rest) -> Rest; strip_gl("vs1" ++ Rest) -> Rest; strip_gl("vs2" ++ Rest) -> Rest; strip_gl("vs3" ++ Rest) -> Rest; strip_gl("vs4" ++ Rest) -> Rest; strip_gl("vsu1" ++ Rest) -> Rest; strip_gl("vsu2" ++ Rest) -> Rest; strip_gl("vsu3" ++ Rest) -> Rest; strip_gl("vsu4" ++ Rest) -> Rest; strip_gl("vi1" ++ Rest) -> Rest; strip_gl("vi2" ++ Rest) -> Rest; strip_gl("vi3" ++ Rest) -> Rest; strip_gl("vi4" ++ Rest) -> Rest; strip_gl("viu1" ++ Rest) -> Rest; strip_gl("viu2" ++ Rest) -> Rest; strip_gl("viu3" ++ Rest) -> Rest; strip_gl("viu4" ++ Rest) -> Rest; strip_gl("vf1" ++ Rest) -> Rest; strip_gl("vf2" ++ Rest) -> Rest; strip_gl("vf3" ++ Rest) -> Rest; strip_gl("vf4" ++ Rest) -> Rest; strip_gl("vd1" ++ Rest) -> Rest; strip_gl("vd2" ++ Rest) -> Rest; strip_gl("vd3" ++ Rest) -> Rest; strip_gl("vd4" ++ Rest) -> Rest; %strip_gl("b" ++ Rest) -> Rest; strip_gl("bu" ++ Rest) -> Rest; %strip_gl("s" ++ Rest) -> Rest; strip_gl("su" ++ Rest) -> Rest; %strip_gl("i" ++ Rest) -> Rest; strip_gl("iu" ++ Rest) -> Rest; %strip_gl("f" ++ Rest) -> Rest; %strip_gl("d" ++ Rest) -> Rest; strip_gl("vb" ++ Rest) -> Rest; strip_gl("vbu" ++ Rest) -> Rest; strip_gl("vs" ++ Rest) -> Rest; strip_gl("vsu" ++ Rest) -> Rest; strip_gl("vi" ++ Rest) -> Rest; strip_gl("viu" ++ Rest) -> Rest; strip_gl("vf" ++ Rest) -> Rest; strip_gl("vd" ++ Rest) -> Rest; strip_gl(NoStrip) -> NoStrip. esdl-1.2/doc/Makefile0000644000076400010400000000067211540750057016442 0ustar familjenAdministratörer ESRC = ../src ERLC = erlc DOCG = makedoc.beam DOC = sdl.html sdl_active.html \ sdl_audio.html sdl_events.html sdl_keyboard.html sdl_mouse.html sdl_joystick.html \ sdl_util.html sdl_video.html sdl_ttf.html sdl_img.html target: $(DOCG) $(DOC) %.beam: %.erl $(ERLC) -W -bbeam $(ERL_FLAGS) $(ERL_COMPILE_FLAGS) $< clean: rm -f $(DOCG) $(DOC) rm -f *~ %.html: $(ESRC)/%.erl $(DOCG) erl -noshell -s makedoc start $< -s erlang halt esdl-1.2/doc/sdl.html0000644000076400010400000000154311540750057016450 0ustar familjenAdministratörersdl

Header File

The header file may include additional information sdl.hrl

Exports

init(Flags)

quit()

getError()

esdl-1.2/doc/sdl_active.html0000644000076400010400000000121611540750057020000 0ustar familjenAdministratörersdl_active

Header File

The header file may include additional information sdl_active.hrl

Exports

quitRequested()

getAppState()

esdl-1.2/doc/sdl_audio.html0000644000076400010400000000551111540750057017630 0ustar familjenAdministratörersdl_audio

Header File

The header file may include additional information sdl_audio.hrl

Exports

audioDrivername()

openAudio(Desired, ForceFormat)

closeAudio()

getAudioStatus()

pauseAudio(true)

loadWAV(File)

freeWAV(#audiop{ptr=Ptr})

play_audio(#audiop{ptr=Ptr,size=Size}, Repeat)

convertAudio(FromAS, ToAS, #audiop{ptr=Ptr,size=Size})

esdl-1.2/doc/sdl_events.html0000644000076400010400000000453111540750057020034 0ustar familjenAdministratörersdl_events

Header File

The header file may include additional information sdl_events.hrl

Exports

pumpEvents()

peepEvents()

peepEvents(NumEvents, Mask)

peepEvents(NumEvents, ?SDL_GETEVENT, Mask)

pollEvent()

waitEvent()

eventState(Type, State)

esdl-1.2/doc/sdl_img.html0000644000076400010400000001703611540750057017310 0ustar familjenAdministratörersdl_img

Header File

The header file may include additional information sdl_img.hrl

Exports

linkedVersion()

loadTypedRW()

load(File)

loadRW()

invertAlpha()

isBMP()

isPNM()

isXPM()

isXCF()

isPCX()

isGIF()

isJPG()

isTIF()

isPNG()

isLBM()

loadBMPRW()

loadPNMRW()

loadXPMRW()

loadXCFRW()

loadPCXRW()

loadGIFRW()

loadJPGRW()

loadTIFRW()

loadPNGRW()

loadTGARW()

loadLBMRW()

readXPMFromArray()

setError(_Error)

getError()

    Args: -
    Returns: Error
    C-API: char * IMG_GetError()
    Desc:
    Returns a (string) containing a human readable version or the reason for the last error that occured.
esdl-1.2/doc/sdl_joystick.html0000644000076400010400000001312311540750057020364 0ustar familjenAdministratörersdl_joystick

Header File

The header file may include additional information sdl_joystick.hrl

Exports

numJoysticks()

name(Index)

    Args: JoystickIndex
    Returns: Name (List)
    C-API: char *SDL_JoystickName(int device_index);
    Desc:
    Get the implementation dependent name of a joystick. This can be called before any joysticks are opened. If no name can be found, this function returns NULL.

open(Index)

    Args: JoystickIndex
    Returns: Joystick or exits
    C-API: SDL_Joystick *SDL_JoystickOpen(int device_index);
    Desc:
    Open a joystick for use - the index passed as an argument refers to the N'th joystick on the system. This index is the value which will identify this joystick in future joystick events. This function returns a joystick identifier, or NULL if an error occurred.

opened(Index)

index(Joystick)

numAxes(Joystick)

numBalls(Joystick)

    Args: Joystick
    Returns: no of balls
    C-API: int SDL_JoystickNumBalls(SDL_Joystick *joystick);
    Desc:
    Get the number of trackballs on a joystick Joystick trackballs have only relative motion events associated with them and their state cannot be polled.

numHats(Joystick)

numButtons(Joystick)

update()

    Args: none
    Returns: none
    C-API: void SDL_JoystickUpdate(void);
    Desc:
    Update the current state of the open joysticks. This is called automatically by the event loop if any joystick events are enabled.

getAxis(Joystick, Axis)

getHat(Joystick, Hat)

    Args: Joystick, Hat
    Returns: HatState
    C-API: Uint8 SDL_JoystickGetHat(SDL_Joystick *joystick, int hat);
    Desc:
    Get the current state of a POV hat on a joystick The return value is one of the following positions in sdl_joystick.hrl The hat indices start at index 0.

getButton(Joystick, Button)

getBall(Joystick, Ball)

    Args: Joystick, Ball
    Returns: {DX, DY} or badarg
    C-API: int SDL_JoystickGetBall(SDL_Joystick *joystick, int ball, int *dx, int *dy);
    Desc:
    Get the ball axis change since the last poll This returns 0, or -1 if you passed it invalid parameters. The ball indices start at index 0.

close(Joystick)

esdl-1.2/doc/sdl_keyboard.html0000644000076400010400000000340011540750057020322 0ustar familjenAdministratörersdl_keyboard

Header File

The header file may include additional information sdl_keyboard.hrl

Exports

getKeyState()

enableUNICODE(Bool)

enableKeyRepeat(Delay, Interval)

getKeyName(Key)

getModState()

setModState(ModState)

esdl-1.2/doc/sdl_mouse.html0000644000076400010400000000436011540750057017660 0ustar familjenAdministratörersdl_mouse

Header File

The header file may include additional information sdl_mouse.hrl

Exports

getMouseState()

getRelativeMouseState()

warpMouse(X, Y)

createCursor(Data, Mask, W, H, HotX, HotY)

setCursor({cursorp,Ref})

getCursor()

freeCursor({cursorp,Ref})

showCursor(Bool)

esdl-1.2/doc/sdl_ttf.html0000644000076400010400000004014511540750057017326 0ustar familjenAdministratörersdl_ttf

Header File

The header file may include additional information sdl_ttf.hrl

Exports

linkedVersion()

byteSwappedUNICODE(Int)

    Args: Int
    Returns: void
    C-API: void TTF_ByteSwappedUNICODE(int swapped);
    Desc:
    This function tells the library whether UNICODE text is generally byteswapped. A UNICODE BOM character in a string will override this setting for the remainder of that string.

init()

openFont(File, PointSize)

openFontIndex(File, PointSize, Index)

    Args: File, PointSize, Index
    Returns: TTF_Font Ref
    C-API: TTF_Font * TTF_OpenFontIndex(const char *file, int ptsize, long index);
    Desc:
    Open a font file and create a font of the specified point size. Some .fon fonts will have several sizes embedded in the file, so the point size becomes the index of choosing which size. If the value is too high, the last indexed size will be the default.

openFontRW()

openFontIndexRW()

getFontStyle(Font)

    Args: TTF_Font Ref
    Returns: FontStyle
    C-API: int TTF_GetFontStyle(TTF_Font *font);
    Desc:
    Retrieve the font style. This font style is implemented by modifying the font glyphs, and doesn't reflect any inherent properties of the truetype font file.

setFontStyle(Font, FontStyle)

    Args: TTF_Font Ref, FontStyle
    C-API: void TTF_SetFontStyle(TTF_Font *font, int style);
    Desc:
    Set the font style. This font style is implemented by modifying the font glyphs, and doesn't reflect any inherent properties of the truetype font file.

fontHeight(Font)

fontAscent(Font)

fontDescent(Font)

fontLineSkip(Font)

fontFaces(Font)

fontFaceIsFixedWidth(Font)

    Args: TTF_Font Ref
    Returns: IsFixedWidth
    C-API: int TTF_FontFaceIsFixedWidth(TTF_Font *font);
    Desc:
    Test if the current font face of the loaded font is a fixed width font. Fixed width fonts are monospace, meaning every character that exists in the font is the same width, thus you can assume that a rendered string's width is going to be the result of a simple calculation: glyph_width * string_length

fontFaceFamilyName(Font)

    Args: TTF_Font Ref
    Returns: FaceFamilyName
    C-API: char * TTF_FontFaceFamilyName(TTF_Font *font);
    Desc:
    Get the current font face family name from the loaded font. This function may return a NULL pointer, in which case the information is not available.

fontFaceStyleName(Font)

    Args: TTF_Font Ref
    Returns: FaceStyleName
    C-API: char * TTF_FontFaceStyleName(TTF_Font *font);
    Desc:
    Get the current font face style name from the loaded font. This function may return a NULL pointer, in which case the information is not available.

glyphMetrics(Font, Ch)

sizeText(Font, Text)

sizeUTF8(Font, Text)

sizeUNICODE(Font, Text)

renderTextSolid(Font, Text, FgColor)

    Args: TTF_Font Ref, Text, FgColor
    Returns: SDL_Surface Ref
    C-API: SDL_Surface * TTF_RenderText_Solid(TTF_Font *font, const char *text, SDL_Color fg);
    Desc:
    Create an 8-bit palettized surface and render the given text at the fast quality with the given font and color. The palette has 0 as the colorkey, giving it a transparent background, with 1 as the text color.

renderUTF8Solid(Font, Text, FgColor)

    Args: TTF_Font Ref, Text, FgColor
    Returns: SDL_Surface Ref
    C-API: SDL_Surface * TTF_RenderUTF8_Solid(TTF_Font *font, const char *text, SDL_Color fg);
    Desc:
    Create an 8-bit palettized surface and render the given text at the fast quality with the given font and color. The palette has 0 as the colorkey, giving it a transparent background, with 1 as the text color.

renderUNICODESolid(Font, Text, FgColor)

    Args: TTF_Font Ref, Text, FgColor
    Returns: SDL_Surface Ref
    C-API: SDL_Surface * TTF_RenderUNICODE_Solid(TTF_Font *font, const Uint16 *text, SDL_Color fg);
    Desc:
    Create an 8-bit palettized surface and render the given text at the fast quality with the given font and color. The palette has 0 as the colorkey, giving it a transparent background, with 1 as the text color.

renderGlyphSolid(Font, Glyph, FgColor)

    Args: TTF_Font Ref, Glyph, FgColor
    Returns: SDL_Surface Ref
    C-API: SDL_Surface * TTF_RenderGlyph_Solid(TTF_Font *font, Uint16 ch, SDL_Color fg);
    Desc:
    Create an 8-bit palettized surface and render the given glyph at fast quality with the given font and color. The 0 pixel is the colorkey, giving a transparent background, and the 1 pixel is set to the text color. The glyph is rendered without any padding or centering in the X direction, and aligned normally in the Y direction.

renderTextShaded(Font, Text, FgColor, BgColor)

    Args: TTF_Font Ref, Text, FgColor, BgColor
    Returns: SDL_Surface Ref
    C-API: SDL_Surface * TTF_RenderText_Shaded(TTF_Font *font, const char *text, SDL_Color fg, SDL_Color bg);
    Desc:
    Create an 8-bit palettized surface and render the given text at high quality with the given font and colors. The 0 pixel is background, while other pixels have varying degrees of the foreground color.

renderUTF8Shaded(Font, Text, FgColor, BgColor)

    Args: TTF_Font Ref, Text, FgColor, BgColor
    Returns: SDL_Surface Ref
    C-API: SDL_Surface * TTF_RenderUTF8_Shaded(TTF_Font *font, const char *text, SDL_Color fg, SDL_Color bg);
    Desc:
    Create an 8-bit palettized surface and render the given text at high quality with the given font and colors. The 0 pixel is background, while other pixels have varying degrees of the foreground color.

renderUNICODEShaded(Font, Text, FgColor, BgColor)

    Args: TTF_Font Ref, Text, FgColor, BgColor
    Returns: SDL_Surface Ref
    C-API: SDL_Surface * TTF_RenderUNICODE_Shaded(TTF_Font *font, const Uint16 *text, SDL_Color fg, SDL_Color bg);
    Desc:
    Create an 8-bit palettized surface and render the given text at high quality with the given font and colors. The 0 pixel is background, while other pixels have varying degrees of the foreground color.

renderGlyphShaded(Font, Glyph, FgColor, BgColor)

    Args: TTF_Font Ref, Glyph, FgColor, BgColor
    Returns: SDL_Surface Ref
    C-API: SDL_Surface * TTF_RenderGlyph_Shaded(TTF_Font *font, Uint16 ch, SDL_Color fg, SDL_Color bg);
    Desc:
    Create an 8-bit palettized surface and render the given glyph at high quality with the given font and colors. The 0 pixel is background, while other pixels have varying degrees of the foreground color. The glyph is rendered without any padding or centering in the X direction, and aligned normally in the Y direction.

renderTextBlended(Font, Text, FgColor)

renderUTF8Blended(Font, Text, FgColor)

renderUNICODEBlended(Font, Text, FgColor)

renderGlyphBlended(Font, Glyph, FgColor)

    Args: TTF_Font Ref, Glyph, FgColor
    Returns: SDL_Surface Ref
    C-API: SDL_Surface * TTF_RenderGlyph_Blended(TTF_Font *font, Uint16 ch, SDL_Color fg);
    Desc:
    Create a 32-bit ARGB surface and render the given glyph at high quality, using alpha blending to dither the font with the given color. The glyph is rendered without any padding or centering in the X direction, and aligned normally in the Y direction.

closeFont(Font)

quit()

wasInit()

setError(_Error)

getError()

    Args: -
    Returns: Error
    C-API: char * TTF_GetError()
    Desc:
    Returns a (string) containing a human readable version or the reason for the last error that occured.
esdl-1.2/doc/sdl_util.html0000644000076400010400000000615311540750057017507 0ustar familjenAdministratörersdl_util

Header File

The header file may include additional information sdl_util.hrl

Exports

alloc(Size0, Type)

getBin(#sdlmem{bin=Bin})

malloc(Size, Type)

free(_Ref)

read(#sdlmem{type=Type,bin=Bin}, Size)

write(#sdlmem{type=Type,size=Size,bin=Dest}, Data)

write(#sdlmem{type=Type,size=Size0,bin=Dest0}, Offset, Data)

term2bin(Bin, _, _)

tuplelist2bin(2,Type,List)

bin2list(undefined, Type, Bin)

copySdlImage2GLArray(Image, Mem, Bpp)

debug(L)

esdl-1.2/doc/sdl_video.html0000644000076400010400000003203411540750057017635 0ustar familjenAdministratörersdl_video

Header File

The header file may include additional information
sdl_video.hrl

Exports

getSurface(Surface)

getPixelFormat(Surface)

getPalette(Surface)

getPixels(Surface, Size)

setVideoMode(W, H, Bpp, Type)

videoDriverName()

getVideoSurface()

videoModeOK(W, H, Bpp, Type)

listModes({formatp, Ref}, Flags)

displayFormat(Surface)

blitSurface(SSurf, SRect, DSurf, DRect)

fillRect(S, R, C)

updateRect(S, X, Y, W, H)

updateRects(S, R)

flip({surfacep, Ref})

setColors(S, Colors, FirstColor, Ncolors)

setColorKey(Surface, Flag, Key)

mapRGB(Surface, R, G, B)

createRGBsurface(Flags, W, H, D, RM, GM, BM, AM)

createRGBsurfaceFrom(Pixels, W, H, D, P, RM, GM, BM, AM)

freeSurface(Surface)

mustLock(Surface)

lockSurface(Surface)

unlockSurface(Surface)

loadBMP(File)

saveBMP(Surface, File)

setAlpha(Surface, Flag, Alpha)

setClipping(Surface, Top, Left, Botton, Right)

setGamma(Red,Green,Blue)

setGammaRamp(Red,Green,Blue)

getGammaRamp()

wm_setCaption(Title, IconTitle)

wm_getCaption()

wm_setIcon(Icon, Mask)

wm_iconifyWindow()

wm_toggleFullScreen(Surface)

wm_grabInput(GrabMode)

wm_getInfo()

wm_isMaximized()

wm_maximize()

gl_setAttribute(Attr, Val)

gl_getAttribute(Attr)

gl_swapBuffers()

mapRGBA(Surface, R, G, B, A)

getClipRect(Surface)

setClipRect(Surface, Rect)

displayFormatAlpha(Surface)

esdl-1.2/ebin/0000755000076400010400000000000011540750057015145 5ustar familjenAdministratöreresdl-1.2/ebin/sdl.beam0000644000076400010400000000366411540750057016566 0ustar familjenAdministratörerFOR1ŹBEAMAtomW*sdlinitesdlcodepriv_direrror is_loadedfileerlang++cpwd atom_to_listostypewin32getenvputenverl_ddll load_driver format_errorioformatok open_port esdl_portregister port_controlquit port_close unload_drivergetErrorbinary_to_listcastcallsend_bin port_commandsdlmemunsupported_typestrip module_infoget_module_infoCode›m" " -0@$@275=U09ľ:ľ B+ľb@9E:E BB#+E‚@G@# @G =U@0@@G  P@P9e:e B+e @G0` E ;@ @@G0 p`>u@G@@ €p?9…:• BB#+•b@# E@GP  =Ľ€,Ľ  E@G`   @Gp@G€ °@@ @ Ŕm@Y $@ @#$@ 0Đ@0°JŔ Đ @ ŕ@G@đŕ đ @ @#@ 0Đ "  @#@@ 0Đ@  # @#@@ N0Đ $5 @@ N  $09 : @B3BC+ 3 &5 C@C@ N 5 @@ N  PFGCJP0F@3GG#G 'G@3N ( + @8   A  E )@N  )!@@N StrTImpT       ! %  * *ExpTp )!)$$#"  LitT”˝xœc``ŕd``lÎfŕMMĘĚÓ/NÉŃKJMĚ rY Š2Ëô ‡COOĆçňYC<€l> › ¨1>(™Z‘Šˆ¸€y i‰™9Š)V uĹ uy@9I œ(T.š(ą8,Y‘hÎ’Œ) l@Ç$Uf Ë`Ja`-.H,ĎCą ż1xLocT(Attr(ƒlhdvsnlnąí¸k#-Ąş“źĹďjjCInf&ƒlhdoptionslhdcwdkc:\Users\familjen\src\esdl\srchdoutdirk&c:/Users/familjen/src/esdl/src/../ebinhdik)c:/Users/familjen/src/esdl/src/../includedwarn_unused_varsdinlinejhdversionk4.7.2hdtimehbŰaaaa#a hdsourcek&c:/Users/familjen/src/esdl/src/sdl.erljAbstesdl-1.2/ebin/sdl_active.beam0000644000076400010400000000150011540750057020104 0ustar familjenAdministratörerFOR18BEAMAtom sdl_active quitRequested sdl_events pumpEvents peepEventsfalsetrue getAppStatesdlcall module_infoerlangget_module_infoCode•‚ " @@#@045@b0@r@‚P @@ ƒ te]ueye@`‚Hp˛€@N0˛ @@N @StrTImpT@   ExpT4  LocTAttr(ƒlhdvsnln„ď×ŸÔż%őĚ áƒljjCInf-ƒlhdoptionslhdcwdkc:\Users\familjen\src\esdl\srchdoutdirk&c:/Users/familjen/src/esdl/src/../ebinhdik)c:/Users/familjen/src/esdl/src/../includedwarn_unused_varsdinlinejhdversionk4.7.2hdtimehbŰaaaa#a"hdsourcek-c:/Users/familjen/src/esdl/src/sdl_active.erljAbstesdl-1.2/ebin/sdl_audio.beam0000644000076400010400000000412011540750057017733 0ustar familjenAdministratörerFOR1HBEAMAtom sdl_audioaudioDrivernamesdlcallerlangbinary_to_list openAudio audiospectruefalse audio_failureexit closeAudiocastgetAudioStatus pauseAudioloadWAVaudiopload_wav_failederrorfreeWAV play_audioinfinity convertAudio module_infoget_module_infoCode[ˆ& " @@ — 0r @95:5€B#B3B CB0SBPcB`s+5#‚ P€@s@c@S$@C4@3D;•@’U˘eP@=u`@pmŔYY DY 4Y$Y Y $4D@ ˜ tĽsy…@˛ P€uĽ uĽ #uĽ03uĽ@CuĽP SuĽ` cuĽp syĽ€F€G‚GG#G3GCGSGcGsPI ‚J°ŇŔ@@ ŁN 0Đňŕ @@ ™ tőíuőyő@đ‚H 0 ; @’ ˘ @G@ šN 0@G@ šN 0  EG@ › t (ĺu  u  #u 03u @Cu P Su ` cu p su € @ƒu  “y  F€ŁG‚GG#G3GCGSGcGsF0G GƒG“F GŁG‚0F G G@@ 9 : 0BB#+  m€0Y @#@@ N 0  9 : 0B#B3B C+ #  P@C@3+  @˙˙= @mY @Y Y @ˆ @ ¤ + G H 09 #: #0B#3B#CB# S+ 3  `9 !: !€B#B3B cB0s+ !#‚9 !: !€BB#B ƒB0“+ !‚m Y cYsY 3Y ƒY“Y #Y @CY S@@ Ÿ t u  @u  #y * @0F0G GG# ‚0F G G@@!@G0@" #@NP$ %@@N `StrTImpTX ExpTˆ %# LitT=?xœc```a```mÎf`d„1€4[s.H7g0Ľ0p&%ŚĽ&çĽŮ‰Ľ)™ůĹŠÉ˙- )LocTAttr(ƒlhdvsnln*Üh0ŢŽ+ěŽ%_˛‰o\jjCInfFƒlhdoptionsld export_allhdcwdkc:\Users\familjen\src\esdl\srchdoutdirk&c:/Users/familjen/src/esdl/src/../ebinhdik)c:/Users/familjen/src/esdl/src/../includedwarn_unused_varsdinlined export_alljhdversionk4.7.2hdtimehbŰaaaa#a#hdsourcek,c:/Users/familjen/src/esdl/src/sdl_audio.erljAbstesdl-1.2/ebin/sdl_events.beam0000644000076400010400000000442411540750057020145 0ustar familjenAdministratörerFOR1 BEAMAtomű sdl_events pumpEventssdlcast peepEventscall _esdl_result_ pollEventno_eventerlanghd waitEvent eventState decode_eventslistsreverseresize joybuttonjoyhatjoyballjoyaxis mousebutton mousemotionkeyboardactive module_infoget_module_infoCode[ƒ3 " @@ eN 0R@@!@y˙˙˙˙#@ 0…PR `'U)@#@!0…pR0€+u!'u) 0mP0Y #Y@ f Ĺ9ľ:ľ BB#+ľr+Ľ#G@ @@# °•Ŕ•Đ‚ŕ @@ g đ 9 :  BB#+ r+ #G@’@@#   őő @@ h  9 :  BB#+ r+ #G@@@#     Ň  m #YY@#@ i t („u y @‚Hâ@ â t  y @N0 u . #- .#;# .  !ą "Ą #‘ $ %q &Q 'A (! ) *  +Á , -!u .0 3u .@ Cƒ .€`PF0#G G3GCE# "u .03u .@Cu .PSƒ .€p`F@#G G3GCGSE# #u .03u .@Cu .PSƒ .€p`F@#G G3GCGSE# $u .03u .@Cu .P Sƒ .€p`F@#G G3GCGSE# %u .03u .@Cu .P @Su .` @cƒ .€€pFP#G G3GCGSGcE# &u .03u .@Cu .P @Sƒ .€p`F@#G G3GCGSE# 'u .03u .@Cu .PSu .` cu .p su .€ ƒƒ .€ Fp#G G3GCGSGcGsGƒE# (u .03u .@Cu .P Su .` cu .p su .€ @ƒu . @“ƒ .€° F€#G G3GCGSGcGsGƒG“E# )u .03u .@Cu .PSu .` cu .p su .€ ƒƒ .€ Fp#G G3GCGSGcGsGƒE# *u .03u .@Cƒ .€`PF0#G G3GCE# +ƒ .€ EG ,ƒ .€ EG  -ƒ .€ E’ .‚= / 0@N@1 2@@N PStrTImpTL   ExpT| 20  LitT/,xœc```f```kÎe€žć ĆśÔŠ‚üâT Ÿ Ěg),Í,‚żLocTAttr(ƒlhdvsnln%Őu> KkA9MłEŃ8hŠjjCInf-ƒlhdoptionslhdcwdkc:\Users\familjen\src\esdl\srchdoutdirk&c:/Users/familjen/src/esdl/src/../ebinhdik)c:/Users/familjen/src/esdl/src/../includedwarn_unused_varsdinlinejhdversionk4.7.2hdtimehbŰaaaa#a!hdsourcek-c:/Users/familjen/src/esdl/src/sdl_events.erljAbstesdl-1.2/ebin/sdl_joystick.beam0000644000076400010400000000365411540750057020504 0ustar familjenAdministratörerFOR1¤BEAMAtomŃ sdl_joystick numJoystickssdlcallnameerlangbinary_to_listopenopened==indexnumAxesnumBallsnumHats numButtonsupdatecastgetAxisgetHat getButtongetBallbadargclose module_infoget_module_infoCodeď‚/" @@ † t5HÍu5y5@0‚H@RP E@ ‡ `‚p E@ ˆ t…hŘu… @y…@€‚H’  m€Y @@ ‰ tľHŇuľyľ  °‚HŔ˛Đ m€Y @@ Š tĺˆąuĺyĺ@ŕ‚Hđ m€Y @@ ‹ t ˆ2u y @‚HŇ m€Y @@ Œ t (zu y @‚Hâ m€Y @@  t (ƒu y @‚Hň m€Y @@ Ž t ( u y @‚H @@ N 0   mP #Y Y@#@ ‘ t Ťu  y @‚H   ! mP #Y Y@#@ ’ t "ˆRu "y "@"‚H#  $ mP #Y Y@#@ “ t %h u %y %@%‚H&  ' m` #Y Y @#@ ” t (¨:u ( u ( #y (00F GG#(‚0F G G@) *m@Y @ •N 0+ ,@N@- .@@N PStrTImpTL ExpTĐ.,*'$!     LocTAttr(ƒlhdvsnlnéyI#éW'œS÷Ë gĘjjCInfIƒlhdoptionsld export_allhdcwdkc:\Users\familjen\src\esdl\srchdoutdirk&c:/Users/familjen/src/esdl/src/../ebinhdik)c:/Users/familjen/src/esdl/src/../includedwarn_unused_varsdinlined export_alljhdversionk4.7.2hdtimehbŰaaaa#a"hdsourcek/c:/Users/familjen/src/esdl/src/sdl_joystick.erljAbstesdl-1.2/ebin/sdl_keyboard.beam0000644000076400010400000000223011540750057020432 0ustar familjenAdministratörerFOR1BEAMAtomľ sdl_keyboard getKeyStatesdlcallerlangbinary_to_list list_to_tuple enableUNICODEtrueenableKeyRepeat=:= getKeyName getModState setModStatecast module_infoget_module_infoCodeq‚" @@ |  0‚@ +U’@=eP@` E@ y tuHÔuuyu@p‚H€˘  m@ #Y Y @#@ z tĽ]uĽyĽ 0 ‚H°ÂŔ m Y @ { ĐŇŕ @@ } tő(öu  y @đ4 @‚Jâm Y @ ~N @ @NP @@N `StrTImpTX ExpTd    LocTAttr(ƒlhdvsnln DZÂ3čQ“ď“Dř͌jjCInf/ƒlhdoptionslhdcwdkc:\Users\familjen\src\esdl\srchdoutdirk&c:/Users/familjen/src/esdl/src/../ebinhdik)c:/Users/familjen/src/esdl/src/../includedwarn_unused_varsdinlinejhdversionk4.7.2hdtimehbŰaaaa#a"hdsourcek/c:/Users/familjen/src/esdl/src/sdl_keyboard.erljAbstesdl-1.2/ebin/sdl_mouse.beam0000644000076400010400000000333011540750057017764 0ustar familjenAdministratörerFOR1ĐBEAMAtomç sdl_mouse getMouseStatesdlcallgetRelativeMouseState warpMousecast createCursorerlangsize byte_sizeallexitstartcursorp setCursor getCursor freeCursor showCursortruefalse _esdl_result_=:= module_infoget_module_infoCode‚$ " @@ o t5"u5u5 #u50 3y5@@F0GG#G30‚H@RP @@ p tehEueue #ue0 3ye@@F0GG#G3`‚Hpb €m@ #Y Y @#@ qN ‚` 5•5• `|` c@s|€0ƒosƒs|€0ƒosƒsosĄsmspsY #Y 3Y CY SY cZ€Z€@s@ r tŐhĘuĹ @+ľyľ@G@°{âŔuŐ @yŐ0 F GňGЂJŕ đ9ĺ:ĺ BB#+ĺňm€0Y @#@@ sN   @@ t t ¸u  @+ y @G@{âu  @y 0 F GňG‚J 9 :  BB#+ ňm€0Y @#@@ uN   0 ; @    @= @ E@ v  9 :  BB#+   P#  J  !@N`" #@@N pStrTImpTd      ExpT| #! LitTAMxœc```b``PjÎ`JaŕI.JM,Iu.-*Î/Jaŕ-J-)-ĘKM‰Ď+ÍÉŞ’ŤâLO-ÁŽ(w“LocTAttr(ƒlhdvsnlnďÂóM•ż Xőł­ťjjCInf,ƒlhdoptionslhdcwdkc:\Users\familjen\src\esdl\srchdoutdirk&c:/Users/familjen/src/esdl/src/../ebinhdik)c:/Users/familjen/src/esdl/src/../includedwarn_unused_varsdinlinejhdversionk4.7.2hdtimehbŰaaaa#a!hdsourcek,c:/Users/familjen/src/esdl/src/sdl_mouse.erljAbstesdl-1.2/ebin/sdl_util.beam0000644000076400010400000001701011540750057017611 0ustar familjenAdministratörerFOR1BEAMAtom.Nsdl_utilallocsdlmemgetBinmallocfreeokreadreadBinerlang=:=ortruelist_to_binary non_byte_typeerrorwrite-alldo_writelengthsdlsend_bincastsizeterm2binlistssublist tuple_to_listlist2binbooleanfloat_list2bin int_list2bin bool_list2binfalse tuple2binfloat_tuple2binelement int_tuple2binbool_tuple2bin tuplelist2bintuplelist2bin2tuplelist2bin3tuplelist2bin4tuplelist2bin2_floatreversetuplelist2bin3_floattuplelist2bin4_floattuplelist2bin2_inttuplelist2bin3_inttuplelist2bin4_intbin2list undefinedbinary_to_list* bin2float_1bin2unsigned_1 bin2int_1 matrix2bin matrix2bin_1copySdlImage2GLArraysurfacepcall sdl_surfacemem_sizedebugwbwhexdivremioformat module_infoget_module_info-bin2list/3-lc$^0/1-0-=/=-tuplelist2bin/3-lc$^1/1-0--tuplelist2bin/3-lc$^0/1-1-Code˛‰Č,"  @#@@#@@ §'5 A@ A0omPY€F@G2GGG @BP9E:E@BB#+E2@#`R p %€b@r ‚ °9Ľ:Ľ@B#B3B0C+Ľ#2@3#@@C0 |Ŕ’ Đ9Ĺ:Ĺ@B#B3B0C+Ĺ#2 őC őC# ő#+őŇtĺ3@3wĺ3@€ƒĺ3€ EN ŕ‚3H3đ0PF GňGCN0  9 : @B#B3B CB0S+ #2@3#@3@C@S@  09 : @B3BCB SB0c+ 32' S@p}p@S@c@#@$@C4 §t 4x €w  €@#@@3@$@ @‚4H4 @7 30@|@P3C@3@@#$' C@= @C@@#@ˆ 0 @@@`@@ ¸ p| @€3C| P€#S5 3( SC @@#@3`@ˆ`@@ ¸ p 05 7 0| 0P3+ 3@# #@# @ #9  0|0€3+ !3* #) #   + !30 8 !@#@ @#@0  "  #0 $+ " @ 2$- "; " % & ' ' ' ( ) ) ) * *%@#@ @0 ,&@#@ 0 ,'@#@ 0 /(@#@ 0 /)@#@ 0 /*+ 0,8 -A3Co‰ P[3E##@C0 ,-4 +@#. !0/8 0A3Co‰ PY3E##@C0 /04 .@#1 " 28 6A#30 5#;# 5@Ň 3 # 43 @EG@3 24 @EG@3 25@@E#G#E#@3 264 1@7 $080 9#+ 7# @#0 F9- 7#;# 7 : ; < < < = > > >:@3@ @#@ @;@3@ #@ @<@3@ #@ C=@3@ #@ C>@3@ #@ C? %@@+ A@3A}@@C °o#S‰S PS[#ES33@C@ @B '@C+ D@3D}@@C °o#S‰S PSY#ES33@C@ CE (0F+ G@#G 0 °3@@0 J3;3 J@Ň H # IH 0E#= KI 0E#= KJ @E3#K}@@#@0 F L )0M- W; W€A N! O1 P  QN@@# eO@@# [P@@# `Q 08 U#A#3@@3- X; X@ R SR@ @ ›= TS@  ›T@#@@@# Ć E= VU4 Y#@V W 0@#3@#@30 Ă X0@F #GGJ#Y 0FG#JZ * [- Z; Z€ \ ] ^ ^\@#@@ @0 j]@#@@ 0 j^@#@@ 0 s_ + `- _; _€ a b c ca@#@@ @0 mb@#@@ 0 mc@#@@ 0 vd , e- d; d€ f g h hf@#@@ @0 pg@#@@ 0 ph@#@@ 0 yi -0j8 kA3C9 i3: i3 B3SB3coo‰ p[S[cE##@C0 jk4 i 0@#Ŕ l /0m8 nA3C9 l3: l30B3SB3cB3 sooo‰ €[S[c[sE##@C0 mn4 l 0@#Ŕ o 00p8 qA3C9 o3: o3@B3SB3cB3 sB30ƒoooo‰ [S[c[s[ƒE##@C0 pq4 o 0@#Ŕ r 10s8 tA3C9 r3: r3 B3SB3coo‰ pYSYcE##@C0 st4 r 0@#Ŕ u 20v8 wA3C9 u3: u30B3SB3cB3 sooo‰ €YSYcYsE##@C0 vw4 u 0@#Ŕ x 30y8 zA3C9 x3: x3@B3SB3cB3 sB30ƒoooo‰ YSYcYsYƒE##@C0 yz4 x 0@#Ŕ { 40|+ } 5|0€#0 |}0 ~+ {  0@#Đ Ŕ~- {; {  ‚ ƒ „ … † ‡ ˆ| €0€#' €t ‰#0#w ‰#0€ƒ ‰#€@= €@#NĐ‚}0@}0ŕ@3@@ ‹ƒ}0@}0ŕA@3@A@ ‹„}0@}0ŕA@3@A@ …}0@}0ŕA@3@A@ “†}0@}0ŕ!@3@!@ ‡}0@}0ŕ!@3@!@ “ˆ}0@}0ŕ@3@@ “‰‚#H#Š 8@‹' Œ@3Œt #@Cx C€v CP€Sƒ C€}`@ `ES33@ ‹H#Ž 9@' @3t ‘#@Cx ‘C€u ‘CP€Sƒ ‘C€}`@ `ES33@ ‘H#’ :@“' ”@3”t •#@Cx •C€u •CP€Sƒ •C€}`@ `ES33@ “•H#– ; —- –; –@ ˜ ™˜@ @ ›™@  ›š < ›8 A#38 š3A3CS8 šSAScs8 šsAsƒ“8 š“A“Łł8 šłAłĂÓ8 šÓAÓăó8 šóAó  8 š A   8 š A   8 š A   8 š A   8 œ A   8 š A   8 š A   8 š A  !4 š !oooooooooooooooo‰![#[C[c[ƒ[Ł[Ă[ă[ [ [ [ [ [ [ [ [ œ4 š oooooooooooooooo‰[#[C[c[[ƒ[Ł[Ă[[ă[ [ [[ [ [ [?đ9 š< š@ žŔ ŸžB#B3B CB0SB@cBPsB`ƒBp“B€ŁBłB ĂB°ÓBŔăBĐóBŕ Bđ oooooooooooooooo‰[#[3[C[S[c[s[ƒ[“[Ł[ł[Ă[Ó[ă[ó[ [ ŸB#B3B CB0SB@cBPsB`ƒBp“B€ŁBłB ĂB°Óoooooooooooooooo‰ŕ[#[3[C[[S[c[s[[ƒ[“[Ł[[ł[Ă[Ó[?đ  =0Ą9  <  @ ˘ Ľ˘B3BC+  3 >9  :  @BSBc+  S2* Ł#1)  #AŁ p@c@#@C`mY @Y@@ ľ đt ¤čë„ ¤€y ¤@r ¤‚0F G G@0 ĽB3BC+  3 @@C0 ĄŚ A §- Ś; Ś ¨ Š Š Š Ş Ş Ť Ť¨} ŕŠ} ŕAŞ} ŕ!Ť@Ź B­- Ź E@ śN pŽ CŻ8 °A#8 Ž#A#3C8 ŽCACSc8 Žc €pAcsEsESE3#E# ˛@ ݰ4 Ž@rą D˛8 ł A#}0 }0 @# ˛@ˆ ˛@G @ ˛ł4 ´@G0N´' ľĄ E@G@N ľ) śĄ@GPNś) ˇą@G`Nˇ) ¸Á@GpN¸) šŃ@G€Nš) şá@GNş) ąń@G Nť Iź@N˝ Iž@@N ż KŔ8 ÁA  Ŕ EÁ4 żÂ M0Ă8 Ä 00A$@S@#@S#@#@0 @3@@#@$@3$ˆ 0 Ă EÄ4 ÂĹ N Ć8 Ç A@ —@#@@@#ˆ Ć EÇ4 ĹStrTImpT         &. 6 7? E FGHGH J J LExpTIžIźD˛CŻB­=Ą;—4|,e+`*[)M    LitT?jxœc``ŕf```mÎf`d„1`  ƒČ`V¨Ë2ـLŚş˜Ź#Œác8Ă.0†+ŒáÁt>LocTNĆMĂKŔA§<›:“98‹3y2v1s0p/m-j(F'C%@$8"2!/ ,#Attr(ƒlhdvsnln›Š§”üxŸľ]fěš \jjCInf+ƒlhdoptionslhdcwdkc:\Users\familjen\src\esdl\srchdoutdirk&c:/Users/familjen/src/esdl/src/../ebinhdik)c:/Users/familjen/src/esdl/src/../includedwarn_unused_varsdinlinejhdversionk4.7.2hdtimehbŰaaaa#a#hdsourcek+c:/Users/familjen/src/esdl/src/sdl_util.erljAbstesdl-1.2/ebin/sdl_video.beam0000644000076400010400000002641411540750057017752 0ustar familjenAdministratörerFOR1-BEAMAtom*g sdl_video getSurfacesurfacepsdlcallformatpnullpixelp sdl_surfacegetPixelFormatpalettepsdl_pixelformat getPaletteall getColorslistsreverse sdl_colorerlang- getPixelssdl_rect byte_sizeerror setVideoMode _esdl_result_bandostypewin32wxcodepriv_dirfilenamejoinlist_to_binary esdl_port opengl_portputopengl_init_failedvideoDriverNamebinary_to_listgetVideoSurface getVideoinfo/= sdl_videoinfo videoModeOK listModes listModesRet displayFormatexit blitSurface blitSurface2fillRect fillRect2== updateRect updateRectslengthcast mk_rectbinsflip setColorssizediv mkbin_colors setColorKeymapRGBcreateRGBsurfacecreateRGBsurfaceFrom freeSurfacemustLock lockSurface unlockSurfaceloadBMPsaveBMPsetAlpha setClippingsetGamma setGammaRamp++sdl_utilterm2bin getGammaRampbin2list wm_setCaption wm_getCaption wm_setIconwm_iconifyWindowwm_toggleFullScreen wm_grabInput wm_getInfowm_isMaximized wm_maximizegl_setAttributegl_getAttributegl_swapBuffersmapRGBA getClipRect setClipRectdisplayFormatAlpha module_infoget_module_infoCode"ž†9" 9<@ 5…0BB#+2€0m€0Y @#@t@ G t• Óu• u• @#u•0 3u•@ Cu•P Su•` @cu•p sy•@c@$@34@CD@ST@sd*E#0€F GbG#=U@@rP@*e0F G‚G=u`@rp FG’GtG$GG4GDGTGGd@€€BB#+’@#%‚H ˘°9Ľ<Ľ@ ŐőŔBB#+Ľ20m€0Y @#@ @ I t ´u  @u  #u 03u @Cu PSu `cu psu €ƒu “u  Łu °łu Ŕ Ău Đ Óu ŕ ău đ óu   u  y @#@3@C$@S4@cD@sT@ƒd@“t@Ł„@ł”@ä@Ó´@ăÄ@óÔ@ ä@ ô*Ő0F G˛G=ĺĐ@rŕFGÂG GGGG$G4GDGTGdGtG„G”G¤G´GÄGÔGäGô@đBB#+Ľ’@#ľ‚HŇ9 < @  BB#+ 2 0m€0Y @#@@ H t (>u  w  â€@#0 BB#+ ’@# ‚Hň0+ @#Nt 0u 03u @Cu PSw `â€P`F@cG G3GCGS}p  pEc##0 ‚=   9 < @  B#B3+ #29 : PBB#B CB0SB@c+  m€pY #Y CY SY c@|@0#o#om@Y @3Zâ€@ JN B#B3+ #’@3 @GN@ @  @m @CY Y Y #Y 3@C@ $@3 ! *9 ): ) BB#+ ) + "#@  "}0P!@#' (`9 #: # B+ # @G= $#@G $@@ p@ €†€\@  % '9 &: & BB#+ & , +#' &#@ %@ &  = (& %' %(0F G2G ) !* !+@ (@, )- @@  °. +/ @@  t 0 0u 0 @y 00 F G2G0‚H1 ,2 @@ ! t 3h…u 3u 3 #u 303u 3@Cu 3PSu 3`cu 3psu 3€ƒu 3“u 3  Łu 3° @ły 3Ŕ Ŕ Ŕ# Ŕ3# ŔC3 ŔSC ŔcS Ŕsc Ŕƒs Ŕ“ƒF “GbGłFŔłG .GGG#G3GCGSGcGsGƒGŁG“@ł3‚H4 /@5 @m @CY Y Y #Y 3@C@ " 6 89 7: 7 BB#+ 7  Ŕ#7 68 69 0 :9 ?< 9@ ; >;B#B 3B0CB@SBPcB`sBpƒB€“BŁB łB°ĂBŔÓBĐăBŕóBđ B B B + 9# @@Ă@ł$@Ł4@“D@ƒT@sd@ct@S„@C”@ ¤@ ´@ Ä@ Ô@óä@ăô@Ó 9 <3: @3 B3B3#+ @˛@#= =<+ @3r@=m,Y \Y @Y”Y„YtYdYTYDY4Y$YY Y ôY äY ÔY ÄY ´Y¤$4DTdt„”¤´ÄÔäô @ # t AHu Aw A â€@#@@# C>B#B3+ 9#b @mĐ@Y \Y @3@@ # t AHnu Aw A â€@#@@# C?+ 9r mĐ Y \Y @@@ # t AŚu Aw A â€@#@@# C@J3A‚HB 1 C- B; B@ D ˙ FDt B #y E#@Eu B#0 3u B#@ Cu B#P Su B#` cw B#pâ€# @p@#@@3@C@S$@c4 C€FPG GGG$G4E@F+ BG0@âG 2H9 G< G@ I JIBB#+ G2 0m€0Y @#@@ < t LCu L @y L, K0 F G2GJBB#+ G’@# HK@G@ĐL‚HM 4@N9 O: OBCBS+ OC’@S@ NO9 P#: P#B#CB#S+ PC’@S#@ NP9 M: M BCBS+ MC2+ Qr9 R#: Q# B#cB#s+ Qc2+ Q3rm€Y @SY @s\ VQ9 R#: R# B#cB#s+ Rc2+ R3r9 T: TPBB#B 3B0CB@c+ T m€€Y #Y 3Y CY c@|€0#o#o m€Y @SY @s\Zâ€@ VR+ Sr9 M#: S# B#cB#s+ Sc29 T3: T3PB3B3B3 #B30CB3@c+ T m€€Y Y #Y CY c@|€0#o#o m€Y @SY @s\ Zâ€@ VS9 M#: M# B#cB#s+ Mc29 T: TPBB#B CB0cB@ƒ+ T m€Y #Y CY cY ƒ9 T3: T3PB3B3#B3 CB30cB3@ƒ+ T m€Y #Y CY cY ƒ@#|€03o#3#|€03o#3#o# #m#€#Y @SY @s\0Zâ€Zâ€@# VT@GN@U 5V@@ 8 t ^ˆľu ^u ^ #ƒ ^€@- ]#;# ]€ W! X1 Y ZWt ^ u ^ #u ^0 3u ^@ Cu ^P Sy ^``FPG G#G3GCGS@r= [Xt ^ u ^ #u ^0 3u ^@ Cu ^P Sy ^``FPG G#G3GCGS@r= [Yt ^ u ^ #u ^0 3u ^@ Cu ^P Su ^` cu ^p su ^€ ƒu ^ “y ^Ŕ FPG G#G3GCGSFPG GcGsGƒG“= [Z@r@r[+ \0 F #GG@#\P F@#G GGG@#]J#^‚H_ 60`9 _< _@ a caB3BC+ _329 b: _PBSBcB sB0ƒB@“+ _S m Y @CY #\Y cY sY ƒY “ eb+ _rmĐPY @CY #\ ecB3BC+ _3’@C0 `d 7e @@ ; t fŔu fy f ŕf‚Hg 9Ph€PFPSG GG#G3GCES ji : j9 i< i@ k lkB#B3+ i#27 i @|@đ@@3 n@| 0#o#oĄmY @Y Zâ€@ &  lB#B3+ i#’@3 jm =n8 oA#9 p: pPBB3B CB0SB@c+ p m€pY 3Y CY SY c@@# n Eo4 mp@G@q >r9 q< q@ s tsBB#+ q2 0m€0Y @#@@ ' t uľu uy u ŕtBB#+ q’@# ru‚Hv ?@w9 v< v@ x yxBCBS+ vC27 v `@@3@#@S ||} 1@#|003o#3#o# #m# #Y @Y Y Zâ€@#@ ( t zBu zy z ŕ yBCBS+ vC’@S@ wz‚H{ B |4 }@G0}+ ~@G0~8 { A#3}@ @3@# |9 : @BB#B 3B0C+  @|P0SoSo1mPY#Y3YCZâ€@@GP@€ C09 €< €@ ‚ ƒ‚B3BC+ €32 PmPY @CY Y #@@ 4 t „­u „y „ ŕƒB3BC+ €3’@C0 „‚H… D@†9 …< …@ ‡ ˆ‡BCBS+ …C2 `m°`Y @SYY#Y3@@ ) t ‰u ‰ y ‰@ˆBCBS+ …C’@S@ †‰‚HŠ E€‹ €m€ƒY Y Y #Y3\Y CY SY cY s@ƒ@ + t °u  @y , Œ0 F G2GŒ@G`Ѝ‚HŽ E@ @m @CY Y Y #Y3\@C@ + t ‘úu ‘ @y ‘, 0 F G2G@G`Đ‘‚H’ F“5 ” |“@Ł|°0łoŁłŁoŁ ŁmŁ ŁY Y #Y3Y CY SY cY sY ƒY “Zâ€@Ł@ + t — ju — @y —, –= •”9 ’: ’ B“BŁ+ ’“‚ °m#°Y Y #Y3Y CY SY cY sY ƒ\@@Y @Ł@@ + t —Vu — @y —, –•0 F G2G–@G`Đ—‚H˜ G™9 ˜< ˜@ 𐠛šBB#+ ˜2m€0Y @#@@ -N ›BB#+ ˜’@# ™œ H9 œ: œBB #+ œ’}0P#@ Ŕž IŸ9 ž< ž@   Ą BB#+ ž2 0m€0Y @#@@ . t ˘+u ˘y ˘ ŕĄBB#+ ž’@# Ÿ˘‚HŁ J¤9 Ł< Ł@ Ľ ŚĽBB#+ Ł2m€0Y @#@@ /N ŚBB#+ Ł’@# ¤§ K¨7 § EGp@ 1 t Ş wu Ş @y Ş+ Š@rŠ0 F G2GŞ‚HŤ L Ź9 Ť< Ť@ ­ Ž­B#B3+ Ť#27 Ť @m€@@Y @3EGp#E#@ 3 t Ż ’u ݁y Ż ŕŽB#B3+ Ť#’@3 ŹŻ‚H° M0ą9 °< °@ ˛ ł˛B3BC+ °32 PmPY @CY Y #@@ 5 t ´h-u ´ y ´@łB3BC+ °3’@C0 ą´‚Hľ NPś9 ľ< ľ@ ˇ ¸ˇBSBc+ ľS2mpY @cY Y #Y 3Y C@@ 6N ¸BSBc+ ľS’@cP śš O0ş 0mŔ03[ [ [ #@3@ L t ťˆ§u ť y ť ŕť‚Hź P0˝ 0@@@# @@ @#@i0@@ M t žČu ž y ž ŕž‚Hż TŔ0@@ N t Á“u Á w Á I€#w Á0I€3w Á@I€Cy Á ŕ$@@)@3@C0@3@@#@)@30@3@@#@)@30PF@G$GGG@0Á‚H V Ă` EGp#E##E#@ =N Ä WĹ@@ > t Ć Ůu Ć u Ć #ƒ Ć€t Ć0w Ć0€3w Ć@#€Cy Ć@3@C°@@@°0F GG@ƂHÇ X Č9 Ç< Ç@ ɐ ËÉB#B3+ Ç#2+ Ęrm @Y @3\ €@@ ?N Ę5 Ç|@@#|@0Co#C#o#Ą#m#@#Y @3Y Zâ€@#@ ?N ËB#B3+ Ç#’@3 ČĚ YÍ@@ @N Î ZĎ9 Î< Î@ А ÔĐBB#+ Î2 0m€0Y @#@@ A Ń Ó9 Ň: Ň BB#+ Ň  ŕ#Ň ŃÓ ŃÔBB#+ Î’@# ĎŐ [Ö E@ B t ×<u ׁy ×@ׂHŘ \Ů @@ C Ú Ü9 Ű: ŰPBB#B 3B0CB@S+ Ű m@p`Y SF0G#G3GCF #GG@#Ű ÚÜ ÚÝ ]Ţ @@ K t ßĂu ߁y ß Ŕ߂Hŕ ^á@@ TN â _ ăm` #Y Y @#@ DN ä `ĺ m Y @ E ć č9 ç: ç BB#+ ç @#ç ćč ćé aę @@ F t ë ôu ë y ë@ë‚Hě bPí9 ě< ě@ î ďîBSBc+ ěS2 pmŔpY @cYY#Y3YC@@ O t đču đ y đ@ďBSBc+ ěS’@cP íđ‚Hń cň9 ń< ń@ ó ôóBB#+ ń2 0m€0Y @#@@ Q t ő(źu ő u ő #u ő0 3u ő@ Cy ő`PFPG GG#G3GCôBB#+ ń’@# ňő‚Hö d ÷9 ö< ö@ ř ůřB#B3+ ö#29 ö: öPBCBSB cB0sB@ƒ+ öC mY @3Y SY cY sY ƒ@@ RN ůB#B3+ ö#’@3 ÷ú eű9 ú< ú@ ü ýüBB#+ ú2 0m€0Y @#@@ S t ˙Öu ˙ @y ˙, ţ0 F G2GýBB#+ ú’@# Hţ@G€Đ˙‚H( f(@N( f(@@N StrT ˙˙˙˙ImpT$ !"#$'*-38;<@AQRSRUggExpTt4ffeűd÷cňbíaę`ĺ_ă^á]Ţ\Ů[ÖZĎYÍXČWĹVĂTŔP˝OşNśMąLŹK¨J¤IŸHG™F “EE‹D†C?w>r:j9h6`4N2H0:/5,2+/)-    LitTŠxœ}Ž1Â0 E ˆ `€îPNŔÂ΢ť´Âm"'˜{q’ÂVA6żŻ÷ó@ŔĄŻŚęnPČ:A„E@Öéˆ)]÷OX’°~pĚ‰ŹQ_\óžĎ; UŰŹc<›Wé¤1a';i uŰ1kďę6’$ĺ8ú]eÝ:v9.†xc…L¤Űő:)Ľ?…ł4o’Çœu?cŘWćWÁxNTĐLocT@B|=n7e5V1CAttr(ƒlhdvsnlnśJ:3aĄŮl;eśU˙jjCInf,ƒlhdoptionslhdcwdkc:\Users\familjen\src\esdl\srchdoutdirk&c:/Users/familjen/src/esdl/src/../ebinhdik)c:/Users/familjen/src/esdl/src/../includedwarn_unused_varsdinlinejhdversionk4.7.2hdtimehbŰaaaa#a hdsourcek,c:/Users/familjen/src/esdl/src/sdl_video.erljAbstesdl-1.2/esdl.pub0000644000076400010400000000070011540750057015664 0ustar familjenAdministratörer{name, "esdl"}. {vsn, {0,9}}. {summary, "A 2D & 3D (Opengl) graphics package"}. {author, "Dan Gudmundsson", "dgud@erix.ericsson.se", "001201"}. {keywords, ["sdl", "opengl", "graphic"]}. {needs, [{"sdl (C-lib)",{1,5}}, {"Opengl (c-lib)",{1,1}}]}. {abstract, "Provides access to 2d and 3d graphics through Opengl and SDL." "More information and a prebuilt Windows release" "can be found on http://www.ericsson.se/cslab/~dgud/esdl/"}. esdl-1.2/include/0000755000076400010400000000000011540750060015645 5ustar familjenAdministratöreresdl-1.2/include/sdl.hrl0000644000076400010400000000406311540750057017147 0ustar familjenAdministratörer%% Copyright (c) 2001 Dan Gudmundsson %% %% See the file "license.terms" for information on usage and redistribution %% of this file, and for a DISCLAIMER OF ALL WARRANTIES. %% %% $Id$ %% %%% Defines for SDL %%% see documentation for SDL and SDL/sdl.h %%% %%% By Dan Gudmundsson %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% sdl.h -define(SDL_INIT_TIMER, 16#00000001). -define(SDL_INIT_AUDIO, 16#00000010). -define(SDL_INIT_VIDEO, 16#00000020). -define(SDL_INIT_CDROM, 16#00000100). -define(SDL_INIT_JOYSTICK, 16#00000200). -define(SDL_INIT_NOPARACHUTE, 16#00100000). -define(SDL_INIT_EVENTTHREAD, 16#01000000). %% Don't work on windows and in the driver -define(SDL_INIT_EVERYTHING, 16#0000FFFF). -define(SDL_INIT_NOERLDRIVER, 16#02000000). %% Don't use the linked in driver -define(SDL_INIT_ERLDRIVER, 16#04000000). %% Use the linked driver -define(printError(), fun([]) -> ignore; (Estr) -> io:format("SDL Error in ~p ~p: " ++ Estr ++"~n", [?MODULE, ?LINE]) end (sdl:getError())). -define(SDL_USES_WX_GL, 1). -define(GL_BYTE_SIZE, 8). -define(GL_UNSIGNED_BYTE_SIZE, 8). -define(GL_SHORT_SIZE, 16). -define(GL_UNSIGNED_SHORT_SIZE, 16). -define(GL_INT_SIZE, 32). -define(GL_UNSIGNED_INT_SIZE, 32). -define(GL_FLOAT_SIZE, 32). -define(GL_DOUBLE_SIZE, 64). -define(gl_type_size(TYPE), case (TYPE) of 16#1400 -> ?GL_BYTE_SIZE; 16#1401 -> ?GL_UNSIGNED_BYTE_SIZE; 16#1402 -> ?GL_SHORT_SIZE; 16#1403 -> ?GL_UNSIGNED_SHORT_SIZE; 16#1404 -> ?GL_INT_SIZE; 16#1405 -> ?GL_UNSIGNED_INT_SIZE; 16#1406 -> ?GL_FLOAT_SIZE; 16#140A -> ?GL_DOUBLE_SIZE end). -define(SDL_BYTE, 16#1400). -define(SDL_UNSIGNED_BYTE, 16#1401). -define(SDL_SHORT, 16#1402). -define(SDL_UNSIGNED_SHORT, 16#1403). -define(SDL_INT, 16#1404). -define(SDL_UNSIGNED_INT, 16#1405). -define(SDL_FLOAT, 16#1406). -define(SDL_2_BYTES, 16#1407). -define(SDL_3_BYTES, 16#1408). -define(SDL_4_BYTES, 16#1409). -define(SDL_DOUBLE, 16#140A). -define(SDL_DOUBLE_EXT, 16#140A). esdl-1.2/include/sdl_active.hrl0000644000076400010400000000134611540750057020503 0ustar familjenAdministratörer%% Copyright (c) 2001 Dan Gudmundsson %% %% See the file "license.terms" for information on usage and redistribution %% of this file, and for a DISCLAIMER OF ALL WARRANTIES. %% %% $Id$ %% %%%---------------------------------------------------------------------- %%% File : sdl_active.hrl %%% Author : Dan Gudmundsson %%% Purpose : Active Macros %%% Created : 12 Jul 2000 by Dan Gudmundsson %%%---------------------------------------------------------------------- -define(SDL_APPMOUSEFOCUS, 16#01). %/* The app has mouse coverage */ -define(SDL_APPINPUTFOCUS, 16#02). %/* The app has input focus */ -define(SDL_APPACTIVE, 16#04). %/* The application is active */ esdl-1.2/include/sdl_audio.hrl0000644000076400010400000000277211540750057020335 0ustar familjenAdministratörer%% Copyright (c) 2001 Dan Gudmundsson %% %% See the file "license.terms" for information on usage and redistribution %% of this file, and for a DISCLAIMER OF ALL WARRANTIES. %% %% $Id$ %% %%%---------------------------------------------------------------------- %%% File : sdl_video.hrl %%% Author : Dan Gudmundsson %%% Purpose : defines from SDL_audio.h %%% Created : 9 Aug 2000 by Dan Gudmundsson %%%---------------------------------------------------------------------- %% Data Types -record(audiospec, {freq, %% Int32 DSP frequency -- samples per second format, %% Uint16 Audio data format channels, %% Uint8 Number of channels: 1 mono, 2 stereo silence, %% Uint8 Audio buffer silence value (calculated) samples, %% Uint16 Audio buffer size in samples padding, %% Uint16 Necessary for some compile environments size}). %% Uint32 Audio buffer size in bytes (calculated) %% Audio format flags (defaults to LSB byte order) -define(AUDIO_U8, 16#0008). %% Unsigned 8-bit samples -define(AUDIO_S8, 16#8008). %% Signed 8-bit samples -define(AUDIO_U16LSB, 16#0010). %% Unsigned 16-bit samples -define(AUDIO_S16LSB, 16#8010). %% Signed 16-bit samples -define(AUDIO_U16MSB, 16#1010). %% As above, but big-endian byte order -define(AUDIO_S16MSB, 16#9010). %% As above, but big-endian byte order -define(AUDIO_U16SYS, 16#FFF1). %% Native audio ordering -define(AUDIO_S16SYS, 16#FFF0). esdl-1.2/include/sdl_events.hrl0000644000076400010400000001350311540750057020532 0ustar familjenAdministratörer%% Copyright (c) 2001 Dan Gudmundsson %% %% See the file "license.terms" for information on usage and redistribution %% of this file, and for a DISCLAIMER OF ALL WARRANTIES. %% %% $Id$ %% %%%---------------------------------------------------------------------- %%% File : sdl_events.hrl %%% Author : Dan Gudmundsson %%% Purpose : Event definitions %%% Created : 7 Jul 2000 by Dan Gudmundsson %%%---------------------------------------------------------------------- -define(SDL_QUERY, -1). %% Arg to eventState function -define(SDL_IGNORE, 0). -define(SDL_ENABLE, 1). -define(SDL_ADDEVENT, 0). %% Arg to peepEvents function -define(SDL_PEEKEVENT, 1). -define(SDL_GETEVENT, 2). -define(SDL_PRESSED, 1). -define(SDL_RELEASED, 0). -define(SDL_ALL_HOTKEYS, 16#FFFFFFFF). %% Events (are defined by the following records) -record(active, %% SDL_ActiveEvent {gain, %% Whether given states were gained or lost (1/0) state}). %% A mask of the focus states -record(keyboard, %% SDL_KeyboardEvent {which, %% The keyboard device index state, %% SDL_PRESSED or SDL_RELEASED scancode, %% hardware specific scancode sym, %% SDL virtual keysym see sdl_keyboard.hrl mod, %% current key modifiers see sdl_keyboard.hrl unicode}). %% translated character -record(mousemotion,%% SDL_MouseMotionEvent {which, %% The mouse device index state, %% The current button state mod=0, %% Current key modifiers x, y, %% The X/Y coordinates of the mouse xrel, %% The relative motion in the X direction yrel}). %% The relative motion in the Y direction -record(mousebutton,%% SDL_MouseButtonEvent {which, %% The mouse device index button, %% The mouse button index state, %% SDL_PRESSED or SDL_RELEASED mod=0, %% Current key modifiers x, y}). %% The X/Y coordinates of the mouse at press time -record(joyaxis, %% SDL_JoyAxisEvent {which, %% the joystick device index axis, %% The joystick axis index value}). %% The axis value (range: -32768 to 32767) -record(joyball, %% SDL_JoyBallEvent {which, %% The joystick device index ball, %% The joystick trackball index xrel, %% The relative motion in the X direction yrel}). %% The relative motion in the Y direction -record(joyhat, %% SDL_JoyHatEvent {which, %% The joystick device index hat, %% The joystick hat index value}). %% The hat position value: %%% 8 1 2 %%% 7 0 3 %%% 6 5 4 %%% Note that zero means the POV is centered. -record(joybutton, %% SDL_JoyButtonEvent {which, %% The joystick device index button, %% The joystick button index state}). %% SDL_PRESSED or SDL_RELEASED -record(resize, %%SDL_ResizeEvent {w, %% New width h}). %% New height -record(expose, %%SDL_ExposeEvent The "screen redraw" event {}). %% -record(quit, {}). %%SDL_QuitEvent %-record(userevent, %%SDL_USEREVENT % int code, User defined event code % void *data1, User defined data pointer % void *data2, User defined data pointer %-record(syswme, %%SDL_SysWMEvent % {msg}). %%% %% EVENT TYPES and their masks -define(SDL_NOEVENT, 0). %% No (new) event -define(SDL_ACTIVEEVENT,1). %% Application loses/gains visibility -define(SDL_ACTIVEEVENTMASK, (1 bsl ?SDL_ACTIVEEVENT)). -define(SDL_KEYDOWN, 2). %% Keys pressed -define(SDL_KEYDOWNMASK, (1 bsl ?SDL_KEYDOWN)). -define(SDL_KEYUP, 3). %% Keys released -define(SDL_KEYUPMASK, (1 bsl ?SDL_KEYUP)). -define(SDL_MOUSEMOTION,4). %% Mouse moved -define(SDL_MOUSEMOTIONMASK, (1 bsl ?SDL_MOUSEMOTION)). -define(SDL_MOUSEBUTTONDOWN,5).%% Mouse button pressed -define(SDL_MOUSEBUTTONDOWNMASK,(1 bsl ?SDL_MOUSEBUTTONDOWN)). -define(SDL_MOUSEBUTTONUP,6). %% Mouse button released -define(SDL_MOUSEBUTTONUPMASK, (1 bsl ?SDL_MOUSEBUTTONUP)). -define(SDL_JOYAXISMOTION,7). %% Joystick axis motion -define(SDL_JOYAXISMOTIONMASK, (1 bsl ?SDL_JOYAXISMOTION)). -define(SDL_JOYBALLMOTION,8). %% Joystick trackball motion -define(SDL_JOYBALLMOTIONMASK, (1 bsl ?SDL_JOYBALLMOTION)). -define(SDL_JOYHATMOTION,9). %% Joystick hat position change -define(SDL_JOYHATMOTIONMASK, (1 bsl ?SDL_JOYHATMOTION)). -define(SDL_JOYBUTTONDOWN,10). %% Joystick button pressed -define(SDL_JOYBUTTONDOWNMASK, (1 bsl ?SDL_JOYBUTTONDOWN)). -define(SDL_JOYBUTTONUP,11). %% Joystick button released -define(SDL_JOYBUTTONUPMASK, (1 bsl ?SDL_JOYBUTTONUP)). -define(SDL_QUIT,12). %% User-requested quit -define(SDL_QUITMASK, (1 bsl ?SDL_QUIT)). -define(SDL_SYSWMEVENT,13). %% System specific event -define(SDL_SYSWMEVENTMASK, (1 bsl ?SDL_SYSWMEVENT)). %%-define(SDL_EVENT_RESERVEDA, Reserved for future use.. %%-define(SDL_EVENT_RESERVEDB, Reserved for future use.. -define(SDL_VIDEORESIZE,16). %% User resized video mode -define(SDL_VIDEORESIZEMASK, (1 bsl ?SDL_VIDEORESIZE)). -define(SDL_VIDEOEXPOSE,17). %% User resized video mode -define(SDL_VIDEOEXPOSEMASK, (1 bsl ?SDL_VIDEOEXPOSE)). -define(SDL_MOUSEEVENTMASK, (?SDL_MOUSEBUTTONUPMASK bor ?SDL_MOUSEBUTTONDOWNMASK bor ?SDL_MOUSEMOTIONMASK)). -define(SDL_JOYEVENTMASK, (?SDL_JOYAXISMOTIONMASK bor ?SDL_JOYBALLMOTIONMASK bor ?SDL_JOYHATMOTIONMASK bor ?SDL_JOYBUTTONDOWNMASK bor ?SDL_JOYBUTTONUPMASK)). -define(SDL_KEYBOARDMASK, (?SDL_KEYDOWNMASK bor ?SDL_KEYUPMASK)). -define(SDL_MOUSEBUTTONMASK, (?SDL_MOUSEBUTTONDOWNMASK bor ?SDL_MOUSEBUTTONUPMASK)). -define(SDL_JOYBUTTONMASK, (?SDL_JOYBUTTONDOWNMASK bor ?SDL_JOYBUTTONUPMASK)). -define(SDL_ALLEVENTS, 16#FFFFFFFF). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% esdl-1.2/include/sdl_joystick.hrl0000644000076400010400000000166711540750057021075 0ustar familjenAdministratörer%% Copyright (c) 2001 Dan Gudmundsson %% %% See the file "license.terms" for information on usage and redistribution %% of this file, and for a DISCLAIMER OF ALL WARRANTIES. %% %% $Id$ %% %%%---------------------------------------------------------------------- %%% File : sdl_joystick.hrl %%% Author : Dan Gudmundsson %%% Purpose : %%% Created : 19 Apr 2001 by Dan Gudmundsson %%%---------------------------------------------------------------------- -define( SDL_HAT_CENTERED, 16#00). -define( SDL_HAT_UP, 16#01). -define( SDL_HAT_RIGHT, 16#02). -define( SDL_HAT_DOWN, 16#04). -define( SDL_HAT_LEFT, 16#08). -define( SDL_HAT_RIGHTUP, (?SDL_HAT_RIGHT bor ?SDL_HAT_UP)). -define( SDL_HAT_RIGHTDOWN, (?SDL_HAT_RIGHT bor ?SDL_HAT_DOWN)). -define( SDL_HAT_LEFTUP, (?SDL_HAT_LEFT bor ?SDL_HAT_UP)). -define( SDL_HAT_LEFTDOWN, (?SDL_HAT_LEFT bor ?SDL_HAT_DOWN)). esdl-1.2/include/sdl_keyboard.hrl0000644000076400010400000002071711540750060021025 0ustar familjenAdministratörer%% Copyright (c) 2001 Dan Gudmundsson %% %% See the file "license.terms" for information on usage and redistribution %% of this file, and for a DISCLAIMER OF ALL WARRANTIES. %% %% $Id$ %% %%%---------------------------------------------------------------------- %%% File : sdl_keyboard.hrl %%% Author : Dan Gudmundsson %%% Purpose : Define the available keys %%% Created : 7 Jul 2000 by Dan Gudmundsson %%%---------------------------------------------------------------------- -define(SDL_DEFAULT_REPEAT_DELAY, 500). -define(SDL_DEFAULT_REPEAT_INTERVAL, 30). -define(SDLK_UNKNOWN , 0). -define(SDLK_FIRST , 0). -define(SDLK_BACKSPACE , 8). -define(SDLK_TAB , 9). -define(SDLK_CLEAR , 12). -define(SDLK_RETURN , 13). -define(SDLK_PAUSE , 19). -define(SDLK_ESCAPE , 27). -define(SDLK_SPACE , 32). -define(SDLK_EXCLAIM , 33). -define(SDLK_QUOTEDBL , 34). -define(SDLK_HASH , 35). -define(SDLK_DOLLAR , 36). -define(SDLK_AMPERSAND , 38). -define(SDLK_QUOTE , 39). -define(SDLK_LEFTPAREN , 40). -define(SDLK_RIGHTPAREN , 41). -define(SDLK_ASTERISK , 42). -define(SDLK_PLUS , 43). -define(SDLK_COMMA , 44). -define(SDLK_MINUS , 45). -define(SDLK_PERIOD , 46). -define(SDLK_SLASH , 47). -define(SDLK_0 , 48). -define(SDLK_1 , 49). -define(SDLK_2 , 50). -define(SDLK_3 , 51). -define(SDLK_4 , 52). -define(SDLK_5 , 53). -define(SDLK_6 , 54). -define(SDLK_7 , 55). -define(SDLK_8 , 56). -define(SDLK_9 , 57). -define(SDLK_COLON , 58). -define(SDLK_SEMICOLON , 59). -define(SDLK_LESS , 60). -define(SDLK_EQUALS , 61). -define(SDLK_GREATER , 62). -define(SDLK_QUESTION , 63). -define(SDLK_AT , 64). % %% Skip uppercase letters % -define(SDLK_LEFTBRACKET , 91). -define(SDLK_BACKSLASH , 92). -define(SDLK_RIGHTBRACKET , 93). -define(SDLK_CARET , 94). -define(SDLK_UNDERSCORE , 95). -define(SDLK_BACKQUOTE , 96). -define(SDLK_a , 97). -define(SDLK_b , 98). -define(SDLK_c , 99). -define(SDLK_d , 100). -define(SDLK_e , 101). -define(SDLK_f , 102). -define(SDLK_g , 103). -define(SDLK_h , 104). -define(SDLK_i , 105). -define(SDLK_j , 106). -define(SDLK_k , 107). -define(SDLK_l , 108). -define(SDLK_m , 109). -define(SDLK_n , 110). -define(SDLK_o , 111). -define(SDLK_p , 112). -define(SDLK_q , 113). -define(SDLK_r , 114). -define(SDLK_s , 115). -define(SDLK_t , 116). -define(SDLK_u , 117). -define(SDLK_v , 118). -define(SDLK_w , 119). -define(SDLK_x , 120). -define(SDLK_y , 121). -define(SDLK_z , 122). -define(SDLK_DELETE , 127). %% End of ASCII mapped keysyms %% International keyboard syms -define(SDLK_WORLD_0 , 160). %% 0xA0 -define(SDLK_WORLD_1 , 161). -define(SDLK_WORLD_2 , 162). -define(SDLK_WORLD_3 , 163). -define(SDLK_WORLD_4 , 164). -define(SDLK_WORLD_5 , 165). -define(SDLK_WORLD_6 , 166). -define(SDLK_WORLD_7 , 167). -define(SDLK_WORLD_8 , 168). -define(SDLK_WORLD_9 , 169). -define(SDLK_WORLD_10 , 170). -define(SDLK_WORLD_11 , 171). -define(SDLK_WORLD_12 , 172). -define(SDLK_WORLD_13 , 173). -define(SDLK_WORLD_14 , 174). -define(SDLK_WORLD_15 , 175). -define(SDLK_WORLD_16 , 176). -define(SDLK_WORLD_17 , 177). -define(SDLK_WORLD_18 , 178). -define(SDLK_WORLD_19 , 179). -define(SDLK_WORLD_20 , 180). -define(SDLK_WORLD_21 , 181). -define(SDLK_WORLD_22 , 182). -define(SDLK_WORLD_23 , 183). -define(SDLK_WORLD_24 , 184). -define(SDLK_WORLD_25 , 185). -define(SDLK_WORLD_26 , 186). -define(SDLK_WORLD_27 , 187). -define(SDLK_WORLD_28 , 188). -define(SDLK_WORLD_29 , 189). -define(SDLK_WORLD_30 , 190). -define(SDLK_WORLD_31 , 191). -define(SDLK_WORLD_32 , 192). -define(SDLK_WORLD_33 , 193). -define(SDLK_WORLD_34 , 194). -define(SDLK_WORLD_35 , 195). -define(SDLK_WORLD_36 , 196). -define(SDLK_WORLD_37 , 197). -define(SDLK_WORLD_38 , 198). -define(SDLK_WORLD_39 , 199). -define(SDLK_WORLD_40 , 200). -define(SDLK_WORLD_41 , 201). -define(SDLK_WORLD_42 , 202). -define(SDLK_WORLD_43 , 203). -define(SDLK_WORLD_44 , 204). -define(SDLK_WORLD_45 , 205). -define(SDLK_WORLD_46 , 206). -define(SDLK_WORLD_47 , 207). -define(SDLK_WORLD_48 , 208). -define(SDLK_WORLD_49 , 209). -define(SDLK_WORLD_50 , 210). -define(SDLK_WORLD_51 , 211). -define(SDLK_WORLD_52 , 212). -define(SDLK_WORLD_53 , 213). -define(SDLK_WORLD_54 , 214). -define(SDLK_WORLD_55 , 215). -define(SDLK_WORLD_56 , 216). -define(SDLK_WORLD_57 , 217). -define(SDLK_WORLD_58 , 218). -define(SDLK_WORLD_59 , 219). -define(SDLK_WORLD_60 , 220). -define(SDLK_WORLD_61 , 221). -define(SDLK_WORLD_62 , 222). -define(SDLK_WORLD_63 , 223). -define(SDLK_WORLD_64 , 224). -define(SDLK_WORLD_65 , 225). -define(SDLK_WORLD_66 , 226). -define(SDLK_WORLD_67 , 227). -define(SDLK_WORLD_68 , 228). -define(SDLK_WORLD_69 , 229). -define(SDLK_WORLD_70 , 230). -define(SDLK_WORLD_71 , 231). -define(SDLK_WORLD_72 , 232). -define(SDLK_WORLD_73 , 233). -define(SDLK_WORLD_74 , 234). -define(SDLK_WORLD_75 , 235). -define(SDLK_WORLD_76 , 236). -define(SDLK_WORLD_77 , 237). -define(SDLK_WORLD_78 , 238). -define(SDLK_WORLD_79 , 239). -define(SDLK_WORLD_80 , 240). -define(SDLK_WORLD_81 , 241). -define(SDLK_WORLD_82 , 242). -define(SDLK_WORLD_83 , 243). -define(SDLK_WORLD_84 , 244). -define(SDLK_WORLD_85 , 245). -define(SDLK_WORLD_86 , 246). -define(SDLK_WORLD_87 , 247). -define(SDLK_WORLD_88 , 248). -define(SDLK_WORLD_89 , 249). -define(SDLK_WORLD_90 , 250). -define(SDLK_WORLD_91 , 251). -define(SDLK_WORLD_92 , 252). -define(SDLK_WORLD_93 , 253). -define(SDLK_WORLD_94 , 254). -define(SDLK_WORLD_95 , 255). %% 0xFF %% Numeric keypad -define(SDLK_KP0 , 256). -define(SDLK_KP1 , 257). -define(SDLK_KP2 , 258). -define(SDLK_KP3 , 259). -define(SDLK_KP4 , 260). -define(SDLK_KP5 , 261). -define(SDLK_KP6 , 262). -define(SDLK_KP7 , 263). -define(SDLK_KP8 , 264). -define(SDLK_KP9 , 265). -define(SDLK_KP_PERIOD , 266). -define(SDLK_KP_DIVIDE , 267). -define(SDLK_KP_MULTIPLY , 268). -define(SDLK_KP_MINUS , 269). -define(SDLK_KP_PLUS , 270). -define(SDLK_KP_ENTER , 271). -define(SDLK_KP_EQUALS , 272). %% Arrows + Home/End pad -define(SDLK_UP , 273). -define(SDLK_DOWN , 274). -define(SDLK_RIGHT , 275). -define(SDLK_LEFT , 276). -define(SDLK_INSERT , 277). -define(SDLK_HOME , 278). -define(SDLK_END , 279). -define(SDLK_PAGEUP , 280). -define(SDLK_PAGEDOWN , 281). %% Function keys -define(SDLK_F1 , 282). -define(SDLK_F2 , 283). -define(SDLK_F3 , 284). -define(SDLK_F4 , 285). -define(SDLK_F5 , 286). -define(SDLK_F6 , 287). -define(SDLK_F7 , 288). -define(SDLK_F8 , 289). -define(SDLK_F9 , 290). -define(SDLK_F10 , 291). -define(SDLK_F11 , 292). -define(SDLK_F12 , 293). -define(SDLK_F13 , 294). -define(SDLK_F14 , 295). -define(SDLK_F15 , 296). %% Key state modifier keys -define(SDLK_NUMLOCK , 300). -define(SDLK_CAPSLOCK , 301). -define(SDLK_SCROLLOCK , 302). -define(SDLK_RSHIFT , 303). -define(SDLK_LSHIFT , 304). -define(SDLK_RCTRL , 305). -define(SDLK_LCTRL , 306). -define(SDLK_RALT , 307). -define(SDLK_LALT , 308). -define(SDLK_RMETA , 309). -define(SDLK_LMETA , 310). -define(SDLK_LSUPER , 311). %% Left "Windows" key . -define(SDLK_RSUPER , 312). %% Right "Windows" key . -define(SDLK_MODE , 313). %% "Alt Gr" key . %% Miscellaneous function keys -define(SDLK_HELP , 315). -define(SDLK_PRINT , 316). -define(SDLK_SYSREQ , 317). -define(SDLK_BREAK , 318). -define(SDLK_MENU , 319). -define(SDLK_POWER , 320). %% Power Macintosh power key . -define(SDLK_EURO , 321). %% Some european keyboards . %%% /* Enumeration of valid key mods (possibly OR'd together) */ -define(KMOD_NONE , 16#0000). -define(KMOD_LSHIFT , 16#0001). -define(KMOD_RSHIFT , 16#0002). -define(KMOD_LCTRL , 16#0040). -define(KMOD_RCTRL , 16#0080). -define(KMOD_LALT , 16#0100). -define(KMOD_RALT , 16#0200). -define(KMOD_LMETA , 16#0400). -define(KMOD_RMETA , 16#0800). -define(KMOD_NUM , 16#1000). -define(KMOD_CAPS , 16#2000). -define(KMOD_MODE , 16#4000). -define(KMOD_RESERVED , 16#8000). -define(KMOD_CTRL, (?KMOD_LCTRL bor ?KMOD_RCTRL)). -define(KMOD_SHIFT, (?KMOD_LSHIFT bor ?KMOD_RSHIFT)). -define(KMOD_ALT, (?KMOD_LALT bor ?KMOD_RALT)). -define(KMOD_META, (?KMOD_LMETA bor ?KMOD_RMETA)). esdl-1.2/include/sdl_mouse.hrl0000644000076400010400000000162011540750060020345 0ustar familjenAdministratörer%% Copyright (c) 2001 Dan Gudmundsson %% %% See the file "license.terms" for information on usage and redistribution %% of this file, and for a DISCLAIMER OF ALL WARRANTIES. %% %% $Id$ %% %%%---------------------------------------------------------------------- %%% File : sdl_mouse.hrl %%% Author : Dan Gudmundsson %%% Purpose : Usable mouse macros %%% Created : 12 Jul 2000 by Dan Gudmundsson %%%---------------------------------------------------------------------- -define(SDL_BUTTON_LEFT, 1). -define(SDL_BUTTON_MIDDLE, 2). -define(SDL_BUTTON_RIGHT, 3). -define(SDL_BUTTON_X1, 4). -define(SDL_BUTTON_X2, 5). -define(SDL_BUTTON_LMASK, 2#00001). -define(SDL_BUTTON_MMASK, 2#00010). -define(SDL_BUTTON_RMASK, 2#00100). -define(SDL_BUTTON_X1MASK, 2#01000). -define(SDL_BUTTON_X2MASK, 2#10000). esdl-1.2/include/sdl_ttf.hrl0000644000076400010400000000161211540750060020013 0ustar familjenAdministratörer%% Copyright (c) 2007 Klas Johansson %% %% See the file "license.terms" for information on usage and redistribution %% of this file, and for a DISCLAIMER OF ALL WARRANTIES. %% %% $Id$ %% %%%---------------------------------------------------------------------- %%% File : sdl_ttf.hrl %%% Author : Klas Johansson %%% Purpose : defines from SDL_ttf.h %%% Created : 29 Jan 2007 by Klas Johansson %%%---------------------------------------------------------------------- -record(ttf_font, {ptr}). %% ZERO WIDTH NO-BREAKSPACE (Unicode byte order mark) -define(UNICODE_BOM_NATIVE, 16#FEFF). -define(UNICODE_BOM_SWAPPED, 16#FFFE). -define(SDL_TTF_STYLE_NORMAL, 16#00). -define(SDL_TTF_STYLE_BOLD, 16#01). -define(SDL_TTF_STYLE_ITALIC, 16#02). -define(SDL_TTF_STYLE_UNDERLINE, 16#04). esdl-1.2/include/sdl_video.hrl0000644000076400010400000001301411540750060020323 0ustar familjenAdministratörer%% Copyright (c) 2001 Dan Gudmundsson %% %% See the file "license.terms" for information on usage and redistribution %% of this file, and for a DISCLAIMER OF ALL WARRANTIES. %% %% $Id$ %% %%%---------------------------------------------------------------------- %%% File : sdl_video.hrl %%% Author : Dan Gudmundsson %%% Purpose : defines from SDL_video.h %%% Created : 22 Jun 2000 by Dan Gudmundsson %%%---------------------------------------------------------------------- %% Statics %% Data Types -record(sdl_rect, {x, y, w, h}). -record(sdl_color, {r,g,b}). %% Where each color is 8bits %% sdl_palette = [sdl_color] -record(sdl_pixelformat, { self = null, %% Ref to this record palette = null, %% colorRef bitsPerPixel, %% Uint8 bytesPerPixel, %% Uint8 rloss, %% Uint8 gloss, %% Uint8 bloss, %% Uint8 aloss, %% Uint8 rshift, %% Uint8 gshift, %% Uint8 bshift, %% Uint8 ashift, %% Uint8 rmask, %% Uint32 gmask, %% Uint32 bmask, %% Uint32 amask, %% Uint32 %%/* RGB color key information */ colorkey, %% Uint32 %%/* Alpha value information (per-surface alpha) */ alpha %% Uint8 }). -record(sdl_surface, { self, %% Ref to this record flags, % Uint32 /* Read-only */ format, % SDL_PixelFormat ref* /* Read-only */ w, h, % int /* Read-only */ pitch, % Uint16 /* Read-only */ pixels, % void * ref /* Read-write */ offset % int /* Private */ %% /* Hardware-specific surface info */ %%hwdata, % struct private_hwdata /* clipping information */ % clip_minx, % int /* Read-only */ % clip_maxx, % int /* Read-only */ % clip_miny, % int /* Read-only */ % clip_maxy % int /* Read-only */ %% /* info for fast blit mapping to other surfaces */ %%map, % struct SDL_BlitMap /* Private */ %% /* List of surfaces mapped */ %%mapped, % struct map_list /* Private */ %% /* Reference count -- used when freeing surface */ %%refcount % int /* Read-mostly */ }). -record(sdl_videoinfo, { hw_available , %boolean Flag: Can you create hardware surfaces? wm_available , %boolean Flag: Can you talk to a window manager? blit_hw , %boolean Flag: Accelerated blits HW --> HW blit_hw_CC , %boolean Flag: Accelerated blits with Colorkey blit_hw_A , %boolean Flag: Accelerated blits with Alpha blit_sw , %boolean Flag: Accelerated blits SW --> HW blit_sw_CC , %boolean Flag: Accelerated blits with Colorkey blit_sw_A , %boolean Flag: Accelerated blits with Alpha blit_fill , %boolean Flag: Accelerated color fill video_mem , % video memory in k bytes vfmt % Ref to SDL_PixelFormat }). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% SDL_video.h see file for documentation %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -define(SDL_GRAB_QUERY, -1). -define(SDL_GRAB_OFF, 0). -define(SDL_GRAB_ON, 1). -define(SDL_GRAB_FULLSCREEN, 2). %%/* These are the currently supported flags for the SDL_surface */ %%/* Available for SDL_CreateRGBSurface() or SDL_SetVideoMode() */ -define( SDL_SWSURFACE, 16#00000000). %% /* Surface is in system memory */ -define( SDL_HWSURFACE, 16#00000001). %% /* Surface is in video memory */ -define( SDL_ASYNCBLIT, 16#00000004). %% /* Use asynchronous blits if possible */ %% /* Available for SDL_SetVideoMode() */ -define( SDL_ANYFORMAT, 16#10000000). %% /* Allow any video depth/pixel-format */ -define( SDL_HWPALETTE, 16#20000000). %% /* Surface has exclusive palette */ -define( SDL_DOUBLEBUF, 16#40000000). %% /* Set up double-buffered video mode */ -define( SDL_FULLSCREEN,16#80000000). %% /* Surface is a full screen display */ -define( SDL_OPENGL, 16#00000002). %% /* Create an OpenGL rendering context */ -define( SDL_RESIZABLE, 16#00000010). %% /* This video mode may be resized */ -define( SDL_NOFRAME, 16#00000020). %% /* No window caption or edge frame */ %% /* Used internally (read-only) */ -define( SDL_HWACCEL, 16#00000100). %%/* Blit uses hardware acceleration */ -define( SDL_SRCCOLORKEY, 16#00001000). %%/* Blit uses a source color key */ -define( SDL_RLEACCELOK, 16#00002000). %%/* Private flag */ -define( SDL_RLEACCEL, 16#00004000). %%/* Colorkey blit is RLE accelerated */ -define( SDL_SRCALPHA, 16#00010000). %%/* Blit uses source alpha blending */ -define( SDL_SRCCLIPPING, 16#00100000). %%/* Blit uses source clipping */ -define( SDL_PREALLOC, 16#01000000). %%/* Surface uses preallocated memory */ %% The OpenGL window attributes -define(SDL_GL_RED_SIZE, 0). -define(SDL_GL_GREEN_SIZE, 1). -define(SDL_GL_BLUE_SIZE, 2). -define(SDL_GL_ALPHA_SIZE, 3). -define(SDL_GL_BUFFER_SIZE, 4). -define(SDL_GL_DOUBLEBUFFER, 5). -define(SDL_GL_DEPTH_SIZE, 6). -define(SDL_GL_STENCIL_SIZE, 7). -define(SDL_GL_ACCUM_RED_SIZE, 8). -define(SDL_GL_ACCUM_GREEN_SIZE, 9). -define(SDL_GL_ACCUM_BLUE_SIZE, 10). -define(SDL_GL_ACCUM_ALPHA_SIZE, 11). -define(SDL_GL_STEREO, 12). -define(SDL_GL_MULTISAMPLEBUFFERS, 13). -define(SDL_GL_MULTISAMPLESAMPLES, 14). -define(SDL_GL_ACCELERATED_VISUAL, 15). -define(SDL_GL_SWAP_CONTROL, 16). esdl-1.2/license.terms0000644000076400010400000000422311540750057016727 0ustar familjenAdministratörerThis software is copyrighted by Dan Gudmundsson, and other parties. The following terms apply to all files associated with the software unless explicitly disclaimed in individual files. The authors hereby grant permission to use, copy, modify, distribute, and license this software and its documentation for any purpose, provided that existing copyright notices are retained in all copies and that this notice is included verbatim in any distributions. No written agreement, license, or royalty fee is required for any of the authorized uses. Modifications to this software may be copyrighted by their authors and need not follow the licensing terms described here, provided that the new terms are clearly indicated on the first page of each file where they apply. IN NO EVENT SHALL THE AUTHORS OR DISTRIBUTORS BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OF THIS SOFTWARE, ITS DOCUMENTATION, OR ANY DERIVATIVES THEREOF, EVEN IF THE AUTHORS HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. THE AUTHORS AND DISTRIBUTORS SPECIFICALLY DISCLAIM ANY WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, AND THE AUTHORS AND DISTRIBUTORS HAVE NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. GOVERNMENT USE: If you are acquiring this software on behalf of the U.S. government, the Government shall have only "Restricted Rights" in the software and related documentation as defined in the Federal Acquisition Regulations (FARs) in Clause 52.227.19 (c) (2). If you are acquiring the software on behalf of the Department of Defense, the software shall be classified as "Commercial Computer Software" and the Government shall have only "Restricted Rights" as defined in Clause 252.227-7013 (c) (1) of DFARs. Notwithstanding the foregoing, the authors grant the U.S. Government and others acting in its behalf permission to use and distribute the software in accordance with the terms specified in this license. esdl-1.2/Makefile0000644000076400010400000000701711540750057015675 0ustar familjenAdministratörer# # Copyright (c) 2001-2009 Dan Gudmundsson # # See the file "license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. # # $Id$ # SUBDIRS = c_src src test doc # Include SDL_ttf and SDL_image support (yes/no)? # See c_src/Makefile for include paths etc. ENABLE_SDL_TTF = no ENABLE_SDL_IMAGE = no TAR = tar ifeq ($(OS_FLAG),mingw) SDL_DLL_DIR = $(SDLROOT)/bin else SDL_DLL_DIR = priv endif -include vsn.mk REL = $(ESDL_VSN) RELDIR = /tmp/$(REL) target clean: @for d in $(SUBDIRS); do \ if test ! -d $$d ; then \ echo "=== Skipping subdir $$d" ; \ else \ xflag="" ; \ if test -f $$d/ignore_config_record.inf; then \ xflag=$$tflag ; \ fi ; \ eflags="ENABLE_SDL_TTF=$(ENABLE_SDL_TTF) ENABLE_SDL_IMAGE=$(ENABLE_SDL_IMAGE)" ; \ mflag="" ; \ if test -f $$d/Makefile.macosx -a "`uname`" = "Darwin"; then \ mflag="-f Makefile.macosx" ; \ fi ; \ (cd $$d && $(MAKE) $$mflag $$xflag $$eflags $@) ; \ fi ; \ done release: target relsrc relwin ## Install needs to find the erlang directory ERL_DIR := $(shell erl -noshell -eval "io:format([126,115,126,110],[code:root_dir()])" -s erlang halt) ifeq ($(INSTALL_DIR), ) INSTALLDIR = $(ERL_DIR)/addons/$(ESDL_VSN) else INSTALLDIR = $(INSTALL_DIR)/$(ESDL_VSN) endif ## I assume that make install are only made on unixes... :-) install: @echo Found erlang at $(ERL_DIR) @echo Installing $(ESDL_VSN) in $(INSTALLDIR) @if test ! -d $(INSTALLDIR) ; then \ mkdir -p $(INSTALLDIR) ; \ else \ rm -rf $(INSTALLDIR)/* ; \ fi ; mkdir $(INSTALLDIR)/src mkdir $(INSTALLDIR)/c_src mkdir $(INSTALLDIR)/include mkdir $(INSTALLDIR)/doc mkdir $(INSTALLDIR)/ebin mkdir $(INSTALLDIR)/priv @if test ! -f vsn.mk ; then \ echo ESDL_VSN=$(ESDL_VER) > $(INSTALLDIR)/vsn.mk ; \ else \ cp vsn.mk $(INSTALLDIR) ; \ fi; cp license.terms Readme* $(INSTALLDIR) cp src/*.?rl $(INSTALLDIR)/src cp c_src/*.[ch] $(INSTALLDIR)/c_src cp include/*.hrl $(INSTALLDIR)/include cp doc/*.html $(INSTALLDIR)/doc cp ebin/*beam $(INSTALLDIR)/ebin chmod 644 $(INSTALLDIR)/ebin/*.beam cp priv/*.* $(INSTALLDIR)/priv chmod 755 $(INSTALLDIR)/priv/* ## This is used by me only for making a new release... relsrc: target @echo Making $(RELDIR).tgz @if test ! -d $(RELDIR) ; then \ mkdir $(RELDIR) ; \ else \ rm -rf $(RELDIR)/* ; \ fi ; cp Makefile* license.terms README-SDL.txt Readme Readme.MacOSX-Cocoa Readme.win32 esdl.pub $(RELDIR) cp Configure-cygwin-mingw.sh Configure-mingw.sh $(RELDIR) echo ESDL_VSN=$(REL) > $(RELDIR)/vsn.mk mkdir $(RELDIR)/c_src cp c_src/*.h c_src/*.c c_src/Makefile* $(RELDIR)/c_src mkdir $(RELDIR)/doc cp doc/Makefile* doc/makedoc.erl doc/*.html $(RELDIR)/doc mkdir $(RELDIR)/ebin cp ebin/*.beam $(RELDIR)/ebin mkdir $(RELDIR)/include cp include/*.hrl $(RELDIR)/include mkdir $(RELDIR)/priv mkdir $(RELDIR)/src cp src/Makefile* src/*.?rl $(RELDIR)/src mkdir $(RELDIR)/test cp test/Makefile* test/*.erl test/*.wav test/*.bmp $(RELDIR)/test (cd $(RELDIR)/..; $(TAR) zcfv $(REL).src.tar.gz $(REL) ) relwin: relsrc cp $(SDL_DLL_DIR)/SDL.dll $(RELDIR)/priv cp priv/sdl_driver.dll $(RELDIR)/priv cp README-SDL.txt $(RELDIR) (cd $(RELDIR)/..; zip -r $(REL).win.zip $(REL) ) esdl-1.2/Makefile.win320000644000076400010400000000105311540750057016630 0ustar familjenAdministratörer# # Makefile -- # # Top-level Makefile for building ESDL on Windows. # # Copyright (c) 2001 Bjorn Gustavsson # # See the file "license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. # # $Id$ # MFLAGS = -f Makefile.win32 all: cd src $(MAKE) $(MFLAGS) cd ..\c_src $(MAKE) $(MFLAGS) cd ..\test $(MAKE) $(MFLAGS) cd .. clean: cd src -$(MAKE) $(MFLAGS) clean cd ..\c_src -$(MAKE) $(MFLAGS) clean cd ..\test -$(MAKE) $(MFLAGS) clean cd .. esdl-1.2/priv/0000755000076400010400000000000011540750060015202 5ustar familjenAdministratöreresdl-1.2/Readme0000644000076400010400000001457111540750057015360 0ustar familjenAdministratörerESDL by Dan Gudmundsson Currently located at http://esdl.sourceforge.net News ========= 1.2: I have removed the opengl specific part from esdl, now esdl requires that wx is available for opengl usage. This means that this release is not backwards compatible with the old release, some gl functions have been changed in wx gl. This is done to only have one gl.erl in your (erlang) system, and it also more up to date with the standard. Actually only wx/ebin/gl.beam wx/ebin/glu.beam and wx/priv/OS/erl_gl.[so|dll] is required. Also using wx's opengl allowed me to create an opengl thread, if the erlang emulator is multithreaded. So now sdl with opengl works for both smp and single threaded erlang. What is it? =========== Esdl is library for accessing SDL (Simple DirectMedia Layer) and OpenGL through Erlang. Simple DirectMedia Layer is a cross-platform multimedia library designed to provide fast access to the graphics framebuffer and audio device. It also do event handling from mouse, keyboards and joysticks. It is also possible to use TrueType fonts through SDL_ttf (www.libsdl.org/projects/SDL_ttf/) and images through SDL_image (www.libsdl.org/projects/SDL_image/). More information can be found at libsdl.org OpenGL is a cross-platform standard for 3D rendering and 3D hardware acceleration. More information can be found at www.opengl.org Compilation and Installation ============================= You need erlang (www.erlang.org). This release has only been tested on R14B02, it requires that version for opengl to work. You need libsdl (www.libsdl.org) (the development package) version > 1.2.5 You need opengl (with glu-1.2 (full version) libraries from your hardware manufacturer or a software version from www.mesa3d.org. And optionally you'll need: * SDL_ttf (www.libsdl.org/projects/SDL_ttf/) version > 2.0.7 * SDL_image (www.libsdl.org/projects/SDL_image/) version > 1.2.4 Precompiled versions are available for Windows. For Unix-like systems (including MacOS X): Untar the esdl-VERSION.src.tar.gz file and type 'make; make install INSTALL_DIR=/ESDL_PATH/' or put it anywhere and add the path in your ~/.erlang (C:/windows/.erlang) file. You might need to modify the c_src/Makefile (or c_src/Makefile.macosx) to point out the correct paths to header files and libraries. On MacOS X, the top-level Makefile will automatically use c_src/Makefile.macosx, but if you run make in the c_src direcotory, you need to run make as 'make -f Makefile.macosx'. Optionally you'll also need SDL_ttf for the font support and SDL_image for the image support. Note: SDL_ttf and SDL_image are disabled by default, since they depend on libraries not in the plain vanilla SDL packages. By making them optional one can compile and run esdl without having to bother about getting hold of the SDL_ttf and SDL_image libraries. Enable them in the Makefile: ENABLE_SDL_TTF = yes ENABLE_SDL_IMAGE = yes Install sdl so that the os can find the dynamic libraries: On windows: put the .dll's somewhere in your path or in $ESDL_PATH/priv (in the precompiled version (maybe old) SDL.dll is included) On unix: put the .so libs somewhere in your LD_LIBRARY_PATH Testing esdl can be done by building the tests in the test directory and running the test programs, example: cd test erl +S1 -pa ../ebin (werl on windows) Erlang (BEAM) emulator version 5.1.1 [threads:0] Eshell V5.1.1 (abort with ^G) 1> testsprite:go(). %% Escape quits 2> testgl:go(). 3> erldemo:go(). 4> testaudio:go(). 5> testjoy:go(). 6> test_ttf:go("/usr/share/fonts/truetype/freefont/FreeSerif.ttf", 20). 7> test_glfont:go("/usr/share/fonts/truetype/freefont/FreeSans.ttf"). 8> test_glimg:go(). Note: Using esdl on nvidia cards and their drivers requires that erlang was built with threads. That is when building erlang do ./configure -enable-threads otherwise Erlang will crash with segfault Performance & Quality? ====================== Is not as fast as in 'C' obviously, but the opengl part is pretty fast if you have an opengl accelerated 3d card. The sdl_video performance is not that fast mainly due to that most of the sdl functions is synchronous (i.e. has return values which erlang must wait for). This code is almost untested, i.e it contains a lot of bugs. What is done and what are the main differences with the 'C' libraries? ====================================================================== In general I have tried to follow the libraries as much as possible, usually the only changes are the return values, in 'C' you use arguments to do multiple returns which erlang won't allow instead a tuple is returned containing the values. The SDL functions have been split into several erlang modules (with corresponding header files). General SDL functions, such as SDL_Init, are in the sdl.erl module. Most of the video related functions are in the sdl_video.erl module. The event functions are sliced into the following modules: sdl_event.erl, sdl_active.erl, sdl_keyboard.erl, sdl_mouse.erl. sdl_audio.erl handles some of the audio functions, the audio part needs more work. The cdrom, threads and time functions are not implemented. sdl_ttf.erl takes care of the TrueType fonts. sdl_img.erl loads images onto SDL surfaces. None of the SDL_RWops functions (which are the greater part of the API) are implemented. The existing support will suffice in most cases though (e.g. loading images from file). Extra functions: ================ Most of the SDL_video functions requires a pointer to a video_surface structure, to be able to handle these structures the following functions has been added: sdl_video:getSurface/1, sdl_video:getPixelFormat/1, sdl_video:getPalette/1, sdl_video:getPixels/2 Some of the Opengl functions also requires pointers to memory areas, the sdl_util module contains functions to handle these. sdl_util:malloc/2, sdl_util:free/1, sdl_util:read/2, sdl_util:readBin/2, sdl_util:write/2. What's need to be done and what do I want you to do? ==================================================== Someone with some experience with audio programming can take a look at the audio part which needs some work. The other sdl packages such as sdl_image, sdl_mixer and sdl_mpeg. If you make something funny or good looking applications, it would be fun if you let me know and gave me some credit. Regards /Dan (d g u d @ users.sf.net) esdl-1.2/README-SDL.txt0000644000076400010400000000066611540750057016356 0ustar familjenAdministratörer Please distribute this file with the SDL runtime environment: The Simple DirectMedia Layer (SDL for short) is a cross-platfrom library designed to make it easy to write multi-media software, such as games and emulators. The Simple DirectMedia Layer library source code is available from: http://www.libsdl.org/ This library is distributed under the terms of the GNU LGPL license: http://www.gnu.org/copyleft/lesser.html esdl-1.2/Readme.MacOSX-Cocoa0000644000076400010400000000222711540750057017466 0ustar familjenAdministratörer This is a port of ESDL to Mac OS X using the Cocoa API. It assumes that you use the SDL SDK framework (available precompiled at libsdl.org) as opposed to compiling libraries and putting them in /usr/local/ or something. It's also assumed that SDL.framework is placed in either /Library/Framework/ or in ~/Library/Framework. You might need to modify the c_src/Makefile.macosx to point out the correct paths to header files and libraries. On MacOS X, the top-level Makefile will automatically use c_src/Makefile.macosx, but if you run make in the c_src directory, you need to run make as 'make -f Makefile.macosx'. KNOWN ISSUES : - 'sdlwrapper' doesn't work (I think... ?). - An erlang icon in the dock would be nice (as default; wings provides its own) - 'Quit' menu item doesn't work. - At least in Wings3D : the ctrl and command keys seems to have changed meaning (for example, Command-Click results in a context menu while Ctrl-Q quits the app). A big 'THANK YOU' goes to Bob Ippolito (bob@redivi.com) for the code that made the icon and the menu to appear (in esdl_driver.c). The main port author david wallin [david_at_wallin.cx]esdl-1.2/Readme.win320000644000076400010400000000671211540750057016317 0ustar familjenAdministratörerInstructions for building windows version of ESDL. Not for the faint of heart, there are binaries to download. 1. Intro 2. Needed tools 3. Configuring 4. Building 5. Testing Intro ----- The windows version of ESDL has until now been built using Micro$ofts visual C++ tools. This is no longer the case and if you find any Makefile.win32 files sloshing around they are most probably obsolete. Esdl on windows in now built using a combination of cygwin and MinGW, cygwin beeing the basic build environment, emulating a unixish environment well enough for most purpouses. MinGW is the GCC port for windows which produces native windows binaries etc. Maybe the cygwin gcc could be used instead, but cygwin works fine and is free, so why bother... A special little configure script is used to setup the environment for building the windows version. You need to run that to get the C-code to compile. A little shell script to aid your making is also created by the pseudo-configure. ESDL should have a real autoconf-configure of course, but time is a limited resource... For all tools, directories and paths the following hold: The less spaces in pathnames, the better. If you have somthing installed in i.e. "Program Files" set the path so that "Program Files" is replaced by the short DOS-name (which for most installations is PROGRA~1). Needed tools ------------ *) Cygwin, full installation with development tools etc. http://www.cygwin.com (or Msys is enough nowadays) *) MinGW, you can use the self installing EXE package. Add to your cygwin path properly. http://www.mingw.org *) SDL, You need the development libraries, either for VC++ or mingw, it doesn't matter really, the configure script handles both. Add the SDL libdir (where SDL.dll resides) to your PATH. SDL.dll is needed in runtime as well as compile time. http://www.libsdl.org *) Erlang, currently (R14B02) or later is required. Note the thing about PATH's and spaces above. Erlang does not add itself to your path upon installation, add the appropriate path to your .bashrc. http://www.erlang.org All tools are available as binary releases for windows. Configuring ----------- In the same directory as this file resides, you should find a shell script named Configure-cygwin-mingw.sh or Configure-mingw in msys. Run it from within the cygwin bash shell. cd to the directory where it resides before running. If it fails, try to correct what seems to be wrong and run again. When successful, you should have everything you need to compile. Building --------- Run the generated script mingw_build.sh which should reside in the same directory as the configure script. Everything should build more or less without warnings, the exception beeing some HTML generation which warns about some C API Ref's. Ignore those warnings. Testing ------- Run some of the tests in the ./test directory like this (make sure SDL.dll is in your path): $ cd tests $ erl -pa ../ebin Eshell V5.3 (abort with ^G) 1> testgl:go(). etc. You should get a spinning cube by running testgl:go(), a spinning erlang logo by running erldemo:go(). After each test you need to restart erlang, exit with q(). and run erl -pa ../ebin again. Erlang may crash if you press Ctrl-C to exit, it's not Erlangs fault. ESDL is a linked in driver and SDL is also in Erlangs memory space, that makes signal handling barf... Just ignore. Happy hacking. /Patrikesdl-1.2/src/0000755000076400010400000000000011540750060015011 5ustar familjenAdministratöreresdl-1.2/src/esdl.hrl0000644000076400010400000000234211540750060016450 0ustar familjenAdministratörer%% Copyright (c) 2001 Dan Gudmundsson %% %% See the file "license.terms" for information on usage and redistribution %% of this file, and for a DISCLAIMER OF ALL WARRANTIES. %%%---------------------------------------------------------------------- %%% File : esdl.hrl %%% Author : Dan Gudmundsson %%% Purpose : %%% Created : 6 Oct 2000 by Dan Gudmundsson %%%---------------------------------------------------------------------- -ifndef(SDL_HRL). %% These must exactly match those in c_src/esdl.h -define(SDL_HRL, 20). -define(SDL_VIDEO_HRL, 30). -define(SDL_EVENTS_HRL, 100). -define(SDL_MOUSE_HRL, 110). -define(SDL_KEYBOARD_HRL, 120). -define(SDL_ACTIVE_HRL, 130). -define(SDL_JOYSTICK_HRL, 133). -define(SDL_AUDIO_HRL, 150). -define(SDL_UTIL_HRL, 180). -define(SDL_TTF_HRL, 200). -define(SDL_IMG_HRL, 300). -define(SDL_MAX_FUNCTIONS_HRL, 400). %/* Current Max.. Increase if needed */ -define(SDL_Init, ?SDL_HRL + 1). -define(SDL_Quit, ?SDL_Init + 1). -define(SDL_GetError, ?SDL_Quit +1). -define(ESDL_Init_Opengl, ?SDL_GetError +1). -endif. esdl-1.2/src/Makefile0000644000076400010400000000145511540750060016456 0ustar familjenAdministratörer# Copyright (c) 2001 Dan Gudmundsson # See the file "license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. # # $Id$ # ESRC = . EBIN = ../ebin ERLC = erlc ERLINC = ../include ERL_FLAGS = -I$(ERLINC) +inline +warn_unused_vars ifeq ($(ENABLE_SDL_TTF), yes) SDL_TTF_MOD=sdl_ttf endif ifeq ($(ENABLE_SDL_IMAGE), yes) SDL_IMAGE_MOD=sdl_img endif ErlMods = \ sdl sdl_video sdl_events \ sdl_mouse sdl_joystick sdl_keyboard sdl_active sdl_audio \ sdl_util $(SDL_TTF_MOD) $(SDL_IMAGE_MOD) ErlSrc = $(ErlMods:%=%.erl) ErlTargets = $(ErlMods:%=$(EBIN)/%.beam) # Targets target: $(ErlTargets) clean: rm -f $(ErlTargets) rm -f *~ # Rules $(EBIN)/%.beam: $(ESRC)/%.erl $(ERLC) -W -bbeam $(ERL_FLAGS) $(ERL_COMPILE_FLAGS) -o$(EBIN) $< esdl-1.2/src/sdl.erl0000644000076400010400000000553211540750060016304 0ustar familjenAdministratörer%% Copyright (c) 2001 Dan Gudmundsson %% %% See the file "license.terms" for information on usage and redistribution %% of this file, and for a DISCLAIMER OF ALL WARRANTIES. %% %% $Id$ %% %%%---------------------------------------------------------------------- %%% File : sdl.erl %%% Author : Dan Gudmundsson %%% Purpose : To give access to the Simple Direct Media Layer %%% by Sam Lantinga, see www.libsdl.org. %%% Created : 23 Jun 2000 by Dan Gudmundsson %%%---------------------------------------------------------------------- -module(sdl). -include("sdl.hrl"). -include("esdl.hrl"). -include("sdl_util.hrl"). -export([init/1, quit/0, getError/0]). -export([cast/2, call/2]). -export([send_bin/1, send_bin/3]). %% SDL functions %%% Functions %% Func: init %% Args: BitMask %% Returns: WrapperRef %% C-API func: int SDL_Init(Uint32 flags); %% Desc: Initializes the SDL (including the erlang specific parts) init(Flags) when is_integer(Flags) -> Path = case code:priv_dir(esdl) of P when is_list(P) -> P; {error, _} -> %% in case you use erl -pa ../ebin priv_dir don't work :-( case code:is_loaded(?MODULE) of {file, SDLPath} -> strip(SDLPath, "ebin/" ++ atom_to_list(?MODULE) ++ ".beam") ++ "priv/"; _ -> %% For debugging atom_to_list(c:pwd()) ++ "../priv/" end end, case os:type() of {win32, _} -> OsPath = Path ++ ";" ++ os:getenv("PATH"), os:putenv("PATH", OsPath); _ -> ignore end, case catch erl_ddll:load_driver(Path, "sdl_driver") of ok -> ok; {error, R} -> io:format("Driver failed: ~s ~n", [erl_ddll:format_error(R)]); Other -> io:format("Driver crashed: ~p ~n", [Other]) end, Port = open_port({spawn, "sdl_driver"}, [binary]), register(esdl_port, Port), cast(?SDL_Init, <>), Port. %% Func: quit %% Args: none %% Returns: Quits the wrapper %% C-API func: void SDL_Quit(void); quit() -> %% cast(?SDL_Quit, []), erlang:port_close(esdl_port), erl_ddll:unload_driver("sdl_driver"). %% Func: getError %% Args: none %% Returns: DescString %% C-API func: char * SDL_GetError(void); getError() -> Bin = call(?SDL_GetError, []), binary_to_list(Bin). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% cast(Op, Arg) -> erlang:port_control(esdl_port, Op, Arg), ok. call(Op, Arg) -> erlang:port_control(esdl_port, Op, Arg). send_bin(Bin) when is_binary(Bin) -> erlang:port_command(esdl_port, Bin). send_bin(#sdlmem{bin=Bin}, _, _) -> send_bin(Bin); send_bin(Bin, _, _) when is_binary(Bin) -> send_bin(Bin); send_bin(Term, Mod, Line) -> erlang:error({Mod,Line,unsupported_type,Term}). %%%%%%%%%%%%%%%%% NON SDL FUNCTIONS %%%%%%%%%%%%%%%% strip(Src, Src) -> []; strip([H|R], Src) -> [H| strip(R, Src)]. esdl-1.2/src/sdl_active.erl0000644000076400010400000000223311540750060017632 0ustar familjenAdministratörer%% Copyright (c) 2001 Dan Gudmundsson %% %% See the file "license.terms" for information on usage and redistribution %% of this file, and for a DISCLAIMER OF ALL WARRANTIES. %% %% $Id$ %% %%%---------------------------------------------------------------------- %%% File : sdl_active.erl %%% Author : Dan Gudmundsson %%% Purpose : %%% Created : 12 Jul 2000 by Dan Gudmundsson %%%---------------------------------------------------------------------- -module(sdl_active). -include("sdl_events.hrl"). -include("esdl.hrl"). -export([getAppState/0, quitRequested/0]). -define(SDL_GetAppState, ?SDL_ACTIVE_HRL+1). -import(sdl, [call/2]). %% Func: quitRequested %% Args: none %% Returns: true | false %% C-API func: SDL_QuitRequested() quitRequested() -> sdl_events:pumpEvents(), case sdl_events:peepEvents(0, ?SDL_PEEKEVENT, ?SDL_QUITMASK) of [] -> false; _ -> true end. %% Func: getAppState %% Args: none %% Returns: State (bitmask) %% C-API func: Uint8 SDL_GetAppState(void); getAppState() -> <> = call(?SDL_GetAppState, []), Res. esdl-1.2/src/sdl_audio.erl0000644000076400010400000001267511540750060017473 0ustar familjenAdministratörer%% Copyright (c) 2001 Dan Gudmundsson %% %% See the file "license.terms" for information on usage and redistribution %% of this file, and for a DISCLAIMER OF ALL WARRANTIES. %% %% $Id$ %% %%% File : sdl_audio.erl %%% Author : Dan Gudmundsson %%% Purpose : Implements a SDL_AUDIO interface %%% Created : 9 Aug 2000 by Dan Gudmundsson -module(sdl_audio). -compile(export_all). -include("esdl.hrl"). -include("sdl_util.hrl"). %% Functions -define(SDL_AudioDriverName, ?SDL_AUDIO_HRL +1). -define(SDL_OpenAudio, ?SDL_AudioDriverName +1). -define(SDL_GetAudioStatus, ?SDL_OpenAudio +1). -define(SDL_PauseAudio, ?SDL_GetAudioStatus +1). -define(SDL_LoadWAV, ?SDL_PauseAudio +1). -define(SDL_LoadWAV_RW, ?SDL_LoadWAV +1). -define(SDL_FreeWAV, ?SDL_LoadWAV_RW +1). -define(SDL_BuildAudioCVT, ?SDL_FreeWAV +1). -define(SDL_ConvertAudio, ?SDL_BuildAudioCVT +1). -define(SDL_MixAudio, ?SDL_ConvertAudio +1). -define(SDL_LockAudio, ?SDL_MixAudio +1). -define(SDL_UnlockAudio, ?SDL_LockAudio +1). -define(SDL_CloseAudio, ?SDL_UnlockAudio +1). -define(PLAY_AUDIO, ?SDL_CloseAudio +1). -import(sdl, [cast/2,call/2]). -include("sdl_audio.hrl"). -record(audiop, %Pointer to loaded audio data. {ptr, size}). %% Func: audioDrivername() %% Args: none %% Returns: DriverName(String) or [] %% C-API func: char *SDL_AudioDriverName(char *namebuf, int maxlen); audioDrivername() -> binary_to_list(call(?SDL_AudioDriverName, [])). %% Func: openAudio %% Args: DesiredFormat (audiospec-record), ForceFormat (true | false) %% Returns: ObtainedFormat or exit(audio_failure) %% C-API func: int SDL_OpenAudio(SDL_AudioSpec *desired, SDL_AudioSpec *obtained); openAudio(Desired, ForceFormat) when is_record(Desired, audiospec) -> FF = if ForceFormat == true -> 1; ForceFormat == false -> 0 end, Res = call(?SDL_OpenAudio, <>), case Res of <<>> -> exit(audio_failure); <> -> #audiospec{freq=Freq, format=Format, channels=Chs, silence=Sil, samples=Samps, padding=Padding, size=Size} end. %% Func: closeAudio %% Args: none %% Returns: ok %% C-API func: void SDL_CloseAudio(void); closeAudio() -> cast(?SDL_CloseAudio, []). %% Func: getAudioStatus %% Args: none %% Returns: Status %% C-API func: SDL_audiostatus SDL_GetAudioStatus(void); getAudioStatus() -> <> = call(?SDL_GetAudioStatus, []), Res. %% Func: pauseAudio %% Args: [true | false] %% Returns: ok %% C-API func: void SDL_PauseAudio(int pause_on); pauseAudio(true) -> cast(?SDL_PauseAudio, [1]); pauseAudio(false) -> cast(?SDL_PauseAudio, [0]). %% Func: loadWAV %% Args: FileName %% Returns: {AudioSpec, AudioBufferPtr} or exits %% C-API func: SDL_AudioSpec *SDL_LoadWAV(char *file, SDL_AudioSpec *spec, %% Uint8 **audio_buf, Uint32 *audio_len) loadWAV(File) -> Res = call(?SDL_LoadWAV, [File,0]), case Res of <> -> {#audiospec{freq=Freq, format=Format, channels=Chs, silence=Sil, samples=Samps, padding=Padding, size=Size}, #audiop{ptr=BufferPtr,size=BufferLen}}; Else -> erlang:error({load_wav_failed, Else}) end. %% Func: freeWAV %% Args: AudioWavRef %% Returns: ok %% C-API func: void SDL_FreeWAV(Uint8 *audio_buf); freeWAV(#audiop{ptr=Ptr}) -> cast(?SDL_FreeWAV, <>). %% Func: play_audio %% Args: AudioWavRef, SampleLen, Repeat (integer or infinity) %% Returns: ok %% Desc: Used to start audio playing play_audio(#audiop{ptr=Ptr,size=Size}, Repeat) -> R = if Repeat == infinity -> -1; true -> Repeat end, <<>> = call(?PLAY_AUDIO, <>). % %% Func: buildAudioCVT % %% Args: Src_format, Src_channels, Src_rate, % %% Dst_format, Dst_channels, Dst_rate % %% Returns: CVT record % %% Desc: %% Func: convertAudio %% Args: FromAudioSpec, ToAudioSpec, SampleBuffer %% Returns: NewBuffer or exists if conversion failed %% C-API func: int SDL_ConvertAudio(SDL_AudioCVT *cvt); %% Desc: This differs from the orginal SDL function in both syntax %% and semantics, convertAudio handles the buildCVT and other things %% SDL requires. %% convertAudio converts Buffer (in 'FromAudioSpec' format) and %% returns a new audio buffer (in 'ToAudioSpec' format) %% Don't forget to call freeWav with old Buffer convertAudio(FromAS, ToAS, #audiop{ptr=Ptr,size=Size}) -> Res = call(?SDL_ConvertAudio, <<(FromAS#audiospec.format):16, (FromAS#audiospec.channels):8, (FromAS#audiospec.freq):32, (ToAS#audiospec.format):16, (ToAS#audiospec.channels):8, (ToAS#audiospec.freq):32, Ptr:?_PTR, Size:32>>), case Res of <> when NBufferPtr /= 0 -> #audiop{ptr=NBufferPtr,size=NBufferLen}; _ -> erlang:error({error, Res}) end. esdl-1.2/src/sdl_events.erl0000644000076400010400000001367111540750060017673 0ustar familjenAdministratörer%% Copyright (c) 2001 Dan Gudmundsson %% %% See the file "license.terms" for information on usage and redistribution %% of this file, and for a DISCLAIMER OF ALL WARRANTIES. %% %% $Id$ %% %%%---------------------------------------------------------------------- %%% File : sdl_events.erl %%% Author : Dan Gudmundsson %%% Purpose : Provides the sdl_events API %%% Created : 7 Jul 2000 by Dan Gudmundsson %%%---------------------------------------------------------------------- -module(sdl_events). -include("esdl.hrl"). -include("sdl_events.hrl"). -export([eventState/2, peepEvents/0, peepEvents/2, peepEvents/3, pollEvent/0, pumpEvents/0, waitEvent/0]). -export([decode_events/1]). -import(sdl, [call/2,cast/2]). %%% Available Functions -define(SDL_PumpEvents, ?SDL_EVENTS_HRL + 1). -define(SDL_PeepEvents, ?SDL_PumpEvents +1). -define(SDL_PollEvent, ?SDL_PeepEvents +1). -define(SDL_WaitEvent, ?SDL_PollEvent +1). -define(SDL_EventState, ?SDL_WaitEvent +1). %%%%%%%%%%%%%%% GENERAL EVENT FUNCTIONS %%%%%%%%%%%%%%% %% Func: pumpEvents %% Args: none %% Returns: ok %% C-API func: void SDL_PumpEvents(void); pumpEvents() -> cast(?SDL_PumpEvents, []). %% Func: peepEvents/0 %% Args: None %% Returns: {NumOfEvents, [Events]} %% C-API func: int SDL_PeepEvents(SDL_Event *events, int numevents, %% SDL_eventaction action, Uint32 mask) %% Desc: Get up to to 16 events of all types. peepEvents() -> peepEvents(16, ?SDL_GETEVENT, ?SDL_ALLEVENTS). %% Func: peepEvents/2 %% Args: NumEvents (might be 0) %% Mask (32 bits event mask) %% Returns: {NumOfEvents, [Events]} %% C-API func: int SDL_PeepEvents(SDL_Event *events, int numevents, %% SDL_eventaction action, Uint32 mask) %% Desc: Exits if error (NumEvents < 256) peepEvents(NumEvents, Mask) when NumEvents < 256 -> peepEvents(NumEvents, ?SDL_GETEVENT, Mask). %% Func: peepEvents/2 %% Args: NumEvents (might be 0) %% ?SDL_GETEVENT %% Mask (32 bits event mask) %% Returns: {NumOfEvents, [Events]} %% C-API func: int SDL_PeepEvents(SDL_Event *events, int numevents, %% SDL_eventaction action, Uint32 mask) %% Desc: Exits if error (NumEvents < 256) peepEvents(NumEvents, ?SDL_GETEVENT, Mask) when NumEvents < 256 -> call(?SDL_PeepEvents, <>), receive {'_esdl_result_', <<>>} -> []; {'_esdl_result_', Events} -> decode_events(Events, []) end. %% Func: pollEvent %% Args: none %% Returns: no_event | Event (one of the event records) %% C-API func: int SDL_PollEvent(SDL_Event *event); %% Desc: pollEvent() -> call(?SDL_PollEvent, []), receive {'_esdl_result_', <<>>} -> no_event; {'_esdl_result_', Events} -> hd(decode_events(Events, [])) end. %% Func: waitEvent %% Args: none %% Returns: Event (one of the event records) %% C-API func: int SDL_WaitEvent(SDL_Event *event); %% Desc: waitEvent() -> call(?SDL_WaitEvent, []), receive {'_esdl_result_', <<>>} -> []; {'_esdl_result_', Events} -> hd(decode_events(Events, [])) end. %% Func: eventState %% Args: EventType (see sdl_events.hrl), State (SDL_QUERY | SDL_IGNORE |SDL_ENABLE) %% Returns: State (?SDL_ENABLE | ?SDL_IGNORE) %% C-API func: Uint8 SDL_EventState(Uint8 type, int state); %% Desc: eventState(Type, State) -> <> = call(?SDL_EventState, <>), Res. %%%%%%%%%%%%%%% Internals %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% decode_events(Bin) -> decode_events(Bin, []). decode_events(<<>>, Acc) -> lists:reverse(Acc); decode_events(<>, Acc) -> decode_events(Rest, [no_event | Acc]); decode_events(<>, Acc) -> Event = #active{gain = Gain, state = State}, decode_events(Rest, [Event | Acc]); decode_events(<>, Acc) -> Event = #keyboard{which=Which,state=State, scancode=Scancode,sym=Sym,mod=Mod,unicode=Unicode}, decode_events(Rest, [Event | Acc]); decode_events(<>, Acc) -> Event = #mousemotion{which = Which, state = State, mod = Mod, x = X, y = Y, xrel = Xrel, yrel = Yrel}, decode_events(Rest, [Event | Acc]); decode_events(<>, Acc) -> Event = #mousebutton{which = Which, button = Button, state = State, mod = Mod, x = X, y = Y}, decode_events(Rest, [Event | Acc]); decode_events(<>, Acc) -> Event = #joyaxis{which = Which, axis = Axis, value = Value}, decode_events(Rest, [Event | Acc]); decode_events(<>, Acc) -> Event = #joyball{which = Which, ball = Ball, xrel =Xrel, yrel=Yrel}, decode_events(Rest, [Event | Acc]); decode_events(<>,Acc) -> Event = #joyhat{which = Which, hat = Hat, value = Value}, decode_events(Rest, [Event | Acc]); decode_events(<>, Acc) -> Event = #joybutton{which = Which, button = Button, state = State}, decode_events(Rest, [Event | Acc]); decode_events(<>, Acc) -> Event = #joybutton{which = Which, button = Button, state = State}, decode_events(Rest, [Event | Acc]); decode_events(<>, Acc) -> Event = #quit{}, decode_events(Rest, [Event | Acc]); decode_events(<>, Acc) -> Event = #resize{w = W, h = H}, decode_events(Rest, [Event | Acc]); decode_events(<>, Acc) -> Event = #expose{}, decode_events(Rest, [Event | Acc]). esdl-1.2/src/sdl_img.erl0000644000076400010400000001710011540750060017132 0ustar familjenAdministratörer%% Copyright (c) 2007 Klas Johansson %% %% See the file "license.terms" for information on usage and redistribution %% of this file, and for a DISCLAIMER OF ALL WARRANTIES. %% %% $Id$ %% %%%---------------------------------------------------------------------- %%% File : sdl_img.erl %%% Author : Klas Johansson %%% Purpose : Provide access to SDL's image functions (tested with %%% SDL_image 1.2.4) %%% Created : 18 Feb 2007 by Klas Johansson %%%---------------------------------------------------------------------- -module(sdl_img). -include("sdl_img_funcs.hrl"). -include("gl.hrl"). -include("sdl_util.hrl"). -include("sdl_video.hrl"). %%% ERL_SDL functions -export([]). %%% SDL_Functions -export([linkedVersion/0]). -export([loadTypedRW/0]). -export([load/1]). -export([loadRW/0]). -export([invertAlpha/0]). -export([isBMP/0]). -export([isPNM/0]). -export([isXPM/0]). -export([isXCF/0]). -export([isPCX/0]). -export([isGIF/0]). -export([isJPG/0]). -export([isTIF/0]). -export([isPNG/0]). -export([isLBM/0]). -export([loadBMPRW/0]). -export([loadPNMRW/0]). -export([loadXPMRW/0]). -export([loadXCFRW/0]). -export([loadPCXRW/0]). -export([loadGIFRW/0]). -export([loadJPGRW/0]). -export([loadTIFRW/0]). -export([loadPNGRW/0]). -export([loadTGARW/0]). -export([loadLBMRW/0]). -export([readXPMFromArray/0]). -export([setError/1]). -export([getError/0]). %% Imports -import(sdl, [call/2, cast/2]). %% Defines -define(INT, 16/signed). -define(LONG, 32/signed). -define(UINT8, 8/unsigned). -define(UINT16, 16/unsigned). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% ERL_SDL API %% Func: linkedVersion %% Args: - %% Returns: {Major, Minor, Patch} %% C-API func: const SDL_version * IMG_Linked_Version(void); %% Desc: This function gets the version of the SDL_image library. linkedVersion() -> <> = call(?SDL_IMG_LinkedVersion, []), {Major, Minor, Patch}. %% Func: loadTypedRW %% Args: N/A %% Returns: N/A %% C-API func: SDL_Surface * IMG_LoadTyped_RW(SDL_RWops *src, int freesrc, char *type); %% Desc: Not implemented. loadTypedRW() -> exit({not_implemented, loadTypedRW}). %% Func: load %% Args: File %% Returns: Surface Ref %% C-API func: SDL_Surface * IMG_Load(const char *file); %% Desc: Load an image from an SDL data source. load(File) -> <> = call(?SDL_IMG_Load, [[File,0]]), case SurfacePtr of 0 -> exit({load, returned_null_pointer}); _ -> {surfacep, SurfacePtr} end. %% Func: loadRW %% Args: N/A %% Returns: N/A %% C-API func: SDL_Surface * IMG_Load_RW(SDL_RWops *src, int freesrc); %% Desc: Not implemented. loadRW() -> exit({not_implemented, loadRW}). %% Func: invertAlpha %% Args: N/A %% Returns: N/A %% C-API func: int IMG_InvertAlpha(int on); %% Desc: Not implemented. invertAlpha() -> exit({not_implemented, invertAlpha}). %% Func: isBMP %% Args: N/A %% Returns: N/A %% C-API func: int IMG_isBMP(SDL_RWops *src); %% Desc: Not implemented. isBMP() -> exit({not_implemented, isBMP}). %% Func: isPNM %% Args: N/A %% Returns: N/A %% C-API func: int IMG_isPNM(SDL_RWops *src); %% Desc: Not implemented. isPNM() -> exit({not_implemented, isPNM}). %% Func: isXPM %% Args: N/A %% Returns: N/A %% C-API func: int IMG_isXPM(SDL_RWops *src); %% Desc: Not implemented. isXPM() -> exit({not_implemented, isXPM}). %% Func: isXCF %% Args: N/A %% Returns: N/A %% C-API func: int IMG_isXCF(SDL_RWops *src); %% Desc: Not implemented. isXCF() -> exit({not_implemented, isXCF}). %% Func: isPCX %% Args: N/A %% Returns: N/A %% C-API func: int IMG_isPCX(SDL_RWops *src); %% Desc: Not implemented. isPCX() -> exit({not_implemented, isPCX}). %% Func: isGIF %% Args: N/A %% Returns: N/A %% C-API func: int IMG_isGIF(SDL_RWops *src); %% Desc: Not implemented. isGIF() -> exit({not_implemented, isGIF}). %% Func: isJPG %% Args: N/A %% Returns: N/A %% C-API func: int IMG_isJPG(SDL_RWops *src); %% Desc: Not implemented. isJPG() -> exit({not_implemented, isJPG}). %% Func: isTIF %% Args: N/A %% Returns: N/A %% C-API func: int IMG_isTIF(SDL_RWops *src); %% Desc: Not implemented. isTIF() -> exit({not_implemented, isTIF}). %% Func: isPNG %% Args: N/A %% Returns: N/A %% C-API func: int IMG_isPNG(SDL_RWops *src); %% Desc: Not implemented. isPNG() -> exit({not_implemented, isPNG}). %% Func: isLBM %% Args: N/A %% Returns: N/A %% C-API func: int IMG_isLBM(SDL_RWops *src); %% Desc: Not implemented. isLBM() -> exit({not_implemented, isLBM}). %% Func: loadBMPRW %% Args: N/A %% Returns: N/A %% C-API func: SDL_Surface * IMG_LoadBMP_RW(SDL_RWops *src); %% Desc: Not implemented. loadBMPRW() -> exit({not_implemented, loadBMPRW}). %% Func: loadPNMRW %% Args: N/A %% Returns: N/A %% C-API func: SDL_Surface * IMG_LoadPNM_RW(SDL_RWops *src); %% Desc: Not implemented. loadPNMRW() -> exit({not_implemented, loadPNMRW}). %% Func: loadXPMRW %% Args: N/A %% Returns: N/A %% C-API func: SDL_Surface * IMG_LoadXPM_RW(SDL_RWops *src); %% Desc: Not implemented. loadXPMRW() -> exit({not_implemented, loadXPMRW}). %% Func: loadXCFRW %% Args: N/A %% Returns: N/A %% C-API func: SDL_Surface * IMG_LoadXCF_RW(SDL_RWops *src); %% Desc: Not implemented. loadXCFRW() -> exit({not_implemented, loadXCFRW}). %% Func: loadPCXRW %% Args: N/A %% Returns: N/A %% C-API func: SDL_Surface * IMG_LoadPCX_RW(SDL_RWops *src); %% Desc: Not implemented. loadPCXRW() -> exit({not_implemented, loadPCXRW}). %% Func: loadGIFRW %% Args: N/A %% Returns: N/A %% C-API func: SDL_Surface * IMG_LoadGIF_RW(SDL_RWops *src); %% Desc: Not implemented. loadGIFRW() -> exit({not_implemented, loadGIFRW}). %% Func: loadJPGRW %% Args: N/A %% Returns: N/A %% C-API func: SDL_Surface * IMG_LoadJPG_RW(SDL_RWops *src); %% Desc: Not implemented. loadJPGRW() -> exit({not_implemented, loadJPGRW}). %% Func: loadTIFRW %% Args: N/A %% Returns: N/A %% C-API func: SDL_Surface * IMG_LoadTIF_RW(SDL_RWops *src); %% Desc: Not implemented. loadTIFRW() -> exit({not_implemented, loadTIFRW}). %% Func: loadPNGRW %% Args: N/A %% Returns: N/A %% C-API func: SDL_Surface * IMG_LoadPNG_RW(SDL_RWops *src); %% Desc: Not implemented. loadPNGRW() -> exit({not_implemented, loadPNGRW}). %% Func: loadTGARW %% Args: N/A %% Returns: N/A %% C-API func: SDL_Surface * IMG_LoadTGA_RW(SDL_RWops *src); %% Desc: Not implemented. loadTGARW() -> exit({not_implemented, loadTGARW}). %% Func: loadLBMRW %% Args: N/A %% Returns: N/A %% C-API func: SDL_Surface * IMG_LoadLBM_RW(SDL_RWops *src); %% Desc: Not implemented. loadLBMRW() -> exit({not_implemented, loadLBMRW}). %% Func: readXPMFromArray %% Args: N/A %% Returns: N/A %% C-API func: SDL_Surface * IMG_ReadXPMFromArray(char **xpm); %% Desc: Not implemented. readXPMFromArray() -> exit({not_implemented, readXPMFromArray}). %% Func: setError %% Args: N/A %% Returns: N/A %% C-API func: void IMG_SetError(const char *fmt, ...) %% Desc: Not implemented. setError(_Error) -> exit({not_implemented, setError}). %% Func: getError %% Args: - %% Returns: Error %% C-API func: char * IMG_GetError() %% Desc: Returns a (string) containing a human readable version or the %% reason for the last error that occured. getError() -> Bin = call(?SDL_IMG_GetError, []), binary_to_list(Bin). %%%%%%%%%%% Internal functions %%%%%%%%%%% esdl-1.2/src/sdl_img_funcs.hrl0000644000076400010400000000457711540750060020351 0ustar familjenAdministratörer%% Copyright (c) 2007 Klas Johansson %% %% See the file "license.terms" for information on usage and redistribution %% of this file, and for a DISCLAIMER OF ALL WARRANTIES. %% %% $Id$ %% %%%---------------------------------------------------------------------- %%% File : sdl_img_funcs.hrl %%% Author : Klas Johansson %%% Purpose : %%% Created : 18 Feb 2007 by Klas Johansson %%%---------------------------------------------------------------------- %%% Functions -include("esdl.hrl"). -define(SDL_IMG_LinkedVersion, ?SDL_IMG_HRL + 1). -define(SDL_IMG_LoadTypedRW, ?SDL_IMG_LinkedVersion + 1). -define(SDL_IMG_Load, ?SDL_IMG_LoadTypedRW + 1). -define(SDL_IMG_LoadRW, ?SDL_IMG_Load + 1). -define(SDL_IMG_InvertAlpha, ?SDL_IMG_LoadRW + 1). -define(SDL_IMG_isBMP, ?SDL_IMG_InvertAlpha + 1). -define(SDL_IMG_isPNM, ?SDL_IMG_isBMP + 1). -define(SDL_IMG_isXPM, ?SDL_IMG_isPNM + 1). -define(SDL_IMG_isXCF, ?SDL_IMG_isXPM + 1). -define(SDL_IMG_isPCX, ?SDL_IMG_isXCF + 1). -define(SDL_IMG_isGIF, ?SDL_IMG_isPCX + 1). -define(SDL_IMG_isJPG, ?SDL_IMG_isGIF + 1). -define(SDL_IMG_isTIF, ?SDL_IMG_isJPG + 1). -define(SDL_IMG_isPNG, ?SDL_IMG_isTIF + 1). -define(SDL_IMG_isLBM, ?SDL_IMG_isPNG + 1). -define(SDL_IMG_LoadBMPRW, ?SDL_IMG_isLBM + 1). -define(SDL_IMG_LoadPNMRW, ?SDL_IMG_LoadBMPRW + 1). -define(SDL_IMG_LoadXPMRW, ?SDL_IMG_LoadPNMRW + 1). -define(SDL_IMG_LoadXCFRW, ?SDL_IMG_LoadXPMRW + 1). -define(SDL_IMG_LoadPCXRW, ?SDL_IMG_LoadXCFRW + 1). -define(SDL_IMG_LoadGIFRW, ?SDL_IMG_LoadPCXRW + 1). -define(SDL_IMG_LoadJPGRW, ?SDL_IMG_LoadGIFRW + 1). -define(SDL_IMG_LoadTIFRW, ?SDL_IMG_LoadJPGRW + 1). -define(SDL_IMG_LoadPNGRW, ?SDL_IMG_LoadTIFRW + 1). -define(SDL_IMG_LoadTGARW, ?SDL_IMG_LoadPNGRW + 1). -define(SDL_IMG_LoadLBMRW, ?SDL_IMG_LoadTGARW + 1). -define(SDL_IMG_ReadXPMFromArray, ?SDL_IMG_LoadLBMRW + 1). -define(SDL_IMG_SetError, ?SDL_IMG_ReadXPMFromArray + 1). -define(SDL_IMG_GetError, ?SDL_IMG_SetError + 1). esdl-1.2/src/sdl_joystick.erl0000644000076400010400000001562311540750060020225 0ustar familjenAdministratörer%% Copyright (c) 2001 Dan Gudmundsson %% %% See the file "license.terms" for information on usage and redistribution %% of this file, and for a DISCLAIMER OF ALL WARRANTIES. %% %% $Id$ %% %%%---------------------------------------------------------------------- %%% File : sdl_joystick.erl %%% Author : Dan Gudmundsson %%% Purpose : Joystick functions %%% Created : 19 Apr 2001 by Dan Gudmundsson %%%---------------------------------------------------------------------- -module(sdl_joystick). -compile(export_all). -include("esdl.hrl"). -include("sdl_joystick.hrl"). -include("sdl_util.hrl"). -import(sdl, [call/2,cast/2]). -define(SDL_NumJoysticks, ?SDL_JOYSTICK_HRL + 1). -define(SDL_JoystickName, ?SDL_NumJoysticks + 1). -define(SDL_JoystickOpen, ?SDL_JoystickName + 1). -define(SDL_JoystickOpened, ?SDL_JoystickOpen + 1). -define(SDL_JoystickIndex, ?SDL_JoystickOpened + 1). -define(SDL_JoystickNumAxes, ?SDL_JoystickIndex + 1). -define(SDL_JoystickNumBalls, ?SDL_JoystickNumAxes + 1). -define(SDL_JoystickNumHats, ?SDL_JoystickNumBalls + 1). -define(SDL_JoystickNumButtons, ?SDL_JoystickNumHats + 1). -define(SDL_JoystickUpdate, ?SDL_JoystickNumButtons + 1). -define(SDL_JoystickEventState, ?SDL_JoystickUpdate + 1). -define(SDL_JoystickGetAxis, ?SDL_JoystickEventState +1). -define(SDL_JoystickGetHat, ?SDL_JoystickGetAxis + 1). -define(SDL_JoystickGetButton, ?SDL_JoystickGetHat + 1). -define(SDL_JoystickGetBall, ?SDL_JoystickGetButton + 1). -define(SDL_JoystickClose, ?SDL_JoystickGetBall + 1). %% Func: NumJoysticks %% Args: none %% Returns: Number of joysticks %% C-API func: int SDL_NumJoysticks(void); %% Desc: Count the number of joysticks attached to the system numJoysticks() -> <> = call(?SDL_NumJoysticks, []), Res. %% Func: Name %% Args: JoystickIndex %% Returns: Name (List) %% C-API func: char *SDL_JoystickName(int device_index); %% Desc: Get the implementation dependent name of a joystick. %% This can be called before any joysticks are opened. %% If no name can be found, this function returns NULL. name(Index) -> Name = call(?SDL_JoystickName, [Index]), binary_to_list(Name). %% Func: open %% Args: JoystickIndex %% Returns: Joystick or exits %% C-API func: SDL_Joystick *SDL_JoystickOpen(int device_index); %% Desc: Open a joystick for use - the index passed as an argument refers to %% the N'th joystick on the system. This index is the value which will %% identify this joystick in future joystick events. %% This function returns a joystick identifier, or NULL if an error occurred. open(Index) -> <> = call(?SDL_JoystickOpen, [Index]), ID. %% Func: opened %% Args: JoystickIndex %% Returns: true or false %% C-API func: int SDL_JoystickOpened(int device_index); %% Desc: Returns true if the joystick has been opened, or false if it has not. opened(Index) -> <> = call(?SDL_JoystickOpened, <>), Bool == 1. %% Func: index %% Args: Joystick %% Returns: index %% C-API func: int SDL_JoystickIndex(SDL_Joystick *joystick); %% Desc: Get the device index of an opened joystick. index(Joystick) -> <> = call(?SDL_JoystickIndex, <>), Index. %% Func: numAxes %% Args: Joystick %% Returns: no of axes %% C-API func: int SDL_JoystickNumAxes(SDL_Joystick *joystick); %% Desc: Get the number of general axis controls on a joystick numAxes(Joystick) -> <> = call(?SDL_JoystickNumAxes, <>), Axes. %% Func: numBalls %% Args: Joystick %% Returns: no of balls %% C-API func: int SDL_JoystickNumBalls(SDL_Joystick *joystick); %% Desc: Get the number of trackballs on a joystick %% Joystick trackballs have only relative motion events associated %% with them and their state cannot be polled. numBalls(Joystick) -> <> = call(?SDL_JoystickNumBalls, <>), Balls. %% Func: numHats %% Args: Joystick %% Returns: no of Hats %% C-API func: int SDL_JoystickNumHats(SDL_Joystick *joystick); %% Desc: Get the number of POV hats on a joystick numHats(Joystick) -> <> = call(?SDL_JoystickNumHats, <>), Hats. %% Func: numButtons %% Args: Joystick %% Returns: no of Buttons %% C-API func: int SDL_JoystickNumButtons(SDL_Joystick *joystick); %% Desc: Get the number of buttons on a joystick numButtons(Joystick) -> <> = call(?SDL_JoystickNumButtons, <>), Buttons. %% Func: update %% Args: none %% Returns: none %% C-API func: void SDL_JoystickUpdate(void); %% Desc: Update the current state of the open joysticks. %% This is called automatically by the event loop if any joystick %% events are enabled. update() -> cast(?SDL_JoystickUpdate, []). %% Func: getAxis %% Args: Joystick, Axis %% Returns: State (Int range: -32768 to 32767) %% C-API func: Sint16 SDL_JoystickGetAxis(SDL_Joystick *joystick, int axis); %% Desc: Get the current state of an axis control on a joystick %% The state is a value ranging from -32768 to 32767. %% The axis indices start at index 0. getAxis(Joystick, Axis) -> <> = call(?SDL_JoystickGetAxis, <>), State. %% Func: getHat %% Args: Joystick, Hat %% Returns: HatState %% C-API func: Uint8 SDL_JoystickGetHat(SDL_Joystick *joystick, int hat); %% Desc: Get the current state of a POV hat on a joystick %% The return value is one of the following positions in sdl_joystick.hrl %% The hat indices start at index 0. getHat(Joystick, Hat) -> <> = call(?SDL_JoystickGetHat, <>), State. %% Func: getButton %% Args: Joystick, Button %% Returns: State %% C-API func: Uint8 SDL_JoystickGetButton(SDL_Joystick *joystick, int button); %% Desc: Get the current state of a button on a joystick %% The button indices start at index 0. getButton(Joystick, Button) -> <> = call(?SDL_JoystickGetButton, <>), State. %% Func: getBall %% Args: Joystick, Ball %% Returns: {DX, DY} or badarg %% C-API func: int SDL_JoystickGetBall(SDL_Joystick *joystick, int ball, int *dx, int *dy); %% Desc: Get the ball axis change since the last poll %% This returns 0, or -1 if you passed it invalid parameters. %% The ball indices start at index 0. getBall(Joystick, Ball) -> case call(?SDL_JoystickGetBall, <>) of <> -> {Dx, Dy}; Res -> {badarg, Res} end. %% Func: close %% Args: Joystick %% Returns: none %% C-API func: void SDL_JoystickClose(SDL_Joystick *joystick); %% Desc: Close a joystick previously opened with SDL_JoystickOpen() close(Joystick) -> cast(?SDL_JoystickClose, <>). esdl-1.2/src/sdl_keyboard.erl0000644000076400010400000000514311540750060020162 0ustar familjenAdministratörer%% Copyright (c) 2001 Dan Gudmundsson %% %% See the file "license.terms" for information on usage and redistribution %% of this file, and for a DISCLAIMER OF ALL WARRANTIES. %% %% $Id$ %% %%%---------------------------------------------------------------------- %%% File : sdl_keyboard.erl %%% Author : Dan Gudmundsson %%% Purpose : %%% Created : 12 Jul 2000 by Dan Gudmundsson %%%---------------------------------------------------------------------- -module(sdl_keyboard). -include("esdl.hrl"). %%-compile(export_all). -export([enableKeyRepeat/2, enableUNICODE/1, getKeyName/1, getKeyState/0, getModState/0, setModState/1]). -define(SDL_EnableUNICODE, ?SDL_KEYBOARD_HRL+1). -define(SDL_EnableKeyRepeat, ?SDL_EnableUNICODE+1). -define(SDL_GetKeyName, ?SDL_EnableKeyRepeat+1). -define(SDL_GetKeyState, ?SDL_GetKeyName+1). -define(SDL_GetModState, ?SDL_GetKeyState+1). -define(SDL_SetModState, ?SDL_GetModState+1). -import(sdl, [call/2,cast/2]). %%%%%%%%%%%%%%%% KEYBOARD FUNCTIONS %%%%%%%%%%%%%%%%%%% %% Func: getKeyState %% Args: none %% Returns: A tuple continaing the state of each key(i.e. state of each Key) %% C-API func: Uint8 * SDL_GetKeyState(int *numkeys); getKeyState() -> Res = call(?SDL_GetKeyState, []), list_to_tuple(binary_to_list(Res)). %% Func: SDL_EnableUNICODE %% Args: true | false %% Returns: Previous Setting (true | False) %% C-API func: int SDL_EnableUNICODE(int enable); %% Desc: enableUNICODE(Bool) -> B = if Bool == true -> 1; true -> 0 end, <> = call(?SDL_EnableUNICODE, [B]), Res. %% Func: SDL_EnableKeyRepeat %% Args: Delay Interval %% Returns: true | false (if failure) %% C-API func: int SDL_EnableKeyRepeat(int delay, int interval); %% Desc: enableKeyRepeat(Delay, Interval) -> <> = call(?SDL_EnableKeyRepeat, <>), Res =:= 0. %% Func: SDL_GetKeyName %% Args: SDLKey %% Returns: A string %% C-API func: char * SDL_GetKeyName(SDLKey key); %% Desc: getKeyName(Key) -> binary_to_list(call(?SDL_GetKeyName, <>)). %% Func: getModState %% Args: none %% Returns: KModState (see KMOD_* in sdl_keyboard.hrl) %% C-API func: SDLMod SDL_GetModState(void); getModState() -> case call(?SDL_GetModState, []) of [] -> 0; <> -> Res end. %% Func: setModState %% Args: KModState (see KMOD_* in sdl_keyboard.hrl) %% Returns: ok %% C-API func: void SDL_SetModState(SDLMod modstate); setModState(ModState) -> cast(?SDL_SetModState, <>). esdl-1.2/src/sdl_mouse.erl0000644000076400010400000000673011540750060017515 0ustar familjenAdministratörer%% Copyright (c) 2001 Dan Gudmundsson %% %% See the file "license.terms" for information on usage and redistribution %% of this file, and for a DISCLAIMER OF ALL WARRANTIES. %% %% $Id$ %% %%%---------------------------------------------------------------------- %%% File : sdl_mouse.erl %%% Author : Dan Gudmundsson %%% Purpose : Mouse related functions %%% Created : 12 Jul 2000 by Dan Gudmundsson %%%---------------------------------------------------------------------- -module(sdl_mouse). -include("esdl.hrl"). -include("sdl_mouse.hrl"). -include("sdl_util.hrl"). -export([createCursor/6, freeCursor/1, getCursor/0, getMouseState/0, getRelativeMouseState/0, setCursor/1, showCursor/1, warpMouse/2 ]). -import(sdl, [call/2,cast/2]). -define(SDL_GetMouseState, ?SDL_MOUSE_HRL+1). -define(SDL_GetRelativeMouseState, ?SDL_GetMouseState+1). -define(SDL_WarpMouse, ?SDL_GetRelativeMouseState +1). -define(SDL_CreateCursor, ?SDL_WarpMouse +1). -define(SDL_SetCursor, ?SDL_CreateCursor+1). -define(SDL_GetCursor, ?SDL_SetCursor+1). -define(SDL_FreeCursor, ?SDL_GetCursor+1). -define(SDL_ShowCursor, ?SDL_FreeCursor+1). %%%%%%%%%%%%%%%%%%%%% MOUSE FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%% %% Func: getMouseState %% Args: none %% Returns: {MouseState, X, Y} %% C-API func: Uint8 SDL_GetMouseState(int *x, int *y); %% Desc: getMouseState() -> <> = call(?SDL_GetMouseState, []), {State,X,Y}. %% Func: getRelativeMouseState %% Args: none %% Returns: {MouseState, X, Y} %% C-API func: Uint8 SDL_GetRelativeMouseState(int *x, int *y); %% Desc: getRelativeMouseState() -> <> = call(?SDL_GetRelativeMouseState, []), {State,X,Y}. %% Func: warpMouse %% Args: X, Y %% Returns: ok %% C-API func: void SDL_WarpMouse(Uint16 x, Uint16 y); %% Desc: warpMouse(X, Y) -> cast(?SDL_WarpMouse, <>). %% Func: createCursor %% Args: Data (Binary), Mask(Binary), W, H, HotX, HotY %% Returns: CursorRef %% C-API func: SDL_Cursor *SDL_CreateCursor %% (Uint8 *data, Uint8 *mask, int w, int h, int hot_x, int hot_y); %% Desc: Data & Mask must be less than 32*32 bytes. createCursor(Data, Mask, W, H, HotX, HotY) when is_binary(Data), is_binary(Mask) -> case call(?SDL_CreateCursor, <>) of <<0:64>> -> exit({createCursor, returned_null}); <> -> {cursorp,Ptr} end. %% Func: setCursor %% Args: CursorRef %% Returns: ok %% C-API func: void SDL_SetCursor(SDL_Cursor *cursor); setCursor({cursorp,Ref}) -> cast(?SDL_SetCursor, <>). %% Func: getCursor %% Args: none %% Returns: A cursorRef %% C-API func: void SDL_SetCursor(SDL_Cursor *cursor); getCursor() -> case call(?SDL_GetCursor, []) of <<0:64>> -> exit({getCursor, returned_null}); <> -> {cursorp, Ptr} end. %% Func: freeCursor %% Args: CursorRef %% Returns: ok %% C-API func: void SDL_FreeCursor(SDL_Cursor *cursor); freeCursor({cursorp,Ref}) -> cast(?SDL_FreeCursor, <>). %% Func: showCursor %% Args: true | false %% Returns: true | false (if cursor was displayed before the call) %% C-API func: int SDL_ShowCursor(int toggle); showCursor(Bool) -> B = case Bool of false -> 0; true -> 1 end, call(?SDL_ShowCursor, [B]), receive {'_esdl_result_', Res} -> Res =:= 1 end. esdl-1.2/src/sdl_ttf.erl0000644000076400010400000005672611540750060017174 0ustar familjenAdministratörer%% Copyright (c) 2007 Klas Johansson %% %% See the file "license.terms" for information on usage and redistribution %% of this file, and for a DISCLAIMER OF ALL WARRANTIES. %% %% $Id$ %% %%%---------------------------------------------------------------------- %%% File : sdl_ttf.erl %%% Author : Klas Johansson %%% Purpose : Provide access to SDL's TTF functions (tested with SDL_ttf 2.0.7) %%% Created : 29 Jan 2007 by Klas Johansson %%%---------------------------------------------------------------------- -module(sdl_ttf). -include("sdl_ttf.hrl"). -include("sdl_ttf_funcs.hrl"). -include("gl.hrl"). -include("sdl_util.hrl"). -include("sdl_video.hrl"). %%% ERL_SDL functions -export([]). %%% SDL_Functions -export([linkedVersion/0]). -export([byteSwappedUNICODE/1]). -export([init/0]). -export([openFont/2]). -export([openFontIndex/3]). -export([openFontRW/0]). -export([openFontIndexRW/0]). -export([getFontStyle/1]). -export([setFontStyle/2]). -export([fontHeight/1]). -export([fontAscent/1]). -export([fontDescent/1]). -export([fontLineSkip/1]). -export([fontFaces/1]). -export([fontFaceIsFixedWidth/1]). -export([fontFaceFamilyName/1]). -export([fontFaceStyleName/1]). -export([glyphMetrics/2]). -export([sizeText/2]). -export([sizeUTF8/2]). -export([sizeUNICODE/2]). -export([renderTextSolid/3]). -export([renderUTF8Solid/3]). -export([renderUNICODESolid/3]). -export([renderGlyphSolid/3]). -export([renderTextShaded/4]). -export([renderUTF8Shaded/4]). -export([renderUNICODEShaded/4]). -export([renderGlyphShaded/4]). -export([renderTextBlended/3]). -export([renderUTF8Blended/3]). -export([renderUNICODEBlended/3]). -export([renderGlyphBlended/3]). -export([closeFont/1]). -export([quit/0]). -export([wasInit/0]). -export([setError/1]). -export([getError/0]). %% Imports -import(sdl, [call/2, cast/2]). %% Defines -define(INT, 16/signed). -define(LONG, 32/signed). -define(UINT8, 8/unsigned). -define(UINT16, 16/unsigned). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% ERL_SDL API %% Func: linkedVersion %% Args: - %% Returns: {Major, Minor, Patch} %% C-API func: const SDL_version * TTF_Linked_Version(void); %% Desc: This function gets the version of the SDL_ttf library. linkedVersion() -> <> = call(?SDL_TTF_LinkedVersion, []), {Major, Minor, Patch}. %% Func: byteSwappedUNICODE %% Args: Int %% Returns: void %% C-API func: void TTF_ByteSwappedUNICODE(int swapped); %% Desc: This function tells the library whether UNICODE text is generally %% byteswapped. A UNICODE BOM character in a string will override %% this setting for the remainder of that string. byteSwappedUNICODE(Int) -> cast(?SDL_TTF_ByteSwappedUNICODE, [<>]). %% Func: init %% Args: - %% Returns: Result %% C-API func: int TTF_Init(void); %% Desc: Initialize the TTF engine. Returns 0 on success, -1 on any error. init() -> <> = call(?SDL_TTF_Init, []), Res. %% Func: openFont %% Args: File, PointSize %% Returns: TTF_Font Ref %% C-API func: TTF_Font * TTF_OpenFont(const char *file, int ptsize); %% Desc: Open a font file and create a font of the specified point size. openFont(File, PointSize) -> <> = call(?SDL_TTF_OpenFont, [[File,0], <>]), case FontP of 0 -> exit({openFont, returned_null_pointer}); _ -> #ttf_font{ptr = FontP} end. %% Func: openFontIndex %% Args: File, PointSize, Index %% Returns: TTF_Font Ref %% C-API func: TTF_Font * TTF_OpenFontIndex(const char *file, %% int ptsize, %% long index); %% Desc: Open a font file and create a font of the specified point size. %% Some .fon fonts will have several sizes embedded in the file, so the %% point size becomes the index of choosing which size. If the value %% is too high, the last indexed size will be the default. openFontIndex(File, PointSize, Index) -> Args = [[File,0], <>, <>], <> = call(?SDL_TTF_OpenFontIndex, Args), case FontP of 0 -> exit({openFont, returned_null_pointer}); _ -> #ttf_font{ptr = FontP} end. %% Func: openFontRW %% Args: N/A %% Returns: N/A %% C-API func: TTF_Font * TTF_OpenFontRW(SDL_RWops *src, %% int freesrc, %% int ptsize); %% Desc: Not implemented. openFontRW() -> exit({not_implemented, openFontRW}). %% Func: openFontIndexRW %% Args: N/A %% Returns: N/A %% C-API func: TTF_Font * TTF_OpenFontIndexRW(SDL_RWops *src, %% int freesrc, %% int ptsize, %% long index); %% Desc: Not implemented. openFontIndexRW() -> exit({not_implemented, openFontIndexRW}). %% Func: getFontStyle %% Args: TTF_Font Ref %% Returns: FontStyle %% C-API func: int TTF_GetFontStyle(TTF_Font *font); %% Desc: Retrieve the font style. %% This font style is implemented by modifying the font glyphs, and %% doesn't reflect any inherent properties of the truetype font file. getFontStyle(Font) when is_record(Font, ttf_font) -> FontP = Font#ttf_font.ptr, <> = call(?SDL_TTF_GetFontStyle, [<>]), FontStyle. %% Func: setFontStyle %% Args: TTF_Font Ref, FontStyle %% Returns: %% C-API func: void TTF_SetFontStyle(TTF_Font *font, int style); %% Desc: Set the font style. %% This font style is implemented by modifying the font glyphs, and %% doesn't reflect any inherent properties of the truetype font file. setFontStyle(Font, FontStyle) when is_record(Font, ttf_font) -> FontP = Font#ttf_font.ptr, cast(?SDL_TTF_SetFontStyle, [<>, <>]). %% Func: fontHeight %% Args: TTF_Font Ref %% Returns: FontHeight %% C-API func: int TTF_FontHeight(TTF_Font *font); %% Desc: Get the total height of the font - usually equal to point size fontHeight(Font) when is_record(Font, ttf_font) -> FontP = Font#ttf_font.ptr, <> = call(?SDL_TTF_FontHeight, [<>]), FontHeight. %% Func: fontAscent %% Args: TTF_Font Ref %% Returns: FontAscent %% C-API func: int TTF_FontAscent(TTF_Font *font); %% Desc: Get the offset from the baseline to the top of the font %% This is a positive value, relative to the baseline. fontAscent(Font) when is_record(Font, ttf_font) -> FontP = Font#ttf_font.ptr, <> = call(?SDL_TTF_FontAscent, [<>]), FontAscent. %% Func: fontDescent %% Args: TTF_Font Ref %% Returns: FontDescent %% C-API func: int TTF_FontDescent(TTF_Font *font); %% Desc: Get the offset from the baseline to the bottom of the font %% This is a negative value, relative to the baseline. fontDescent(Font) when is_record(Font, ttf_font) -> FontP = Font#ttf_font.ptr, <> = call(?SDL_TTF_FontDescent, [<>]), FontDescent. %% Func: fontLineSkip %% Args: TTF_Font Ref %% Returns: FontLineSkip %% C-API func: int TTF_FontLineSkip(TTF_Font *font); %% Desc: Get the recommended spacing between lines of text for this font fontLineSkip(Font) when is_record(Font, ttf_font) -> FontP = Font#ttf_font.ptr, <> = call(?SDL_TTF_FontLineSkip, [<>]), FontLineSkip. %% Func: fontFaces %% Args: TTF_Font Ref %% Returns: FontFaces %% C-API func: long TTF_FontFaces(TTF_Font *font); %% Desc: Get the number of faces of the font fontFaces(Font) when is_record(Font, ttf_font) -> FontP = Font#ttf_font.ptr, <> = call(?SDL_TTF_FontFaces, [<>]), FontFaces. %% Func: fontFaceIsFixedWidth %% Args: TTF_Font Ref %% Returns: IsFixedWidth %% C-API func: int TTF_FontFaceIsFixedWidth(TTF_Font *font); %% Desc: Test if the current font face of the loaded font is a fixed %% width font. Fixed width fonts are monospace, meaning every %% character that exists in the font is the same width, thus you %% can assume that a rendered string's width is going to be %% the result of a simple calculation: %% glyph_width * string_length fontFaceIsFixedWidth(Font) when is_record(Font, ttf_font) -> FontP = Font#ttf_font.ptr, <> = call(?SDL_TTF_FontFaceIsFixedWidth, [<>]), IsFixedW. %% Func: fontFaceFamilyName %% Args: TTF_Font Ref %% Returns: FaceFamilyName %% C-API func: char * TTF_FontFaceFamilyName(TTF_Font *font); %% Desc: Get the current font face family name from the loaded %% font. This function may return a NULL pointer, in which case %% the information is not available. fontFaceFamilyName(Font) when is_record(Font, ttf_font) -> FontP = Font#ttf_font.ptr, binary_to_list(call(?SDL_TTF_FontFaceFamilyName, [<>])). %% Func: fontFaceStyleName %% Args: TTF_Font Ref %% Returns: FaceStyleName %% C-API func: char * TTF_FontFaceStyleName(TTF_Font *font); %% Desc: Get the current font face style name from the loaded %% font. This function may return a NULL pointer, in which case %% the information is not available. fontFaceStyleName(Font) when is_record(Font, ttf_font) -> FontP = Font#ttf_font.ptr, binary_to_list(call(?SDL_TTF_FontFaceStyleName, [<>])). %% Func: glyphMetrics %% Args: TTF_Font Ref, Ch %% Returns: {MinX, MinY, MaxX, MaxY, Advance} %% C-API func: int TTF_GlyphMetrics(TTF_Font *font, Uint16 ch, %% int *minx, int *maxx, %% int *miny, int *maxy, %% int *advance); %% Desc: Get the metrics (dimensions) of a glyph. glyphMetrics(Font, Ch) when is_record(Font, ttf_font) -> FontP = Font#ttf_font.ptr, <> = call(?SDL_TTF_GlyphMetrics, [<>, <>]), case Res of 0 -> {MinX, MaxX, MinY, MaxY, Adv}; -1 -> exit({error, {failed_to_get_glyph_metrics, Ch}}) end. %% Func: sizeText %% Args: TTF_Font Ref, Text %% Returns: {Width, Height} %% C-API func: int TTF_SizeText(TTF_Font *font, const char *text, %% int *w, int *h); %% Desc: Get the dimensions of a rendered string of text. sizeText(Font, Text) when is_record(Font, ttf_font) -> FontP = Font#ttf_font.ptr, <> = call(?SDL_TTF_SizeText, [<>, [Text,0]]), case Res of 0 -> {W, H}; -1 -> exit({error, {failed_to_get_text_size, Text}}) end. %% Func: sizeUTF8 %% Args: TTF_Font Ref, Text %% Returns: {Width, Height} %% C-API func: int TTF_SizeUTF8(TTF_Font *font, const char *text, %% int *w, int *h); %% Desc: Get the dimensions of a rendered string of text. sizeUTF8(Font, Text) when is_record(Font, ttf_font) -> FontP = Font#ttf_font.ptr, <> = call(?SDL_TTF_SizeUTF8, [<>, [Text,0]]), case Res of 0 -> {W, H}; -1 -> exit({error, {failed_to_get_utf8_text_size, Text}}) end. %% Func: sizeUNICODE %% Args: TTF_Font Ref, Text %% Returns: {Width, Height} %% C-API func: int TTF_SizeUNICODE(TTF_Font *font, const Uint16 *text, %% int *w, int *h); %% Desc: Get the dimensions of a rendered string of text. sizeUNICODE(Font, Text) when is_record(Font, ttf_font) -> FontP = Font#ttf_font.ptr, Args = [<>, mk_unicode_text(Text)], <> = call(?SDL_TTF_SizeUNICODE, Args), case Res of 0 -> {W, H}; -1 -> exit({error, {failed_to_get_unicode_text_size, Text}}) end. %% Func: renderTextSolid %% Args: TTF_Font Ref, Text, FgColor %% Returns: SDL_Surface Ref %% C-API func: SDL_Surface * TTF_RenderText_Solid(TTF_Font *font, %% const char *text, %% SDL_Color fg); %% Desc: Create an 8-bit palettized surface and render the given text %% at the fast quality with the given font and color. %% %% The palette has 0 as the colorkey, giving it a transparent %% background, with 1 as the text color. renderTextSolid(Font, Text, FgColor) when is_record(Font, ttf_font) -> FontP = Font#ttf_font.ptr, mk_render_call(?SDL_TTF_RenderTextSolid, mk_render_args(FontP, mk_latin1_text(Text), FgColor)). %% Func: renderUTF8Solid %% Args: TTF_Font Ref, Text, FgColor %% Returns: SDL_Surface Ref %% C-API func: SDL_Surface * TTF_RenderUTF8_Solid(TTF_Font *font, %% const char *text, %% SDL_Color fg); %% Desc: Create an 8-bit palettized surface and render the given text %% at the fast quality with the given font and color. %% %% The palette has 0 as the colorkey, giving it a transparent %% background, with 1 as the text color. renderUTF8Solid(Font, Text, FgColor) when is_record(Font, ttf_font) -> FontP = Font#ttf_font.ptr, mk_render_call(?SDL_TTF_RenderUTF8Solid, mk_render_args(FontP, mk_utf8_text(Text), FgColor)). %% Func: renderUNICODESolid %% Args: TTF_Font Ref, Text, FgColor %% Returns: SDL_Surface Ref %% C-API func: SDL_Surface * TTF_RenderUNICODE_Solid(TTF_Font *font, %% const Uint16 *text, %% SDL_Color fg); %% Desc: Create an 8-bit palettized surface and render the given text %% at the fast quality with the given font and color. %% %% The palette has 0 as the colorkey, giving it a transparent %% background, with 1 as the text color. renderUNICODESolid(Font, Text, FgColor) when is_record(Font, ttf_font) -> FontP = Font#ttf_font.ptr, mk_render_call(?SDL_TTF_RenderUNICODESolid, mk_render_args(FontP, mk_unicode_text(Text), FgColor)). %% Func: renderGlyphSolid %% Args: TTF_Font Ref, Glyph, FgColor %% Returns: SDL_Surface Ref %% C-API func: SDL_Surface * TTF_RenderGlyph_Solid(TTF_Font *font, %% Uint16 ch, %% SDL_Color fg); %% Desc: Create an 8-bit palettized surface and render the given glyph %% at fast quality with the given font and color. The 0 pixel %% is the colorkey, giving a transparent background, and the 1 %% pixel is set to the text color. The glyph is rendered %% without any padding or centering in the X direction, and %% aligned normally in the Y direction. renderGlyphSolid(Font, Glyph, FgColor) when is_record(Font, ttf_font) -> FontP = Font#ttf_font.ptr, mk_render_call(?SDL_TTF_RenderGlyphSolid, mk_render_args(FontP, mk_uint16_glyph(Glyph), FgColor)). %% Func: renderTextShaded %% Args: TTF_Font Ref, Text, FgColor, BgColor %% Returns: SDL_Surface Ref %% C-API func: SDL_Surface * TTF_RenderText_Shaded(TTF_Font *font, %% const char *text, %% SDL_Color fg, %% SDL_Color bg); %% Desc: Create an 8-bit palettized surface and render the given text %% at high quality with the given font and colors. %% %% The 0 pixel is background, while other pixels have varying %% degrees of the foreground color. renderTextShaded(Font, Text, FgColor, BgColor) when is_record(Font, ttf_font) -> FontP = Font#ttf_font.ptr, mk_render_call(?SDL_TTF_RenderTextShaded, mk_render_args(FontP,mk_latin1_text(Text),FgColor,BgColor)). %% Func: renderUTF8Shaded %% Args: TTF_Font Ref, Text, FgColor, BgColor %% Returns: SDL_Surface Ref %% C-API func: SDL_Surface * TTF_RenderUTF8_Shaded(TTF_Font *font, %% const char *text, %% SDL_Color fg, %% SDL_Color bg); %% Desc: Create an 8-bit palettized surface and render the given text %% at high quality with the given font and colors. %% %% The 0 pixel is background, while other pixels have varying %% degrees of the foreground color. renderUTF8Shaded(Font, Text, FgColor, BgColor) when is_record(Font, ttf_font) -> FontP = Font#ttf_font.ptr, mk_render_call(?SDL_TTF_RenderUTF8Shaded, mk_render_args(FontP,mk_utf8_text(Text),FgColor,BgColor)). %% Func: renderUNICODEShaded %% Args: TTF_Font Ref, Text, FgColor, BgColor %% Returns: SDL_Surface Ref %% C-API func: SDL_Surface * TTF_RenderUNICODE_Shaded(TTF_Font *font, %% const Uint16 *text, %% SDL_Color fg, %% SDL_Color bg); %% Desc: Create an 8-bit palettized surface and render the given text %% at high quality with the given font and colors. %% %% The 0 pixel is background, while other pixels have varying %% degrees of the foreground color. renderUNICODEShaded(Font, Text, FgColor, BgColor) when is_record(Font, ttf_font) -> FontP = Font#ttf_font.ptr, mk_render_call(?SDL_TTF_RenderUNICODEShaded, mk_render_args(FontP,mk_unicode_text(Text),FgColor,BgColor)). %% Func: renderGlyphShaded %% Args: TTF_Font Ref, Glyph, FgColor, BgColor %% Returns: SDL_Surface Ref %% C-API func: SDL_Surface * TTF_RenderGlyph_Shaded(TTF_Font *font, %% Uint16 ch, %% SDL_Color fg, %% SDL_Color bg); %% Desc: Create an 8-bit palettized surface and render the given glyph %% at high quality with the given font and colors. The 0 pixel %% is background, while other pixels have varying degrees of the %% foreground color. The glyph is rendered without any padding %% or centering in the X direction, and aligned normally in the %% Y direction. renderGlyphShaded(Font, Glyph, FgColor, BgColor) when is_record(Font, ttf_font) -> FontP = Font#ttf_font.ptr, mk_render_call(?SDL_TTF_RenderGlyphShaded, mk_render_args(FontP, mk_uint16_glyph(Glyph), FgColor, BgColor)). %% Func: renderTextBlended %% Args: TTF_Font Ref, Text, FgColor %% Returns: SDL_Surface Ref %% C-API func: SDL_Surface * TTF_RenderText_Blended(TTF_Font *font, %% const char *text, %% SDL_Color fg); %% Desc: Create a 32-bit ARGB surface and render the given text at %% high quality, using alpha blending to dither the font with %% the given color. renderTextBlended(Font, Text, FgColor) when is_record(Font, ttf_font) -> FontP = Font#ttf_font.ptr, mk_render_call(?SDL_TTF_RenderTextBlended, mk_render_args(FontP, mk_latin1_text(Text), FgColor)). %% Func: renderUTF8Blended %% Args: TTF_Font Ref, Text, FgColor %% Returns: SDL_Surface Ref %% C-API func: SDL_Surface * TTF_RenderUTF8_Blended(TTF_Font *font, %% const char *text, %% SDL_Color fg); %% Desc: Create a 32-bit ARGB surface and render the given text at %% high quality, using alpha blending to dither the font with %% the given color. renderUTF8Blended(Font, Text, FgColor) when is_record(Font, ttf_font) -> FontP = Font#ttf_font.ptr, mk_render_call(?SDL_TTF_RenderUTF8Blended, mk_render_args(FontP, mk_utf8_text(Text), FgColor)). %% Func: renderUNICODEBlended %% Args: TTF_Font Ref, Text, FgColor %% Returns: SDL_Surface Ref %% C-API func: SDL_Surface * TTF_RenderUNICODE_Blended(TTF_Font *font, %% const Uint16 *text, %% SDL_Color fg); %% Desc: Create a 32-bit ARGB surface and render the given text at %% high quality, using alpha blending to dither the font with %% the given color. renderUNICODEBlended(Font, Text, FgColor) when is_record(Font, ttf_font) -> FontP = Font#ttf_font.ptr, mk_render_call(?SDL_TTF_RenderUNICODEBlended, mk_render_args(FontP, mk_unicode_text(Text), FgColor)). %% Func: renderGlyphBlended %% Args: TTF_Font Ref, Glyph, FgColor %% Returns: SDL_Surface Ref %% C-API func: SDL_Surface * TTF_RenderGlyph_Blended(TTF_Font *font, %% Uint16 ch, %% SDL_Color fg); %% Desc: Create a 32-bit ARGB surface and render the given glyph at %% high quality, using alpha blending to dither the font with %% the given color. The glyph is rendered without any padding or %% centering in the X direction, and aligned normally in the %% Y direction. renderGlyphBlended(Font, Glyph, FgColor) when is_record(Font, ttf_font) -> FontP = Font#ttf_font.ptr, mk_render_call(?SDL_TTF_RenderGlyphBlended, mk_render_args(FontP, mk_uint16_glyph(Glyph), FgColor)). %% Func: closeFont %% Args: TTF_Font Ref %% Returns: void %% C-API func: void TTF_CloseFont(TTF_Font *font); %% Desc: Close an opened font file. closeFont(Font) when is_record(Font, ttf_font) -> FontP = Font#ttf_font.ptr, call(?SDL_TTF_CloseFont, [<>]). %% Func: quit %% Args: - %% Returns: void %% C-API func: void TTF_Quit(void); %% Desc: De-initialize the TTF engine. quit() -> call(?SDL_TTF_Quit, []). %% Func: wasInit %% Args: - %% Returns: Int %% C-API func: int TTF_WasInit(void); %% Desc: Check if the TTF engine is initialized. wasInit() -> <> = call(?SDL_TTF_WasInit, []), WasInit. %% Func: setError %% Args: N/A %% Returns: N/A %% C-API func: void TTF_SetError(const char *fmt, ...) %% Desc: Not implemented. setError(_Error) -> exit({not_implemented, setError}). %% Func: getError %% Args: - %% Returns: Error %% C-API func: char * TTF_GetError() %% Desc: Returns a (string) containing a human readable version or the %% reason for the last error that occured. getError() -> Bin = call(?SDL_TTF_GetError, []), binary_to_list(Bin). %%%%%%%%%%% Internal functions %%%%%%%%%%% %% Note: The order in which the arguments arrive and are passed to %% the driver differ. We're avoiding a strlen (and the %% like) in the driver by having the text as the last %% parameter. mk_render_args(FontP, Text, FgColor) -> [<>, mk_color(FgColor), Text]. mk_render_args(FontP, Text, FgColor, BgColor) -> [<>, mk_color(FgColor), mk_color(BgColor), Text]. mk_render_call(RenderFunc, Args) -> <> = call(RenderFunc, Args), case SurfacePtr of 0 -> exit({render_function_returned_null_pointer, RenderFunc}); _ -> {surfacep, SurfacePtr} end. mk_latin1_text(Text) -> [Text,0]. mk_utf8_text(Text) -> [Text,0]. mk_unicode_text(Text) -> lists:map(fun(C) -> <> end, Text++"\0"). mk_uint16_glyph(C) -> <>. mk_color(C) -> <<(C#sdl_color.r):?UINT8, (C#sdl_color.g):?UINT8,(C#sdl_color.b):?UINT8>>. esdl-1.2/src/sdl_ttf_funcs.hrl0000644000076400010400000000613211540750060020357 0ustar familjenAdministratörer%% Copyright (c) 2007 Klas Johansson %% %% See the file "license.terms" for information on usage and redistribution %% of this file, and for a DISCLAIMER OF ALL WARRANTIES. %% %% $Id$ %% %%%---------------------------------------------------------------------- %%% File : sdl_ttf_funcs.hrl %%% Author : Klas Johansson %%% Purpose : %%% Created : 29 Jan 2007 by Klas Johansson %%%---------------------------------------------------------------------- %%% Functions -include("esdl.hrl"). -define(SDL_TTF_LinkedVersion, ?SDL_TTF_HRL + 1). -define(SDL_TTF_ByteSwappedUNICODE, ?SDL_TTF_LinkedVersion + 1). -define(SDL_TTF_Init, ?SDL_TTF_ByteSwappedUNICODE + 1). -define(SDL_TTF_OpenFont, ?SDL_TTF_Init + 1). -define(SDL_TTF_OpenFontIndex, ?SDL_TTF_OpenFont + 1). -define(SDL_TTF_OpenFontRW, ?SDL_TTF_OpenFontIndex + 1). -define(SDL_TTF_OpenFontIndexRW, ?SDL_TTF_OpenFontRW + 1). -define(SDL_TTF_GetFontStyle, ?SDL_TTF_OpenFontIndexRW + 1). -define(SDL_TTF_SetFontStyle, ?SDL_TTF_GetFontStyle + 1). -define(SDL_TTF_FontHeight, ?SDL_TTF_SetFontStyle + 1). -define(SDL_TTF_FontAscent, ?SDL_TTF_FontHeight + 1). -define(SDL_TTF_FontDescent, ?SDL_TTF_FontAscent + 1). -define(SDL_TTF_FontLineSkip, ?SDL_TTF_FontDescent + 1). -define(SDL_TTF_FontFaces, ?SDL_TTF_FontLineSkip + 1). -define(SDL_TTF_FontFaceIsFixedWidth, ?SDL_TTF_FontFaces + 1). -define(SDL_TTF_FontFaceFamilyName, ?SDL_TTF_FontFaceIsFixedWidth + 1). -define(SDL_TTF_FontFaceStyleName, ?SDL_TTF_FontFaceFamilyName + 1). -define(SDL_TTF_GlyphMetrics, ?SDL_TTF_FontFaceStyleName + 1). -define(SDL_TTF_SizeText, ?SDL_TTF_GlyphMetrics + 1). -define(SDL_TTF_SizeUTF8, ?SDL_TTF_SizeText + 1). -define(SDL_TTF_SizeUNICODE, ?SDL_TTF_SizeUTF8 + 1). -define(SDL_TTF_RenderTextSolid, ?SDL_TTF_SizeUNICODE + 1). -define(SDL_TTF_RenderUTF8Solid, ?SDL_TTF_RenderTextSolid + 1). -define(SDL_TTF_RenderUNICODESolid, ?SDL_TTF_RenderUTF8Solid + 1). -define(SDL_TTF_RenderGlyphSolid, ?SDL_TTF_RenderUNICODESolid + 1). -define(SDL_TTF_RenderTextShaded, ?SDL_TTF_RenderGlyphSolid + 1). -define(SDL_TTF_RenderUTF8Shaded, ?SDL_TTF_RenderTextShaded + 1). -define(SDL_TTF_RenderUNICODEShaded, ?SDL_TTF_RenderUTF8Shaded + 1). -define(SDL_TTF_RenderGlyphShaded, ?SDL_TTF_RenderUNICODEShaded + 1). -define(SDL_TTF_RenderTextBlended, ?SDL_TTF_RenderGlyphShaded + 1). -define(SDL_TTF_RenderUTF8Blended, ?SDL_TTF_RenderTextBlended + 1). -define(SDL_TTF_RenderUNICODEBlended, ?SDL_TTF_RenderUTF8Blended + 1). -define(SDL_TTF_RenderGlyphBlended, ?SDL_TTF_RenderUNICODEBlended + 1). -define(SDL_TTF_CloseFont, ?SDL_TTF_RenderGlyphBlended + 1). -define(SDL_TTF_Quit, ?SDL_TTF_CloseFont + 1). -define(SDL_TTF_WasInit, ?SDL_TTF_Quit + 1). -define(SDL_TTF_SetError, ?SDL_TTF_WasInit + 1). -define(SDL_TTF_GetError, ?SDL_TTF_SetError + 1). esdl-1.2/src/sdl_util.erl0000644000076400010400000003512211540750060017337 0ustar familjenAdministratörer%% Copyright (c) 2001 Dan Gudmundsson %% %% See the file "license.terms" for information on usage and redistribution %% of this file, and for a DISCLAIMER OF ALL WARRANTIES. %% %% $Id$ %% %%%---------------------------------------------------------------------- %%% File : sdl_util.erl %%% Author : Dan Gudmundsson %%% Purpose : %%% Created : 13 Sep 2000 by Dan Gudmundsson %%%---------------------------------------------------------------------- -module(sdl_util). -export([term2bin/3,matrix2bin/2,bin2list/3, tuplelist2bin/3, tuplelist2bin2/2, tuplelist2bin3/2, tuplelist2bin4/2, alloc/2,getBin/1, read/2,write/2,write/3,readBin/2, copySdlImage2GLArray/3, debug/1,wb/1,whex/1]). %% Obsolete - use alloc instead. -export([malloc/2,free/1]). -include("sdl_video.hrl"). -include("sdl_util.hrl"). -include("sdl.hrl"). -include("esdl.hrl"). -import(sdl, [call/2,cast/2]). -import(lists, [reverse/1]). -define(SDL_UTIL_copySdlImage2GLArray, (?SDL_UTIL_HRL+1)). -define(SDL_UTIL_debug, (?SDL_UTIL_HRL+2)). -define(MYGL_malloc, (?SDL_UTIL_HRL+3)). -define(MYGL_write, (?SDL_UTIL_HRL+4)). %% Func: alloc %% Args: Size and type (?SDL_UNSIGNED_INT, ...) %% Returns: A reference to the memory area %% Desc: Allocates Size unit memory of Type, %% where Type is one of the opengl types described in gl.hrl. %% The memory will be garbage-collected away as any other %% Erlang term; thus there is no need to worry about freeing %% the memory. alloc(Size0, Type) -> %% Make sure that the size is at least 65 bytes %% to guarantee that the binary will be allocated %% outside of the heap. Size = case mem_size(Type, Size0) of Size1 when Size1 < 65 -> 65; Size1 -> Size1 end, Bin = <<0:Size/unit:8>>, #sdlmem{type=Type,bin=Bin,size=Size0}. %% Func: getBin %% Args: References to a memory area allocated by alloc/2. %% Returns: The memory allocated as a binary. %% Desc: Returns all of an allocated memory area as a binary. %% Note that if you do any write operation to the memory, %% the contents of the returned binary will change. %% CAVEAT PROGRAMMOR. getBin(#sdlmem{bin=Bin}) -> Bin. %% Func: malloc %% Args: Size and type (?SDL_UNSIGNED_INT, ...) %% Returns: A reference to the memory area %% Desc: Obsolete name. Use alloc/2 instead. malloc(Size, Type) -> alloc(Size, Type). %% Func: free %% Args: Ref to memory %% Desc: Obsolete function. Does nothing as memory blocks %% allocated by alloc/2 are garbage-collected. free(_Ref) -> ok. %% Func: read/readBin %% Args: MemoryRef, Size %% Returns: A list/Binary of Size elements of type Type %% Desc: Read allocated memory read(#sdlmem{type=Type,bin=Bin}, Size) -> bin2list(Size, Type, Bin). readBin(#sdlmem{type=Type,bin=Bin}, Size) -> if Type =:= ?SDL_BYTE; Type =:= ?SDL_UNSIGNED_BYTE -> <> = Bin, %% Force a copy to prevent the read binary to %% change later. list_to_binary([Data]); true -> %% Non-byte type. No longer supported. erlang:error({non_byte_type,Type}) end. %% Func: write %% Args: MemoryRef, List|Binary %% Returns: ok %% Desc: Write to data memory write(#sdlmem{type=Type,size=Size,bin=Dest}, Data) -> do_write(Type, Size, Dest, Data). %% Func: write %% Args: MemoryRef, Offset, List|Binary %% Returns: ok %% Desc: Write to memory, starting Offset unit into it. write(#sdlmem{type=Type,size=Size0,bin=Dest0}, Offset, Data) when Offset < Size0 -> Size = Size0 - Offset, ByteOffset = mem_size(Type, Offset), <<_:ByteOffset/binary,Dest/binary>> = Dest0, do_write(Type, Size, Dest, Data). do_write(Type, Size0, Dest, List) when is_list(List) -> Size = case length(List) of ListLen when ListLen > Size0 -> Size0; ListLen -> ListLen end, TermBin = term2bin(List, Size, Type), sdl:send_bin(Dest), cast(?MYGL_write, TermBin); do_write(_Type, _Size, Dest, Src) when is_binary(Src), size(Src) =< size(Dest) -> sdl:send_bin(Dest), sdl:send_bin(Src), cast(?MYGL_write, []). %% Func: term2bin %% Args: ListOfNumbers (or tuple), MaxNo, Type %% Returns: Deep list %% Desc: Converts the first MaxNo numbers of ListOfNumbers to a %% binary of the type Type. %% Where Type is SDL_TYPE existing in sdl.hrl (e.g. ?SDL_DOUBLE) term2bin(Bin, _, _) when is_binary(Bin) -> Bin; term2bin(List, N, Type) when is_list(List) -> if length(List) =:= N -> list2bin(List, Type); true -> list2bin(lists:sublist(List, N), Type) end; term2bin(Tuple, N, Type) when is_tuple(Tuple) -> case size(Tuple) of N when Type == ?SDL_BYTE; Type == ?SDL_UNSIGNED_BYTE -> tuple_to_list(Tuple); N -> tuple2bin(Tuple, N, Type); _Sz -> term2bin(tuple_to_list(Tuple), N, Type) end. list2bin(List, ?SDL_BYTE) -> List; list2bin(List,?SDL_UNSIGNED_BYTE) -> List; list2bin(List, ?SDL_FLOAT) -> float_list2bin(List, 32, []); list2bin(List, ?SDL_DOUBLE) -> float_list2bin(List, 64, []); list2bin(List, ?SDL_2_BYTES) -> int_list2bin(List, 16, []); list2bin(List, ?SDL_SHORT) -> int_list2bin(List, 16, []); list2bin(List, ?SDL_UNSIGNED_SHORT) -> int_list2bin(List, 16, []); list2bin(List, ?SDL_3_BYTES) -> int_list2bin(List, 24, []); list2bin(List, ?SDL_4_BYTES) -> int_list2bin(List, 32, []); list2bin(List, ?SDL_INT) -> int_list2bin(List, 32, []); list2bin(List, ?SDL_UNSIGNED_INT) -> int_list2bin(List, 32, []); list2bin(List, boolean) -> bool_list2bin(List, []). float_list2bin([H|T], N, Acc) -> float_list2bin(T, N, [Acc|<>]); float_list2bin([], _, Acc) -> Acc. int_list2bin([H|T], N, Acc) -> int_list2bin(T, N, [Acc|<>]); int_list2bin([], _, Acc) -> Acc. bool_list2bin([false|T], Acc) -> bool_list2bin(T, [Acc,0]); bool_list2bin([true|T], Acc) -> bool_list2bin(T, [Acc,1]); bool_list2bin([H|T], Acc) -> bool_list2bin(T, [Acc,H,1]); bool_list2bin([], Acc) -> Acc. tuple2bin(Tuple, Max, ?SDL_FLOAT) -> float_tuple2bin(Tuple, Max, 32, []); tuple2bin(Tuple, Max, ?SDL_DOUBLE) -> float_tuple2bin(Tuple, Max, 64, []); tuple2bin(Tuple, Max, ?SDL_2_BYTES) -> int_tuple2bin(Tuple, Max, 16, []); tuple2bin(Tuple, Max, ?SDL_SHORT) -> int_tuple2bin(Tuple, Max, 16, []); tuple2bin(Tuple, Max, ?SDL_UNSIGNED_SHORT) -> int_tuple2bin(Tuple, Max, 16, []); tuple2bin(Tuple, Max, ?SDL_3_BYTES) -> int_tuple2bin(Tuple, Max, 24, []); tuple2bin(Tuple, Max, ?SDL_4_BYTES) -> int_tuple2bin(Tuple, Max, 32, []); tuple2bin(Tuple, Max, ?SDL_INT) -> int_tuple2bin(Tuple, Max, 32, []); tuple2bin(Tuple, Max, ?SDL_UNSIGNED_INT) -> int_tuple2bin(Tuple, Max, 32, []); tuple2bin(Tuple, Max, boolean) -> bool_tuple2bin(Tuple, Max, []). float_tuple2bin(_, 0, _, Acc) -> Acc; float_tuple2bin(Tuple, I, N, Acc) -> float_tuple2bin(Tuple, I-1, N, [<<(element(I, Tuple)):N/native-float>>|Acc]). int_tuple2bin(_, 0, _, Acc) -> Acc; int_tuple2bin(Tuple, I, N, Acc) -> int_tuple2bin(Tuple, I-1, N, [<<(element(I, Tuple)):N/native>>|Acc]). bool_tuple2bin(_, 0, Acc) -> Acc; bool_tuple2bin(Tuple, I, Acc0) -> Acc = case element(I, Tuple) of false -> [0|Acc0]; true -> [1|Acc0]; Bool -> [Bool|Acc0] end, bool_tuple2bin(Tuple, I-1, Acc). %% Func: tuplelist2bin[TupleSize] %% Args: [TupleSize,] Type, List %% Returns: Binary %% Desc: Converts a tupleList [{X,Y,..}..] to binary. tuplelist2bin(2,Type,List) -> tuplelist2bin2(Type,List); tuplelist2bin(3,Type,List) -> tuplelist2bin3(Type,List); tuplelist2bin(4,Type,List) -> tuplelist2bin4(Type,List); tuplelist2bin(16,Type,List) -> %% A special case. list_to_binary([matrix2bin(Tuple,Type)|| Tuple <- List]); tuplelist2bin(Other,Type,List) -> list_to_binary([term2bin(Tuple,Other,Type)|| Tuple <- List]). tuplelist2bin2(?SDL_FLOAT,List) -> tuplelist2bin2_float(List,32,[]); tuplelist2bin2(?SDL_DOUBLE,List) -> tuplelist2bin2_float(List,64,[]); tuplelist2bin2(?SDL_INT,List) -> tuplelist2bin2_int(List,32,[]); tuplelist2bin2(?SDL_UNSIGNED_INT,List) -> tuplelist2bin2_int(List,32,[]). tuplelist2bin3(?SDL_FLOAT,List) -> tuplelist2bin3_float(List,32,[]); tuplelist2bin3(?SDL_DOUBLE,List) -> tuplelist2bin3_float(List,64,[]); tuplelist2bin3(?SDL_INT,List) -> tuplelist2bin3_int(List,32,[]); tuplelist2bin3(?SDL_UNSIGNED_INT,List) -> tuplelist2bin3_int(List,32,[]). tuplelist2bin4(?SDL_FLOAT,List) -> tuplelist2bin4_float(List,32,[]); tuplelist2bin4(?SDL_DOUBLE,List) -> tuplelist2bin4_float(List,64,[]); tuplelist2bin4(?SDL_INT,List) -> tuplelist2bin4_int(List,32,[]); tuplelist2bin4(?SDL_UNSIGNED_INT,List) -> tuplelist2bin4_int(List,32,[]). tuplelist2bin2_float([{X,Y}|List],N,Acc) -> tuplelist2bin2_float(List,N,[<>|Acc]); tuplelist2bin2_float([],_,Acc) -> list_to_binary(reverse(Acc)). tuplelist2bin3_float([{X,Y,Z}|List],N,Acc) -> tuplelist2bin3_float(List,N,[<>|Acc]); tuplelist2bin3_float([],_,Acc) -> list_to_binary(reverse(Acc)). tuplelist2bin4_float([{X,Y,Z,W}|List],N,Acc) -> tuplelist2bin4_float(List,N,[<>|Acc]); tuplelist2bin4_float([],_,Acc) -> list_to_binary(reverse(Acc)). tuplelist2bin2_int([{X,Y}|List],N,Acc) -> tuplelist2bin2_int(List,N,[<>|Acc]); tuplelist2bin2_int([],_,Acc) -> list_to_binary(reverse(Acc)). tuplelist2bin3_int([{X,Y,Z}|List],N,Acc) -> tuplelist2bin3_int(List,N,[<>|Acc]); tuplelist2bin3_int([],_,Acc) -> list_to_binary(reverse(Acc)). tuplelist2bin4_int([{X,Y,Z,W}|List],N,Acc) -> tuplelist2bin4_int(List,N,[<>|Acc]); tuplelist2bin4_int([],_,Acc) -> list_to_binary(reverse(Acc)). %% Func: bin2list %% Args: No, Type, Binary %% Returns: ListOfNumbers %% Desc: Converts the first 'No' of numbers in the binary Binary %% to a list of numbers of type Type. bin2list(undefined, Type, Bin) -> bin2list(size(Bin), Type, Bin); bin2list(N, ?SDL_UNSIGNED_BYTE, Bin0) -> Bin = if N < size(Bin0) -> <> = Bin0, B; true -> Bin0 end, binary_to_list(Bin); bin2list(N, ?SDL_UNSIGNED_SHORT, Bin) -> bin2unsigned(N, 2, Bin); bin2list(N, ?SDL_UNSIGNED_INT, Bin) -> bin2unsigned(N, 4, Bin); bin2list(N, ?SDL_BYTE, Bin) -> bin2int(N, 1, Bin); bin2list(N, ?SDL_SHORT, Bin) -> bin2int(N, 2, Bin); bin2list(N, ?SDL_INT, Bin) -> bin2int(N, 4, Bin); bin2list(N, ?SDL_FLOAT, Bin) -> bin2float(N, 4, Bin); bin2list(N, ?SDL_DOUBLE, Bin) -> bin2float(N, 8, Bin); bin2list(_, boolean, Bin) -> [B =/= 0 || B <- binary_to_list(Bin)]. bin2float(N, Sz, Bin) -> bin2float_1(Sz*(N-1), Sz, Bin, []). bin2float_1(N, _, _, Acc) when N < 0 -> Acc; bin2float_1(N, Sz, Bin, Acc) -> <<_:N/binary,F:Sz/native-float-unit:8,_/binary>> = Bin, bin2float_1(N-Sz, Sz, Bin, [F|Acc]). bin2unsigned(N, Sz, Bin) -> bin2unsigned_1(Sz*(N-1), Sz, Bin, []). bin2unsigned_1(N, _, _, Acc) when N < 0 -> Acc; bin2unsigned_1(N, Sz, Bin, Acc) -> <<_:N/binary,U:Sz/native-unsigned-unit:8,_/binary>> = Bin, bin2unsigned_1(N-Sz, Sz, Bin, [U|Acc]). bin2int(N, Sz, Bin) -> bin2int_1(Sz*(N-1), Sz, Bin, []). bin2int_1(N, _, _, Acc) when N < 0 -> Acc; bin2int_1(N, Sz, Bin, Acc) -> <<_:N/binary,U:Sz/native-signed-unit:8,_/binary>> = Bin, bin2int_1(N-Sz, Sz, Bin, [U|Acc]). matrix2bin(Matrix, ?SDL_FLOAT) -> matrix2bin_1(Matrix, 32); matrix2bin(Matrix, ?SDL_DOUBLE) -> matrix2bin_1(Matrix, 64). matrix2bin_1({A,B,C, E,F,G, I,J,K, M,N,O}, S) -> <>; matrix2bin_1({A,B,C,D, E,F,G,H, I,J,K,L, M,N,O,P}, S) -> <>; matrix2bin_1([A,B,C, E,F,G, I,J,K, M,N,O], S) -> <>; matrix2bin_1([A,B,C,D, E,F,G,H, I,J,K,L, M,N,O,P], S) -> <>. %% Func: copySdlImage2GLArray %% Args: SdlImageRef, malloced Mem, BytesPerPixel %% Returns: ok or exits %% Desc: Converts sdl_surface data to a byte RGB(A) buffer. %% sdl_surfaces are BGR and upside/down. copySdlImage2GLArray(Image, Mem, Bpp) when is_record(Image, sdl_surface) -> copySdlImage2GLArray(Image#sdl_surface.self, Mem, Bpp); copySdlImage2GLArray({surfacep, Image}, #sdlmem{bin=Mem}, Bpp) when Bpp == 3; Bpp == 4 -> sdl:send_bin(Mem), case call(?SDL_UTIL_copySdlImage2GLArray, <>) of <<1:8>> -> ok; _O -> error({error, _O}) end. mem_size(?SDL_BYTE, Size) -> Size; mem_size(?SDL_UNSIGNED_BYTE, Size) -> Size; mem_size(?SDL_UNSIGNED_SHORT, Size) -> 2*Size; mem_size(?SDL_SHORT, Size) -> 2*Size; mem_size(?SDL_UNSIGNED_INT, Size) -> 4*Size; mem_size(?SDL_INT, Size) -> 4*Size; mem_size(?SDL_FLOAT, Size) -> 4*Size; mem_size(?SDL_DOUBLE, Size) -> 8*Size. %% Func: Debug %% Args: Level (0 is off) %% Returns: ok %% Desc: Set ESDL debug level debug(L) when is_integer(L) -> cast(?SDL_UTIL_debug, [L]). %% Debug functions wb([]) -> ok; wb([A, B, C, D|R]) -> whex([A, B, C,D]), wb(R). whex([]) -> io:format(" ~n"); whex([A|R]) -> A1 = A div 16, A2 = A rem 16, whex(A1),whex(A2), io:format(" "), whex(R); whex(A) when A < 10 -> io:format("~p", [A]); whex(A) when A == 10 -> io:format("A"); whex(A) when A == 11 -> io:format("B"); whex(A) when A == 12 -> io:format("C"); whex(A) when A == 13 -> io:format("D"); whex(A) when A == 14 -> io:format("E"); whex(A) when A == 15 -> io:format("F"). esdl-1.2/src/sdl_util.hrl0000644000076400010400000000110711540750060017336 0ustar familjenAdministratörer%% Copyright (c) 2001 Dan Gudmundsson %% %% See the file "license.terms" for information on usage and redistribution %% of this file, and for a DISCLAIMER OF ALL WARRANTIES. %% %% $Id$ %% %%%---------------------------------------------------------------------- %%% File : sdl_util.hrl %%% Author : Dan Gudmundsson %%% Purpose : %%% Created : 13 Sep 2000 by Dan Gudmundsson %%%---------------------------------------------------------------------- -record(sdlmem, {bin, size, type}). -define(_PTR, 64/unsigned-native). esdl-1.2/src/sdl_video.erl0000644000076400010400000006324211540750060017474 0ustar familjenAdministratörer%% Copyright (c) 2001 Dan Gudmundsson %% %% See the file "license.terms" for information on usage and redistribution %% of this file, and for a DISCLAIMER OF ALL WARRANTIES. %% %% $Id$ %% %%%---------------------------------------------------------------------- %%% File : sdl_video.erl %%% Author : Dan Gudmundsson %%% Purpose : Provide access to SDL's video functions %%% Created : 26 Jun 2000 by Dan Gudmundsson %%%---------------------------------------------------------------------- -module(sdl_video). -include("sdl.hrl"). -include("esdl.hrl"). -include("sdl_video.hrl"). -include("sdl_video_funcs.hrl"). -include("sdl_util.hrl"). %%% ERL_SDL functions -export([getSurface/1, getPixelFormat/1, getPalette/1, getPixels/2]). %%% SDL_Functions -export([ blitSurface/4, createRGBsurface/8, createRGBsurface/4, createRGBsurfaceFrom/9, displayFormat/1, displayFormatAlpha/1, fillRect/3, flip/1, freeSurface/1, getColors/3, getVideoSurface/0, getVideoinfo/0, listModes/2, loadBMP/1, lockSurface/1, mapRGB/4, mapRGBA/5, mustLock/1, saveBMP/2, setAlpha/3, setClipping/5, setColorKey/3, setColors/4, setVideoMode/4, unlockSurface/1, updateRect/5, updateRects/2, videoDriverName/0, videoModeOK/4, setGamma/3, setGammaRamp/3, getGammaRamp/0, %% Window Manager Funcs wm_setCaption/2, wm_getCaption/0, wm_setIcon/2, wm_iconifyWindow/0, wm_toggleFullScreen/1, wm_grabInput/1, wm_getInfo/0, wm_isMaximized/0, wm_maximize/0, %% OpenGL Support funcs gl_setAttribute/2, gl_getAttribute/1, gl_swapBuffers/0, getClipRect/1, setClipRect/2 ]). %% Imports -import(sdl, [call/2,cast/2]). %%-import(sdl, [call/1]). %% Defines -define(mk_rectbin(Rect), (<<(Rect#sdl_rect.x):16, (Rect#sdl_rect.y):16, (Rect#sdl_rect.w):16, (Rect#sdl_rect.h):16>>)/binary ). -define(mk_rectbinary(Rect), <<(Rect#sdl_rect.x):16, (Rect#sdl_rect.y):16, (Rect#sdl_rect.w):16, (Rect#sdl_rect.h):16>>). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% ERL_SDL API %% Func: getSurface %% Args: Surface Ref %% Returns: sdl_surface record %% C-API func: %% Desc: Copies data pointed to by Surface to sdl_surface record. getSurface(Surface) when is_record(Surface, sdl_surface) -> getSurface(Surface#sdl_surface.self); getSurface({surfacep, Ptr} = Ref) -> <> %% Cminx:32, Cmaxx:32, Cminy :32, Cmaxy:32>> = call(?ESDL_getSurface, <>), #sdl_surface{self = Ref, flags = Flags, format = if Format /= 0 -> {formatp, Format}; true -> null end, w = W, h = H, pitch = Pitch, pixels = if Pixels /= 0 -> {pixelp, Pixels}; true -> null end, offset = Offset}. %% Func: getPixelFormat %% Args: PixelFormatRef %% Returns: a sdl_pixelformat record %% C-API func: %% Desc: Copies data pointed to by Surface to sdl_pixelformat record. getPixelFormat(Surface) when is_record(Surface, sdl_surface) -> getPixelFormat(Surface#sdl_surface.self); getPixelFormat({surfacep, Ptr} = Ref) -> Bin = call(?ESDL_getPixelFormat, <>), <> = Bin, #sdl_pixelformat{self = Ref, palette = if Palette /= 0 -> {palettep, Palette}; true -> null end, bitsPerPixel = BitsPP, bytesPerPixel= BytesPP, rloss = Rloss, gloss = Gloss, bloss = Bloss, aloss = Aloss, rshift = Rshift, gshift = Gshift, bshift = Bshift, ashift = Ashift, rmask = Rmask, gmask = Gmask, bmask = Bmask, amask = Amask, colorkey = Colorkey, alpha = Alpha}. %% Func: getPalette %% Args: SurfaceRef ref %% Returns: a sdl_palette record %% C-API func: %% Desc: Copies data pointed to by Surface to sdl_palette record. getPalette(Surface) when is_record(Surface, sdl_surface) -> getPalette(Surface#sdl_surface.self); getPalette({surfacep, Ptr}) -> <> = call(?ESDL_getPalette, <>), getColors(Tail, Length, []). % local functions getColors(_Bin, 0, Acc) -> lists:reverse(Acc); getColors(<>, N, Acc) -> Color = #sdl_color{r = R, g = G, b = B}, getColors(Tail, N-1, [Color | Acc]). %% Func: getPixels %% Args: Surface Ref, Size (a sdl_rectangle record) %% Returns: A binary containing all pixles, size varies with pixel format %% C-API func: %% Desc: Copies pixels (specified by Size) of Surface to a binary getPixels(Surface, Size) when is_record(Surface, sdl_surface) -> getPixels(Surface#sdl_surface.self, Size); getPixels({surfacep, Ref}, Size) -> Bin = call(?ESDL_getPixels, <>), Bin. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%% SDL API %% Func: setVideoMode %% Args: %% Returns: a surface ref or the atom 'error' %% C-API func: SDL_Surface *SDL_SetVideoMode(int width, int height, %% int bpp, Uint32 flags); setVideoMode(W, H, Bpp, Type) -> call(?SDL_SetVideoMode, <>), receive {'_esdl_result_', 0} -> error; {'_esdl_result_', Pointer} -> case (Type band ?SDL_OPENGL) > 1 of true -> DynLib = case os:type() of {win32,_} -> "erl_gl.dll"; _ -> "erl_gl.so" end, WXDL = list_to_binary(filename:join(code:priv_dir(wx),DynLib)), call(?ESDL_Init_Opengl, <<(WXDL)/binary, 0:8>>), receive {'_esdl_result_', 0} -> error(opengl_init_failed); {'_esdl_result_', GL} when GL > 0 -> put(opengl_port, esdl_port), ok end; false -> ok end, {surfacep, Pointer} end. %% Func: videoDriverName %% Args: %% Returns: [Name] | [] %% C-API func: char *SDL_VideoDriverName(char *namebuf, int maxlen); videoDriverName() -> binary_to_list(call(?SDL_VideoDriverName, [])). %% Func: getVideoSurface %% Args: %% Returns: surface ref to the current display %% C-API func: SDL_Surface * SDL_GetVideoSurface(void); getVideoSurface() -> <> = call(?SDL_GetVideoSurface, []), {surfacep, Bin}. getVideoinfo() -> <> = call(?SDL_GetVideoInfo, []), #sdl_videoinfo{hw_available = HW /= 0, wm_available = WM /= 0, blit_hw = BHW /= 0, blit_hw_CC = BHWCC /= 0, blit_hw_A = BHWA /= 0, blit_sw = BSW /= 0, blit_sw_CC = BSWCC /= 0, blit_sw_A = BSWA /= 0, blit_fill = BF /= 0, video_mem = VM, vfmt = {formatp, VF}}. %% Func: videoModeOK %% Args: See sdl documentation %% Returns: true | false (see sdl doc) %% C-API func: int SDL_VideoModeOK(int width, int height, int bpp, Uint32 flags); videoModeOK(W, H, Bpp, Type) -> call(?SDL_VideoModeOK, <>), receive {'_esdl_result_', Res} -> Res /= 0 end. %% Func: listModes %% Args: PixelFormat (either as sdl_pixelformat record or a PixelFormat Ref or null) %% VideoFlags %% Returns: [AvailableDimensions (in sdl_rect)] | all %% C-API func: SDL_Rect ** SDL_ListModes(SDL_PixelFormat *format, Uint32 flags); listModes({formatp, Ref}, Flags) -> <> = call(?SDL_ListModes,<>), listModesRet(M, Bin); listModes(null, Flags) -> <> = call(?SDL_ListModes, <>), listModesRet(M, Bin); listModes(PF, Flags) when is_record(PF, sdl_pixelformat) -> <> = call(?SDL_ListModes, < 0; {palettep, Ref} -> Ref end):?_PTR, (PF#sdl_pixelformat.bitsPerPixel):8, (PF#sdl_pixelformat.bytesPerPixel):8, (PF#sdl_pixelformat.rloss):8, (PF#sdl_pixelformat.gloss):8, (PF#sdl_pixelformat.bloss):8, (PF#sdl_pixelformat.aloss):8, (PF#sdl_pixelformat.rshift):8, (PF#sdl_pixelformat.gshift):8, (PF#sdl_pixelformat.bshift):8, (PF#sdl_pixelformat.ashift):8, (PF#sdl_pixelformat.rmask):32, (PF#sdl_pixelformat.gmask):32, (PF#sdl_pixelformat.bmask):32, (PF#sdl_pixelformat.amask):32, (PF#sdl_pixelformat.colorkey):32, (PF#sdl_pixelformat.alpha):8>>), listModesRet(M, Bin). listModesRet(0, <<>>) -> []; listModesRet(255, <<>>) -> all; listModesRet(0, <>) -> [#sdl_rect{x = X, y=Y, w=W, h=H} | listModesRet(0, Rest)]. %% Func: displayFormat %% Args: Surface Ref %% Returns: Surface Ref %% C-API func: SDL_Surface * SDL_DisplayFormat(SDL_Surface *surface); displayFormat(Surface) when is_record(Surface, sdl_surface) -> displayFormat(Surface#sdl_surface.self); displayFormat({surfacep, Ref}) -> <> = call(?SDL_DisplayFormat, <>), case Res of 0 -> exit({sdl_displayformat, returned_null_pointer}); _ -> {surfacep, Res} end. %% Func: blitSurface %% Args: SrcSurfaceRef, SrcRect | null, DestSurfaceRef, DestRect | null %% Returns: {ClippedSrcRect | null, ClippedDestRect | null} or %% {error, ErrorLevel} Where ErrorLevel = -1 | -2 %% C-API func: int SDL_BlitSurface(SDL_Surface *src, SDL_Rect *srcrect, %% SDL_Surface *dst, SDL_Rect *dstrect); blitSurface(SSurf, SRect, DSurf, DRect) when is_record(SSurf, sdl_surface) -> blitSurface(SSurf#sdl_surface.self, SRect, DSurf, DRect); blitSurface(SSurf, SRect, DSurf, DRect) when is_record(DSurf, sdl_surface) -> blitSurface(SSurf, SRect, DSurf#sdl_surface.self, DRect); blitSurface({surfacep, SrcRef}, null, {surfacep, DestRef}, null) -> blitSurface2(<>); blitSurface({surfacep, SrcRef}, SrcRect, {surfacep, DestRef}, null) -> blitSurface2(<>); blitSurface({surfacep, SrcRef}, null, {surfacep, DestRef}, DestRect) -> blitSurface2(<>); blitSurface({surfacep, SrcRef}, SRect, %{sdl_rect, SX,SY,SW,SH}, {surfacep, DestRef}, DRect) -> %{sdl_rect, DX,DY,DW,DH}) -> blitSurface2(<>). %DX:16, DY:16, DW:16, DH:16>>). blitSurface2(Bin) -> <> = call(?SDL_BlitSurface, Bin), {SR, DR} = case Type of 0 -> {null, null}; 1 -> <> = Rest, {#sdl_rect{x = X, y = Y, w = W, h = H}, null}; 2 -> <> = Rest, {null, #sdl_rect{x = X, y = Y, w = W, h = H}}; 3 -> <> = Rest, {#sdl_rect{x = Xs, y = Ys, w = Ws, h = Hs}, #sdl_rect{x = Xd, y = Yd, w = Wd, h = Hd}} end, case Res of 0 -> {SR, DR}; Error -> {error, Error, SR, DR} end. %% Func: fillRect %% Args: SurfaceRef, sdl_rectangle|null, color %% Returns: true | false (on failure) %% C-API func: int SDL_FillRect(SDL_Surface *dst, SDL_Rect *dstrect, Uint32 color); fillRect(S, R, C) when is_record(S, sdl_surface) -> fillRect(S#sdl_surface.self, R, C); fillRect({surfacep, SRef}, null, Color) -> fillRect2(<>); fillRect({surfacep, SRef}, {sdl_rect, X, Y, W, H}, Color) -> fillRect2(<>). fillRect2(Bin) -> <> = call(?SDL_FillRect, Bin), Res == 0. %% Func: updateRect %% Args: SurfaceRef, X, Y, W, H %% Returns: ok %% C-API func: void SDL_UpdateRect(SDL_Surface *screen, Sint32 x, Sint32 y, Uint32 w, Uint32 h); updateRect(S, X, Y, W, H) -> updateRects(S, [#sdl_rect{x = X, y=Y, w=W, h=H}]). %% Func: updateRects %% Args: SurfaceRef, [sdl_rect] %% Returns: ok %% C-API func: void SDL_UpdateRects(SDL_Surface *screen, int numrects, SDL_Rect *rects); updateRects(S, R) when is_record(S, sdl_surface) -> updateRects(S#sdl_surface.self, R); updateRects({surfacep, Ref}, Rects) when is_list(Rects) -> Length = length(Rects), BinRects = list_to_binary(mk_rectbins(Rects)), cast(?SDL_UpdateRects, <>). mk_rectbins([]) -> [] ; mk_rectbins([H|T]) -> [?mk_rectbinary(H) | mk_rectbins(T)]. %% Func: flip %% Args: Surface Ref %% Returns: true | false (if error) %% C-API func: int SDL_Flip(SDL_Surface *screen); flip({surfacep, Ref}) -> <> = call(?SDL_Flip, <>), Res == 0; flip(S) when is_record(S, sdl_surface) -> flip(S#sdl_surface.self). %% Func: setColors %% Args: SurfaceRef, [ColorList], FirstColor, NoOfColors %% Returns: true (when all colors where set) false (otherwise) %% C-API func: int SDL_SetColors(SDL_Surface *surface, SDL_Color *colors, int firstcolor, int ncolors); setColors(S, Colors, FirstColor, Ncolors) when is_record(S, sdl_surface) -> setColors(S#sdl_surface.self, Colors, FirstColor, Ncolors); setColors({surfacep, Ref}, Colors, FirstColor, Ncolors) when is_list(Colors) -> BinC = list_to_binary(mkbin_colors(Colors, Ncolors)), Length = size(BinC) div 3, <> = call(?SDL_SetColors, <>), Res == 1. mkbin_colors([], _) -> <<>> ; mkbin_colors(_, 0) -> <<>> ; mkbin_colors([H|R], N) -> Bb = mkbin_colors(R, N-1), <<(H#sdl_color.r):8, (H#sdl_color.g):8,(H#sdl_color.b):8, Bb/binary>>. %% Func: setColorKey %% Args: Surface Ref, Flag(int), Key(int) %% Returns: true (on success) | false on failure %% C-API func: int SDL_SetColorKey(SDL_Surface *surface, Uint32 flag, Uint32 key); setColorKey(Surface, Flag, Key) when is_record(Surface, sdl_surface) -> setColorKey(Surface#sdl_surface.self, Flag, Key); setColorKey({surfacep, Ref}, Flag, Key) -> <> = call(?SDL_SetColorKey, <>), Res == 0. %% Func: mapRGB %% Args: Surface Ref, Int32, Int32, Int32 %% Returns: Int32 %% C-API func: Uint32 SDL_MapRGB(SDL_PixelFormat *format, Uint8 r, Uint8 g, Uint8 b); mapRGB(Surface, R, G, B) when is_record(Surface, sdl_surface) -> mapRGB(Surface#sdl_surface.self, R, G, B); mapRGB({surfacep, Ref}, R, G, B) -> <> = call(?SDL_MapRGB, <>), Pixel. %% Func: createRGBsurface %% Args: SurfaceFlags Width Height Depth Rmask:32 Gmask:32 Bmask:32 Amask:32 %% Returns: A surface ref %% C-API func: SDL_Surface *SDL_CreateRGBSurface(Uint32 flags, int width, int height, int depth, Uint32 Rmask, Uint32 Gmask, Uint32 Bmask, Uint32 Amask); createRGBsurface(Flags, W, H, D, RM, GM, BM, AM) -> <> = call(?SDL_CreateRGBSurface, <>), case Ref of 0 -> exit({createRGBsurface, returned_null_pointer}); _ -> {surfacep, Ref} end. createRGBsurface(Flags, W, H, D) -> <> = call(?SDL_CreateRGBSurface, <>), case Ref of 0 -> exit({createRGBsurface, returned_null_pointer}); _ -> {surfacep, Ref} end. %% Func: createRGBsurfaceFrom %% Args: Pixels(Binary) Width Height Depth Pitch %% Rmask:32 Gmask:32 Bmask:32 Amask:32 %% Returns: A surface ref %% C-API func: SDL_Surface *SDL_CreateRGBSurfaceFrom(void *pixels, int width, int height, int depth, int pitch, Uint32 Rmask, Uint32 Gmask, Uint32 Bmask, Uint32 Amask); createRGBsurfaceFrom(Pixels, W, H, D, P, RM, GM, BM, AM) when is_binary(Pixels) -> <> = call(?SDL_CreateRGBSurface, <>), case Ref of 0 -> exit({createRGBsurface, returned_null_pointer}); _ -> {surfacep, Ref} end; createRGBsurfaceFrom({pixelp, PixelRef}, W, H, D, P, RM, GM, BM, AM) -> <> = call(?SDL_CreateRGBSurface, <>), case Ref of 0 -> exit({createRGBsurface, returned_null_pointer}); _ -> {surfacep, Ref} end. %% Func: freeSurface %% Args: Surface Ref %% Returns: ok %% C-API func: void SDL_FreeSurface(SDL_Surface *surface); freeSurface(Surface) when is_record(Surface, sdl_surface) -> freeSurface(Surface#sdl_surface.self); freeSurface({surfacep, Ref}) -> cast(?SDL_FreeSurface, <>). %% Func: mustLock %% Args: surfaceRef %% Returns: Bool %% C-API func: Macro mustLock(Surface) when is_record(Surface, sdl_surface) -> Flag = Surface#sdl_surface.flags band (?SDL_HWSURFACE bor ?SDL_ASYNCBLIT bor ?SDL_RLEACCEL), Flag /= 0. %% Func: lockSurface (I don't have any hardware to test this function on %% the manual says don't do any lib func calls when surface is locked %% we can't avoid that :) %% Args: Surface Ref %% Returns: true (if locked) false otherwise %% C-API func: int SDL_LockSurface(SDL_Surface *surface); lockSurface(Surface) when is_record(Surface, sdl_surface) -> lockSurface(Surface#sdl_surface.self); lockSurface({surfacep, Ref}) -> <> = call(?SDL_LockSurface, <>), Res == 0. %% Func: unLockSurface (I don't have any hardware to test this function on) %% Args: Surface Ref %% Returns: ok %% C-API func: void SDL_UnlockSurface(SDL_Surface *surface); unlockSurface(Surface) when is_record(Surface, sdl_surface) -> unlockSurface(Surface#sdl_surface.self); unlockSurface({surfacep, Ref}) -> cast(?SDL_UnlockSurface, <>). %% Func: loadBMP %% Args: Name of the BMP file (string) %% Returns: a surface ref or null %% C-API func: SDL_Surface * SDL_LoadBMP(char * file); loadBMP(File) when is_list(File) -> <> = call(?SDL_LoadBMP, [File,0]), case Res of 0 -> null; _ -> {surfacep, Res} end. %% Func: saveBMP %% Args: Name of the BMP file (string) %% Returns: true or false (if it failed) %% C-API func: int SDL_SaveBMP(SDL_Surface *surface, char *file) saveBMP(Surface, File) when is_record(Surface, sdl_surface) -> saveBMP(Surface#sdl_surface.self, File); saveBMP({surfacep, Ref}, File) when is_list(File) -> <> = call(?SDL_SaveBMP, [<>,File,0]), Res == 0. %% Func: setAlpha %% Args: SurfaceRef, Flag:32, Alpha:32 %% Returns: integer (undocumented in (my version of) SDL) %% C-API func: int SDL_SetAlpha(SDL_Surface *surface, Uint32 flag, Uint8 alpha); setAlpha(Surface, Flag, Alpha) when is_record(Surface, sdl_surface) -> setAlpha(Surface#sdl_surface.self, Flag, Alpha); setAlpha({surfacep, Ref}, Flag, Alpha)-> <> = call(?SDL_SetAlpha, <>), Res. %% Func: setClipping %% Args: SurfaceRef, Top, Left, Botton, Right %% Returns: ok %% C-API func: %% Desc: Obsolete?? setClipping(Surface, Top, Left, Botton, Right) when is_record(Surface, sdl_surface) -> setClipping(Surface#sdl_surface.self, Top, Left, Botton, Right); setClipping({surfacep, SRef}, Top, Left, Botton, Right) -> cast(?SDL_SetClipping, <>). %% Func: setGamma %% Args: red, green, blue %% Returns: Bool %% C-API func: int SDL_SetGamma(float red, float green, float blue) %% Desc: setGamma(Red,Green,Blue) -> <> = call(?SDL_SetGamma, <>), Res == 0. %% Func: setGammaRamp %% Args: redList, greenList, blueList (where each list contains 256 16 bits value) %% Returns: Bool %% C-API func: int SDL_SetGammaRamp(Uint16 red[256], Uint16 green[256], Uint16 blue[256]) %% Desc: setGammaRamp(Red,Green,Blue) -> Args = sdl_util:term2bin(Red ++ Green ++ Blue, 256*3, ?SDL_UNSIGNED_SHORT), <> = call(?SDL_SetGammaRamp, Args), Res == 0. %% Func: getGammaRamp %% Args: none %% Returns: {res, redList, greenList, blueList} (where each list contains 256 16 bits value) %% C-API func: int SDL_GetGammaRamp(Uint16 *red, Uint16 *green, Uint16 *blue]) %% Desc: If res is == true, the lists contain valid information getGammaRamp() -> <> = call(?SDL_GetGammaRamp, []), {Res == 0, sdl_util:bin2list(256, ?SDL_UNSIGNED_SHORT, R), sdl_util:bin2list(256, ?SDL_UNSIGNED_SHORT, G), sdl_util:bin2list(256, ?SDL_UNSIGNED_SHORT, B)}. %%%%%%%%%%% WindowManager Functions %%%%%%%%%%% %% Func: wm_setCaption %% Args: Title List, IconTitleList %% Returns: ok %% C-API func: void SDL_WM_SetCaption(const char *title, const char *icon); wm_setCaption(Title, IconTitle) -> cast(?SDL_WM_SetCaption, [Title,0,IconTitle,0]). %% Func: wm_getCaption %% Args: %% Returns: {TitleStr, IconTitleStr} %% C-API func: void SDL_WM_GetCaption(char **title, char **icon); wm_getCaption() -> <> = call(?SDL_WM_GetCaption, []), <> = Bin, {binary_to_list(Title), binary_to_list(Icon)}. %% Func: wm_setIcon %% Args: Icon (sdl_surface), Mask (list of bytes) | null %% Returns: ok %% C-API func: void SDL_WM_SetIcon(SDL_Surface *icon, Uint8 *mask); wm_setIcon(Icon, Mask) when is_record(Icon, sdl_surface) -> wm_setIcon(Icon#sdl_surface.self, Mask); wm_setIcon({surfacep, Ref}, null) -> cast(?SDL_WM_SetIcon, <>); wm_setIcon({surfacep, Ref}, Mask) when is_binary(Mask) -> cast(?SDL_WM_SetIcon, <>). %% Func: WM_IconifyWindow %% Args: %% Returns: ok %% C-API func: int SDL_WM_IconifyWindow(void); wm_iconifyWindow() -> cast(?SDL_WM_IconifyWindow, []). %% Func: SDL_WM_ToggleFullScreen %% Args: SurfaceRef %% Returns: true or false (on failure) %% C-API func: int SDL_WM_ToggleFullScreen(SDL_Surface *surface); wm_toggleFullScreen(Surface) when is_record(Surface, sdl_surface) -> wm_toggleFullScreen(Surface#sdl_surface.self); wm_toggleFullScreen({surfacep, Ref}) -> cast(?SDL_WM_ToggleFullScreen, <>), receive {'_esdl_result_', Res} -> Res == 1 end. %% Func: wm_grabInput %% Args: GrabMode (?SDL_GRAB_QUERY | ?SDL_GRAB_OFF | ?SDL_GRAB_ON) %% Returns:GrabMode (?SDL_GRAB_OFF | ?SDL_GRAB_ON) %% C-API func: SDL_GrabMode SDL_WM_GrabInput(SDL_GrabMode mode); wm_grabInput(GrabMode) -> <> = call(?SDL_WM_GrabInput, [GrabMode]), Res. %% Func: wm_getInfo %% Args: %% Returns: {SDLVersion = {Major, Minor, Patch}, OSSpecBinary} %% C-API func: %% Desc: Only windows returns anything useful (window handle) wm_getInfo() -> cast(?SDL_WM_GetInfo, []), receive {'_esdl_result_', Major, Minor, Patch, Rest} -> {{Major, Minor, Patch}, <>} end. %% Func: wm_isMaximized %% Args: %% Returns: Boolean %% C-API func: %% Desc: Only windows returns anything useful (window handle) wm_isMaximized() -> <> = call(?SDL_WM_IsMaximized, []), Bool /= 0. %% Func: wm_maximize %% Args: %% Returns: nothing %% C-API func: %% Desc: Only works on windows wm_maximize() -> cast(?SDL_WM_Maximize, []). %%%%%%%%%%%%%%%%%% GL support Funcs %%%%%%%%%%%%%%%%%%%%% %% Func: gl_setAttribute %% Args: %% Returns: ok %% C-API func: int SDL_GL_SetAttribute(SDL_GLattr attr, int value); gl_setAttribute(Attr, Val) -> cast(?SDL_GL_SetAttribute, <>). %% Func: gl_getAttribute %% Args: %% Returns: Attribute Value %% C-API func: int SDL_GL_GetAttribute(SDL_GLattr attr, int* value); gl_getAttribute(Attr) -> call(?SDL_GL_GetAttribute, <>), receive {'_esdl_result_', Res} -> Res end. %% Func: gl_swapBuffers %% Args: %% Returns: A timestamp generated with SDL_GetTicks %% C-API func: void SDL_GL_SwapBuffers(void); gl_swapBuffers() -> <> = call(?SDL_GL_SwapBuffers, []), TS. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% Func: mapRGBA %% Args: Surface Ref, Int32, Int32, Int32, Int32 %% Returns: Int32 %% C-API func: Uint32 SDL_MapRGB(SDL_PixelFormat *format, Uint8 r, Uint8 g, Uint8 b, Uint8 a); mapRGBA(Surface, R, G, B, A) when is_record(Surface, sdl_surface) -> mapRGBA(Surface#sdl_surface.self, R, G, B, A); mapRGBA({surfacep, Ref}, R, G, B, A) -> <> = call(?SDL_MapRGBA, <>), Pixel. %% Func: getClipRect %% Args: Surface Ref %% Returns: Rect %% C-API func: void SDL_GetClipRect(SDL_Surface *surface, SDL_Rect *rect); getClipRect(Surface) when is_record(Surface, sdl_surface) -> getClipRect(Surface#sdl_surface.self); getClipRect({surfacep, Ref}) -> <> = call(?SDL_GetClipRect, <>), #sdl_rect{x=X, y=Y, w=W, h=H}. %% Func: setClipRect %% Args: Surface Ref, Rect %% Returns: ok %% C-API func: void SDL_SetClipRect(SDL_Surface *surface, SDL_Rect *rect); setClipRect(Surface, Rect) when is_record(Surface, sdl_surface) -> setClipRect(Surface#sdl_surface.self, Rect); setClipRect({surfacep, Ref}, #sdl_rect{x=X, y=Y, w=W, h=H}) -> cast(?SDL_SetClipRect, <>). %% Func: displayFormatAlpha %% Args: Surface Ref %% Returns: Surface Ref %% C-API func: SDL_Surface * SDL_DisplayFormatAlpha(SDL_Surface *surface); displayFormatAlpha(Surface) when is_record(Surface, sdl_surface) -> displayFormat(Surface#sdl_surface.self); displayFormatAlpha({surfacep, Ref}) -> <> = call(?SDL_DisplayFormatAlpha, <>), case Res of 0 -> exit({sdl_displayformatalpha, returned_null_pointer}); _ -> {surfacep, Res} end. %%%%%%%%%%% Internal functions %%%%%%%%%%% esdl-1.2/src/sdl_video_funcs.hrl0000644000076400010400000000707311540750060020675 0ustar familjenAdministratörer%% Copyright (c) 2001 Dan Gudmundsson %% %% See the file "license.terms" for information on usage and redistribution %% of this file, and for a DISCLAIMER OF ALL WARRANTIES. %% %% $Id$ %% %%%---------------------------------------------------------------------- %%% File : sdl_video_funcs.hrl %%% Author : Dan Gudmundsson %%% Purpose : %%% Created : 30 Aug 2000 by Dan Gudmundsson %%%---------------------------------------------------------------------- %%% Functions -include("esdl.hrl"). -define(SDL_VideoDriverName, ?SDL_VIDEO_HRL + 1). -define(SDL_GetVideoSurface, ?SDL_VideoDriverName + 1). -define(SDL_GetVideoInfo, ?SDL_GetVideoSurface + 1). -define(SDL_VideoModeOK, ?SDL_GetVideoInfo + 1). -define(SDL_ListModes, ?SDL_VideoModeOK + 1). -define(SDL_SetVideoMode, ?SDL_ListModes + 1). -define(SDL_UpdateRect, ?SDL_SetVideoMode + 1). -define(SDL_UpdateRects, ?SDL_UpdateRect + 1). -define(SDL_Flip, ?SDL_UpdateRects + 1). -define(SDL_SetColors, ?SDL_Flip + 1). -define(SDL_MapRGB, ?SDL_SetColors + 1). -define(SDL_GetRGB, ?SDL_MapRGB + 1). -define(SDL_CreateRGBSurface,?SDL_GetRGB + 1). -define(SDL_CreateRGBSurfaceFrom, ?SDL_CreateRGBSurface + 1). -define(SDL_FreeSurface, ?SDL_CreateRGBSurfaceFrom + 1). -define(SDL_MUSTLOCK, 0). %% Needed ? Implemented as an erlang func!! -define(SDL_LockSurface, ?SDL_FreeSurface + 1 ). -define(SDL_UnlockSurface, ?SDL_LockSurface + 1). -define(SDL_LoadBMP_RW, ?SDL_UnlockSurface + 1). -define(SDL_LoadBMP, ?SDL_LoadBMP_RW + 1). -define(SDL_SaveBMP_RW, ?SDL_LoadBMP + 1). -define(SDL_SaveBMP, ?SDL_SaveBMP_RW + 1). -define(SDL_SetColorKey, ?SDL_SaveBMP + 1). -define(SDL_SetAlpha, ?SDL_SetColorKey + 1). -define(SDL_SetClipping, ?SDL_SetAlpha + 1). -define(SDL_ConvertSurface, ?SDL_SetClipping + 1 ). % SDL_internal -define(SDL_BlitSurface, ?SDL_ConvertSurface + 1). -define(SDL_UpperBlit, ?SDL_BlitSurface + 1). -define(SDL_LowerBlit, ?SDL_UpperBlit + 1 ).% SDL_semi private -define(SDL_FillRect, ?SDL_LowerBlit + 1). -define(SDL_DisplayFormat, ?SDL_FillRect + 1). %% video overlays ... not supported rigth now %% Windowing stuff -define(SDL_WM_SetCaption, ?SDL_DisplayFormat +1). -define(SDL_WM_GetCaption, ?SDL_WM_SetCaption +1). -define(SDL_WM_SetIcon, ?SDL_WM_GetCaption +1). -define(SDL_WM_IconifyWindow,?SDL_WM_SetIcon +1). -define(SDL_WM_ToggleFullScreen, ?SDL_WM_IconifyWindow +1). -define(SDL_WM_GrabInput, ?SDL_WM_ToggleFullScreen+1). -define(SDL_WM_GetInfo, ?SDL_WM_GrabInput+1). -define(SDL_GL_SetAttribute, ?SDL_WM_GetInfo+1). -define(SDL_GL_GetAttribute, ?SDL_GL_SetAttribute +1). -define(SDL_GL_SwapBuffers, ?SDL_GL_GetAttribute +1). %% Erl sdl special functions -define(ESDL_getSurface, ?SDL_GL_SwapBuffers + 1). -define(ESDL_getPalette, ?ESDL_getSurface + 1). -define(ESDL_getPixelFormat, ?ESDL_getPalette +1). -define(ESDL_getPixels, ?ESDL_getPixelFormat +1). -define(SDL_WM_IsMaximized, ?ESDL_getPixels +1). %% Sdl additions -define(SDL_SetGamma, ?SDL_WM_IsMaximized +1). -define(SDL_SetGammaRamp, ?SDL_SetGamma +1). -define(SDL_GetGammaRamp, ?SDL_SetGammaRamp +1). -define(SDL_MapRGBA, ?SDL_GetGammaRamp + 1). -define(SDL_GetRGBA, ?SDL_MapRGBA + 1). -define(SDL_GetClipRect, ?SDL_GetRGBA + 1). -define(SDL_SetClipRect, ?SDL_GetClipRect + 1). -define(SDL_DisplayFormatAlpha, ?SDL_SetClipRect + 1). -define(SDL_WM_Maximize, ?SDL_DisplayFormatAlpha +1). esdl-1.2/test/0000755000076400010400000000000011540750060015201 5ustar familjenAdministratöreresdl-1.2/test/Beep.wav0000644000076400010400000000410011540750060016566 0ustar familjenAdministratörerRIFF8WAVEfmt úô9dataţţ˙˙üů "ţŃčřö,(đßćďćŮÝö&# çÖßěčÜÜô'%"ěŮßíęÝŰđ&& ďŮŰěęßÚę"& ôÝŰęëŕ×ć'řŕŮçëăŘá˙' űá×ĺěĺÚáý(!ýăŘäíçÜáű)#ć×âěçŰŢő'#!éŘŕëćŮŮô%# "éŘŕëĺŮÚô&%!#ęŘŕęćÚŮó(& #$ëŘŢęĺŮŮń%%!$ëŘÜčäŘÖí%% #íŮÝéĺŮ×í #%" ďÚÚéçŰ×ë #&! đŰÜęéŢŮë "&!!ôŢÜěěŕ×č% řáŰéíâŘä& !úâŮćëăŘâý% "ţĺÚĺëăŘŕű%! #čŮäíćÚÜö&"!ëÚßëčÜŰď "# đÜÝéčŢŘę !% óÝÜéęŕŮč %őßŰéěăŰç&úăŰčíĺÚă˙& ýĺŰćěăŘŕý%  !ýäÚĺęăŘßű$ ýäÚäęăŘßú&  "ćŮäëäŘŢř%! #çÚäęäŮÝö%! "çÚäëäŮÜö%!!čÚăëćÚÜó$!!ęŰăíčŰÝô#  ěÝăîéÝÜň!   đŢáîëŢÚí "  óßŢěëßŮę#őßÝęëŕŘč$ůăÝéěăŮĺ$ üĺÝçíćŰâý#ţçÜĺíçÜŢö# éÜăíéÝŢô" íÜâíęŕßň !!ďŢŕěëáÜě " óßßěëŕŰë"őáŢěěáÚé"÷áŢëěâÚç"úĺŢéíäÚä˙#ýçÝçíçÜâű"éÝĺîéŢßő"ëÝăíéßŢó!îÝâěęáßń ! ńßáíěâÜě" ôŕßěëáŰë! ôáŕëëáÜë  ôŕŕěëâŰë"őáßëëŕÚé!÷ăŕëëŕŘć÷âáěěâÚç!úäŕííâÚč!#ţúřöőőö÷řúüý˙˙ţýýţ˙esdl-1.2/test/Boing.wav0000644000076400010400000003611411540750060016763 0ustar familjenAdministratörerRIFFD<WAVEfmt +"Vdata <"=ńż¸ş¸Řú*3/+* řđŢĹÇĐĘŇň˙ #/'''÷ďâĚÎ×Ůč &.&ňęŕÓÔĺçňőŘĆďNT^SüŇť¤łśĆô$5SN<5űßן´Č×ĺ˙&.=I<(ŢĎČŔŔŇćô&027+ňÜËĘČÍŕô(+*'őçŐÍÔŘăô#.44<-ӍڙŤŇó 3>@C? úÝÂĹÄÁŇîř (2050úÝĘËÍĎÜű(2+'# üďáĎĎÚŢď úáŃJNKAěĘ­ŽźżŃ ,>SE4. ëÜѡˇÔÜń+1>I5ůŰÎÉžĆÜďţ-/44# ˙éŃËĚËŐęý **)$űďßŃĐŐÜéţ'1-,2$ŰŤ ›¨Ńń /DBGI öὝ˝šÍéý ,:471ýôŘĹĹËĚŰű .61)"ôçŰĚÍŮßđ úŢć/FFB+ňÝĹŞľÉÍă$,@F3'ţŢŮĎżÇŢéü-0;>#ëÓĎĚĹŇëů!.,.(őßÍĎÓŐăů%)"óéŰÔ×Ýćń'*'"&ń´ ŸĽÎí.GGJG óß˝şźźĐč.<770ýń×ĂÁČĐßţ .93)"őăŮĚËÖßíäí0;?4őŮĘłżĐÚň&,;=(öÜ×ĐČŃčó +,41úäÓŃÎÎßő")&% űëßĐÓÚŢđ #% ýíçÚ×Ţçđű #!ůĂŞŚŤĎę,FIID# đÝżťžÁŇé/;85.ěŮÄĂÉŇŕü!062) óâ×ÍĚŘâóéđ*68-óŰĚşĆ×âř'+87" óŰŘŇÎŘěř"**.*űáÔŇÔŐář!'$!öéÝŃŐŢăö""űęäŰÚáęő!ĎˇŽąËă!:CE@-÷áÍżÁÄÎĺü#673+ďÜËĂĘÓŕ÷ *31( ÷ćÚŇĐŮăňîđ#55+ôÜνŔÖŕů)-69" řÚŘŇÍŮęű!,,-(řßÓŇŐÖăű#)% őçÚŇÖßĺř""řčâÜŰáëó   čÄś¸ÄŢţ3AA;/űçÔÂÂČŃâű .82*ńáŃČĘÔáő &00' úëÜŐĐÔâě˙  ńë14.űßŃÁÁ×ß÷')48' üßÚÔĐ×čř)+,(űâÖÓÖ×ář '$!řëŢÖ×Ýäň !űîĺßÚŕčńý őÓż˝ÂÖó':?:0íÚËĂĆÎŰń&11, ÷ęŮÎÉĐßę!).+ńâÚÓŐßęř÷í060 ćÖÄžĐŮď")49- ćŰŐÎŃŕń˙&+.. íÜÔÔŇÜíý $'%ýđâ×ÔŮÝěý #ńčßÚÜăëř ˙áÇŔŔËâ1;;5'öčÓČČÍ×ă˙ *0+#˙đŕŐĚÍŰäú!++!účáÖÔŢćóý űď -50%đŰËÁË×ćţ%-82"đŢ×ĐĎÜěú!(*-$óŕÖŐÓŘéř!$$!őčŮŐŮÝéú!řěäÜÜäéö óŐŔżÁŐů ):=;1 ţńÜÍÄÉŃÚő&42'! úĺÚËĘŐÝđ*.&ńäŰÔ×ŕęö ü˙!-' óÝÓĆÎÜęü$+20 ńŕÚŐÔßńý &'( ôăŘŮŮÝíý#!ţőçÝ×ŰâęüöęĺŢßçíü˙ĺĹžżČë7@?9-őŢĎÁÄĚŐî$26-$úéŰÎÇŃÝęţ!)0* îßŮŇŐáíű üńáÜŐŰěů%%#ůîâßáĺđü !ňíâÝâéňú ńęĺäâęöý  úňěçéěđü  ýřů˙ ÝĘÂÂŰů*:83)őäÖÇČÓŰě,0% öäŰÓÎŘčő#(*!öćŰŰÝáďý ţňůüńđňňý  ú÷÷ńń÷úţ ýôôôňřý ˙úůöńő÷řý˙ýřöö÷řú˙ýüüü˙ $ďĎÁşĆć 7<80űçŐČĹÍÚí#-/"ďÜŃĐŃŕô$+'!ôćÝ×Ýéň ! ňëëđőř  ˙úöóňőú˙  ˙úöóňőřý ˙úöňňóöú ˙úöňđó÷ý ýřőőőřü  *Ńş­ś×%DMF4íŇź˛şĎé#2<9#ôŢÉĹËŐô,4- ňâÖŇŮć˙ ))!îäÜßďü  üôěëđóţ˙óěčěđů  ýöđîďóű ý÷ňňň÷ýýřööřű ţřöőöú +ÜżŞŤĐú0M[J'Ëą§ŤĎň!7JE# áČşżŐđ*99# íŰËÎäő%0, ńáÔÔĺö)( öçŰ×ŕň'* őăŘÚéü$ýéŰŮáóńĺŕĺđ˙őęĺčó  őëéí÷ ÷ďëń÷ ôďďô çÂŻąŘEYW:řĎŚĽ¸á@VHńŔŽľÎ#BD( ÝČŔÍő1;1úÝĎŇć,+ęÜÜéţ"öęĺíú ůíçířůíçëő  úńďóú ý÷óó÷˙ üöóôů˙˙úůúý˙ýüü˙˙˙˙˙ äÍÎé8@( ÝÂżŐ52ňÖËŐń&$űăŮÝô íăçôőíěö  úóôú űňďô üôôü řóôű ˙ű÷öű˙ýúúűý˙űúúü˙˙üüüü˙˙üüüý˙˙˙üüü˙˙˙˙ űäáđ&üăÝçö ňęđú öóů˙ű÷÷üű÷řýüůřüű÷öůňěęôôđôţ ˙ňđú ţôôü űö÷ţýúřů˙üúúü˙˙üúü˙˙ýüüý˙˙ýűúü˙˙ýüü˙ ńćđ˙ ëáí˙  ýďëô űôóú˙ůřůţ˙úúýýúúýýúřřúűíęďúîîúúňö ü÷÷ü ůřű˙üúúýýúűý˙˙ýűúü˙ţűúűýýűűüý˙üüý˙űěíůňäęű ˙ôěň úőőú˙ů÷ú˙ýűü˙ţüűý˙űúűűýýďčěřďîúöňö üőöţ˙ůřý˙úůü˙üůü˙˙ýűűţţüűý˙˙ţýýţ˙˙˙ţý˙˙˙˙őěńü ëćńýüîîů ůóőţüřřüüůü˙˙űűţţüúúűüřäâđ  öćéűňí÷úóôý ţ÷őúű÷řţţúůű˙˙üúűţ˙ţűűüţ˙ţűűý˙˙ţýý˙˙˙˙˙÷ňő  ýóíń˙ ţ÷ńôţ ţůőřţ˙üůúýţűűţýűűüţ˙ýúřü ęÚÝ÷&&ňááó űëćôţńěô  ˙őďňý ůňóű üôóůţţř÷úţ˙űůúüţüűü˙ţýý˙ţűűţüúůúţýűűý˙˙ţýýţ˙˙˙ýý˙˙˙ýýýţţýüúřöőű !%ůŢĐÚô-/ éŮÜë% ůćăđü üňěďű ÷óó÷˙ţřöřú˙ţúřůü˙˙ţűúűý˙ţüűý˙˙ţüýţ˙ţűűűţţüűűţţüűüţ˙˙ýýţ˙˙˙˙˙üúúůřřööř-*řŐÉĚŢ 9=)ë×ÉĐě#00#ňÚÔÜé%&đâÚŢîýřçâäëü ýńéçěö  ÷ďíîôý ţřóóőůţ˙ţ˙úőóőůţ ůőôőů˙ ˙üůřúúţ˙űúúüüý˙ţýü÷őóó*-"đÝÍÍßň$33'ůçŘÖÜé#($řĺŢÚáň˙ őčáŕçó  őëĺĺěő  řďęęđř  úôđđôřţ ýů÷ö÷üţ ˙üůřřúü˙˙ţűůřůüţ˙üřőôóôő÷ű&)$ţíŘŃÔŢô&,* ˙íáÚÜäň##óćßßăîü öęääçîůűńęćčî÷ţöďëëíôú  ţöôńńňôúţ  üőđđńöú ůöôóôřü˙ ţűřőőöůűţ˙üü úđčćéđú˙÷đěěďőý  ˙÷ńíîńöý  ý÷óđđóřý ýřôňóöů˙ üůőôöřý ůíéĺčóűýđëçčíó˙ üőďěěđőţ  ˙řóđďň÷ý ˙úóďîńöţ  ýöňńńőú˙ ýöóňóöű ˙řöňôöú űřöö÷ú˙˙űů÷ůúýüîçăäîúříäâäëő ţóëčçíôţ úóîíďôü  ýůöőöůţ  ˙úőôő÷ţ ýřőóő÷ţ űřőőöř˙űůööůúűúřřűý˙üűűţ řëäáčő÷ëăăčńýýóëéęđú  úňîďóű  ýůőőőöű  üöđďňř űôńńôű  ˙řôňóůţ ű÷óó÷ű ţůöőöű˙ ˙üř÷÷úţýűűü˙ ţđčäçô űďĺâçň˙  ňěčéôý ÷ńîî÷ţ ůőóőűýýýý˙ýüýţţýűűüţýýűýý˙ţýýý˙˙ţţţ˙ţţţ˙˙ţ˙ öđěíř÷éĺęń  öîéëőţ űńďńö űőóóú ˙ţţýýţ˙ýüüýýýýţ˙ýýţ˙ţýýý˙˙ýüüý˙ţýýţ˙ţţţţůööú˙ űóňőú ˙÷ôô÷ţ ýřőöü˙üůřůü˙üý űôńôü ţöňóú  úőó÷ţ ý÷ôöú˙ű÷÷úţýřřúü˙űůůű˙ýüűűýţýýţýűűüýűůúýýűűűýýüűüţ˙ýűűüý˙ řđíđú ÷đîóü ˙÷ńńőű  ˙÷ňňöţ ţůőőřü ˙řööřý˙űř÷úüüűúűý˙üüüý˙ýüüýţýüüý˙˙ýüüý˙˙ýüüüüýýýţ üňěëďüűđíďô˙ úńďň÷  ţůňňôů ţůôóőů ţúőő÷úűůřřűţţűůůűýţűůůűţüúůůűţ˙üúúűý˙ýúůůůűü˙ ÷đéęńů ůđíďóü ůóđđôú  űôńńôű ü÷ôôöú˙ ˙ú÷÷÷ű˙ýűůůűţýüţ˙üüüüţţýüüý˙˙ýýýýţ˙ţýüúüţ  ýöđîđôü  ˙ůóňňőű ü÷óóôřţ ţúőőőřü˙üůööřűţ˙üúůůűýţüúúűü˙ţýüüüý˙ţýýýýţ˙˙ţţýýýţ˙˙ ˙ü÷őőöú˙ ˙űřööřű˙ ˙űů÷÷řű˙˙üůřřůűţ˙üúůůúűţ˙ýűúúűý˙ýűřř÷řý ţů÷ööřűţüůřřůüţýűúúűý˙ţüűúűüţ˙üűűűý˙˙ýüűűüţ˙ţýűűüüţ˙ţýüýýţ˙˙ţţýţţ˙ýřöőőúţ ţůöőő÷ü˙˙üů÷÷ůü˙˙ýűűüţ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú÷őőřý ü÷ôô÷ű˙ üř÷÷ůýţüúúý˙ýűúűý˙ţüůůüţ˙ýúúűý˙ýúúűý˙ţűűűýţüüüţ˙ýýý˙˙˙ţţ˙˙űř÷řű˙ ü÷őöú˙˙ú÷÷ůýţüúúü˙˙ýýýţţ˙˙üűüý˙üűüý˙˙üüüýţýüý˙˙ţýýţ˙˙ýýý˙˙ţţţ˙˙˙ţ˙˙˙ýüüţţűúúý˙˙ýúúűţ˙ýűüý˙ýýý˙˙ţţţ˙˙ţţţ˙˙˙ţţ˙ţţţ˙˙ţţ˙˙˙˙˙˙˙˙ţţţţţţ˙ţţţţţţ˙ţ˙˙˙üüü˙˙üüü˙˙ýýţ˙˙ţýţ˙˙ţýţ˙˙ţţţ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ýüü˙ţüüţ˙ýýţ˙˙ýýţ˙˙ýý˙˙ţţ˙˙˙˙˙˙˙˙˙˙˙˙˙ýüüţ˙ýüüţýýýţ˙ţýýţ˙ţţţţ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ţýüýţţýýý˙ţýýţ˙ţýýţţţţţ˙ţţ˙˙˙˙˙˙˙˙ţýýţ˙ţţţ˙˙ţţ˙˙˙ţ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙esdl-1.2/test/erldemo.erl0000644000076400010400000003534311540750060017344 0ustar familjenAdministratörer%% Copyright (c) 2001 Dan Gudmundsson %% See the file "license.terms" for information on usage and redistribution %% of this file, and for a DISCLAIMER OF ALL WARRANTIES. %% %% $Id$ %% %%%---------------------------------------------------------------------- %%% File : erldemo.erl %%% Author : Dan Gudmundsson %%% Purpose : Show that erlang can do opengl. %%% Created : 11 Sep 2000 by Dan Gudmundsson %%%---------------------------------------------------------------------- -module(erldemo). -author('dgud@erix.ericsson.se'). -include_lib("wx/include/gl.hrl"). -include("sdl.hrl"). -include("sdl_events.hrl"). -include("sdl_audio.hrl"). -include("sdl_video.hrl"). -include("sdl_keyboard.hrl"). -export([go/0, go/1]). -compile(export_all). -define(W, 640). -define(H, 480). go() -> go([window]). go(Mode) -> %% Init Wrapper = sdl:init(?SDL_INIT_VIDEO bor ?SDL_INIT_AUDIO bor ?SDL_INIT_ERLDRIVER bor ?SDL_INIT_NOPARACHUTE), Audio = audio_server(not lists:member(no_audio,Mode)), sdl_events:eventState(?SDL_ALLEVENTS ,?SDL_IGNORE), sdl_events:eventState(?SDL_KEYDOWN ,?SDL_ENABLE), sdl_events:eventState(?SDL_QUIT ,?SDL_ENABLE), Flags = case lists:member(fullscreen, Mode) of true -> ?SDL_OPENGL bor ?SDL_FULLSCREEN; _ -> ?SDL_OPENGL end, sdl_video:gl_setAttribute(?SDL_GL_DOUBLEBUFFER, 1), R = sdl_video:setVideoMode(?W, ?H, 16, Flags), %% Get Ready for events initWin(), Texture = loadTexture("Powered.bmp", false), Bump = loadTexture("PoweredBump.bmp", true), Verts = {{ 0.5, 0.5, -0.5}, %1 { 0.5, -0.5, -0.5}, %2 {-0.5, -0.5, -0.5}, {-0.5, 0.5, -0.5}, %4 {-0.5, 0.5, 0.5}, { 0.5, 0.5, 0.5}, %6 { 0.5, -0.5, 0.5}, {-0.5, -0.5, 0.5}}, %8 %% Faces Normal U-axis V-axis Faces = [{{1,2,3,4},{0,0,-1},{-1,0,0}, {0,1,0}}, % {{3,8,5,4},{-1,0,0},{0,0,1}, {0,1,0}}, % {{1,6,7,2},{1,0,0}, {0,0,-1}, {0,1,0}}, % {{6,5,8,7},{0,0,1}, {1,0,0}, {0,1,0}}, % {{6,1,4,5},{0,1,0}, {-1,0,0}, {0,0,1}}, % {{7,8,3,2},{0,-1,0},{1,0,0}, {0,0,1}}], Data = {Faces, Verts}, BumpPossible = is_bump_possible(), put(bumpPossible, BumpPossible), io:format("Press 'c' to toggle texture.~n" "Press 'b' to toggle bumpmap.~n" "Press 'q' or 'Esc' to quit.~n"), {Time, Frames} = timer:tc(?MODULE, drawBox, [Audio, Data, 0, 5.0, {0.0, 0.0, 0.0}, {0.04, 0.05, 0.06}, {0.2, unknown}, {Texture,Bump}, true, BumpPossible ]), Secs = Time / 1000000, io:format("FPS: ~p (Frames ~p)~n", [catch Frames/Secs, Frames]), cleanup_audio(Audio), sdl:quit(), ok. is_bump_possible() -> Ext = gl:getString(?GL_EXTENSIONS), Exts = string:tokens(Ext, " "), GLVerHasDOT3 = case gl:getString(?GL_VERSION) of "1.3" ++ _ -> true; "1.4" ++ _ -> true; _ -> false end, HasExtensions = lists:member("GL_ARB_texture_env_dot3", Exts) and lists:member("GL_ARB_multitexture", Exts), HasExtensions or GLVerHasDOT3. initWin() -> gl:viewport(0,0,?W,?H), gl:matrixMode(?GL_PROJECTION), gl:loadIdentity(), glu:perspective(30.0, ?W/?H, 0.1, 30.0), gl:matrixMode(?GL_MODELVIEW), gl:loadIdentity(), gl:enable(?GL_DEPTH_TEST), gl:depthFunc(?GL_LEQUAL), gl:enable(?GL_CULL_FACE), gl:materialfv(?GL_FRONT_AND_BACK, ?GL_DIFFUSE, {0.7,0.7,0.7,1.0}), gl:materialfv(?GL_FRONT_AND_BACK, ?GL_AMBIENT, {0.6,0.6,0.6,1.0}), gl:materialfv(?GL_FRONT_AND_BACK, ?GL_SPECULAR,{0.7,0.7,0.7,1.0}), gl:materialf(?GL_FRONT_AND_BACK, ?GL_SHININESS, 80.2), gl:lightModelfv(?GL_LIGHT_MODEL_AMBIENT, {0.3,0.3,0.3,1.0}), gl:enable(?GL_LIGHT0), gl:lightfv(?GL_LIGHT0, ?GL_DIFFUSE, {0.7,0.7,0.7,1}), gl:lightfv(?GL_LIGHT0, ?GL_SPECULAR, {0.7,0.7,0.7,1}), gl:enable(?GL_TEXTURE_2D), gl:shadeModel(?GL_SMOOTH), gl:clearColor(0.5,0.5,0.9,1.0). draw_quads({Faces, Verts},Mode) -> gl:'begin'(?GL_QUADS), draw_quads2(Faces, Verts,Mode). draw_quads2([{{V1,V2,V3,V4},N,Ut,Vt}|R],Cube, color) -> gl:normal3fv(N), gl:texCoord2f(0.0, 1.0), gl:vertex3fv(element(V1, Cube)), gl:texCoord2f(0.0, 0.0), gl:vertex3fv(element(V2, Cube)), gl:texCoord2f(1.0, 0.0), gl:vertex3fv(element(V3, Cube)), gl:texCoord2f(1.0, 1.0), gl:vertex3fv(element(V4, Cube)), draw_quads2(R,Cube,color); draw_quads2([{{V1,V2,V3,V4},N,Ut,Vt}|R],Cube, Light) -> X = dot(Ut,Light), Y = dot(Vt,Light), Z = dot(N,Light), gl:color3fv(norm_rgb(X,Y,Z)), gl:normal3fv(N), gl:multiTexCoord2f(?GL_TEXTURE0,0.0, 1.0), gl:multiTexCoord2f(?GL_TEXTURE1,0.0, 1.0), gl:vertex3fv(element(V1, Cube)), gl:multiTexCoord2f(?GL_TEXTURE0,0.0, 0.0), gl:multiTexCoord2f(?GL_TEXTURE1,0.0, 0.0), gl:vertex3fv(element(V2, Cube)), gl:multiTexCoord2f(?GL_TEXTURE0,1.0, 0.0), gl:multiTexCoord2f(?GL_TEXTURE1,1.0, 0.0), gl:vertex3fv(element(V3, Cube)), gl:multiTexCoord2f(?GL_TEXTURE0,1.0, 1.0), gl:multiTexCoord2f(?GL_TEXTURE1,1.0, 1.0), gl:vertex3fv(element(V4, Cube)), draw_quads2(R,Cube,Light); draw_quads2([],_,_) -> gl:'end'(), ok. drawBox(Audio, Cube, N, R, Pos, Vel, Speed = {S, T0}, {Txt,BumpTxt}, Color, BumpMap) -> gl:clear(?GL_COLOR_BUFFER_BIT bor ?GL_DEPTH_BUFFER_BIT), {NewPos = {X, Y, Z}, NewVel} = calc_pos(Audio, Pos, Vel, S), gl:loadIdentity(), gl:lightfv(?GL_LIGHT0, ?GL_POSITION, {0,10,10,1}), gl:lightfv(?GL_LIGHT0, ?GL_SPOT_DIRECTION, {0,0,-1}), gl:lightf(?GL_LIGHT0, ?GL_SPOT_CUTOFF, 45), gl:translatef(X, Y, Z-3.0), RotV = {0.5,0.5,1.0}, gl:rotatef(R, element(1,RotV),element(2,RotV),element(3,RotV)), case BumpMap of true -> Rot = rotate(-R, RotV), LightInObjectSpace = mul_point(Rot, {0.0,10.0,10.0}), %% Setup first texture stage to DOT the color (which contains the %% light vector in tangent space) with the pre-filtered height map. gl:disable(?GL_BLEND), gl:activeTexture(?GL_TEXTURE0), gl:enable(?GL_TEXTURE_2D), gl:bindTexture(?GL_TEXTURE_2D,BumpTxt), gl:texEnvi(?GL_TEXTURE_ENV, ?GL_TEXTURE_ENV_MODE, ?GL_COMBINE), gl:texEnvi(?GL_TEXTURE_ENV, ?GL_COMBINE_RGB, ?GL_DOT3_RGB), gl:texEnvi(?GL_TEXTURE_ENV, ?GL_SOURCE0_RGB, ?GL_PRIMARY_COLOR), gl:texEnvi(?GL_TEXTURE_ENV, ?GL_SOURCE1_RGB, ?GL_TEXTURE), %% Setup the second texture stage to modulate the previous dot product %% and the the base texture. gl:activeTexture(?GL_TEXTURE1), case Color of true -> gl:enable(?GL_TEXTURE_2D); false -> gl:disable(?GL_TEXTURE_2D) end, gl:bindTexture(?GL_TEXTURE_2D,Txt), gl:texEnvi(?GL_TEXTURE_ENV, ?GL_TEXTURE_ENV_MODE, ?GL_COMBINE), gl:texEnvi(?GL_TEXTURE_ENV, ?GL_COMBINE_RGB, ?GL_MODULATE), gl:texEnvi(?GL_TEXTURE_ENV, ?GL_SOURCE0_RGB, ?GL_TEXTURE), gl:texEnvi(?GL_TEXTURE_ENV, ?GL_SOURCE1_RGB, ?GL_PREVIOUS), draw_quads(Cube,LightInObjectSpace), %% Disable texturing for TEXTURE1 gl:disable(?GL_TEXTURE_2D), %% and for texture0 gl:activeTexture(?GL_TEXTURE0), gl:disable(?GL_TEXTURE_2D); false -> gl:enable(?GL_LIGHTING), case Color of true -> gl:enable(?GL_TEXTURE_2D), gl:bindTexture(?GL_TEXTURE_2D,Txt), gl:color3f(1,1,1), gl:texEnvi(?GL_TEXTURE_ENV, ?GL_TEXTURE_ENV_MODE, ?GL_MODULATE), draw_quads(Cube,color); false -> gl:disable(?GL_TEXTURE_2D), draw_quads(Cube,color) end end, % if Color == true -> % if BumpMap == true -> % gl:enable(?GL_BLEND), % gl:blendFunc(?GL_DST_COLOR,?GL_ZERO); % true -> ignore % end, % gl:enable(?GL_TEXTURE_2D), % gl:bindTexture(?GL_TEXTURE_2D,Txt), % gl:color3f(1,1,1), % gl:texEnvi(?GL_TEXTURE_ENV, ?GL_TEXTURE_ENV_MODE, ?GL_MODULATE), % draw_quads(Cube,color); % Color == false, BumpMap == false -> % gl:disable(?GL_TEXTURE_2D), % draw_quads(Cube,color); % Color == false -> % ok % end, gl:disable(?GL_BLEND), gl:disable(?GL_LIGHTING), check_error("DrawCube"), T1 = sdl_video:gl_swapBuffers(), case check_event(Color,BumpMap) of {NewCol, NewBump} -> NewS = calc_speed(Speed, T1), timer:sleep(10), drawBox(Audio, Cube, N + 1, R + (3 * S),NewPos, NewVel, NewS,{Txt,BumpTxt},NewCol,NewBump); quit -> N + 1 end. calc_pos(Audio, {X, Y, Z}, {Vx, Vy, Vz}, S) -> NX = X + S*Vx, NY = Y + S*Vy, NZ = Z + S*Vz, Nvx = if NX > 1.0; NX < -1.0 -> play(Audio, {nx, NX}), Vx * -1; true -> Vx end, Nvy = if NY > 1.0; NY < -1.0 -> play(Audio, {ny, NY}), Vy * -1; true -> Vy end, Nvz = if NZ > 0.0; NZ < -10.0 -> play(Audio, {nz, NZ}), Vz * -1; true -> Vz end, {{NX, NY, NZ}, {Nvx, Nvy, Nvz}}. calc_speed({S, unknown}, T1) -> {S, T1}; calc_speed({S, T0}, T1) -> SPF = 0.2 + ((T1 - T0) / 1000), %% Last frame took Diff = (SPF - S) / 100, NS = S + Diff, {NS, T1}. loadTexture(File, Bump) -> Ref = case sdl_video:loadBMP(File) of null -> io:format("Couldn't load BMP file: ~p ~n", [File]), exit(load_bmp); SR -> SR end, Image = sdl_video:getSurface(Ref), Format = sdl_video:getPixelFormat(Image), Size = Image#sdl_surface.w * Image#sdl_surface.h * 3, Mem0 = sdl_util:malloc(Size, ?GL_UNSIGNED_BYTE), sdl_util:copySdlImage2GLArray(Image, Mem0, 3), %% Convert 2 GL format Mem = case Bump of true -> Map = bumpmap(Mem0, Image#sdl_surface.w, Image#sdl_surface.h), io:format("Bumped~n"), Map; false -> Mem0 end, [Ture] = gl:genTextures(1), gl:bindTexture(?GL_TEXTURE_2D, Ture), gl:texParameteri(?GL_TEXTURE_2D, ?GL_TEXTURE_MAG_FILTER, ?GL_LINEAR), gl:texParameteri(?GL_TEXTURE_2D, ?GL_TEXTURE_MIN_FILTER, ?GL_LINEAR), gl:texParameteri(?GL_TEXTURE_2D, ?GL_TEXTURE_WRAP_S, ?GL_CLAMP), gl:texParameteri(?GL_TEXTURE_2D, ?GL_TEXTURE_WRAP_T, ?GL_CLAMP), gl:texImage2D(?GL_TEXTURE_2D, 0, 3, Image#sdl_surface.w, Image#sdl_surface.h, 0, ?GL_RGB, ?GL_UNSIGNED_BYTE, Mem), sdl_util:free(Mem0), sdl_video:freeSurface(Image), Ture. check_error(Str) -> case {gl:getError(), sdl:getError()} of {0, ""} -> ok; {GL, SDL} -> io:format("In ~s Errors Reported GL ~p SDL ~s~n", [Str, GL, SDL]) end. check_event(ColMap, BumpMap) -> case sdl_events:pollEvent() of #quit{} -> quit; no_event -> {ColMap,BumpMap}; Quit when is_record(Quit, keyboard) -> if Quit#keyboard.sym == ?SDLK_ESCAPE -> quit; Quit#keyboard.sym == ?SDLK_q -> quit; Quit#keyboard.sym == ?SDLK_b -> {ColMap,get(bumpPossible) and not BumpMap}; Quit#keyboard.sym == ?SDLK_c -> {not ColMap,BumpMap}; true -> io:format("Got event ~p~n", [Quit]), {ColMap,BumpMap} end; Event -> io:format("Got event ~p~n", [Event]), {ColMap,BumpMap} end. play(no_audio, Reason) -> ok; play(Sample, Reason) -> %% io:format("eplay ~p ~n", [Reason]), sdl_audio:play_audio(Sample, 1). cleanup_audio(no_audio) -> ok; cleanup_audio(Sample) -> sdl_audio:freeWAV(Sample). audio_server(false) -> ok; audio_server(_) -> {ASpec, Sample} = sdl_audio:loadWAV("Beep.wav"), MySpec = ASpec#audiospec{samples = 1024}, %, format=?AUDIO_U8}, case catch sdl_audio:openAudio(MySpec, true) of {'EXIT', _} -> io:format("Failed to open Audio, ignoring sound ~n", []), sdl_audio:freeWAV(Sample), no_audio; ObtainedFormat -> % io:format("Audio Spec's:~n~p~n~p~n~p~n", % [ASpec, MySpec, ObtainedFormat]), ConvS = sdl_audio:convertAudio(ASpec, ObtainedFormat, Sample), sdl_audio:freeWAV(Sample), %% Clean old sample sdl_audio:pauseAudio(false), ConvS end. bumpmap(Mem,PW,PH) -> W = PW*3, <> = sdl_util:readBin(Mem,PW*PH*3), bumpmap(Row1,Row2,Rest,W,Row1,[]). bumpmap(R1,<<>>,<<>>,W,First,Bump) -> <> = R1, Row = bumpmapRow(R1,First,F,[]), list_to_binary(lists:reverse([Row|Bump])); bumpmap(R1,R2,<<>>,W,First,Bump) -> <> = R1, Row1 = bumpmapRow(R1,R2,F,[]), Row2 = bumpmapRow(R2,First,F,[]), list_to_binary(lists:reverse([Row2,Row1|Bump])); bumpmap(R1,R2, Rest0,W,First,Bump) -> <> = R1, Row = bumpmapRow(R1,R2,F,[]), <> = Rest0, bumpmap(R2,R3,Rest,W,First,[Row|Bump]). bumpmapRow(<<>>,<<>>,_,Br) -> list_to_binary(lists:reverse(Br)); bumpmapRow(R1,R2,F,BR) -> <> = R1, %% Should be greyscale <> = R2, %% so Green Blue channels ToFloat = 1.0/255.0, C = C0*ToFloat, Cx = case Row1 of <> -> Cx0*ToFloat; <<>> -> F*ToFloat end, Cy = Cy0*ToFloat, Scale = 4.0, DCX = Scale * (C-Cx), DCY = Scale * (C-Cy), %% Normalize Sqlen = DCX*DCX+DCY*DCY+1, Recip = 1.0/math:sqrt(Sqlen), Nx = DCY*Recip, Ny = -DCX*Recip, Nz = Recip, %% Pack in RGB RGB = [round(128.0+127.0*Nx), round(128.0+127.0*Ny), round(128.0+127.0*Nz)], bumpmapRow(Row1,Row2,F,[RGB|BR]). dot({V10,V11,V12}, {V20,V21,V22}) -> V10*V20 + V11*V21 + V12*V22. norm(V1, V2, V3) when is_float(V1), is_float(V2), is_float(V3) -> D = math:sqrt(V1*V1+V2*V2+V3*V3), case catch {V1/D,V2/D,V3/D} of {'EXIT',_} -> {0.0,0.0,0.0}; R -> R end. norm_rgb(V1, V2, V3) when is_float(V1), is_float(V2), is_float(V3) -> D = math:sqrt(V1*V1+V2*V2+V3*V3), case catch {0.5+V1/D*0.5,0.5+V2/D*0.5,0.5+V3/D*0.5} of {'EXIT',_} -> {0.0,0.0,0.0}; R -> R end. rotate(A0, {X,Y,Z}) when is_float(X), is_float(Y), is_float(Z) -> A = A0*3.14159/180, CosA = math:cos(A), SinA = math:sin(A), XSinA = X*SinA, YSinA = Y*SinA, ZSinA = Z*SinA, {C2,C3, C4,C6, C7,C8} = {-ZSinA,YSinA, ZSinA,-XSinA, -YSinA,XSinA}, {U1,U2,U3,U4,U5,U6,U7,U8,U9} = {X*X,X*Y,X*Z, Y*X,Y*Y,Y*Z, Z*X,Z*Y,Z*Z}, S = CosA, NegS = -S, {U1+S*(1.0-U1), U4+NegS*U4+C4, U7+NegS*U7+C7, U2+NegS*U2+C2, U5+S*(1.0-U5), U8+NegS*U8+C8, U3+NegS*U3+C3, U6+NegS*U6+C6, U9+S*(1.0-U9), 0.0,0.0,0.0}. mul_point({A,B,C,D,E,F,G,H,I,Tx,Ty,Tz}, {X,Y,Z}) when is_float(A),is_float(B),is_float(C),is_float(D), is_float(E),is_float(F),is_float(G),is_float(H), is_float(I),is_float(Tx),is_float(Ty),is_float(Tz), is_float(X), is_float(Y), is_float(Z) -> share(X*A + Y*D + Z*G + Tx, X*B + Y*E + Z*H + Ty, X*C + Y*F + Z*I + Tz). share(X, X, X) -> {X,X,X}; share(X, X, Z) -> {X,X,Z}; share(X, Y, Y) -> {X,Y,Y}; share(X, Y, X) -> {X,Y,X}; share(X, Y, Z) -> {X,Y,Z}. esdl-1.2/test/icon.bmp0000644000076400010400000000110211540750060016623 0ustar familjenAdministratörerBMBB( m m ˙˙˙˙˙"""""!"!!""!""""!""""""""!""""""""""""""!""""""""!""""""""""""""""""""""""""""""""""""""""!""""""""!""""""""""""""!""""""""""esdl-1.2/test/Makefile0000644000076400010400000000114411540750060016641 0ustar familjenAdministratörer# Copyright (c) 2001 Dan Gudmundsson # See the file "license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. # # $Id$ # TestMods = testsprite testgl testbin erldemo testaudio testjoy test_glfont test_ttf test_glimg TestTargets = $(TestMods:%=%.beam) # Targets target: $(TestTargets) clean: rm -f $(TestTargets) rm -f *~ core erl_crash.dump # Rules ESRC = . EBIN = . ERLC = erlc ERLINC = ../include ERL_COMPILE_FLAGS = -pa ../../esdl/ebin %.beam: $(ESRC)/%.erl $(ERLC) -W -I$(ERLINC) -bbeam $(ERL_FLAGS) $(ERL_COMPILE_FLAGS) -o$(EBIN) $< esdl-1.2/test/Makefile.win320000644000076400010400000000161111540750060017601 0ustar familjenAdministratörer# Copyright (c) 2001 Dan Gudmundsson # See the file "license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. # # $Id$ # ESRC = . EBIN = . ERLC = erlc ERLINC = ..\include ERL_FLAGS = -I..\.. -I$(ERLINC) ERL_COMPILE_FLAGS = -pa ..\..\esdl\ebin !if !exist(..\ebin) ! if [mkdir ..\ebin] ! error "esdl: cannot create ..\priv" ! endif !endif TestTargets = \ $(EBIN)\testsprite.beam \ $(EBIN)\testgl.beam \ $(EBIN)\testbin.beam \ $(EBIN)\erldemo.beam \ $(EBIN)\testaudio.beam \ $(EBIN)\testjoy.beam REMOVE_FILES=$(TestTargets:.beam=.removed) .SUFFIXES: .erl .beam .removed # Targets target: $(TestTargets) clean: $(REMOVE_FILES) {$(EBIN)}.beam{$(EBIN)}.removed: -del $(*R).beam # Rules {.}.erl{$(EBIN)}.beam: $(ERLC) -W -bbeam $(ERL_FLAGS) $(ERL_COMPILE_FLAGS) -o$(EBIN) $(*B).erl esdl-1.2/test/Powered.bmp0000644000076400010400000020175611540750060017321 0ustar familjenAdministratörerBMîî(m m îî˙˙˙!!!)))111999BBBJJJRRRZZZccckkksss{{{„„„ŒŒŒ”””œœœĽĽĽ­­­ľľľ˝˝˝ĆĆĆÎÎÎÖÖÖŢŢŢçççďďď÷÷÷ççďďď÷÷÷˙ĆĆÎÖÖŢŢŢçľľ˝˝˝Ć””œœœĽss{çç÷kks{{„ŢŢďĆĆÖRRZZZcJJRBBJss„))1JJZ!ďçď÷ď÷˙÷˙ÖÎÖŢÖŢçŢç­Ľ­Œ„ŒskscZcRJRJBJB9B)!)çŢďƽ윭B9J!)ďç÷÷ď˙ÖÎŢÎĆÖνŢRJZĽ”ľ1)9ŢÖ罵Ɯ”ĽŢÎďÖĆçZRcľœÖ­”ÎνçƵބsœkZ„Œk˝„cľkJœ˝­ÖĽŒÎRBk”sĆR9{J1skB­c9ĽZ1œ1ZJœB”)çŢ÷ƽք{”œ„Ć„c˝{Zľ!1sR­cBœR1Œc9­Z1ĽR)œ9ŒB!Z)s1„ÎĆŢ­œÎJBZŒ{­”{Ìs˝„kľsZĽJ9kkRœsRľkJ­cBĽR1”J)ŒB!„R)Ľ1cJ!œ9{B”1s9Œ1„9”!c){1ŒŢÖďÖÎ罾ξ­Ćœ”­”ŒĽ˝­ŢľĽÖ”„ľ91Jœ„Î1)B„k˝ZBŒ9)ZcB­Z9ĽB){J)”!Bœ9”!Z1Œ1J!k)„­œÖĽ”΄s­ŒsĆ{cľsZ­R9ŒR1ĽJ)œ)c1”R!s)ŒĆ˝ŢĽœ˝„{œcZ{œŒĆ”„˝ZJ„{c˝sZľ!9B)„)k!c9ZÖÎďÎĆ羭έĽĆœ”ľZRsœŒÎ”„Ć)!BJ!BĆ˝çB9c˝ľŢľ­Ö) íííííííííííííííííííííííííííí íííííí ííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííí ííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííí íííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííí íííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííí íííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííí íííííííííííí ííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííí íííííííííííííííííííííí íííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííí ííííííííííííííííííí ííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííí ííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííí ííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííí ííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííí íííííííííííííííííí ííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííí íííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííí ííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííí ííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííí ííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííí ííííííííííííííí íííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííí ííííííííííííí íííííí ííííí íííííííííííííííííííííííííííííííííííííííí ííííííííí íííííííííííííííííííííííííííííííí˘˘Ě˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘Ě˘˘˘ĚŔx˘˘˘˘˘˘Ě˘˘Ě˘˘˘˘˘˘˘Ě̢˘˘Ě ̢˘Ě˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘Ě˘Ě˘˘˘˘˘˘Ŕ‘̢˘Ě˘˘Ě˘˘˘ĚĚ̢̢˘˘˘˘˘˘ ˘˘Ě˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘Ě˘˘‘˘˘˘˘Ě˘˘Ě˘˘˘˘˘˘˘Ě̢˘˘Ě ̢˘Ě˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘Ě˘Ě˘˘˘˘Ě˘˘Ě˘˘Ě˘˘˘ĚĚ̢̢˘˘˘˘˘˘ ˘˘Ě˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘Ě˘Ě˘˘Ě˘˘Ě˘˘˘˘˘˘˘Ě̢˘˘Ě ̢˘Ě˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘Ě˘Ě˘˘˘!˘˘˘Ě˘˘˘ĚĚ̢̢˘˘˘˘˘˘ ˘˘Ě˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘Ł¤˘Ě˘˘Ě˘˘˘˘˘˘˘Ě̢˘˘Ě ̢˘Ě˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘Ě˘Ě˘m<Ŕœ˘˘˘Ě̢˘Ě˘Ě̊‘˘Ě˘˘˘ĚĚ̢̢˘˘˘˘˘˘ ˘˘Ě˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘¤Ě˘˘˘˘˘˘Ě˘˘˘˘˘˘˘˘˘Ě˘˘˘œ¤˘˘˘Ě˘˘˘˘˘˘˘Ě̢˘˘Ě ̢˘Ě˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘Ě˘Ě€˘˘˘˘˘˘˘˘˘˘˘˘Ě̢˘Ě˘Ě˘˘˘˘ĚĚĚẸ̢̌˘˘ĚĚ̢̢˘˘˘˘˘˘ ˘˘Ě˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘ŞĚ̢˘˘˘˘˘˘˘˘˘˘Ě˘˘˘˘˘˘˘˘˘Ě˘˘˘ĚĚĚĚ̢eŁ˘Ě˘˘˘˘˘˘˘Ě̢˘˘Ě ̢˘Ě˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘ĚĚ ˘˘Ě˘˘˘˘˘˘˘˘˘˘˘˘˘˘Ě̢˘Ě˘Ě˘˘˘˘˘˘˘˘˘˘ĚĚ̀€˘˘ĚĚ̢̢˘˘˘˘˘˘ ˘˘Ě˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘ĚĚ̢˘˘˘˘˘˘˘˘˘˘˘˘˘Ě˘˘˘˘˘˘˘˘˘Ě˘˘˘ĚĚĚĚ̢˘˘˘˘e̢˘˘˘˘˘˘Ě̢˘˘Ě ̢˘Ě˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘Ô¤˘˘˘˘˘Ě˘˘˘˘˘˘˘˘˘˘˘˘˘˘Ě̢˘Ě˘Ě˘˘˘˘˘˘˘˘˘˘ĚĚ̢˘˘Ě¤!˘ĚĚ̢̢˘˘˘˘˘˘ ˘˘Ě˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘‘˘˘˘Ě̢˘˘˘˘˘˘˘˘˘˘˘˘˘Ě˘˘˘˘˘˘˘˘˘Ě˘˘˘ĚĚĚĚ̢˘˘˘˘Ě˘˘˘‘˘˘˘˘˘˘Ě̢˘˘Ě ̢˘Ě˘˘˘˘˘˘˘˘˘˘˘˘˘˘Ł˘˘˘˘˘˘˘˘Ě˘˘˘˘˘˘˘˘˘˘˘˘˘˘Ě̢˘Ě˘Ě˘˘˘˘˘˘˘˘˘˘ĚĚ̢˘˘Ě˘Ě˘ŁĚĚ̢̢˘˘˘˘˘˘ ˘˘Ě˘˘˘˘˘˘˘˘˘˘˘˘˘˘Ě˘˘˘˘˘˘Ě̢˘˘˘˘˘˘˘˘˘˘˘˘˘Ě˘˘˘˘˘˘˘˘˘Ě˘˘˘ĚĚĚĚ̢˘˘˘˘Ě˘˘˘˘Ě‘!˘˘˘˘˘Ě̢˘˘Ě ̢˘Ě˘˘˘˘˘˘˘˘˘˘˘˘˘˘Ě˘˘˘˘˘˘˘˘Ě˘˘˘˘˘˘˘˘˘˘˘˘˘˘Ě̢˘Ě˘Ě˘˘˘˘˘˘˘˘˘˘ĚĚ̢˘˘Ě˘Ě˘˘˘˘€˘˘Ě˘˘˘˘˘˘˘ ˘˘Ě˘˘˘˘˘˘˘˘˘˘˘˘˘žĚ̢˘˘˘˘˘Ě̢˘˘˘˘˘˘˘˘˘˘˘˘˘Ě˘˘˘˘˘˘˘˘˘Ě˘˘˘ĚĚĚĚ̢˘˘˘˘Ě˘˘˘˘ĚĚ̢Ě̢˘Ě̢˘˘Ě ̢˘Ě˘˘˘˘˘˘˘˘˘˘˘˘Ě̢̢˘˘˘˘˘˘˘Ě˘˘˘˘˘˘˘˘˘˘˘˘˘˘Ě̢˘Ě˘Ě˘˘˘˘˘˘˘˘˘˘ĚĚ̢˘˘Ě˘Ě˘˘˘˘˘Ě!Ł˘Ě˘˘˘˘˘˘˘ ˘˘Ě˘˘˘˘˘˘˘˘˘˘˘˘ž€˘˘˘˘˘˘˘˘˘Ě̢˘˘˘˘˘˘˘˘˘˘˘˘˘Ě˘˘˘˘˘˘˘˘˘Ě˘˘˘ĚĚĚĚ̢˘˘˘˘Ě˘˘˘˘ĚĚ̢˘ĚŁĚ˘˘Ě̢˘˘Ě ̢˘Ě˘˘˘˘˘˘˘˘˘˘˘¤˘Ě̢̢˘˘˘˘˘˘˘Ě˘˘˘˘˘˘˘˘˘˘˘˘˘˘Ě̢˘Ě˘Ě˘˘˘˘˘˘˘˘˘˘ĚĚ̢˘˘Ě˘Ě˘˘˘˘˘˘˘˘ŁĚ˘˘˘˘˘˘˘ ˘˘Ě˘˘˘˘˘˘˘˘˘˘˘˘Ě̢˘˘˘˘˘˘˘˘Ě̢˘˘˘˘˘˘˘˘˘˘˘˘˘Ě˘˘˘˘˘˘˘˘˘Ě˘˘˘ĚĚĚĚ̢˘˘˘˘Ě˘˘˘˘ĚĚ̢˘ĚĚ˘Ł‘˘Ě̢˘˘Ě ̢˘Ě˘˘˘˘˘˘˘˘˘˘ ˘˘˘Ě̢̢˘˘˘˘˘˘˘Ě˘˘˘˘˘˘˘˘˘˘˘˘˘˘Ě̢˘Ě˘Ě˘˘˘˘˘˘˘˘˘˘ĚĚ̢˘˘Ě˘Ě˘˘˘˘˘˘˘˘˘˘*˘˘˘˘˘˘˘ ˘˘Ě˘˘˘˘˘˘˘˘˘˘˘¤˘Ě̢˘˘˘˘˘˘˘˘Ě̢˘˘˘˘˘˘˘˘˘˘˘˘˘Ě˘˘˘˘˘˘˘˘˘Ě˘˘˘ĚĚĚĚ̢˘˘˘˘Ě˘˘˘˘ĚĚ̢˘Ě̢˘˘!˘Ě̢˘˘Ě ̢˘Ě˘˘˘˘˘˘˘˘˘a˘˘˘˘Ě̢̢˘˘˘˘˘˘˘Ě˘˘˘˘˘˘˘˘˘˘˘˘˘˘Ě̢˘Ě˘Ě˘˘˘˘˘˘˘˘˘˘ĚĚ̢˘˘Ě˘Ě˘˘˘˘˘˘˘˘˘˘Ě̢̢˘˘˘˘˘˘ ˘˘Ě˘˘˘˘˘˘˘˘˘˘e˘˘Ě̢˘˘˘˘˘˘˘˘Ě̢˘˘˘˘˘˘˘˘˘˘˘˘˘Ě˘˘˘˘˘˘˘˘˘Ě˘˘˘ĚĚĚĚ̢˘˘˘˘Ě˘˘˘˘ĚĚ̢˘Ě̢˘˘ĚĚ̢˘˘˘Ě̢˘˘Ě ̢˘Ě˘˘˘˘˘˘˘˘–̢˘˘˘Ě̢̢˘˘˘˘˘˘˘Ě˘˘˘˘˘˘˘˘˘˘˘˘˘˘Ě̢˘Ě˘Ě˘˘˘˘˘˘˘˘˘˘ĚĚ̢˘˘Ě˘Ě˘˘˘˘˘˘˘˘˘˘˘˘˘Ě˘˘˘˘˘Ě˘˘˘˘˘˘˘ ˘˘Ě˘˘˘˘˘˘˘˘˘e˘˘˘Ě̢˘˘˘˘˘˘˘˘Ě̢˘˘˘˘˘˘˘˘˘˘˘˘˘Ě˘˘˘˘˘˘˘˘˘Ě˘˘˘ĚĚĚĚ̢˘˘˘˘Ě˘˘˘˘ĚĚ̢˘Ě̢˘˘Ě̢‘˘˘˘˘Ě˘˘˘˘Ě̢˘˘Ě ̢˘Ě˘˘˘˘˘˘˘˘˘˘˘˘˘˘Ě̢̢˘˘˘˘˘˘˘Ě˘˘˘˘˘˘˘˘˘˘˘˘˘˘Ě̢˘Ě˘Ě˘˘˘˘˘˘˘˘˘˘ĚĚ̢˘˘Ě˘Ě˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘¤˘˘˘˘˘˘˘˘˘Ě˘˘˘˘˘˘˘ ˘˘Ě˘˘˘˘˘˘˘˘ŠŔĚ̢˘Ě̢˘˘˘˘˘˘˘˘Ě̢˘˘˘˘˘˘˘˘˘˘˘˘˘Ě˘˘˘˘˘˘˘˘˘Ě˘˘˘ĚĚĚĚ̢˘˘˘˘Ě˘˘˘˘ĚĚ̢˘Ě̢˘˘Ě̢˘˘˘˘˘˘˘˘˘˘Ě˘˘˘˘Ě̢˘˘Ě ̢˘Ě˘˘˘˘˘˘˘ĚĚ̢˘˘˘Ě̢̢˘˘˘˘˘˘˘Ě˘˘˘˘˘˘˘˘˘˘˘˘˘˘Ě̢˘Ě˘Ě˘˘˘˘˘˘˘˘˘˘ĚĚ̢˘˘Ě˘Ě˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘Ě̢˘˘˘˘˘˘˘˘˘˘˘˘Ě˘˘˘˘˘˘˘ ˘˘Ě˘˘˘˘˘˘˘˘*˘˘˘˘˘Ě̢˘˘˘˘˘˘˘˘Ě̢˘˘˘˘˘˘˘˘˘˘˘˘˘Ě˘˘˘˘˘˘˘˘˘Ě˘˘˘ĚĚĚĚ̢˘˘˘˘Ě˘˘˘˘ĚĚ̢˘Ě̢˘˘Ě̢˘˘˘‘˘˘˘˘˘˘˘˘˘˘˘˘Ě˘˘˘˘Ě̢˘˘Ě ̢˘Ě˘˘˘˘˘˘Ô˘˘˘˘˘˘˘˘Ě̢̢˘˘˘˘˘˘˘Ě˘˘˘˘˘˘˘˘˘˘˘˘˘˘Ě̢˘Ě˘Ě˘˘˘˘˘˘˘˘˘˘ĚĚ̢˘˘Ě˘Ě˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘ĚĚĚ<˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘Ě˘˘˘˘˘˘˘ ˘˘Ě˘˘˘˘˘˘˘ĚĚĚ̢˘Ě̢˘˘˘˘˘˘˘˘Ě̢˘˘˘˘˘˘˘˘˘˘˘˘˘Ě˘˘˘˘˘˘˘˘˘Ě˘˘˘ĚĚĚĚ̢˘˘˘˘Ě˘˘˘˘ĚĚ̢˘Ě̢˘˘Ě̢˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘Ě˘˘˘˘Ě̢˘˘Ě ̢˘Ě˘˘˘˘˘Ě¤˘˘˘˘˘˘˘˘Ě̢̢˘˘˘˘˘˘˘Ě˘˘˘˘˘˘˘˘˘˘˘˘˘˘Ě̢˘Ě˘Ě˘˘˘˘˘˘˘˘˘˘ĚĚ̢˘˘Ě˘Ě˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘ĚĚĚ̜˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘Ě˘˘˘˘˘˘˘ ˘˘Ě˘˘˘˘˘˘Ě˘ĚĚĚ̢˘Ě̢˘˘˘˘˘˘˘˘Ě̢˘˘˘˘˘˘˘˘˘˘˘˘˘Ě˘˘˘˘˘˘˘˘˘Ě˘˘˘ĚĚĚĚ̢˘˘˘˘Ě˘˘˘˘ĚĚ̢˘Ě̢˘˘Ě̢˘˘˘˘˘˘<̢˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘Ě˘˘˘˘Ě̢˘˘Ě ˘Ě˘˘ĚĚĚĚĚxž˘˘˘˘Ě̢˘˘˘˘˘ĚĚĚĚ̢˘˘˘˘˘ĚĚĚĚĚĚĚĚĚ̢˘˘˘˘˘˘˘˘Ě˘ĚĚ̢˘˘˘˘˘˘˘Ě̢˘˘˘Ě˘˘˘Ě̢˘ĚĚ̢˘˘˘˘˘˘˘˘€˘˘ĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚ̢˘˘˘Ě˘˘ĚĚ̢ íí˘˘˘˘Ě̞ş˘ ˘˘˘˘˘˘˘˘˘˘˘Ě˘ĚĚĚĚ̢˘˘˘Ě̢˘˘˘˘˘˘˘˘˘˘˘˘˘Ě̢̢̢˘˘˘˘˘˘˘˘˘˘˘Ě̢˘Ě˘Ě˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘Ě̢̢˘ĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚ̢˘˘˘Ě˘˘˘˘˘˘<í큀šr˜dżŠšÍ̢˘˘˘Ě̢˘˘˘˘˘ĚĚĚĚ̢˘˘˘˘˘ĚĚĚĚĚĚĚĚĚ̢˘˘˘˘˘˘˘˘Ě˘ĚĚ̢˘˘˘˘˘˘˘Ě̢˘˘˘Ě˘˘˘Ě̢˘ĚĚ̢˘˘˘˘˘˘˘ĚĚ̢˘˘˘˘ĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚ̢˘˘˘Ě˘˘ĚĚ̢ ííí‰Y>A,<˘˘˘˘˘˘˘˘˘˘˘˘Ě˘ĚĚĚĚ̢˘˘˘Ě̢˘˘˘˘˘˘˘˘˘˘˘˘˘Ě̢̢̢˘˘˘˘˘˘˘˘˘˘˘Ě̢˘Ě˘Ě˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘ĚĚ̢˘˘˘˘ĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚ̢˘˘˘Ě˘˘˘˘˘˘<íííí ˘Ě˘˘˘˘Ě̢˘˘˘˘˘ĚĚĚĚ̢˘˘˘˘˘ĚĚĚĚĚĚĚĚĚ̢˘˘˘˘˘˘˘˘Ě˘ĚĚ̢˘˘˘˘˘˘˘Ě̢˘˘˘Ě˘˘˘Ě̢˘ĚĚ̢˘˘˘˘˘˘˘ĚĚ̢˘˘˘˘ĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚ̢˘˘˘Ě˘˘ĚĚ̢ ííííí9íííí˘Ě˘˘˘˘˘˘˘˘˘˘Ě˘ĚĚĚĚ̢˘˘˘Ě̢˘˘˘˘˘˘˘˘˘˘˘˘˘Ě̢̢̢˘˘˘˘˘˘˘˘˘˘˘Ě̢˘Ě˘Ě˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘ĚĚ̢˘˘˘˘ĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚ̢˘˘˘Ě˘˘˘˘˘˘<íííííííK ćíííí¤˘Ě˘˘˘˘Ě̢˘˘˘˘˘ĚĚĚĚ̢˘˘˘˘˘ĚĚĚĚĚĚĚĚĚ̢˘˘˘˘˘˘˘˘Ě˘ĚĚ̢˘˘˘˘˘˘˘Ě̢˘˘˘Ě˘˘˘Ě̢˘ĚĚ̢˘˘˘˘˘˘˘ĚĚ̢˘˘˘˘ĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚ̢˘˘˘Ě˘˘ĚĚ̢ ííííííí_ĚĄŸííí퀢˘˘˘˘˘˘˘˘˘˘˘Ě˘ĚĚĚĚ̢˘˘˘Ě̢˘˘˘˘˘˘˘˘˘˘˘˘˘Ě̢̢̢˘˘˘˘˘˘˘˘˘˘˘Ě̢˘Ě˘Ě˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘ĚĚ̢˘˘˘˘ĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚ̢˘˘˘Ě˘˘˘˘˘˘<ííí íííx˘˘˝íííí˘˘Ě˘˘˘˘Ě̢˘˘˘˘˘ĚĚĚĚ̢˘˘˘˘˘ĚĚĚĚĚĚĚĚĚ̢˘˘˘˘˘˘˘˘Ě˘ĚĚ̢˘˘˘˘˘˘˘Ě̢˘˘˘Ě˘˘˘Ě̢˘ĚĚ̢˘˘˘˘˘˘˘ĚĚ̢˘˘˘˘ĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚ̢˘˘˘Ě˘˘ĚĚ̢ ííí ííí‘Ě̅ťííííííí˘˘Ě˘˘˘˘˘˘˘˘˘˘Ě˘ĚĚĚĚ̢˘˘˘Ě̢˘˘˘˘˘˘˘˘˘˘˘˘˘Ě̢̢̢˘˘˘˘˘˘˘˘˘˘˘Ě̢˘Ě˘Ě˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘ĚĚ̢˘˘˘˘ĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚ̢˘˘˘Ě˘˘˘˘˘˘<íííííí‘Ě̢„íííííííííí =‘šş˘˘˘˘Ě̢˘˘˘˘˘ĚĚĚĚ̢˘˘˘˘˘ĚĚĚĚĚĚĚĚĚ̢˘˘˘˘˘˘˘˘Ě˘ĚĚ̢˘˘˘˘˘˘˘Ě̢˘˘˘Ě˘˘˘Ě̢˘ĚĚ̢˘˘˘˘˘˘˘ĚĚ̢˘˘˘˘ĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚ̢˘˘˘Ě˘˘ĚĚ̢ íííí푢˘˘…ííííííííí íííííí  OÍdš˘˘˘˘˘˘˘˘˘Ě˘ĚĚĚĚ̢˘˘˘Ě̢˘˘˘˘˘˘˘˘˘˘˘˘˘Ě̢̢̢˘˘˘˘˘˘˘˘˘˘˘Ě̢˘Ě˘Ě˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘ĚĚ̢˘˘˘˘ĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚ̢˘˘˘Ě˘˘˘˘˘˘< íí íííŻ˘˘˘˘íííííííííí íííííííííííííííí!ݢ˘Ě̢˘˘˘˘˘Ěş¸˘˘˘˘˘˘˘ĚĚĚĚĚĚĚĚĚ̢˘˘˘˘˘˘˘˘Ě˘ĚĚ̢˘˘˘˘˘˘˘Ě̢˘˘˘Ě˘˘˘Ě̢˘ĚĚ̢˘˘˘˘˘˘˘ĚĚ̢˘˘˘˘ĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚ̢˘˘˘Ě˘˘ĚĚ̢ íííí튢˘˘Ěíííííííííííííííííí  íííííííííŃr˘˘˘˘˘˘Ě˘‹ŔâŞŔ¢˘˘Ě̢˘˘˘˘˘˘˘˘˘˘˘˘˘Ě̢̢̢˘˘˘˘˘˘˘˘˘˘˘Ě̢˘Ě˘Ě˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘ĚĚ̢˘˘˘˘ĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚ̢˘˘˘Ě˘˘˘˘˘˘<íííííŔĚ̢˘íííííííííííííííííííííí ííí !a’ş˘˘…„ Ď\š˘˘˘ĚĚĚĚĚĚĚĚĚ̢˘˘˘Ě̢˘˘Ě˘ş˘˘˘˘˘˘˘˘˘˘Ě̢˘˘˘Ě˘˘˘Ě̢˘ĚĚ̢˘˘˘˘˘˘˘r¸š¸˘˘˘˘ĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚ̢˘˘˘Ě˘˘ĚĚ̢  ííííííííaĚĚ˘Ě íííííííííííííííííííííí  íííI*Œ¸Ě˝ć9!˘˘˘ĚĚĚĚĚĚĚĚĚ̢˘˘˘¸€ĂÂhŠÂdyŐŻn¸˘˘˘˘Ě̢˘Ě˘Ě˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘’ęŞÍgxš˘˘ĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚ̢˘˘˘Ě˘˘˘˘˘˘<íííííííííííí ííí-Ě̢Ěíííí íííííííííííí ííííĘ9ííí푢ƒ9íííííí  ‘˘˘˘ĚĚĚĚĚĚĚĚĚ̢˘˘œÁ"# `Š˜˘˘Ě̢˘˘˘Ě˘˘˘Ě̢˘ĚĚ̢˘ĚĚĚ ‚á_˘˘ĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚ̢˘˘˘Ě˘˘ĚĚ̢ ííí ííí íííííí<şĚ˘¸íííííííííííí ííííííí ž˝ť9íí)¤Ŕ€˘ĄŸíííííí ¤€˘Ě̢˘˘˘˘˘˘˘˘˘˘Ą‚zííF ÝŻš˘˘˘˘Ě˘Ě˘˘˘˘˘˘˘˘˘˘˘˘˘˘ĄćííííŞ˘˘ĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚ̢˘˘˘Ě˘˘˘˘˘˘< íííííííí ííí˜Ě˘eíííííí ííííííííííííí˘˘ĄƒćíWźľ¸˘˘…sííííí*˜˘Ě̢˘˘˘˘˘˘˘˘˘„síííííííí9íííí<Ým̢˘˘˘Ě˘˘˘Ě̢˘ş¸šr¸şŸííííѢ˘ĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚ̢˘˘˘Ě˘˘ĚĚ̢ íí íííí íí푢˘aíííí ííí ííí ííí íííííí˘˘Ěž…ĄĄž˘˘Ě̢źíííííí˜˘Ě̢˘˘˘˘˘˘˘˘…‚íííííícČʂć9íííí !ăr˘Ě˘Ě˘˘˘˘š{݊żgÍg_Ż{ÖííííŔ˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘Ě˘˘˘˘˘˘<íííííííííŞĚ˘a íííí íííííííí íííííí ˘˘˘˘˘Ě˘˘˘˘Ě̢ƒ9ííííí €˘Ě̢˘˘˘˘˘˘˘˘„Ÿííííí Qn˘Ě̅ƒć9ííí!Ş€˘˘Ě˘˘…•ĎZ  ííííw˘˘ĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚ̢ş˜Ć€ˇ˘ĚĚ̢ íííí ííííííO˘Jíííííííííííííííí íííí !dł˜r˘˘˘˘˘Ě̅˝Wííííí ˘Ě̢˘˘˘˘˘˘˘˘ íííííg¸ĚĚ̢˘Ąƒćííí`œ˘Ě˘„ťííííí  ííííj˘˘ĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚžrŠ-O <€˘˘˘˘<íííííííííí’˘ ííííííííííí ííí ííííííííí  OJX‡˜˘˘˘˘˘Ąćííííí ‹˘˘˘ĚĚĚĚĚĚĚĚžźíííí=d˘˘˘˘˘˘Ěž„‚9íííŁăş˘…˝Wíííííííííííííííííí틢˘ĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚĘś ŠĚĚ̢<ííííí íí ííí w˘ íííí ííííííííííííííííííííííííííí ż¸˘ĚĚĚĄťíííí튢Ě̢˘˘˘˘˘˘˘žťíííí<˘˘˘˘˘˘Ě̢ž s:ퟹľ˘Ě˘Ąsííííí3—ƒÚŸíííííííííŃ̢˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘„9íííí Ŕš€€š ííííííííí˘ ííí ííí íííííííííííííí ííííííín˘˘˘˘ž‚íííííwşĚ̢˘˘˘˘˘˘˘žsíííí ‘˘˘˘˘˘˘˘˘˘˘ĚĄ ƒ„žĚĚĚ̃9íííí_˘ĚžËźsíííííí_̢ĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚž9íííí Ł-Oíííííííííí€ííí ííííí ííííííí íííí íííííí y˘ĚĚĚĚĘííííí޸Ě̢˘˘˘˘˘˘˘žćíííí Żš˘˘˘˘˘Ě̢˘ĚĚ̢˘ĚĚĚĚĚÚíííí!ĂĚĚĚĚĚĄ ćííííg̢˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘…‚íííí  ííííííí ííííí gííí ííííííííííííííííěííííe˘ĚĚĚĚ :ííííÝrĚ̢˘˘˘˘˘˘˘˘Ÿíííí -Šwò€šˇššš¸É˘˘˘˘˘˘˘ťííííP˛ĚĚĚĚĚĚĚ 9ííííŞ˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘ íííííííííí íííííííííííííííííí=ííí íííí íí ííííííííííxĘííííŔ˘ĚĚĚ̄9íííí¤r˘˘ĚĚĚĚĚĚĚ̅:íííí ! Ł\aë^‡{˘ĚĚĚ̟íííí’˘˘˘˘˘˘˘˝IííííޞĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚ̄ííííĹźWííííííííííííí ííťííí ííí ííí íííííí ííí íííí Ã9ííí`˘˘˘˘˘žŸííííŁq˘˘ĚĚĚĚĚĚĚĚžWííííííí t˛Ě˘˘ž:íííí˛˘ĚĚĚĚĚĚ˝9íííí!ݞĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚ íííí ‘˘„Wííí ííí íííííííĄíííííí íííí íííííí ííí ííííííí íííííííííííííííííííííííííííííííííy̢ƒíííííííííí íí˘ćííííííííííííííííí íííííííííííííííí íííí íííííííííííííí íííí㢢˘:ííí íííííííííĚžíííí íííííííííííííí íííííííí  ííííííííí  íííí ííí íííííííííííí d˘˘˘‚íííííííííííí ĚĚÚííííííííííííííííííí ííííííííííí íííí íííííííí íííííííí 9ííí ⢢ ííííííííííííĚĚžWííííííííííííííí ííííííííííí íííí íííí íííí íííííííí íííí e̢˘ 9íííí íííííííĚĚĚž‚WV  íííí  íííí íííííííííííííííí íííí ííííííííí ?íííí ‘Ě˘˘ĄIííííííííííííĚĚĚĚžĄĂííííííí íííííí íííí íííí íííí íííí  íííííííí {̢˘˘ííííííí íííííííĚĚĚĚĚĚĚíííííííííííííííííííí íííí íííí ííííí ííííííííŻĚ˘˘ĄíííííííííííííĚĚĚĚĚĚĚíí ííííííííí ííí íííííí íííííííí íííí ííííí ííííííííĚ˘˘„ííííííííííííĚĚĚĚĚĚĚ íííííííííííííííí íííííííííííí ííííí íííí9ííí {̢˘˝íííííííííííí ĚĚĚĚĚĚĚííííííííííííííííííííííííííííí íííí ííííííííííííĚ˘˘˝ííííííííííííí ĚĚĚĚĚĚĚííííííííííííííííííííííííííííííííí ííííííííRííííy̢˘ ííí íííííííííĚĚĚĚĚĚĚíííííííííí íííííííííííííííí íííí íííí  ííííí ííííííí틢˘˘‚ííííí íííííííí ĚĚĚĚĚĚĚŁí ííííííííííííííííííííííííííííííííííí h˘˘˘Wíííííí ííííííííĚĚĚĚĚĚ̊ íí  ííííí ííííí  ííííííííííííííííJ̢˘9ííííííííííííííĚĚĚĚĚĚĚĚ ííííííííííí ííííííííííííííííOš˘Ąííí ííííííííííĚĚĚĚĚĚĚĚ íííííí  ííííííííííííííí  ííííí ííííd˘Ęíííííííí  ĚĚĚĚĚĚĚĚíííííííííííííííííííí ííííí íííí퐜íííííííí˘˘˘˘˘˘˘˘ íí íííííííííí íííííí íííííí ííííííííí ˘˘˘˘˘˘˘˘Ş íííííííííííííííííííííííí ííííííííí9&˘˘˘˘˘˘˘˘˘  íííííííííííííííBííí9íW‚ž ˘˘˘˘˘˘˘˘˘íííííííííííí]íííŢ ˝…˘˘ ĚĚĚĚĚĚĚĚĚ  ííííäííí͢˘˘˘˘ ĚĚĚĚĚĚĚĚĚÍíííísíííg˘˘˘˘˘ ĚĚĚĚĚĚĚĚĚĚííííŸíííí`˘˘˘˘˘ ĚĚĚĚĚĚĚĚĚĚííííŸíííŞ˘˘˘˘˘ ˘˘˘˘˘˘˘˘˘˘ííííí!íííí㢢˘˘˘ ˘˘˘˘˘˘˘˘˘˘‘íííííuííííw˘˘˘˘˘ ˘˘˘˘˘˘˘˘˘˘˘˘ĚĚĚĚĚĚĚĚ̢̢˘˘˘˘˘ĚĚ̢˘˘˘˘ĚĚĚĚ̢˘˘˘˘Ě̢Ě̢˘˘˘˘˘Ě̢ĚÍííííí”9ííí ĚĚĚĚĚ ˘˘˘˘˘˘˘˘˘˘˘e˘˘˘˘˘˘˘˘˘˘Ě˘Ě˘˘˘˘ĚĚ̢˘˘˘˘ĚĚĚĚ̢˘˘˘˘˘˘˘Ě̢˘Ě˘˘˘˘˘˘˘ÍíííííĄííí퀢˘˘˘˘ ĚĚĚĚĚĚĚĚĚĚ̑͢˘˘˘˘˘˘˘˘˘Ě˘˘˘˘˘˘ĚĚ̢˘˘˘˘ĚĚĚĚ̢˘˘˘˘Ě̢Ě̢˘˘˘˘˘ĚĚ˘Ě ííííí íííí ľ˘˘˘˘˘ ĚĚĚĚĚĚĚĚĚĚĚ̢˘˘˘˘˘˘˘˘˘Ě˘Ě˘˘˘˘ĚĚ̢˘˘˘˘ĚĚĚĚ̢˘˘˘˘˘˘˘Ě̢˘Ě˘˘˘˘˘˘Ěííííí źíííí˘˘˘˘˘˘ ĚĚĚĚĚĚĚĚĚĚĚĚ*˘˘˘˘˘˘˘˘˘˘Ě˘˘˘˘˘˘ĚĚ̢˘˘˘˘ĚĚĚĚ̢˘˘˘˘Ě̢Ě̢˘˘˘˘˘Ě̢Ěííííí ‘ÚííííÝĚĚĚĚĚĚ ĚĚĚĚĚĚĚĚĚĚĚĚ̢˘˘˘˘˘˘˘˘˘Ě˘Ě˘˘˘˘ĚĚ̢˘˘˘˘ĚĚĚĚ̢˘˘˘˘˘˘˘Ě̢˘Ě˘˘˘˘˘˘Ěííííí žsíííí|˘˘˘˘˘˘˘ ˘˘˘˘˘˘˘˘˘˘˘˘˘g˘˘˘˘˘˘˘˘˘Ě˘˘˘˘˘˘ĚĚ̢˘˘˘˘ĚĚĚĚ̢˘˘˘˘Ě̢Ě̢˘˘˘˘˘Ě̢ĚíííííĄWíWڃ˘˘˘˘˘˘˘˘ ˘˘˘˘˘˘˘˘˘˘˘˘˘e˘˘˘˘˘˘˘˘˘Ě˘Ě˘˘˘˘ĚĚ̢˘˘˘˘ĚĚĚĚ̢˘˘˘˘˘˘˘Ě̢˘Ě˘˘˘˘˘˘Ííííííí랢˘ž˘˘˘˘˘˘˘˘˘˘ ˘˘˘˘˘˘˘˘˘˘˘˘˘˘ĚĚĚĚĚĚĚ̢̢˘˘˘˘˘ĚĚ̢˘˘˘˘ĚĚĚĚ̢˘˘˘˘Ě̢Ě̢˘˘˘˘˘Ě̢íí˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘ ˘˘˘˘˘˘˘˘˘˘˘˘˘˘Í<˘˘˘˘˘˘˘˘Ě˘Ě˘˘˘˘ĚĚ̢˘˘˘˘ĚĚĚĚ̢˘˘˘˘˘˘˘Ě̢˘Ě˘˘˘Ě̢ ˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘ ˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘ĚĚĚĚĚĚ̢̢˘˘˘˘˘ĚĚ̢˘˘˘˘ĚĚĚĚ̢˘˘˘˘Ě̢Ě̢˘˘˘˘˘Ě̤Ŕ˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘ ˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘Ł!˘˘˘˘˘˘˘Ě˘Ě˘˘˘˘ĚĚ̢˘˘˘˘ĚĚĚĚ̢˘˘˘˘˘˘˘Ě̢˘Ě˘˘˘Ě̢˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘ ĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚ́˘˘˘˘˘˘Ě˘˘˘˘˘˘ĚĚ̢˘˘˘˘ĚĚĚĚ̢˘˘˘˘Ě̢Ě̢˘˘˘˘˘ĚŔ=ĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚ ĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚŁ˘˘˘˘˘˘Ě˘Ě˘˘˘˘ĚĚ̢˘˘˘˘ĚĚĚĚ̢˘˘˘˘˘˘˘Ě̢˘Ě˘˘˘˘œ˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘ ĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚ̢<˘˘˘˘˘Ě˘˘˘˘˘˘ĚĚ̢˘˘˘˘ĚĚĚĚ̢˘˘˘˘Ě̢Ě̢˘˘˘˘Ě<ĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚ ĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚg_˘˘˘˘Ě˘Ě˘˘˘˘ĚĚ̢˘˘˘˘ĚĚĚĚ̢˘˘˘˘˘˘˘Ě̢˘Ě˘˘‘Ң˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘ ˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘‘˘˘˘Ě˘˘˘˘˘˘ĚĚ̢˘˘˘˘ĚĚĚĚ̢˘˘˘˘Ě̢Ě̢˘˘˘˘Ě˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘ ˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘€‘˘˘Ě˘Ě˘˘˘˘ĚĚ̢˘˘˘˘ĚĚĚĚ̢˘˘˘˘˘˘˘Ě̢˘Ě˘Ŕ˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘ ˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘Š˘Ě˘˘˘˘˘˘ĚĚ̢˘˘˘˘ĚĚĚĚ̢˘˘˘˘Ě̢Ě̢˘ĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚ ˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘ĚO̢̢˘˘˘ĚĚ̢˘˘˘˘ĚĚĚĚ̢˘˘˘˘˘˘˘˘˘˘Ě_˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘ ĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚ̊ž˘˘˘˘˘ĚĚ̢˘˘˘˘ĚĚĚĚ̢˘˘˘˘Ě̢ĚĚxĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚ ĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚO̢˘˘ĚĚ̢˘˘˘˘ĚĚĚĚ̢˘˘˘˘˘˘˘Ě€˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘ ĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚ̢ŁĚ˘ĚĚ̢˘˘˘˘ĚĚĚĚ̢˘˘˘˘ĚĚŁĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚ ĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚeŠ˘Ě˘˘˘˘˘ĚĚĚĚ̢˘˘˘‘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘ ĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚ <Ŕ¸ĚĚĚĚĚĚĚxOg˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘ ĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚĚ̢˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘ ˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘Ě˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘ ˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘‘Š˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘˘ esdl-1.2/test/PoweredBump.bmp0000644000076400010400000060006611540750060020142 0ustar familjenAdministratörerBM66(: : ///111333444444444333111...///111222222111000$$$$$$000444888;;;===?????????===;;;888444000...444:::???BBBEEEGGGGGGGGGGGGEEEBBB???;;;666111000333555555444222///......000222444555555333000...444:::>>>BBBDDDFFFFFFEEECCC@@@===999444...000222333222000$$$$$$000111111///$$$......$$$333999===???>>>;;;777000000777===CCCIIIMMMQQQSSSUUUUUUUUUSSSPPPMMMHHHCCC===777000444<<>>CCCEEEEEEDDDAAA???<<<::::::<<>>GGGNNNSSSVVVWWWVVVSSSPPPMMMLLLLLLMMMPPPSSSVVVWWWVVVSSSNNNFFF===444$$$666AAAKKKUUU^^^dddiiimmmnnnooonnnkkkhhhccc]]]UUUMMMCCC:::000$$$666???HHHOOOTTTVVVVVVSSSMMMFFF???777///...555===FFFLLLQQQSSSSSSOOOIIIBBB999000222;;;DDDKKKPPPSSSRRROOOIIIAAA888///$$$666AAAKKKTTT\\\bbbdddccc___XXXNNNCCC777$$$444===GGGQQQZZZbbbjjjpppuuuxxx{{{}}}~~~~~~|||zzzvvvrrrlllddd[[[QQQGGG<<<222666BBBNNNZZZeeeooovvv|||€€€‚‚‚ƒƒƒ‚‚‚€€€~~~zzzuuuoooggg^^^TTTIII===222444@@@KKKVVV^^^eeehhhiiihhhfffbbb```^^^^^^___bbbeeehhhiiigggccc]]]TTTIII>>>333555AAANNNZZZeeennnvvv{{{€€€}}}yyytttmmmeee\\\QQQEEE:::000555@@@LLLVVV___dddggggggddd___XXXOOOEEE===555///$$$222:::CCCMMMVVV^^^ccceeeddd```YYYOOODDD999///333>>>IIITTT\\\bbbdddddd```YYYPPPEEE:::000...888CCCOOO[[[fffnnnsssvvvuuuppphhh]]]PPPBBB555$$$666@@@LLLWWWaaakkksss{{{………‰‰‰‹‹‹ŽŽŽŽŽŽ‹‹‹ˆˆˆ„„„~~~wwwnnncccWWWKKK???444222???MMM[[[hhhttt~~~………‹‹‹’’’’’’’’’‰‰‰„„„}}}uuukkk```TTTFFF999...111===JJJXXXcccmmmtttxxxzzzyyywwwtttrrrppppppqqqtttwwwyyyyyywwwrrrkkkaaaUUUGGG:::///111>>>LLLZZZhhhttt}}}………‹‹‹‘‘‘’’’‰‰‰ƒƒƒ|||sssiii]]]PPPCCC777...222===JJJWWWcccmmmssswwwxxxvvvqqqiii```VVVLLLDDD===999888;;;@@@IIISSS]]]gggnnnsssuuutttoooggg\\\PPPCCC777...111<<>>111$$$777BBBNNN[[[fffqqq{{{ƒƒƒ‰‰‰“““–––˜˜˜ššš››››››ššš™™™———“““ŽŽŽˆˆˆttthhh[[[MMM???333888GGGWWWfffttt€€€ŠŠŠ“““™™™ŸŸŸ   ŸŸŸœœœ™™™”””ˆˆˆvvvjjj]]]NNN@@@333777EEETTTcccpppzzz‚‚‚‡‡‡‰‰‰‰‰‰ˆˆˆ………ƒƒƒ‚‚‚„„„†††‡‡‡‡‡‡„„„vvvkkk^^^OOO@@@333$$$888FFFVVVfffttt€€€ŠŠŠ’’’˜˜˜œœœžžžžžž™™™•••ŽŽŽ‡‡‡~~~sssgggYYYKKK>>>333...///777CCCRRRaaannnxxx€€€………†††………{{{rrrhhh^^^UUUNNNIIIHHHKKKQQQYYYcccmmmwww~~~‚‚‚„„„‚‚‚|||ssshhhZZZKKK>>>444///111888EEESSSaaannnxxx~~~‚‚‚}}}vvvlll___QQQDDD:::444444:::DDDQQQ___mmmzzz………ŽŽŽ“““•••”””ŽŽŽ………xxxhhhWWWFFF888$$$$$$666BBBOOO]]]jjjuuu€€€‰‰‰–––ššš   ĄĄĄŁŁŁŁŁŁ¤¤¤¤¤¤ŁŁŁ˘˘˘ŸŸŸœœœ–––ŽŽŽ„„„xxxjjj[[[LLL>>>111000>>>NNN___ppp~~~‹‹‹•••¤¤¤¨¨¨ŞŞŞŞŞŞ¨¨¨ĽĽĽĄĄĄ›››•••ŽŽŽ†††|||pppbbbSSSDDD666000===LLL]]]mmmzzz………“““–––———–––”””’’’‘‘‘‘‘‘’’’””””””’’’ˆˆˆsssdddTTTEEE777$$$222>>>NNN___ooo~~~ŠŠŠ•••ŁŁŁ§§§ŠŠŠ¨¨¨ŚŚŚ˘˘˘œœœ•••ŽŽŽ„„„yyymmm___PPPBBB777222333;;;HHHXXXhhhvvvŠŠŠ““““““‹‹‹ƒƒƒzzzqqqhhhaaa]]][[[^^^ccckkkttt}}}†††ŒŒŒ‡‡‡~~~qqqbbbSSSDDD999444666>>>LLL[[[kkkxxx‚‚‚‰‰‰ŠŠŠ‚‚‚xxxkkk\\\OOOEEE??????FFFPPP^^^mmm{{{ˆˆˆ“““›››   ˘˘˘   ššš‘‘‘ƒƒƒsss```NNN???333......555@@@NNN\\\jjjwww‚‚‚ŒŒŒ”””šššŸŸŸ˘˘˘ĽĽĽŚŚŚ§§§§§§¨¨¨ŠŠŠŠŠŠŞŞŞŠŠŠ¨¨¨ŚŚŚĄĄĄ›››’’’‡‡‡yyyjjjYYYIII:::...333CCCTTTfffwww………’’’ĽĽĽŹŹŹŻŻŻąąą°°°ŽŽŽŞŞŞĽĽĽŸŸŸ˜˜˜‘‘‘ˆˆˆ~~~rrreeeVVVFFF888333BBBSSSdddttt‚‚‚ŽŽŽ———ĄĄĄŁŁŁŁŁŁ˘˘˘   ŸŸŸžžžžžžŸŸŸŸŸŸžžž›››–––ŽŽŽ„„„wwwhhhWWWGGG888...555CCCTTTeeevvv………’’’ĽĽĽŤŤŤŽŽŽŻŻŻŽŽŽŤŤŤŚŚŚ   ™™™‘‘‘‡‡‡|||oooaaaSSSDDD999333555===KKK[[[lll{{{‡‡‡‘‘‘˜˜˜œœœžžž™™™“““ŒŒŒ„„„|||uuuqqqoooqqqvvv|||„„„ŒŒŒ”””™™™››››››———………xxxhhhXXXHHH===888:::DDDRRRbbbrrr€€€‹‹‹’’’–––———“““ŒŒŒ‚‚‚uuugggZZZQQQKKKLLLSSS^^^lllzzzˆˆˆ”””ŸŸŸ§§§ŹŹŹŽŽŽŤŤŤĽĽĽšššŒŒŒ{{{hhhUUUEEE999444666>>>JJJYYYhhhvvvƒƒƒ–––˘˘˘ŚŚŚ¨¨¨ŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŞŞŞŤŤŤŹŹŹ­­­­­­ŹŹŹŞŞŞĽĽĽžžž”””‡‡‡wwwgggUUUDDD555666GGGYYYkkk|||‹‹‹˜˜˜ŁŁŁŤŤŤąąą´´´ľľľ´´´°°°ŤŤŤŚŚŚŸŸŸ˜˜˜‡‡‡}}}qqqcccTTTEEE777666FFFWWWiiizzz‰‰‰•••ŸŸŸŚŚŚŤŤŤŽŽŽŽŽŽ­­­ŹŹŹŤŤŤŞŞŞŞŞŞŠŠŠ¨¨¨ŚŚŚ˘˘˘›››’’’‡‡‡xxxhhhWWWFFF888......888GGGYYYkkk|||‹‹‹˜˜˜˘˘˘ŞŞŞ°°°łłłłłłąąą­­­§§§   ˜˜˜†††{{{oooaaaRRRDDD999333555>>>LLL]]]nnn~~~‹‹‹–––žžž¤¤¤§§§¨¨¨ŚŚŚĄĄĄ›››•••ŽŽŽˆˆˆ„„„ƒƒƒ„„„ˆˆˆ”””ššš   ¤¤¤ĽĽĽ¤¤¤žžž–––ŠŠŠ|||kkkZZZKKK???;;;>>>HHHWWWhhhxxx†††‘‘‘™™™žžž›››”””‹‹‹~~~qqqeee\\\XXXYYY```kkkxxx†††“““ŸŸŸŠŠŠąąąľľľˇˇˇ´´´­­­˘˘˘“““‚‚‚ooo\\\KKK@@@;;;>>>GGGUUUdddsss———žžž¤¤¤§§§ŠŠŠŞŞŞŠŠŠŠŠŠ¨¨¨§§§§§§ŠŠŠŞŞŞŹŹŹŽŽŽ°°°°°°ŻŻŻŹŹŹŚŚŚžžž’’’„„„sss```NNN===///999JJJ\\\ooo€€€œœœ§§§ŻŻŻľľľˇˇˇ¸¸¸ľľľąąąŤŤŤ¤¤¤•••ŒŒŒƒƒƒxxxlll___PPPAAA444999III[[[nnnŽŽŽ›››ĽĽĽ­­­łłłśśś¸¸¸¸¸¸ˇˇˇśśśľľľłłł˛˛˛°°°ŹŹŹŚŚŚžžž”””‡‡‡wwwfffUUUDDD666$$$///:::JJJ\\\nnn€€€œœœŚŚŚŽŽŽłłłľľľľľľ˛˛˛ŹŹŹĽĽĽ•••‹‹‹vvvjjj\\\NNNAAA777222444===KKK]]]nnn™™™˘˘˘ŞŞŞŽŽŽ°°°°°°­­­ŠŠŠŁŁŁžžž™™™•••”””•••˜˜˜œœœĄĄĄ§§§ŤŤŤ­­­­­­ŞŞŞ¤¤¤ššš~~~mmm[[[KKK@@@<<<@@@LLL\\\mmm}}}‹‹‹–––žžžŁŁŁ¤¤¤ĄĄĄ›››‘‘‘†††zzzooogggdddfffmmmxxx„„„‘‘‘ŠŠŠ˛˛˛ššš˝˝˝žžžťťť´´´¨¨¨™™™‡‡‡tttaaaQQQFFFBBBFFFPPP___nnn}}}ŠŠŠ•••žžž¤¤¤ŠŠŠŤŤŤŤŤŤŞŞŞ¨¨¨ĽĽĽ¤¤¤ŁŁŁŁŁŁ¤¤¤§§§ŞŞŞ­­­°°°˛˛˛łłłąąą­­­ŚŚŚœœœŽŽŽ~~~kkkXXXFFF666:::KKK^^^qqqƒƒƒ’’’ŸŸŸŞŞŞ˛˛˛ˇˇˇššššššľľľ°°°ŠŠŠĄĄĄ™™™‡‡‡}}}rrrfffXXXIII;;;000$$$:::KKK^^^qqq‚‚‚’’’ŸŸŸŞŞŞłłłššš˝˝˝ŔŔŔŔŔŔŔŔŔżżżžžžźźźšššśśś°°°ŠŠŠŸŸŸ“““„„„tttbbbPPP@@@333///;;;LLL^^^qqq‚‚‚‘‘‘žžž¨¨¨°°°´´´śśś´´´°°°ŠŠŠĄĄĄ———ŽŽŽ„„„yyynnnbbbUUUHHH;;;222///111;;;III[[[mmm~~~šššĽĽĽ­­­łłłśśś¸¸¸ˇˇˇ´´´°°°ŹŹŹ§§§¤¤¤ŁŁŁŁŁŁĽĽĽŠŠŠ­­­ąąą´´´ľľľ´´´ŻŻŻ§§§œœœŽŽŽ}}}kkkZZZJJJ@@@===BBBNNN^^^ppp€€€ŽŽŽššš˘˘˘§§§ŠŠŠ§§§   ———ŒŒŒwwwqqqooorrryyyƒƒƒŽŽŽ›››ŚŚŚąąąšššŔŔŔĂĂĂÄÄÄŔŔŔ¸¸¸ŹŹŹ‹‹‹xxxfffVVVLLLIIINNNYYYhhhwww………’’’œœœ¤¤¤ŠŠŠŹŹŹŹŹŹŞŞŞ§§§¤¤¤ĄĄĄžžžŸŸŸ˘˘˘ŚŚŚŞŞŞŻŻŻ˛˛˛´´´´´´˛˛˛ŹŹŹŁŁŁ———‡‡‡uuuaaaNNN<<<...;;;LLL```sss„„„”””ĄĄĄŤŤŤłłł¸¸¸şşşšššľľľŻŻŻ§§§žžž”””‹‹‹vvvkkk]]]OOOBBB555$$$;;;LLL```sss„„„”””˘˘˘­­­śśśžžžĂĂĂĆĆĆÇÇÇÇÇÇÇÇÇĹĹĹĂĂĂżżżşşşłłłŞŞŞŸŸŸ‘‘‘ppp]]]KKK;;;//////<<>><<>>444///<<>>000...<<>>222222AAASSSfffxxx‰‰‰˜˜˜ĽĽĽ°°°šššŔŔŔÄÄÄÇÇÇÇÇÇĆĆĆÄÄÄÂÂÂŔŔŔŔŔŔŔŔŔÁÁÁÂÂÂÂÂÂŔŔŔźźź´´´ŞŞŞœœœŒŒŒzzzfffSSSBBB777222555???OOObbbttt†††•••ĄĄĄŤŤŤąąą´´´ľľľ˛˛˛­­­§§§ĄĄĄœœœššššššĄĄĄ§§§­­­łłłšššżżżĂĂĂĆĆĆČČČÇÇÇÂÂÂťťť°°°˘˘˘’’’‚‚‚sssiiidddfffnnnyyy‡‡‡”””ŸŸŸ¨¨¨ŽŽŽ°°°ŽŽŽŞŞŞ˘˘˘™™™ˆˆˆ‚‚‚€€€………ŠŠŠ‘‘‘™™™ĄĄĄ¨¨¨ŽŽŽłłłśśśśśś´´´ŻŻŻŚŚŚššš‹‹‹yyyeeeQQQ>>>///...<<>>111...<<>>OOObbbuuu†††•••˘˘˘ŹŹŹ˛˛˛śśśˇˇˇľľľąąąŹŹŹ§§§ŁŁŁ      ˘˘˘ŚŚŚŞŞŞŻŻŻ´´´¸¸¸˝˝˝ÁÁÁÄÄÄĹĹĹÄÄÄÁÁÁšššŻŻŻĄĄĄ’’’‚‚‚tttkkkgggjjjrrr}}}‹‹‹———˘˘˘ŞŞŞŻŻŻąąąŽŽŽ¨¨¨   –––ŒŒŒƒƒƒ~~~|||~~~‚‚‚ˆˆˆ˜˜˜ŸŸŸŚŚŚŹŹŹ°°°łłłłłłąąąŹŹŹŁŁŁ˜˜˜‰‰‰wwwdddQQQ>>>///...<<>>OOObbbuuu‡‡‡–––ŁŁŁ­­­´´´šššşşşšššśśś˛˛˛­­­ŞŞŞ§§§ŚŚŚ§§§ŠŠŠŹŹŹŻŻŻ˛˛˛śśśşşşžžžÁÁÁÂÂÂÁÁÁžžžˇˇˇ­­­   ‘‘‘‚‚‚uuullliiilllttt€€€™™™¤¤¤ŤŤŤ°°°ąąąŽŽŽ§§§žžž”””‰‰‰€€€{{{yyyzzz†††•••¤¤¤ŠŠŠ­­­ŻŻŻŻŻŻŹŹŹ§§§žžž“““………tttaaaOOO===......<<>>000...===OOObbbvvvˆˆˆ———ĽĽĽ°°°šššŔŔŔĂĂĂÄÄĽ˝˝ˇˇˇŻŻŻŚŚŚœœœ’’’‡‡‡zzzlll\\\LLL===000///<<>>OOOaaasss„„„“““   ŤŤŤ´´´ťťťŔŔŔĂĂĂĆĆĆĆĆĆÇÇÇĆĆĆĹĹĹžžž¸¸¸°°°ĽĽĽ———‡‡‡uuuaaaNNN===000...<<>>NNNaaattt………”””ŸŸŸ¨¨¨­­­ŽŽŽŤŤŤŁŁŁ———ˆˆˆuuuaaaMMM;;;888HHHZZZlll}}}›››§§§ąąąšššżżżĂĂĂĆĆĆČČČÉÉÉČČČÇÇÇĂĂĂžžžˇˇˇ­­­ĄĄĄ’’’€€€nnnZZZGGG777...<<>>222...222>>>NNNaaattt………”””ŸŸŸ¨¨¨­­­ŽŽŽŤŤŤŁŁŁ———‡‡‡uuuaaaLLL:::333AAASSSeeewww‡‡‡–––˘˘˘­­­śśśžžžĂĂĂÇÇÇĘĘĘËËËĘĘĘČČČÄÄÄžžžľľľŞŞŞœœœŒŒŒzzzgggSSSAAA222...<<>>NNNaaattt………“““ŸŸŸ¨¨¨­­­ŽŽŽŤŤŤŁŁŁ———‡‡‡ttt```LLL:::$$$;;;KKK]]]ooo€€€ŠŠŠłłłźźźÂÂÂÇÇÇĘĘĘĚĚĚËËËÉÉÉÄÄÄ˝˝˝łłł§§§˜˜˜†††sss```LLL;;;$$$...<<>>NNNaaattt………“““ŸŸŸ¨¨¨ŹŹŹ­­­ŞŞŞ˘˘˘–––‡‡‡ttt```LLL:::555DDDUUUgggyyy‰‰‰˜˜˜ĽĽĽ°°°šššŔŔŔĆĆĆĘĘĘĚĚĚËËËÉÉÉĂĂĂťťť°°°ŁŁŁ“““€€€mmmYYYFFF666$$$<<>>NNN```sss„„„’’’žžž§§§ŹŹŹŹŹŹŠŠŠĄĄĄ–––†††ttt```LLL:::///===NNN```rrrƒƒƒ’’’   ŤŤŤľľľžžžÄÄÄČČČĘĘĘĘĘĘÇÇÇÁÁÁ¸¸¸ŹŹŹžžžzzzfffRRR@@@111$$$<<>>000:::LLL___rrr„„„“““ĄĄĄŹŹŹ´´´şşşžžžžžžźźź¸¸¸˛˛˛ŤŤŤ˘˘˘™™™„„„xxxjjjZZZJJJ;;;///$$$:::LLL___rrr„„„“““   ŤŤŤ´´´şşşžžžżżżżżżžžžźźźşşşšššˇˇˇśśśłłłŻŻŻ¨¨¨ŸŸŸ“““„„„sss```MMM===222...111<<>>000999JJJ]]]ppp‚‚‚‘‘‘ŸŸŸŞŞŞ˛˛˛¸¸¸źźź˝˝˝źźź¸¸¸łłł­­­ŚŚŚ”””‰‰‰}}}ooo```PPPAAA333999JJJ]]]ppp‘‘‘žžžŠŠŠ˛˛˛¸¸¸źźźžžžžžž˝˝˝źźźşşş¸¸¸śśśłłł°°°ŤŤŤŁŁŁ™™™~~~mmm[[[III:::///000;;;JJJ\\\nnn˜˜˜   ĽĽĽŚŚŚ˘˘˘›››ooo\\\III888999HHHZZZkkk|||ŒŒŒ™™™ĽĽĽŻŻŻśśśťťťžžž˝˝˝ššš˛˛˛¨¨¨šššŠŠŠxxxeeeQQQ???000:::KKK^^^qqq‚‚‚’’’ŸŸŸŠŠŠąąąśśś¸¸¸ˇˇˇłłłŹŹŹŁŁŁ˜˜˜‚‚‚xxxrrrpppqqqwww‰‰‰’’’›››˘˘˘ŚŚŚŚŚŚŁŁŁ›››‚‚‚rrraaaQQQFFFBBBEEEOOO]]]lll|||ŠŠŠ•••ŸŸŸŚŚŚŤŤŤŽŽŽŻŻŻŻŻŻ­­­ŞŞŞ§§§¤¤¤˘˘˘ĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄ   ™™™’’’‰‰‰}}}ooo```OOO>>>000777HHHZZZmmm~~~ŽŽŽ›››ŚŚŚŻŻŻľľľšššťťťşşş¸¸¸´´´ŽŽŽ¨¨¨   ———‚‚‚ttteeeUUUEEE777777GGGZZZmmm~~~ŽŽŽ›››ŚŚŚŽŽŽľľľšššťťťťťťťťťšššˇˇˇľľľ˛˛˛ŻŻŻŤŤŤĽĽĽ’’’†††wwwfffTTTCCC555...888HHHYYYkkk|||‰‰‰”””œœœ   ĄĄĄžžž———ŒŒŒ}}}lllZZZGGG777333AAAQQQcccttt„„„’’’žžž¨¨¨ŻŻŻ´´´ˇˇˇśśś˛˛˛ŤŤŤ   “““ƒƒƒppp]]]JJJ:::888III[[[nnnŽŽŽššš¤¤¤ŹŹŹ°°°ąąąŻŻŻŞŞŞŁŁŁ™™™vvvlllgggeeehhhoooyyy„„„ŽŽŽ———ĄĄĄĄĄĄžžž———ŒŒŒ~~~nnn]]]MMMAAA;;;===FFFSSSbbbrrr€€€ŒŒŒ———ŸŸŸĽĽĽŞŞŞ­­­ŽŽŽ­­­ŹŹŹŤŤŤŠŠŠ¨¨¨§§§ŚŚŚĽĽĽĽĽĽ¤¤¤˘˘˘žžž™™™’’’ˆˆˆ|||nnn^^^MMM===///444DDDVVVhhhzzz‰‰‰–––ĄĄĄŠŠŠ°°°´´´śśśśśśľľľ˛˛˛­­­¨¨¨ĄĄĄ™™™………xxxiiiYYYIII:::...555DDDVVVhhhyyy‰‰‰–––ĄĄĄŠŠŠŻŻŻ´´´śśśˇˇˇśśśľľľłłł°°°­­­ŠŠŠ¤¤¤•••ŠŠŠ}}}nnn]]]LLL===000555DDDUUUgggwww„„„———››››››˜˜˜‘‘‘‡‡‡yyyhhhVVVDDD444$$$:::IIIZZZkkk{{{‰‰‰•••ŸŸŸ§§§ŹŹŹŽŽŽ­­­ŠŠŠ˘˘˘———ŠŠŠzzzhhhUUUDDD444555EEEWWWiiizzzˆˆˆ”””žžž¤¤¤¨¨¨¨¨¨ŚŚŚ   ˜˜˜ttthhh___ZZZYYY^^^fffqqq}}}‡‡‡‘‘‘———›››œœœ˜˜˜‘‘‘‡‡‡yyyiiiXXXHHH<<<555666===IIIWWWggguuu‚‚‚———žžž¤¤¤¨¨¨ŞŞŞŹŹŹŹŹŹŤŤŤŤŤŤŞŞŞŠŠŠ¨¨¨§§§ŚŚŚ¤¤¤ĄĄĄ———„„„xxxiiiYYYIII:::$$$111@@@QQQccctttƒƒƒšššŁŁŁŠŠŠŽŽŽ°°°ąąą°°°­­­ŞŞŞĽĽĽŸŸŸ˜˜˜„„„xxxjjjZZZJJJ;;;...222@@@QQQcccsssƒƒƒššš˘˘˘¨¨¨­­­ŻŻŻ°°°°°°ŽŽŽŹŹŹŠŠŠĽĽĽ   ›››”””‹‹‹€€€sssdddTTTDDD666222???PPPaaappp~~~ˆˆˆ””””””‘‘‘‹‹‹€€€ssscccQQQ@@@222333@@@PPP```ppp‹‹‹–––ŁŁŁĽĽĽ¤¤¤   ˜˜˜ŽŽŽ€€€ppp^^^MMM<<<...222AAARRRcccsss‚‚‚–––œœœŸŸŸžžž›››•••ŒŒŒtttggg[[[QQQLLLMMMSSS]]]iiiuuu€€€ŠŠŠ”””•••‘‘‘‹‹‹ssscccRRRCCC666///...444>>>LLLZZZiiivvv‚‚‚ŒŒŒ”””›››   ¤¤¤ŚŚŚ§§§¨¨¨¨¨¨¨¨¨§§§ŚŚŚĽĽĽŁŁŁĄĄĄ˜˜˜‘‘‘‰‰‰~~~qqqcccSSSCCC555$$$;;;KKK[[[lllzzz‡‡‡‘‘‘ššš   ĽĽĽ§§§ŠŠŠ¨¨¨§§§¤¤¤   ššš”””ŒŒŒ‚‚‚vvvhhhXXXIII:::......;;;JJJ[[[kkkzzz‡‡‡‘‘‘™™™   ¤¤¤ŚŚŚ§§§§§§ĽĽĽŁŁŁŸŸŸ›››–––ˆˆˆtttfffXXXIII;;;///...:::IIIYYYhhhuuu€€€‡‡‡‹‹‹ŒŒŒ‰‰‰‚‚‚xxxkkk\\\KKK<<<...888FFFVVVeeettt€€€‹‹‹’’’———™™™˜˜˜”””‚‚‚uuueeeUUUDDD555...<<>>222444AAAPPP^^^kkkuuu|||€€€~~~xxxnnnbbbSSSDDD666000<<>>JJJWWWbbbkkksssyyy}}}€€€‚‚‚‚‚‚‚‚‚€€€~~~zzzvvvooofff\\\PPPDDD777$$$222>>>KKKWWWbbblllsssyyy|||}}}zzzvvvqqqkkkddd\\\RRRHHH>>>444...999DDDOOOWWW]]]aaabbb___ZZZRRRHHH<<<111555@@@LLLWWWaaahhhmmmooonnnjjjdddZZZOOOBBB666333???KKKWWW```gggkkkllljjjeee^^^TTTIII>>>333333===HHHSSS[[[bbbeeefffccc^^^UUUKKK???444555???HHHRRR[[[dddkkkqqqwww{{{~~~€€€€€€~~~{{{vvvqqqjjjbbbXXXNNNCCC888...333>>>HHHRRR[[[bbbhhhllloooqqqqqqqqqpppnnnkkkfff```XXXOOODDD:::///444>>>IIISSS\\\ccchhhkkkmmmnnnmmmkkkhhheee```ZZZSSSKKKCCC:::111555===DDDIIIMMMMMMKKKGGG@@@777...555>>>HHHQQQXXX\\\^^^^^^ZZZTTTKKKAAA777$$$555???IIIQQQWWWZZZ[[[YYYUUUNNNEEE<<<333333<<>>555222:::BBBJJJRRRYYY```eeeiiimmmoooppppppooommmjjjeee```YYYQQQHHH???666...222:::CCCJJJQQQVVVZZZ\\\^^^___^^^^^^\\\YYYUUUPPPIIIAAA888000333;;;DDDKKKQQQVVVYYY[[[\\\[[[YYYVVVSSSNNNHHHBBB;;;444$$$000444666777555222$$$222999AAAGGGKKKMMMLLLIIIDDD===555$$$333;;;AAAGGGJJJJJJIIIDDD???888000000777===BBBDDDEEECCC???999222...444;;;AAAHHHMMMSSSWWWZZZ\\\]]]]]]\\\[[[XXXSSSNNNHHHAAA:::222...555;;;@@@DDDHHHJJJKKKLLLLLLKKKJJJHHHDDD@@@:::444$$$///666;;;@@@DDDGGGIIIIIIHHHGGGDDDAAA===888333...$$$333777:::<<<<<<999555000///444888::::::888555111000333555666444222$$$...333888===AAAEEEHHHJJJKKKKKKJJJHHHFFFBBB===888333$$$...222555888999;;;;;;;;;;;;:::888666222......222555777888888777666444222...$$$......$$$$$$$$$///222555888999:::::::::888666333000$$$............$$$$$$......$$$$$$...///000000000000000000000000/////////......$$$$$$$$$...///000000000000000000//////...$$$000444777:::<<<===>>>>>>>>>>>>?????????>>>>>>>>>>>>>>>======<<<;;;999777444000$$$111555888:::<<<===>>>>>>>>>>>>>>>>>>>>>>>>===<<<:::888555111000777===CCCGGGKKKMMMOOOPPPQQQQQQRRRRRRRRRRRRRRRRRRRRRQQQQQQQQQPPPOOOMMMKKKHHHCCC>>>888111111888>>>DDDHHHKKKMMMOOOPPPPPPQQQQQQQQQQQQQQQQQQPPPOOOMMMJJJFFF@@@:::333222;;;DDDLLLTTTYYY^^^aaaccceeefffggghhhhhhhhhhhhhhhhhhhhhggggggffffffdddbbb___[[[UUUNNNFFF>>>555333<<>>222666CCCPPP\\\gggooowww}}}………‰‰‰‹‹‹‘‘‘‘‘‘‘‘‘‘‘‘ŒŒŒˆˆˆ‚‚‚yyyooocccUUUFFF888$$$333@@@OOO^^^kkkwww‰‰‰–––›››žžžĄĄĄ˘˘˘¤¤¤¤¤¤ĽĽĽĽĽĽĽĽĽĽĽĽ¤¤¤¤¤¤ŁŁŁĄĄĄŸŸŸ™™™“““………{{{pppcccUUUFFF888///;;;IIIWWWdddpppyyyˆˆˆŽŽŽ“““———›››   ĄĄĄ˘˘˘ŁŁŁŁŁŁ˘˘˘ĄĄĄžžž™™™“““ŠŠŠrrrcccSSSBBB444888GGGWWWggguuuŒŒŒ•••œœœŁŁŁ¨¨¨ŹŹŹŻŻŻąąą˛˛˛łłł´´´´´´´´´´´´łłłłłłąąą°°°­­­ŠŠŠĽĽĽŸŸŸ———ŽŽŽ„„„xxxkkk\\\LLL===///$$$$$$$$$$$$$$$$$$000===LLL[[[iiiuuu€€€‰‰‰———˘˘˘ŚŚŚŞŞŞ­­­ŻŻŻ°°°ąąą˛˛˛ąąą°°°­­­¨¨¨˘˘˘™™™ŽŽŽ€€€ppp^^^LLL;;;$$$///<<>>MMM\\\kkkxxxƒƒƒ•••¤¤¤ŠŠŠŽŽŽłłłśśśšššťťťźźź˝˝˝˝˝˝ťťťššš´´´ŽŽŽĽĽĽ™™™‹‹‹zzzgggTTTAAA222111@@@QQQbbbsss‚‚‚ššš¤¤¤­­­´´´ťťťżżżĂĂĂĆĆĆÇÇÇČČČÉÉÉÉÉÉÉÉÉÉÉÉČČČÇÇÇĹĹĹžžžšššłłłŤŤŤ˘˘˘˜˜˜ŒŒŒqqqaaaPPP@@@111$$$000444777;;;>>>BBBEEEHHHKKKMMMNNNPPPPPPQQQQQQPPPOOONNNLLLIIIFFFCCC???<<<888444000...<<>>000$$$222666;;;???DDDHHHMMMQQQUUUYYY\\\___bbbdddeeeffffffffffffeeedddaaa___[[[WWWSSSOOOKKKFFF@@@;;;555000888FFFVVVeeetttŒŒŒ———   ŠŠŠ°°°śśśźźźÁÁÁĹĹĹČČČĘĘĘËËËĚĚĚËËËČČČÄÄÄ˝˝˝´´´ŠŠŠššš‰‰‰uuu```KKK999666EEEWWWiiizzz‰‰‰———ŁŁŁŽŽŽˇˇˇżżżĹĹĹĘĘĘÎÎÎŃŃŃÓÓÓÔÔÔŐŐŐŐŐŐÔÔÔÔÔÔŇŇŇĐĐĐÍÍÍÉÉÉĂĂĂ˝˝˝ľľľŤŤŤĄĄĄ•••ˆˆˆyyyjjjYYYIII:::$$$///555;;;AAAFFFLLLRRRWWW\\\aaafffjjjnnnrrruuuwwwyyy{{{|||}}}}}}}}}|||zzzxxxuuurrrnnnjjjeee```[[[TTTNNNGGG@@@999333...333@@@PPP___nnn|||‰‰‰”””žžž§§§ŻŻŻˇˇˇ˝˝˝ÂÂÂÇÇÇĘĘĘÍÍÍĎĎĎĐĐĐĎĎĎÍÍÍÉÉÉÂÂÂššš­­­ŸŸŸyyycccNNN;;;777GGGYYYkkk|||‹‹‹™™™ĽĽĽ°°°šššÁÁÁČČČÍÍÍŃŃŃÔÔÔÖÖÖ××××××××××××ÖÖÖÔÔÔŃŃŃÍÍÍÉÉÉÂÂÂťťť˛˛˛¨¨¨œœœ‚‚‚ssscccRRRBBB444...555<<>>666...333@@@NNN^^^mmm{{{ˆˆˆ”””ŸŸŸŠŠŠąąąšššżżżĹĹĹĘĘĘÎÎÎĐĐĐŇŇŇŇŇŇĐĐĐÍÍÍÇÇÇžžž˛˛˛¤¤¤’’’}}}gggQQQ===$$$888III[[[mmm~~~ŽŽŽœœœ¨¨¨łłłźźźÄÄÄËËËĐĐĐÔÔÔ×××ŮŮŮÚÚÚÚÚÚÚÚÚŘŘŘÖÖÖÔÔÔĐĐĐĘĘĘÄÄÄźźź˛˛˛§§§›››ŽŽŽ€€€qqqaaaQQQAAA444111:::CCCMMMVVV___hhhpppxxx………‹‹‹‘‘‘–––›››ŸŸŸŁŁŁŚŚŚŠŠŠŤŤŤ­­­ŻŻŻąąą˛˛˛łłłłłłłłł˛˛˛˛˛˛°°°ŻŻŻ­­­ŞŞŞ§§§ŁŁŁŸŸŸššš•••ŽŽŽ‡‡‡wwwnnndddZZZPPPFFF===444$$$777EEETTTcccrrr€€€™™™ŁŁŁŹŹŹľľľźźźÂÂÂČČČĚĚĚĎĎĎŃŃŃŇŇŇŃŃŃÍÍÍČČČżżżłłł¤¤¤“““~~~hhhQQQ===$$$888III\\\nnnŽŽŽœœœ¨¨¨łłłźźźÄÄÄËËËŃŃŃŐŐŐŘŘŘŮŮŮÚÚÚÚÚÚÚÚÚŘŘŘÖÖÖŇŇŇÍÍÍÇÇÇŔŔŔˇˇˇŹŹŹ   “““………vvvfffVVVGGG999$$$666@@@JJJTTT^^^hhhqqqzzz‚‚‚‰‰‰–––œœœĄĄĄŚŚŚŞŞŞŽŽŽąąą´´´śśśšššťťťźźźžžžżżżżżżżżżżżżżżżżżżžžžźźźťťťšššśśśłłłŻŻŻŤŤŤŚŚŚĄĄĄššš“““‹‹‹‚‚‚yyyooodddYYYNNNDDD:::111///;;;IIIXXXhhhwww„„„‘‘‘œœœŚŚŚ°°°¸¸¸żżżĹĹĹĘĘĘÎÎÎĐĐĐŃŃŃĐĐĐÍÍÍČČČżżż´´´ĽĽĽ“““~~~hhhRRR===$$$888III\\\nnnŽŽŽœœœ¨¨¨łłłźźźÄÄÄËËËŃŃŃŐŐŐ×××ŮŮŮÚÚÚÚÚÚŮŮŮ×××ÔÔÔĐĐĐĘĘĘĂĂĂşşş°°°ĽĽĽ˜˜˜ŠŠŠ{{{lll\\\LLL===111111:::EEEOOOZZZeeeoooyyy‚‚‚ŠŠŠ’’’™™™   ĽĽĽŤŤŤŻŻŻłłłˇˇˇşşş˝˝˝ŔŔŔÂÂÂÄÄÄĹĹĹÇÇÇČČČČČČÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉČČČÇÇÇĆĆĆÄÄÄÂÂÂŔŔŔ˝˝˝šššľľľąąąŤŤŤĽĽĽžžž–––„„„yyynnnbbbWWWKKK@@@666$$$333???NNN]]]lll{{{ˆˆˆ•••   ŞŞŞ˛˛˛şşşÁÁÁĆĆĆËËËÎÎÎĎĎĎĎĎĎÍÍÍÇÇÇżżż´´´ĽĽĽ“““~~~hhhRRR===$$$999III\\\nnnŽŽŽœœœ¨¨¨łłłźźźÄÄÄËËËŃŃŃŐŐŐ×××ŮŮŮÚÚÚÚÚÚŘŘŘÖÖÖŇŇŇÍÍÍĆĆĆžžž´´´ŠŠŠqqqaaaQQQBBB555333>>>IIITTT```kkkuuu‰‰‰‘‘‘™™™ĄĄĄ§§§­­­˛˛˛ˇˇˇťťťżżżÂÂÂĹĹĹÇÇÇÉÉÉËËËĚĚĚÍÍÍÎÎÎĎĎĎĐĐĐĐĐĐĐĐĐĐĐĐĐĐĐĐĐĐĐĐĐĎĎĎÎÎÎÍÍÍËËËÉÉÉÇÇÇÄÄÄÁÁÁžžžššš´´´ŽŽŽ§§§   ———ƒƒƒwwwkkk^^^RRRFFF;;;111666CCCQQQaaapppŒŒŒ˜˜˜ŁŁŁ­­­ľľľźźźĂĂĂČČČËËËÍÍÍÍÍÍËËËĆĆĆžžžłłłĽĽĽ“““~~~hhhRRR>>>$$$999III\\\nnnŠŠŠ´´´˝˝˝ĹĹĹĚĚĚŃŃŃŐŐŐŘŘŘŮŮŮŮŮŮŮŮŮ×××ÔÔÔĎĎĎÉÉÉÂÂÂšššŽŽŽ˘˘˘•••†††wwwfffVVVFFF888$$$666AAALLLXXXdddppp{{{………ŽŽŽ———ŸŸŸ§§§­­­łłłššš˝˝˝ÁÁÁĹĹĹČČČĘĘĘĚĚĚÎÎÎĐĐĐŃŃŃŇŇŇÓÓÓÔÔÔŐŐŐŐŐŐŐŐŐŐŐŐŐŐŐŐŐŐŐŐŐŐŐŐŐŐŐÔÔÔÓÓÓŇŇŇŃŃŃĎĎĎÍÍÍËËËČČČÄÄÄŔŔŔťťťśśśŻŻŻ¨¨¨ŸŸŸ–––‹‹‹rrreeeXXXKKK???444...999FFFUUUeeeuuuƒƒƒœœœŚŚŚŻŻŻˇˇˇžžžÄÄÄČČČËËËËËËÉÉÉĹĹĹ˝˝˝łłłĽĽĽ“““iiiRRR>>>$$$999JJJ\\\ooo€€€ŠŠŠ´´´˝˝˝ĹĹĹĚĚĚŃŃŃŐŐŐŘŘŘŮŮŮŮŮŮŘŘŘŐŐŐŃŃŃĚĚĚĹĹĹ˝˝˝łłł§§§šššŒŒŒ}}}lll\\\KKK===000$$$777BBBOOO[[[gggsss~~~‰‰‰“““œœœ¤¤¤ŤŤŤ˛˛˛¸¸¸žžžÂÂÂĆĆĆÉÉÉĚĚĚÎÎÎĐĐĐŇŇŇÔÔÔŐŐŐÖÖÖÖÖÖ×××ŘŘŘŘŘŘŘŘŘŘŘŘŮŮŮŮŮŮŮŮŮŘŘŘŘŘŘŘŘŘŘŘŘ×××ÖÖÖŐŐŐÔÔÔÓÓÓŃŃŃĎĎĎÍÍÍÉÉÉĆĆĆÁÁÁźźźśśśŽŽŽŚŚŚœœœ’’’†††yyykkk]]]OOOBBB666$$$000<<>>$$$999JJJ]]]ooo€€€ŠŠŠ´´´˝˝˝ĹĹĹĚĚĚŃŃŃŐŐŐ×××ŘŘŘŘŘŘÖÖÖÓÓÓĎĎĎÉÉÉÁÁÁˇˇˇŹŹŹ   ’’’ƒƒƒsssbbbQQQBBB444777BBBOOO\\\iiiuuuŒŒŒ–––ŸŸŸ§§§ŻŻŻśśśźźźÂÂÂĆĆĆĘĘĘÍÍÍĐĐĐŇŇŇÔÔÔŐŐŐÖÖÖ×××ŘŘŘŮŮŮŮŮŮÚÚÚÚÚÚÚÚÚÚÚÚŰŰŰŰŰŰŰŰŰŰŰŰŰŰŰÚÚÚÚÚÚÚÚÚÚÚÚŮŮŮŮŮŮŘŘŘ×××ÖÖÖŐŐŐÓÓÓŃŃŃÎÎÎĘĘĘĆĆĆÁÁÁťťť´´´ŹŹŹ˘˘˘———ŒŒŒ~~~pppbbbSSSEEE999///333@@@OOO___ooo~~~‹‹‹˜˜˜ŁŁŁŹŹŹ´´´ťťťÁÁÁÄÄÄĆĆĆĹĹĹÂÂÂťťťąąąŁŁŁ’’’~~~hhhRRR>>>$$$999JJJ]]]ooo€€€ŠŠŠ´´´˝˝˝ĹĹĹĚĚĚŃŃŃÔÔÔ×××××××××ŐŐŐŃŃŃĚĚĚĹĹĹźźźąąąĽĽĽ˜˜˜‰‰‰yyyhhhWWWGGG888666BBBOOO\\\jjjvvv‚‚‚˜˜˜ĄĄĄŞŞŞ˛˛˛šššżżżÄÄÄÉÉÉĚĚĚĐĐĐŇŇŇÔÔÔÖÖÖ×××ŘŘŘŮŮŮÚÚÚÚÚÚŰŰŰŰŰŰŰŰŰÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜŰŰŰŰŰŰŰŰŰÚÚÚÚÚÚŮŮŮŘŘŘ×××ŐŐŐÓÓÓŃŃŃÍÍÍĘĘĘĹĹĹżżż¸¸¸°°°§§§œœœƒƒƒttteeeVVVHHH;;;000777EEETTTdddtttƒƒƒœœœŚŚŚŻŻŻˇˇˇ˝˝˝ÁÁÁĂĂĂĂĂĂŔŔŔşşş°°°ŁŁŁ’’’~~~hhhRRR>>>$$$999JJJ]]]ooo€€€ŠŠŠ´´´˝˝˝ĹĹĹËËËĐĐĐÔÔÔÖÖÖ×××ÖÖÖÓÓÓĎĎĎČČČŔŔŔˇˇˇŤŤŤžžž€€€ooo^^^MMM>>>000444@@@NNN\\\jjjwwwƒƒƒ™™™ŁŁŁŹŹŹ´´´ťťťÁÁÁĆĆĆËËËĎĎĎŇŇŇŐŐŐ×××ŘŘŘŮŮŮÚÚÚÚÚÚŰŰŰŰŰŰÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜŰŰŰŰŰŰÚÚÚŮŮŮŘŘŘ×××ŐŐŐÓÓÓĐĐĐĚĚĚČČČĂĂĂźźź´´´ŤŤŤ   ”””†††xxxhhhYYYJJJ===222///<<>>$$$999JJJ]]]ooo€€€ŠŠŠ´´´˝˝˝ĹĹĹËËËĐĐĐÔÔÔÖÖÖÖÖÖÔÔÔŃŃŃËËËÄÄÄťťťąąą¤¤¤–––‡‡‡vvveeeTTTCCC555111>>>KKKZZZhhhvvvƒƒƒŽŽŽ™™™ŁŁŁ­­­ľľľźźźĂĂĂČČČÍÍÍĐĐĐÓÓÓÖÖÖŘŘŘŮŮŮÚÚÚŰŰŰŰŰŰÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜŰŰŰÚÚÚŮŮŮŘŘŘ×××ŐŐŐŇŇŇĎĎĎËËËĆĆĆżżżˇˇˇŽŽŽŁŁŁ———‰‰‰zzzkkk[[[LLL>>>222333AAAPPPaaaqqq€€€™™™¤¤¤­­­ľľľşşşžžžżżżźźźˇˇˇŽŽŽĄĄĄ‘‘‘~~~hhhRRR>>>$$$999JJJ]]]ooo€€€ŠŠŠ´´´˝˝˝ĹĹĹËËËĐĐĐÓÓÓŐŐŐŐŐŐŇŇŇÎÎÎČČČŔŔŔśśśŤŤŤŽŽŽ~~~mmm[[[JJJ;;;...///;;;HHHWWWfffttt‚‚‚ŽŽŽ™™™ŁŁŁ­­­ľľľ˝˝˝ÄÄÄÉÉÉÎÎÎŃŃŃÔÔÔ×××ŮŮŮÚÚÚŰŰŰÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜŰŰŰÚÚÚŮŮŮŘŘŘÖÖÖÔÔÔŃŃŃÍÍÍČČČÁÁÁşşşąąąŚŚŚ™™™‹‹‹|||lll\\\MMM???333$$$999HHHXXXiiixxx‡‡‡“““žžž¨¨¨°°°śśśşşşźźźşşşśśś­­­ĄĄĄ‘‘‘}}}hhhRRR>>>$$$999JJJ]]]ooo€€€ŠŠŠ´´´˝˝˝ĹĹĹËËËĐĐĐŇŇŇÔÔÔÓÓÓĐĐĐËËËÄÄÄťťťąąą¤¤¤–––†††uuucccQQQAAA333777EEETTTcccrrrŒŒŒ˜˜˜˘˘˘ŹŹŹľľľ˝˝˝ÄÄÄÉÉÉÎÎÎŇŇŇŐŐŐ×××ŮŮŮÚÚÚŰŰŰÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜŰŰŰÚÚÚŮŮŮ×××ŐŐŐŇŇŇÎÎÎĘĘĘĂĂĂźźźłłł¨¨¨›››~~~nnn]]]MMM???222444BBBRRRbbbrrrŽŽŽššš¤¤¤ŹŹŹłłł¸¸¸şşşššš´´´ŹŹŹ   }}}hhhRRR>>>$$$999JJJ]]]ooo€€€ŠŠŠ´´´˝˝˝ĹĹĹËËËĎĎĎŇŇŇŇŇŇŃŃŃÍÍÍČČČŔŔŔśśśŤŤŤŽŽŽ}}}kkkYYYHHH999444AAAOOO___nnn|||ŠŠŠ–––ĄĄĄŤŤŤ´´´źźźĂĂĂÉÉÉÎÎÎŇŇŇŐŐŐŘŘŘŮŮŮŰŰŰÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜŰŰŰÚÚÚŘŘŘÖÖÖÓÓÓĎĎĎËËËÄÄÄ˝˝˝´´´ŠŠŠœœœŽŽŽ~~~nnn]]]MMM>>>222111>>>NNN___ooo~~~‹‹‹———ĄĄĄŞŞŞąąąśśś¸¸¸¸¸¸łłłŤŤŤŸŸŸ}}}hhhRRR>>>$$$999JJJ]]]ooo€€€ŠŠŠ´´´˝˝˝ÄÄÄĘĘĘÎÎÎĐĐĐŃŃŃĎĎĎËËËÄÄÄźźźąąąĽĽĽ–––†††tttbbbPPP???111///<<>>$$$999JJJ]]]ooo€€€ŠŠŠ´´´˝˝˝ÄÄÄĘĘĘÍÍÍĎĎĎĎĎĎĚĚĚČČČÁÁÁˇˇˇŤŤŤžžž~~~lllYYYGGG888777EEETTTdddsss‚‚‚›››ŚŚŚ°°°šššÁÁÁČČČÍÍÍŇŇŇŐŐŐŘŘŘÚÚÚŰŰŰÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜŰŰŰÚÚÚŮŮŮ×××ŐŐŐŃŃŃĚĚĚĆĆĆžžžľľľŠŠŠœœœŽŽŽ~~~lll[[[JJJ;;;///$$$777DDDRRRaaappp~~~‹‹‹–––   ŠŠŠ°°°ľľľ¸¸¸ˇˇˇłłłŤŤŤŸŸŸ}}}hhhRRR>>>$$$999JJJ]]]ooo€€€ŠŠŠ´´´˝˝˝ÄÄÄÉÉÉÍÍÍÎÎÎÍÍÍĘĘĘÄÄÄźźź˛˛˛ĽĽĽ———‡‡‡uuucccPPP???111222???NNN^^^nnn}}}ŠŠŠ———ŁŁŁ­­­ˇˇˇżżżĆĆĆĚĚĚŃŃŃÔÔÔ×××ŮŮŮŰŰŰÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜŰŰŰŮŮŮ×××ŐŐŐŃŃŃĚĚĚĆĆĆžžžľľľŠŠŠœœœ|||kkkYYYHHH999$$$$$$555@@@LLLZZZhhhvvvƒƒƒŽŽŽ™™™ŁŁŁŤŤŤ˛˛˛ˇˇˇššš¸¸¸łłłŤŤŤŸŸŸ}}}hhhRRR>>>$$$999JJJ]]]ooo€€€ŠŠŠ´´´źźźÄÄÄÉÉÉĚĚĚÍÍÍËËËČČČÁÁÁ¸¸¸­­­ŸŸŸmmmZZZHHH888$$$999GGGWWWhhhwww†††“““ŸŸŸŞŞŞ´´´˝˝˝ÄÄÄËËËĐĐĐÔÔÔ×××ŮŮŮÚÚÚÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜŰŰŰŮŮŮŘŘŘŐŐŐŃŃŃĚĚĚĆĆĆžžžľľľŠŠŠ›››ŒŒŒ{{{iiiWWWFFF777111888BBBLLLXXXeeerrr~~~ŠŠŠ”””žžž§§§ŻŻŻľľľšššťťťšššľľľŹŹŹ   }}}hhhRRR>>>$$$999JJJ]]]ooo€€€ŠŠŠłłłźźźĂĂĂČČČËËËËËËÉÉÉÄÄÄ˝˝˝łłł§§§™™™‰‰‰wwweeeRRRAAA222333@@@PPP```pppšššŚŚŚ°°°şşşÂÂÂÉÉÉÎÎÎÓÓÓÖÖÖŮŮŮÚÚÚÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜŰŰŰÚÚÚŘŘŘŐŐŐŃŃŃĚĚĚĆĆĆžžž´´´¨¨¨™™™ŠŠŠxxxfffTTTCCC555000777???GGGQQQ\\\gggsss~~~‰‰‰“““œœœĽĽĽ­­­´´´ššš˝˝˝žžžźźźśśś­­­ĄĄĄ‘‘‘}}}hhhRRR>>>...999JJJ]]]ooo€€€ŠŠŠłłłźźźÂÂÂÇÇÇÉÉÉÉÉÉÇÇÇÁÁÁšššŻŻŻ˘˘˘“““‚‚‚ppp]]]JJJ:::$$$$$$:::IIIYYYiiiyyy‡‡‡•••ĄĄĄŹŹŹśśśżżżĆĆĆĚĚĚŃŃŃŐŐŐŘŘŘÚÚÚŰŰŰÜÜÜÝÝÝÝÝÝÝÝÝŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜŰŰŰÚÚÚŘŘŘŐŐŐŃŃŃĚĚĚĹĹĹ˝˝˝˛˛˛ŚŚŚ———‡‡‡uuucccQQQ@@@333000666>>>FFFOOOXXXbbbmmmwww‹‹‹”””ĽĽĽ­­­´´´şşşžžžÁÁÁÁÁÁžžž¸¸¸ŻŻŻ˘˘˘‘‘‘~~~hhhRRR>>>...999JJJ]]]ooo€€€ŠŠŠłłłťťťÂÂÂĆĆĆČČČČČČÄÄÄžžžľľľŞŞŞœœœŒŒŒzzzgggUUUCCC444222@@@PPPaaaqqq€€€ŽŽŽ›››§§§ąąąťťťĂĂĂĘĘĘĎĎĎÔÔÔ×××ŮŮŮŰŰŰÜÜÜÝÝÝÝÝÝÝÝÝŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜŰŰŰÚÚÚŘŘŘŐŐŐŃŃŃĚĚĚĹĹĹźźźąąą¤¤¤•••„„„rrr```NNN>>>111000666>>>FFFNNNWWWaaajjjttt}}}‡‡‡˜˜˜   ¨¨¨ŻŻŻśśśťťťŔŔŔÄÄÄĹĹĹÄÄÄÁÁÁşşş°°°˘˘˘‘‘‘~~~hhhRRR>>>...999JJJ\\\ooo€€€œœœ¨¨¨˛˛˛ťťťÁÁÁĹĹĹÇÇÇĆĆĆÂÂÂťťťąąąĽĽĽ–––………sss```MMM<<>>FFFNNNWWWaaajjjsss|||………–––žžžĽĽĽŹŹŹłłłšššžžžĂĂĂĆĆĆÉÉÉÉÉÉÇÇÇĂĂĂźźźąąąŁŁŁ’’’~~~hhhRRR>>>...999JJJ\\\ooo€€€œœœ¨¨¨˛˛˛şşşŔŔŔÄÄÄĹĹĹĂĂĂžžžˇˇˇŹŹŹŸŸŸ~~~kkkXXXFFF666111???OOO```ppp€€€ŽŽŽ›››§§§˛˛˛ťťťĂĂĂĘĘĘĐĐĐÔÔÔ×××ŮŮŮŰŰŰÜÜÜÝÝÝÝÝÝÝÝÝŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜŰŰŰŮŮŮ×××ÔÔÔĐĐĐĘĘʸ¸¸­­­ŸŸŸ}}}kkkYYYHHH;;;111000777>>>FFFOOOXXXaaajjjsss|||………•••œœœ¤¤¤ŤŤŤąąąˇˇˇźźźÁÁÁĆĆĆÉÉÉĚĚĚÍÍÍÍÍÍĘĘĘĹĹĹ˝˝˝˛˛˛¤¤¤’’’~~~hhhRRR>>>...999JJJ\\\oooŽŽŽœœœ¨¨¨˛˛˛şşşżżżĂĂĂĂĂĂÁÁÁźźźłłł¨¨¨ššš‰‰‰wwwdddQQQ???111666EEEVVVgggwww†††”””ĄĄĄŹŹŹśśśżżżÇÇÇÍÍÍŇŇŇÖÖÖŘŘŘÚÚÚÜÜÜÜÜÜÝÝÝÝÝÝŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜŰŰŰŮŮŮ×××ÔÔÔĎĎĎÉÉÉŔŔŔśśśŞŞŞœœœ‹‹‹zzzhhhWWWHHH===777444555999???FFFOOOXXXaaajjjsss|||………•••œœœŁŁŁŞŞŞąąąśśśźźźÁÁÁĹĹĹÉÉÉÍÍÍĎĎĎĐĐĐŃŃŃĎĎĎĚĚĚÇÇÇžžžłłł¤¤¤“““~~~hhhRRR>>>...999JJJ\\\oooŽŽŽœœœ§§§ąąąšššžžžÁÁÁÁÁÁžžž¸¸¸ŻŻŻŁŁŁ”””ƒƒƒppp]]]JJJ999...;;;KKK]]]nnn~~~ŒŒŒšššŚŚŚąąąşşşĂĂĂĘĘĘĎĎĎÔÔÔ×××ŮŮŮŰŰŰÜÜÜÝÝÝÝÝÝŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÚÚÚŮŮŮÖÖÖŇŇŇÍÍÍÇÇÇžžž´´´§§§˜˜˜ˆˆˆwwwgggYYYNNNGGGDDDEEEIIIPPPXXXaaajjjsss|||………•••œœœŁŁŁŞŞŞ°°°śśśťťťŔŔŔĹĹĹÉÉÉĚĚĚĎĎĎŇŇŇÓÓÓÔÔÔÓÓÓŇŇŇÎÎÎČČČżżż´´´ĽĽĽ“““~~~hhhRRR>>>...999JJJ\\\oooŽŽŽ›››§§§°°°¸¸¸˝˝˝żżżżżżťťťľľľŤŤŤžžž}}}jjjVVVDDD444333AAARRRcccttt„„„’’’ŸŸŸŞŞŞľľľžžžĆĆĆĚĚĚŇŇŇŐŐŐŘŘŘÚÚÚÜÜÜÝÝÝÝÝÝÝÝÝŢŢŢŢŢŢŢŢŢŢŢŢßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢÝÝÝÝÝÝÝÝÝÜÜÜŰŰŰÚÚÚŘŘŘŐŐŐŇŇŇĚĚĚĹĹĹźźźąąą¤¤¤–––‡‡‡xxxkkk```YYYVVVXXX\\\bbbjjjsss|||………•••œœœŁŁŁŞŞŞ°°°śśśťťťŔŔŔÄÄÄČČČĚĚĚĎĎĎŇŇŇÔÔÔŐŐŐÖÖÖ×××ÖÖÖÔÔÔĐĐĐÉÉÉŔŔŔ´´´ĽĽĽ“““iiiRRR>>>......///...:::JJJ]]]oooŽŽŽ›››§§§°°°ˇˇˇźźźžžž˝˝˝¸¸¸ąąąŚŚŚ™™™‰‰‰vvvcccOOO>>>///777FFFXXXiiizzz‰‰‰———ŁŁŁŻŻŻšššÁÁÁČČČÎÎÎÓÓÓ×××ŮŮŮŰŰŰÜÜÜÝÝÝÝÝÝŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢÝÝÝÝÝÝÝÝÝÜÜÜŰŰŰÚÚÚŘŘŘŐŐŐĐĐĐËËËĂĂĂşşşŻŻŻŁŁŁ–––‰‰‰}}}sssmmmjjjkkkooouuu}}}………•••œœœŁŁŁŞŞŞ°°°śśśťťťŔŔŔÄÄÄČČČĚĚĚĎĎĎŃŃŃÔÔÔÖÖÖ×××ŘŘŘŮŮŮŘŘŘ×××ŐŐŐĐĐĐĘĘĘÁÁÁľľľĽĽĽ“““iiiRRR>>>...000555999;;;;;;888333$$$$$$:::KKK]]]ooo€€€ŽŽŽ›››ŚŚŚŻŻŻśśśşşşźźźşşşśśśŽŽŽ˘˘˘”””ƒƒƒppp\\\III888...<<>>...222:::BBBGGGIIIHHHEEE???777///...<<>>...111;;;EEENNNTTTWWWVVVRRRKKKAAA777...000???PPPaaasss‚‚‚œœœ§§§ŻŻŻľľľššššššˇˇˇąąą¨¨¨›››ŒŒŒyyyeeeQQQ???000555DDDVVVhhhyyyˆˆˆ———ŁŁŁŻŻŻšššÁÁÁÉÉÉĎĎĎÓÓÓ×××ŮŮŮŰŰŰÜÜÜÝÝÝÝÝÝŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢÝÝÝÝÝÝÝÝÝÜÜÜŰŰŰÚÚÚŘŘŘÖÖÖŇŇŇÎÎÎČČČÁÁÁşşş˛˛˛ŤŤŤŚŚŚ˘˘˘      ŁŁŁŚŚŚŤŤŤ°°°śśśťťťŔŔŔÄÄÄČČČĚĚĚĎĎĎŇŇŇÔÔÔÖÖÖŘŘŘŮŮŮÚÚÚŰŰŰÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜŰŰŰŮŮŮÖÖÖŃŃŃĘĘĘÁÁÁľľľŚŚŚ”””iiiSSS>>>...777DDDOOOYYY```cccbbb^^^VVVLLL@@@444333BBBTTTeeevvv………’’’žžž¨¨¨°°°śśśššššššśśś°°°ŚŚŚ™™™‰‰‰vvvbbbMMM;;;$$$888HHHZZZlll}}}ŒŒŒššš§§§˛˛˛źźźÄÄÄËËËĐĐĐÔÔÔŘŘŘÚÚÚŰŰŰÜÜÜÝÝÝÝÝÝÝÝÝŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢÝÝÝÝÝÝÝÝÝÜÜÜŰŰŰÚÚÚŘŘŘŐŐŐŇŇŇÎÎÎÉÉÉĂĂĂ˝˝˝ˇˇˇłłłŻŻŻŽŽŽŽŽŽ°°°łłłˇˇˇźźźŔŔŔÄÄÄČČČĚĚĚĎĎĎŇŇŇÔÔÔÖÖÖŘŘŘŮŮŮÚÚÚŰŰŰÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜŰŰŰŮŮŮÖÖÖŇŇŇËËËÂÂÂľľľŚŚŚ”””iiiSSS>>>...111===KKKXXXbbbiiimmmlllhhh```UUUHHH;;;///888GGGYYYjjjzzz‰‰‰–––ĄĄĄŞŞŞ˛˛˛ˇˇˇşşşşşşˇˇˇ°°°ŚŚŚ™™™ˆˆˆuuu```LLL:::$$$;;;LLL^^^pppŠŠŠ´´´žžžĆĆĆĚĚĚŃŃŃŐŐŐŘŘŘÚÚÚŰŰŰÜÜÜÝÝÝÝÝÝÝÝÝŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢßßßßßßßßßßßßßßßßßßßßßßßßŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢÝÝÝÝÝÝÝÝÝÜÜÜŰŰŰÚÚÚŘŘŘŐŐŐŇŇŇÎÎÎĘĘĘĹĹĹÁÁÁ˝˝˝ťťťşşşťťťźźźżżżÂÂÂĹĹĹÉÉÉĚĚĚĎĎĎŇŇŇÔÔÔÖÖÖŘŘŘŮŮŮÚÚÚŰŰŰÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜŰŰŰÚÚÚ×××ŇŇŇËËËÂÂÂľľľŚŚŚ”””iiiSSS>>>...444BBBQQQ___iiiqqqttttttoooggg\\\OOO@@@333000>>>NNN___ppp™™™¤¤¤­­­´´´šššźźźźźź¸¸¸˛˛˛¨¨¨ššš‰‰‰vvvaaaMMM;;;...000???PPPbbbsss„„„“““   ŹŹŹśśśżżżÇÇÇÍÍÍŇŇŇÖÖÖŘŘŘÚÚÚŰŰŰÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢßßßßßßßßßßßßßßßßßßŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢÝÝÝÝÝÝÝÝÝÜÜÜŰŰŰÚÚÚŘŘŘŐŐŐÓÓÓĎĎĎĚĚĚÉÉÉÇÇÇĹĹĹÄÄÄÄÄÄĆĆĆÇÇÇĘĘĘÍÍÍĎĎĎŇŇŇÔÔÔÖÖÖŘŘŘŮŮŮÚÚÚŰŰŰÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝŢŢŢÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÚÚÚ×××ŇŇŇËËËÂÂÂśśś§§§”””iiiSSS>>>...777FFFUUUcccnnnvvvzzzyyyuuunnnbbbTTTEEE777555DDDTTTfffvvv………’’’§§§°°°ˇˇˇźźźžžžžžžťťťľľľŤŤŤzzzfffRRR@@@222$$$...$$$555CCCTTTfffwww‡‡‡•••˘˘˘ŽŽŽ¸¸¸ÁÁÁČČČÎÎÎÓÓÓÖÖÖŮŮŮÚÚÚŰŰŰÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢßßßßßßßßßßßßßßßŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢÝÝÝÝÝÝÝÝÝÜÜÜŰŰŰŮŮŮŘŘŘÖÖÖÔÔÔŇŇŇĎĎĎÎÎÎÍÍÍĚĚĚĚĚĚÍÍÍĎĎĎĐĐĐŇŇŇÔÔÔÖÖÖŘŘŘŮŮŮÚÚÚŰŰŰÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢÝÝÝÝÝÝÜÜÜÚÚÚ×××ŇŇŇËËËÂÂÂśśś§§§”””iiiSSS>>>...999HHHXXXfffrrrzzz~~~~~~zzzrrrgggYYYIII:::......;;;JJJ[[[lll|||ŠŠŠ———˘˘˘ŤŤŤłłłşşşžžžÁÁÁÁÁÁžžž¸¸¸ŻŻŻ˘˘˘’’’€€€lllXXXFFF888000///444888;;;<<<;;;888444///...///...$$$000:::HHHYYYjjj{{{ŠŠŠ˜˜˜¤¤¤ŻŻŻšššÁÁÁČČČÎÎÎÓÓÓÖÖÖŮŮŮÚÚÚŰŰŰÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢßßßßßßßßßßßßßßßßßßßßßŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢßßßßßßßßßßßßßßßŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢÝÝÝÝÝÝÜÜÜÜÜÜŰŰŰÚÚÚŮŮŮ×××ÖÖÖÔÔÔÓÓÓŇŇŇŇŇŇŇŇŇÓÓÓÔÔÔŐŐŐÖÖÖŘŘŘŮŮŮÚÚÚŰŰŰÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢÝÝÝÜÜÜÚÚÚ×××ŇŇŇËËËÂÂÂśśś§§§”””iiiSSS>>>...999IIIYYYhhhttt|||€€€}}}vvvkkk\\\MMM===000222@@@PPPbbbsss‚‚‚œœœŚŚŚŻŻŻˇˇˇ˝˝˝ÁÁÁĂĂĂĂĂĂÁÁÁťťťłłł§§§˜˜˜‡‡‡tttaaaPPPBBB999666888<<>>CCCFFFHHHJJJJJJKKKLLLOOOTTT[[[eeeppp|||ˆˆˆ“““žžžŠŠŠ˛˛˛şşşÁÁÁÇÇÇĚĚĚĐĐĐÓÓÓÖÖÖŘŘŘŮŮŮÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚŮŮŮŮŮŮŮŮŮŮŮŮŮŮŮŮŮŮÚÚÚÚÚÚŰŰŰÜÜÜÜÜÜÝÝÝÝÝÝŢŢŢŢŢŢßßßßßßßßßßßßßßßŢŢŢŢŢŢŢŢŢÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜŰŰŰŰŰŰŰŰŰŰŰŰŰŰŰŰŰŰŰŰŰŰŰŰŰŰŰŰŰŰÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢßßßßßßßßßŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜŰŰŰŰŰŰÚÚÚŮŮŮŮŮŮŮŮŮŮŮŮŮŮŮŮŮŮÚÚÚŰŰŰŰŰŰÜÜÜÜÜÜÝÝÝÝÝÝŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢßßßßßßßßßßßßßßßŢŢŢŢŢŢŢŢŢŢŢŢÝÝÝÜÜÜÚÚÚ×××ŇŇŇËËËÂÂÂśśś§§§•••€€€jjjTTT@@@000888HHHXXXhhhttt~~~ƒƒƒ………ƒƒƒ|||rrreeeVVVFFF888///000;;;KKK^^^pppœœœ§§§°°°ˇˇˇ˝˝˝ÂÂÂĹĹĹČČČČČČČČČÄÄÄżżżˇˇˇŹŹŹžžž€€€rrrgggaaa```cccjjjrrrzzz‚‚‚‚‚‚yyyrrrkkkddd___^^^___ccciiinnnsssuuuuuurrrllldddYYYNNNAAA666$$$555>>>FFFNNNSSSWWWZZZ[[[\\\\\\]]]___ccchhhpppyyyƒƒƒ———ĄĄĄŞŞŞ˛˛˛šššŔŔŔĹĹĹĘĘĘÎÎÎŇŇŇŐŐŐ×××ŘŘŘŮŮŮÚÚÚÚÚÚŮŮŮŘŘŘŘŘŘ×××ÖÖÖÖÖÖÖÖÖ×××ŘŘŘŮŮŮÚÚÚŰŰŰÜÜÜÝÝÝÝÝÝŢŢŢŢŢŢßßßßßßßßßßßßßßßŢŢŢŢŢŢÝÝÝÝÝÝÜÜÜÜÜÜŰŰŰŰŰŰÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚŰŰŰŰŰŰÜÜÜÜÜÜÝÝÝÝÝÝŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢßßßßßßŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜŰŰŰÚÚÚÚÚÚŮŮŮŮŮŮŮŮŮŮŮŮŮŮŮŮŮŮÚÚÚŰŰŰŰŰŰÜÜÜÝÝÝÝÝÝÝÝÝŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢßßßßßßßßßßßßßßßßßßŢŢŢŢŢŢŢŢŢÝÝÝŰŰŰŮŮŮÖÖÖŃŃŃĘĘĘÁÁÁľľľŚŚŚ”””€€€jjjTTT@@@000$$$......$$$777GGGWWWgggttt~~~„„„†††„„„uuuiiiZZZJJJ<<<222///333>>>MMM```rrrƒƒƒ’’’žžž¨¨¨ąąą¸¸¸žžžÂÂÂĆĆĆČČČÉÉÉČČČĆĆĆÂÂÂťťťąąąĽĽĽ———‰‰‰|||sssmmmlllpppwww€€€ˆˆˆŽŽŽ‘‘‘’’’‹‹‹„„„|||uuupppnnnppptttyyy„„„‡‡‡‡‡‡„„„~~~uuujjj]]]OOOAAA555$$$...777AAALLLVVV^^^dddiiikkkllllllllllllnnnpppuuu{{{‚‚‚ŠŠŠ“““›››ŁŁŁŤŤŤłłłšššżżżÄÄÄÉÉÉÍÍÍŃŃŃÓÓÓÖÖÖ×××ŘŘŘŮŮŮŮŮŮŘŘŘ×××ÖÖÖŐŐŐÔÔÔÔÔÔÔÔÔŐŐŐÖÖÖ×××ŮŮŮÚÚÚŰŰŰÜÜÜÝÝÝŢŢŢŢŢŢßßßßßßßßßßßßßßßŢŢŢŢŢŢÝÝÝÜÜÜÜÜÜŰŰŰÚÚÚÚÚÚŮŮŮŘŘŘŘŘŘŘŘŘŘŘŘŘŘŘŘŘŘŘŘŘŘŘŘŘŘŘŘŘŘŮŮŮŮŮŮÚÚÚŰŰŰŰŰŰÜÜÜÜÜÜÝÝÝÝÝÝŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜŰŰŰŰŰŰÚÚÚŮŮŮŘŘŘŘŘŘŘŘŘŘŘŘŘŘŘŮŮŮÚÚÚÚÚÚŰŰŰÜÜÜÝÝÝÝÝÝÝÝÝŢŢŢŢŢŢŢŢŢŢŢŢßßßßßßßßßßßßßßßßßßßßßŢŢŢŢŢŢÝÝÝÜÜÜŰŰŰŮŮŮÖÖÖŃŃŃĘĘĘÁÁÁľľľŚŚŚ”””€€€jjjTTT@@@222...222666999;;;;;;:::888444///666EEEVVVfffsss}}}„„„‡‡‡†††xxxlll^^^NNN@@@666222555???OOOaaattt………“““ŸŸŸŞŞŞ˛˛˛šššžžžÂÂÂĹĹĹÇÇÇČČČČČČĆĆĆĂĂĂ˝˝˝ľľľŞŞŞžžž‘‘‘………|||wwwwww{{{‚‚‚ŠŠŠ“““™™™žžžŸŸŸ™™™“““‹‹‹………€€€~~~ƒƒƒˆˆˆŽŽŽ“““–––———”””ŽŽŽ†††zzzlll]]]MMM@@@666111222888BBBNNNZZZeeennntttxxx{{{{{{{{{zzzzzzzzz|||„„„ŠŠŠ˜˜˜ŸŸŸŚŚŚ­­­´´´šššżżżĂĂĂČČČĚĚĚĎĎĎŇŇŇÔÔÔÖÖÖ×××ŘŘŘŘŘŘ×××ŐŐŐÔÔÔÓÓÓŇŇŇŃŃŃŇŇŇÓÓÓÔÔÔÖÖÖ×××ŮŮŮÚÚÚÜÜÜÝÝÝÝÝÝŢŢŢßßßßßßßßßßßßßßßŢŢŢÝÝÝÝÝÝÜÜÜŰŰŰÚÚÚŮŮŮŘŘŘ××××××ÖÖÖŐŐŐŐŐŐŐŐŐŐŐŐŐŐŐŐŐŐŐŐŐÖÖÖ×××ŘŘŘŘŘŘŮŮŮÚÚÚŰŰŰÜÜÜÜÜÜÝÝÝÝÝÝŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜŰŰŰÚÚÚÚÚÚŮŮŮŘŘŘ×××ÖÖÖÖÖÖÖÖÖ××××××ŘŘŘŮŮŮÚÚÚŰŰŰÜÜÜÝÝÝÝÝÝŢŢŢŢŢŢŢŢŢßßßßßßßßßßßßßßßßßßßßßŢŢŢŢŢŢŢŢŢÝÝÝÜÜÜŰŰŰŮŮŮÖÖÖŃŃŃĘĘĘÁÁÁľľľŚŚŚ”””€€€jjjTTTBBB444$$$333999@@@EEEIIIKKKKKKIIIFFFBBB<<<555...444CCCTTTdddrrr}}}„„„ˆˆˆˆˆˆ„„„|||qqqcccTTTFFF;;;666888AAAPPPbbbttt………”””   ŞŞŞ˛˛˛šššžžžÁÁÁÄÄÄĆĆĆÇÇÇÇÇÇĆĆĆĂĂĂžžžˇˇˇŽŽŽŁŁŁ———„„„€€€ƒƒƒ‹‹‹“““œœœŁŁŁ¨¨¨ŞŞŞŠŠŠĽĽĽŸŸŸ™™™’’’‹‹‹ŒŒŒ•••›››   ŁŁŁ¤¤¤˘˘˘œœœ”””ˆˆˆzzzjjjYYYKKK@@@;;;<<>>FFFNNNTTTXXXZZZ[[[YYYVVVQQQKKKBBB999000333AAARRRbbbqqq}}}………‰‰‰ŠŠŠ‡‡‡€€€wwwjjj\\\NNNBBB<<<<<>>000///===NNN___ppp~~~‰‰‰’’’˜˜˜›››œœœ›››˜˜˜“““ŽŽŽˆˆˆƒƒƒ||||||~~~ƒƒƒŠŠŠ’’’šššĄĄĄ§§§ŤŤŤŹŹŹ­­­ŹŹŹŞŞŞŠŠŠŠŠŠŞŞŞŞŞŞŤŤŤŤŤŤŠŠŠŚŚŚ˘˘˘ššš˜˜˜šššžžž¤¤¤ŹŹŹłłłşşşżżżÂÂÂÄÄÄĹĹĹĆĆĆĹĹĹĹĹĹĹĹĹÄÄÄÄÄÄÄÄÄÂÂÂÁÁÁżżż˝˝˝şşşˇˇˇ´´´ŻŻŻ¨¨¨ĄĄĄ˜˜˜ˆˆˆƒƒƒ‚‚‚………ŒŒŒ•••ŸŸŸ¨¨¨ŻŻŻ´´´ľľľłłłŽŽŽ¨¨¨ĄĄĄššš•••““““““–––ššš   ŚŚŚŹŹŹąąąśśśšššźźźžžžŔŔŔĂĂĂĆĆĆÉÉÉÍÍÍŃŃŃŐŐŐŮŮŮŰŰŰÜÜÜŰŰŰŮŮŮŐŐŐĐĐĐËËËĆĆĆĂĂĂÂÂÂÂÂÂÄÄÄÇÇÇĘĘĘÎÎÎŃŃŃÔÔÔÖÖÖŘŘŘŰŰŰÝÝÝŢŢŢßßßßßßßßßÝÝÝÚÚÚÖÖÖÓÓÓĎĎĎÍÍÍËËËËËËËËËĚĚĚÍÍÍÎÎÎÎÎÎÎÎÎÍÍÍĚĚĚËËËÉÉÉČČČÇÇÇÇÇÇČČČĘĘĘÍÍÍĐĐĐÓÓÓÖÖÖŘŘŘŮŮŮŮŮŮŘŘŘ×××ŐŐŐÓÓÓŃŃŃĐĐĐĐĐĐŃŃŃŇŇŇÔÔÔŐŐŐ×××ŘŘŘŘŘŘÖÖÖÔÔÔŃŃŃÍÍÍÉÉÉÇÇÇĹĹĹĹĹĹĆĆĆČČČËËËÍÍÍĐĐĐŇŇŇÓÓÓÔÔÔŐŐŐŐŐŐÖÖÖÖÖÖÖÖÖ××××××ŘŘŘŘŘŘŮŮŮŮŮŮŘŘŘ×××ŐŐŐÓÓÓĎĎĎËËËĹĹĹžžžśśśŹŹŹ   ’’’ooo\\\LLLAAA<<>>000333BBBRRRbbbppp{{{ƒƒƒˆˆˆ‹‹‹ŒŒŒŒŒŒŒŒŒŽŽŽ‘‘‘’’’“““•••———œœœĄĄĄŚŚŚŹŹŹ°°°łłłľľľľľľľľľłłłąąąŻŻŻŹŹŹŠŠŠĽĽĽ   œœœ———”””“““•••™™™ŸŸŸĽĽĽŤŤŤ°°°łłłľľľśśśśśśśśśˇˇˇ¸¸¸¸¸¸¸¸¸ˇˇˇľľľąąą­­­¨¨¨¤¤¤ĄĄĄ   ĄĄĄ˘˘˘¤¤¤¤¤¤ŁŁŁŸŸŸššš”””‹‹‹‹‹‹ŽŽŽ”””›››˘˘˘¨¨¨ŹŹŹ­­­ŞŞŞĽĽĽžžž–––ŠŠŠˆˆˆŠŠŠ–––žžžŚŚŚŹŹŹŻŻŻ°°°ŻŻŻŹŹŹ§§§ŁŁŁŸŸŸžžžŸŸŸŁŁŁ¨¨¨ŽŽŽľľľşşşžžžŔŔŔżżżźźźśśśŻŻŻ¨¨¨   ššš–––”””“““”””———›››ŸŸŸĽĽĽŤŤŤ˛˛˛¸¸¸žžžÂÂÂÄÄÄĹĹĹĂĂĂżżżşşş´´´ŻŻŻŞŞŞ¨¨¨¨¨¨ŠŠŠŹŹŹ°°°łłłśśś¸¸¸¸¸¸ˇˇˇ´´´°°°­­­ŞŞŞŞŞŞŤŤŤŽŽŽ˛˛˛ˇˇˇźźźżżżżżżžžžşşş´´´­­­ŚŚŚ   œœœžžž˘˘˘§§§­­­łłłšššźźź˝˝˝źźź¸¸¸łłłŤŤŤŁŁŁ›››•••‹‹‹‹‹‹ŒŒŒŽŽŽ‘‘‘’’’”””———›››ŸŸŸ¤¤¤ŞŞŞ°°°śśśťťťŔŔŔÄÄÄÇÇÇÉÉÉĘĘĘËËËËËËĘĘĘČČČĹĹĹżżż¸¸¸ŻŻŻ¤¤¤ššš‘‘‘ŠŠŠ††††††ˆˆˆ‹‹‹’’’”””–––———–––•••’’’†††{{{nnn^^^MMM<<<...111???OOO___mmmxxx†††‰‰‰‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŽŽŽ’’’“““•••———šššžžžŁŁŁ¨¨¨­­­˛˛˛śśś¸¸¸¸¸¸ˇˇˇľľľ˛˛˛ŻŻŻŤŤŤ§§§˘˘˘˜˜˜”””‘‘‘‘‘‘“““———ŁŁŁŠŠŠŽŽŽąąąłłłłłł˛˛˛˛˛˛˛˛˛˛˛˛˛˛˛˛˛˛ąąąŽŽŽŤŤŤŚŚŚ˘˘˘žžžœœœœœœžžž   ŁŁŁ¤¤¤¤¤¤ĄĄĄœœœ–––ŒŒŒ‹‹‹‘‘‘˜˜˜ŸŸŸŚŚŚŞŞŞŤŤŤŠŠŠĽĽĽžžž–––‰‰‰‡‡‡ˆˆˆŒŒŒ“““›››ŁŁŁŠŠŠ­­­ŽŽŽŹŹŹ¨¨¨ŁŁŁžžž™™™———˜˜˜›››ĄĄĄ¨¨¨ŻŻŻľľľşşşźźźźźźşşşľľľŽŽŽŚŚŚ–––‘‘‘ŒŒŒŒŒŒŽŽŽ’’’———œœœŁŁŁŞŞŞ˛˛˛¸¸¸˝˝˝ŔŔŔÁÁÁżżżťťťśśśŻŻŻŠŠŠ¤¤¤˘˘˘ĄĄĄŁŁŁŚŚŚŞŞŞŽŽŽ˛˛˛´´´ľľľ´´´ąąą­­­ŠŠŠŚŚŚ¤¤¤ĽĽĽ¨¨¨­­­˛˛˛ˇˇˇşşşťťťşşşśśś°°°¨¨¨   ™™™•••“““•••™™™ŸŸŸŚŚŚ­­­łłłˇˇˇššš¸¸¸ľľľŻŻŻ§§§”””ŒŒŒ………€€€}}}||||||}}}~~~‚‚‚„„„‡‡‡ŠŠŠ•••›››˘˘˘ŠŠŠ°°°śśśźźźŔŔŔÄÄÄÇÇÇÉÉÉĘĘĘËËËËËËĘĘĘÇÇÇĂĂĂ˝˝˝´´´ŤŤŤĄĄĄ———ŒŒŒ‹‹‹ŒŒŒŽŽŽ‘‘‘“““•••••••••”””’’’ŠŠŠ‚‚‚xxxjjjZZZJJJ:::...;;;KKK[[[jjjvvv~~~„„„ˆˆˆ‰‰‰ŠŠŠ‰‰‰‰‰‰ŠŠŠ‹‹‹’’’•••———™™™œœœ   ¤¤¤ŞŞŞŻŻŻłłłˇˇˇšššşşş¸¸¸śśś˛˛˛ŽŽŽŠŠŠ¤¤¤žžž™™™”””•••›››ĄĄĄ§§§ŹŹŹŽŽŽŻŻŻŻŻŻŽŽŽŹŹŹŹŹŹŤŤŤŤŤŤŞŞŞŠŠŠŚŚŚŁŁŁŸŸŸœœœ™™™———˜˜˜›››žžžĄĄĄ¤¤¤¤¤¤˘˘˘žžž˜˜˜’’’‹‹‹ŒŒŒ•••œœœŁŁŁ¨¨¨ŞŞŞŠŠŠĽĽĽŸŸŸ———ŠŠŠ‡‡‡‡‡‡ŠŠŠ‘‘‘˜˜˜   ŚŚŚŞŞŞŤŤŤŠŠŠĽĽĽŸŸŸ™™™“““‘‘‘‘‘‘”””šššĄĄĄŠŠŠąąąśśśşşşťťťššš´´´­­­ĽĽĽœœœ”””ŽŽŽŠŠŠ‡‡‡‡‡‡ˆˆˆ‹‹‹•••œœœ¤¤¤ŤŤŤ˛˛˛¸¸¸źźź˝˝˝źźź¸¸¸˛˛˛ŤŤŤ¤¤¤žžž›››šššœœœ   ¤¤¤ŞŞŞŽŽŽąąą˛˛˛ąąąŽŽŽŞŞŞĽĽĽĄĄĄŸŸŸ   ŁŁŁ§§§­­­˛˛˛śśś¸¸¸ˇˇˇłłłŹŹŹ¤¤¤›››“““ŽŽŽ‹‹‹ŒŒŒ‘‘‘———ŸŸŸŚŚŚ­­­˛˛˛ľľľ´´´ąąąŞŞŞ˘˘˘———ŒŒŒ‚‚‚yyyrrrnnnlllllllllmmmoooppprrrtttxxx}}}ƒƒƒŠŠŠ’’’ššš˘˘˘ŞŞŞ˛˛˛¸¸¸˝˝˝ÂÂÂĹĹĹČČČĘĘĘËËËËËËËËËÉÉÉĆĆĆŔŔŔššš°°°ŚŚŚ–––’’’‘‘‘“““”””””””””“““’’’ŒŒŒ†††tttfffWWWFFF777888HHHXXXgggsss}}}ƒƒƒ‡‡‡‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰ŠŠŠ“““–––˜˜˜›››žžž˘˘˘ŚŚŚŤŤŤ°°°ľľľ¸¸¸şşşşşş¸¸¸ľľľ°°°ŤŤŤĽĽĽŸŸŸ™™™“““ŽŽŽŠŠŠˆˆˆ‰‰‰ŒŒŒ‘‘‘˜˜˜žžž¤¤¤ŠŠŠŤŤŤŤŤŤŞŞŞ¨¨¨ŚŚŚĽĽĽŁŁŁ˘˘˘ĄĄĄ   ›››———”””’’’’’’“““———›››ŸŸŸŁŁŁ¤¤¤ŁŁŁŸŸŸššš”””‹‹‹‹‹‹“““™™™   ŚŚŚŠŠŠŠŠŠ§§§ĄĄĄššš“““ŒŒŒˆˆˆ‡‡‡ŠŠŠ–––žžž¤¤¤¨¨¨ŠŠŠ§§§˘˘˘›››”””ŽŽŽŠŠŠŠŠŠ“““›››¤¤¤ŹŹŹłłł¸¸¸şşşšššľľľŽŽŽŚŚŚžžž•••ŽŽŽ‰‰‰†††„„„„„„†††ŠŠŠ–––žžžŚŚŚ­­­´´´¸¸¸şşşšššľľľŻŻŻ§§§ŸŸŸ™™™•••“““•••™™™ŸŸŸĽĽĽŞŞŞŽŽŽ°°°ŻŻŻŹŹŹ§§§˘˘˘žžž››››››žžž˘˘˘ŠŠŠŻŻŻłłłľľľ´´´°°°ŞŞŞĄĄĄ———ˆˆˆ………………‰‰‰˜˜˜ĄĄĄ¨¨¨ŽŽŽąąąąąąŽŽŽ§§§žžž’’’†††yyynnneee___[[[ZZZZZZ[[[]]]^^^```ccchhhnnnvvv‰‰‰’’’œœœĽĽĽ­­­ľľľťťťŔŔŔĂĂĂĆĆĆÉÉÉĘĘĘËËËĚĚĚĘĘĘČČČĂĂĂźźźłłłŞŞŞĄĄĄššš•••“““““““““”””””””””“““‘‘‘ŒŒŒˆˆˆƒƒƒ{{{pppcccSSSCCC444555DDDTTTcccpppzzz‚‚‚†††ˆˆˆ‰‰‰‰‰‰‰‰‰‰‰‰ŠŠŠŒŒŒ“““———ššš   ¤¤¤¨¨¨­­­ąąąľľľ¸¸¸şşşšššˇˇˇ˛˛˛­­­§§§   ™™™’’’ŒŒŒ‡‡‡ƒƒƒ‚‚‚ƒƒƒ‡‡‡”””ššš   ¤¤¤ŚŚŚ§§§ĽĽĽ˘˘˘ŸŸŸ›››™™™———•••“““‘‘‘ŽŽŽŒŒŒ‹‹‹ŒŒŒŽŽŽ“““˜˜˜˘˘˘¤¤¤¤¤¤ĄĄĄœœœ–––ŒŒŒŠŠŠŒŒŒ———¤¤¤¨¨¨ŠŠŠ¨¨¨¤¤¤–––‹‹‹ŠŠŠ‹‹‹–––˘˘˘ŚŚŚ§§§¤¤¤ŸŸŸ˜˜˜ŠŠŠ………………ˆˆˆŽŽŽ–––   ŠŠŠąąąśśśššššššˇˇˇąąąŞŞŞ˘˘˘™™™’’’‹‹‹‡‡‡„„„ƒƒƒ„„„‡‡‡‹‹‹‘‘‘™™™ĄĄĄŠŠŠ°°°´´´śśśśśś˛˛˛ŤŤŤ¤¤¤›››”””ŽŽŽ“““ššš   §§§ŤŤŤ­­­­­­ŞŞŞĽĽĽŸŸŸššš——————™™™žžž¤¤¤ŤŤŤ°°°łłł˛˛˛ŻŻŻ¨¨¨ŸŸŸ•••ŒŒŒ„„„€€€€€€„„„ŠŠŠ“““œœœĽĽĽŤŤŤŻŻŻŻŻŻŹŹŹĽĽĽ›››ŽŽŽ€€€rrrdddXXXPPPKKKIIIHHHIIIJJJLLLNNNRRRXXX```jjjuuu€€€ŒŒŒ–––ĄĄĄŞŞŞ˛˛˛¸¸¸žžžÂÂÂĹĹĹČČČĘĘĘËËËĚĚĚËËËÉÉÉÄÄÄžžžśśś­­­¤¤¤˜˜˜•••””””””””””””“““‘‘‘ŠŠŠ………€€€wwwlll___OOO???111222@@@PPP```mmmxxx€€€………ˆˆˆ‰‰‰‰‰‰‰‰‰‰‰‰ŠŠŠ”””˜˜˜›››ŸŸŸ˘˘˘ŚŚŚŞŞŞŽŽŽ˛˛˛śśś¸¸¸ššš¸¸¸´´´ŻŻŻ¨¨¨ĄĄĄ™™™‘‘‘‰‰‰ƒƒƒ~~~{{{zzz}}}‡‡‡ŽŽŽ•••›››ŸŸŸ      žžž›››˜˜˜”””‘‘‘ŽŽŽŒŒŒŠŠŠˆˆˆ………ƒƒƒ‚‚‚‚‚‚„„„‰‰‰ŽŽŽ”””›››   ŁŁŁ¤¤¤˘˘˘˜˜˜‘‘‘ŒŒŒŠŠŠŠŠŠŽŽŽ”””›››ĄĄĄŚŚŚŠŠŠŠŠŠŚŚŚĄĄĄ›››•••ŽŽŽŽŽŽ‘‘‘———œœœ˘˘˘ĽĽĽĽĽĽ˘˘˘•••†††€€€ƒƒƒ‰‰‰’’’œœœŚŚŚŻŻŻľľľşşşťťťšššľľľŻŻŻ§§§ŸŸŸ˜˜˜‘‘‘ŒŒŒˆˆˆ†††………†††‰‰‰•••ĽĽĽŹŹŹąąą´´´´´´°°°ŞŞŞ˘˘˘™™™‘‘‘‹‹‹‰‰‰ŠŠŠŽŽŽ•••œœœŁŁŁ¨¨¨ŤŤŤŤŤŤ¨¨¨ŁŁŁžžž˜˜˜”””“““•••šššĄĄĄ¨¨¨­­­ąąąąąąŽŽŽ¨¨¨ŸŸŸ•••ŠŠŠ‚‚‚}}}|||†††˜˜˜ĄĄĄ¨¨¨ŹŹŹ­­­ŞŞŞŁŁŁ˜˜˜‹‹‹{{{kkk[[[MMMCCC===999888999999;;;>>>BBBIIISSS^^^kkkyyy†††’’’§§§°°°ˇˇˇ˝˝˝ÁÁÁÄÄÄÇÇÇÉÉÉËËËĚĚĚËËËÉÉÉĹĹĹżżż¸¸¸ŻŻŻ§§§   ›››———–––•••””””””’’’ŽŽŽ‹‹‹‡‡‡ƒƒƒ}}}tttiii[[[KKK<<<...///<<>>MMM]]]nnn}}}ŒŒŒ™™™¤¤¤­­­ľľľťťťŔŔŔĂĂĂĆĆĆČČČĘĘĘËËËËËËÉÉÉĹĹĹżżż¸¸¸°°°¨¨¨˘˘˘ššš˜˜˜–––•••“““‘‘‘ŽŽŽ‹‹‹ˆˆˆƒƒƒ~~~wwwnnncccTTTEEE666666EEEUUUdddqqq|||ƒƒƒ‰‰‰ŒŒŒŽŽŽŽŽŽ’’’•••˜˜˜œœœ   ¤¤¤§§§ŤŤŤŽŽŽąąą´´´śśśśśśľľľąąąŤŤŤ˘˘˘———‹‹‹~~~qqqfff]]]WWWUUUWWW\\\ccckkkttt{{{………‡‡‡†††ƒƒƒ~~~yyyrrrlllfffaaa^^^[[[ZZZ[[[]]]bbbiiiqqq{{{………———œœœŸŸŸ   ˜˜˜’’’ŒŒŒ‡‡‡………†††ŠŠŠ———žžž¤¤¤§§§ŠŠŠ¨¨¨ŚŚŚŁŁŁ   œœœœœœžžžĄĄĄ˘˘˘ŁŁŁĄĄĄœœœ•••„„„|||vvvuuuxxx‰‰‰”””   ŤŤŤľľľźźźÁÁÁĂĂĂĂĂĂŔŔŔťťťľľľŽŽŽ§§§   ššš”””‹‹‹ŠŠŠ‹‹‹•••œœœŁŁŁŠŠŠŽŽŽ°°°ŽŽŽŞŞŞ¤¤¤›››’’’‹‹‹†††………‡‡‡”””›››ĄĄĄĽĽĽŚŚŚŁŁŁžžž˜˜˜‘‘‘ŒŒŒŠŠŠ‹‹‹———ŸŸŸ§§§ŹŹŹŻŻŻŻŻŻŤŤŤ¤¤¤ššš†††~~~{{{|||‰‰‰“““œœœ¤¤¤ŠŠŠŤŤŤ¨¨¨˘˘˘———ˆˆˆvvvcccOOO===///$$$888GGGXXXjjj{{{ŠŠŠ˜˜˜ŁŁŁ­­­ľľľťťťżżżĂĂĂĆĆĆČČČÉÉÉĘĘĘĘĘĘČČČÄÄÄžžžˇˇˇŻŻŻ¨¨¨˘˘˘ššš˜˜˜———•••“““‘‘‘ŽŽŽŠŠŠ‡‡‡‚‚‚}}}vvvlll```RRRBBB444222AAAPPP```nnnzzz‚‚‚‰‰‰‘‘‘’’’”””———›››žžž˘˘˘ĽĽĽ¨¨¨ŹŹŹŻŻŻ˛˛˛´´´śśśśśś´´´ŻŻŻ¨¨¨žžž’’’„„„uuugggYYYOOOIIIGGGHHHNNNUUU^^^gggooouuuyyy{{{zzzwwwrrrlllddd]]]VVVPPPLLLJJJIIIKKKNNNUUU]]]hhhsss‰‰‰’’’˜˜˜œœœ›››———‘‘‘‹‹‹†††ƒƒƒƒƒƒ†††‹‹‹’’’ššš   ĽĽĽ¨¨¨¨¨¨¨¨¨ŚŚŚŁŁŁĄĄĄ      ĄĄĄ˘˘˘˘˘˘˘˘˘ŸŸŸššš’’’‰‰‰€€€xxxrrrqqqttt|||†††’’’ŸŸŸŞŞŞ´´´źźźÂÂÂĹĹĹĆĆĆÄÄÄŔŔŔşşş´´´ŹŹŹĽĽĽžžž———‘‘‘ŠŠŠŠŠŠ’’’™™™   §§§ŹŹŹŻŻŻŽŽŽŤŤŤŚŚŚžžž–––ŽŽŽ‰‰‰‡‡‡ˆˆˆ“““ššš   ¤¤¤ĽĽĽ˘˘˘–––ŠŠŠ‡‡‡ˆˆˆŒŒŒ“““œœœ¤¤¤ŞŞŞŽŽŽŻŻŻŹŹŹŚŚŚ”””ŠŠŠ‚‚‚~~~~~~‚‚‚‰‰‰“““œœœ¤¤¤ŠŠŠŤŤŤŠŠŠ˘˘˘———ˆˆˆvvvbbbNNN<<<...555DDDUUUhhhyyy‰‰‰———ŁŁŁ­­­´´´şşşżżżÂÂÂĹĹĹÇÇÇÉÉÉÉÉÉČČČĆĆý˝˝śśśŽŽŽ§§§ĄĄĄššš˜˜˜———•••“““‰‰‰†††|||tttjjj]]]OOO@@@222...<<>>888222111;;;GGGUUUcccppp{{{ƒƒƒ‰‰‰‹‹‹‹‹‹ˆˆˆƒƒƒ~~~xxxtttrrrssswww}}}………”””šššžžž   ˘˘˘˘˘˘ĄĄĄĄĄĄ   ŸŸŸžžžœœœ˜˜˜“““‹‹‹‚‚‚xxxnnnfffaaaaaafffppp|||ŠŠŠ———¤¤¤ŻŻŻ¸¸¸żżżĂĂĂÄÄÄĂĂĂŔŔŔťťť´´´ŹŹŹŁŁŁ›››“““ŒŒŒ†††‚‚‚‚‚‚†††ŒŒŒ”””œœœ¤¤¤ŠŠŠ­­­ŽŽŽŹŹŹŠŠŠŁŁŁžžž™™™–––•••–––™™™   ĄĄĄ   –––‡‡‡€€€||||||ˆˆˆ‘‘‘šššŁŁŁŠŠŠŽŽŽŻŻŻ­­­¨¨¨˘˘˘ššš”””ŽŽŽ“““šššĄĄĄŠŠŠŽŽŽŻŻŻ­­­§§§›››ŒŒŒzzzeeePPP===...111@@@RRRfffxxx‰‰‰———ŁŁŁ­­­ľľľźźźŔŔŔĂĂĂĹĹĹĆĆĆĆĆĆĹĹĹĂĂĂżżżşşş´´´­­­ŚŚŚ   ›››˜˜˜–––•••”””“““‘‘‘ŽŽŽŠŠŠ‡‡‡ƒƒƒ~~~wwwnnncccVVVGGG888///<<>>GGGOOOUUUXXXYYYXXXUUUOOOIIIDDDAAA@@@CCCIIIPPPYYYbbbjjjqqqvvvzzz}}}~~~~~~}}}zzzwwwqqqjjjbbbXXXMMMDDD===;;;>>>GGGUUUdddttt‚‚‚™™™˘˘˘§§§ŞŞŞŤŤŤŠŠŠĽĽĽŸŸŸ———†††~~~vvvpppllliiiiiijjjnnnuuu}}}………ŽŽŽ———žžž¤¤¤§§§ŠŠŠŠŠŠ¨¨¨ŚŚŚ¤¤¤˘˘˘ĄĄĄ   ŸŸŸššš•••ŽŽŽ………zzzpppfff```___bbbkkkvvv‚‚‚ŽŽŽ™™™˘˘˘ŠŠŠ­­­ŻŻŻŻŻŻŽŽŽŹŹŹŞŞŞŠŠŠŠŠŠŹŹŹ°°°´´´¸¸¸ťťťťťť¸¸¸°°°¤¤¤”””kkkVVVAAA111333CCCVVViii{{{ŒŒŒšššŚŚŚ°°°¸¸¸žžžÂÂÂĹĹĹĹĹĹÄÄÄÁÁÁ˝˝˝ˇˇˇ°°°ŠŠŠ   ˜˜˜’’’ŒŒŒ‰‰‰‡‡‡‡‡‡‡‡‡†††………ƒƒƒ~~~zzzuuuoooggg]]]PPPCCC666777CCCOOO[[[fffpppwww~~~ƒƒƒ†††ŠŠŠŒŒŒ’’’•••™™™žžžŁŁŁŠŠŠŽŽŽłłłľľľľľľ˛˛˛ŹŹŹĄĄĄ“““lllVVVBBB111222999???EEEHHHIIIHHHEEE@@@;;;666333333555:::AAAIIIRRRYYY```fffjjjmmmnnnoooooonnnkkkhhhccc\\\SSSJJJAAA888333222666???LLL\\\kkkzzz‡‡‡‘‘‘™™™žžžĄĄĄĄĄĄŸŸŸ›››•••ŽŽŽ………}}}uuuoooiiieeecccccceeeiiinnnvvv~~~‡‡‡———ĄĄĄ¤¤¤ĽĽĽĽĽĽ¤¤¤˘˘˘   ŸŸŸ›››™™™•••‡‡‡}}}rrrfff\\\UUUTTTWWW```lllyyy†††’’’œœœ¤¤¤ŞŞŞ­­­ŻŻŻŻŻŻŽŽŽŽŽŽ­­­ŽŽŽąąą´´´¸¸¸źźźžžžžžžşşş˛˛˛ŚŚŚ–––ƒƒƒnnnXXXDDD333555EEEWWWjjj}}}›››§§§ąąąšššżżżĂĂĂĹĹĹĹĹĹĂĂĂŔŔŔťťť´´´ŹŹŹ¤¤¤ššš’’’ŠŠŠ………‚‚‚€€€€€€€€€}}}{{{wwwsssnnnhhh```UUUIII===111$$$888CCCNNNYYYbbbjjjqqqwww{{{ƒƒƒ†††ŠŠŠŽŽŽ“““™™™   §§§­­­˛˛˛ľľľśśś´´´ŽŽŽ¤¤¤–––………pppZZZFFF444000444777777777444111$$$$$$333:::BBBIIIOOOTTTYYY[[[]]]^^^^^^]]][[[XXXSSSLLLEEE===555...******///777DDDSSSbbbppp}}}‡‡‡”””–––———•••‘‘‘‹‹‹„„„}}}uuunnnhhhccc```^^^^^^```ccciiiooowww‡‡‡•••šššžžžŸŸŸ   ŸŸŸžžž›››™™™–––’’’ŽŽŽ‡‡‡ttthhh\\\QQQJJJHHHLLLUUUbbbppp~~~ŠŠŠ•••žžžĽĽĽŠŠŠŹŹŹŽŽŽŽŽŽŻŻŻ°°°ąąą´´´ˇˇˇťťťžžžŔŔŔżżżźźź´´´¨¨¨˜˜˜………pppZZZEEE444666FFFYYYlll~~~ŽŽŽœœœ¨¨¨˛˛˛şşşŔŔŔĂĂĂĹĹĹĹĹĹĂĂĂžžž¸¸¸ąąą¨¨¨žžž”””ŠŠŠ‚‚‚|||yyywwwwwwwwwwwwvvvtttrrrnnnjjjeee___VVVLLLAAA555$$$777AAAJJJSSS[[[bbbhhhnnnssswww|||‡‡‡ŽŽŽ•••ĽĽĽŹŹŹ˛˛˛śśśˇˇˇśśśąąą¨¨¨ššš‰‰‰uuu___JJJ888$$$333888>>>CCCGGGIIIKKKLLLLLLLLLJJJGGGCCC>>>888222,,,'''%%%%%%)))111<<>>===AAAJJJWWWeeetttŒŒŒ–––žžž¤¤¤¨¨¨ŤŤŤŹŹŹŽŽŽŻŻŻ˛˛˛´´´¸¸¸źźźżżżŔŔŔŔŔŔźźźľľľŠŠŠššš‡‡‡rrr\\\GGG666777HHHZZZmmmŠŠŠłłłşşşŔŔŔĂĂĂĹĹĹÄÄÄÁÁÁ˝˝˝śśśŽŽŽ¤¤¤™™™‚‚‚yyysssnnnllllllllllllkkkiiigggddd___ZZZSSSKKKBBB888...333<<>>>>>???@@@AAADDDHHHOOOVVV^^^ffflllqqqtttvvvvvvuuutttrrrooommmkkkhhhgggeeedddddddddeeefffgggiiilllooorrrvvvyyy{{{}}}~~~~~~}}}{{{wwwqqqjjjbbbYYYPPPGGG>>>555$$$$$$777CCCOOO[[[fffpppyyy€€€‡‡‡’’’˜˜˜žžž¤¤¤ŤŤŤąąąśśśşşşťťťššš´´´ŞŞŞœœœ‹‹‹wwwbbbMMM:::...===NNNaaattt………”””ĄĄĄŹŹŹľľľťťťŔŔŔÂÂÂÂÂÂŔŔŔźźźśśś­­­˘˘˘”””„„„sssaaaQQQDDD;;;666333333333222111///$$$000:::GGGVVVfffuuu„„„‘‘‘žžž¨¨¨ąąą¸¸¸źźźžžžźźźˇˇˇŽŽŽĄĄĄ|||gggQQQ>>>...///666===CCCHHHKKKMMMOOOPPPQQQRRRSSSTTTVVVYYY]]]ccciiinnnsssvvvxxxzzzzzzyyyyyywwwvvvtttrrrqqqpppooonnnnnnnnnooooooppprrrsssuuuxxxzzz|||~~~~~~|||yyyssslllcccYYYNNNDDD:::222...777BBBLLLWWW```iiiqqqyyy€€€‡‡‡ŽŽŽ•••ĽĽĽŹŹŹłłłˇˇˇššš¸¸¸łłłŞŞŞŒŒŒxxxcccNNN;;;000???QQQdddvvv‡‡‡–––˘˘˘­­­śśśźźźŔŔŔÂÂÂÂÂÂŔŔŔźźźľľľŹŹŹ   ‘‘‘€€€nnn[[[III;;;111444AAAQQQbbbsss‚‚‚¨¨¨ąąąššš˝˝˝ŔŔŔżżżşşş˛˛˛ŚŚŚ–––ƒƒƒmmmWWWCCC222$$$777AAAJJJQQQXXX\\\```ccceeefffggghhhiiikkkmmmpppssswww{{{~~~€€€‚‚‚‚‚‚ƒƒƒ‚‚‚‚‚‚€€€~~~}}}|||{{{{{{{{{{{{{{{|||}}}}}}€€€ƒƒƒ„„„„„„………„„„‚‚‚{{{tttkkk___SSSFFF;;;111$$$555>>>GGGPPPYYYaaajjjrrr{{{„„„–––ŸŸŸ§§§ŻŻŻ´´´ˇˇˇˇˇˇ˛˛˛ŞŞŞŒŒŒyyydddOOO<<<$$$111AAASSSfffxxx‰‰‰˜˜˜¤¤¤ŽŽŽˇˇˇ˝˝˝ÁÁÁĂĂĂÂÂÂŔŔŔťťť´´´ŤŤŤŸŸŸ~~~jjjVVVDDD555000===NNN```qqq¨¨¨˛˛˛šššžžžÁÁÁÁÁÁ˝˝˝śśśŞŞŞ›››‰‰‰ttt^^^III777555AAAMMMWWW```hhhnnnrrrvvvyyy{{{|||}}}€€€ƒƒƒ………‡‡‡ŠŠŠ‹‹‹ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŒŒŒŒŒŒ‹‹‹‹‹‹ŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠ‹‹‹‹‹‹ŒŒŒŽŽŽŽŽŽŠŠŠ†††€€€xxxmmm```QQQCCC666111999@@@HHHQQQZZZdddooozzz„„„šššŁŁŁŹŹŹ˛˛˛ľľľľľľąąąŠŠŠyyydddOOO<<<...444CCCVVViii{{{‹‹‹™™™ŚŚŚ°°°¸¸¸žžžÂÂÂĂĂĂĂĂĂŔŔŔťťť´´´ŞŞŞžžžŽŽŽ|||hhhTTTAAA111$$$;;;LLL^^^pppŠŠŠ˛˛˛şşşżżżÂÂÂĂĂĂŔŔŔšššŻŻŻĄĄĄ{{{eeePPP===$$$$$$<<>>JJJWWWffftttƒƒƒœœœŚŚŚ­­­˛˛˛łłł°°°¨¨¨{{{fffQQQ>>>///999JJJ]]]ooo‘‘‘žžžŞŞŞ´´´źźźÁÁÁĹĹĹĆĆĆĹĹĹ½˝˝ľľľŤŤŤžžžŽŽŽ{{{gggQQQ>>>///:::JJJ]]]ooo€€€ŠŠŠłłłťťťÁÁÁĹĹĹĆĆĆĹĹĹŔŔŔ¸¸¸ŹŹŹœœœ‰‰‰ttt^^^JJJ888555GGGXXXhhhvvv‚‚‚•••œœœ˘˘˘§§§ŤŤŤŽŽŽ°°°˛˛˛łłł´´´ľľľľľľśśśśśśśśśśśśˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇśśśśśśśśśľľľ´´´˛˛˛ŻŻŻŞŞŞ¤¤¤›››‚‚‚rrr___MMM<<<...444???NNN]]]nnn}}}ŒŒŒ˜˜˜ŁŁŁŤŤŤ°°°ąąąŽŽŽ§§§œœœ{{{fffRRR???///...<<>>...999JJJ]]]ooo€€€ŠŠŠłłłťťťÂÂÂĆĆĆČČČÇÇÇĂĂĂźźźąąą˘˘˘|||fffQQQ>>>...777JJJ]]]mmm|||‰‰‰“““ĽĽĽŤŤŤąąąśśśšššźźźžžžżżżŔŔŔÁÁÁÁÁÁÁÁÁÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÁÁÁÁÁÁÁÁÁÁÁÁŔŔŔžžžźźźšššłłłŹŹŹŁŁŁ———‰‰‰xxxeeeRRR@@@111777FFFVVVhhhxxxˆˆˆ•••   ¨¨¨­­­ŻŻŻŹŹŹŚŚŚ›››ŒŒŒ{{{gggRRR???///111@@@RRReeewwwˆˆˆ———¤¤¤ŻŻŻšššŔŔŔĹĹĹÉÉÉĘĘĘÉÉÉĆĆĆŔŔŔ¸¸¸­­­   |||gggQQQ>>>...999JJJ]]]ooo€€€ŠŠŠłłłźźźÂÂÂÇÇÇÉÉÉÉÉÉĆĆĆŔŔŔśśśŠŠŠ˜˜˜„„„oooYYYEEE444888LLL___pppŒŒŒ˜˜˜˘˘˘ŞŞŞ˛˛˛¸¸¸˝˝˝ÁÁÁÄÄÄĆĆĆČČČÉÉÉÉÉÉĘĘĘĘĘĘĘĘĘËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËĘĘĘĘĘĘĘĘĘĘĘĘÉÉÉÇÇÇÄÄÄŔŔŔťťťłłłŞŞŞŽŽŽ}}}jjjVVVCCC333222@@@QQQcccttt„„„‘‘‘ĽĽĽŞŞŞŹŹŹŠŠŠŁŁŁ™™™‹‹‹yyyfffRRR???000555DDDVVViii{{{‹‹‹ššš§§§˛˛˛ťťťÂÂÂÇÇÇËËËĚĚĚËËËČČČÂÂÂşşşŻŻŻĄĄĄ|||gggQQQ>>>...999JJJ]]]ooo€€€ŠŠŠ´´´źźźĂĂĂČČČËËËËËËÉÉÉĂĂĂşşşŽŽŽŸŸŸŒŒŒwwwaaaMMM:::888LLL___qqq€€€ŽŽŽššš¤¤¤ŽŽŽľľľźźźÁÁÁĆĆĆÉÉÉĚĚĚÎÎÎĎĎĎĐĐĐĐĐĐĐĐĐŃŃŃŃŃŃŃŃŃŃŃŃŃŃŃŇŇŇŇŇŇŇŇŇŇŇŇŇŇŇŇŇŇŇŇŇŇŇŇŇŇŇŇŇŇŇŇŇŇŇŇŇŇŇŇŇŇŇŇŇŃŃŃŃŃŃŃŃŃŃŃŃĐĐĐĐĐĐĎĎĎÍÍÍĘĘĘĆĆĆŔŔŔ¸¸¸­­­ĄĄĄ’’’€€€mmmYYYFFF555$$$;;;LLL^^^ppp€€€˜˜˜ĄĄĄŚŚŚ§§§ĽĽĽŸŸŸ•••ˆˆˆwwwdddQQQ>>>///999III[[[mmmŞŞŞ´´´˝˝˝ÄÄÄÉÉÉÍÍÍÎÎÎÍÍÍÉÉÉĂĂĂťťť°°°˘˘˘‘‘‘}}}gggRRR>>>...999JJJ]]]ooo€€€ŠŠŠ´´´˝˝˝ÄÄÄÉÉÉĚĚĚÍÍÍËËËĆĆĆżżż´´´ĽĽĽ”””€€€jjjUUUBBB222777JJJ^^^ppp€€€ŽŽŽ›››ŚŚŚŻŻŻ¸¸¸żżżÄÄÄÉÉÉÍÍÍĐĐĐŇŇŇÓÓÓŐŐŐŐŐŐŐŐŐÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖ××××××××××××××××××××××××××××××××××××××××××ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖŐŐŐÔÔÔÓÓÓŃŃŃÎÎÎÉÉÉĂĂĂşşşŻŻŻ˘˘˘“““nnnZZZFFF555777GGGYYYkkk{{{‰‰‰”””œœœĄĄĄ˘˘˘   ššš‘‘‘„„„sssaaaNNN===...///===NNN```rrrƒƒƒ’’’   ŹŹŹˇˇˇżżżĆĆĆËËËÎÎÎĎĎĎÎÎÎËËËĹĹĹźźźąąąŁŁŁ‘‘‘}}}hhhRRR>>>...999JJJ]]]ooo€€€ŠŠŠ´´´˝˝˝ÄÄÄĘĘĘÍÍÍÎÎÎÍÍÍÉÉÉĂĂĂšššŹŹŹœœœˆˆˆsss^^^III888444HHH[[[mmm}}}ŒŒŒ™™™¤¤¤ŽŽŽˇˇˇżżżĹĹĹĘĘĘÎÎÎŃŃŃÔÔÔÖÖÖ×××ŘŘŘŘŘŘŮŮŮŮŮŮŮŮŮŮŮŮŮŮŮÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚŮŮŮŮŮŮŮŮŮŮŮŮŮŮŮŘŘŘ×××ŐŐŐÓÓÓĎĎĎĘĘĘĂĂĂťťťŻŻŻ˘˘˘’’’€€€mmmYYYEEE555444CCCTTTeeeuuu‚‚‚•••ššš›››™™™“““ŠŠŠ}}}nnn]]]KKK:::333BBBSSSeeewww‡‡‡–––ŁŁŁŻŻŻšššÂÂÂČČČÍÍÍĐĐĐŃŃŃĐĐĐĚĚĚĆĆĆžžž˛˛˛ŁŁŁ’’’~~~hhhRRR>>>...999JJJ]]]ooo€€€ŠŠŠ´´´˝˝˝ÄÄÄĘĘĘÎÎÎĐĐĐĎĎĎĚĚĚĆĆĆžžž˛˛˛ŁŁŁ‘‘‘}}}hhhSSS@@@000222DDDWWWiiizzz‰‰‰———˘˘˘­­­śśśžžžÄÄÄĘĘĘÎÎÎŇŇŇŐŐŐ×××ŘŘŘŮŮŮÚÚÚÚÚÚÚÚÚŰŰŰŰŰŰŰŰŰŰŰŰÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜŰŰŰŰŰŰŰŰŰŰŰŰÚÚÚÚÚÚŮŮŮŘŘŘ×××ÔÔÔĐĐĐĘĘĘĂĂĂššš­­­   ~~~jjjVVVCCC333000>>>NNN^^^nnn{{{………‘‘‘“““‘‘‘‹‹‹‚‚‚vvvgggVVVFFF666777GGGXXXjjj{{{‹‹‹™™™ŚŚŚąąąťťťÄÄÄĘĘĘĎĎĎŃŃŃŇŇŇŃŃŃÎÎÎČČČżżżłłł¤¤¤“““~~~hhhRRR>>>...999JJJ]]]ooo€€€ŠŠŠ´´´˝˝˝ĹĹĹĘĘĘĎĎĎŃŃŃŃŃŃÎÎÎĘĘʸ¸¸ŞŞŞ™™™†††qqq\\\HHH666///@@@RRRddduuu„„„’’’ŸŸŸŞŞŞłłłźźźĂĂĂÉÉÉÍÍÍŃŃŃÔÔÔ×××ŘŘŘŮŮŮÚÚÚŰŰŰŰŰŰÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜŰŰŰŰŰŰÚÚÚŮŮŮ×××ÓÓÓĎĎĎČČČŔŔŔśśśŞŞŞœœœ‹‹‹yyyfffRRR@@@000888GGGVVVeeerrr|||ƒƒƒˆˆˆ‰‰‰‡‡‡yyymmm___OOO???222...<<>>...999JJJ]]]ooo€€€ŠŠŠ´´´˝˝˝ĹĹĹËËËĎĎĎŇŇŇŇŇŇŃŃŃÍÍÍĆĆĆ˝˝˝°°°ĄĄĄ{{{fffQQQ>>>///;;;LLL]]]ooošššĽĽĽŻŻŻ¸¸¸ŔŔŔĆĆĆËËËĎĎĎÓÓÓÖÖÖŘŘŘŮŮŮÚÚÚŰŰŰÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜŰŰŰÚÚÚŘŘŘŐŐŐŃŃŃĚĚĚĹĹĹ˝˝˝˛˛˛ŚŚŚ———‡‡‡tttaaaNNN<<<...222???MMM[[[gggqqqxxx|||}}}zzzuuummmbbbUUUFFF888333AAARRRddduuu………”””ĄĄĄ­­­ˇˇˇŔŔŔČČČÎÎÎŇŇŇÔÔÔÔÔÔÓÓÓĎĎĎÉÉÉŔŔŔ´´´ĽĽĽ“““iiiRRR>>>...999JJJ]]]ooo€€€ŞŞŞľľľžžžĹĹĹËËËĐĐĐÓÓÓÔÔÔÓÓÓĐĐĐĘĘĘ¡ˇˇŠŠŠ˜˜˜………ppp[[[GGG666555EEEVVVgggxxx‡‡‡”””   ŤŤŤ´´´źźźÂÂÂČČČÍÍÍŃŃŃÔÔÔÖÖÖŘŘŘŮŮŮÚÚÚŰŰŰÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝŢŢŢŢŢŢŢŢŢŢŢŢŢŢŢÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜŰŰŰŮŮŮ×××ÔÔÔĎĎĎÉÉɸ¸¸­­­   ‘‘‘€€€nnn[[[HHH888777CCCOOOZZZcccjjjnnnooolllggg___UUUIII===111888GGGYYYjjj{{{ŠŠŠ˜˜˜¤¤¤°°°şşşÂÂÂĘĘĘĎĎĎÓÓÓŐŐŐŐŐŐÔÔÔĐĐĐĘĘĘÁÁÁľľľŚŚŚ”””iiiRRR>>>...999JJJ]]]ooo€€€ŞŞŞľľľžžžĆĆĆĚĚĚŃŃŃÔÔÔŐŐŐÔÔÔŇŇŇÍÍÍĆĆĆ˝˝˝°°°ĄĄĄ{{{fffQQQ???000000>>>NNN___pppšššĽĽĽŻŻŻˇˇˇžžžÄÄÄĘĘĘÎÎÎŃŃŃÔÔÔÖÖÖŘŘŘŮŮŮÚÚÚŰŰŰÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝŢŢŢŢŢŢÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜŰŰŰŰŰŰŮŮŮ×××ÔÔÔŃŃŃËËËĹĹĹ˝˝˝łłł§§§™™™ŠŠŠyyygggTTTBBB333///999CCCMMMUUU[[[^^^___]]]XXXQQQHHH===333000>>>NNN___qqqŠŠŠ´´´˝˝˝ĹĹĹĚĚĚŃŃŃÔÔÔÖÖÖÖÖÖÔÔÔĐĐĐĘĘĘÁÁÁľľľŚŚŚ”””iiiSSS>>>...999JJJ]]]ooo€€€ŞŞŞľľľžžžĆĆĆĚĚĚŃŃŃÔÔÔÖÖÖÖÖÖÔÔÔĐĐĐĘĘĘ¡ˇˇŠŠŠ˜˜˜………ppp\\\HHH777777FFFVVVgggwww†††“““žžžŠŠŠąąąšššŔŔŔĹĹĹĘĘĘÎÎÎŃŃŃÔÔÔÖÖÖŘŘŘŮŮŮÚÚÚŰŰŰÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜŰŰŰÚÚÚŮŮŮ×××ŐŐŐŃŃŃÍÍÍÇÇÇŔŔŔˇˇˇŹŹŹ   ’’’‚‚‚qqq___MMM<<<...///777???EEEJJJMMMNNNLLLHHHBBB:::222666DDDUUUfffwww†††”””ĄĄĄ­­­ˇˇˇŔŔŔÇÇÇÍÍÍŇŇŇŐŐŐ××××××ŐŐŐŃŃŃĘĘĘÁÁÁľľľŚŚŚ”””iiiSSS>>>...999JJJ\\\ooo€€€ŞŞŞľľľžžžĆĆĆĚĚĚŃŃŃÔÔÔÖÖÖ×××ÖÖÖÓÓÓÎÎÎĆĆĆ˝˝˝°°°ĄĄĄ|||gggSSS@@@111111>>>NNN^^^nnn}}}ŠŠŠ———ĄĄĄŤŤŤłłłťťťÁÁÁĆĆĆĘĘĘÎÎÎŃŃŃÓÓÓŐŐŐ×××ŘŘŘŮŮŮÚÚÚŰŰŰŰŰŰÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÜÜÜÜÜÜÜÜÜÜÜÜŰŰŰŰŰŰÚÚÚŮŮŮŘŘŘÖÖÖÔÔÔŃŃŃÍÍÍČČČÁÁÁššš°°°ĽĽĽ˜˜˜ŠŠŠzzzhhhVVVEEE666222777;;;===>>><<<999444//////<<>>...999III\\\nnnŠŠŠ´´´˝˝˝ĹĹĹËËËĐĐĐÔÔÔÖÖÖ××××××ÔÔÔĐĐĐĘĘĘ¡ˇˇŞŞŞ™™™‡‡‡rrr^^^JJJ999666DDDTTTdddsssŽŽŽ™™™¤¤¤ŹŹŹ´´´ťťťÁÁÁĆĆĆĘĘĘÍÍÍĐĐĐŇŇŇÔÔÔÖÖÖŘŘŘŮŮŮÚÚÚÚÚÚŰŰŰŰŰŰŰŰŰŰŰŰÜÜÜÜÜÜŰŰŰŰŰŰŰŰŰŰŰŰÚÚÚŮŮŮŘŘŘ×××ŐŐŐÓÓÓĐĐĐÍÍÍČČČÂÂÂťťť˛˛˛¨¨¨qqq___NNN>>>000...///000...555CCCSSSddduuu„„„’’’ŸŸŸŤŤŤľľľžžžĆĆĆĚĚĚŃŃŃŐŐŐ×××ŘŘŘŘŘŘŐŐŐŃŃŃĘĘĘÁÁÁľľľŚŚŚ”””iiiSSS>>>...999III\\\nnnŠŠŠ´´´˝˝˝ĹĹĹËËËŃŃŃÔÔÔ×××ŘŘŘŘŘŘÖÖÖÓÓÓÎÎÎÇÇÇ˝˝˝ąąą˘˘˘‘‘‘~~~iiiUUUCCC333///<<>>...999III\\\nnnœœœŠŠŠ´´´˝˝˝ĹĹĹËËËŃŃŃÔÔÔ×××ŘŘŘŮŮŮ×××ŐŐŐŃŃŃĘĘʸ¸¸ŤŤŤ›››‰‰‰uuuaaaMMM<<<...333@@@NNN]]]lllzzz†††’’’œœœĽĽĽ­­­łłłšššżżżĂĂĂÇÇÇĘĘĘÍÍÍĎĎĎŃŃŃÓÓÓÔÔÔŐŐŐÖÖÖ××××××××××××××××××××××××ÖÖÖŐŐŐÔÔÔŇŇŇĐĐĐÍÍÍĘĘĘĆĆĆÁÁÁťťť´´´ŤŤŤĄĄĄ–––ŠŠŠ|||mmm]]]MMM===000444BBBRRRccctttƒƒƒ‘‘‘ŠŠŠłłłźźźÄÄÄËËËĐĐĐÔÔÔ×××ŘŘŘŮŮŮŘŘŘŐŐŐŃŃŃĘĘĘÁÁÁľľľŚŚŚ”””iiiRRR>>>...999III\\\nnnœœœŠŠŠ´´´˝˝˝ĹĹĹËËËĐĐĐÔÔÔ×××ŘŘŘŘŘŘŘŘŘÖÖÖŇŇŇÍÍÍĆĆĆ˝˝˝ąąąŁŁŁ“““€€€lllXXXEEE555777CCCRRR```nnn{{{‡‡‡’’’›››¤¤¤ŤŤŤ˛˛˛ˇˇˇźźźÁÁÁÄÄÄČČČĘĘĘĚĚĚÎÎÎĐĐĐŃŃŃŇŇŇÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÓÓÓŇŇŇĐĐĐĎĎĎÍÍÍĘĘĘÇÇÇĂĂĂžžžššš˛˛˛ŞŞŞ˘˘˘———ŒŒŒqqqbbbSSSCCC555...;;;JJJZZZkkk{{{‰‰‰———ŁŁŁ­­­ˇˇˇżżżÇÇÇÍÍÍŃŃŃŐŐŐ×××ŘŘŘŘŘŘ×××ŐŐŐĐĐĐÉÉÉŔŔŔ´´´ĽĽĽ”””iiiRRR>>>...888HHH[[[mmm~~~ŽŽŽœœœ¨¨¨łłłźźźÄÄÄĘĘĘĎĎĎÓÓÓÖÖÖ×××ŘŘŘ×××ÖÖÖÓÓÓĎĎĎÉÉÉÁÁÁˇˇˇŞŞŞ›››ŠŠŠwwwcccPPP>>>000...999FFFTTTaaaooo{{{†††ššš˘˘˘ŠŠŠŻŻŻľľľššš˝˝˝ÁÁÁÄÄÄÇÇÇÉÉÉËËËĚĚĚÍÍÍÎÎÎĎĎĎĐĐĐĐĐĐĐĐĐĎĎĎĎĎĎÎÎÎĚĚĚËËËÉÉÉĆĆĆĂĂĂŔŔŔťťťśśś°°°ŠŠŠ   ———ttteeeWWWHHH:::...444BBBRRRcccsss‚‚‚œœœ§§§ąąąşşşÂÂÂČČČÎÎÎŇŇŇŐŐŐ×××××××××ÖÖÖÓÓÓÎÎÎČČČżżżłłł¤¤¤“““~~~hhhRRR>>>...888HHHZZZmmm~~~›››§§§˛˛˛ťťťÂÂÂÉÉÉÍÍÍŃŃŃÔÔÔŐŐŐÖÖÖÖÖÖŐŐŐÓÓÓĎĎĎĘĘĘÄÄÄťťť°°°ŁŁŁ“““nnnZZZHHH777000;;;HHHUUUbbbnnnzzz………ŽŽŽ———ŸŸŸĽĽĽŤŤŤąąąľľľššš˝˝˝ŔŔŔÂÂÂÄÄÄĆĆĆČČČÉÉÉÉÉÉĘĘĘĘĘĘĘĘĘÉÉÉÉÉÉČČČĆĆĆÄÄÄÂÂÂżżżťťťˇˇˇ˛˛˛ŹŹŹŚŚŚžžž–––ŒŒŒuuuhhhYYYKKK===111...:::IIIZZZjjjzzzˆˆˆ•••   ŤŤŤ´´´źźźĂĂĂÉÉÉÎÎÎŃŃŃÔÔÔŐŐŐÖÖÖŐŐŐÔÔÔŃŃŃÍÍÍĆĆĆ˝˝˝˛˛˛ŁŁŁ’’’~~~hhhRRR>>>...777GGGYYYlll}}}ŒŒŒšššŚŚŚ°°°šššŔŔŔĆĆĆËËËĎĎĎŃŃŃÓÓÓÓÓÓÓÓÓÓÓÓŃŃŃÎÎÎĘĘĘĹĹĹ˝˝˝´´´¨¨¨šššŠŠŠwwwdddQQQ???111111<<>>...666FFFXXXjjj{{{ŠŠŠ˜˜˜¤¤¤ŽŽŽśśś˝˝˝ĂĂĂČČČËËËÍÍÍĎĎĎĐĐĐĐĐĐĎĎĎÎÎÎĚĚĚÉÉÉÄÄÄžžžśśśŤŤŤŸŸŸmmmZZZGGG777111;;;FFFRRR]]]iiittt}}}†††ŽŽŽ•••›››ĄĄĄŚŚŚŞŞŞŽŽŽąąą´´´śśś¸¸¸šššşşşťťťťťťťťťşşşšššˇˇˇľľľ˛˛˛ŻŻŻŤŤŤ§§§˘˘˘œœœ–––ŽŽŽ†††|||rrrfffZZZMMMAAA555888GGGWWWhhhwww………‘‘‘œœœŚŚŚŻŻŻˇˇˇ˝˝˝ĂĂĂÇÇÇĘĘĘÍÍÍÎÎÎĎĎĎĎĎĎĎĎĎÍÍÍĘĘĘĆĆĆŔŔŔˇˇˇ­­­ŸŸŸŽŽŽ{{{fffQQQ>>>...444DDDVVVgggxxxˆˆˆ•••ĄĄĄŤŤŤłłłşşşżżżÄÄÄÇÇÇÉÉÉĘĘĘËËËËËËĘĘĘÉÉÉČČČĹĹĹÁÁÁźźźľľľ­­­˘˘˘•••………tttaaaOOO>>>///000:::DDDOOOZZZdddnnnxxx€€€ˆˆˆŽŽŽ”””šššŸŸŸŁŁŁŚŚŚŠŠŠŹŹŹŽŽŽŻŻŻ°°°ąąąąąąąąą°°°ŽŽŽ­­­ŞŞŞ§§§¤¤¤   ›››–––‰‰‰xxxnnncccXXXLLL@@@666///===MMM]]]mmm{{{ˆˆˆ”””žžž§§§ŻŻŻśśśźźźŔŔŔÄÄÄĆĆĆČČČĘĘĘĘĘĘĘĘĘÉÉÉČČČĹĹĹÁÁÁťťťłłłŠŠŠœœœŒŒŒyyydddPPP===...222BBBSSSddduuu„„„‘‘‘œœœŚŚŚŽŽŽ´´´şşşžžžŔŔŔÂÂÂÄÄÄĹĹĹĹĹĹĹĹĹÄÄÄÂÂÂŔŔŔ˝˝˝šššłłłŤŤŤĄĄĄ–––ˆˆˆyyygggUUUCCC444...777@@@JJJUUU___hhhqqqyyy€€€‡‡‡’’’–––ššš   ˘˘˘¤¤¤ĽĽĽĽĽĽĽĽĽĽĽĽ¤¤¤˘˘˘   žžž›››———“““ŽŽŽˆˆˆzzzrrrhhh^^^TTTIII>>>555222@@@PPPaaappp~~~ŠŠŠ•••žžž§§§ŽŽŽłłł¸¸¸źźźżżżÁÁÁĂĂĂÄÄÄÄÄÄÄÄÄĂĂĂÁÁÁżżżťťťľľľ­­­ŁŁŁ———ˆˆˆvvvbbbNNN<<<$$$000>>>OOO```qqqŒŒŒ———   ¨¨¨ŽŽŽłłłˇˇˇšššťťťźźź˝˝˝˝˝˝˝˝˝źźźťťťšššˇˇˇłłłŽŽŽ¨¨¨ŸŸŸ•••‰‰‰{{{kkkYYYHHH888333<<>>CCCGGGKKKNNNQQQSSSUUUVVVVVVVVVTTTSSSPPPMMMIIIEEE@@@;;;777222$$$$$$888EEERRR^^^hhhqqqxxx~~~ƒƒƒ‡‡‡‰‰‰‹‹‹ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŒŒŒŠŠŠ‡‡‡‚‚‚}}}uuulllaaaTTTFFF888$$$777CCCOOOYYYccckkkqqquuuyyy{{{}}}~~~~~~|||zzzwwwsssnnnggg___TTTIII===111000333777:::===???AAACCCDDDDDDDDDCCCAAA???===999666222...222===HHHSSS]]]eeekkkqqquuuxxx{{{|||~~~~~~~~~|||zzzxxxtttnnnggg___TTTIII<<<111...777AAAKKKSSSZZZ```eeehhhjjjlllmmmnnnnnnnnnnnnnnnnnnnnnmmmllljjjhhhddd___YYYQQQHHH>>>444...000222333444444444333222000...333===FFFOOOVVV]]]aaaeeehhhjjjlllmmmnnnnnnnnnnnnnnnnnnmmmllljjjgggccc^^^XXXPPPGGG===333$$$555<<>>BBBDDDFFFHHHHHHIIIIIIIIIIIIIIIIIIIIIIIIHHHGGGEEEBBB???;;;666000...333888===@@@CCCEEEGGGHHHIIIIIIIIIIIIIIIIIIIIIIIIHHHFFFDDDAAA===999444...$$$000333555666777888888888999999999888888888888777555444111...///222444666777888888888888999888888888888777666444222///esdl-1.2/test/PoweredSmall.bmp0000644000076400010400000001124611540750060020303 0ustar familjenAdministratörerBMŚŚ(@@m m œœ˙˙˙!!!)))111999BBBJJJRRRZZZccckkksss{{{„„„ŒŒŒ”””œœœĽĽĽ­­­ľľľ˝˝˝ĆĆĆÎÎÎÖÖÖŢŢŢçççďďď÷÷÷ççďďď÷÷÷˙ĆĆÎľľ˝˝˝Ć””œss{çç÷{{„ŢŢďJJRBBJ!ďçď÷ď÷˙÷˙ÖÎÖJBJ)!)çŢďĆ˝Î!)ďç÷÷ď˙νŢRJZ1)9˝ľĆœ”ĽÖĆ答ÎνçƵތk˝„cľ˝­ÖĽŒÎR9{kB­c9ĽZ1œJœB”)çŢ÷œ„Ć„c˝{ZľsR­cBœR1ŒZ1ĽR)œ9ŒB!Z)s1„­œÎ”{Ìs˝J9ksRľkJ­cBĽR)ĽJ!œB”9Œ9”!c){1ŒŢÖďÖÎç˝­ŢľĽÖ1)B„k˝ZBŒcB­Z9ĽB){J)”!Bœ9”1Œ1J!k)„­œÖĽ”Î{cľsZ­R1ĽJ)œ1”R!s)ŒĆ˝Ţ„{œœŒĆ{c˝9ÖÎďÎĆ羭έĽĆZRs”„ĆJ!Bľ­Ö)›››› ›››››››››››››››››››› ››››››››››››››››››››› ››››››››››››››› ››› ››››››››››››››››››››› ››››››››››››››› ›››››››››››››› ›››››››››››››››››› ›››››››››››››mmmmmŠŠŠŠmmmmŠmmmmmmŠmmmŠmmmmmmmmmmmmŠFŠmmmmŠŠŠŠŠŠmŠmmmmŠmmmmmŠmmŠŠŠnŠŠmmŠmŠŠmmmmmŠhmmmŠŠŠmŠŠmŠmmmmŠmmmmŠmŠmmmmmmŠŠmmŠmŠŠmmmmmmŠmmmmŠmmmmmmŠmmmmmmŠmmmmmmmmmmmmŠmmŠmŠŠmŠmmmmŠmmmmŠmmmŠ‚ŠmŠŠmŠmmzmmmmmŠmmmmmmŠmmmmmmmmmŠmmmmmmm››››mmmŠŠmmŠmŠŠmmmmmmŠmmŠŠmŠmŠŠmmm››m›››mmmŠŠmmŠmŠŠmmmmmmŠmmŠŠmŠmŠŠmmm››m››››› ››M]mmŠmmŠmmmmmmŠmmNŠmŠmŠŠmmm››››Š›››››Š›J€› Šmmm››5ommmmmj›vŠmmmmmmm›››Š›››››‘Kmm› Šmm-Xm~›m››››fŠmmmm#im ›G››››š›†Š›mŠm›9`g‡Šm›umk›WŠmŠmm››››››€› ›››››››  ››››€›››››m››››››››››{m››››mŠ›››››››››››im›››mm››››››››››››Nm››mm›››››› ››››mm›››››O€mŠŠ››ŠŠŠmmŠŠŠmŠŠmmmmmm››ŠŠmŠŠŠŠŠmŠŠmmmmmm›€›ŠŠmmmmmmmmmmmŠŠmmŠ›mmmmmmmmmmmmmmŠŠmmŠmmmmmmmmmmŠmmmmmŠŠmmmmmmŠŠŠŠ{mŠŠmmmmmmŠŠmŠŠŠŠmŠmmmŠŠesdl-1.2/test/sample.wav0000644000076400010400000035613211540750060017213 0ustar familjenAdministratörerRIFFRÜWAVEfmt 2"V“+ ô˙Ŕ@đĚ0˙ˆ˙factU°dataÜUö˙ŐŐń ӓńâĄđÔĐ0R C0@çńňäÖâô QńôĂÔóô;Ý ĐűďÎЀŕěîďŔ ďĐŔĐĐŢîÝ ÓâőôńÓâĂĂćđ . P=ŃĂńă Óăĺń> ԂăÓ$#$$ő"ôä6ňáńw"óń/-=‚ąţąą˙íÎěŕ€ŕîĎÜ˙żü űţĐ ßďĐŢíŔąŔŕŇć .0×ňĺňŕ P ŕĄń0ěĎîÎÍîÁ˘Đ ŕĄđă2'ňA"20472347 #ö"ó/Đ .ÂÔ@‘ţ˛ŕŰ+Ŕąŕ ëŕÁŃÝÜâĐ  Ţţ °Ýţ áŕ‚ÁĂńđââĄđÓĂđĆŃŃ˙â ĂԓP×Óô07 >$çňĺâ . ßŔ°€ßßÓÓ7!%ö#D43c!` Ĺâă×ÂŃňŕÂłŃýý˛ąđĐžÝüĐťď°đ ŕĐĐŔŕŕЏđá˘ŇđŕŔаŔńâł*úům ž50âAT3D#!ôóĂđ ^ €Ďďßěüаďţ Ŕí˙ĎüĎÍÍ ÝžĐŕóŕ. ×$5#$4$$ âBEó˛ó .Ó ÍŔĐńĘÚţß Ý˙ŕáÝ ŃńŮ #žÍŇąŃâŕŔ‚ đNßP@0$°Őď@0˛0á“đóžň=îő -íŕ 2â°Gđň/MŢňŮ-˛ Bý€ń!ďÎPáß €đí܍Đ/ó>€oôţQÝä?ŕĺATţôa‹î?°BüĎtęě/Đ,Đórý˙đ0đďóŕJ>ŔŃ@ đżđ@óAě°R"ÎíĎţ˙Ÿňœ !˙Úúţ˙Żŕ°1ůđ_đD:ĐpđđĐ?ü÷˙2TŔń'.ďB°ó!6# ĚôaÎŕßń˙qüßż"ËĎďíĽ@ ŻBÎŕ4!$aÝ%CŽ˙Đŕŕßđt˙îó(Ď>€ń1+Đňĺŕp˙ ń ö/Ţ˙ %ĎÂ? ÔĐ÷;!ý@áîq"ü"Î#"ŕ4Đ`1đŔ>Ôţ 3؁1Íńýűńďđż1ŃŹ˙’ î ĐAďĐ˙ÓO¸° %ď°đ!ěíŕ@Ńţđż3ëţđą.ŕßĐ3áPŔ˙°%îÍ$BýŘá$ÎŕňQÜ.‘ĺ ˙đĐŔđţ!> ŇDýďĎűěŕđ1 ł3ÍđâEŔżđRŕ°B 0ßŰ í3Ŕ%"CŹĐ ˙ŢÁB AÜârž˙î20čđď2đ`đáq1ěß"ţ×pßŕ?ŕq2 íÓ5ąŔď#ň!ÎźüRÝ˙ńĚCž°â˙ćűŕŕěÜ °Ń#@ĎëŽíR îďýĂC €đ!۲& ˙AŕŢâR2úŕá%pěńS ŕ &ű˙ Ô, a/îĐRýÍ Ü"Bťîđ4A ńÎ'ßŃGččú×˙˙~ń5îŃ ŕÂýßŇNŐ3Ďđ$đîáPŰ 2źŕńđ0Žýä$ŢŃb ĎŃaďŔŕs žŕ!ýňňĚ"& °đ˘ ĘC°Đ4żđCŕŻđđtŻđ#îđ'°3.đßád ŇrţŕB"Žň'ţń7ž˙ŕ˙öÝ4 Ř˙! %˙żÁ4ްBüżăß߲`0Ůŕ" °3ň"2ď0đŃ4 ÝŔS0Îą3P Ž!?˙đîŽńQ1˝Ŕ˙ěđŕ&Đ$4 đ ĐőŢŕ ßÁ6ýÜăA!đţâD ëĎŕb@ďďŃ'ŔA˝đ0đßMŸđ1ĘýÝ@0ň܏ŕ$0ě Đ"Ý˙B0€ó2ŮđđŕŰá! Ď7"ű đ*ěíFđëđŕCÎŕ"ĚRđń"Ú2đžĐe0ŢŘŕ!ńíßŔ×&ţđ ń$? ŕđřA Ŕ'"ÎB#Œď3ăíŽŕát 0 ő#đ °ŕ%Ńîąr îń44,íđâ'w ŽňbáÎßŕE2 ŔŕŇC,ď4#űîďţpńů4­ń34úđëݲCÚß#ßа% Ď ?éţÁ˙Ą?Œ# îňŔôRěŽŕ4 ܟ& Đ"íâ2 ż 0Ŕ˙ŢrBťĐA!°îĺD Ü î" žRŔ $ ďţđáAîňŔěŢđ ńs0üýÝÖ4 żđS/ÎÝb?ż0î°Ďđb žPî˙ŔŕG!ÝíC ŻŕŇuýď%!üń1ŕ° ÂĚđBÍíńV$˙ďÜ đđĐĐŕd0 î"4űŕ1˙ß´đçčď4 Ü%5üýßPĐ ýŕ'2 ÜFĎěńŕčŢ5 ěŢă"ďŽ6 ßăaţŃqěţB°ŕ˙ îáěá5Aü!/ą>Îőcżýđ3đÁ"Üń’đB,ëĎôaŢńďŃĄS+đýî"ďĎâ Ő#č˙Ü !áĚ"0ΞâCđŕ áAďăÖ đ0ďĎ ËÔ"ÁáŐ˛Đ4!ž°$đ Ŕ!ĂţäĐĹá%Đ3đýF˙Ąűáäąýňíń ‘0Ü2ĄôďóŐýP"ÁÄŕóA ?ôŁ B-ŕDăŁáđ@>aÍAŕőńíň1=ࢠ۠ÁđŃď° ĂäGáî'×0 "‘ł!4 01`ńŢ7đPńáóľňżđA0ýýŰŇbë đ%˙óźľđä @°îP.°ń2ŔŔ pđBą:Ň=ţbżńŃ0$8ĐPŕĐó'^ŕä °=Ýőóú ż đžďĐOňŕsŸđ° ŕ"!ÁűâOß"€đňéđ1ý"řĐ%żŔň`Ŕ!  đ˙ţP#ęÝ@ű"ď ß%ëŕ0Ţď ż/đŸ0đŔĂĎS!řß%"ëĐ"˙2°Ż!"č˙ Đ #˝ !>Ž4ďŕáéŔC!źŔíĎ"ŕ ࿒5 Đńŕ÷Ż 1! ßůđBţň­ÁUÝÁ ď!˙čâDî áĆÝíä4ÁýôŇ­ 2ţŽđTÎŃ! ß" úĄR/Üđ!ärÝëD Đ#áüĎÔ6ĎŃ#` đ!0ŕń&ýîäEěţ°&ď0A ÎS˝5îíĐ6˙˙đŸ"Żá˙đ6ţ˙đď  ß1Ž˝ň% ˙ŕ ´"Ÿđŕ%žýCŕް7 Ŕ"ýÎ# ÍßŃ6îďó>$ ËĐţ0žďńq/ŕžá7íßţĐŃ!5Pűţđ5ďĐ"Ë"P ˙ ˙đ!ÍÝU0žâ%üŕţîÂ$a ďŕDîţP ň43 Ď!đŇĺ%ěďń%đ0žá5 2 ÝĎžđá7ď! Ą4ž4ý"$ŽŃB ěţ"CËĐóQ3Źţ2˙°-î6Ëŕđ%Żńđó$Ę˙%ýŕń`0ÍÎA_݀đ4Ţňë" °0ř %#ÍŕîĐđE"ÍŻň3 Ţď%ďđűđ`"Żńî ż"Ŕŕ2üüńFíŻâŕÍÁÄ7ŕđ°3@ËđńáÝ,Š#ďŕ6 üŕE1üÍŕ5@žĐB0.Ď0ž!ßě" Üĺ4 óĚ4R ˝ŕ1Řß$ßÁđ$ ň#_Ž/ 1îϐ5˙ŕ$ŻŃ$4Żß#2Q îđ ďţ@ 1ůďđ"îą3űëô4đí1!ŽÁ/ÝĎ˙#a!ŽAîîăq ň!aűĐýĐ'Đ˙˙. Ž€3 źĐžßT ßţŔ/ß?ŸâţÓa ďŹ!îÜS! ëëđbýŔńCŔĐGĎßóR î ŔĎż3ýíĎ#Ţ˝°4 ŢŃ ŕtţÜňcÜň/Á#PčĐĎ ďďŇ`đż'#űţí#aŕŕíŇ A'ÝÎ! °Ńí˙ď6/ÝíöAđţíŕďE3íěÜd4­ŕ"aŰďţĹ%üđđĎ@˙đżÁBď ýý4"îňQßžŇ$˙ń Ôΰ âţäAí€˙ĺŔÔ1°Ŕ#aĚŔ´ý÷óŻĎß7ŕŃýŕs€đâŕ? ŕŽŕńŕŔŁÓńCŻĐ7đđďýÚňýđҲDŔÝP Ŕ0ÁóŐđäňú°ý @?ă₰đA";ýňđĺôđăĄńăÂŔ ţ˘óÍôT˙ţÝö ŕĆââ˙Ó`´đ đ׹ŕ óŕ.ţĘôŕ ăă%řđń˙pŃ/ÁFěÎ5ӓđŢĐăAĐ áâ‘đ"ń Žďĺňŕď˙ĄŐŰţď ń÷ďߡó˙Âó3˙ß AżŕŇÖ/ ëđú, "€ą°ŕäăďąłňń ÝĎ!'DáĐ@ĂĂđ5Ďăr €0?â˘#˛Đ'Đŕ15ŐÝ#Ç áđđŕRÇ/ âňÓ.ŔĐŐÝ~¢ő€Ôđđ"’ŕŔ°äÁđŇĄŃ ŢĐîѤŕ Ž ݰń îáëĐă_A  Á>"!Ąîá)Pŕ˙ ň#° !Ó ’ÔŇôăŔ ĈE௠33ŇíąB%ńáó!Ѐî&*ţŕăW3 žĐ#ń1íňđ€2 ŰíÝáĐŔđ!p"˙Čţ4$ÍđĹ1żŕ42ńď1€ďŢôĺ6žżŔ3Q˙ďްô!ÎüŔ7Cńŕď°$!GAŕďđŕĎŕ3"ݍŢ5""Űďđ ęđŕÝŽ"Óp'đýúđň5a"îż˙!'Ţ­ď$1°đ Ě˝Îđ!îŸßíŸĐŕńŕŕńĎęď/°ąňŕň7tđGÜďĂ'ąrÔ %ý˙4íü,˛AţűĐa-ĐPŃîďÎtţŕ ă0ŃÝórýđ"žá  Ď×!­ŢáAţßÍß3ˆ °ţŢŕQÝ"üĐŢc1@Œň âa đň"'?ţď˙U ń đR?Řđďňúíđ #ŘÁđ@ĎB˙"ň ô # BD°Bń?Q&>Ç-ŕC @Đá˙ ;×?ŇĎëŕŰüĐʉ‘ŰÜÝÍÜÝÍÍÜÝÍÍÜÝÍÎ÷ŢđÍ °bđüńŻa˙"Bís2 &ţ$@ţ÷`Ď@ţßtţű%ń"ŕTbýD âa!ý"!TţQ ŕ3sđQ ó+ńë3PĚŢ­ŕ °  żď ţĎßŢÝÎÜÝÍÜÝÍÍÜÝÍÍÜÝôŽđÝńý¤ đ%Üŕ/Ň"úňO?Á0đPđđ üárđqŔ&4Pŕ ŕ&đ11°#÷32`ä ô$>Ŕ Âţő0đŽđQÁ@đ@>â˙Ărđ5 ń"sńńBŢr3Ů 6í0Ýăű°ŕ%5E˙a#B!sD%!ĺ/đBđ4rń#ůŃO ÜëĐŕ>̰áJĐ˙ęńďűî°ÍÎţŻţžđą.ŰżÎ˙ţńŻÝĚěÝçđÁOžň?0ß÷ţcáđ@Ë ˝ Üú/ĐüĐüč˙ŢŢÎţŻđđîíÍťďđÝň,ŃŮëß˙"2űŢí'Oň/ ÝĂArŕý˛D"đ2@žŕž7q€đ1Ä0ÝŃUń>ńđA#, "!3 ăó@ĄŇnâ0 đ@Ő2ÂRÁ đá@ ô"ţń"˙ΰęýýđ ď0ńđ ¨˙ňđ ŕč °ńż0‘ĎŔëňđďnđ  ćÜôňĐ BôěđńąţňżÓĎÁrđ°Ó Ŕ O€2 ŕŕâ&Ŕ@ă ß$ŕAáÇ!Á/ ďĐ"ÔĐ+˛C ŕ>ÎĐ@#€ŕýÐď1  ŕ ý°ď Ň\⏰0äŕčńî×ă ´ĎîAüĎŔPë $ÚŇ$Ůň×ď ü˙?ł@Ŕň"< Óą#ă ŕýđr˙$˙˙Đ<×? !Ô //ŃŢp ăĐ0°oŕöŕ /0Ŕ4ţłň ţ>˘/Ľďâ@ţ>‘ ŔC˛ŕ ' âŕ1Ĺ đEĐíđŇ%đ ÎRîÝdą ˙ áâŻđ0 žâM¨Dîž.Ĺíađ˙đđQţqĐđĺąîâűßţ;őţÜűţűŕĂžŕîÁç  ń/,éđň!Ýđ €ÔđâNý˙aßÓń"đOĐ0ţîâĎŁ"ěńďQ÷˙Đň‚AÓă€ÂđO‘đ3đŕĎççâŕ@q˛"Ô#°@˙@0˙0°#ü˙’óúńýâë°ÂýŕĎĐÇ?ÂßäÝŕňô 0nߒ?/Óm5ŢФŕŕĎ%ý°Ŕ;đ ăţŕ@0ńДđ.ţß×đŇđÂ`Đ"ŕÓtó]˙& ňđ×"˝Ö=ߥ|˙€˙đŔýŔĐ­ß#ÝčÓ˛íÝ=çĎ#ŕţŇş ę%˙ý<Ă.ó óOĄđĄ>ĺâěó q˙˙óŕ´á€đŢ3.ßôá&îńüN˘!ňŕÓđ˛őPŐâ'á ^ŕ4ýŃĐ  ţŕ‘ ţÔ˝Ŕĺîŕ~˙đâΑđĎđÄÍâ ŚéčĄńÂςđ0đĎŕëóO 1ĎóžÔ4ďó/Öňđđđęň1íôđţâÝo!˙đmŇ0ĆÓÔq˙ł˛ ń@ßđ"!Ăôý'0 áĹâ "AÚ‘îĂ1ŕäżá= óŕQëŕĐčÓÜ"ŻđíďӀÓ*ŢOóŇÂĆŕ ˙đÁEŕý  ĐOß °Ó]óďГďpâĐőđ Đŕ"4řĆ ˙ á>á7ţţ ÷ŕŢő@°Ň0çđď`đ˝$RţŔ/üżîG!Đžŕ@!!߀Á îÄP€đ /Ђ1 ěţĺżÂ!  3cŻđíŽĺ2íޟđü C#˙Ď˙#žŔńFďýÎ7!Ţ˙Fđď $Ě1@ÜŃ<đrýÚńD ÎďŕĎďß70ܰ Żŕđ"R˙Ü ó!$üďţ2Q˙Ŕ°büţ!"íĎ 0 ťđ$Ü SÝŽB! ÍŕŕcěëP" ď"°ßĎF!°0ďŕCaţý°" °đ%ţﰏqřŃ$Běŕđ'P˙Ů1ŰđđB`ýޏâ1/ŽóBî˝ő2.Î˙$ßúáQ!0  ň2%ýßá7Pţěŕ1 đá 6ţŕžB Ęđ"1Řđţ4 żëó2ÎÝCţ݀#Ÿă!%żđß%1ޏA îţ16ýżŇD  B ĐÂ!îŮŕ$ îĎĐP@ţüż! ÍâA$!ĚđđĂqÍp°˙3@ÜÜĐ7ź" Đď˙%íčď! ŕďđTЎü°"P °â4ýËábŢď˙' ŰĐŻá2żŕţręîßŃ7/ĎÎáSń1ý€ăýĐĐó&"ßËĐT đđđ$`îß0ĚŔB"ŽđňRĎżăQŢÎ!íÍŔ4 Žň"Ÿŕ1 Ţ  ˙síż4#űAíßä6ţź`˙ŕŕţ6! íí!OÎŕ2$0­˙đcü ˝ î üFĎÎQ Ţô$$  ŕ4@đžŔDŃ ŕ5DďĎÎëĐ$0Řđá$.űěňaďîńb@íÎđ&#¸Ÿâ"2?$!ŕܰ%Ŕ ŕFŢŢô34űż1Q đđ#?íŽĂ5đđŢŇBű ĚĐA20žđđCéěđŕß"T?ÎŢSA-­5 îđ40 ŮĐ5˙ŕíąq ěŕňB!ŘŔ"1ŮđŕB ŢźC˙ ÚG ýîŇB1ÜQŽ" ۰%đÎňtŢďâB Ż# ŕŕB ďžâCáŕýżđ'@ĎŕB1ŮĐQ0žđa. Ďő"đ  Ňb?ĎĐŃ3"B "$˙ ŰĐEđďţďrŔĐă12@Ŕ 4ëŕ5ýĚăR  á7!íĎ˝ĐQ!Žŕó6˙Ţž$0/˙ݎS.ŢÎ㠏 #ż˙5 ÜŃbîŢr Đ˙CŮĐ1űđâRŔ ńAđď°ŕ6 Î˙ŕ"A/Œă@Ÿý"ÜŢÍŕr.Ďď$2#ůݰŕ$!ţŽáCď­ '@ţŔݐ"ÜĐ ńbíÍ`ěŢát ěďĐ@Ěă3_Î "ţýÝ7 "îüíbĎĐŃŽ{íě4W\Ŕđ4ý˝áDđ0íÜßQţĐîáCC˝"3 đâRďÎRđďßâG íđßťń1@žđí!îĎßĎDÎ Đ'ýÎĎŕ6íďR ŕżý7#ţßďáT$ęĐ$R ŕŃqţíŕ46ްŃC@ěîÝq"ŽŇ@Q ţýîďĎäEŢđß$ ˝2%ýÜĐ'O˙ŕŔCýŔßbßţßôc!ŰÝ !<ÁCĐŔÍ÷$ţî˙ýýt Řđ €Ń$Ń?ěóbß°íď "ŘŔ˙ăžŕCPĚđ˛"ŸPţ°ńBэ˙ńĐ#Űňr đţÂ5ÁS í%Ţ ˝äađĐĐ6Ďí Đ0ÍŢá1#ĎáÝcbżá"0Ŕá&Ţ5Ż$ŔŻ#!Đ@Î ýą!îŕqěńAÜŕŮáÜŕbĐŕâ&üď4ÎĐß7żíđ1° ŻţĐ!"ÎŃ1ĎćýŔ/ó7üďőđĐđ"ďďDNÚ"üđĚ04°á :Î$ĐĎŐÚŕ#ŕĐ$/ëß"íŕóÎŕŽŢň$˙đ4ţŸđBżŇ" ŔÔîĚ"2ôÔđ€đG3íí4A/Íď2ŢĐńđ°ŕ ŽďAЎá7ÎßŕíßđˆÎđ32#/íîŔŕ4˝î"F3ďßŕĐç@Ęá4"đă'uýßđ úźĎC"ŢďA?ݎŕđŕč­ď#2E0u!íßŕëÍ&B žđCB ĎŃ&˙ýŕ2ÉÜSËî#B#a Ž5ÝŢÎßîcźÎc"Ţá2ßň5ßĐĘžDÍß3!!!ůß#2 ÜďđđĐÔ6Ü˝6"!Ýŕ6Îß˙ň˙ťÍáVěŢ4#ń% Űßđ˙ŕëžňCCLŕâ đôîýéţtüýň&ăč!ňÝżňĎN0ÎŹ0Ń+0Ć î°# ß á_2ÎĐÔQ0.ŸŔŕâOŕď °0ôŕ ˙Ţý<ţ  ďßsó€Đ q#ĐÂ1s_đŕŒ'ßđCÚ2ď˝7âŕ0  ! ˝pxvő4=t˛Ń/"páŔ#ń@€,îÍC˙żĂéⲀ ŢBŔń˙â ˛<ű.€ "Ńő ŕŮň[ŕ3ý â'ŕąđ@ŕăO€ń Ôî €đđŕ!ÄĐŢ=2Ցď@ţËđ'ţĂAŔ?ÓđUŰŕ Qď €ŕNî"äň ęő úŃ#@!ż"@Ů đ2ÂS 2ţă 2`ŔĂT!+Ţ÷" ăÍ5ßÜ0ďŮ` ßá3ÂěąóţĐ.‘ĎąQŻ˙AýŇ(Ň #ýá #íŔ ˙ó ÝďŃíĐď î°˙ýô~˝đţBá˘ŕ_Ŕáď@ŃŕčŃ  ń" ăţ_ĐíbÎę% #˙ $ܑđ’ŢĐ P&Ŕż˙ď$ßżń 0P" îňLđí#Đ!5Ŕ  Ý3݀30Ţ 0ÇŕđbăŔ˙ďÔŇQŕ7ă\Ń ź& î týţőŕé "˝đ˙í ż° üŔÓ"!źŢű  ˝ďö .ŔąÝâ` ž˙ 1ŽđĂ.3 žçŢ2 Żţ áúŕńcđ° ßFŢŕ1"-ĺŕđ6ôBŕ°c͐!Űűđ '  °đ˙˙°1?ŕňŻĐc$ý?äíß22ÂŁÚń4 ÉđüŔđ$ţ€!ŃŸŔ0 ŮîâňŒď0 óîĐ4ďżđ9/Âíő"ň .€˙îŇ"4Áąű!"řÜ#/ Âţ0 @ &đŕĐ÷3 Ď$ !,žŃC B# ą3/ +î ĺ0űĺďą ÁF"żîRüŕ ó˙ÓˇżýíŔüâđ˙02O&íóÓwŔďáäŔżŕěâ`űţžŔá ń Âáď€/żţ Ú .˙Îáń$#đÂüq3˙đS#ĎÝ@ÎŔé$ńĐ  °ěá0ěĎ đ˛ń3Œá#Ú˙á €ęŠÜŕB@đŻń$P˝đ"áݎđŢŇĐýŻň5 °đňóݐń%î$ţ' ß1#ç°2Bđý3s@qěÂ'Đđđ .ůŕ%!/ĐĐĂ&͢ °Ń ŕ#ŽŢA î 0ŕÓíDńďŕâ3!"Đđ€˙7Ńď"$đsďń%ě đîţϋâ"5ýđŢ "#°ńĐđ ăpďĐ12D_ÍÂAĎŕŕáńŔËŕ&đĐŕôŢě ,đÎ߀* "!˝Ü'ĎŔŕ ąŕżĎä3? ß ó€đ". ŢŇ2ްň&đ##Żđŕ˙çëďđS0 °á2ŕň˙ŔńĐĐŃ €ř2áă2 ĎĐ7Ŕ@#żđ˙Óń° Ŕ5°ň&  îĄŕă5ą"ŔÓ#ŃňđŔđsŕ‘ń#!ĎBîń˙żŕŕB0Ŕń đ úŔŔ#ńÓpáqÝ×"Ńŕ ˙×3ĚŔđB Ŕ’ ŇŕŸ#đ-çëőŕđ đ'ďDňÍá6 °Ň0˘Ąď˛4 ! Ý:!Dţđü1$˛ń ƒđďňÁ ĐŔ˘üý Đď#°!řď! Ň2 ý7@ýĄđ>Žđ1ţňńď€ńđ!â!ŽŔňϐŃ1Ű˙ĐŕÓŽĐ$3 °ósĎŕŽÁD ţą ŕĘPýŕ6 ÁŇ6?żáđéę!aŔ ĄđýŃqŔ0žňB ůĐ0ŻóÎ  ątĚß"NâA@îń2aěă`đ0tđ@žŃ4áBĚÓbţ ŕĐ%üÁ2ěěáD/ŢŕŃC,НŇbîŢíó%ĐĐp˙ĐÜŕA+Ďňđžá#Ý­&ŔŔ"đçĚńP˙đţä%ŃŰĐ ţĐÂńAëě`ď ň €  3îďěŕg/ ýÓqß Ä?ž!í ŕA ţîQ@Ţ˙Ÿ"íó:ďP ĐA˙čô Ňođ " Ŕŕń#ëx>,Ę4 Đ˝ŕ2 ő0žđ/°#ŕ61˙ßň5€!ßŕ05DýŐÝrŸ# ńú ‘ ß í!Ţaîăńď˙!VĎ0đô Ű 3 đŕE Ô A"-×pĐ/2Ď$&Ŕc˙00ă@,đ6ÎĎÎFď đţôŰŕ%Ý ďEđ˛@ýďŘâPŕďD#žŔ1&đđ ýŇâw˙ Ξ1Ďŕ ż# P@ĐC3đËđsß˝ČĐŢ ŕęŕŕCđ.Ěđčţî­Đ0ţíĐáQźíń1LâPń B3Œß!1ýáď@Ŕžŕb"3q %üĘđ3"ݞĐűËÎĐîÜ˙đý÷NĐÁžNŽďŰđ7đěŕđŔ!ď7,ŕB"që°4 żďŕ4đţ"Ň$bE01âC4% źŕ6#đ ÝĐ$ůÍ˙üžßA Î˙qËß5!ýŕÜ'2 Źŕđ"˙ŕđéŕđđđ ň`Í˙2Ź"bďđ#  Bý 7 ÔcîżâPB˙ł"ÚÂôžđ?ăč ˙ ĐPýż%Íň@ Ţ'óńó>ĐpÝďÓs˙ĚAđrţď1ßŢqáŕ4đ %ÝŕDŔýáŕŕţ#îń1óuŔĐ0đ7ěŢ5üđű ˙óđ€"ŕ5 Đŕ0żĎďîĎ"OÁóą"Âŕ7A đđĐ #?Ěŕ €á3 ˙ńÝĄSđ˝đó4ÁţŃ˙ĐŕA ţđGóż0ĐAë R0°đ˙đ7_Ţ" ĄA#oď'ý ÝŢ1üďř"üűđđäŐé!!.˘î Ë ˙ţ6Ý0OÓ˘đďěđ°Íç đ Ÿ""í AQýq 0á^ŃŕAěÂđ˙˙ ţ÷űÓúńŃçÁ>°˙ą2/ŕÎÍ-p%żđ!ŢçAďĐőű&˙ă@Îđđ˙ŕ2Đ!t$ á`á10rÎ0ýŕűO Żä€űŕđŃ Тđ˙řŕĐ -(ŕ.ĺÂÁ/˛Aý$ďďďS˙pđóńđ5ě%ßđä$ĘđâÝEţŔ2_ĺä;đđ <ŔŁŕý@í łŔţß$ţ$@â2đOôŕĐ đ ň¤ŕţĐ=ďą ţÖÁ˙ߕ.Ń4żđó×"óŇ4đŻńńî ! ŔŁßîđěŔCЀđî’˙ŕŔ íŕŔŕ@â űňýÓP đPĚŕ7ÁCďá€îă`3 ×Đ?GĐ!=đŔđď3Ŕŕâď  đŃŕîÖŕŃ+"’˛˛ăĐâPűń^ýÇđĐ21€ŕäŇ4°đíŽ @˛áÓ×@ŕ˛!0˙pđ^#!"A˙ćĂđ ‘!ĎţOŢýoŕŕ÷ůŻđ >˙Í!@ţţţ×Nżđň> ]ÓЀ# 0üqěâńô÷Ý' ^öđ1Q"đ‚oĎđ"â°î€ ˙ńŔđŇţŔâŕ"ŠńâŔá Űâ×đŕ^öőq Bŕ¤×đđ!âáßÓ~ŁđŃôN ÂńońŇőňň"Áđ'ăĐď@ŕĂđă݀ńěóď°ŃÝJÜ0?Ќń@Ř0 đ÷ńŕáąáŔÄÚ/÷î˙$áţ "âžĹđś>ńÓCâN0`ą €ĐCŃŔÓ¤óĐ ňŕ˙‚çţĄ/ÂÁń đŃŔíRó,.çŇĄţńý˛ĄňôňńţÔĎ_żĂŕEý Ô!Ň2ąóŁÁ"´ÂüĐŕłđĐ đŢÖŕđýââP í3Ќ#âľŃĐĐŃóĂĐç°âôńţçđPŕđq˙äáOĂŃ@=Ô# Ďpđŕŕ˛Ă ˙ ńňÄńŔď#ÂĐÔňđ€#ąOî°đ?4ď˛0ĺđđĎ:ďääŕňÁĆÓĐŁŕ‚ń ßŃĐ&˙ĎńŕŕĄOßâŕ€öđăî`-Ŕâ÷Ŕń´ĐÔý@ŔŕÂ'đ1Ú˙&"đŔŃހůü€ňďđň"Ŕ°Ń ďżň$˙đaPŕ˘wń ń'ŕBÍĐ$˙Äŕ ůőĎţ?€đ žÝŢ.ŽŻŕďíě­ÎîđĐ ňţ ňw"˙ý4#e_' óBţŔAŕ#ŕTŢ /  ŕq í7Đđ˙Pš0ă 0ÎŕËďľî ú ŔŔđ°˙ţęÜŇPŔĎűđ ëňŔ?ţĐôMç˙đSůMŔäŔpß%Ý 0đđáTrî˙ý˙7ŕPńäáp  ?޲" đüŕ Sňú"4 E ţ°°đčŕň$úđđ ÎÓČŔ'ţń# Ž@î"ő,Ô#-A"Ő 0€Rí"Ň"ßíůÄ ° ţńŐ˙  ?âÝ$&Đü ę!ŕŻŕß.ńűÁ ýíđţĂÜ ířď čđđĐţŔżýđ€°1ţ˙č1ÄüóíÁ CqáĘ1ÁRŕţqŕE ŢńŔÜÚSěçď âń<Ńî˙p ŔýNäáF"Ą 7 ˙üďăríĺđđPŔ Î 0€ŕ"ŕ#ţ€!íüc á0ŢŔŕ.!ßŢ0Ă^ŔítŔ Ŕ#ÍĐő!áœ%Ď"ĐŐ ŔĆ/Ŕ ý üďĐ!ॠŽĐÎüëđđďđďÝŕ čüÍń#Ńđt÷ żđÔŔîăCţ˙/€?ĐÔP @ââçÖÄEŃŕq @Ŕ ÖN3ĂQđőŃ$Đp0Ŕł°âŢą6ŔđţMă ÜţôűAÂ@ňđŔ€đ˙î-௟ó í ěŮ đáűý˛ ž Ÿđáóřŕŕ#ŕüÔ%ç$ŔÁĐç/ÜńŔ5 ' ŕđŇ'ńżÁ!Ă@âąđ a˙Ńń˝˛0'ŕrŕ˙đP"Ŕž°#7îćDđŇ߯îďá˙Ŕ á !ňîŔĄţü3UŁđáţúá˙ú$ŕŕí˛°üÁîéńÔűÜáŕ>@#ýŢSďßÄóÓÔŕÍu"ńŽ;2ĺđŔ#AÔ!ţŃO  %-Ŕżá°ßŕ?ЎÔőá˛îîŕ°_íŕĐęŕĺýĐ"c?íĄü2 72ŕ­!CŃňŕ‘40 Íňǀŕ!áްó@ő5Ŕŕ Ň@žĄ5Â1đ‚"!!Żńŕđ"Ńâ°$4ŕ ŕ˝ń=íPöŕ"ĐĐâ Ѐ˛ďńÁńďä"ý R7Bŕ1´0%ŕŔńŔýíÓqţŃá$ŢŔŔ #ůđîóŔńЎţ ŃĄţţĐąđŇ×đ3 ţŕ âÓţĄńóŃÁýP6ńBŕ'. ?0>8îńÁ÷˙-ëţ#0ٰđ4ńđđó ˙ĺŕŕАŕĂýqďĺđáĺđ žäó ŕÖѢ0@.%ăđĎ  "4P @ó€ţápÂđđŰ#ăýţŰ đá žä*m€2ĄţŔÎ×ńÍîä. đôó=0CŸ#°Áńđ ‘óCď/°ň%đôÎď"đąőđďĐr"Áđ-4"ý M€ŃŃĹŕóňň/3EÝçŃ đ 4ŕŽîőŕá3ěÝPŻ ŕđáń ŃĐâ$= ‚áŕ€äŃŔă‘ŃŃßÖŃ 1@ňäŔ íđ&"đńńÔ#đ°N ĐĹöŔŔĐňâC:ďÜÜô‘Ó°Đżđ00ĄÓôńâŕĐođĐĹŃÓ^ ŕ@sۢąđ âŻÍ"04â >ĐľńóđŔ€Ŕ>˙ŔáňĄńňĄ@/đ0 Ô °áÔĐÚđăô ćÓŃâóđĄŕňâ-q ŕď â•ňP €áń0ŕÎ ˛605ďâÔđŕ‘ţÂĺŃńńçńA#4â4pńÁôń í€ÔOáÁđ çđ°°ď@đܰÁţ ] 3 M] <4Łńí€đ ň/ @×Đđŕ]ąńćӀđđĺâŕß Ü݁âńÍ `‘đ#ÓÓ‘â€â*úú ×ÓţÝ.0SđÝÖÓŁŢĐ €đŕá0Ă×óЏń0ěÝÇŔ˙A!ńą/p?ňŕă€33b"0Ă ýŕŇń°ĐÁńđÍЂóŃ÷ %ńŃ˙ đáô°ŇÁđ’,ţ˙ ţż / 0ćOĄ!˙!á 7ěPŕ ­`ňđ:ŕ˙ĐĹÓ˙pßđĐńpĐăýă ţ@÷âŕPĺÓ/^0ŐĐĺţOćŢ<ăŸâ°˙"đâđ Aá á˘-ţřńÁ0a á!0đýë á Ŕ ;óßŕ*ôí"žű$ń27ŕ?Ň`GĂńëţŕ ŇÁoţî  đ+#  ň$ń #´5ŕNÁäӀ˙áđđ፠ÚĐŰďü˛äţńđ4"@pŕŔâ37ĺ"BŕÄóŔá°Żżá ţěÓđď×°"ţ´Ňňâ°÷ .M1$P°ó4ćŢŐĐîĄŕŕ× î ń#>ƒŕţŕ!ôđ'` ć"óđŇŕNą _"Đŕ .ŔĐżŻŇŃđßźýńŢóđä DÓD4óđâ÷3ß´äđđm âí Ŕ€‘ í0˙ 0EńăÔRäÓçň1AôóýďR3ĐőĄĐäÔĐ ŘĐďÖŕӐˇň˙3üő#3'˛ đŕž°ÂŕĐÍţ‹ßđđ îîŔđńďŕ/áţÓírr"ćÓőňýÓAаŕ0€ďŕßú-űüőÄď ˙ĚďţřŔńăp/7ńóQó˘öá>N€Đ~ţđĘĺŕ ˙ô°Đ´ń=áôđŕaá41!ô!(/#C$â%9 @ţŕđÔĐŔӀÓßBňĆôň$!×˙$A""ąţ)đăçÁŔĐ ŕ ݰŔ˙üţżŇÔńŃňó[,ÁŇäóN0ㄥÔÔŃŔąýđŕ°äŇŃďÁ.Ľń˙â0ć1! î$ÔôđŕŕăÔ ŔĐߐŕŕ°đŻăâŕëđć˙ßŔÔâŁââÓp!ěĐ´ńô ŕ@˙˙MÐÓń_ ýâĺńĄĐ'Ŕ ^-Ćđ# ßâÜSĄńđPâЂŃńŕÍńţŐŐĐ+^Ă×ń0âGńą0âŁ˙..Âç˙ŕÍĹÓ ĐŕŕÜв3óŃ×óÖâţ Ôóń;÷đ/âň°îŔ đÁŃý N ӑĐáőńĂŃě ń0N0äĂÖâ PŃŕĄâŃđ. PĐ Ó×đłÔńŔ°Óĺ ĐĆŐ5ĐŔ€ň00 ÓÓŔ°’âŻŕ°ň =Iŕ ňňĐŔ=CFđÔ@Ŕ0  `đŕŇăŔ ˛ĂÓ́ŃňĂŁáđŔáô˙.ÓĚÓń @âçđç B6đá Ă×őââŕĐ аà Ҁŕâ ŕĹÓÂî đăó0Đ]0 =ö¤â.Тćđí 3ÁňӓÓÄŃ0ÓĐ ÓĐ˝0DÔÜ%őŐÓŃ0pí Ă× ďÑđĂóńŕ˛ŕ€ŕ ćńđŇěĂP 0` áń×ňäĂŚâÓĐĐĄđ.͐đí *úú€°ŕTӁŃâ1@1sđP+04ńóŃŕ0Nô×ŕ°Ü=ŕ!ÓĂ×Ňŕđ ŔŔĐ0ł‘ńňâ‘ŕĐă đ=đ˘ăÓâ‘ń1 Ó‚°ă^đ×đóňŔÔÓ@аŔđ ӓŃ˙ 0°ŕ ‘ńńôńíŔÂăn×ÓĐ=L0PŁńńŔŐŃ#3ӁâôńôÁôńă‘Ńđ .ô€ď вăĂŔ×ă‚ăńâśń!.=1ś ŕĐđP ĂĂаÂ]“Ń/#Ó 5ąđа4 ěŇ×ŃÔđ_âŕÇńđŕđâĐ×ŃđóÓńăÓŕŔ×ѲâăÇńńĂÔ3ôóđĐĂĐ0`ŁŃ ŕŇŁÓÁôńü ĐŔÑńôÁđĄÁńńâĄŃĂĐÓß ĂĂ^-śĂÂ20×ŕÝŔÂŕ=ůĐĂĆń#ââÔÓ×ńâ×ŇĂôń0ԒóÁđĄđĄđňÓÔ×Ńň´äăÓôäŃňâĐ@ÑńůââłÓ‚ăĂń>0 Ó = ĄđŇăÓ đĐŕĹŃZűűрđ˙ýİá@0p><Qŕ@öăđăŕ SÔáG3AňňőňŃňâ<#3p"37EőđŔđđÔŕ ƒƒ˙Ń˘Ń )˙ďýďáţ퀰ŕďŔŢŕ°ŔÎŤ đĐţ°ßżŕаđÄŕ0Á ä˘0ő’ńńâ Ňđńâćóňí !°€ ĐŔ°Áď ˙ţąĐĎńňŽxŕ.âđ?”ŕMĂĐ ńâ Nôńç/óç ô,Ĺ ó/˘OĎ Ó°ßĐŢ- áŔ*@óŻ- çń?;ŕ#ý@Cą$° >ţĐňoýPŕď~ĺńń^őCÝqĂ>×_ďP0Ý,Ćá˙/ŢŃođç,Đö˙úńĂđ°Đ Ü˙€Î°ŃĎî Đí đĎą˙ýŕ?Ü$&Ţ21`ó#aĂ@˙# äPđ2q 7:ÔÔpŔDĐP0ń`ÂP˙a"$#12>÷ň$@.@ď Ŕďáđ˝ÍŔ ˝Ýíž˙ŕ żîţÝ쾊ˆo˙ň.ˇďsŢâr.ďň2ŕ!>Ÿß&˙đV0íđ!&ď3ŕ#uŔB!5˙1 Óq/"Ž5 žŕ"âßĐqôáđ î0B˝ŢŻÔ đŔýýpßţńPíŕ˙~ŔËńBÝâR Î4@ţĐ61ďô@QqŔ2Í4ŕ7ń4AđôRݐńňŠđđđ őŔýą`íđÜťݏ ďţî˙ ÝßŢ­ĎŢÝţÎĎšŃ˙ţŕž˙Ńëŕ !˝üńB˘ 2.ö ˙0˙$Ö-ďĐr#ßďdŻí2ďÁ˘4"đŕüđuýáGď0Ő 04qďRŇ# ńňÄ5 üđ0%ŕýá#ş!Bŕ#T˙ţ%˙ łrďF áaŕŐQ/Eţ Ođ˙ńO°Đíô Üá8ŕŕ'ŕ!ĎĐS  đţ îŇéŔďďŕBÖoáâ0 ň6˙ď$ĐܐŔó€ŕîńϏЏţďßîžĐ íńěęđđđ˙îĚá Žŕ3UĆǏ˙?Cńpđ"đ0pă"ă˙Oŕ% Ń"ňá'_ 60#ÔQ#ÓO?Bâsâ#rÁó%î6 ëąđžĚŕëýđŕ €Żí+ŕ°ŕ€î#N’ńýŕ0ÎäĄ˙áŘđ í€ďűďŕ$áżň ąó`ŕß#C‚˙Ă.˙żĐ>=0Ąóöęđí ąôŕŔ€áő@$őŕuç!ń@@/îPӐ>ţ#Îí_îÝrńóŔM#ýp o3üŃdđ ôB%Á ;ŢőÝţáѐđÍďüäÍńóőŃŔ’ŢÄîÝ’ "ń€ đ#ĚÔđńĎđ аŕÁúňŕđęÁńąńóŻâă"ă@0^_1.=ľO)Ŕ>çŔá-Ż˙-0ą°@ÍPţĆ# ńÁôćđ >Qđňăë˝%áŢäó€Ŕ ýŔĄŕŔĎŕPđ€"30×%ń,3ÓWđç˙˙áô$ü ӑĄ˙.Дâ˛Ná'áCńđ`-×@Ćö!Đ#ĺł!íąţÝâŕ€đÁŕ/ŐđŕŕÔ VńÇ?Ňţä ą°áđĂ đűîĐЎŢđ @đ×ńôńąô"ňÓěÁÓôđÖđâŕĄń°Ďáýŕ΀áđűŕÂÜ 9 ><4×âôĹđ`0Q%á áN °ďŃ˙žŕ Ŕđňą áł ňĄ_áňӟňâ@Żđ#ĺŃŕ×đ*Ŕ€°đđŔЀđđÁńćđá% "5ńP##/"a#`%ţ1!=ŔĐ7ĎĐ€đĐŕ°ŔăİáŔߑ/áâÇđO@ćŃ> Cӕńí-8ţá áĐАý°đÔŃŔŇ×ÁĐ ŐńĂĄđ ÔďÇńđ€âđ ŕĐÂ1€B ôöń$đ#¤`?6đ^CĺĐ`đ˛Âí.Ň ŕ  ŕłĐ .Ґ.ÂďłĂ×Ńňŕđđđ ĺÖđđôŃđ €Ŕîŕ žŕŔӂň0Ӂńňą őŃN!p @0@×óŇâĐ$ őCpđńń.9°N‘ą/ “ąđ > çŕî ňĂN1Đ  Đ]Ě üÁ Ńň°üü˙*ÁŃďŔŔ°ÁĎĐő ü߿ҥŕĐ Ŕ˛âąĐđŕíĐţčţţŔа˙îÔŔĎ "űđĐĐśóäÂóŕ0SäçóňA€đĐ đ°ű °Á˛˙BłŕĹÓĄń_ ó×ă4C"&ň"A Q"%ôă""30ç÷ ŕ#ňâ PđO ƒ?ŇŃ_ÓM˘Ňń ń°-Ň/Ŕ `˙ Ň î}×đ0Ńđ:Ý ňÔň€0Ďŕ×ńžN  ˙óÍ@ţŕďßŮ0 ĐĺţPî˙>ÂŮ!ĐPŔů"Ń.ÇňĄü@Đ?1ÂÄ`â 'ďoŔ:î ˙ 2î/â_ţĐ@ńâ;ă`Đ" ń(đŔ!ú Ň"ÎA˙Đ`ŔLáß  %˙ő $ŕĐ5ŕ.mä 1đďţĐq˙ ŐŔ# ŕ‚/Äţ1đ¤Ž_óą/ń .Ŕ2é˙ $Ŕ˙=qĐĄOѰ ˘ ß]ćŕî`ĐĄ1Ď Őâ.Öá0đ(Ńî`ŕ˙O‘>ÁpŔ!ŕŢDďL@Ą˙0Á (ŕ/ŕćîí‘KňÎA ˘ Ŕ NńżAĐ1đ/^ń!  ă ŐOĐ1Ŕ&îŐ ¤á$Ř đĺý!Ô Ţ Nł°_đđţî"€0đĎpđáŔpÄ˙LâßŃóĺ ó 0Áě ˙Ď@đ Ď"řŃÂ@żďđöčó0ž@Ń!ŻĐ/đřÚ_˙äÜLÖ,đ:ŕń=ą3Ÿń]˙ąŕ“ţpŕíŕOŃ=Äń ˇđ/Çŕ đ!Á0č@ďćýNĐ"Ż#ýăpßÓ*ÓK öŕ ç/ĐPÝSűđ‚ţ!°@Ôý?ŕÄâ#ôóčóĐ㣠Ń`ěá1é˙í0ŕ‚á-‚/ą=Ïç ŔC  űAŕň.ăöđ Bëŕ,ł_Ń ˛?ŃęěCÜßßNŃ ŇoŃ ´˛˙L ŔôĐ!î,÷Ó °ĐOţďpŕ/Ń>îAđ×/ôÓI˙7Ŕ đ ?Â-ß˙ŁÓKĎĂOÝBа@ą0°=•óÎ@Ö-ňÓ pâĐPŃ>ŃM€!čôĐűÝ ŕ0ß ĎŢ]ŕPÁ@ŕöŇ\öđđ! ěRď đĂ>˙ó!ĐŐ  Î7ďîpĄŇ !ćí#ţŕ`ţ˛ţRŃ ?ÓÁ=Ő  ?‘.""ď,0öŕđą!° áâ(1ŔýĐđÖŃŕ@˘đ ßímößŃ ę$îňüŃpŕ óŕ?(äĹíÔnđ˛ń :ŐÜóÝ1 çýPŔâALđđ+ň ú?×đá`ňßĐƒű$°Nĺŕ "˙ăß6Ű!ŕ/â >,×  ĐĐâîA×đ3Áŕ°ďç/ĐQŻ=ĐA.€ ĺ  !Đ#° ł <ţD°!0 á_Ó˙O‘ ßÉ1ÖŢEß/Đüţ÷đţPń3Ŕ÷ŕ@ÄôĄ 3âíó€ţAň Oŕ&Áě!ÔÜĆýŕĐő $Ą‘0ŕ"2€!Ń ÓĐŕ'üCŸ,áoŕěýqŕ+äŕ!ąą.Qďă;ŕ'Ţq˙Đ"Ŕ!Ôě0î€PĐńň[ň>Ä ă=ÖŻ ďńóż" Äő đ`đ˛Đ3Ý3ďáÚO ŕöŔ?ŔĐ Ó Ď ś$ 2ýĺ>Öű`đĐŕ`đţóčßßpŕđ@Ŕ˙ň ŕ$ÍPŕ ý`đ.‚ămó€ň Bţ Äż"îüâ0îňQĐí`âŕĐoŃĂK=ôŔPî@Đ˙Ţ!ÇýÄđí0,ä ńŻ ÓŃ.ď ?ąnđ$‘Ô,ôáü$Ţ*ŕ ƒÜđŃóM÷ 1Ă o×Ó0Ě6˙Ń Ń`Ŕ0 äâ°@˙îĺŔpÁđ ň_!Ćŕ0Ýó}€2 ň ß˙!ÂĐł+á$íüöÓ Žpóâ=0&ő1áNp/á ß0Ŕ ‘ ÍđÂďąŢ޿ϳďďÝŔŰŃÍ îíÝĎ Ý˙Řß˙ŢĂž˙˙ĎíţÍݰ€ ˙˙Ý đĐđüąß!ßŃ>ćŕá"°äÔđó(đ˙đŕű!˙ˇđŇ ÇáçĐ"ţĐ náą-ŃÓřâĐŔţăîăÝţᲠď ҀßŔď€ţđłŕď"Ěü!đĺA`ó Dň`2"  ăÎÎÚŰŔżŢÎíżßްîţ ň_O .pó.S"q$06AP30P13$!b%#q12"5P5âB'@@0q"AA3Q4a043#@$`#˙ ž_ĐÓÚí072#@#0Cânçîáűü × \öŕ°?ňOóż Ł0˛M,ŃđţąoŕóŔ°?ţ! ÓŃPá2=q#ţÖ!2pŘ ! Ýđď€ Óî° ĐA  ܰ0ő2폠ţ$ü đ ˝@Đż/v@ëń€ ˙@ń Ó ĘŕÝSý:DîĐ"`°0qŕ?3ńÝM˘đŘŃ /Ďáâ^€Ď˙ţ(Ŕ  ĐŔ˙ű"ŕĐáţĐ! 1˛`đ44ŃBNŽQňĐp"..°"@/ďcţíď3ó3!@r@.Ç".ăsđ5/ń ż 0ŇôPňâŕëđđ¸ŕďŢ ˝Đ üÍŻĎđÎ.°ý˙íď1żŕÚńýŕ9Ŕ>źń á Đ×!Ţ Đ Ą-N°%Ŕ@ Óń#˙á_đP ŕ=W íüVţţíň0ó ’Qßń0˝%ňó@€ó>Ôŕ˙úĎ$Ä>< AâRđ˙ö ń42Â1`ň`$Đ0"> "S/"&`đ3R˙AS!DńqńAá05>Aîrîa% đ3áÎđúŃ0čńú°Ň Óüěßúâ ĐđđíţţŒđ Đ Ŕđ ŕ ŕďďýęáßëßŃ ÝŻëđďóŠđýá ţßâúÜŞĹŔa Ţqý ". ŕŃ Ű Ŕaß Ď;Ŕń Ď1ő0ÝŔ3Í í$˙ď˙ŽňP01Üń$Éß# őŘűŃ1ţ°DŢ!2żíď70ŕA˛ Ńq# żň0đýPžÓ%"űěđ% ďÁB ĚÄńPÖĐBńôţÖŔ7°îŢQÝŕŔî'ű-ŕPîŃáQ/ë€đĐRĚËŕ"C.ܐĐRţßđ-×-2Š PŕňWűń/ĐTţ Áń#  °áCßŕ'AĐ0ń !˛QýäłSÂ0˙áńQĐB`ÝđRÍ .€ňŕ!ęáAĐ á`Ŕ!ŕ°AđŰěđö đáíđ" čó/ž˙!Ŕ đ1ďătüđ ţđĂ0°đŔ`íďąB˙ě&"Ďń0î°CÎ!ěDS ÍäŕđQQĐîă)óqZđĺŔýőŇ ˛qđňßďôBN  ň÷ Ŕ0ńíŃ7`ďĐń!ŽqĐĐ áą#Ŕ˙:Đ$đ7Đŕ€˙aßĎ Ŕ/Ŕ"íń˙đýÖŕń°Ŕ"Â0Č!Ă0"АNŃPíăçŇ)ŕ ý;˙ĺO˛/á ń$Đ0Đ%ëŕů?ŕăĄNÍ"‚ń0Ÿůá!˙đBű<Ţą0Бň#żŁŢ ĐÇá˙ â°_ňŔ/đ_Ń˙!ŃŰ5ă,ôŃíö-Ő$ëŕĄŕüAđäOѢđěŐ áŔô Ő Ăđćă=óçŔü!Ţ'˙D ˙‘@˙âŕüó;ď5ý"Ŕý?ӃoĐá^â âđ PŔđ%ň 3ě#é3ńŕ´=Đ CĎă/ ~ŕŕçď'îâ Ó€@ń,ň°ôÄţăäŔ˘ŕ#ýÝăţĆ˙ ӂßŔÁňÓwĐáÍ?ĂőĐóăŔăýő˘đĂӀ.ŇŢčđŕç˙óëá/ěôĄÔßŢńá%Đހôŕż˙ ńĐî^Á0ŕ%Ţ#ŕÓ€ç Đń Đ4˙Aý@Á Ô/⠏ňÚ ăą* Ü¤çöý"=/ëöţϰQ/đŃčírëŕî đ˛O 2˙ ż$ď6˙ďđós>Ń1đsďâQţÁóŃQĐôË Ŕsŕěô`°đ°âň0  ą݀ ßđţßÓEđ˙ŰŢđĹŢÂŽđ% đĎň‘2óOđ/ÎĚSAŕŃ ńđţD1ÚŕŕőĎĐ@ŕâęŔ đâŕżěží ˙ŕđđ"˙ßźá1ŕÓ02 ź˙đŐ0ńVÝđ˙č.˙ýěńĐŻâńo#ü°ř đ/ÝÔÂońoďŔ0Á@ ďß7űóý˙ĎĄóEüäŕŃ âĄ7ßđPR€đ đŕQáb /˘/ö Ŕßqá ł 2×Aý"ŃçĐ0$Ěŕ' đŔňüąôÝÜŇ>4 L°Ëđ" ŕ1 î Ŕ˙ň'íń ˝4ÂBŻďđÓ +Ż#"ŢżßT żńţ°Đ4÷ţÔ `!ěĐÁ@ý'íŔŔrŢî'áßîÎîqďđđÂřďÍÜđđBą "÷%%"!î3P°!2Pß"đđ&!Đă !Áţ°ţŇ4đíD ĐÁŹý°2ëĐ,üŇöŕđŇÁóCáÁ m€3ŔĎĐ ŃřęŢ˙˙ŐâŃ Ą6Ü&@301ăÁž?7đ =€ŕ ÎѰŔŻűđţĐăň¤" Ąđ=×đAďĄŕ°đă0ŕÎÍ %Ţżüî"ň&ŕ ĐGá Đ= BÁ@â/Ű`ŕÍţtŕđ$ĐŃ@÷  N°ŔÍäřŕŽűÁŇ đŔ0ß!ü˙ŕ#ö žđ őđ3œđ í/Ű#€đţ"Ađ˙,ĐôOWđđđ/Ž3Đ ˙BĐĚRň˙Ď$üPŔđÎĺĐ`ŢÚöŕŕ#=€Ţ°ďń =Ŕ4î/ŕ`Úßô//0ŕŕ_$ đßCę2ŕだŇ.ßŕPđĐP˙Đ  áä/P˛°đ Ą!Ň_А˙đ'0ňż•üű?€Pá@ŕŻÂpđţŃ4űđÓú!ń óBŽ 0 $°1ďáŇĎ ż!BűŢnäđ Đ Łŕbđ°ĐŕP˙üŢĀđđđ ŕOß0&°ňPŕâ/ Ţá0p€ńŕŇýđ+a˙ÁôÜŢ/ÄŢŕ 7ŔŕąäŃpž1ÁŔMôń€%Ţáâpâńđ×!á ňđŕ â€@ßÜqŕá€ŕ!đŐâŢďţB°Á˛˙ŻŕđÎŢ S đ"ŔŇąÁrđń0"Nŕţż2 P ŰĂĐŕ sĘđńŇ#ţ˝žń b!АĐá%a °ŕáőó!/2ீđđŕŕđ&ôî€1î đ/.܀BďĐÁî ŻŕöĐÁńĐŇ"ń˰ŕ01 ŕFđ! €đţŃ÷A"Ďß ń0°ëá÷ ţý„2ă ţÄ@őđ đŕ6˝ţÂ$ FńŢěďçńÝ ôŃ˙ţoď.° ń `ŕżđ" dýü˛)đđâĺď-qа ń°đ?> Ŕđü=PőŔí˙Ă%ó °ĐÁ$4N`ąć ÷ŕăÔ°?ĄĐ@đŕ$°Â5.Ŕƒá°ňCü>˙ăÁ˘4 áЏ˙ňŕÂÂńĐ-$âĐL Äôúđ0öô/Ţ ŇPâ˛ÂŔó:€1đࣿް#óüŽý'ŕßđ0ŕ #˛ öŕĺňÁňçţç%Üô 4OăŔ°đ =vńŔî˙'ŕąÜŕđ6ň°ăôđ4ä°ââ'ĐÜ˙D>°áá.ŢŃ׏ ďŐ-0ďßđđB аӾóáÝ&2ţ€đ3÷đţ°âĺB0&ŕôÂđG#ßđ1đ!s2ŕ°đî,Ň őňЏŔĐA/ŕđŽĎŃŐňýߏî 11ńŔüÜ˙$ đ˛Đ€ńҀđđ 4ďLÂÓÂ^ÎÄţ Ňćă  PâŃÄq/ ÁńĐöóáÎî>@ŔŇđďž Ѱíëżáâ"π@ůřFđŇŕp.#°ŕ0 7Ţ ńń'üá rôŢÝĄŐ0$Ţýđä&íŢáŕ0tââŽ$ŕóíÂă€ń 4ŕ€ŕ0NҀĐíâ040­ŕâ×đááAâłÖňŕá4ąý˘ @0ÓŔĚв =qŕŮđ!îŇ! ŕQБŕ23Ąđá˙áÁŃŔä/ `ÎТÂ@üą˛ň/ O Üáńô ŕĐ"Pđ?Ň áń"ôÝ.°ĐĐĂ@ÜÂÁĐŕ4â“óžäÓôłÔąţŔ&ń°á>×ÓŁâĐţâĄôÁÁđý Üo?ńÁ03Ó0Ýď0q@ Ž "%ŕŰîŢÂç"#ŕŽđ 4C×ŃÔŃÓÄĐóâŁý‘âĄđąŢ 90. ŕßŕ6đ3É€} ŕoá.Ď"1Ň ~÷ţńűEî Ŕ ôî=€ &ű ä Ţ=! Ď?Ň #ăě *äŔ 1ĐüOÖń 0ŕ!Ą,-ćŕ?śń/ŇN(*Pń @Ŕ02 ßî° đďŸíÎî ĎŢąÜ °ĐđŰŐýű0çń_ĺ0aÔ1ě1đţôp˙á!"C(ăý×P˙ŔCŕńPđM¤@#Ŕa1#$ßSŃ#.', RŃřńżŕ>żĐ#îîŕžŕÍý Ąüţ ţ˙ đĐŔ ˙ĐÎííÎÎÝÍÜÝÍÍÜÝݏ2-ŇŔ0Żđ/2ďŔB7.p0đ b!r$.3Q#=D2A '!"î #S˝ŕ-ýÓÝ#Ž °.ěň@đż0 đ$đF $C#2`!˙a-ó`2ö".t$CB44!A4B#"$R$b"$ "%!˙4 ě Ň,í˙ŔŻďďďŻÎďÝ ŕţŮîßî­˙ýżîß ďÜíŔĎÎđŢÎŕďŕŰđżßŢű˙ПďďűţßíŰݰđďĚďđűÎđýżďžýŃŽŕ Đâäí˙Ëđî Ţݏ ţ˙ĐŻÜ˙ŰŕţîŔôěÝ÷/îáO@üů€öbĐâ÷í"í°2ÜĂţäó,ďCî1ńaű#Ađń<Pđâôŕ.tđđíĎ# ‚Ţ$ěŃ+Üä!ĚđŇ ŕŃ7äá1+óóËĐŢ Ěŕ ŕî˙îÜâËÁ ŢŇĄ@÷3’Ď`˙°˙őđńäÁ\ýőŕĐ2Ŕźß"`áň@źđ$ŇĐÓ2#óŔ°6ň%%đ &˙ ŃÁ  ăđŇąń0#â4á7#0sđ0ő ŕń˙íŽýđ żďŕĐě€áďáßžď˝ŕ Qĺţ‘ńÓ>í#7ńÜ@(ńá.ఐáŕ.ĚáňQŃ 0ó@ĄńC° p3ţ'ĺ@óń0ăŔ3­îýŔ‚.Ü$3×pďőó2ţ37ńP ó0Kď÷ňđŕˆ˙ńЏěôî"4.á   Á/0 î? ŕ ËňĎ ď˛Đ˝ĐđÁ ÍňŐ߲ŢňâгР_ŕžŕ*ôö 0@%Ŕ.ŕ ÖĐá3ąÝ ÜÖްá4Ţ{ň#0páňĐ ŕć đ€/ţŕ đ °đßŔÁŔáŃŕ€Â$ŔőAóásńűBŇâ°áă7đăŒđ˙ńáň3Ő Ŕđă°$ 3ĄÁ"ŕWđ4đđłô$°ôńţó đŕŇłŃ;ýń.$S/äđđĐ`ÂR@ŃôMŔąđ ĐăżŃ đ€.çî&ńńqđ..`tţÜáΠЎ 3ۀŕĂýŸđŕ‘Ŕ Ń’áâ˙ňŽăňÓ@Ą ÖŕŐ.pM =˘ŃđĹÖń˙ ă’á"  4Ŕđ PÓđĹđÂŔÁńÁżî Ţнпü˙âż áđĐđâ3ďp0˙ÓD>uňóŃQ#/R >Ń0Đpă "ÄŃç0Á°ă.p ŕ@°0Żŕ#ŻŢBŕÓÇ Ŕđţ˙đÓвŔŔ ˙Ŕ ßĂ@2ÁĂđÝ%ĺ oâćţá3jĂýŇě‘ńż ÁüđîAôŃôaP ' 0"đQäíńâăŔí=7ăŔŕ×Đ đđÂŢĄđ°ŕńŢÖđĐÜŻđľŕđܢáńD°P˙ńŇ^ŔáÁĐ“ńń0oÓP3çŕŇ.ońP@ďâ0ŕ€€ŃđŕĎŔÁ ŔŔĐŕĐĹŃĄđŃđ˘"÷˙ň /Co! 0ăOňćţ˛ŕŇÔ@ŘđŔ.߂2ŻńŰ"óý łńř$üÓ ‘ŕ/ /ĂÂţ˛BúÁá@ţą 'âą%âr˙ärđĐ?Đ2ĺQ!>˝´0ŃÁÏţĐáĄţ đŇŔ.#sĄ0D°Aă@ő ŕrýÓ.ŕ6ž2/žó°˘!îF Ă@íđÓ ŕ@ÎőÝć/ÂŕĂ:ňýDÁî+"đđđŇBę3Ýöđđýý" ĄŔ˙ "â€/ú"˙ŐĐß Á€$Ňí-ľ ŰđAęňQßâŔâ#úďă( ŕ°Ö*üŽđ0!ąóAîpÔđmđ'ńđĐŕĄ?€Îáîóp ą3Î\ńţŃC  'Pţâ žA' ,0Ü˙đa"úŸ ˙?Ýö.żďC!Íŕ?ĐîâS!úÎ1ď#Ýá#ď3ťÓtŕůĐ3<ŻAîđŽŘ ě0ţá-ž!6ŢűßAńPâpíĎÓr0Íîä qţďđ'! žđAđ(á?óÜB"ć- á?Ż4ŕ@ ˙° á0€#É4űňđ×NŃ˙űżď ýDŢÔą@#ŽÂ)îÔ˙qŕÓâ=AŒđ bÝ$Ÿ3ş°+ŕ!°ă ý@Á" ŕ˘ađ PĎ ÎŕA'1ý -ăTýŕ0pýŔ!ýríDÎăAđNŕ.€ŕpîŢŐ0Ţ Ń đ żýÁ`ď$ źÜC1Ÿđüăp đ0ŇüăA đ!Lá˙0żň ďŢ?€/ŕΰďŰE˙>°0ĐEÎň6Í|ýţp÷qââĂq/ďßCađRýđ ő! ‘đQŸň ţ۰RÝ °D ν1ÜŔ"Ř.ž0Đ 7ß1ŽäqţĐEôq$ #Á%Áí˙ß0݌ţ˙ŕÝĘĎ ţňÜߪđń_Ó˙Ď!ÁĐń" ţAb ŕ  ďĐđ0żžŽâ °Tă Ń`2Đ đĺ0Á1ŒŃá#QěĐ%ěŕĐ!˛0RŢĂëáAüöA˙Ŕđ%?öô#A!Ŕ7#˙ŕBŒ˙$îÚÝđ ěî ÍŽŢ3˝Ţű#R@Ŕ!ü"'Tđđ÷2ŇPń#R°áB!"ż˙˙Ď#A żBíQÎá˙%âŽŕqŢţÓ2=ËĎ Ţ cŕŽĐ!ďĚÎ7ďßW%! ˙Bđń0Ä Ż˝ŕ íŔŽíá.Ď˙ß˙ńBî€Ý1 ° )Á/ń‚?Á ăýńCîŕÔ4ŰĐ żąÚđ3 Áđ°řŕŔëóŔPŕ ÂO@˙éý$Oβ3  ţ°ă ß. ís‘ŕ ŇáńÂ1!Ď'ĐŕńŔđ+ăĂű´đĐєđĐ _ ! ôâ@%ţđŕ#! Ža ýđ2°đ 1-úĐ^ýôűâ0ńüŐ%űđýŐÓđ1ř0 ňßCKĐß×Îţĺß"°üţ! -ńęń2ŕ#žŕ@°ňäÁŔî! ďŕďđĚŕÓň°.Ŕ$.Úđ’@ďýÔ0' ńđŕ ú"á5íó ŔpţđńŇ î@!<°â7ńŢáçO$ţ˙Ŕ7đ˙đ˙Ńňđ9 âŇ.ăâ€đ 'đá˝âöŐ ŕ@!ńÔĂýC ƒŕňĐÖđířżN° đó۰ăĺ°!°$ŕÖá !ţŢ °"ę" áӀďţ"N×Ôę/đÔě ß"ŔŕSűłÔáý#Ůâóđ ŃLýŔ˙"ä‘đâô<°>#°âđáS°ăěçţđĐőý=Ňđ°ň*ńďpţŕŮď3îě˙î5Q żó2!ńtđ$ĐÁţĐ­ţe2îĎŽĎ"űßŇĐÄ'î!ŕ˘R"őńĐa4QÜĐ@ďĎóóQ̐ńîŔÁđűÁđŽŕ'ě$ţŔŻń3"ô ßŕłRâîáňŤÓÁń]­á$Żđí?ݰ#&Áđ!2ŇtC?ăbĎ0çEđ°ŇíÂÜ2rŽďđâPŔ€˙â3B Ŕý72äń1$Cޟ2BúďáţÂŘŔ-çŔ ń%2ô˙2ńóú°2QýđDý÷ďŕ`ţßďMĄŢíěÜĺŐ˙Žáň  3ňŕÁаňă3 Đ&ţ€đ #đÝÁ€đ4 ţŔÝŔĄ2úđß áPrŻď ňĂ6îąEđ 7#żň$ţ÷ţßâŕޏýŢđá łđĐËńîBžţ˙@đŕ40"ÁÔ Ÿ˙đ$!ÜżŇîŔ×ÝąŕB7ň‘đ# ĐŢŁőBŻńżđ˙U˙űcŔď"ÎĂő#Q/éđb!âÁ#3‹đ° °˛ BŸÎ ˙°đđçŢŢčĐ 2ąâîäsór"ÓĽA$-ΐţĐĐń'ŕáţč ŕ## đ Áâ7ţ ÎPîßđŕ 0P1OěěîYő °î>ß×˙*÷ NÓ˘nńń. Ńßp@ ÷ţ?ň  "îr˙üŔ>PţżáíƒDÄ /ŇŘĐŕ˘ř đ˙ý pă .ń˛@Pâă#P60"ˆŃ0î7ő<ÔDž0đÝVđ @íŕ3á3'!ÁÓ Ÿđ.ţ஠Ţýá éüßQţĎÝŢđE Ń­#˝#đĐ_â] $ÁQţđ1$aß1TÜ!ţđwîÁ0°ć?ÝâďOîđ đíÎ@Ұ"°0"~ =ŕ 7 äëŢ.ńMîţód đ˙Ĺ0Ý ß îĐ2 2œţ$ ý6€ Ŕr_#5đR"Eň" đüýţ!IßĎŻđ.đýëŕîĚÝňťĐÍÎЏ˙ţĎаěĐDđţĂ2á€0đŔđŸđýĎĎŔŔĐ(ý°đí˙ÜôýđŻŃŕĐ!0Í'ą@ Ń/1?°2 Ě žßôaý ÍÓ6 ŕ22W#.Ţ'"đĎď$b đňŔ˙1-ŕčřďżńďŘŕţŕ°ÝôĚá@0ôS2ýÔ5 °CBőđţ!Äđ"qđŕ >A Žß6Bđâ@Ýż@ě‘ňďůď ôC`ü$CĐ㠍QěŕáŔ°đÎţ°îÖîüđá˝ŕíŽěÁďďýĚŔŘ˙áţŢĐ€đŕĐ'Đáżĺ÷ďůđďđâŕdüăEÓ@ 3cň"q@ń˙7 ňđ â/ąÝ š˙đ$7đ"bB@ń2° #0ĺ°üĎĎžŕ˙żŕНßęţýüżßŢňě ĐěđÁô"$#6"đŕĺ;˙ďÁđđą˙ŔŔĐŢľ€âäçAäĂ%ÓSŢŐ˝ď7 ˙ đň˙2đŔżc!0%ŕC0ňŕĐ=tâţҀŕâńĎîŔü>€˙đ ĘýýĎ ŔîűŢďŕ˘!ó3Q26#$"ńŐT'ďAńŃŰÔFŕń0Îáţ˛&Óţ˝đ0. ĄöŕĐŕĂŇ0ӁŕŢ !"˙ă×cńÓ"& Đ8ŕ€ ďŕ˙đÁŽĎŕëđżĐ˙ý€á˙üÜďí Ÿţďîů ˙ô 6?"QC 0Cbâ’%Đ&ó!ӏâą=rôĐÓđUđßî쀿ţ"/°°ŢđÓ%ńb@'$##4 á07&° í.Ý đ°ĐęŔŢýţ űĎĐĐĎżęń ě >´#!aE"5÷đ! RáĐçîďî ňáĐŕ$óôD"űŕí }€ž @ ă6Ŕ$ /đ #ňŃđíňŃŢ ßď ŕüżîŢŕŽđżŢŔĐţě ŢŔĎíÍż˙đňđĐЂĐ7B$A#PvëéäÁđăĄÄҢÖđáđ äŔářÁđ´ŕ"˛Âóóňđ"łÔ×đá!•Ňń˙-×ň KC˙2C˙<^=2(Ôď0üÄŔ üŕ ; @ đââąď ßŔ.°ÝŃ,ŕđűóó‘Â˙.ĄPÁâń &˛áŔ Ń+îôäňď .o.~ŕ CҡđÔńöŃń˝0˙ ˛ţ`ăbŃÇđđ .ĺÓômđP˙!!äÓç !2ĂŁŕ0ÖáŇţĂó‘Öżßô“Ŕđ>ЁÖĐŃ ôňą łŕńă!ƒ0ą_˙ŔđOń [ÔąđćÔáäŔńţöă˛@O!ŁđMľ˙/?ŔđĆóňĂđ  3+#Q4_çđäÇ0/€łĂ˛ţďý°ŔӐâ ýÔţÁ ţĐą ˙ í.ԁą ë,PÂŐđń ă˘ŕŕ2‚Ňá0ŕôŁâ .đĆŇÓţ@ĐÂ>lM/^ßőçáňŁňăôŕóő×Ö/ăä´âđÂáŔăĚŕŔUííŻŕŽýţáâđŕ 3B$đćńA@ĐRňâ7 Ő0_Pňă 30îsă°BăRáŔŇ_áNŃňőď `Ŕđ ˙ń!3âŇöţ"!ă$žňÝÝĎ_ŕ -îÍýĐݰ €ŕĐ+ü˙ňÔńńqňKőđ#ŕ3OđR˛0.žŕARđÓÔ !đŕĘŕŕ€ ĐüŻ2öá1Đ`łó˙÷#22ń×3ŐçđňđýáDŢpŕňŕţąŃŽĎď°,ŕ ÍáЂĐđŔÔđĐ×Ŕ â.22ŽđÁĂĐВţBôĎâ?ŕ'.Ü Qđŕŕ€Ŕđ 'áý÷!"ŕ0VQŕ#ÔѰ đŕď_đá °ÜĎĐíę° đýŕŔäńć ô!žĐüż˝ÝďÝĚÜŕń!2ń%&2AŐ 0Bbńđ+ŃĺóÝ ąĐ"!@ 0‘őőŕőQĺÓńăÓVóŰ 2­ŕăÄđ#G6#$4U?;ŕ˛Ńŕ;đ×đ ńáÔ ~ďäĂ´’ŕăŔń "Őń=ąâóţĂÖđŔײđÔą ÓÄĂđŃ>ĄńƒâŇľáňň*,1đ …˙ňíAđÓ$äÔđăŕ OńĐŕßĂN!CçÓňä*Ŕ ýĺńđż0ł IĐ$ýÄŇăŕ.Pă ŔëӃáÔóĐPŔM!Ăńäąŕŕ"ŮLLÄŕŃ ÖÂńŕŇâŽ2 $;çŃÓŢnłŇÖŐŕ /ň’áŕŕôáŁŢH á~=ô°óĐŃŕ8řŕńôąőŇĹŃŔçÓá˙Ńô×ŔĹâ˛ĂłÓń˙ ^MÖŕŔňúđ˙ 1PŐÔÓ˙1ƒóŃđ]đ×đćáÄáN”Đä“˙ĺáÓÔĐîPĐ "˛ôÁ‚âŇôÔűO“ń˙=.ó×Őŕ“đąäáđ˘;/ááňÓŔ‚đąâÔŁááŕń¤đĂŇÓŁÓáóŁŃä =./ P-đ•ň.â×?ń„ÔÓŕđâśŕ ˙ÇáţĂśĂáńľăŇňń-˙ÕŃńĺÂţńÁđ÷ŐÂ=!ĐLäŁâ˛ńŐŇÄđ´ńâäŕ .Ň| ćŃÖńđłäţŕ˙á đ‚í>0 .¤ÁáôŃâî rŁâňÔÖđâł˙!˘ňˇáňáâ Ó8@Á҃Ń0¤˙UúůĄĹŕ ÖÂńđ=öŇ×áđä°.=#á“ÓÔ¤ŇđńM?-ÇŇňĐ•łđ.0×́âô˘˙ŕĺŔđĎ^ââÔÄĐ]ŕ˛đăŕ@×ĂŕL óÖđňłá^L ńăĂôłŕńľăđă°=đňďƒł˙ćŃňÄÓĆŇá˙??„áňÁÓü"Ĺń .<=†ŃÄĂĐá Ô×đďŁ×â˙ŕ.=˛ÄÁÂâ ;ň˛ß%ÂđĹĂÓŕđҰŐĂŕ PÔă¤Óđă@Óýđ 1ĆÓĂ×ţđâçÂáňÁLOŕ.ńŁńÖŃMĂĐđ×âňÖŇŕÁóĄď/.¤˛äâĺ˛áňăĂđđ’/]=<öƒđ ˙’ó’óŁĂŕ˙˘đâţ҆ĂááŐŇńáń §âđđĺłĹđńü@ăŃçŐáňĐ?ŇĐB/ń×˙˛#łÓĄňŃŇłÁĆÔáđ0ÓđôĂđ;=âÔď ŕ.”ŇńôĐNçÓďˇĂŕŐďL=ÔśÓŇđ PâîÖѤđóŁŃ˛Öáňň’đň2 !Öţ/ ţđđfĐ͐îŢÝܰĐü đďÁ°ěţŔÓŕАţî°ŃßĺŔţ°ŢŢŘ ĐĐîßîÝěĄŕÁĐđđ O˙.‚đŃ˙ą3=0c"35S4&#$35$$336#3"3C#Ď đ ŔîęîěüţĎÝíΰżŢĎĎĎÎŢÝÎĎžÝÝďŢßĚžÝĐđŰÝÍěŕ ŢÝĎÝéß°ţîëüýđĐŕđŕĐĄţńÂÝç đÓň b3RBA2$ő#&Bp¤PÖ˙ ď"Á!nŕ!PŇ-đ mţŇ(.‚đPŃ0ŃŔ=_łđ ĺýĄßżďÍüżíĐŢďąňü ďŐ>Dnä÷m-'Aíŕ ŕA0ŕ*˙>â;ţ‘0ŕđřŔ ß żŕŽŕ˙ßÝŃ[ń°ď$ő@O"@?3' b$02#Eĺ÷đńŕ`Ďsé.đąCüđ đ ńM×0ŕ2 ĺ"`!5$Cúňîń ŰđŕĚďžń! ­ţŕżţđíĎßÝÎÝżĎŢÎÝÎÎÜě€đđţđűíÎĄíĐńč@š™Lĺ5ŕWđ>îUîóqđ'#đÜ-ßËńĐ"`ŕź"5ň%/°@ĐżÍ 4ÝŔüĄ3/ŘŰŢá ˙đ ü˙Ü4ýě@űŕ4Ń3ďE2r#ŢDU!ţďď˙OđŕëđCRđń1-&ńéň Đ1ýPŔłb ß%$ŢżÍ ßďžîÜăT îŕńŇî×éńĐ˝ťŕ ěń ßV˙đŇA4üŰđÝâŕď ŸüD@ëîţň'ÎíŃ÷5 Đ"T2í41ĎđďíđóPťńńRBŕáDáNÚđQî€4űđ˙%ŕ%4ßŮ˙˙á' ţ 7$"/ă"@  üÄ2ŢÍńDŸ˙äCqţň%3 ĎűýđÂí#0ÝăA!˙â4ô žąď6ţüT Ż˙ŕCQ0á @ ÍĐđ-˝ đ$AŕŇđî ;Žá˙ÓS˙Să+aŽßżŕ  ËŢďýR°ţďŕżÓĎď1źî˙rđSAíŘ ˙ŕAÚî1# ŕ'ŕÉńďáíP0Űđ ß& ßđÁţ0S!€ŕó1.'ţô!ýqÓŕpĐ%í"Ăęńáp0Ôđ%" Ď˙ ă%ހ ŕđâ/u ă‘ô€ŕö âA˛đđń/žńňŕÂ+żňĐ^ÂîĎĎĐŕ°ă&ĐôÚđŕŕ°ńüߢń>!đŕĐĂÓÁŮ2ÓŁĺŕŔâ@A ?ý÷ϐ!đ#ÓŇ÷>áCŕ´ 'ßp0ą$đÜňPĺŕďĺ2AŃ˙ë /߂ГöŔáđÓ'1ŕíŢäâó>°Ň EĐ˙˙ąĺţ ŕĹîŔń˙đŔô` đŕóĐý€ŕđŕŢ>čŕňŇÄŃĎ$Í/Ďđ1 Ěó'!îěÓĺďŸŔđRňî0ĐŻ<ÔđĐ Ü˙ü˙€2đđŕŇ˙ °đ!`ßŕPđ ďNĂŕđĐąőúÂrĄđ$ţÎŕŰż6ţC˙/řóŇíü7ÁŔ'/ Ŕ$6ţŔáŕá  Ŕ˙ 31âÂńŁŢÝr5üĐ$đŕÔ0EîáĹđćĐ 3O˙ţ" áâҏ1ëpđŕďbŔą @ýĐďÔ˛ŕóÔ>˝ °ŇðĂáÂţ $ąăŕ÷đŕÔ30=ž, ň‘óÎż%ŕŇßÖăŕŕŻŕďňÜÄýÓ'ěň0đ Ňńî°ó÷ ě 0!ăĐîŇѐ!€ŕđ°âPĐđŃŕŕ˙î.˛ŔŃ` í€ńţĹń0’ŕ,á!ó ă2\ BŇuţŕÄđ€ţŔŔ  î“óâłß+ŔÝ28ďň!NěîÖŕáđ÷ĎÓ%Đ "ďÔ˙×"ńáÓŇѡđ˙đA óo ˙'$˙ŕ! ŔBÝ=ĐĹBî‚ńAąó" ąáPŕ`@Ć?1&ŃĐBň‚âĐŕ@/đ 0ď‚óŐĐüâł˙ţ-LÔó/‚đţŃ 2 ÓĐŕ ţđsźđ˙ţňďřňѰáć7đá˙2<ڑŕďĐ1Kĺđnúřł&˙ŕ50˝ĐÜýÄ0@Đą ţÍĎíŢŻÁŔÎíëĐń ÝÎRăć˙ěÍááŕŮďë˙˙ŔŢí7R˝Ŕ#/É˙Đ#ŕí5ń @@`ŔŃÁ1ČßŃäĐ Đß˙ŕđńńëĐT°đQ– ß#÷0÷đ4đpń đ? QŃ ?#ƒN"‘;˙ŃN˙>ŕ ÓO05Á_/Cŕ!Q SĐ0ł_ ď˛ţ °ĂĎŰđM4ŕŕA(Đ@Ă˙ ńÖ.7đNä#o% ˙ăő-p3âő"#/ € őá//Аá /.€á!ď '5 đü!­˙& Rŕ đ233÷ " ßŕąţŽíßC$Ü˙Ă#řĐđăŕüĚŘQ46ţěž6îíTďĎ2!í ŔÔě/0 ĎđôC4_ŢÔ%űďď°˙ŕ1ŕÍňR ÝŃ -€ ŔŮţÜÍîö4A Íâs  ˝đđŰ$đĚ /ďłß˙Ç˙âđŐĎňíě óú#Ŕí°2o˙ ô đá ‘éńđŕ qŕ8ň áý=͞0Đđââq˙ÓÄÎ@ÎqĎ ŻĂPńß.âäđ $ü˝Pđďŕí! 1ąÂŔaß/Ŕ!üĄ?˙ŻĐB ‘îPÔ Ŕ˙đňóÎŇp0żŃ#.Ŕ€0î.ą ;í ! đ˛ąóţP ˙'ü˙3ĺ Öđ/ß ßPĎđŃţ˘ŕ“Ţ!0€ /Ŕđ$ëď4łđ ň#đ<Ůóî"b ĎđÇđđőđ=ľńňPÚ ž#/܁"=?ŰÓđňWŔ 4ňńŇç ĐnŕAĐó`í QŕÝßpňĹ˙B 0° ŃP"Ż˙üţĐ2Pý!ěąň˙˙Ý´q3ÚĎ"!q˙ŕý7ŕđ#0Ž".ŰŔ! đ ˙ű7íîäńÎýç"˙ńß}üő°H° -Cßź7˙Ŕŕ@ÁOÝ Ţđđ˙a áđ˙rŔÁń&ĐÎ qŔŕ"÷˙ ŔUĐëňaÝďÂ÷0ý× Ň/ůöü˙Đßđ#ă!­ĎńáŢŢß×" /ÂŇđţîC7€˙4ţěÓ$ňô˛%ĚP˙ěŕŇr ďÁ°<ŕłü ň%Żó"@˝0ţőónô ŐÔAŔűňÓpîđ°@Ą CŔ“ÎĐ!ňúđŕńóĐ@40ŻŕŔc .ŃĎżăC.€ŕÁ>Ń€OđŔ? áîń#ŸÔŃB°˙ŔrÓ˙€á#Ďíýŕb áL" ‘ďđÓ-ßţđ7`ţ đüě#łţ€đđŕ ą ŕŕ0? °3řđŔŕń4'ŕ ř  ŕß?˘ŕNáýÁ2ą˙đŔŕ&°Ňa.Ŕ°=áéđ#Őąý#ŇôĐ?€  đĆßĂCô -=Ż2ťđ ÓŢ0PŔŔ#´’˙#í˛âó@—řúá łí7AźŃPŕŃţíG Żŕ5Ńý˘ń0Řß°pŕá0ŘŸá/ŘAĎÔţ.Üó R˙Ý10pűŔ2%Ňň1Ůă4 # °Ń ŕáÂ+ţń0°óîÍ˙^Â0¤ýňĎń20Ţ÷@žĺ ×ţđîâď @Ďýó7ŔR€ŐýR;đŕŃ%ŃÔäŸRÁÓ ;€â/Ŕł<ăřňü0˘Ăŕţ pňáóŕ:˙ ĐŃáď‚ ôÔ˙óóâ ŐŕÖѢĐáďřď’đňł ŇőđѲŕóňłŕ˙ńŐ˙ű2ĐK/Đăŕ ŁŔńąĐ`ĺňŢ"  ×ďđŢ$ Ń/•đńŔĐ÷âÓüţ~đ-÷ŕđđ'ňąá âçĐ/á „@Ŕăľ˙.đţˇđ×đăŃŕŕ@ßҤó°ţ đŁ@Ńđď#€‘ŇáŐ  âßĐ ÷Â߼ňţ=0$°@đôň‘ âňLŔňőĐŢ%O/pĂĐ-h "€ŕĐüńžŔ˙ŕđŕýÓ ˙”úđďřëüď°Đá˛ýýîR&ţöâŐěŕçňŔ˙˘żáďűýôŕÜŰ˙ĎŢŢŰ ˙żŕę˙îÎŕžď Îě°đôá>!÷á5AB˙đđőţ1¤ăŕ^ĺOńâďŕă âń0`>102734ńqň$ňô42@óďňGđ ňÖăŕR˛đ ň\ĎRđĄp€@ěŇ qńüŔ1˝ Ď!Ěđ0%ýđđ5 ţă` ĐÉ ńčńAż đţ4đýŔS Üţ'î0đŻđ.ŕ7í / .ĎÔ`-Đ%ßýĘňrîŔüÜ7 ďBýŕëđ`ň=° °@-Ä=°3˙ď řĺđÝ00Ď"ŕ0˝Í<ě€˙đÍ˙ďîŢÜíÍÝÍÍÜÝÍÍÜÝÎ8ÓíńpŔ3 2ăđ,Ápđ.2@@’@Ŕq / !"#3%#43C44$$#435#42C$ @ópŐńŔŕ°4 ďę˙PîĎź÷ňOž ŕ€0Ďŕŕ đĐůá îŢ đżŢďŢŢżŢÜíÎÎÝÍÜÓpÍŔ˙ţç, Ýá!0€.#Ą0ß&.2ĐrŔ s ŔŢ#.€ ÓÁ' Đu˙˙đňŸ@Žň %ďŮ ŢäA3q"E@QA %$ "öP˙" $ŕ"Ý%ßčíźÓüĐAĐs ĐEópqń đS/ÁQôP0>ôë2ŕo ŕĎ Ŕ0ŔťĎĐÎŔË˙ϰßŔ ˙˙ß  ţáÍĐ-€Űđ°ŕíЏđüŕ âţŽĐ0Đ PĐb3áp!@ĺŕBŸţýžÁŕ ˙ý ďŔűžţđŢŇčđţŽý4đÓ qüĂr+ďbPĐDď#ÓBq *.0 5 óO˛s˛2bâR1˙ Ő4"ń4C.ŐP5đ$1SóG đňRc1!6!!S1ň@t2ňě#!đ˙€˙Ž˙ďţŸďîÎîŮđżîţÎ˙ŢРЌí"ýÚň0×ÚA°üőBĐ"č!ţ0đ /Á6?ďBťń!ßPŔţďö5Ŕ Ä"3!ż6ëđTá/TÓ đQŕÂta pż ÍňĐŕ€đĎűżđîŢ­ÍŕýĎÍá­ĎPóOŇsđ4ŕîďs2ýÂBěî&$ţŕGüó˙ď 'Ţ  Dń˙°`ĐÁdô ŕ7OÓ/^îáĚ!żđ!Óö@ďţÂ@4`$C˙%B˙4đRý€Î$ްŽđžđ1Žđ ŕżÜđďŔüÝßđŽď#ç!c #đ5!b%đá0í7#"Á ßŔ70 Ě˙ÁďőCüŃŕĂâ$< ż €ĐĎĎń@ą  ŃĎßâĆĐ˙pŢîB%íá3S"!ň73sđRđŔ ěţŒţŔĎüŔÝŽÍďťďÝÝď îě ÝĎsBAä"`B33 ác5 1°0€ń#%ţŸáđă=ޞ Ŕ1ž’DŔ/śc úÖŕî&˙.ýN PÁ3!ÖĹĄńCŕ!!`ŕB ľą0ń$Ň˝đđŕ1˙œ˙đĎ2źóîđńŕą.Ţđę Ô=óč!ŕđĺâ ď`aß °ţ 2ŕ°ňâń;/$čÓńöăÁîPÁďâ>ľĄĐ0;öňŕĺňá¤â"ƒ Ą>çńOđC!pâ@“đńďŐđńŽđŁďďŇ˝ń°°ŕÓĐąÚÁţÂÁ*ńíÂđĂ0ĚýÔÖ˙.ż˙"žÖð0ë?°Ď_đóӁŕŐáŕ×ţ6íôăńÎ˙ 6‘ţđđŻ!đň Đ>UđŕÂ!Ł>Ľň?ó1ö`ŕŕňp 㲠áđó,0ĎÓâ‚ý.ŕă˙đĎ ń߯ĎĂî€2°đďóƒđŕNđ#Ŕą`ŕá0đňá÷ýń ŕ1ôĐÄ`-Ŕ?Äôţ´ĐĹ˙˛ä˙ŕŔpîőń€óŘ!ô/ż/ą!ë#`Ŕŕá A1qőŕ0Rń1Ŕ’ă,°ąŕ-°Ň˙Đ.ÎěăčďőţáԀ ţ˛âĺăŕ˘Â0ý÷÷ßđáa˙őá"ŻŇ@đňŐŔď`ţ˙đ˛ąâŕpđß.đßôŕň‚ŃÔńđäҐń"?‘?˙/ üQôOń rĂŃ8!đÓĐK.ŕá ąâáń~ŕ÷Ţ0 >.ĺ“ě0Ä#ź˙ň?ŕ_ űäđ+"˘ţąôđđĚŁ˙đú$ß'ĐżąđO𤠣đ? ?ôáŕoăŕă0ÇĎP/ŕëBđž@Ó 1×Óź@, âёíOÓúĎÎöĐ×ŕ=äü!ţ• ď=ńđ;-´ĐâŃÚ&ž@Ąý0Ӏ˙ŃnáŕÂóěŇtńë Ŕ" Ň2ă!ł÷/Ă îą^đ/Đ ń`ň">ŕěŕ@ÓĐŢpT.đ ď'üđ ţĐÜđR Ď0 ž ň.îŘâb-Đâ4âÝ÷-Ď!Pđ04püĐ1î&îߏ!3ßďŹă>ďárĚđ"6 ýüŻďţÝ'pŕ°đß Ď"Ě2ÝÝP‘7ţî# Á/ÍŔ2ŰĐ2ýýţ ×tíŔ2î đ3đ!Žá` ű0Ţŕâ7?ŔĎđ3ĐđÝîAóčß!íż#НďĹB íÎ%1űýîňE˝ŕ5!üŃ@ üŢrîÝâR ßÎĐ0 Ž0Ž0" ÜďŕrďÎ ŇëŢŕS äúŢ% ŕ#1üŢńúpŕŕĐ32ĐŕÝ &đ0źđB!ذďŕ7=ÝÎä!ŕţŽĐ`!-ž îď÷q˙íţ$3 ý°# AźŔB"ÜÁ#čŕ˙PŔţá@ÁÝĐa^Ž1 žáA/ž˙˙Ňw   đ Ţ  ˙ţPďýď52ߟĐ%Ź"ëá"@ΰîVĐÝóP0Ŕ-žő Íż1$˙°˙đa ˙°"á đýą!  Đ$0ÝÝŃGŕßŃ`0Ńžďa Ÿ10Űă@ŔŕďC Ý&óěďß'"۰! żĎaîŻĐ@Ŕî°#"ŃŸ°Žá#ń@üÁ °ţĺC  ă1đ­˙4Ž1>Îĺ/ĚđńϰÎßâ0ŻĐ$ Ŕ@!ß°đý'PŔ˙á@˙/Žŕqđ ŔÂ">űîu˙ďíňđúŕ˙Ţ Ţŕ&_ďěŕA#ŕ0ŽĐC0źŕ%$îĄ ŕďU˙ü@đ120Ţ ˝ó%ňžrîíŰ$/őúďáűŕ" ŕđT ßÝÂR4ŃËđC# ­4%ěá@żßÄA Íĺ>đđ#ĎŽP°ŕ 51Ţď#˙3É˙ńBĚŃDň!ýĎ$!p ŕâ6Đčń00ŕ?źţ%Ž03Ęđ2ÉđSüĎÖ/ţŻđ@2ϐ.°# ž˙'`Đ ď3Aó°žÂ"đ1 î$!žĐýTŔůâ!ď?ŕ ń  žA>ÚđrţÍň/ň+Ďâ4ň ŕ€00 Ŕđń ßí ##ýŰ !Ëń@ëŃ6!25žŕFŕűň"!đOđ"ó/2@˝1 Ý #Ý Ÿ ŕ Ü2 Ď0 ß$0ě°Ŕ6îüŕ3îůđ#čđ#0ÎŃbÍţďuďÎâň`ů@Ž!â1Żďţ6ţ˙ßäđ/Ŕ0ż.ÜđáGý˙Ţâ5&đ żđűŕ đĺÍţňSýíěĎ'2đÁ "čŃAîá4  żĐ!ŕĐ ďěđňAĘđ2ż#÷@ÍŔ0О2 űßĐ żŃ$ Ÿń!qëţQĎÝÓs#üžđî6ĚâB 2ůďđ'í í7QĚŕ30ßď '`ěń3âđ0ťňtýđđďb1Řŕ0ďŕöBűĐ%đ˙ńq đ$Đáđ6üÎ!í ĐQŻ îđ'Żüŕ$­ĐR/ ď$ŕŮđĎđ?Ÿä =Ýv!Ůţ"ăbüđĐäűŔ$ĐBŻ#2 Żţ!ΰ'ß Ţă@đ€ ż0 â#şŸńđîËŢ%żŸń"ŃTďAţb%!ţŕ îďďrŕ áD F4ŕđŔĚđ Üďń5žţĎŕ żĐD/ÜńţÔS4üŔËŢđ6˙áݲ$ üÎîŔQ ݀ŕÝΰŕAî Žďđݰńŕ°đŽŕ$" Ý5 ˝żń"ýßđ!đB Đą#ěŽŕ$đÝŽŃ ŕţ˙íĐđßŔ(çđ?=ňÂ.4ŕaő,0ôó=$ƒ}ôđPđĐn&ŢđßDą.ó!ě4ţäƒpŕ á đßá_×á$úí0‚M°ß ř˙üĐĐ PížŢîĎ ď°Ďďßđ@ŕÍüÝóňî Ŕ-Qôđ00CôĐrţ01' äR đRôě đ4B" Bň1233CC43CC  ŕţqîŰ>ŕ € żëďĚîŕ ßîÁďL/ßÍßřďűá íŸďŽźń @ŔŕěîRýŔŕ""PđßŕaD/Üŕţ/˙íĎŕs"!‘ ó-ç?€  Ú4ĐŔAŃ)ă  ×ďđŐ Đ:ž˙ňţŔ7,ÎOńž$ÝßŰ.ŕá6îPŢňË3ßńÜsďż!Ő á ˙-?á #ÂBÂ^ńAŔaü˙S۰CŇ ţđ!Öó ŰÎâ`ý đŇAđ˙)đđŃ Ďł*Ň  óP îńđĐÝ1ż‚=Żŕ°ĎŻ$đţţ˛ŕřŕ@ţá¸îě°"!Ŕâý÷"Îϐ"ŔÓ3rŔ!ÁĂĐăç-ăHŔ4/ŸďýIŕB-đ í#€ď4đíç Ň  #8°đD@ě##í'-ŕUęä#ţţĂŕđ!ô!ńüPđą?Rě°4#Żţ˙ń0Ţ#sâĐą& ŔĐQŕĐ+ađžó ŠđaŔŔ"ÝŇ@ëĐpđŻŕú˙ţÁ#€ŕýđĎŘŔ7°đđ#0Ńń3ŔS1Â˙đŕĐŕ'2ĹíóŃD°Ţ%ęÎCA2îôߎ1Ţć óQ$üîđŐ2Ŕ°đőđţŕuýÝE2íŻń6ŕ˙# ż2`ňëŕđď&ţîđŔđĎÂňŹî50ÝĚŕ4Żţ"ŢÂ^Ÿ2ęíđ!Đ0čŃŕđQí/č ŻĐAěŢŢ#Ëŕ2 ŔĐĺ!ěŕDđÍĐ 3đPOůŇsń1ŰóEđ˙W/ŻđŢ‘3!đâîC_€ńPďŔáá".ňâNŕ&ßĐ#7P°Đ3AĎĐ%ŕô2űđCń°đ$0€ß' Îô5íđđ3ůŢň4ăĎŢţŃ'ýMŻ"#˙ŽŔĎŃŕÁÜóňaŢóB"*žŕ1đËá`ňď°##ěŽţŔđ.€ńí €äúĎâđŔçâđ#\ĐŇcđÜżôóżŕ°ŕâ=ŽŔďý ŕ0žŔŃü5°đ°'ް1ďâ2"%îőá×BĐĐŇ ďă×ŕ`žđ6úî Ý &  ˛âS đń$=:đFđ?žQA &.'QŔ€â$ţ˙đ&ţđđ°Áđâ Éŕ4OýÎ#ĐĄî€$CŔŔAĚßĐĎŕOĐő˛đ%ňӍ#ސŕ!ŕńŔŽň -Ýó ' ŇÁ%ţđ÷CňŹ5! í€Đî*ţ ëëÍ ŃC˝îżßďţá6ŕëâďŻÓ'ë1#ŕă"ôÜî×óŢŽ#ń˛°đR ýßôđÁÜ˝î? °îănń°óüĆđŔâ6ĎA5ďžQ/đÝÁďĺ đîÓS Áńý@íń˙ôŕţ ßô°őđ ď2!1ŕą°ÂD" żňĐP!ßŕąăDń°ĺ2˙pîäâţ=Ă6ńŔÁa?˙Ëđsńݐđđ$°ŃďßCBíě3ŻÄŇě´Áňý" ą€%ďŢţÜŕđPó ňďBü ßçńŃ1) ŕ˝îwĐĐ5ŢÎŔ&ááDŕŕ ą"ť Đ'ŕ ŕ°áQ"°˛żĐđ0îń ĐÎ˙G ýňŘ÷őÍŇîŔÝČÎĎÍÝÝÎÝë ŕ îŃđG3%#AđŕĎÝŰÚÜÜÜý˙ď˙ÝŢހďţżÎŰíÍŰîÎÝěÜěíÎĎď˙Đî#5đŕóđюě˙4T4$$%#$!12B3ŕ űĐŕ€°ńđńňaŽÍŰíüüěżÎýá "D!"CD$3BR34%$5$#B6"3$""4%đ!3% %" ĎÎđ/ ŕÝžÎËíîÍţűŕ°ńÍŸîţíŕt#5#2Sr"D ď0ÜžĐîrWP!ďĚÎÎěĚÎíßîŕżŢ°Ďđ*ÎŕĎĎđěŔ 46ŕ1sđä%Fđ?áE%"R1"# ŕżđ#ýüܰ ącŕŕöbAB #bâ ŔE2S÷I!ńő˙ ô´ď ţň '€ °á/ŽÁţăĐŇůü îńŇŕćţ2!Ŕďr0B@őp0î€˙íBţBĐMŻďđţýíč˙ ß˙ß.°Đ Ďđ&üŔÚđţ@Đ< ŃLöŕčŢ á "Ô tÄĐańŔĐQ ˙' ň<ÜÄî ĂĐ-°1ŢÓó9˙ńoäđí?é" /˙âpĐđpţ ń01 ó=°OâPŔťá˙?Ŕ7<ň0!3üľâň4űřň0áÁńA  ÔŔ!ď äQž$đŰ!0ŕŘňEÁń"đ/˘!ŇóŔBĎCęďô!ţŕ €'îĄ0@˙Ňp0ŕ0/Ĺý!*˙Ŕ2ŕ9ň˙Ý5Bű˙ý/Pđ?ţĄ/đ€@ °°?Ń˙Gďţă" Î đđ#ř ÝŔsđďą4ţŃŔ@.ŇCü# ÷Ă2đ ° 0ďđ ŽT°ţ0ŕůýŕĐ'ýŔCݎ°!íđŃ#îžÁqáŕ@ž`˙ëđ30ît 0éŕ& ď0 ŽP! ܰţŃR0ÎîŃP íŸ đą!í€!žň "í]Í5ţýâ@ °3!ëţ/ßTţÎ$O  ńS!ÝĐđS ÔÚpđŔpţAéđ1ŕOßž ď/ßĺď€@˛"ŸAżĐÁ@ë5ţĐá_üű1!˙á ĺ/ ŕp í"$úđ°53úđ"Đ˙Đ ý'aý Ń10°í˘EÎ˙!ęú!˙Đđ2 Řŕb°ŇA˝7`˙Đŕ>ÎŢd/ ŕů" ţ°! ę6ţ˙"Ž"! ŕ"˙ű'˙ďŕa €`ŕĎ í7 ż˙ż%íĐńq­ňUíđŕ&đŮ!" Ń ŢŕtýŸń0!ď  " ˙ $úĐ$0@Ű@ ĐĂp.íŃ0­­âU Ű!˙á Ŕ& Ŕ.ŇěÁ& ďż˙2ŕ ěDĎ˙đ Ŕţŕ7áP ţ˝ď4PĐŕÝ 7`ď!đďĂdó@Ü/1üúŕGîŔđŔA˙Ŕń ż1Îëâuýß2ÎÓţ2ŕ`ýÁ6űŢđąďîćUüđ PđîđbPŢŔ" ß1ó3€Ń âS@Íŕ ŢĐÖ2ŘŃ1@Éŕ ýĎđŐ%P ß°"aýŐžŔB0á!ĘĐ%đĎó0âqďňŔB ŕŘëńáRŮî /ń˙ňđTďýĎ/+ž$°đ>Ą2Ëí" żŕ?7"ßď đ ŢîaB@ëňî!âpěą0" đ ÂG?ĐĎ!"qîŢ%ßđâń.ôşŔ á ˙'ŕ-Đ ŕâ1éŕőńóMúîŢ Ž1ßăď E ż`˙Ýó .΀!/ţĐ22 ĐöS ˛.ąŕłO°ńţę Řđŕ@đď ÓđŸíţŁŃQ đŔ RŃżpńĹĐđ"pĎţócńŻŔŕ"0˛˙ G!đŕňpđá0 ď" .€  űđÍě&đđ ˙ŕŔAđě@ąđâ! ę!ó˙5]ŕ‘ą˙ĐĎń÷ß˙@÷p˙ 4ýłP%îâ Ň˝Ňđ×íäĎÔň;ÍĐPŕ#ŢĎÎń`ĂŕčńżŔń##ŽăĐ$Ńŕ đ%ßâŕ ˙ń2ôŰ˙Pđ ýRô. &Ň Ű˙1UoěÂ˙ Ŕ .ŕđçđÁňů 2@ЀĹ˙ůŕĄ˙â ďü4€ ĐŐ2üüŃSüţě5/Ý€3đîö/ňžđQ߂ń3á€ŕćĎâąÝÂ0>  "óÔăŔß%=ëĐ÷ĐÂ˙%ŕŔÓ/‚Ńŕď>ü% ߑŕ.ţá˛˙ý!!ŕߢ 0ޏ˙ Pá0,â. Ѥ a !Ŕń7îŁď.ýŸ1ĐĎá4ó °âŕóä.ŕ€Ň#/Ő/ ŰĂđ´äýĄđ˛1ř˙@ŻŃ0˙'ßE˙ŕĐ1`˙ďÁîBŃóđüńĆđ?.€á# Ńăíně.í×0Ňđ°ă3߀ý°;ŕDŃđ$üĂđÔ@°ń ţŻâFŕ˙ă!ßąŔłŕÚ!ŕąđâ6ÜăŃÂ0üď 0ĂÖđÄŕđń/L'˘óĺżŕŔĺŔÁ˛ á§ZMńĺŇ0Ţ/ýĹđIŕ~á ßŕ ř"/đ ň?°"ŕ?&€>ŠťÚŕń ŢŢĐîđşďŢ?ŕ^ňްđ'q Šđ'Ówí2ŕë7âđpÂ!C+$Ń`!2$"%O $ńą@QĐRăQěżÝťĚĎ@ŢÜü ßŕŕűţďÝŢÍÝŰŢÍÝÍ ŕ îŰŕ ďíîtŰđčđüńđĎĐs îâń<ÜĄö0 " Ä'˙đ#rć%Ď$â@b$B ď@@Áă#0˝EĎÁŸ 2ĐžĐ@sŰŕ˙ žńřďď "Ř â"Csŕ7r1!S!&"1"V!&17 '@ %71ńň'0 ď02ŕËĐđ6üËŕŢď­ÜÍţíËŕß ŰďíŻÎí îžýŻďŕŕţËŔ ÝßžţĐÚÝ˙đĎżđŰŕýžËđů˙ďî Żďŕď˝đűÝĎÎţíŘđ˙˙܎ŕߎ3Ű @ţŃë Ŕ°đAßRCsĐÍđ$đ% áđA#Ţö$#51Tç"úÓoň/4Ŕóý÷Đŕň `ţ$˙Oß@!áŇö#˙ŕbŕŇ$îăq>ŇÔ˛ŕâ$üđ"ôđÁä ńđKŕŕíŇÇď€đîŕ ÁŰ#íŔŕ1ŁÍđ!ëýĐâďĐ!ßaüŢä0ÍôňÓ; !˘<ÓCĎ ńN˝î32çţÁü$ŔŕO°0/đ7Ňáçŕ.áńÔŕ˙đrđđđđÂ`¤Ó˙çňŕNŢçĐ6Đ Ô ćĄĐđ×ô+˙Ŕ28˙×ăŕŔÝÂÁ’Đą/ް ŕđ˘Ąţß'˙áď$ŕ đOáοР;/Ď˙ď÷/đ2 ŕńŃLń Äíńŕ@ŇóÄ ń1C€đ#ŢŃ×˙/˙%ýĐô5Ŕ ŃŇ÷PĐäžő$˙ Ň SŕB˙€!1Đ#ÔÂńđááŢq!- ôđ˘/ÂăO#‘PŇ đ%P ĂŁđŇQĐá3őÂňÄҰpňńÁđňôÎňýL0ĎŕŇ.˙˙ţƒÁđá“óŇŘ!ńĄ“ôóPŔđţŁ×áÎÁ đđŕeÎţ ěň ÜđňďÜÇŕď?˙Ă,ţ˙DŔÍç  ýÔ@Ýăă#ŘâÖŃłâÂŇ2́/Áá ŕ@íâż4ŽQ łÂ° ý/ď@Ŕ ^ł‘ń/łáâď–Đ"đŕ0Öîą!Pâżö˙ŕ1Áň ˙đCâŕ×ň%Üń CÁîó´ä˙ÓţçţńßÇ1˙˛ň"€â0ďÖÓĹň,ňŸńĐ đâCą0”ď°%ŕ ŕáĂĐď/ě &áţăs âđýţă÷îŃńÖϲöńâŕÓP˙üĆőđ°ăóŕäąÁ@Ń ýT˙Î-M.ŃÁçţ˙đđ/o °ôîpŢĐáðŇ Mâőő˙Äń˙ĐŃ=-˙â Ţĺ¤đ×Ăŕ$ŐăŢÓ! öÁPí×ŕĺáá“ŕ 9 2îâÇĐ$äóąÁđÄÁŃŕýńŚŕŔ˙ň@đ×áŃ!_ÂńíńŃă"Ôá*Á˙ó3ÄŃŢ˙÷qĐđ >R€ŇđM ĂEQ>ó‚ň 7˙ ?ÁRÓ˙äßcÔ˛>Ŕŕ¤ň.ňňŐďţäáđÍÄ<ÄâŕÍđŃ × P ׁâ?Ôď×ô°2ü?/s“áđ2ňŒđŃäôÂńţ@Pߕđóą/ôÓń1đ  ŕ ?Ř űŔAţĐ ŕ˙ÁÖđ ŕÄ/ ᐠݠ÷ń°á!'îŔóţŔŇĂäŃßďđ đQţŕ°˙ńŇ÷ąßâńá˙ŐżĐŕ’ßţ5ó ţăđđ˙őÖđ°áđÓ'B đ!ůQďżń@!Ďń ąqň áR@ ĎĐđ ÍŻ! îđÎŕî0ŕĎ˙7A-Îđ@â#ދňBżţAúâ?ÍásŔďU@ đÎŕC1˙íŽ2 ÎŰ0 üţ ŕždýíáB œń@2 đ1°ĎÓQŇíŔ'aý ŕ>° "ëî1ď!pÂřOîř.ŔĐŕAđŻŕCP ƒ'Ce4q őR"Dŕ$ýżýĎÁPţű ń°î­ý!@đĎđ­ßěđŕ33>ő˛7"4˙ďą1üŻŇp1Ëţđ͏ ďŕ0ŇíG$$ ˙űÔÍďt%" ń' ˙d2?'24Ý ěżŢĘÜńń`˙ŢŔ˝Żýďý@˙ Ŕó`&ţđ ţđ-ŽßÎÍîęžíŢŔŔďßí˙7#2íßęîĐO ß2$Sđü˙ŕ0çpA/Ŕ ĎĎĐ Íßŕîůďţ ÎßÍţŔîý ŇQ$!ŰÝßĐ7Üî 3ď@ÉŕŢŔîĺđďŢž$ŘĐްíŸŕQ6?żí1÷D""&CC@ţâPÚîPĎđÉđîĐţ!đv1ŕŔđEîćCb"!4?°ţrR4ŔďÍěđŢ îđâĐúđďđw"2ŕŕcţ âpŢŢđČŢîžţĐ îŕ ěB#/îíîâ_Ěď'!Ŕţë˙ßŕđŔ!ŻŢžŢÎĚĚđ0đRîďĎţßďórpqWa"!"íÓw2"2˝ŕÍŢß@đ ţĐt0üďŽďĐřîńPBĐđĎţĎţň` ţ'`! đ˙ßí‹ţ# ĐŕţŒţíßŢđňt"#ŕŢîŃS  ĺ"DđđężýĎŔŔ ýŻăýžÜŢĎюĐ#!đ ­ŢŰďĐ!óu!îíý°ÚÎóAb˙ŢěźżŢÎěŕîţěÍô ťěßĎўŕ#@0"ěńďŕw!!#s#3Аŕî"řîPA!ĐđëŻďĎďŇRŕt#$îÍŢŢÁ.‹đ1˙ĐďŠ˙íîĎăŕÝŇrQ˙ÎíŕąüĎő3s  żţßĎáađF15ţŢĎŢĐ,ŽŔđííĐý‹ďěďÝĎócýÝÍýţ7ýĎ÷AD!!!$ŻîíŃR˙ŕG#ďŢĐŔá ŕ&!"Ů˙ţĐŔ#s2 ŻĎîěŮÝđ0ĐaďÎÎÚžîÎŢŔ˙ţŕ#ÍŻďŕŃNĘđAó!şďíŢÎôđŕs!` íŰ îĘÝŕ@đ6îďúŽţÝî°"Dřî"$ŢżŕAŽÁ7$"/ďOťŢëîÜýţďđDBîîüżSr$ŻďŢް$%@0>ŽÝÝíÎü­°ň2ńüüްßŢě@ďSŻĐáíB&ŻĐĎŢŢC0ŕ3s­ŽţţŕîÎ/äA °á ŘÝý°Ďń3%"#Űďq%îÝŢ a2˙Îđ AřĐ!RŕňčžîĎÎĐ0üŕĐíÝííÎüŻĐ$ŮďßÎÝ72$7đî#FŔ@!R!! ŰďÎěŕ" ˙đ5íÎŕíߌď"Ń#čżţßÎ@!&"ĎŻŔŕîĐúÍŕ#'!ýŒŢŢŻĐáCQ˙ ŕßސń@BĐúźíÜÎĐ"ë˙4 ŢíŸţQͰT"%4 "Běďݐ $đţŔ°Ń žĐBßÎßŢž­ŸÝěďŕĎŕ@ đÝďüÝřŻđ#E"#ď˝ëţ3á6 Ţď ŔНžń"#E1  ýĎĐŕ`1  dŽ˙!ÜíÝŢW3íÎ˙Bţ˝˝ďS"Úđ52žđ3ÜžŢăt1ŢŢŕ'1ÍŻ˙BţŃ4%űÍđ4ĚżÎĐD1ÜßĐ%Aë˝đ$2 űđ7Üďń52ĚďĐDíŽĐđ#đčżĐ!1ÍÎăf#ÝÜ˙4R ýÍđ&3üÎĐ52Ÿŕ#ĂëĎńďŢ4CŽŕí€ŕ$2ßŃ$đđń1ŕŕĐÇ7#ţÎuďßC#đ˝ž#$ď đĺ.űŃÁÝł63"ΐđ! ŰÎßńR Ýžîđ0 űŢŕŢŢëܲQ%đĐÝđďżţžŃD"îĐđí˝ÍĐ0NŽžŢŕŽĎĐń# Žď˙ŕń4 ÍÎđ4îŰžżđ"ݎŕĐň4c2 ŢÝĐ' 3%!А3"QźđDŕĐđě Ř­žîďÜÜďâB!Ď÷!ďĐńsĚńBC?ďŔD!!ĺ#Qďó%q!Î%DíâFđýF4" Ŕđň@ŻÎŽ Ç ?ŕO ăŔĺůpŕ ÷ńpĐđ:ßÚň°Aý! rĐ1@î ŕ ţ0ýŔţ@=đŔîţ?ĎĎŇîřŢ15óĺP0ń ÓB°đ ĐÓRä0ë= Ŕŕ0@ŕ˝ň Ž Ń `ą/ńaň˙  ópëÜ Áâë÷ń˙@?ąţ˙äđpďrî˙2OŢ ?ĚđÓo!ńŕřŔ€ěá ŕŕđ5 îä řĐÎ?Ýŕđ"*îBCE#âR1ţ˙$ĺ˙ ă,ďâqŸ'ó ć0Đ/°Rŕđ1ŕ ß0Ă 0âđ¸˙đí°°ŕ! ń6üž"6ě ÖţŃáp1ţŕň Ń'ăр0"Ô  €đđđőűßđđáąQńđĐŔňŕţ'˝@1ŽÁâ çáňÜ.â°€˙Ńĺđ 1 ňŇ˙ťĐĐňĘĐÂá0ô°đ!żŔÎŔcđđďâ0óđŁĐůąžŃ#×Ţ ń%ßűń óÄöńM0űÔ ďďĎ0ęńßň!Ŕç>Áóŕě‘ňPŃ28ŕŢË˝Q/Á!ŕ$ô˘°í ň"0ĐÓt# ńăôâóŸá!âńÁŔqňŕăEţ0Dz?@ ÇâÜńP Ń ţ îAäŃäŃ&ďŕă ´3b@ďÝ!@ŰN/ň ÜĄ ŕ!ҁńđ+áŰňp>ŢĆĐżţËŕ#ހäţ$ Î07ôôą7€đ’ţ.Đ& ŔA#Ŕďň č‘! ĐÂňáňAíá%đ´˙Î$!ŰáŇŕ‚0ęô ń?ÝѰđňŇäŃâăŁ3 Á4 Ŕ"@ÂÂĐć0ńŇŕ°ä đâÄůÁ*˙ Śŕ°ŕđ /ü!?ós@Ţą °ďě/Đ÷ŕ˙ĐŃRÜÁ2ĎŕUđŕç€áńă^ą#Ó×ň áá łÁŃŃ3úáôĺ" áŔ ˙ßSÁđ #O  €äŃŕňDđ€ďâ ţ%ŔuÍîÍĐ7Pđ@üŕ 2ТĐűŇSĐńw/żđ!üţós0ÜţŇ$đňôŻóîŽ2ţŔ sŮŕ"đżŔá7˙ĐńDŻđ2 É%˙űáRŔ˙"üžăcď SŽđ2îŸß0đëđ5!üŃŠń3"Îŕ'°óĘŔóDßđŔýß 2Œ°QîŕôAžîžÂ%0îá a/Ďđó P ĐňR ďîÓP`Ŕ đ~ţ !1. ďďĂrĐë/PG B""Q$$Ń/ňrđ㥠żţŢŰŰďîŕA 4%p °˙ňS!#T%R0Î ŕAPń1 ŃËŕÝűđáâp!$"Ó/6ŔŽ˙Á3P!0Ú1˘ű˙˙ŕ71%2ŒŕßŔÂÝ/úđ°Üü˙ßŮěţŢířĐŕë0á>Тęţ˙đώßíîá1C'20! đÂ3pQ/ŃŕěŒë ýĐáýĐň2şďďô!@B$! Ăá^ďÝžń ĐŕBTP5!41A13żŔ˙ĎŇAĐŕpAĐĐĎĘĚŔîCC!QA%ŮĚ ÝĎđ ďÂ0ěí˝íΌßîěđ1BQýĎ żńÜ!NŢĐ݋ÍţÎŔţîЎŕŻîěđđýŕ3ŔżĎŽžŢíżŕ đđÜţ˝ŢŔ˙˝ŽßÝŢóŇ6&#!A̟ý3$@đď Ţí°ŽŢîÎ %"Q2žŕ ŕ%B#0Ŕ01ŒĚţÜîđ75 1! ŕŘűă 75$"!ŕ"Źîíżó˙&%! %ÝÓÎw!#43"51ëÜîÍßýá'%CCźŔĐß&6!C4#1ŢďżŢđÎď0ü˙ ̌ţýŕ"ôAî@Žđ ŢČýíîĎđýĎĐBBÎŘüŽŕŔň"7! /Ń7žŢĎŢ˙ÜĐ×2Pđđě݌ÎíĎđÓ# îÓęüĚÎŕîíât!C2ţЎďđ2ŇĐĹ"ЏÜŔ"u1!"2̟ŕ3%'@ňđÜűŽđ!eA%2 B Đý"$cî"ĐœÎŰÍ˙ŕŃt# 32ŇB  üŕďŽŢ˝Ďđüďđîa#3ŕŕ6Ŕ"ëF ďŕëŢžŻĐŢŕđD7đÜŕ@Úń $aáPŕýŢěÝŕęîţ1 ÝńŽ ĐÚ˙đF&1 ˙ÜŃŽŕóE 6ń ň?ß7NÝGQŕîŢđ Ŕí&!÷"˙đ €ń­Đ˙đ5 "á'ě ŢÍßďž˙ŕ16 ° Śŕę' Ýßďó!ĐĐÓp ÓAéSÝîC°ýŃUďŔŕđŕĎ@/“ŕ0óCŔö1Ž!3ŔŻńTĐŢŕ/ĐđŃŢ%Ą2í€Đ#@Ŕ- $˙Ďą#đÁđď Đíqż".ÓD Üżŕ'! ŕŢB4üĚQŻŃ-Τ ŕÔŽ7đáđň7ÜŔđŕŔ@PąăăţGéň/ĐňĆđĐaţ%đĐҲÓćíÔâŕđŔ ŕőŃóąń/.ďӒňěńł˛áő˙żĐ@ąÂáň ňß˙÷2ßÁ˘×đýđŰ?^łň !~Â@)3ÄŔß1` ţÓă× ~î ŐÂň×á ĺń4 ŕĐőĹŇŔ! çđáŕđÇđ ĄáŃ0Đ#N ń Á Ăŕá=đÓ˘ĐóĂż./çłŇÔăď HŃçŃŕŇ' ŢňŇŔđđѢđ/=Çáŕ4ŕđ˘áŕđ$°ŃĄđňńŔŁÁŕϢáĄŃŕ0×°"ÄC€ 0‘3đ‚..ű3Dđŕó˙/+ţ7CŔăäŃ?O"â“ÖŐŕđđÄůÔăáĎçÓáăďp?&Áđ$o˙”ńĺ°ňÁŕňSĐ@˙NÂĄđý`ĂÂńââ÷Ţ~MÓ ÷đî AĂłáďâňp #€â÷ ä˛ ě!3ąŃ í,/ó’NţŔ ÂďĐŕŕ`Ń‘ÁÓŢîÂĐđ-ą€ÁňűĐđňĒđóÁ@-ĺ’Ňó.PĐ÷ňđIJńÓĐ!o˘ăý˛ÁđţL!8äôńĎáăďÁ ăöđÂňóÄąßň@ôÖá˛Ňď“đ >=Á/ôŕă'áӑó PďÔáđâąÔ˙ŕÓâŕ‘=ăŔđáĺĹĐôÁâŐÂüóĐŁ˛ňÔÔýňÔŔŐń^-NôŇÂâĆń˛áń4×°  ĐçĂÁŕóđŕŕ˙˙t$ąáňĂó˛&ńńî çŕđĂÄňöâŔá#˙°ÔôŇĆĂÂđŕ ň‘î¤ĐÔ  pđŕâ˙nđďĚěţ‘ĎTQĚżMv° ďž#íöA!Ë ŕ=Ŕ0đOŸŔR îňýňr °B2ęđ áďţ1­ŽĐ1ßŐ`üŔ0żŽ/ßď`˝ň ŔżŢÜä@ŕ!ďŢB Đâpě#vď! Í&!p!˙=đ 3D#.‚? łpĐ aŕá2ăţ?Ąs˙Rá"SĐ4$ńqđíC-ŐBŕ<âŰ đ`Ž˙ŕ.ĐŽđÎţ°îđßÍżţî௠íŢÁżţŕ°-ţţä đÝ6-˙ŕ2a˙đ @°í7 Qď0ŔÂ$írď2óPŔď4rűň%đ7 đ@Ô`1îŇ@ÓsţâPá@á˙6ëţ°#Űŕ@Ŕ˙ ŕÜĎńEŻňđ Ý#&PÝŕßf23tS0ńC!S0 !u2ß& ‚R3R2S5 'ńq"ňFOî °ýčďŇŮŔŢŸţßŢđŘŕÜďţëë˙ĎßěîŽýáîÓżîîĎ ŕ!čŔçÝPĂĘ5ęÎúđ  ţ°ď% đ?ç/ţëqţýî'ŕ$1ňAŃ_đă#tŕ!/€0ô-âÁ2QđÝPÜäAîě ˙Ŕr+ #Ë # ä #ŕVţ ЀĐB ŢáĘýó-ĺČňPîîć î°4 ŸĐ6đéń °ú@Ţâ!ĚîÁ.ÝA° žşđ ŕüîôĎžrŕđűßbÔC!/ Ŕ'0î\Žô!ŕÚîî˙ńذđ$! 3°*Ŕ ŕE$íŻa ţî&1đ!A"üâEĐŕ ž"˙/ 6ýÜň@đĐ'0 Ž4áÜsůP îđ!Рó,˙üżýűň!4ö=Ň€"đŰáě,ß3Ď?ëC!Úň/Ň3b˝ň@ Í2Ž%Î#á÷ ü5 =Ń%' T!˙đ&CĐŕr1ëńđŃ0đě°ż đžžń$!/áëâC3éŕ!Đ Đ˙ ˙ňţ˝'1/ŕÔqŔâ ˙Ň1 Ă' 1ŕ0ě× Đđîĺđ#ßďŃdţŔáO@×á! #Ó$рýq˙đŐ0°ŇĂţŔqëđ<ďPŕÓ!čă đŔÓ3ÎܐFďđŕńĄďááđ!úĄá˘Î '>đż/đ$ďĺŻ 0ÂîóĂ/ŔP Ŕä0€đ4ŔńýRßp° ĎŇ! ńĐŕŢóĂ ý;ď P ď2üáAéđđí"żТâţý€!@0ńţŔ/Ó÷Ýű3Îőá Á7âĎŕöá˙./ ""ßq ß5'@Đ&ď%ýŃQí ŕ\â01ŕîđ"€ěâ_ňţç>ßá%Đĺ!ÍaĎ!! Äđ°/@ŢĂŔä Ŕ Đ 0‘˙ÝđĂüä.ŇŰń^Pđ3_r˙ ńOOäô˙°˙ćŇ ĐďÇđ Á@Đ ŔŕÖ°ţŕĐ #0€đĎ ŕąłńđţ“ňąđîĺ á"Âý1ďŃ 2äÂĐM4ď (ÖńĐaÓ$%%ÓaőŕńĎ îŕď%˙˝ń>Ŕ>°âÂńîŕ‚!°°ŻÁđLţőŇĐíŔrŕ˙Ţ6î"3ŽđޢÁÂę2 đâÉ0Đӑ°4á $/đĹđ' n03ýô1M!"ę#ÓáńĐ@*đ/ńŃâßĂ]Đ1˙ď’őĐ0°Ââ Â@đ€Ňî˙đá/Ď'đď'ý°ŕRţÁőŇăđ ˙ä,çä°ňŕDA 0ň%ďP=đä0çŕă ˙Ňîá'Ŕďöŕ˛âă?ß+‚ îąîä$î“đäęďáąîQđÚííĎöĐĂň°ň!ĐŕÓíŕѐóMđ2 1P"˘ň"îäóđEîçđáÔ°.€đŔţ‚óýďô/Ŕó+ăŁđ ď@ @đňŢ#Đ1˙ňŔ!×đďŁóîÁŕ*őŕđ !‚ŕĹł.`á@0ł&ű#đ´ŕoóý _¤ Đ "Âă!ŢÝ`ˇýĄň˘ß2Ýýőúšüű€ 1ŃmÖŕđ=ŃP‘îň€.ÂŕňÓŕňôďŃ?$ݰôđ,á/Áçôŕ8óŕňĐPĄáń q đĺŢ &Îń ÜpđpŔä âĐöţÂńĎŃóĺĂÂ!ońďłâćţ 2Ä đô3ňĐ!ˇ˙˙#Ăňîpŕ#čńâ PŇä×ÓŃ ńÔ ž$ĹÁŕňŕ7/Ń QđâÓđđ$Бápń!Ţ@ý÷ Ô"ĐŻŔőá ? đóąňď'ŕÂřţî€ŕ˙ßÔń #6ĎňÂG×ď@ńÔoÁ0Ţ_ńЃđł в îńŕ÷°Ŕî5ŃĎóüđ˙çýăđ,îԁŕă05âuď QÁ2óÄüđ"Ă×]ŕ Đî€ňďű îM˛/ąAÂëóŐ €0Ă=Á14ý˘2ť#Ąó ąóţÄţƒ ŕĐC‚ĐÔŐM°°ŔäŃ0q¤ DŔńÍ/Á%Đđěpţń.îäëoŕîLđń*ńđĐĐ ărŕâţ0‘Âď,€ýâż:đ ˙Ŕç-ń3ŕP" #ń=Äč˙ÂáQ`"&#ď +­Đ0ýĐÚžĎďŢĚÝ3731 âOđÓá(€#ŕ'3ţď@í/Ňý ńńÜňđ1îÔż ŕ/'íĹ  Ďßŕ$ńä@Î/˙sŕ4qđ"1ÓrîńŕýŽüńđíđŸëţĚđĐüĎ˙ô÷2BPŕďR34ý'ö"čđÖ >˙`Ţôźă/€đűÎá1đ đÜłPď0í˙A˛EĐ Ůđ$0P10BCëđ ŕŔż˙éÍŔŕÝĘĐŇ5C#C#öńAŕî1a"2ţ0b#ăĹ.Ň@Đ' đ ÎđŕňëŢńîç=ĐđÝDý`ŕüŕ Đ ÷BôŔďŹ!W1$3AŻĐčţî ţđËŢťŕěěŕĐđ#ď?$33oOŔD"0÷ ˙Ţŕöî4` îŕđ đĚŢÝăđQîođđ1`+ÝÜŕŰâ72$)71Ő ĺň äŐđĐ ţ˘ńŕî@ÂÁ2 .´ĐŔ˛Đđ2 ňöÓŕńäŕ!2ô7Ԑ áńďąÄţĽđŕüü0őĄŕ˛ńŃďă˛ĐÓ˘˙đ-ëĺň p˙ńńŕôÂŕ>°Ńď Ŕý đĐîP=0۰"ćŔÂ?ŕđ ńáăś"ó Ôôńň1đď€˙đţ/ëÖúŕ đ#“ĐŔńńáąčĐOö˙ń$đr2ńäôÓńҲńŔňń,ÚÂĄŕüТó² ý9=ďő÷ń˙?× ôPň0Ý˙äđÁîđpüÁ ŕŔŢáÁžřă° ŕőŃłöń27ç Đ#pŕ'>łđć?€ő!Âń+!9ŕĎ%Ëđ ŐüŕK˙âţßqń0ž=Uđ11ƒ ńA0ńŔ0úđÝôďýđ / ÷đNţďŕŢOţţ1#ŘđĚâŢ3Ď˙ #ß°žěâČńűěâ 9đßĎ  ňŕ0€â2@"ď'AŔĐÚÓLžŇ€Żł.qĐŕ›ĐCĐ! Ä ]ă,ĂqŇ 5ńÔ.ä@űŇpđą#ĺ@Đ.pô ţOᐠŕ,@ÁÁęMď!>ňB}ăńAB-ĂŇ1$Ő đŐ0?ă€0Ođ 0/pŇ@ăNďżîěŐ °âţ Óí ó01łAđ Ŕ ç & á‘ţůŕń ˙ŕß ŕŹ őĐ>đOĐâ˙/‘îÎä-[˛ŕ˙ ŔOßŢ+đŇ ÜÁcŐóq ó EöîPâ 0Ć áá÷ďPĐDá<đĐCD!Câp3ô"&. ÂŔ ńßÎŔđϐű!î~đ°,ŕ !ß(óíÁ @â$ŢĚ’ Ą˙ŕ‚ ďŸ!ç0ňɲ ÎÜŐ âŕŔŕA  ă Q3ť2â­ň€1 ŕ˛đ0Ž ŕ;ĐÁ3 ń!˛ŢTÓ- 6ń"Öńóď4ý˘đ@3°ó!4Öî?áđ˘ŕ1ý˙áů €áO@!#C@Ŕ <çîâÁ°ĐáJ°ŕĐđíÖŔ /ŕ.ňî‘ŕ˘ŕ"€°˙ĐňąńŔÄÝ Đ˙âŔĐ#4×qäńŇ.€äŃí € ŕĐŕ âűŕ0°âŕpŇ" GńÓ .^Đađń<’Âěţ- üňŢaáđ3ÁćááĎčńŃŔţĐň(ń@Â0đp Sń8ňĐň$ëă°  ÁŰńţł$  âĐPÓD$ďŇŕŕŇŕľŔ#Áď/ĐĐQ@Űđ6ŔďĄňÁOý ?Ô-Łŕ ×ŕŕţŇŕŔ8ńŁÂp@а0€â°˛Ţń"Á đđâ ŃÁ R!-@ý°ă /çîą°Ďî ­˙˙ ?ٲ/łAP"Đđńď€ đţýÂěÓ ÁŢÄń¤ !Đ?"ŕ ŕŕ ŕ ńđŽżďŃ đOđŕćö ňĺ°ŕđ.×đôţ =ÓóÄĐ˙2óöSň/çó2íÖóýŻĺ Ë €ĹóáâDŕŻňáđ.0 Ӑ?ŕЀđ ŕžŃ źđîŔá˙ĐCŸ Cň_ŕá;ąđâţŕďíâ2ňoÖđ0=0Űp" ý*áđĄáőâ˙ĹĎđ"?Uŕ á Ń ŃŢ Î ď ĄÓÓąP5 @âӂŕ˙=̀ŔĐݰđ Еđ%@$óôńĺôŇŃOŇď‚ń0éţđĐĂC @rđí M0:ŔžЎá/ ąđí#܀!#óŃođôőáłńăÓŘńŇŕÁÍŻ łá ?0=ĂßÇń37ŕóđđÜÂíř°ň˙ŇżŔŇôŰńŃńąńüćţ pđäçÁń-ŕ= Ń@Ÿ´ăŕň0ňŔĐӓđŇĆóôâ ×Ň 4Ą÷áäđ2 ĺ÷đŇěÓčďŔŸýŕŕň°í @7 đ#ćóđîŕáӐKđđ€ńÁ Đ×PÂ@0qÓ@Fńđ 6ńžţî@Qűń° ŕ$ŕO á đŢ ąÁÁĘĐá%"ńŃţ ĂńđÁńňÓpŇâńţŕ×Ó˛ŕŕă áôý°-0Sń.P0rP"ćóäńđ Ă4ńĐ 0ԂüÎóęŃБđÁ Ţŕ mÜÔÖńâŕŽ0íÚę#Ąńńă€î0Đ Ŕ`ĐŇ0“óôńç4ţ1ôŕńîOŔŕó6AŕÔłúýÜOţŕßÝ'ą1 ‚/ŕ$Ń@@ŕżÝ Ü.šĐď˝˙ýđđí×ýäă×p "ńíPÁ0ńîaüÂţ‘ďăCţçQĐúŔ .đĺ ţĐňý ń`AOÎţSĄˆĐ1ďLŽA  0„ .OâĺĐŔKoîőß-ď` Ń4ňóEí ňD ŕđŰâ2í°Bßü‹/ĐĐ1îŐíĐ)Đ0Ŕ#~ĐótŻ#ü@ö/â0 R ó đuď ŕő.ŕÁ6 ˙Đ ´ ŰŤN°ŕ.üÔ_Đ2ü"ÝSA!/2B"33CC1FńQ"(ć ˛ű/ßžńÉí/ďŢ5żńďţţďԀ˙@úŕďpŔáN˛>đÔŕaüŕQíń.î0é!ŢđQÎ@°ńpŕňę €!Ţ7îA đĐQâpŐÝđ #ýŃż˙ DčňâĹ Ď`Ż! âLó Ô& ŃRN˛0 ňpâ žný3˝1ěđ éţ˙!ßB˙ańPň ˘0áp˛ň_đ.ŕ’  )őđďN°ţ/Ňü,30Ą/ńOÂýú#°Ná 1ňîHńď$đ°>âN° ĐPîĂŰđ0Ń˝`ŕç ďđ ýpĂ 3Ă. Ţö Ý!.ńż/ŔŃč ţ˙ťňýŕ Đ=Á@°Ŕ_ Ńó,  ?ż7 ň>^Á Ă.?Äó Cą"ŕ@ňPç Ýaţ ?Ą2ţ"˝5 QŔ Ôöţ0Áp AĐ_đ6!n  1ŔA ă ďąMă Đím˘AŢ3 -Â?°!úý2ŕÎ3 @Đ ářđŕĐ-ÔŹ˙ϐđMŕŢ}×đý1Ď °ô aî#˙đćä,1 ýţ.â0Ž1á` Đ@ŕ0ďQÔ)đ! '°@â .÷čĐ_áŕŢđčëű đ ýO°!đ ě> ?Á.! OPФü3˝ňîq°OŕîĐ'ýmÂá ćÚ"đ/Ôô€@˙ Qáî!Ż@Ä>î Ĺá!(ó ŕĺď2!ç.%ń"BĄ0€%ěÜ01Ŕ?áň!Ž 0Ĺŕ.ă-/‘>ŕ@î/˘PđđÄőŃR ?ŕđBî´-ďŕďŔ0Ďě€0ň!ÂNżń/Ó^Ň2 P>ą"ÍŇv˙˙â@ ă=ňL÷ńMÁ@ýPňÁA.4ă[/ đÁđÔ8îŃ/ňP°-Ń@żŕđĺ ‘đŸ î0ŕ°đŃ˙á!ß%Ý~đJýő#ń 1đ˙â:Áűđń-ŻńĐ?î+°/Ăţţ@đđÝqäAÓrďâ$NíR2ÔĄ@ó v ő"â'  â/ ď?óŕOžŕE ă>ţńĚQ0Ţ"$Ď,ňúáďţń:˙žđ°+â!Ž ţ0°"°Ŕqńq˙Ô`đpáßM @Đ.!âÂ#îBĘń1°Pđ0˙ń7oá Ŕ@â,ăN 7""ňsó9ó+Á@ĐOŔ-/˙ž1űŃ ŢôŃ}űđíĐÜ! -âřáÝ6ďî?°ń}Ó#ţܰüŕĆ-°ěŕBŇ €" á ŕO áPţô˙Ŕ1˙ĚŇ@!‘1ďŕv˙ôý'đ×0ÝcýOĐ îE ţ'ŕ â?đă^Ü%Ďü/ô>Ÿâ/ ŕ1řń˙ĹđđÎŢAÎŔB  á0Đ+đŐ Đ=đŕ€@˙ä+âQäNţđMÇý3ß!Đ"A ąA đ!žňQö=ăűđ_áA!đ€ /e× 'âP.đ& ˝/îđŕNŔŇ<ňÝpŔďü0!ĺěÁü7Î!ěż0#÷:Đaîđ3ŢÁěÂ-ßţň0á؏௠ń!đŕ0Ŕň_îqđAÚ0 ń@ň$ásÜđë$Ď>áƒ.ŢAčá pŕęó@â=ÖĚă &árî˙â @đĂŽń+ ˙ýÎň,5í6đŇmĂďřń"Ĺ ä@đěđí)˙× Ŕ Ţtý ň QĂ öđ@Á0ňNÔ+ţ/Ą ăPż Ü ţđń> ô=áż0ÚŃt ýă1Tňa ň1ŔăŕpŢő!Đů#đ ą @€ŕ@đ"°/ďüÄ(˙,Ă1ŢĐMŔ4 >Вá[áRâ AĚ2đĄPÍá ÎÁ Ć /Đ÷đÎMôŕ ŕ ÂBpÍđQ >ď1Í@ő3ë!  Üó?Í0 íă`Ď ďđ ,ôBđ0ŔQđí˙cŕţ%ňOЀ0dč˙ŕqěAÎŕqńúMéŕ€# Ó\Ż!AÎ>ěĹ.ôŕOňŕŕ FNĐđ ݞߏîŔŢŰđžýĐýü!'čá!ľäď Ô0#37$ôCô 'Ó1B#$$#4$#C3CC43CC44$#BB2ĐĂ` Ó?ţŐďď˝ ÝŃŕđݜů˙ŕíďßüđ ěýăŮđěďŕßüŸ ÎŕݰýŃźęŕëĐüţÜ Ŕ'íŇB°!?0Î ńŃ ő-s""ED0ń&A°#ć.°ăŕBčáŒđîžţ?ĚŢâđ ěţđ˙Ě ˛0ÓAA ô W?ó!0ó°aň!'<"pR$& 3ăRcą@C#@344#a#PđDňpŕ˝ŕ żŽŕ ˙ŢÎŢüżÜ˙žŢíÝÜÜÝÍÜÝŕŽďîÎ đí˙í°ĎĐż/ŽđđŃ ńáË˙ń;ßŕ  đńîŕŰí݌ żĎ Đž ‘"ÂOŰ6˙đţţ€Üá5Â,ć!51€&čđrŔŕÜŢ2ÍqĎĐ0€üß żí`áđŰňĐŕ#<ä !0Áq á0 @ŕ˙R$ŕÁ ˙´0ŕ/.ň€1úŕĄ@đ\Đ0ŔÝq ă'.ĐáŇí',Ăţ#€!üŃ"3páá-4ĘŇ@ŕúßżđŽŔđ âĘ˙âđý˙ Ţ$ŘĐBŢ QŔPňÄ0Á CđóPrőr óđýłD×$đ"ÓŘqŕ˙đíŃţ@鸞! ˙ő"ł~0×đaí< ĄaÔ žŕ,żĘđŢĐŕ °đŕĐ "ŕâĎ[ŕá mňň@ápŕ-ŕ#ƒ/Ѐ°0ŕ á!ç ŕ$#čő ą$!QĎ1Ő^ńPţ6Bń㠍Ań2 îG˙ 5˙!3Wđđ ą ńŕ`áŕú ĐÓ>ţ°îýŔ żóíĂpŃÝĎó!p1ňě7  â"Đ0Ŕîćî!ý0쥞ô1ůđń.‘ Ň AíÁpŞüý÷ă é°#đď4Ż7 ˙Ö żţđ€Ń˙óJŕĚâźđްŕř đíż> żÁ`Â@ńQŕ"×FíđžĎüđđCěĐ.°ń â%đĂ7đ@ óPň"Î?¤ŇRß˙7AÓ=ö DĂ˙1/˙ĺĎ Ŕ˙á üž Ďî˙źßĘ-ó ŽńĐP ŕ20Đ2Găđł`ĐC!ŕÁc@ĄüC! đ î#ďĂА Ń ąPđ°/ă#üçŕă đ@ýĄ!ó3S5##î60çůńđĐ Řŕď°î˙ËŔ?Пđâ;ŔŕŕC â.#ňaňPĂđ#ęüŔž€ŕ ŕđ Ţ%îđ-ŕ #%2.Ń ×oŃQ€O $ŢđFŃđŕA1&ňíńâoÓPúíÂݜťŕ ˙­čţđôÜ`ţŕA ŢPoÝŕ"4 <ćđ!đ˙đ=çŔŕpżéŕŔđ ŃAŃ@ô ŢRĐ#ĄBáţb'ň62đPB0ŕA$Pîý˙˙ Î  Ţ°ßűŕŔúîđđĐűÝ?ÝĄ ŕßDŃ5đ"ŕđ$ą2Q°p0ď5ń˙ŕŕAą.âDÎ@ÎŔŔ ˛1,ÁŢ Ŕŕ 1é`ďđâßá'á$@Ó2sOŇ1  ĐČţŕü°ţ żŕ˝˙žîĐňŽěŕÓ˘róíôW!!öđó3o˙°0 "Ěţţúđ4îĎÎáÜMĺđňŐ ŕO`ö ń ďF0ÓŁ @ß ŕ÷ ň@.˘đ  ë Ňá(áŕ đ/žđĐ‚1@ŕ . ÷pţđđŇ÷OŔÝA0ÓÝSűá"üô_ĺßě÷ëň pđđ? Qđ ŸŔáüĂÁC˝ŕ6ţŻń îÝň/ Ń.ĺ ŕđřßđ đT"'óĘď7ţÝ@ă@óň ĺ˙@Óđńđ4ńŘŕCŔđ04 ő÷0˝ń7ßĐAĚ$,ŕýđŕ Œáđł%ŕ4ţÖ.ĐóĐî3Ç<°2'1!ÝŕAđ€ń.đ ÂŢ 3ůżâ ÝýŐĎ? 03ß. ŕ7CđТţĐđqĐë° ďQĐ"ňŔ°đŽđĐâ@TŃ ńb÷!ŕ "đÝŕA Ą2`đ@Ĺ-îá_Á=ýôđŻÎ#ŕŇęĺĺďÝŃ×ĐB0Ó% p˙& ÝňŕűĐđüđ Ţ˙ąžŔ ßĄŐ îň@ĐG/sbń041>GŕҰЁDđ/Ó0O @"ô÷ďí Đá÷ŔĐb!âěô@ÍŇţR˝ýßŕ!Ĺ ^ ďóňa Sď @îŘđŔŔćňŕÂëĐ žń Ŕŕß˙Ýŕžđďůđ˙ ŕîÁ0ŽEq#Pýţ Đ qŢ 3Fŕ€/4°ŕ0ńó Tňŕăžß€o.×2Ŕ $ r<B ßBO>`ßńÚîŔńßż ŽŕŽĐĐŸßîĐÎűܰ?ĺ$ń ŕđżç" !b T ß ă0đ€$!í ,ç#ţâ°đ.łöţ óáĂđđÓ›ţŕ?°&đŕć"Ý÷/ń˙'ßß Đ  °Ŕţ Ŕ€ý˙đ˙îżĐŃŕÁŸţ0÷"@ŕ@ŕcđńńąÔá-"˛3ŃŰń"Ń #âðR-Ń%2.ŇţßĐp B$"b!÷Rď˙î6N€đŕßŢđ  ŘŢ˙ďÁ.ŹĐžĎđŢżÓÜĐđĐŕĐ#€p` %# ŕrŕ%îňü ˙/ Ä$ŢR˛âQßă°Ô@/Ňâ€# âÓGúŕáóĄ7 Đî6 °Â@€Đŕ  ÜýӽďßëŢýżŔ˙ܐŃ"ňÂA0Ąđäőţäb1rÜ!<€Rńôó7 UĄńRîą 'Ńŕ Đá$ó ăSŸđá _4îŢF`Đí`1' ,~ž>Ŕ  ăżď đßŢѐŕ ŕ ˝ËŔĐŔÎđüěŔţý:â×ó "ôp#a" ýîě4Ёŕâß%p2Pí°'ÝÔńá1łÓ_Á"BÝ/ôäAr "čňđîoęŔ°ŕí°ďŢýĎęďŰ˙žŕ˙ţÎáýŸßŢćń1a$ #=4çE!@0Ý×îëCŢßí˘ ńôŁŇô0ĐQ@Ôŕ#ŔÁđ’  Q0đäÖţ7°ň  ďĐíœÍŔ ëđŔđżßßâÜë ż Ű˙˙žÝŸđĐć$Óóuŕâ44#đÁa ŕ0ĺB oĐŔ2ĺАîĆń3①Q ĐŇt´!ń#’őâ.ü' đň"ÚŕĐŔż°ą ŽíďĐ,°íűŔ  đ˙  áŢdţđRŕĐP€čâcpý@űňđ?Üŕ>!1ďżŃoń$˙CŇB"ß $ąđĐNŕđq˙Ä0Đ1 á_Ńń$á3°˙ ŕĐ3 LŻOŔâč˙ ŕ!Üđ/ űŔŕA-°ŕŰżđLĄ˙ô>ž ŕQţ%Ń/đ!đ0ŕ Â$ ŕ#˙‘Ó ˛ĐďÔ"ßp°&ěQ˙ď4ţĎRóňS˝áC-Î ŰA°!Đ3 Ŕ0ÜôżíŻŢRí˙ÎŇ? íń$Žň ţÓ1ÜţÂS>ňżí4pýç"ë2° ßě˙ŕáŐ á0ÖĐ ŔňC đ%-$!Ţó%ä î@ż#âŕđPŕqň? 0ŕŕ4@đŰÂ-ćě ŕááď ŕ&đŒ0Űđ,Üŕ@˛đÂţ˛Ú­âPŇáLŘA°.óŻoÂń@đ-.“ţđ¸/˛ Ŕ0 Ńđ$ đ˙@ 4 ôŔB P Ԁ/+ě1Đď@ÔńđO.ëĹ đ0îŕ@ÓÎÜ8öâ 5 "Đëţ#í50‚ţ=Öđ+ŐýéŻŕń,@ÂŢQďě ˙ Ý/żŇ ăs`Ň Ŕ1Ţ0đŕQđňđGpąOđŕrŢC ,Oů0ˆ€îދ#ŕ í€ń ďŕ ţÁđ ýŔŕđ^sƒ íóR ˙4ň@Ě üíÔTŰÜÍúS˙!6˙(ŕq ЀA˙.˝Â. Aąńaŕßc$ŕŰŕ!°?ąP Đ0äęÜC"C" ţđüĐ­âb!ßŢ×/ńřđ/ţ Tŕ0ÔëáA"Đ0óř "çPđ°đRÍœţő!!!ĐţAÉíđ!1đ /ćîžÍ ?€CŔüĎăňp đPޏő.€Pńß/P/Ó°P Üŕđ$<á & ďŕńđwR˙ ŕô2÷ Đ#ŕ˛P2˝ß !Žđô @7# đńŔýđ@5@ňŕ@,ÓŕđĐđp%!"ŇÝ 3éŠ>9bő ĚŔŢŕp"ďŃ?űĚđđŕď0çAăpßŃŢĂŘB3#/ňýŃsę'A ôë!üąĚĎS á0B‹â3űňrß˙ٞńa3"ď ž@P ˙ €Ńü­˙đôđ 9˙íŕŕ đ ěřŕó0e0ţňß5CR`í,Ń<@đ"ď2-‹˙ó2đ$#SIŔ0ÚÎŢF"A˙ îF1!  ŕ  QŃ+/đéŔ#îä' ŢĎĐűîÝ­ţătBđ˙ëŕîëß739áűî äîS0ż Ýđŕ2í@ňě/ ÂéĐ#r!Ż/ÜFĄ žń sCŔß˙ ţBĂ+â A°ČĐC/6đÜđ" ás!đ+€˙ßŇpBđđŕžđ ŃP3&/M1A˙Íá72Pţ˙ěыA1 /Đý!Ąń`˙00đđîˆ? 5ţđ đPńđ ęííńřđ#N@ďëŔńP0"̐Π#2 ŕďŢ.qŔÓŘđß@ó`đţüđü/áÔ& 13áş đRŕ@Úîń4ŕ:Ý Đ Ń/ŕ4Ó9˙Ąî Ŕc&!đ°0\ăŔ`á8đń/˙ŸţDěŇîÄßqđö" °îĎC+!ąN ˙ď Qďâ'đĚîŐĎ A0Ż 1˙/Á/ŕŸđţ˙RA@ÎÄ˙ťđńŃs"ŕ@.ÎŔáÜ "$NŢŠŕB!Î ýĐÔ1 Ă˝0$1`!ăđĚíú6:ď°@đ!ţ˛M݀ňżJĎżń đŕE0îŰĎÜґ >GúđBő@đŕ­ŕ/ŕŔsđĎü^ĎC4áĎŻđ. 6!řđ ""@ţď@Żóđ^ß/°îâAĐĐ@7 ˙ŕüâ ń2@Ń1AÖ?Ń2ţÖę`đÝÉđňúAţ!ÍŢ ţţ# ŠđC#"=Ň2@=’04îÁN ŕ#>°ŕ !ÄŘáC0"Tŕ ’! ÎÁĄ-ďŕRöí?Ďŕý 4Ŕ‹3AĘŕ  ţăĐ@;ăç@ţţÔÎň rđ ăđ`Qó2.sńç-đ ŃßoÔÁP/1áąŔ ţ~áŕ!ąúýŕR"â^ îîĂó}ýŽđŔá/oŃ#ř˙°ţŃ ˙,12Œ°!đRĎ";Ţôř#óîŘżđţ áŕ"5$QÁ Ŕň?ŒA! " <<ĄţđĚO÷˙ AáąÎ @’)ţ!%ö #@áăópÎpŃüŔí7ňń0p×.űđđď,N’C á0í3&8’ °ţ! îw/üđ%đď/ŔăMşĐ`  !^ţŇďčŕ.îá&ŕ"ý˛~îĚđđ?Đô,ŃP`20qôĐůžîŒĐ/ß;ňđ/7Đ?&°çářđ Íô é Ă‘˙ đ2ł˙`ÝßĺŘĎňQAŔ SđÜC ăí ÓAŕ '"ĎôđO€đč!1 B 0/Ô2Ľ @ďŕŸďý Ąă`#Ż €đĐ|óěŕŕ%PđPđ0Ôűŕ;đŃPŢŰëĐî÷"14.őŔŸŕ %ď 5p5ŕ1NŔ˙˙>Ң›ýâýá!ŕýOD6Ąý ĄđďŢÉđD#B"Ŕ7 ď  ń @řÎ˙ŕ°Ţ0s$Ţ sîžđ0܀đC3 R32ŕ Ň03źŒĎďýýr0đŕ2ŇqŕÍ ąţřňP4  "ß äžĚđěńţäG"ŕđŽ0Żŕűţ˙˙"RđSĐ qĐݰđęđń ˙ń3qđą ý !ŕď ŔňwAá`đQŔţđßéţđSđ./×2sýpŃsđr12Ű! €/ Ńđ€ŰńáŕóŽ0"&Ń/DĹ"2Ű5ń "Đ7 Úź ° €ţî°ĐӞSÖ  t0 Gŕŕ &îĚŕë ŕŰî đŕŕż*ňţ×& â!.T ő/ŕqńBŇíP@ŃúďßëĐčďá#ďŕĘđýĺQT2rąň`?ŕâŢ8Đî ńżí­żŕ4 0 °$&0ňĺ1' ˛čďâďÍ#ťđĐ ŒđŔBĐ@ ńř!đ!#/÷"ńaďţčîŻđ ŔĐ;ţŽîĐ×_!í@ŕ &á1ݟďËýíĺŇŞŕţňŕqâ}Bň"TOAô@ňAŇ@ŹÜĐđ°îá <žňMň´7áQ% °P3Ą!22‘˙ţëâ˙Đîď ˙ěáěđÁ2đ7@°`ä#ŰńŢP b ŻđîřţŔĎđ î˙ŕĐEBbt?ôB"€**ý& ŕýî߀đ ëîáüđ1 Đ4 ü÷1Óa0Áb0Ŕ á5˙L͟đě đě˙€îĎĐ>ĐçA  4/ůĐ%0Bŕâcţ6ß#âr ěž˝ŕÎËđţíÍŔ,Tđá,Ň4?ă¤"1D4Ń<ň&ô3żBáż Ďâ ß ŢđÂ,ŕ˙°żď€0ă g#ű !$ńa˙!€éаýěĄë Ţŕ` !7óĐ'0Q1ŕSŕđ"ű îżÎŕÝ*Ţđ÷ÎţŢŔÜ$!đ˙!đÄ 4RAđR? A ÜżăßîŕĐŰňüŢÜŕě˙qá&ňAa?öü3@?ćŕŽđăě ýߎŻ ŰŢŔUđ4 Ó#Ç#Eň%Ô a'"đĎíí݀đţÝ˝ŔýúáRő!3ëďR&#ňç!13 ž˙ŕěýŰĐíđĐ đŽíáÂćcĐnćAr#C4 üţđÎŕëÚÎđžŔńŞÜÚ6!ÚÓ4đ7˙ĐC"ŇsB"4ň/đąěßđ źďŢŕ­î0Ŕďŕăď4č5˙˛ RS@57!á =Đ źđüÜĐßŰŃëÎŽŕđޑ!Ď%/‚"D1Cňđ ÎA üńČŕěďŸîďďţđßŕÝÜ "Ŕ/tóa$#$#r0đÝ#ç˙ ŕĎí€ěý˙ë°˙ŕýń đŇ2?cCQA!%r""óű˝đţŽďߎďîď ÚíŕŕîîÄ ŕŕň'C 6Q#C"@#˝ĎŰđ̰ďÝĐÍŢŕÔëÜýÎŕüŕň0sTţBPdB$40ńr"1Ս˙ĐđÁŢ ŽîÝŕđżíëßďâß/¤ďŕB2˙çDa$R2ŕ6á1P°ŕ€ńíÜߜĐň°Ě Ď˙äÍńv˙%đ b"UAŔ  ĐđÍŔ\°ţÝŕéđ žŰá)áô-5ŔT"!ű5"ŕ.Ę ňí˙Ý žÁÚŰ2ţ 0ń"ęëpŕ/5đ"Bâ -ŕa!ŕ°ëŕŕţ­ďá,Îŕ1ߎŕţ!€ńď7ţ.–+Q  ŕŔD ł<ŕ5 Đó\ĐýţëG/ßßđ% rĐDě@q˙đÉ żě˙"7ýŻ' ó.ôá0ĂţýpââáŠ@ˆîđ!Ź ţž<Ŕđďđ4 ĎNŔý3ż70˙â;4Ü< Ň0Íž1ž$íďĐtąđŕB`Ŕ%Pí61úŕ@ďđťüňî˛ďďĐýŻ Űcëń]Ň4 ŕ@$#Ý2:/#1 ÁĐRüÝÎáüä ą2(Ŕď2 !ă!ń+“0%03G"=ĺ/ŢC ŽŢřđđŔ˙<đ0 ŔôB42ŸďÝuđ đ€$ Ýí°!žđÝ °0 ëŽĎŰă@áěß˝ňKá!!ö"/â.˛sĐđđťëďčđ"ń-ŃE ď3Ÿ/ ĺč0ŕđ>ăŰ!ÓýäMÜýđťđŕ%’đ0éčÓpŔÓđNÖ  "đ-đ§  á ßŕďôA 1ňŃHđ!°^˙Óţ÷ ˙0ăäMő @Ŕń "ń"đNĐN'đňS ŔMđ "ď4 2Ž  ü°űĎţ~ňĘţî,ěçŕąŇ@Ŕî&Ţ2 !ń -Ôđ÷]ŕŕą=ëá! ÁPŕÇŕ˘0ͰOţ?÷ŇM đ@°/á@ÔÚ/ĂĐřđOĄ ňäýń0Ü#ŒPŃ"Ŕ ä?ŢBá#°]ú ŕ Ŕ Ň1ăIŕäý $ŃŻ 1ďžBĂ!đí2Ňr°$˙ď0@ń€ÓD˝ ç Аřđ× ˙°?ó<ň˙$Ŕ0 ŃÁMĎ/€đ3üŕäđű3˙9ăÓřđOÔ˙đŃç÷ ŕnń $ŔĺóžĺíPÝĆ/1ŃMM÷üö!ĎĽó!đ0ňđăřţÄđ"  ÁľÄ*ăó˙ PáßęQňű*˙ăňÎpňóŮ2>Őđ đţĐŻń?ń+#îţpŕđÖţ˛€NóÝRŐ1Đ"ň>wŔ!˙=˘ßđ5.Ě"Ҥń(@đŕÂđ ]Ŕâą, Öđâđ"ăüpń˙‚ě01 ŕń0“-?ˇđ˙ ý ”ŕLďď;$ĐŔpđÝŇĎnŔ! áEŔ žPă€˙,ôâ Áŕ(ňń0 űđíą0 Â`Đđđ×îĺ;Ă.Ą"ó+đđđnňőţňĹč2 .đ?ýó7˙ŕđ{ĐPńá@ "ŕĎ/(ŕ÷  Żâ-żă/´đě_pŕ°áđ=˙öÓĐ0‘>ŕđ!ă˛ô]ÔôŇ[äĺĎ"Ň%ţ Ô$--ĆňĐ[ń ďĐ˙0ă%řđżćí!řă Ŕď>ÎQäüÔđ ,Pŕв>ÁüO$ÝĹąü#áăÔß~ţćŕ/ţţ`ôďÁLđáŔL(ńđŕN A 0"'!3BRđŘáďŔ0ÎNŇßĹ? ˙ż°ŃÎ ^ĂŔđ?đä_Âô@0őňŇđÂ˙ä2ţ×ňôţ@îţa='đ,"!C4óBa&˙ â ű˙Äô0?QÜŕáäŃčžŃ2€đ˙ đĐő2đí/uŕá0 ţŔđü áÓar Đ!S'ý îń“/Ä`a˙ń1Př° ŕŕPâđ0qňb!đ2pÝĐÇ˙ß(˙1 đ01îrÜŻĐŻ˙ÉŕĎíĐÝ Řđő@ţáđ °ń÷ă@ @çţŇCBÍ˙ŠđŢńű˙$7E$B ďóqađ0ňáp0E˙óÁ îč°ŕ ˙ŕÜďÝ€áÝ#Íżá7ć0`ńđ`5ß A"“.Á&. €""đčÜďW/áľ>Q$!ńA×a/$ńőP"ç #ňŕ˛űí#ĐĐčžěđЕßÜP*ÎŃpŔŔÔ`"Ąń#1ńŽ#@Ô@°űń îߑ ?Dňß+ń?ŢPđż0Ó5ŕ"?ŔÔ˙ #vĐ ôP4Ŕęńđó&üţŕářŕ0ň °í°°ŕđĐż ąđ˙ ň>đ@€ó #°"Ĺńŕs"Ё0"$ +Ńž 0ѐ/Ÿń!B ßű Đç#"pŔżî3đ˙ÝBĄPđ/ŕÎüţçđîâ€ď ˙/đ Đ ň& ŕĐ#Pü!ŕ7˙ŃŐVđď˘0CÓţĎ"Qŕ ÔÁű!ĐUĐÜŕÁ ŃţĐ/ç ?ŰŕĐaë" îô@żpŕŕ ĎäňŔ$đáîĄéţÝýá!ŽĐ  sŢ71âÓńpđĺü%íňń"A`đŕŻ1߯^ßŃ_ Á-ŕĎÂá`žŕ˙Ÿđĺń௯đÜđĚŕđŔ Đţ㠀 ° #ńBđ60˙A&T ŕŕĐ2 sÝ@##JOŕ%Î>źđ$ÍóŢ Î3cÜŃ Ń_°ŕ:ţ˙ߟńÁ ţŔŕ ˙ ä˝ü°đ˙ €DóS "'/ň2p4 7ŕ.ÁţÁŽĄŇń+a@đŕ ŔŃMń`ÍÝłđî0BŢďÔ˙ÁPďůíÍĐ °ĚŢÜďđ ÁÂŕ€âđđß"Ńcóa#4÷4!3đV1đä <"@Ó76đÂđďűţ°üĎđ-€ňżáđţŠßđđ ÝĐńŻţ ďŔ Á Ŕ˙đ ŕí }ąăÁţáV"2*0'DŕÄ0"ň%@ă&." #a ŕ”â061 đĐ%ŕßđ  ţţŢÎŔßĐńŰü ëĂБďŻŢ°ýŕ"‘á /ŰCĺŕ%/đ'ďý˙ô@đţĄ$Ň˙á÷&"A%P#âáB10 ĐSŔ3>u đ ő'"˙˙ÍŻá20ÎŢżĐüđÝŕ0  ďß°áŔĚĚîŔđňńíZŕâłÉĎÂĐĂŐÂýPŕđ áŕň đáä¤ý BA%á â#P ó ŃDŔđQ2!\ó/`ô$őüOňăŐ˙ŕ1ţ ˙Ý3~ĺđüňÎŁ˙đľâďŕŕŃĎ @  ńě˙ň~ţ°ŢÓĺӀđ ÁNáĽđŕ˙đ08ńôňßTŁĺŃŕ0ŔóÄ ?5ĺă ÷@O ŕ@đű?..ĺý"Ŕ ŔÂŕżŇ1΀ţňžąý˛ €đŕóÝNđţ. ŁŐă´˙ňŃ!ĹŕńŐăđE˛äâ "÷đńâÓĺŇý1ő!pâ×˙÷đŇÔóđ/ísĐňÓđ‚ŕěŐŃâű˙(˙ŕĐŕĐü ˘đÍϐîúđ˙>ýAţâŔ?ąQŻńäđáĐđ>BŢ^< >Ćđŕ|0Ň' $B#Á7đ/3÷đŕ0 ä"ńŔ€˙î€Ńţ Ž ěŔŽ/°ĂĎ Ńţ°- ˙NÂKůŕńđŇ @<2€Ô˙ŃÔ$˙â÷ľŐĂôŕ@îAđ#áôĺń¤˙ĐĐ^°ąđďĎ /Ńíîŕ˙řÝĄáâŕő ŕäą˙ôô ’˙ďď/äŇăÔÔĂâäŇď&ńôöŇÇ? â"óŕ6đb?" ăćâÖ˙MĐ áÂűĐĂżŔűňďżđߒđŔýŐýáĎŕ* €0˙ăňńâđÝň˛Ó?ôćÂŕńđ=Sӂ>ŕăçđÂňĐ@$ň×ńçAăM?p3!_.ćŇäŕ đ!˛ó°Á? ŃţßçďÎ €ŕáŕîţ’áą° ŇÂţĐ*ň€ďŔň˘ńĂ îő“˙Đ0€ć<^Ň đL`@ çOóöňŕôńőóçđâŃ ĂŔѢđ ; °ŇśŃüěŃ?řŃŕßŕ°ä đ-ąĎ˙EŔҲŇđáĐ}Áĺß1ŕô%Ó2°đ˙~Äççń1őN ôő ň×?ŕp×đ@>€óčáŕłŰĐ;?˛łďtĚÎĎŞďÍŰ˙ŕŔß îžŢüŃŢřđ/ŕđ2pň÷!/1ŔďrŐň55&ATp012b'AQ1"ň˝äA0SŻýá0çďJŔŕ:âÎŕ˙ âŕęąŔ°ţJđ˙Ő Ä|Ń  ?đ/˛.#ô Á/pđç?˙ çđ-O0ł"40Eţ%ó@pđ Gđó%ůđý3 0áż?°ţ/ Ý ýě°î˙ŻĐěĎ,ôаő đčÄ/ţđ Ĺ/ äńA0ľ4 ÷P˙ĐqĐ!đPń""Ő !"##5343CB!!50ăĐpĺü-đýэŻî"ěŔÝ˝đÜŮđýţŢß ÝěîÎÝÎÎÎÝÜўîîÜđŸĚţŕń Îď ˘/ŸO°"âQ äA#ďQ×@đ=`Ý%B3ű0ď$˙čţĐď#a. Ň5pńŇ"LÓ$đ/aÁüĺ,°˙Îěüâ1žÁáP@ŢŃŕt!!4D4"PSR352UwwŁ /ŕ°9ćďđ ż đ€đŔĐËŕŕŕÎâĐŽëđŢăÓ­îŇ- îęĄŕěđîáß˙đň0żÓ dÂĐ,Oíň ä ôqdŕN.3ąrď1Ő 3Ađ!CŐţq öŔ0Q°ű!ÓűPŔŕŢ °üđ 0Ďßŕ7ĐMçŰĐa˙ #đěßńKđ T°/A@ÄďÜ0żąD+°"&đŕ#_^ćŇđP0ăô˘Đ ~ŕ"ŇŃđo˙ ܁ đí/˙ÍÁî!ýĐŐ@ŸÓ˙ňnŃÍň0žđ0Ż!Ď ą űÓďçţýß@Ÿňá^ Pą-äŔ; ňâ:ţPą1PĐ&˙đ%1Ď'ŕ s ő?˙"Tá rÓ ŇP  ÁŃ­ěŔ°ÎĐ ŕţďěńýüďđťĐňóÎ˙çđńđ€!ţ3Ł0â0°đđ? .Â#ÜĐ0üýóĄŃLýÖŕ0 ţGĐ eÔóŔ$âóÚßŔЀ˙ŔÚđáčí˙Đ đźîđŻŕŕţí÷äár#'22"?óp%0Ň7Qîq˙Ďńń3ÜÝúяC˙ÂqAá"63QD!$/6áA/îŻďŔá­íĐޝîŔîëîŻďżŢđÜßň ŔÝÓŘňá˙DýŕDĐđçűĐ˙đá4đŕä?Đ%˙ŽŕńîĚţáĐÁóGń0!ôtE3P 5"56!˙$A7ňB/ĎîîžÍďÜĐěżŕŕţÍĎ ÚÎëđđŔßŔđßîłĂ đ3@tţ'&2âínđ_Ż đŕ1ĺ7ěńĎCŕ ńEÖ#P5&q4p"'$P%#ŢŽđíÁCýíéĐďýÝáŔýđßěđ ŕŕńOŻżáó Ŕ€°óM’ó4üńŔ˝ăß(ďę đBR Đ Đ03Č˙1 CĎGR!/6#bCýâAA°ń/°ć˙  íě đ°żÎÝݐüĐžěđýÍÍú°ĎŃ3•éçřďâ?äđ÷ţî2ţćŃ­€ ĐQ ŃŕŢÔPßöńÂňô06B#4R"Q#đ'ň=ĘżńŃńÁў ýü Űţűßďë4€đ đâ#:î ŕŔđň0CCÜ9EŕBđŃĂř˛ Óö đ@ýň "7M# 0ń3p!"2 #!$đđ-S„ßíŮîĐހđŔĐŢÜęěÝŔ˙°đĐěżüđ$âňžĂíó#0ӓó@°á°Ň@O/ţÓ ŽúŔîß5đ%ÓÝ7#ň`0Ţr412$>'R1?óňŃÇ!1"ĺóöň/.(ńżŔđŕěŻţí ŕ đîíťđŕŢ˙ŕÂă€˙ îó€đ C@.ůÎđäP`đ˘ đĐĄ#âľb$Á ňĐ^'R0â ô"04ľ@đńĐߑ 2íđ€ţîĚî/˛ŇíŔf0ÍáżëŃÁ€á`0"öţÂ/ÝáŢ/ńĚôóÁĐĎŕ đ!!ňŔĺ °Ńí.Žđ Ŕ0í ńáu#"$3 &$#Q!00"ň#@Oçň dB%"#?ňB3÷ ÖţĎÄîŽáÍí°ž˙Ď3 6ŕżýäÁďÚŽÝżŔßţ˙úëý ŔđěĎţííŔĎď˙!ĐUňEňO4`ŕĺ1Ďá0řĐóčîÉđđ!% ‚As ˙°3  '/Ń0ń đ/ߏ!đÎ.Đ#üŔB1ń1ţŕA<Ŕ"ĐDŕŻ"ŔÜđű˙ň ăd€4âđBŻýňRó dÍđű'!! óűíP1ÁR 7ŕAěQýířĐţŰ>żîß%1/Ž@Đ/ŇBOóN°đňéŕ0Đ  ßŔŹ  !Ô0ä0űę0ń ĐđĆ`đ#ëáňBń`Ň-Ďşíđ˙ޟîßa×ţ 242DRń"áŘń-üń˘/ŕ 2ý.ńń0çbqóß.QDqń ýPěŔňŰĎîžZŘŕ(˙ňŔâŕŔ{,!˛âĂ.Ň)@!óÁŕď~ŕ=çáđđM ,çŇ)ď ň0ÔBţçă*"ďQŕ!Ńm×üĹţđ€ţ!ë"őáďňpőO’ M óńÝUŔBĐŕţßP˙Kôŕ 0ŕ#ą ěöŔđńôÍý0ąŔÝNŕŕŰ?Đ N×ďĐ ąäß0=FłđîpĐÓŕóą ƒ °ßÇđŇ ń˘.@Ń4çď#ŕđ} ŕ:/đđ âÂâ]= `ňĺâţň<ďß0€ŕ  Á ’ĎđţÂPŇ&Ŕ ożŇđĄ ď /Ŕ@ŕý °8ňŕłŃ.űP˙çđ ňÂýA0˙Ð ĂâĐ÷ ńŔňDţ-răđîDđń đĂĐź`ĐŢ@âĺđŔ @ÂŃÎ^ńáá‘?ţţ2°ŕ . Çŕ ßO@ â˙ô0+^ÔţNď`ď*˙&ŔĐ  ÁňĐ=]đň`Ó.î` `đÄń#Sáőů"?Đ5¸@CÖÇ Ń_ ŃOňo°ŢPĐüá@°ąÁ Ÿ ĂíÔ ňîpĐđł.ĐŕŐđ ßňőíđ Ŕîăä ä^ós˙ó´"ÁAđđq˛ăđׂŕÜ ˙°1Ýńç 'âŕ.tĐ˙â 05>ÓđÔĐôżŐý?żĺÂţ2€áŕ Ŕ`Ńýń˛°ĐŕăÝr âŕäň_ţ×  äđ Ň7ď0ŕ-Ăż×Ţň ň>đ×Móqŕâ€=O7ç!ŕp"ńâńĐ3Đ4@ÂuĐ"`˙ ,˛ŕ? 1ÚĂŃ/) áţá(ţđĐâÔ°đ!ďöáň Ⲡî“>ďěđŐ˙ĆŕÓüpŃăó; DŢđŇ"%îĐNł ‘äĄ>˘ňđ. 1rđ =î'¤/$-˛°ŕ/űßŢĐŻîLýŢ ťđŇŔŇđĐđß ˙.óÎćŕŃű@˘ó.pŕóďŕ?đM÷ąŇOú?ŃóÂĄ ÖŃďä řŔŇQłűü`ßÓ-ô&áňĹ/ ' ^âÇ đ3Î70ŕrä@ŕ˙8ŕá °áßޛÁŕîĐĐŽ,‘á,áŁńÓÁŕ@đpŕĂáá@ŔŕÁ.÷ŕâŕĆď#ň áŔŕŐň,Ó âń ,.@ĐĄÝ`Ŕă´íOP˙đďö^2aÓ"#ŕłrţö€ '˙!ÓŇ`ŃüĎěđđ˙đŕОîůî?ŒďŁđĺĐŔ" _ďöáŕ0ţNŕ˙ŁçíţňâńÓŇnŔ_ňő˘đ’đŕ ÝľđN°Ďćŕí! đńŕp/đ6ńô ?Â?HĐäđß7˙´ňŔ?ä5ĐPóOŕ'5°˙ďPńĺŃ/!‘%ŇÎ0MÄâöô˛ńôđ0ŃAáĄŕĎŕŕM đŕýŇ ĺ ňĐŕ9ňâëň ĐĆ˙€ńŕ°ŕŁŔß"βĂđâđсäôđđ?ô€2"˙‚#Ąđî Łó˘đ/)#î0{#âӑ=ń`ŔĂ҃jýýţ°ípđóŇ3ap B`# °˙ đđÁ°Ý°ŰíÎŔđßđ#í#0ŕň7Cţăđ&ŻĐîţpţđĐΞÎíďđŇ#í¸đđßńĺ%!a"Ň P@1áĐÖP1#óë2‘đ Đ1O$""ń×Đň îáÄ$äěŻýý íđźĐ˙ŕĎß!@5"0áżŔâń-(´<ż žďđ'ńÝż đÄŕ˝ÂŔŔ"űŇăÎHü °Ý°ţ ăô đPT%?-ÔÂôđĺRwáŕ˛Ađ"BS Ü˙ťŇ Áoą.1ŸĐđí] ňěĐżűń ó0¤ "Q0÷˙$O˛CE˙˙`čä ß! ˙' âěĐávřţŕĐrýŕ Đ0í4{ő/Ŕ" Ň$ţěňíă˙ŕňý_ý đŻŕđŰ7ď!0˝1 ÜĐţ Îúţđđw-!PSů ŇOÂr˙đátîđđoô2sŕ# Ňîîđ>A0˙ ţđŻí ˙ýP#óĹđ“đ%ßOőÔÁ1°ď Óp?˛â" @Ŕ`ýßđ7 Đ ŕŕŕOŕ0ÇŕĐ! !1ßRţ´/Ń ŕ Â70á2#3R3443CC%"B$ËOĐŇqnâ@Đđä#ŕđ"ÜÔčŔáçŕ/"˘Ą! ŕđ ŕü˙ áßýáňGÁĐ:ÂĐÓł 0⠀Đ)ýáŕ°ŕíŃ ňŠ"ßĐđ žŕÚĐ/óÓó_° Î0Ü3ń ÁĐ âP ÷Đ4;!ŕb  ÔđAÍď?ŸŃ^ŕP˙PÁó&ŕ-űŐó p×2đ1 ÷âŔ?#~ŕ˙îç ˙đ? ń.Ň\ďó ŕ1ŮŻâđ pâđ@Đ-2 cî&3ßŐá?ÂŔOŔ€Ţ âĂŕ7 0á.˛â˙Ýđá đKďńú0€˙! ńÔ]ŕßÍCđ ß,ĐБ ăń0aăŕłŢňăॠ0!âŕ-˘Ýs˙ó@ą˙ţîÖá!Á ŻÜŇfšĹ  ŕ=&ěĹý=# ‚ţóŻ Äň^˙˙ł.ďPđ>Ŕí3€đ(Ŕ "äď=ä Ŕá"/óÁęí˙¤ ýńóńoÄ˙ą F?çď‘ď@A° áäî/ŕ_ą ŕíŃâřѢ0ŕçŔî_SĐ )üđŕÝNAâ ü6ď@ňňŔ˙äý0Q%ó%Íŕ9ő0âpđáîü"O㐠Ŕóá ŃMôţp˛đđA" ń;ŕ.7@ ňďŻő" ËŻ-Ň9á-äúýßŇ çńÂüŕв#'ő ÂÓä@CŕP_˙áďîQs‚Âę!Ŕă.ô1Ż!ß ó 1Ň@1 ďÖń/Pđ€â/Bň2Ň8ý´đ@B$ĐŠ ŕ×˙ đ_ăŕÁođď’/ŕ5á đŢĐBĂ0b-óŔ îß ŕEń×đĐíŇ”ýPă )"ňäOđ×ŃâăŔ-â+1ýdň" á°#/@çÇ<1ł ~á‘đ $Ńń/ď) L_á]âŕÄCŔÁŔÜ!6đTńÓďŁĐ`A'ďáĂŃ>ôííâ \đâďĂ=*ţÁ° äĎPĐý_ţú1ă˛~ ąîDŇP/ŔÔ´ý.#ĄŁîಠŕ,PÔÁ-đáąĢ,Ňř0ÂÂ?,N˙× `@#âáłÎńĆŢnŇäß* Öńđ]"ÓĂN QÖŕŕ ĆÓĐN!@ŔĂü ď>äń=.śáý î ţP‘ :.ŕ°ěpâń^ŐÁ>@Äţ˙CÇóôđá´đ@äđ"E 0Aă˙!Ľ˙˙Â.Ĺŕć˙ `ńę>ţ="/Ďćâ0â.Ä@˛/15ń&ňđ/•đđý1Ŕ°đ‚ ţĄţđĄ˙°Ń íŕ‚Ôíŕŕß`ń I2°!đő4.pĂöń0ŕőŕİđíKđîâÖŔáŕçŕđđ‘ţp/łâă×Ţň`%đśňăa#ă@óáҀÓôÂÖŕ@€=ĐóçŇjřöFđ/ îŢ݁íŕ đŰžżżĐ˙ß""ԟđâďĎŢq!#!2ó@ńSŕŕîüŃ3€ń"A0qđ4!°D#â$ Ąđá°˙đî€ĐÎ`ďâ÷! ‘ €ßÎ ŰĐߎűŢŔâţV#ĺ!BC!ő!úŕÓÁ'!!ŕűëđňĐĂd0!1AÜ ŽĎđîŢŘßđŕíđFýCR44@ň?Bä'ńâżŔPR@qäáđ'"ÓđŔŕîŔÁë îžýîđĐĺÝŕ'ó3aAäă&rŕ ńŃĚ*çđ/ŕą ˛ďđ˙ç:˙ đżţÁ>ą Ŕí Đ Ŕ.ôŕ0˛a0'!ń=á? $ô€ ŔŕÎń Â0* űŕĐá­˙ŽÜďě  ŕń ˛ $!"2!5á˛ţâőÁ#çŇ1$$-dă. ň-   ˙ПáţęţĐŻáđŕ˙đW!2Ä='ďđă˝ ýÓđĐq?˙đjüţ#tň!Đ  Ńďßč ˙ вŢóÝ~ ÷@33Ôä@ô ŢËŇđ°˙€ŕ/@_qç T ă5ó/,MŔŃ  ŕ î ÔŃđ =0´ńđ/ @ç˙ôßŰđґđá˘2Täđ#@_!Öá /r!ńď č ˙ÁĐđęáĐąđ ĺ˛"1@ äőă02#qÄă3C"ŔĚ Đ)đÂß,>đňää>1ă1="„Đ+?ŐááĂ$‘üâ&đO$$0bŃđőT €ŃŔýŕŔ˙Áüó°đĐpAç"0˘Î>đđÍŔ@Ń%!0ŕă´p2ďđŒ ŕüŔÚŕđ. ‘đŕ3@0#´ú.ň˙ďáč ŔęŕĐ, ő˛ŕOP1őîpđß4ÜÚ óđţĐţIŕóŇř0ŕŕDp#ŕî@Cá>4ƒďŕqňĐĂÎ ;˙P "0'đÉ&#^ç.0Âţm"‚Ű"ą=óĄŔń~Đ0‚- ďOĂ-…˙˙/á/Ä #‚"ý1÷ńóđ-|"Ňóăm"Ł˙ä ˛Ń˛˛#żKńŇĆŕL đĺÁ–ŕâ ňłî ÓínÔńÂ>@?'ňŕN'ŕMŕ/ň!€-߁ĐľĐŕŻď&óĄ "ŃŮёÓďŰ?łđ˙×ţđ4łÁçÂŃ áݢďđ ЀÓÁ:ßäŐß!ňƒ˛ ń^ýÖŐÂŃÖâá0Ňl1çňńB÷pđń_đŕó_πá˙đÖúń íuđóOÚâ!, ×Ăăđ^ăĂŃń.GŇ!O1˛-NŇŻžň’ÂîâĄŔňÁÓŁăđăäć°<1ôđŔŁŐ˛ŕăá/Ăđ pOä`á3ąŃĆ đÔđóĹľńđňíĺ>"GłđóĂĂ#G"đłđßÁ€ňÇááŇňą˙Ĺŕŕ!ţA”ŕUĄâ-oă Ńôâ\ĹÎ.Łŕ<0Ç˙ńpô”Ň/đÇŇ ôÁąŕâőĄ#DňţUÂíá@ÍąâlŕŃ1ź ŕ őŕđâ ¤ŃÄĎôäĐŕçÖÂŕÂ×ńŕ ?Pď04ÁćăăďĎm0đí*/ąŕâ€ďŕđÖŇÝQÓěѰÓÂđÓüçđđąĐđŰľâđŐđńŇđ$jrđӀŔĐďžíąţüěđßBNđĺ2p"ô Аŕ ˙Ň̰âńţd41 S˙áóđ2rPÝýűĚěŕáŕĎÜďá žđ #%đô A"_ňô @ŕîŕÚÝ ó  Tô" ŕ° !D4ŕ8 ϟýŔţţ đ€ýÝżđŃąňA@ńaĐ!d/%"Ѐţď  đÄó÷đ!rđî ŸĐŔţ ţŻÜďďîüŇá `&ňň÷ ţýíăÝP ßąÁĹń #&.@Ô`˙Áîż° đÁÍ Üż2€/đĆ PňĄ1=Â'ßń‚űđÂ÷#P2˙2ŕâ'3ŃséÝŔ>ŢŻ€Üűđ =î őî@Pńý BNŽ'ďáżńă///đÓU>04pÁôđŢą°Kŕ .ŔáÎ.ƒĐ>_Ńň> ;bŔ-ôű?,°ôÝ.=đíp ! # -Çŕ Żőě €! çâß\ =đ÷Á1ě pÄŕ /ĐŔ.˙7Ŕ ű0äŇč0âňĐ.Ď]ÂáÍMîĐÔ°8đŔ?p˘ńđMcüń?đýDß.Â/Łq˝Qŕ5ďŐó˙ňäđ"#3C43R35"B3y°/Â˙B‘?Ď0áă!ńěýÓ'O€đá ńţŰý ŕ/Ą Ă@ŕŔŕ˙ŕp€/đ ĺ ţń ŕTčń˙đMł/ĺ.°ý áđţđÓAŢ bąđ˙.`ĂĐ1ě=˘Â’Nä óÝA,őáĹ ŕQ˙/ţďď0ŕ7ŔűţTĎ đÁM˙Aţ ]ađôÄ#Ńç 4Łđ á& î0vţ/óô÷ 1ó0ŇBß5˙çđ>páĺ #ďä^2ąňLŃ.€//ÂţÁĐmĂţ˙ ?Óޒ,żÜěÂŇĎ đđŢAá€đđë"ŕÎ÷ţ đ á ţ˙Őđ8đ ó˙˙-ü˛ ď0Ôß ?Ýđ ĐŔ!ÔŔp˙üpďń €#@őÜ˙îŽßđđ 0”ŕpń /˛°.!°B2˙ąÂoňŕ ńčÄAT"ĐţřŢň@Q1bĐđęŕ.ńďE˙âđPŕŕ^°đÁ 1% ŕđc˙ í €đA%!+ýÎŕĎÎS3(íÎގđäMÁŕđ -öRĐâ°Úń"7!Ÿá""ąî Żđŕ3c̰#s žŕĎú2đPý°î#ŕ&00""ŕŸ ŕ$0! °ŕ îâ2 ĘŕŢ4 ϟ˙˙!͎˙Ýěńíä­ßpÁ3 ţ° ÷!ţÎCŽďýíÁ%$13$đżî ţđ!B5ŕŘţŔŔ'!ŕ0÷" Á Ŕ.!Rńüí$0ňӍüßĺBB!ĐÜÉţňŕbóŘîĐî/"äÓ@Pä $Ňím0őóa%˛"!ÉîýŻ##!aĐŔíÎÎż!B_îđž ä˘_îáŐ˙% ÝĎć˙ 4đ/Ńđ?Ŕj#Ÿţ đ€^żěßŢäŕ /đO-€áŕšňĐĐO-ŕ1PŐ đ0=áőý@Oó>2 żŃ ýđ71#@ďŕ€îďÄß!ą?ńý­ýÓž1đJŕî1#/#Ópń.Đ~Âň>4#?bňR/łŕŘ## íĚţâŽ#sôá0Ţŕ €á-3€ňR ň#Ý\4˙ĂńN&đ!ĐÇ ŕđ °ďîĐ˙â!@€Ë,Ąđ>đáęňPă0đđrňýO÷ŕ -á0OţŔ !ĄřŕÂâ0Aü˙ áďđňĚŮűđđđň"Řóđ4° A/ő˙ ?'.˙Ď˙ŕ Đýa#=5ňďî1ҰÁ 0őô<ëĐŕÉý # Păł_Pż ÓŃ@P3^‘/̐ !D@ôßöđ.ŢěQŃbŃÚ Ѳр0ŕĹ@?ŕ3Vđ$ @Dď°řđýŕűĐđT##˝ňžţAŕ˛oţÎ+ŸŻŕţ°žýĐđŕjâáqÄŃÔ#<%đôAô ѐŃóýĐăî'.ÂýKäPĺ@âüž ˙íéńßÉ˙đń.ŐÂPň!qôđPäŃ.á°đ˙ĎňŢCŔ.°đOđ@/Đ"ţŸďţ đż˙đţŇűü]%22SaŃôĄ!@â<Ѐ1OäŁŕ s52!°żŔ°°đđ žŕĎĂđđ@B˙?C#36#!" Ňćçß°ěáđP/áĺĐвçŃP@0ŕź üŕŔßďíĐ˙đđŕń " ńŃÁ‚#/íН°Áß˙ Rđ04đ€Î äÎÚŕńŕŕB '!4^ ń0-Őó. ߯Ýâ ŕąáĺ"00SŢÚđ€Đ˙ŔňĎŻßÎ˙ĐŔBR%1D#rAô@!ňďĆń°ďÎńŻ˙ěNđ°ŕ`îMc7ĎŢŢŕÎýŔŸËýäđÂ-ŽďđAq%>!żcÓĎđPĎăВ/čđńţŻJ÷řđqďQ_ްĐAPŔŕţúýý żęą âŕěď>póâpÓ?!1÷0ĐGŕ?Oňňđ@Ąôđ.ţ0 Á! ľ đńžPĐđ˙°ÝýŔŔ ďđĐ­ŕđÖďŕ1ąŢÓ*"ÂđŢ`óQ°âá˙ 3žŕĽţÔ ĐÄ:ýŕčá ˙ ÎÍó=Âç!2/7/1@óâ_4á3îCOĹ ţO?ä=ÂđAÓ . ŕó)óŽď ŇĐ<ű˙P2îP¤0&đ!đ2MqĄŕ×ŢţŰJĐŢőýp"ßFŕN˙ ýđŕđ ňđŐ $AôĺBAă"!˛páqďá’˙^űńÖďPţÂŐŕ,0žßřđîűňŻýóŢßđO'đń;ăň!üđ Đ ŇÄŮý ţń ŰÁ@đ  >‚ë  ˙ýďéđĐßîďîŻ"'đPň0ä PćďôěŕĐ 'đđr ŕŕňă+˙ąüŔŢŢď âÓâÖžűů|#Ń>ţ çÖ//=×4ŔŔ<˘ŕ˙ńňPŔĎ+Ń*ňďëđ¤üđÁŕ°!!ć¤Ŕ1đ._#ţp÷<Ľđđô Ň đ ćâ;ŕŕ‘Ţpţ1ăŢó~çţ0 ňŕ7?ă óľđçţ"˛đńHî Ăß đŇą Ŕ˙ ŻÄĐđŔÓüÝý9ńâĹŕ/óą=nđ@㣠0ß_ăńÔ×đ. ×ŕí~ňđöąŕŕÂôĄâ/⥠@đł Ţo×đŕ â\ăóĹ!?S çp ń@aňáĐM=,ĽýŕîÄ đđą ˙ţđđÁ ąâďĂÎ`Ăŕă  _ăď"ô˙?đ¤˙+0Łŕ0ĐáĐ ĐÄě ˛° Ӑ"Ŕđ,ó˘íLâŁŃ đÂM>ń ńM'ńń "Ä0ó×á!ňOł%Äđ:ÓŔ ?˘ßđ° Đí  ąüŕďŰÁţ áđ”ąđÂĹŇ/ƒĺńöţ#öÄđ _ńőŕńӑ*ţ˙ Ü'¤ţ@đä ×˙^Ŕ< çŇ #ď2ÂA´Ą< ăđňÖŕń˙đĎúáą#Üâá đä/ԁâńŃOłĐĐ]0Óâ÷Ń~ó×ÂÄŕţ@ŕßŔLöá(ńÔŕÁý3*ąđă€1ąđ.ŔPĂN÷˙đ&ăĄńńü@ĐÁďÖţĹáŇ<ăŕŃ 'ůLńäň’â>•đđÓţ<đL;ámŐĐ>ÔrŇąŇ×ĐŔKŕňÄŃ>ĄÂâűPă˘ŇĐ( Ôąý0ŕÔßŔ×Őß/Łđ ÓűAňă°öŕńÁҕđňѰ/đ‘> PŃlâŕű1ľď0îN’Őţ]ňŕm ó˘ŕđ @ňЇâă 3ŕ<<ÁŕŇ(đMćŕăó<ÓŕŇŔôâ’Ó ´đďÔç?ăońđóĂĺđ đńí Ӎ0ű=×ńĺŕ ˙á#đÁŁÁÔ Ŕăçďňoá´đ!ńÁ.ÂS´ýMł MđÁŔđ€¤ ˛OđňńăĆá;˙€ňţ˘Đß ’ţÁ/çŇüNçÓđOä#’äCäă072ô"đ ä˛ŇÝ+ÁаÜŔęáŕě đ˛ßđÖÁŕńĂđ _đóß$łŇ/×ŕ> Őđô×đ.PňÔŕ0Âńŕ ŕ+‘ß°Ŕ€ŕ ä˛>O˘ń >÷Ҥŕâ×đ"ň'0QŐńNň.łď,őĎĐáŽŕŔţŔ˙ € ÁŕţđĐ Ď Ă˛áýÖ â. •đăń&BńNMňŇđ,N˙‚ąą-Ââ˛ńÁóą=÷ŐÖđ0ńń$L_?1&ň"0'!#P$ńł ˝9ŕţúĂý áňŢűďî đ°đĺŢ âü×ŃâđŕŇţŰ0×ďÓ-÷PâÔŕćÓíá/˙  ě €đţôÁţňóĐ˙1młđá.ńűäÓm1˛á!ëpôÔó5r đ?ÁáĐ×ÓíŇ‚ Ă|äí^äĐ= Óę?ă Ő,"ňä°ŕ@đĐ s§đ _áţ@ Çń,ŕ} ÄŐ˙*óă/áň˙î _óÓđă!- ˙ŕńë.çđüńŕ(!đÇ MÂŢpđŕĹđ0ŐĂÓî;.O˘Đ!ţ0ńĎm×áđ=OäýżďŃ"Ď3źS° ˛Ŕ>Ŕ@đžR˙ńĐ/Ă@ďřďPŔđpĐ/ňÔŃ0ĐqĄNđŔó#í0°@°.äOŔ3Îîđě0âŰNňň@ó8ţĆŕ1=ţÔń Qż1ÜQýńřĺ.ĐpĐđžCŇě<GÎ$î Ó í.ç˘1Ě4Á÷ŐÓ>ě?NŔ$Ááĺđ12C3D#Cç¨MKńňđ"]°0á ŇHńî+äŕďß°ÂáÓĐ(`Ńŕóď]Ň!âoÔ(đ0ž?ÎAŇřĐÝ ­ă˙’/Ôô Lä˙?ĺď?ą1ŔÂoĐC ŕ`Ňđ÷đ20?'˙í íďŸţ=€Ađ1`Űđă/Ř˙0ńQ.€ď˙ń(ÓoŕŰđa%!ŕ3=Ň!' 7 âC/ţţüĐ5#"ú#úôŕP5#´ @$Ţ"Aqŕ7ňR˙ţď%ţô5`đďýHŕŕë žď˙ ĎÝ@Žŕţ ŕ  đţŽ˙ ° ţŽń Ü$Óŕţ˙FßîOŮîŔbđîň˙ŽÝďB3î€î5Íď î1"ÝbŽ˙4"P˙$ýA$bďÚŔŮŃE !đŔ0  #˝đ`"Đđaţđí7ńăpţe4B"#sßórQ32 đ˙íąáp" ŕ' ýţżđBAÓr #î0ď+öÝýŔĐDŕ>Đ6ď"#rŕ  ­ďýď%!đ ň,ęň˘0€ đ   㐠Fë" íŻA$7?ü5ż?á° Ŕ.6" üÓ1 OŢÚď>ŕ "" ’óąýĐ.őţ  0'!BÜż2ţÇa0Ňßßčßń ďň34˝ń<íĐžŕóBň"ă °ÎîâĐč˝â_đ%Ęď1đÓDq-ÍďßŰNŽí!˙ ÎŻŰ ôŢßq$ĺ­Űýí2#3 1˙$0óas"ŢŇ+űň Đäa0ďŇ!P˙ Đ/NŕÖ1_ŻđËĐ"502/ŕ ÎŔ#űG ň*Âî 1-˘+ýíëĐď đ!á!R?źăÓ ţýËíŔ!B2pĺ ţđâňGqĐ Ţű˙íł(ďń2/ % ňäÝďďMŕŽ˙,Á ĐpđđŻîŸđ"ţ70đP°ŕ ŕG@˙Á2Ně ęţ!ŕóa°ëďŻđ°ď 2Pâđ KţüŔý !ŻŕBDńB°#˙ăsBđűő  áMýóEí2˙ŕ ţńrŕD!Ń  žŢ1ż%&đ$!ŢU#" EżńňÚ˙ŕŕs0ěë ăHî r ýÓýOńĎ4ţŃBŽţîoí°A3ŕŔr°đ!Đ"`>`ϟ!ýŕ O đ"<îÂ0Žđá sŕŕ?~ţŕä,ÝÂ"`7Ý5! ĐRQ 1ÜÜ"0ËîŢďđ˙Ŕđ1ń/áţ˙ó)ÔÔűă˘/´˙˙ń# Jň/˛ta˙!úđëü ňĐÁ"Ŕ ÓĐBÁ!(˙Ń ńSđů˙óýépđď`4 á%Áŕ$ëŸ Í]Q˘˙/ ŇĐ!Áđ4Ţ âŢ,`Ą?Ą,ń#Q đÁCbĐ$A? ĎBîíOÄĐě ÁË Pđ1ĐîqŕđĄń-đďŕîŽŕ0P˙0ńD bŕň1r@€ń0 ÎâóZďńđţJŇţ .$đŢ-Qńîđß˙ď2 °!Bđîý/ßpđ&Cđá0ŐŕÜň@ęÍýý€Ŕýą2ýĐƒĐ ň$1^ŕĹđÜíđ€ěÁ° á"ьî0iřüqƒţŕpąđßÔôÂ?ąâ ŔÂ_îóŔđđÂŰ˙0ôÁëćđđďóŕ’ňoôŕ Ă0á`đĎRą5ĐčŐý4ćđăŕqďâ'ímň˙M"ƒĐ/ ƒĂţOňą?Ó.Ö 0Âń2‚ Páđńě@"Ŕą@ ĐPđßÓAđ őţĐ˝ňŸń@ÔŔ˛óů˙î&ŕoôüÝ1Ďćü ň‘ ó.b˙ÁŃ@CÎ?€÷ŕýäĺ˙ Ńă(ą đ‘!ĄýüCđO@żßBđü,×đěŕÎp Đ#.‰" Ůíżđ0ŕ6˙đ$ŕă 1íŢ0nÁýŇô ťŢAě˙đń3<ąä÷ţî ţďó6Ţ   ü˙ßđs žâ #ĎËň#ÂżŔSźŇQ-Œ1 ŕŃ"úîS ËÜR ďŇ OéíŔR ŕŕN ďŃuďđ! đ&ţńrżđP ßďĐpÔÎíýŃŁüŸń4úě@ţŻđ ţŻ îS€ţ0 ˙˙%Ýń2ăSŢŔr ŇP!Ž0ÝŕOPýĐpâ/ ŕ&ń Đŕ€ŕżďňĐÓt0üÎ×_˙ ń˙âŕpîŕ2 0áEĎQá#'íÁA >Žđŕáp ýďâüú@Đâé#ď0ŔňÝŃPîńňaĹţŕđQ30ż  °óŢšđ<ॠžđ  @ Ŕ/$đ€ŕň"íţá÷ăö ŕ˙ŔópŃ'ÜţÔ°Ń#ÎC2éŕoß'4ŢÎŕRÎŕÔňÜüŕ%ÝrŕíD?ŔD°Ú@îĐßţ'@ Đ ó@ŽÂ Q˙Ňěrŕđ3OŽđđŕ3ŻĐđ˛!0€˙Żń`Ţá\ óÁţí"´2áŔá&đ°'í!ţ3€ŕ6Üď2ěĚŕsűđĐăSúđ2áQŽPÝâđ$öáLBߐQ!ŔĐŐë˙ ŕô ńđÜŔĺt ţ/đ"Ңď4ń3ŔđăBúĐRzď4 îńPţß3E ÎŇDěýâňPNQďŘÂ"@űĐă ŘŃĐ"ŔçŮ˙% đ.ń3°ó dÎa Ü7ŢîŔĎ7Ďŕ3ěÍ@!0ŘŢźßńä!2Ŕ3#űĎ"M€áŃ'ęŕ°ňđă@ňa_°ÓAŻŢ$2;Ýí ˙ďSÎŔ"$đě’#ě€đîĚáď0ŕB,%âËňÝ Ôđ`Ýżň">žďďâţOu ď# ÎżŇ"CĚŕ !/ž˙a Üŕ% Ѱŕđ!Oî˙ňŃŔ'Ďô"đŽđâđ Ń0íĎD!Źßĺ!€@/° Áa=ŕĎđA,Żń!ďá߲4ž %ŕ 10ńŽQ@ ĐńÉ˙đ0đŔ çŃađ đŇŔMąí.äß ×<ąń@Ľ=á 4ߎ_ŔÁ@ĐńĂÔĺŕ îRëî!nđňí×! ^"˘ţOâ͢đ 1ţ°ŕŕĐ5çćNłßí7ŕN ë ěđ°˙/€ ĐŁ-î 3€0DŇî ĹĐĎ4@ĹĐŕň-˘áý^<öŕŔ0í ‘Ŕ@DŃż oŇü ól á@đ Ń,pĎß$Ŕ =âáQúđđ đ‚ďp Ó0ńÄţ ýţ]ĹňÝ~ňçîŔ.cŕĐŕ+#˛Á#,Î"qâŰů!$˙ýŕň˙Í  ßă~íä˙0Ŕ ŕ?_?žąď#"+ţŕäB= Łą_Âđđ)ŕ  1ŕĎŢPł ÎÁo ŕÂA €@âŕ!ţáPŃëQđ"BĄ˙_đ?ţą*đđ°#`ďĂ#Î=ą!üý 1‘ŕ=ňămń Âî^ ” °đ!0  %ŃŢP/‚đ, ŕßM"ĺŔ=!đâ ALďĎrŇŽ;ß2 Ň"nđíŃPĹ˙ .˙/áđńRě#?˙pßĹ˙/˘Á0áĚ3.×Ń;!ŕô+0ŇëáâC. ÷ ôýĺ'b áňKđ0ńë0Ô°žîsđŢîđÝ ‚Fđ"0Ěň/`ű˙Ŕ0ŇŮěęR đáEBΐ žŰ3 ó "č˙Ţ!ńüţŻýÝ6!ÝŽđ˙0Ţ%Ëż˙Tp*5ŕ! Ŕ ßŔ ŕ^?ńŕ7ý?ň đ ˙  â°0ŢAňÂ]ŕŮÔî~ňáĂžq2Ѳ.Ĺ % đAßqĐ˝Đ@Üß}Đŕż ţq˙ň óĄ/0ŔÍź2í˙€ß˙ Đűŕ2ß  đó Ďđřđń3Ŕîw+0ŕNâaá0ą@!!Ľ!#$$"4#C3CCBB3C>çOÖëŃź˙üÚÍá ŕýí°Ďŕ ňűĐŕ °ŕűŕ€ OĐńłôýż0^ţŔ˙Ý8"ĐĐň- 5Đ  1čŕţÜŇ] Ođ@"ĂőađP %óđ,űń 0?'Ţ1Ýł1%_0ĐÎÎߎ˙@ý€ąťş1p 0˙˛@ÂĂ? đ˛!+đ@ß.ő˛Năŕřöâ ě5˙$˙Ô/#÷,~äđŇ9#ńą˙""óŁŕKä Ŕđú@,˛ ˙űă ŰÖ @đ" ďŔ;Ńďĺü$Ň+Ţîô¤í; Ńď˙đSűîA ĄЀń. ăąĐ;#ÎĐ;â[ŕýNňđ‚ńNÝÝŕ#÷ţëÂŕ]Ң _Đ1đíţá đÍ]1“ń ŕqŁđŇÄ"Nî7Ćţ0Ô˙Ňěp@Áő >óĽđNňđ1€ >ąŕ. ç>1€!ńňŔqáî`Ŕ ż3żňđ Pň˘qŕńPĂÂ/<Ŕ°ý\ńď5Ţ Đ,đá^ĐŃ"ëďďÔËňý ˙˙đ‘!ŕţĆ Ҳď °'ŕ>=ś˛ /ĐńO/Âç/’0oßń# ßpáď1>’đáA âÝRž;@đŕŕ,`-ŢąQ!íýţMBŔŕ@ŕ $ ű/Ón‹@ßáńĐ.ţľÜ"ćŕ-đŇ_KăôÁĐý~0ĂŇ1=ÚđB°/đMŔ`Ü Ó ď@ŕHňă ŕŇ3üý0o/ ß&ţ%=Ąă0l-á¤ń> ÁŔŕňP„ 11ÖÝ˙"úŕ˙ţ10Áą?9ŕ?óĺňá<ç˙ý4ŮĐ Pŕ0ý÷áűp/ŔŕŃ0oŔáAđĺ "Ô ĐčÄ;!âŔ ĺŕĚő*ńî!"ÓůđRÂűńě0ŔŔę!îŕ ŕ°@âđë "€ ăçîЀ0_ŕň?ÖđЀ"?đđđpěŕőĎđî@"ŻP°P˙ŕ@ ĐĐ!ő;đ âýáp đşň ?Ć˙ ž˙! ňEŕŕđ_/Ą+@Óą?ü GĐţP ŕ ţâđń(!üóâ OţŔ'Ną °@ @đáŢr˛=î !#ŕĄ˙pţą4íđ`ăÎO!ýÁ#,Ůä˙ áđ>0űßô2Á+˙ Ő0ĎůôE˝˝ń4Î"4 ŰÂüBŽţ ń ńC-ň$<ň üĺ1ÜĐŽđ °5 Rđ#1 Ţöŕ?Ÿţ!žĎđ.ý?Żžŕ2Ňc0Ďŕ"!ŢÉđS Ýđ"î =€&ý1°ţíP ŔQ273üŕÍ'đ qPĎŕAĐ *ŇŃč"áóqń ŕP´Îý-Áô Ç/ ˙Ň@Ö Œđ" sCđа 1ďŸŇ'3ěî ţ°đŮ Ţ2A žç  $!ďŻđQţĐbĐţĐFPěŕýą@á#ECţ° ý°"@óŔ?áÜ!@ţ°4ď\@đáRŕóóĚţë? ż+ńň0ŕŕ0q ŇňŃĂ?pŃހüĐô đ`@Áđ!ąî# AíóĽđnŕ/ΰ ĐňŃ944!ĐŮ ň,î /ďí4Ží0%đ° @!€đĎ1%<đ%Ăń0âđ] Ń ̏Aáđ& ,Ŕö#OŸÔď áÔßŰ# N ţÎĺâހáđ_!Ěô@ŔîBrě˙ŕŢé˙đ-°Aň4ţ1pĐ3p_á 0˙ëţ#ď  "ў!DâS.r # đŸâŘ1Pá0P6 2€ÝP Ďđń˙ @  ŕBíßDŢńÄ@*áŕ?č°ĎŐD$%âđ°ŮŢ"ţ߀ň-ÜAÚđŽďđQ đţžŕŰÚ˙Żý@Đá0a&í1°!´>ݢ0ÂsýňŘŇ>ôoŕ1Đ! ŃqţńęâA ěáRý,ް"ă@Î!Aďϐ Ý!ťđ +°đüĎ`°đP˝'ŕó â30EÝę3˙sď˙Ž!'12 Ŕ1€25ňýťó.ÝŔń0˝ ŔSäđÝ]ď%ÔPíć/$ öÝ0Ţpô ňNň/ďC˙ŕA#đţŮţđ°Ŕ ŔĘň áîÍží0Pîíţ# Í'đOŔcęď"ÁópŕBďQŕ˙6˙$U'Ÿ˙Í×ţŢ2)ŕ˙Ţr°`Ň  C@ŕíë"‘.$ŕ#€ 2ŕ ˙,"đ˙°ŔÍî˙0îďţ/ !/ŕ7 52Î#pýĂ "ďß Pń/€"0ńá'Ë2!ä˙Ůň˙˝˙ě đÄ P á!pĐA˙B˙2°.üŔßŐŰŔý2t2óáÔ~íňŃIŕđBßďęđŕ°řŕâU ĐrĐNâA$ţđáo˙ń!˙ą@ÁBň~4Đ" ˙Ě@ޏ!Đëüî ëńđ) ˙đ%"Ôřţ 1ĐCÜTހ˙ôâpďŕ đâäĺ!ë° ńă0ݍ°Pđđî˙áđŘí˙"ţÎ#ĺ2äť4°!ĺP3ŕQ0ž EŔŕĎE ĎpŕížđCË"ýň3Žü$ÚŔ˙ţŇÜđőŕžĐďC 42ňœŕ$ýŒ#Đ­" îŸ"ޞŕ0ÓA"ᾟď €ŕ2ż•ăÜ7Qŕđ6đS#Ÿóďó#ŕ˝rаđ Ÿá%1ţďŔíŰc"ßď Ýě˙żţ üţţđâÍf!BÚŃE!Đóřŕ Ď˙ŽÝ7!đ%ńţń&üń ßĂaŢňńâ3Œď #ďä áC ˛#=ŚQ˙! Îî#ŠđÓŔŢ ĐüŻń3á€đđţď Ń Œî0ó×pď "Sŕđ˙oŔĐŇđ#ęáĎáB ˙ đás/îÓcüD$A! ňžě:íŕ QńÜßŇ`Dŕ  ďđAţ6˙˛Ŕá ŕB ë ń Ŕ5ß%ďár7ţĎžŕ°đőúţńáŢBĎý°"K$ţĐ˙ Űŕ4đđ%"d˙ßć# đąDB  á"0ăR& ýÔP"źĐ1ŕ âŕýĐÂAÜđ OĂ!Ü6˙ęŕ%đ ąR1Ń7Đ1@Đ˝Ó#˝żđá÷3 áQđ ŮńěÁřďţíŔďýď°đđ!Žď#ÓĐŘĎŕ0ňßĎoôďĂđŔ7-Ą  Bí˘ńP°˙bĎŕ &ď!&ďď !?îŐ°âŕĐ=M]ŔÁ °őŕOŔÔ˙ŕ" íđpđđňňĐPţŃ÷ßň^.Ľđą˛áđÁ˙3R˝đâÂĐŕ^Á.ŕ/ŕęÂ2 á Đ ô:áôýő1 őŔ˙ĐaÔąî0ęň<ŕ$ŢŢvđńţä#˙ŔPě"!ţđ ×ĐÔ őP°Ň° =˘ĂÓ3ž0ý&?°=çâMÝŇňÁÄâŔ˙°đ‘ô ° Ńdď°đSĎŇĐ0sß°ŕďą ^Ąđ ÔđđâĆţĺâĂőýQäPĐ Eđą ń Żô0Ĺ˙Ňâ×Ń 4  AßóBół2 °ŕŕßĐPŻđ˙ĄÂđ ŕđ÷ńďŔ/ ĐâĚ-ÖđŕĎ.(˙ó’đąŕĺň6°đáőŔňâ/Í6ŕëAđńď€ ŕ ő>ňđď˙çĐ Á!ĐBŃ$đ˙‚ň"éŕ=*×c˙í°ßŕ B@ęÍ˙íŕ3Œ˙°đĎËîžýÉđŕýüĐŔďąáîÖްđđ Ď$R"P#%#A Ýŕ%ŕA7Îŕ%PďÎđA@ ý'5ŕ˙01ŇÓ`ž3.Í ňMýÂÍŽĐŕÜţŸî ýߞÎŕż žŕďέŕ" íĐĐáÚđŻĎŔFR!$đ01â’p˙íp1đđ+Îţ#ü˙°ďýîŐîż#űńđrî3AŹß#@ě°R!ě%ďě4Î ŸŮ4Ž#Ŕ đ2ůĐâPţÜęďňŃď ŃÝ4 }2÷1@a!ĐÎDä12'` =ŕŢ 1 ˙ â Pą.ňpĐ íßŔń+ăŕ˛o1â0Aű  ëń˙ţĎÝŮđ˙ ĐĎŢ đ€ŕ ŢR Ż$Üóqţ2`ń D03Á " Sń3O"`° ďÎsňę ß đ4?bíTňßsvq ˙q-× ŔpÁđ3Îâë"đĄ,ŕBŮĺžđľďđŕđĐ˙ŔďŢíÝÇđńo’đţ^Á/ß° ţó"0Żň- '˙đý.ĺđBëđí>?ńŒ Öýěđţnô OÔĐýP%Ą0˙°#^Ô°@Ěďý>Š<ŕôĐď=žűąď$ń'ý!˛ ˙Ń,ýf˙ď0Ŕ]M1ŕ .nŃ@őđÔ#.óĐŔO1ź6Óßo đ’â1 Ń ‘=âďŇ !ńáÓ/ôʏ" ˙çĐÜý1 ąŕ Đ0 ĂďÝ]ŕ/ďđýíÎÝX$Ń/ípÂýţsý˛ŕ!Ů" ŕ Ô/ą>Ň,rĐëĐđđďA˙ą $Ŕá!ţÄ"ďńĐ/uđţ %ßÁpđĐ2  6ŕ ×đoŇő.ě'đÓţOŇ ţ @/ .áÄë#đđ//óÓӈ ŕ˙ 0Ń`ď° PňÓŕ áj&4ŽđĐ Ëíî ňÁ1C2aęŢóţž0áâpĂ Žđ1@đ1'Žđ0pţđ#ÝEîëŃnžâR#ď°10 ‘ Ôđż/( ˙óa1đßů˙ ń/7qŕ!ßţô%Ű  đ@q!Ăŕ(˙€á˙Ę˙Îď$R˙ţţaôŢíĐí÷`ü!Ďđß2 ŢŽň!R$2°7îđ ĐĂ5ď°!"Rŕŕ-úżđ ö?óĺa á?ŁP#&â1PŘüä-ĄÜ-Ą#* Pŕ îď0÷0˙ ŻÍíŰôRB Í 7AëĐ>ӎňóŔqţ ďđÔ^ô Ď"OÁŔëŇr1oŕţžŢă@í*đŻ$!ůŕń Ň5ę?ßŔŕ1@ŕ˙Áď“%/#°/ó Ŕ ÷ţđ Ŕ Ŕ!$ŢîB/Áď ‹" Đ S3đĚ ˘7.Î ďđ~ŇOÝ&Úă!A đß  ŕ5 Ł1!ďŃŕP! ópňń,˙ŕsáU Ř‹ň LA°îC ˛ ípĐá ôKţâö _°"ţú Đ^/ŽĐ@đđâçO˙âü!ăôŢŰABŇÓ_/@Ďăó$!\đ-ňëô˙ŕëčä čŃ  Ňp˙O ó.ßb!ďa=ďđÓQ€5ţŔ! ĎęđđĐ ŕńąěóčđň°đĎą#Ţŕ'  ňđ>5ŐF' ŕç"ëýüÝ?0“ń`ńŃE5Ţ÷˰˙˙°Ţ Ţó÷!ĺ2$ đěĎŻţńŕćŕŻńőăbâĎĐaö,ŕöńŮĐíŮ ÝŻßđ0ŕ˙rŕ6ĐĐčđ#ŕ#ńŔÝŇwýŔŕŃTîëűŕŕ˙Îń’ă÷Ń$ţţËŔá ÁAáăĹěá66@áńŕĐ"đ˛ #ąű&ăŢ CFđŕ' đĐşÝÎďńţ0 3ذóŕďţ˛ÔáŔS3˙đĐđüáŃâăŔŔŽ5Q14!C˜ޏ°đŢŇ0q0ýń> u%ŕ5A#ă"#750"&$&"22DAâÄp4ţ˝ďÁŽ°ß üü ńŢ˙Ţŕđ˝ß°îăĘđQ żĐ ˝Ü˙îހďÝŻńÝęŕńŽîßářěđŔëíŻđđÍŢíë˙ěďÝü!ܟěĐôîżÁŕît#%25!Ra5!Q#%2c#$1 ËüßÁŕ îÎŕ üěýŻŕ˙żŘ˙ŕđńâŃő$#6#65#$  ĐŻŕ ÜżđAňîŢú đĄŔ'ŕB#rô#QábA=áRń"bŕě'á3S'ň?ń$#ŕčđôę äßäŕ;óčĐ/ä "˛Đ?ôşý äďĄ/$îóGý @ đß+˝@ÁŽ@˙ď0đŃ đP0Áó'.Á12žţ2˙Î,ŕ1çÎ0AăďÄO đ1“ňÔŃŕłÁ.ô ^ÓŃpŃK!âŃpĐ ! ćđń2@!Ÿń>Ę 0äôípŞđŃ@ ‘Űŕ/?đ߁đ 0 ÜţĐî_Nőđ ń0˙°1ŢAđŕ;Ňw48ň óáSŕŢPÜÜę ó ŕ ŕ ň&Đq$ÔŕđĎ@ăä@JŤň ĐGŕ4őěţż Ä ţóŰŻ0ęô€ Ѱ€/ĐŔňŔ 1.çň@%#đâô0!÷R  ąPĐáœďę˛á@ýAÔ°`Ăđ..đá!0pâđ=ύÁđ `óĂ!ŕ#P2ŔćĐ(ńü0íĂÖ > ŕůŕŽ/äÝűđ ó‚ ˙21ŕł!Ň S/eđö"@Qń „ĐšÎŕá îî@@Á7Ńŕ@!/÷ Őý& ŕ&!˙1>ŕ°Ŕý1˙Ďý P1Ŕ/% ŔţÁř°ńí° đPĐďđ3ĉ˙ŕ˙ďđŕ"*˙ŐD#ňî7p˙3Q""7 4ŻđüźŃí ˙ß żÎĐüÚđ2'CčĺŻĺÂłÔďrţ$ !ţB÷őń4Ńn×áÁ˙nđÓäąűđĐ äĄ áłń ĐäÓ ÔÂĂđ Ŕ ×Ň˙äĐíŕÔ ŽÔăď °Ĺ çń.Ő ~oá%Đ˙ çŕĐ ĎÄá-Íâ˙ŔĽŕҰ?ƒ ĄA%3ĐBq$ăňrŃ.ŕ"ݏH˙ńńŇíý â ,ŃďĂÖÁďá$â’ăŕń˘Óüƒ˛âńáŔOÍď!ôÝ(2˛ÖňŔŃ!9ňď =P=Aä´ ˛ ?çţđâîđ đ1ß8"çŃ>ň- ÷2ôńňđ1€˘ ° ąţţâνý%íţĐ ěŕ,ŇĐĄ ŕŰ1Ňý~˙ôđ@đ0ô@ĺŕ˙ ňođĎđ=đĹâ/íâđęôń×Ńđ@ŁĐPň°ŕ/'Đ ŕͰ°Áđă>&äÁ _Ő đ@1L#ôߓŢ˙çŕ ü°Âďß ĄńđÓď×ëň Ţđáď wđţP#@$"€Áŕ›`á?˙Žü íŕ€ńńĄ âĺăóŔpđôPó’Ôđ-5łĂÔĐ]=!Ňó% 0l0äÖ.ň/őâ.ćĐ=N“Ŕ Ŕ€<đŕóŃý ąŕß QŔđďÎ2ĐŇLńôŐáó˙QäÔ0÷ ÷<Đ ł°ăđπŃß đ°‚â/îĺ0=@ŕ0†đ=1-C÷Â-đâ# #°ŃäßPŐâăТM Ňđŕâ“ŕ˙ü^/ ýÇŕ  ăţ°ý ŃąÂ˙ âÓďłđŢă3„ # ŕ%ôóÔBO_Ćŕ˙ň;Mă‚˙˙Ďć˘đ==Â+"ćŕ01đóô@`ôđ/ŕ~OńôńâĐň;+ śđá ŕő‚ŕ đđí ĂţŔkâĺŇţôß0äÁŕňŔ.ýŕÚ ÖŃďĺÁ?ĺŇä-@ o"ôô×ńP ľŇ?ôż ÔţĐ î ľá 0Pă´đ2PâÔ/%.3˙B÷] çŃNAđ€ŃŔ€îŕŇÂęáěóľŔ Ó×ďŃjëč% Q3a"ŕŘ˙ŕţýńňŔăříţ&BA4đ1C˙@3ç˙ď őń˙žüĐżÜđÓĄ đ ? Ĺóq PôSApD.2܊ݯŢţŰţîÜîÍíÝ˝Íúő &"Q""%"T4˙ ˙ýĎĐđđŽŕ Íăä˙@rAŃ"Pň@ż0ä%óŔGq!#˙Žý°ďţ1űđ˙8ď°Ŕ R6"0ő5 "'ňę0ŢáâxďĎëýąßě˙˙Űŕŕ;Ý "#&!`R!'á_ßMóáŔ`.°ňŕí!ÖŘţĐýţ żá7#áq>đ"°˛Ň çđ/ đč%ŕU°ţ ňLđŕń#MŽńŕ á+ ˙đ/1#â Ŕpătđŕâ˙ţőţ.5 ô˝Ý °Ąţô ńQ vń#÷ó`0  ŕ@  ŕđŰâ˙Аń ŕŕđ €ěýŕŻĐ ąń˝=$ŕ#n"ňp0Rď!#%J€2ţ  Árá3=Ýö ôo€ ŔAÚ# @ŕ@"Ó ý ˙߲Ý ďĘŢĐď Ŕä/ ­$éŢQýŸŕ$ đţ° ˙ŕ~â°Nŕ$ ŔEOžCÍ  °ÓBrýđ% ÷!DĐB4đR $ ĐR,.‘4Ŕôďđčíăüűď˙ŰíüžŢńđđ0͍ÎôPžńB0ŕß Đßq#˙°3 Ń#,Ÿń2đ˙B °Dýđ6!ýń30íô6!ŕ ňUě%Ň$ńRAŃĺë1°Ű>€Ý"ëÎŘ˙ŕ1řďŕÎÝëńý­ĐíŘĐżĐP đĐ0ĎĐŢđޒ nđńţ Päĺđ^2ą1>Ôđ`ŕ0& ńbż3đ2 łę!ŕ3p2ňCpđâňaö €#"  Ŕđ.ĂďÎęńďŔ0ßíâp@ŁNöđ.Â0Bäoáâş,ňâŔ;!ŕQă`@ 2ĺó?ŕŃTCQü(ŃĄ)ńđđ.4ĐĂ#p.Ą ?ąŔ>ŃŔ 2#  Ű €ĚÂżîё ĺ 0ç!@=˙óý˘ž×"ţ`óŃ( ôÍ;Áţ-î@ó0@!ć!Bô?2ĺíÁ3s2@ ŕ(ŕ° ˙ đî>óá 1# áţ Аí-×a@%đőž<Đß.ę>˛ŕ1ó q#3 tă==ŸňŻ ŕĐO¤ $ünҀü/ąŕ Đ.$őA3AđŢŔ(îď×`đ(ňŽ ŃŔ ßÁţđ? ô3P%.×ţ?˘ý 6a@5.0ÂŘÂĐ =ăÝ!€/0ő23@ @Ţ>ŽÖýNá0b 2ä.`/đŇ € đňţÂNđnŃ#đňOЎݏŔ Ńđ`đPÓ/ €Ó° Đ  ŕÜĎîŕ×đá OńâP ×î˙ üą-đA×#Ô.@ŐňĄ.á ôĎ+˙;#ăäp0'5"!"óq@2 ز°,áüńŸđ˙î ň€ţŕĐ+ďÁĎÍ }Ăß ą#Â-ď łĎ-ááý‘ .áçđđCä"O_‘Â?!$a0a0aÂ*1ňŇ_á,Ň%ä_ !÷! Q#ăńŃä€ţŔ/˛+ŕďŕ‹+Áŕ /ĎáĎáąNôNB$kóŕŕ ŕô"pŁ !ĺ˙ß đŇübóp1a$02ÁQó/3@D$0@ăƒŢ^ňĂ đÜ+ďđßüňĐ !Đď’č˙éĐţß:đýÂőŕ€ đ˛˙-ŕüĎđďÓ=> ŕ 3ĺ0^ńÁÉŃŇďAŇ PâŔI âŕPá /á"2n&!#!@.đĆđ ˙˙2Á0×~€ ŕĐĐŕéßđŕ˙Ó İ=â>Ą€-˘íć ÔýNđ_őń"/`á‚í^ŇŃ ŕđő/3p#!2 âO'ň"3P5!&B" !)Âóîňđ2ÂŃ]Ä 0〠Ó8ń‘˙ăĎŕÂ=ĂÎČ9ŕŕŕ ĐáîĹ/ŕĂýođĐ.ý?°Ă P@(˛=Ţ€ ó>AćO"P%ŕnŃn"`ńđӀÁîđÍ ŕ˙ Ńą _â>@ôň 2ąó‘Ň^Q@ó.ząđţô°đ$/25p ŕpôđ!.@×#a2č=çŕ ?Ď.˘ĐÂ,âđL@ŕŔąĐß<łüâ BÖ0ł€ ?Ăßŕ á/÷ A@3@˙đ>ôŰB˛O6!"Cň/Hó ÔŢŔ,á $â!p1#0Ońţ 0Łôaó_Ă­8Đŕ >Ŕ đí˙á‘=çđ1>ëçđNđáO3%%_‚ĐKńŕňŔ1Ň đ qţÔN 2íś_ă€.B02ä#„0ĆÝŔ /ňÎ Đ˙˙ÄŃCă pŕ oőđ1$ Qbä Â) ŃáŕĎ âŇ äýpň0â//rĂđ=q ő43î ŕţńâŕ úŇóëďŢ ŕ ŽýÎŕ°@ݧ$đ/đP.%đĂěOŕ 0ă÷đż˙ŢďހÎđđ ŕ˝1?ްŕžďî€íŕ°˙ýĐđPł Ă2pÔńĺđĐŔᏱđđđţ “ - ýŕߐâţSáS&@ń€ńŕă°˘<đăD@çý!ăŕ˙ ŕńŃ8@ €Ëńŕü 3÷>ĐĐőăîţ€Ń˙ŕĎÝďĐÁßđA=q"0` #ô/Ń ÓáŁAôA?ÓÇŇđЁń#Đ2s óĎ#ä˙Đŕ âîÜń ˙Hěáă°ĐăѐĎđ2á Cp!ňÂŕÝž Ýě Ŕí߀îţţţŔđŕń/cÇü ĹňôŇ1ç1j Ăń†ďĐ÷ĂĐă`óńÁňĺń÷˙Á  ˙Éáŕĺâ "ńˇ ţă đţŕŘÓBźđđ᳢ŕďu2Ö"ń0×âą0=ŸĂďâ0p"ň€ä"R×đ áÓű °đ đëOÁ$ńÔ°âŕ<Í´˛ńŢ ŐâđÇđŃđó îáßţîđ Á×ó$"03ĺńÎÜŕź ‚ócńńń2°äąńŰ Â˙ž_BćĂôđŕţí­ňń _" đţŕţ°ţíŕĐ03×Pĺó2>Đ ‚ăÁôń#ŁĐ7óŃ47ÂîßëáŃń~â" Đ í ł ĐЏŕâPađä.0€°îŕĐӀńąđ2ńŕ€ţá đ Ańó3/‚ôß ŕĐË`őňđ1BäôóŕӁâ ďňĂĂĐ ŔÓÓǐńţĐÝŔŔĄ°ŕđ˛ăńF" âóÖâ ęđ đĐ!BóýŔß ŇŔĐď"ńó"ĺA*rЂŕţ âŕ€Ńóý=őĐŔВ€ŢĐ ÖŢ&ań37ňđâ ţňąţĐÍ-@Ű. °áâ °đăń0Ă×ňň .-5ćńŃńńđąŃ#ÔM0€ĐÁĐŕ Ňí Vâđŕó“đâ˘>ŃŔ’"ŕ‚đ ôÓТłŃܐŔüŕ°ŕą2#4@A BŇ#Ŕ° 0̑ŕđŕ˛ć10q˙đŇÓ ° 0Űě âąń3â“ŢŕŔá‚ń343F"/ ĐÁŔ +îú˙đńđ.ĹÓÔńĺ/ŐÓ0ÓŔĽ×ÂüĐôáńáđąńóÂĺőĂđłŃńŕŰ ŕ‘ЀŃđŕŔĐ5ŕÂĄ@0_ăĂÔńŕ ŕŔ °ÍЀĐÁĐ .qp00ŁđńN€ŃŢâSN_  áÓĚ0Ăӎáňď5PŇł/@âĺÓÄđ?@ @܁ń/ó“/Ô ŸĐ˙ŃѹҐ˙áâĐ×ÔÓaň@c7ńňĂÁŃÁňĄ!ĐĆó0‘óё˙3u5$###CRA!âÍĘ îżžďÝËÜěÜÍÎííÝĚÝŢÍÎŕÝ ĐD71îŽĚŰÝÍÝÎÜÜŢď&$4445#4C434#"ţŰÜĚÜÎÝÍîüĚ­˝ÜÍÍÍÍÍÜÝÍÍÍÜÝÜÝÍÝÍÝÍÜÝÍÜÝÍÝÍÍÍÜÝÝŢŢŕ&5CD44444333 v %20P6!25@ A"E5@4P#"#q1&@@P=pÁ0ŕłáÜ/Đ ĐŔú.îĄď Ďí/‘ŕŕ˙+!áä nB@Qő2ĺ._&Ń 0#böp!6â/1_#ć?ÖCŃđ|äđ#Já PĐ} öá@2-Ųţ ż ÁđŔŔ Đý ŔÍ ü ‚ď /ĐÝJ‚ âŕOQä‚; ĐŐđ+PĺŇL0ň"ł2M.$ÂćĂ_ď^?ăîPâđ*/ôŃNâŕ‘Hăŕá  "€ň Ď?ďđđą°îî˘î Âđ-Őýđ `ŕ3€#Đ"1Sçľ Ű?`á<Ćâ,/ńőŕ*!ŕŕMţ>‚ú@Ń0ÓŃ-;ö˙đđď_Ŕ! OőĐîPóî0¤>đ^˘đKđ ŐÖ đâŕ.9" ŕ.ŕEž`Ă žPěNďâ`âçî K$ß_ ŕDđŕß ďóőţ 7ŃîÝF-çđÝďq0đń0˙ŕPňęíç đĐQđąpĐßű FďÎ0CŔ@÷Ń. ‘ŕO_â˙ńţúŐ.@ŔŔÝOĐý$ŽÔ;ŇŃó~Ŕ Ŕŕ~OäŃ#ď"}ţFâ$đ˙Q+€. Ÿ$ĎBŕń@ 6‘ňAýÝ7ĎQÔď! ˘ńńń ňˆ‘+ă žě˝őüí2ŕŽ@î ?Đđńńńňâ?ßuĐŃ.gAGţţ0đ˙'ýô<ŃoÁ/đŔ" cëĐ%ţEü ň a!Ă_ĺA Aă!üý7ŕŃŔ-€Óě Ű!Đ1Ž•řóĄđ^ďĐ-Ę4Ŕ'˙ -ŔÂ@`ĎŔ!$˙ 5Ţćb˙ŇĐ! páŕ  20 ˙äý:ń@˙îá6_ä˙Ď1 Î2ÍňŒ˙<˙ ß˘ëţ˛_˙ńÎMÍ‘ ň˙ž ď đ ő#¤.ţ OĐ Ď`ŕв" đNA€ ŕóPŕ1ó(#@Ň˙DđýÔÔé Ą Ě˙° ˘ ĎTá/Á đr!ňďDa ä.Ď'Đ2ÝŕÎ"ŽOî&ŔŕâP-"ýpđđ!nŕ÷1ô Ŕ/˙ţ ňżŸ ßԐî -3áÓ'đ°nđăÝţ3^î ç! ŕĐ`-ŃúáżNŸĐ$ ŕ °ôAüý&"Á° Đr#€ !!ńž#° ż'-Ŕ0-2ó‚$/˙Îî ôŔ:`âë $ă˙Ž//ď"ÜÍPĐŕ1pńţ@BňD˛ óNÝ!'1ŢŢFűílŇ ě>@ď€ü3€€ÓÚD"Ţ 75đűcŕţŇ!CĹć= PĎŇçüţđ0đý đ.„ 1ţą *ńíţ.rńŐ˙oţâCđŻŕ1!ĎŃ33Ú&đó˙!% m ÖcđÚď<ôőÝ^#Á°@ŕ ń2Ú<Ŕ@đQđ4âß Ţ-ПÁ!oÚőđüA/°Ńď@!â×/ď0A2AQßÄ> !3˙űŃ'íqóŇÝÎpѰđŕPßÝ !2 ţđ/0đá.Ž0ě_ÎĎ0@ŔŔ?oúňäđ -ý݀ţě1 Ő˙pOŐ‘  Ŕó Ýq˙aЂ+ěŕŔ@ ţ0!°@&^˙ç˙đUň â,]ôăéýă źÝÎ1ýüÚŕ! đ@ŕ€ /żAá 8ĂÝŐď`îŐ íâ÷N đ,Ý'QŔń˙ BđăóúpĐ`đ°#Ü @˙ďÁ˙0<€ńNŢń;ň/űňđë•ÁŇÂÝ˙Ďb  ëŔĐ@0 í˙rŕŃpńq!ÂŕQâC ŔFďCĐŢô°ę00 °"üü&˙Ďđ"? úđŕü.0Đƒô  "°ŕ#3€ đĐčÍî@°°#Ű˙`1ő! 3%ĐňDÍ!ňÜđ& ÁOހ  áö ţU7˙ďaŃŃ4Ií÷đýÁěpî°ě˙ă! ßÓ @ŕä7sĎńRđÔ$?ýÓp 5ý˙/đ˙ @đżďţ^ Ő ŕS.Ń1/Çđ P°/îpâ!ď éDĎ Đ˙PÜŔ ˝ŕŕű!Ęááâsé=ď‘ ĺáÖ~á!ä ó?ŕó˙đŃ>P-üôá P-.ŢPĺ Ň  0ޢqţĐĘ $ŕŢ˙ Đ ńň6đý[ÄŕpŔÂü'ŔĎ2řâá/8˙ҐK˙Ń7Ń@2 ! P°őPđđ€ÁgUűó˙ý°.p˙ĐÁ 0Ńŕçpâńđ "€/áĂţ>˙đý#-ϲŻ!őüÝ@˙ßĂđ/$ďNOoÂ#%ńńpŇçŸđ :đđ#ŕŐţü ýě%ăáĎ@Q1ňÖ #'ß 1`ďÓŔ>#ýđëĐŰŕß;üě 26đÄO&˙RĐđpâđ.!ý ‚ţPíĐ °Ú ŕúţŇ><çŕpßÓC/ ňó$mÁýĚ.sĐÝď Ł@ĎĂ Ű?Nđîń !+űŐAß#ó@"P˙ !řŇňŕ!Ŕ2ânó6íýâ#ô Éň ßŕ1 ßŐ.˘4óĄß?Ž/ą÷-2Oâ0áä!MďńđQŒđĐĐ0Ďőü ő' ŔĐ˙~ŕž2!#đ63O˙ďAŕđÖű<ăďńMËď/ë˙î đđ Ä˙Mńó3Ă1?1tÄ@ŕ2~ô űď Ďˆĺîęŕăť ţÚńŕţŻńpŕ Đ6Qá$@"7#"D3#0FRŢ 5ŔÍýNŻŢŕŕŢËďÎ÷˙đŃ Ąâ0 ú2ŕÓSP"A%÷ě˙‘ŔţŰ ŕĐŕÝÁü  îуРLPń#TC0q$r0ăú@Đó!Ç;óăň˙ß,ÝţŽ €ŕ˙ ż ĐŕÝ45,Ý7ýAÝëáĂ ŕňđúŕŕOíňđŔ°Ѐ ý°˙Ŕůŕ ŕâÔ@śPŕď4 /çĂţm˙ "1P 4ň/ĺŕ‚! /Ó?ĎÁ"­Đďţ ÚýŻđ  áđQß ń ˙âÁ>Ţ ă1Ësďü Бî /€˙üđń/í#CąR $#4%@%B#"p#"ňb.-×,Ń üđáűü˙°ŕě˙ĎŔß qáý#^π2á pÓć_ŕą-ű⎠ܰސ rŕa$P0S#71%B5đ0â  * "⁠Ţ1ĚăB*˙ó^Ôě@ŔÂQýŕł=b0ăQ"€ á€ý ÂÓűíú3 ŃÄ1D P?Ó&$ňŕkqôA R#˙ä`Ţ ěÓÍ˙"˝Ŕ/ďąNŽđAŕŔ0Ď/îÂÓËRń á >€ŕ ţěł2č/APŃ O5ß˝`á?BOđPÁđ Бţ$ Ŕ@ 0EüácáŮż/ßä,~#˛nńÁá8ŕŢ ďĐžĐP1Öď2R #2đĚ7ňĄ>ŕ-'đ@B@íÁrĎôú đ°ń.ëńđó3=´ô a2!ć 5ţ-î˙Eó°î!6Ń"nđ‘ńý€ţ.üŃÔÍŕ/Î@€â˙"p3÷ę?3ÂA<GńAĎĐ~ĐŃ=Ř Â/pÁ!÷đ`Ną#`ńBaîPţĐí°ÓÍÜoŇÁýŇámíâđđÍîA5ďđřÂađđ0ŕSŰ ď°PŐ đ Ď#ŻĹŘŮ8đ>ňö3 QÁQ÷đ ‘3áđ9OŕPŃp˙đĐ Ž@˙Â˙éÎ@ ń4Űŕ2í Ţ0čúŃPą ňđ>@ţĐ-6ż ďó˝2đ˙ 2Č˙ô 1Î0Ëŕ%Ň0:Őđ@ą/\đńü@˙á]˛4Ţýqđďő ă^˙ěĐ4đ$ .‘/7€ đí`€=ŕĄăÝđoď˛-AĂŕ-đ$Ŕp˛0-ŇqĎ0Ŕ& óń2°@ 1Ó˘> ĺĐ#ě#Ďoá!?˘+˙3€ đŇ.ţKĐ ŔOţ>Áę0Ňě^öáŕ-,˛ôńţmŕő"ąNĐO!×Á^ä áH!ŇńLŕ;ŕÓí~óĐ'ţ @őŔ@ßBđĐ0zŇN÷Ń(đńđ:OđňÁ.Ĺ ĐŐŔ? ó  ńű1Đçî@ŕă:4’˙^đĐ<ěâňđý`äáń8 ôÁâm áÖ˙<Lňó Ŕ^Ŕ MđCň+ â-Ŕ> 'đŕ Ę D#ěA óî@´đěPń˛NŇ×ď/ú@˙ÄĐ/Jđî`ŕŃŃnđmćâíPŕ=Ó~ĺŕ 9Ő/Ŕ!+ú@˙ńŁ: ăĐŔ\ đóN '˙ŕPý÷ňű>óŃ>ĐÂNđ óę3üŕ`ţć @îö ň @ý3€+-Á/-’ń˙mąôü_Đ ôŕ×í} Âď# MÔ˙LĐđLóĐ~ńÁ> @Ćŕ~Ŕ.MM ŐâđO 0 ň€.>ĺA‚âţN-0Đą0ŕ¤ŇÄ/đń´ 2âÁ/‚Ňრ=0Đç˙đ ň Ŕ,őŕţ>ţ-ń€ @đŔnňďMnđŕKôâ Ň<'ŇĐp 0Ŕý'Ŕ0˙Đ˙N`Ą  ń8Mľ@ăҡýOóŇKđÓż@ Đ+ Ă ŕpŇ!ę0ń4°/+ńîß_í-Ň>ą(óŢřńüäo˙Ä!?ŃÓŰ%0 ŕ0âaŕ2đ A "ŃÄĐ0ńČ1ńŘ €UJż/ţ ěďąűő 'ßŃpÓ9ô/°€ń<Đíđç  ŕ đŔ?ýFĎđ?ňŃţA Đńâ8% °0 4°ü ň?  đ`ŕ7ĐB=ó˙6 ń?Đăí` ôÂđÎ@áîěŕNœđ.Żřňŕ-íîĐO3ŕqAĂp ă @.-%˛ě0÷pđŕp˙üŇÔôţą""´NŇ0&ă@0áDţNŃ0Aý 7ä @"ŕěÁ ŒŔĐ ŇîÝťţŔŃ>đîń0Ô^ŕ7ŇP/ă 6@ńď%ôďę°-ŃŢÝnĐúáż=Đđ Á\ń/ä Dŕôţ!€ +â óĐĐ˝Óް îŘđĄđŕŕ ćđ1 &ń"P!öOó1 á@$ Oóé.ŐýO,PäâŢ Ľ-Đ@  Ń Ă"Năâáoăßńń0Ü÷*ŕ˛ď+ŕŕ ŔÝđŽíđážŕ Ŕë˛ţĐ+ŕá@˙ÓTĂ€Ŕž.v _RĐ!-#O"ŐŔ"î6 ňđđ9#ý'ó@ŇG!.$2ç>ńPŃb Á@ńúäî˙€đ:Đ˙üß°ŰüŔî˙˙ÎßËď˙đĐ" wđ0Á4đ!'Á"˙î ń<˘ěOţ 4ňŕŕ×[ń0 ďâáÍ'. 1 ô0' $đńŇpŔŔ?ăü ˛€ßްпďţŢŘâĐ ąĐŕąá°!^Őďđ/4˘3Ňń5 "đĺ;á> ÖýĐTÁ#ŕ'$Bđ'0ó?€0 ŕÁq@ŕ0D" ×ň1˙&ďođđŔ!ú?ÝŇ€Đ˙žŕ€˙ďŔíúđîŔŢŢĎţ#Żń"˛Ä`0Ń" ŕsđâ"%đŃŕAáń`ŇńîR!&$#,ňP$Uĺ 1 ő Ŕßü ŔĐ݀ţýżÍŕďŮíţăď đ€Đ˙˙ ˙áň -ć.?qÖ 0PDß>‚ ŕđÔŕÂ"ôa*ńň×PÁ.çđ?%@ô#`0Ŕ'Đ50Ňń Ţ ˛O÷đŃőĐ΍ŕĎţžüßްŔĐаó ˙ă)î!Ü"°îŔ đÔ4‘đ#&ŕÔaq Qđ ô2ađ1#CĹó0ţŐ°+12Ą0+"@äSôü°ŇüŕáŕžŃ<ßýżĐíčŕ˙îŕîěŢřţ đýâ?Ŕ>ń'űôńb@ń`qQńýŽâŇůĐ. óCŕPÓÔÁţB°0ARQ@ ŕЀđ˙ŃĎěěđĄ˙ýěüďßËţďϰŔî/žŕŔĐÔîŔ! ! ó#°ňĹ ăCó3ăôóĚŕíБ'đ˙˛óňq"ń#çáţcÓôÓ×Ń4ńtŕ%ŕÁ/ Áű ÚŔ€˙Đěřđŕ.°Ýîąëđđţŕހđ/äűńô"`ÖđŕáŕĺŔ˙„_Ł 2ć Ďđń0đœ$ŕÎ) 2@4ňÔň"bť05 ŕ!5"R˙ R#ń"ňŕ0ĺđŕŁó ű‹ŕăŃţ üđňňAđŔÁ@îđ‘îó°QŕěđŔpôÚÂő /Á× 0c ŕŕuđ CĂŘď˙ţ ä' ü@Î.! ďŕśđ ßâŁs$ń, żáđ1đŔÚÜá1 ő0ĂńÝŕ7üŕĄđď ÷űĐ˙Á 1Ołž ĄŕÎđď*Óë wđüĐ/ďpĐúď@  ć.Îŕ4"üÜ˙ň.Ÿ!ŕ˙í$ ţŕ ÜďŒđ1žá˙˝ń # ţŕB"Íü ń#4ŕNú˙ń"rí@ŰńđĐsPđýîž'ŕ€#/ŕ7Đ2ěäPí ţÄC`0ď'2%BđQA0ô`î?ćĐP  äđîĐďŽŕŢÝ ňîŻ"-Đâüŕ ďŸđAÁ. Ý˙@ĐéŔ ; Ô1€ ˙ďĐ@˝;Áý3Á ŸćŢqżÝpĎMŢ72ć_$Ă1DqŇ@>ßŕ ŔţóîÎ@řŇ üđ€ŕ.ýđĐ­ÉŔţü÷ŕ@îëć#/€0ď đń €đ.TţđË0Żüď×˙ü-˙ ˘PđńTÝÁp"÷0 #0"ň7!űCđ`Á$ĚÝôÍĘÁ!ýęŕŮđ Žďŕ8 ýđ3Í&ýâ7ď`îđ5ŕ đ!.Ň čăPđА Ż0‘đ"<íÝîąďöňúď #pŕ4!ôR@4 20'# D4 "1 ˘D íí ž Ě˙˙ŕíŕü­ĎđÍŃPíâűÜ9 ńD Ń40ÍAĐ/ÝŔ4Řŕ!Ůŕîŕňžüý3Ą%đđ 3gđAĐ'36$dđQ!Bđp!1 úâ`˙đ9Đ˙ŃPíŽŔ Ý˙Žüžýëŕęýžápüđń/Ďî1űţăíËďŻ.óóÝÇw˘ý@Oçďá?ďP|á0/íôĂ|ăŔ}á0˙çý˙0đ î(đŕ"@;#"Đ07*!pŕ#ł#íĐ0t đôđ °ÝĎěŢ×îßŇLń°ń1â â]Đ?Őŕ&ýä Ŕ  sĄÂNôá đ 5ÁŢ#Žŕ-€äíňĎő°=ţďćÝ_óçá0đF.Ă˙ńŇ0bűń@€Ôđ üŃCű óé ňá[đŢ/˛ąý˙^őĐëđűđÝ$ ĐÖ˙ đ0?ń“ß ÷/Đł ĂôíĐňđOçţŇđrýäńßMő ďô* ďđ=çő)ďŕ1îo×đŐ/1 ŕ@Ŕá/páđ Nđ˛>Đáů.˛đ=ňłŕN Ŕó .äłßĐ_ŃÖß=rŕę0Ç!ŕ0đ°/ËA ŃňĹŃ+<ň°0 őóŔ Ă`Ň!ápá/A°ą>ŃăPĐ@ü ĺ0ˇ 0Ň! Öý? ŕń /đÇĐĆÁ˙Ä‚đŕűóÁ<đŔ>ń ˙ŮPđáńOďâąoßĐ@‚Üň^ÔíűŃNÓĐNĐ&üôÎMôŔţpđ0đÓ)ăŔOňŕöÓ,ÖÔ,ňŕ>1“ó.!ŃĹîáŁýŁ ęŇŢ5ţţ'Ţ^°?âŢNĽ˙/áóę"ßń°+oÓđâ00"â)˙đ <Հ˙ŃĂ ÁŸđňŕŕđ¤đě@đŕ×€L#ďň<ŕpĐ@,˘!˙ł @°ŕ<Ă/đ´ íŃ`ę$ĐţĄ P°/ë#Áßqáŕ"BŔĆ 1ôŃ> ĐvŔîĹńáü?í5ŕO‚ý"üS˛˙áŔOí>Őĺ ážB  Ń ¤.đň0üő˙ćŕń   ´ŕćáŕ6ďŕőđ÷ŕŢóđJĐäđŘ ‘äđ;"Ŕ ôă Ő2“ďńÁ/ ôěłą.óßrŕ тÂ_ óÀăá;˙ÓnâŔôą..Őí3MĄöý0á$ĹňŇâ ćűě>ôłî?Öđ z˙úF8Đ@ŢŐ í  ŕŰňëp4Ă S2ďüËŐŕ51ťŕîđęýß ĹR ˛ąđC4 p$!ůň˙RŃBűŔě äđć@ňđîă&bţ ďăžs" ĐďŽţÎîčÍţŕ˙ 3@0ă°"Q2Pŕ= ĘŕđŐ /Ôţ °Đ46đ!q `˙đÜüžŔ"CĚđ"˝ż đCîĐ@ ÂTpŕ qď ď͟đńřî Á@#b đF#ďĐď ňĺ ŕ° ěÎŃĐÎîóÚâďí1w"#D`ňđęđTŇď0Ĺ>%ŕđ-Ç^ đ,đ_ đđ Ňě ţç> PÂđđ0ţ€30ŽóěÂęŢŢ ŔňJáŃÎR ň_í%/bŘ Đ!đü.Ţëń0°tęÝ?ŕ-Đ2 ŕň@˙" âđ‚ř(ÁäᎠ đŻîâAëđ Đ.Żęń đîPŕďD+°! ŕ@ˇŽłLpî 3;ÖRđ%Eŕđ2ô đ?ńĆ Đ +˙Ăńâţíîŕ˙ŕż žŇ#âĄEóőqŕ P€#pĎ!ď #PăD ˙đBÜ đŸ ż!đŇA&Ýňc=äT4>ŕî.(ć Ŕ!pô=5ą üńŔĄ ŕňîę đ߲ ŔěţűŰŢýаí˝˙°ßÚ˙  âßîčňý,ë. ăöŕW0Ń`$/5.B!a1  ű"ݐB.â1ŕ?ňBތ" ń´î˙ú2Ű0ő0ó2V QÂ2 #E1!qň-ż€ý˙˝ŕď $ßËîĐŻîęÎÝŰ ß^Ŕß˙2Ńoâ˙o$ 3Cŕ $Ô0âŃż$řá4, ŕďŕS €˙íŕ!äý€ŕń ˙ĐěăúţÂîŔ€Đ=Ő_öá  pďîŕą ˙ąýÝ ß˙Ą ˙ýŐî íîąţLŇ!Ľż˝ á'đń4q$ ý7Ýô&33t3C#"24#!őáb˙0ďŁŕ /í Ţ ŕá€đđž˙ !đ ŕîí÷đâS G 1đďŕżĐ+ôŘ˙ďţ ŕüđŔéđ˙ ÁĂúŃŢ<ÝpđŇď"đmĺŕ/?đƒî`!ŕ@& ?ń5ÓN´đ2ĺ._Őŕâ/0ţŕ``Ľ  0˙ţCÁçüěMçď?ňËoćŇ-M?ő㓠_Öń-äŕŃŢ} ÖŔî>Ŕńď  Á°/ŕMŕƒý öĐ× Năđ?őÂL=“á+0đó˙ƒĐ} ŕĺ 0Ó0Ç˙ ţ\áäŇ9đMâă‘?ďßpąđ0˙ó+đ0’ţpŃ"ěOĺŕ.#Ż"ŕQÝpâóŔ~ă,=‘˘ů0ăÄ  Ăá /Lňŕđ ĎáĆ˙@´-ňôĐ( ą ?đĂ 04”â ./*”; ăđăNô >Ăł*`Ŕ 8ö˙ńďJ/;ŕă(/Á<ä˛ţ,N;ÓŇď}.0ÄÓđoƒÁ×ôŔ/* ńăŕ:/ńľá Oý`ÂňđŁ8 đňňâ  Őáńńm$ /áâlńJ Őý?Ų oâäüMŸ#ďţ4 =÷óŕ]/ň+÷đń-<;1˛çđ /á<#)ôÓ8ó   ƒ 0˙Đ%ŕű!ąOÂâŇpţĎ6ď,#áŐý^$ýďMăîŕ_°AâđOâ˛_ą LöĐ(đđ/Á0îôűŇPţßmŔ5ńî0ůä đđî&ďń>Ŕń !ţŕ- ăúň_ "°ţą ’@ ńÄń ŕńNŕđđŔ? "/ÁđÝB3ÂçOŔ ŕ3°Dď Kŕ,÷ŕ "ý!`ň˙âţ/p @đĐÝbđĐ!˙€ Đ>>€ Ń-ß$ P/Đą' î˛CÝŁ:ŕßQ đ#đĎ. ŔN ÓÓaŢňžđü"> Ň ='aý˛ 3ăŢ'ń;˙7ňĐ<ŻĄŕP0 ÔŃq°ďŇłĐoŃ2Đ-$ö˙Lđňú° đ!řţĎ~ÔôŕîĐńóŇ p0Ŕ˝°áüđHńűňîż/ąáĐńPď˛ţpá 'ă ŕ’?2îžęáŕ~ňńđá îđ áO áđ?âÓN`ţ!Ÿđ2 ßő?ŔŰň"ŕđ× ďą 6Ё1ŃŁŔýßSÇ ,ó. ô˛0űҀBďŔí/nąďŕÜ`.á/0 ĺđpń ŕń0Ő°oôň] ő  -ń"ń]Ĺ0ŐáŔŇ>Ň˝˙ţäđă°`/ńÍ @ólCą?üpńÓ˛O/!ň@3łŐ+ń˙ţ°°ß .îĐÍąďÓł-"ŕ‚đ.>@đŢđííŽĐżŔÜŕřđńđ@˙ŕ°áă=מ ˝ß°üďţîßüâş żýâ"qňĐ Áń'2ńď ŔŽ˙ńńŕ*ďŔаb21"4Tá@2SD#"€ĐďŢä íĎëďß>ô6_ŔRD"°ĺâ20áŇąň@P2×2`1C2.Âëđ ĐŰßß ĎđÓPńPńPđܰĂč đ4Î5îŃ%#đÔńu$üCCüč˙°ţЎűďĐ ţáOb&.ěâýë ˙Đ ńϰżđ Ŕ%Ń02b$Ŕâ /đží­Îđ!đôěÜń2Crń ŢĐ@ýżďßŰň ŃSç0$ň2C3&$5%#2M ˙!/ąŔŒţń Â˙üuđ˙&˝Î6ńńŮ%ŕQB0cÎ/÷ ßÜîô˙ 753˙/˙Íđ$ńî€˙6ßźá@Ď ěŻíA2P ţáúܞĐ"?ŕŕŃ0Ás1üĎ ˙­Đ0ýżŔ !U ëţĐ50Ż˙ŕţŕ #' Í 722`đ ýź ďíΟ!ß  "QÍŔóţÍú˙ŕâA Ěń@Đä ěOÄ=âŻĐ/°ô?0##&" đÓa ŔŢĚčŕţäQđ'/Đ! Ţь"żý$ó7%°˙đÁpŔŕ=MŐă!P !ţď;ýďÂ(íđóţí#˙Ŕa@ °đ …ů÷a ąÄ sPŔŔń,đ+Óá`ňp3%ŕ đ?ţŢČđŕ ŔŔ.˙âŕŕýţÉĎżţÂÁo1C  đ^üíĺýOëáđ.#€ŔěŕĹđá0s0ń#0âđ˙°ěň˙Ý˙ń˝ ÷"@âÎ! đĐŢî ˙ŰţŔËĐĎţż ăänăđ! ŕ%Î4űŔ°Áí€Íďü@ň€ĐÝoîíQ 㲿BüŢARSŕńC` 0áq˛4ňPíďä-ýőŔßpŔŕ1q!ó>ŕë˙&ŕÓ Áňôű@ĹĎđ/oŇRäŔ &˙ Đ ŽOŸđĹŇ ĐäÁpĐÔĐpáѰŕ!ţ ăě×áŃ Ż đ! BÇAD× ĐŃ΀đ°ďŃ."ńO0S‚đáÝąń°˛ăŢíçĐńĐ˙îáŕŽ;Đđ`ŕ° `ńňáÎ $­OÂíbňÓ ńqP" `Ÿ#ÔňÍŕÔĐPŃżąîüĐđ÷#&ŕ ]˛áâßđńđä˙ĎđĐӀŕđĄ Ňž/ăĄŇârç çýсď.Á‘đěĂ ŕQäĐ ŕŕƒáň.çŃńđ0,ß"ţ폰0đĐ&ńžrÁŐţ/.@˘â :á#ä°OĐőO$ú ńäŔ7˙#Ԟ",ŕ.  íOҟ. đ]ď˙ßŕÔţÎގ đŕ°ËďŕB Ą=Ósń#ßqţ$25Ŕ !`!a˙Ä ţý˘Pđ˙0˝Uă ä`ď°4 ß1ß0 ^˘@ #€xvĂÓÔ˙ ˆŕíýĘ őě. ßđáÚŢđ'îţ° ń,ăKŇ0ŕ Ď#pżîć.& đ€ ˙&đĐf Ţ@đô˙wđ % ŃĆÝ<â! ›!Ţ× Ńo  #ž3 ţý ń%Üа Oŕ˙ńí!ýŽńB  í'ŕţ> ×!2a1RÂ7ŕ2@A ÓSBŰóOďĹ1ţŔrĂ đő MŰĐ1ďOŸÓđŘđ#ŢžŢŰĐAëÝŕň0ĐŘŔĎ Ží üěŃôďěň°ţ5Ä˙ďŐđňřđ ŕŢžÍ!q ţĐ0Ŕ04/" 5"ďţ#76ń˙őD! ďŔ2/ŕΟQÍđAî° Ţöŕ ĐůńńR/ŕU6!07`đ""ÎÁ1ż °$óä''  ć ß/ŕŘď$ ˙ä ď ÓSŽđCď3'í2QÜŇtąđđ0-0ě°ă÷0ěńŕ˙Ž0U),=’ŕî°ě˙ŕ­âđíŔîŔţă îďă%đĐ×Ń=€ňĐżŢ0Àá˙ßĐî)ăĂÂÂü~ä˙Đ#A7ő!!Ap!&ń!/6óŕ?°"OÓ đĐPĐžá˙+ŕ. Ď°/ÜĐ͐ßíî˙ ŕ˙ţ" Ô.űďĹň@ţ˘˙ä QđŢ5ŕÝÎÝráńóń/ éŕđ<°ţ ĄđŕţďąíăЀďNóq0Â÷C!%r!SîđôC"î€!/ń/çŢňđĐ×`ŔA/'0ł! 4Qą#-ÖOĐá= úň 0°˙ďŕÖ°ńĎP°ďÎěĎ ýđąńŻţŕđ/âąp.ß"î ŕ’/ń×ŕŃ=ÓŀРţĚAď Ŕţ˝Đđ`đŔíăđ͏ĐÍ]7Ó !đ#!đŕ` ąď/ńâ:üĐΰňéđó°ŕŕäÄ- Ŕžý‚ ąđÜ Öđńńĺńŕ"243ór%j6  ďň ?Iîđ‘đ#°ţô7ŕŕđGŃł=ÜźđňĚŃ Ą#Cq0146ňPóó€ßďĂÚŃěęâ đę˙Ý ÄżĎŔń‹Ňď˙đßÁď ° Ňőń#7ô""Ő#´ńţűáÁâčÎá ÜüŕďߏŻ îŔďýŽżŇ?ß ˙âžďÂä€ň1ńA4t!?AT"â317Ń0ĂĘŔđďăѐÎđâýň°ߑüżîđď͞á˝ß݀Đď AqSRó23ő!/F'âăíĎÁňQp/ń ňč aÜÁ$Rţr"ó"ŕÁÁ!> ˙żŔđáđŔŔě˙ëţďýÍđ>˝đ! ą ţ Íß°OđăüńÍ÷` ń51ŕ`?1ŇŕŔţßď€ó Üň ńŃâp>ώ.ůßîż/üPńňč#"6đô5 Qô&á#áÓCżĄŇ Ń ÝúŔďÂŕßß5πáüńţööÜÍÍÝÍÍÍÜÜÜÜÝÍÍÝÍÝÜíÝÎÎď˙ďî$DD4$443D34353C3S#334"$"!ń˙ŽîéţßĎíď'b55434C$4D3R#444443CCC444443D43CC4443CCC3C343C33C333#ý˙˝˝ÝÍËÜŢÝŽíŰÍÜěÜÍÍÜÜÜÜŮŕ˙íÝÜÝÍŢÜíźß˙íüŢ˝ÝěŢÎÚďěîžüÜîžěîžĐîÝŰÝËßţěżîŕüížŕÓůŃ˙˙*âß Ŕ!Đ!Ä" pňŃQ A!C'"0BUń 0_ŕ_áOő0@Ç1P0D C%N#ç O#Ą2ÁNDŕ/ámƒ?-3ŃÇ đá|ńŃô*$Ŕ.3’ő!ä%0Npŕ0×!0są3?'.RRđ@SDô q öń2ě@× óńmĐL Á/łý Ý €ď˙ŔŔ$żáţ’đĐíŰŕ€ °Îí ŕđ‚ îÁŕpŢ˙Đ`Ţŕ͐ě ý’ţÝĐ\Âď1Ţ W óű!` ąŃ~â!Ď-B  ŇĎ ŢóđŔ3€. áń î1ř!ĺ0#˙OŕNŃŕë/ ňÔB Rň Á=đ/@‘đßCŽ0ĺ î1€ .ŕĹę đ, ć^đôŇ^ňMâ× 2Ż?˙ĂţŃOý}đŃѰđę.Ü Â°Â `Ŕđnôň1P´đ!đ]ôßTáü=ńŇ/Ç/ŔP#+ó5°=đďŕ<á Iđ˙˙Ó<ţ€ňŔC  G0đqńá`đŁM/öŔńěŰ0ßĐëî/° Đ Ţţ#˛ĐŔ<2Ą@ăíAP5ŕíđT!Ď  đÓ~đţÎOß <Ԑ˙ŕ äö `ŕBŕÍđ"â"'Oq"ç!Ŕítŕ!Dđą Ůß1Í`Âí ŕňÎřŕŔá`đ1BÔ0žŕ#A ě×0 ĎOţüěAđ $" đŕq ňŃ2 RđńîN €đďĐN€ "`đí *öó:ţëÓ0-OŃ"#Đŕa,4đĺáPPO ţ˛Í?/7íŽě Ú°Ý˙ ňń' oíúńŇ_ď`ŕ˙Q !*@Đ ó0Áď7#a ýßŃ#ďZ˙áŕ00.÷ TďĚŕߐ0Â#O?Ŕ 1_ĐG1Đ$`%řŕ÷>üŔŽń íúí‘˙?Ň-ň× ýě äA˙@ěSń@0ßŇîóŘ%â "#ü˙.äŢá?ăĺt`°ŕN ÍĎ,26 áá]íŻń2` Ŕăbďß/W ˙ $Dţîŕ2óݏßO> Ÿ Đí2#ţŔ`°ŕO$Đě" 0BÍÎCđrđ ŕń3­PđĐ÷"OŔ /Âě Żß@ń0'ű Ŕ"?Běß7ýď!á@ţńŇßtń/P  đáĐ2tŽ íúüěĂ0ďđp#żúŢ6á6PĐÝô3/ ŕN“ Ŕ3ć í /Ŕ Ńŕ3ýs÷esdl-1.2/test/testaudio.erl0000644000076400010400000000225011540750060017705 0ustar familjenAdministratörer%% Copyright (c) 2001 Dan Gudmundsson %% See the file "license.terms" for information on usage and redistribution %% of this file, and for a DISCLAIMER OF ALL WARRANTIES. %% %% $Id$ %% %%%---------------------------------------------------------------------- %%% File : testaudio.erl %%% Author : Dan Gudmundsson %%% Purpose : Test the audio functionality %%% Created : 21 Sep 2000 by Dan Gudmundsson %%%---------------------------------------------------------------------- -module(testaudio). -author('dgud@erix.ericsson.se'). -compile(export_all). %%-export([Function/Arity, ...]). -include("sdl.hrl"). go() -> sdl:init(?SDL_INIT_AUDIO), {ASpec,Sample} = sdl_audio:loadWAV("Beep.wav"), Obtained = sdl_audio:openAudio(ASpec, true), io:format("Driver: ~s\n", [sdl_audio:audioDrivername()]), io:format("Obtained: ~p\n", [Obtained]), sdl_audio:play_audio(Sample, 3), sdl_audio:pauseAudio(false), timer:sleep(2500), sdl_audio:pauseAudio(true), sdl_audio:freeWAV(Sample), timer:sleep(500), sdl_audio:closeAudio(), sdl:getError(). esdl-1.2/test/testbin.erl0000644000076400010400000000240111540750060017352 0ustar familjenAdministratörer%% Copyright (c) 2001 Dan Gudmundsson %% See the file "license.terms" for information on usage and redistribution %% of this file, and for a DISCLAIMER OF ALL WARRANTIES. %% %% $Id$ %% %%%---------------------------------------------------------------------- %%% File : testbin.erl %%% Author : Dan Gudmundsson %%% Purpose : %%% Created : 12 Sep 2000 by Dan Gudmundsson %%%---------------------------------------------------------------------- -module(testbin). -author('dgud@erix.ericsson.se'). -compile(export_all). %%-export([Function/Arity, ...]). -include("sdl.hrl"). init() -> go(). go() -> Wrapper = sdl:init(?SDL_INIT_VIDEO), io:format("Wrapper ~p~n", [Wrapper]), F32 = sdl_util:malloc(7, ?SDL_FLOAT), F64 = sdl_util:malloc(7, ?SDL_DOUBLE), Args = [0.0, 1.0, 1000000.0, 0.000001, -1.0, -1000000.0, -0.000001], io:format("E Writing ~f ~f ~f ~f ~f ~f ~f~n", Args), sdl_util:write(F32, Args), sdl_util:write(F64, Args), io:format("Reading~n"), List32 = sdl_util:read(F32, length(Args)), io:format("E Read32 ~f ~f ~f ~f ~f ~f ~f~n", List32), List64 = sdl_util:read(F64, length(Args)), io:format("E Read64 ~f ~f ~f ~f ~f ~f ~f~n", List64), ok. esdl-1.2/test/testgl.erl0000644000076400010400000001500411540750060017207 0ustar familjenAdministratörer%% Copyright (c) 2001 Dan Gudmundsson %% See the file "license.terms" for information on usage and redistribution %% of this file, and for a DISCLAIMER OF ALL WARRANTIES. %% %% $Id$ %% %%%---------------------------------------------------------------------- %%% File : testgl.erl %%% Author : Dan Gudmundsson %%% Purpose : %%% Created : 11 Sep 2000 by Dan Gudmundsson %%%---------------------------------------------------------------------- -module(testgl). -author('dgud@erix.ericsson.se'). -include_lib("wx/include/gl.hrl"). -include("sdl.hrl"). -include("sdl_events.hrl"). -include("sdl_video.hrl"). -include("sdl_keyboard.hrl"). -export([go/0, go/1]). go() -> go([]). go(Config) -> %% Init sdl:init(?SDL_INIT_VIDEO bor ?SDL_INIT_ERLDRIVER bor ?SDL_INIT_NOPARACHUTE), sdl_util:debug(2), Flags = case lists:member(fullscreen, Config) of true -> ?SDL_OPENGL bor ?SDL_FULLSCREEN; _ -> ?SDL_OPENGL bor ?SDL_RESIZABLE end, sdl_video:gl_setAttribute(?SDL_GL_DOUBLEBUFFER, 1), AvailableWindowedSzs = sdl_video:listModes(null, Flags bor ?SDL_FULLSCREEN), DriverName = sdl_video:videoDriverName(), io:format("Driver ~p ~n", [DriverName]), io:format("Available WindowSizes ~p ~n", [AvailableWindowedSzs]), case AvailableWindowedSzs of [{_, 0,0,W,H}|_] -> Res = [Test || Test <- [32,24,16,15], true == sdl_video:videoModeOK(W,H,Test,Flags)], io:format("A guess at max video res is ~px~p:~p ~n", [W,H, hd(Res)]); _ -> io:format("Can't guess max resolution~n", []) end, SR = sdl_video:setVideoMode(640, 480, 16, Flags), Rs= sdl_video:gl_getAttribute(?SDL_GL_RED_SIZE), Gs= sdl_video:gl_getAttribute(?SDL_GL_GREEN_SIZE), Bs= sdl_video:gl_getAttribute(?SDL_GL_BLUE_SIZE), Ds= sdl_video:gl_getAttribute(?SDL_GL_DEPTH_SIZE), Db= (1 == sdl_video:gl_getAttribute(?SDL_GL_DOUBLEBUFFER)), io:format("OpenGL attributes ~n"), io:format("Sizes in bits Red ~p Green ~p Blue ~p Depth ~p Doublebuffered ~p~n", [Rs, Gs, Bs, Ds, Db]), io:format("Vendor: ~s~n", [gl:getString(?GL_VENDOR)]), io:format("Renderer: ~s~n", [gl:getString(?GL_RENDERER)]), io:format("Version: ~s~n", [gl:getString(?GL_VERSION)]), io:format("GL AUX BUFFERS ~p~n", [hd(gl:getIntegerv(?GL_AUX_BUFFERS))]), io:format("SDL Version ~p~n", [sdl_video:wm_getInfo()]), io:format("Extensions: ~s~n", [gl:getString(?GL_EXTENSIONS)]), io:format("Maximized: ~p~n", [sdl_video:wm_isMaximized()]), io:format("~p~n~n", [catch gl:getConvolutionParameterfv(16#8011, 16#801A)]), sdl_events:eventState(?SDL_ALLEVENTS ,?SDL_IGNORE), sdl_events:eventState(?SDL_KEYDOWN ,?SDL_ENABLE), sdl_events:eventState(?SDL_QUIT ,?SDL_ENABLE), sdl_events:eventState(?SDL_VIDEORESIZE, ?SDL_ENABLE), ?printError(), initWin(), sdl_util:debug(00), Cube = {{ 0.5, 0.5, -0.5}, { 0.5, -0.5, -0.5}, {-0.5, -0.5, -0.5}, {-0.5, 0.5, -0.5}, {-0.5, 0.5, 0.5}, { 0.5, 0.5, 0.5}, { 0.5, -0.5, 0.5}, {-0.5, -0.5, 0.5}}, Colors = {{ 1.0, 1.0, 0.0}, { 1.0, 0.0, 0.0}, { 0.0, 0.0, 0.0}, { 0.0, 1.0, 0.0}, { 0.0, 1.0, 1.0}, { 1.0, 1.0, 1.0}, { 1.0, 0.0, 1.0}, { 0.0, 0.0, 1.0}}, drawBox(Cube, Colors), sdl:quit(), ok. initWin() -> gl:viewport(0,0,640,480), gl:matrixMode(?GL_PROJECTION), gl:loadIdentity(), gl:ortho( -2.0, 2.0, -2.0, 2.0, -20.0, 20.0), gl:matrixMode(?GL_MODELVIEW), gl:loadIdentity(), gl:enable(?GL_DEPTH_TEST), gl:depthFunc(?GL_LESS), gl:clearColor(0.0,0.0,0.0,1.0). drawBox(Cube, Colors) -> %%timer:sleep(30), gl:clear(?GL_COLOR_BUFFER_BIT bor ?GL_DEPTH_BUFFER_BIT), gl:'begin'(?GL_QUADS), gl:color3fv(element(1, Colors)), gl:vertex3fv(element(1, Cube)), gl:color3fv(element(2, Colors)), gl:vertex3fv(element(2, Cube)), gl:color3fv(element(3, Colors)), gl:vertex3fv(element(3, Cube)), gl:color3fv(element(4, Colors)), gl:vertex3fv(element(4, Cube)), gl:color3fv(element(4, Colors)), gl:vertex3fv(element(4, Cube)), gl:color3fv(element(5, Colors)), gl:vertex3fv(element(5, Cube)), gl:color3fv(element(8, Colors)), gl:vertex3fv(element(8, Cube)), gl:color3fv(element(3, Colors)), gl:vertex3fv(element(3, Cube)), gl:color3fv(element(1, Colors)), gl:vertex3fv(element(1, Cube)), gl:color3fv(element(6, Colors)), gl:vertex3fv(element(6, Cube)), gl:color3fv(element(7, Colors)), gl:vertex3fv(element(7, Cube)), gl:color3fv(element(2, Colors)), gl:vertex3fv(element(2, Cube)), gl:color3fv(element(6, Colors)), gl:vertex3fv(element(6, Cube)), gl:color3fv(element(5, Colors)), gl:vertex3fv(element(5, Cube)), gl:color3fv(element(8, Colors)), gl:vertex3fv(element(8, Cube)), gl:color3fv(element(7, Colors)), gl:vertex3fv(element(7, Cube)), gl:color3fv(element(6, Colors)), gl:vertex3fv(element(6, Cube)), gl:color3fv(element(1, Colors)), gl:vertex3fv(element(1, Cube)), gl:color3fv(element(4, Colors)), gl:vertex3fv(element(4, Cube)), gl:color3fv(element(5, Colors)), gl:vertex3fv(element(5, Cube)), gl:color3fv(element(7, Colors)), gl:vertex3fv(element(7, Cube)), gl:color3fv(element(2, Colors)), gl:vertex3fv(element(2, Cube)), gl:color3fv(element(3, Colors)), gl:vertex3fv(element(3, Cube)), gl:color3fv(element(8, Colors)), gl:vertex3fv(element(8, Cube)), gl:'end'(), gl:matrixMode(?GL_MODELVIEW), gl:rotatef(5.0, 1.0, 1.0, 1.0), case {gl:getError(), sdl:getError()} of {0, ""} -> ok; {GL, ""} -> io:format("Errors Reported ~p => ~n", [GL]), io:format("~s~n", [glu:errorString(GL)]); {GL, SDL} -> io:format("Errors Reported ~p ~s~n", [GL, SDL]) end, sdl_video:gl_swapBuffers(), case check_event() of ok -> timer:sleep(10), drawBox(Cube, Colors); quit -> ok end. check_event() -> case sdl_events:pollEvent() of #quit{} -> quit; #resize{} -> io:format("Maximized: ~p~n", [sdl_video:wm_isMaximized()]), ok; no_event -> ok; #keyboard{sym=$f} -> Surface = sdl_video:getVideoSurface(), io:format("~p\n", [sdl_video:wm_toggleFullScreen(Surface)]), ok; #keyboard{sym=?SDLK_q} -> quit; #keyboard{sym=?SDLK_ESCAPE} -> quit; Event -> io:format("Got event ~p~n", [Event]), ok end. esdl-1.2/test/testjoy.erl0000644000076400010400000001456111540750060017415 0ustar familjenAdministratörer%% Copyright (c) 2001 Dan Gudmundsson %% See the file "license.terms" for information on usage and redistribution %% of this file, and for a DISCLAIMER OF ALL WARRANTIES. %%%---------------------------------------------------------------------- %%% File : testjoy.erl %%% Author : %%% Purpose : Test joystick handling %%% Created : 20 Apr 2001 by %%%---------------------------------------------------------------------- -module(testjoy). -author('dgud@erix.ericsson.se'). -compile(export_all). %%-export([Function/Arity, ...]). -include_lib("wx/include/gl.hrl"). -include("sdl.hrl"). -include("sdl_video.hrl"). -include("sdl_keyboard.hrl"). -include("sdl_events.hrl"). -include("sdl_joystick.hrl"). -define(CUBE, {{ 10.0, 10.0, -10.0}, %1 { 10.0, -10.0, -10.0}, %2 {-10.0, -10.0, -10.0}, {-10.0, 10.0, -10.0}, %4 {-10.0, 10.0, 10.0}, { 10.0, 10.0, 10.0}, %6 { 10.0, -10.0, 10.0}, {-10.0, -10.0, 10.0}}). %8 go() -> go([]). go(Flags) -> init(Flags), Nr = sdl_joystick:numJoysticks(), io:format("Found ~p joysticks ~n", [Nr]), if Nr > 0 -> ok; true -> exit(no_josticks_found) end, PrintName = fun(Index) -> io:format("Joystick ~p: ~s~n", [Index, sdl_joystick:name(Index)]) end, for(PrintName, Nr - 1), JoyI = case lists:keysearch(joystick, 1, Flags) of {value, {joystick, N}} when N < Nr, N >= 0 -> N; _ -> 0 end, Joy = sdl_joystick:open(JoyI), %% sdl_util:debug(19), io:format("Testing joystick ~p: ~n", [JoyI]), io:format("Number of axis ~p: ~n", [sdl_joystick:numAxes(Joy)]), io:format("Number of balls ~p: ~n", [sdl_joystick:numBalls(Joy)]), io:format("Number of hats ~p: ~n", [sdl_joystick:numHats(Joy)]), io:format("Number of buttons ~p: ~n", [sdl_joystick:numButtons(Joy)]), init_video(Flags), Res = (catch test(Joy, {0.0, 0.0, 0.0}, [])), io:format("~p ~n", [Res]), sdl_joystick:close(Joy), sdl:quit(). test(Joy, Pos, Buttons) -> {_, Evs} = sdl_events:peepEvents(sune, 10, ?SDL_GETEVENT, 16#FFFF), {Npos = {NX, NY, NZ}, Nbuttons} = check_joy(Evs, Pos, Buttons), %% io:format("Pressed buttons ~p ~n", [Nbuttons]), gl:loadIdentity(), gl:clear(?GL_COLOR_BUFFER_BIT bor ?GL_DEPTH_BUFFER_BIT), drawButtons(Nbuttons), gl:loadIdentity(), gl:translatef(-5.0, -5.0, -50.0), draw_cube(), gl:color3f(0.0, 0.0, 1.0), gl:translatef(NX, NY, NZ), gl:'begin'(?GL_LINES), % Draw Cross gl:vertex3f(-1.0, 0.0, 0.0), gl:vertex3f(1.0, 0.0, 0.0), gl:vertex3f(0.0, -1.0, 0.0), gl:vertex3f(0.0, 1.0, 0.0), gl:'end'(), gl:swapBuffers(), case {gl:getError(), sdl:getError()} of {0, ""} -> ok; {GL, SDL} -> io:format("Errors Reported ~p ~s~n", [GL, SDL]) end, timer:sleep(5), test(Joy, Npos, Nbuttons). drawButtons([]) -> ok; drawButtons([H|R]) -> Size = 1.0, X1 = Size * H, X2 = X1 + Size, Y1 = 5.0, Y2 = Y1*2, gl:'begin'(?GL_QUADS), gl:vertex3f(X1 -10, Y1, -20.0), gl:vertex3f(X1 -10, Y2, -20.0), gl:vertex3f(X2 -10, Y2, -20.0), gl:vertex3f(X2 -10, Y1, -20.0), gl:'end'(), drawButtons(R). check_joy([], Pos, B) -> {Pos, B}; check_joy([Ev|R], Pos = {X, Y, Z}, B) -> case Ev of JA when is_record(JA, joyaxis) -> %% io:format("Got ~p ~n", [JA]), NewA = 10 / 32767 * JA#joyaxis.value, case JA#joyaxis.axis of 0 -> check_joy(R, {NewA, Y, Z},B); 1 -> check_joy(R, {X, -NewA, Z},B); 3 -> check_joy(R, {X, Y, -NewA},B); _ -> check_joy(R, Pos, B) %% Ignore end; JB when is_record(JB, joybutton) -> Butt = JB#joybutton.button, %% io:format("Button ~w changed ~n", [Butt]), case JB#joybutton.state of ?SDL_PRESSED -> check_joy(R, Pos, [Butt|B]); ?SDL_RELEASED -> check_joy(R, Pos, lists:delete(Butt, B)) end; #quit{} -> throw(quit); no_event -> check_joy(R, Pos, B); Quit when is_record(Quit, keyboard) -> if Quit#keyboard.sym == ?SDLK_ESCAPE -> throw(quit); Quit#keyboard.sym == ?SDLK_q -> throw(quit); true -> io:format("Got event ~p~n", [Quit]), check_joy(R, Pos, B) end; Event -> io:format("Got ~p ~n", [Event]), check_joy(R, Pos, B) end. draw_cube() -> gl:'begin'(?GL_LINES), gl:color3f(1.0, 0.0, 0.0), gl:vertex3fv(element(1, ?CUBE)), gl:vertex3fv(element(2, ?CUBE)), gl:vertex3fv(element(2, ?CUBE)), gl:vertex3fv(element(3, ?CUBE)), gl:vertex3fv(element(3, ?CUBE)), gl:vertex3fv(element(4, ?CUBE)), gl:vertex3fv(element(4, ?CUBE)), gl:vertex3fv(element(5, ?CUBE)), gl:vertex3fv(element(5, ?CUBE)), gl:vertex3fv(element(8, ?CUBE)), gl:vertex3fv(element(8, ?CUBE)), gl:vertex3fv(element(3, ?CUBE)), gl:vertex3fv(element(1, ?CUBE)), gl:vertex3fv(element(6, ?CUBE)), gl:vertex3fv(element(6, ?CUBE)), gl:vertex3fv(element(7, ?CUBE)), gl:vertex3fv(element(7, ?CUBE)), gl:vertex3fv(element(2, ?CUBE)), gl:vertex3fv(element(6, ?CUBE)), gl:vertex3fv(element(5, ?CUBE)), gl:vertex3fv(element(5, ?CUBE)), gl:vertex3fv(element(8, ?CUBE)), gl:vertex3fv(element(8, ?CUBE)), gl:vertex3fv(element(7, ?CUBE)), gl:vertex3fv(element(6, ?CUBE)), gl:vertex3fv(element(1, ?CUBE)), gl:vertex3fv(element(1, ?CUBE)), gl:vertex3fv(element(4, ?CUBE)), gl:vertex3fv(element(4, ?CUBE)), gl:vertex3fv(element(5, ?CUBE)), gl:vertex3fv(element(7, ?CUBE)), gl:vertex3fv(element(2, ?CUBE)), gl:vertex3fv(element(3, ?CUBE)), gl:vertex3fv(element(8, ?CUBE)), gl:'end'(). for(Fun, N) when N < 0 -> ok; for(Fun, N) -> Fun(N), for(Fun, N-1). init(Config) -> Wrapper = sdl:init(?SDL_INIT_JOYSTICK bor ?SDL_INIT_VIDEO bor ?SDL_INIT_ERLDRIVER), ok. init_video(Config) -> Flags = case lists:member(fullscreen, Config) of true -> ?SDL_OPENGL bor ?SDL_FULLSCREEN; _ -> ?SDL_OPENGL end, sdl_video:setVideoMode(640, 480, 16, Flags), gl:viewport(0,0,640,480), gl:matrixMode(?GL_PROJECTION), gl:loadIdentity(), glu:perspective(40.0, 640/480, 10.0, 80.0), gl:matrixMode(?GL_MODELVIEW), gl:loadIdentity(), gl:enable(?GL_DEPTH_TEST), gl:depthFunc(?GL_LESS), gl:clearColor(0.9,0.9,0.9,0.0). esdl-1.2/test/testsprite.erl0000644000076400010400000001546311540750060020124 0ustar familjenAdministratörer%% Copyright (c) 2001 Dan Gudmundsson %% See the file "license.terms" for information on usage and redistribution %% of this file, and for a DISCLAIMER OF ALL WARRANTIES. %% %% $Id$ %% %%%---------------------------------------------------------------------- %%% File : testsprite.erl %%% Author : Dan Gudmundsson %%% Purpose : testing, this code should correspond to the testsprite.c %%% in sdl library %%% Created : 26 Jun 2000 by Dan Gudmundsson %%%---------------------------------------------------------------------- -module(testsprite). -author('dgud@dan.du.uab.ericsson.se'). -compile(export_all). -include("sdl.hrl"). -include("sdl_events.hrl"). -include("sdl_video.hrl"). -include("sdl_keyboard.hrl"). -define(NUM_SPRITES, 100). -define(MAX_SPEED, 1). go() -> go([]). go(Config) -> Server = sdl:init(?SDL_INIT_VIDEO), sdl_util:debug(1), Flags = case lists:member(fullscreen, Config) of true -> ?SDL_ANYFORMAT bor ?SDL_FULLSCREEN bor ?SDL_RESIZABLE; _ -> ?SDL_ANYFORMAT bor ?SDL_RESIZABLE end, ScreenRef = sdl_video:setVideoMode(640, 480, 8, Flags), io:format("Video Driver Name: ~s\n", [sdl_video:videoDriverName()]), Screen = sdl_video:getSurface(ScreenRef), additional_tests(ScreenRef), SpriteRef = load_sprite("icon.bmp"), Sprite = sdl_video:getSurface(SpriteRef), {R1, R2, R3} = erlang:now(), random:seed(R1,R2,R3), Rects = create_rects(?NUM_SPRITES, Sprite#sdl_surface.w, Sprite#sdl_surface.h, Screen#sdl_surface.w, Screen#sdl_surface.h), Vels = [velocity(0,0) || _ <- Rects], Background = sdl_video:mapRGB(Screen, 0, 0, 0), print_info(Screen, Sprite), testblit(Screen, Sprite, Background), timer:sleep(500), {S1, S2, S3} = erlang:now(), NumUpdates = 400, sdl_util:debug(0), moveSprites(NumUpdates, Screen, Sprite, Background, Rects, Vels), {E1, E2, E3} = erlang:now(), S = 100000 * S1 + S2 + S3 / 100000, E = 100000 * E1 + E2 + E3 / 100000, io:format("FPS: ~p\n", [NumUpdates / (E - S)]), sdl:quit(), Background. moveSprites(0, _, _, _,_,_) -> ok; moveSprites(N, Screen, Sprite, Background, Rects, Vels) -> true = sdl_video:fillRect(Screen, null, Background), {Nr, Nv, Updates} = moveSprite(Rects, [], Vels, [], Screen, Sprite, []), DB = (Screen#sdl_surface.flags band ?SDL_DOUBLEBUF), if DB == ?SDL_DOUBLEBUF -> sdl_video:flip(Screen); true -> sdl_video:updateRects(Screen, Updates) end, case sdl_events:pollEvent() of #quit{} -> exit(normal); no_event -> ignore; #mousemotion{} -> ignore; Event -> io:format("Got event ~p~n", [Event]) end, moveSprites(N-1, Screen, Sprite, Background, lists:reverse(Nr), Nv). moveSprite([], RA, [], VA, _, _, Updates) -> {RA, VA, Updates}; moveSprite([R |RTail], RAcc, [{XS,YS}|VTail], VAcc, Screen, Sprite, UAcc) -> TX = R#sdl_rect.x + XS, TY = R#sdl_rect.y + YS, {Nx, Nxs} = if TX < 0; TX >= Screen#sdl_surface.w -> Xvel = -XS, {TX + Xvel, Xvel}; true -> {TX, XS} end, {Ny, Nys} = if TY < 0; TY >= Screen#sdl_surface.h -> Yvel = -YS, {TY + Yvel, Yvel}; true -> {TY, YS} end, NR = R#sdl_rect{x = Nx, y = Ny}, {_, CR} = sdl_video:blitSurface(Sprite, null, Screen, NR), moveSprite(RTail, [NR|RAcc], VTail, [{Nxs, Nys}|VAcc], Screen, Sprite, [CR | UAcc]). testblit(Screen, Sprite, BG) -> Rect = #sdl_rect{x = 0, y = 0, w = Sprite#sdl_surface.w, h = Sprite#sdl_surface.h}, true = sdl_video:fillRect(Screen, null, BG), CR = case sdl_video:blitSurface(Sprite, null, Screen, Rect) of {null, ClippedRect} -> io:format("Blit successfull~n"), ClippedRect; _ -> io:format("Blit failed~n"), ?printError(), exit({error, bad_blit}) end, sdl_video:updateRects(Screen, [CR]), %% It migth have changed Sprite1 = sdl_video:getSurface(Sprite), SpriteFlags = Sprite1#sdl_surface.flags, case ( SpriteFlags band ?SDL_HWACCEL) > 0 of true -> io:format("Sprite blit uses hardware acc~n"); false -> io:format("Sprite blit don't use HW acceleration~n") end, case ( SpriteFlags band ?SDL_RLEACCEL) > 0 of true -> io:format("Sprite blit uses RLE acc~n"); false -> io:format("Sprite blit don't use RLE acceleration~n") end, Sprite1. load_sprite(File) -> SpriteRef = case sdl_video:loadBMP(File) of null -> io:format("Couldn't load BMP file: ~p ~n", [File]), exit(load_bmp); SR -> SR end, Sprite = sdl_video:getSurface(SpriteRef), Pf = sdl_video:getPixelFormat(SpriteRef), case Pf#sdl_pixelformat.palette of null -> io:format("No Palette found ~n"), ignore; Palette -> <> = sdl_video:getPixels(Sprite, #sdl_rect{x = 0, y = 0, w = 1, h = 1}), io:format("Palette found set key ~p to transparent ~n", [Pixel]), true = sdl_video:setColorKey(Sprite, ?SDL_SRCCOLORKEY bor ?SDL_RLEACCEL, Pixel) end, case sdl_video:displayFormat(Sprite) of null -> sdl_video:freeSurface(Sprite), io:format("Failed to convert background~n"), exit({error, convert_failed}); Converted -> sdl_video:freeSurface(Sprite), Converted end. create_rects(0, SpriteW, SpriteH, WinW, WinH) -> []; create_rects(N, SpriteW, SpriteH, WinW, WinH) -> R = #sdl_rect{x = random:uniform(WinW), y = random:uniform(WinH), w = SpriteW, h = SpriteH}, [R | create_rects(N-1, SpriteW, SpriteH, WinW, WinH)]. print_info(Screen, Sprite) -> ScreenFlags = Screen#sdl_surface.flags, SpriteFlags = Sprite#sdl_surface.flags, case ( ScreenFlags band ?SDL_HWSURFACE) > 0 of true -> io:format("Screen is in video memory~n"); false -> io:format("Screen is in system memory~n") end, case ( ScreenFlags band ?SDL_DOUBLEBUF) > 0 of true -> io:format("Screen is doubled buffered~n"); _ -> ignore end, case (SpriteFlags band ?SDL_HWSURFACE) > 0 of true -> io:format("Sprite is in video memory~n"); false -> io:format("Sprite is in system memory~n") end. velocity(0, 0) -> XV = random:uniform(?MAX_SPEED *2 + 1) - (?MAX_SPEED + 1), YV = random:uniform(?MAX_SPEED *2) - (?MAX_SPEED + 1), velocity(XV, YV); velocity(X, Y) -> {X, Y}. additional_tests(Screen) -> PFormat = sdl_video:getPixelFormat(Screen), Palette = sdl_video:getPalette(Screen), io:format("Got a palette with ~p colors~n", [length(Palette)]). esdl-1.2/test/test_glfont.erl0000644000076400010400000002721511540750060020244 0ustar familjenAdministratörer%% Copyright (c) 2007 Klas Johansson %% See the file "license.terms" for information on usage and redistribution %% of this file, and for a DISCLAIMER OF ALL WARRANTIES. %% %% $Id$ %% %%%---------------------------------------------------------------------- %%% File : test_glfont.erl %%% Author : Klas Johansson %%% Purpose : Demonstrate the use of SDL_ttf as OpenGL textures. %%% This corresponds to the glfont.c example in the SDL_ttf %%% distribution and is based on testgl.erl. %%% Created : 6 Feb 2007 by Klas Johansson %%%---------------------------------------------------------------------- -module(test_glfont). -author('klajo at users.sourceforge.net'). -include_lib("wx/include/gl.hrl"). -include("sdl.hrl"). -include("sdl_events.hrl"). -include("sdl_video.hrl"). -include("sdl_keyboard.hrl"). -include("sdl_ttf.hrl"). -export([go/1, go/2]). -define(def_fgcolor, #sdl_color{r=255,g=255,b=255}). -define(bpp, 4). -define(def_text, "The quick brown fox jumped over the lazy dog"). go(FontFile) -> go(FontFile, []). go(FontFile, Config) -> %% Init sdl:init(?SDL_INIT_VIDEO bor ?SDL_INIT_ERLDRIVER bor ?SDL_INIT_NOPARACHUTE), sdl_ttf:init(), sdl_util:debug(1), Flags = case lists:member(fullscreen, Config) of true -> ?SDL_OPENGL bor ?SDL_FULLSCREEN; _ -> ?SDL_OPENGL bor ?SDL_RESIZABLE end, sdl_video:gl_setAttribute(?SDL_GL_DOUBLEBUFFER, 1), AvailableWindowedSzs = sdl_video:listModes(null, Flags bor ?SDL_FULLSCREEN), DriverName = sdl_video:videoDriverName(), io:format("Driver ~p ~n", [DriverName]), io:format("Available WindowSizes ~p ~n", [AvailableWindowedSzs]), case AvailableWindowedSzs of [{_, 0,0,W,H}|_] -> Res = [Test || Test <- [32,24,16,15], true == sdl_video:videoModeOK(W,H,Test,Flags)], io:format("A guess at max video res is ~px~p:~p ~n", [W,H, hd(Res)]); _ -> io:format("Can't guess max resolution~n", []) end, SR = sdl_video:setVideoMode(800, 600, 0, Flags), S = sdl_video:getSurface(SR), Rs= sdl_video:gl_getAttribute(?SDL_GL_RED_SIZE), Gs= sdl_video:gl_getAttribute(?SDL_GL_GREEN_SIZE), Bs= sdl_video:gl_getAttribute(?SDL_GL_BLUE_SIZE), Ds= sdl_video:gl_getAttribute(?SDL_GL_DEPTH_SIZE), Db= (1 == sdl_video:gl_getAttribute(?SDL_GL_DOUBLEBUFFER)), io:format("OpenGL attributes ~n"), io:format("Sizes in bits Red ~p Green ~p Blue ~p Depth ~p Doublebuffered ~p~n", [Rs, Gs, Bs, Ds, Db]), io:format("Vendor: ~s~n", [gl:getString(?GL_VENDOR)]), io:format("Renderer: ~s~n", [gl:getString(?GL_RENDERER)]), io:format("Version: ~s~n", [gl:getString(?GL_VERSION)]), io:format("GL AUX BUFFERS ~p~n", [gl:getIntegerv(?GL_AUX_BUFFERS)]), io:format("SDL Version ~p~n", [sdl_video:wm_getInfo()]), io:format("Extensions: ~s~n", [gl:getString(?GL_EXTENSIONS)]), io:format("Maximized: ~p~n", [sdl_video:wm_isMaximized()]), io:format("~p", [catch gl:getConvolutionParameterfv(16#8011, 16#801A)]), sdl_events:eventState(?SDL_ALLEVENTS ,?SDL_IGNORE), sdl_events:eventState(?SDL_KEYDOWN ,?SDL_ENABLE), sdl_events:eventState(?SDL_QUIT ,?SDL_ENABLE), sdl_events:eventState(?SDL_VIDEORESIZE, ?SDL_ENABLE), sdl_events:eventState(?SDL_MOUSEMOTION, ?SDL_ENABLE), ?printError(), %% Open font and render some text onto an SDL surface FontSize = S#sdl_surface.w div 40, % scale font with screen height Font = sdl_ttf:openFont(FontFile, FontSize), sdl_ttf:setFontStyle(Font, ?SDL_TTF_STYLE_NORMAL), TextRef = sdl_ttf:renderTextBlended(Font, ?def_text, ?def_fgcolor), Text = sdl_video:getSurface(TextRef), %% Move this onto an OpenGL texture {Texture, MinX, MinY, MaxX, MaxY} = load_texture(Text), sdl_video:freeSurface(TextRef), init_win(S), sdl_util:debug(0), Cube = {{ 0.5, 0.5, -0.5}, { 0.5, -0.5, -0.5}, {-0.5, -0.5, -0.5}, {-0.5, 0.5, -0.5}, {-0.5, 0.5, 0.5}, { 0.5, 0.5, 0.5}, { 0.5, -0.5, 0.5}, {-0.5, -0.5, 0.5}}, Colors = {{ 1.0, 1.0, 0.0}, { 1.0, 0.0, 0.0}, { 0.0, 0.0, 0.0}, { 0.0, 1.0, 0.0}, { 0.0, 1.0, 1.0}, { 1.0, 1.0, 1.0}, { 1.0, 0.0, 1.0}, { 0.0, 0.0, 1.0}}, draw(Cube, Colors, Texture, MinX, MinY, MaxX, MaxY, ((S#sdl_surface.w - Text#sdl_surface.w) div 2), ((S#sdl_surface.h - Text#sdl_surface.h) div 2), Text#sdl_surface.w, Text#sdl_surface.h), sdl_ttf:closeFont(Font), sdl_ttf:quit(), sdl:quit(), ok. init_win(#sdl_surface{w = W, h = H}) -> Ratio = W/H, gl:viewport(0,0,W,H), gl:matrixMode(?GL_PROJECTION), gl:loadIdentity(), gl:ortho( -2.0*Ratio, 2.0*Ratio, -2.0, 2.0, -20.0, 20.0), gl:matrixMode(?GL_MODELVIEW), gl:loadIdentity(), gl:enable(?GL_DEPTH_TEST), gl:depthFunc(?GL_LESS), gl:shadeModel(?GL_SMOOTH), gl:clearColor(0.0,0.0,0.0,1.0). draw(Cube, Colors, Texture, MinX, MinY, MaxX, MaxY, X, Y, W, H) -> gl:clear(?GL_COLOR_BUFFER_BIT bor ?GL_DEPTH_BUFFER_BIT), gl:glBegin(?GL_QUADS), gl:color3fv(element(1, Colors)), gl:vertex3fv(element(1, Cube)), gl:color3fv(element(2, Colors)), gl:vertex3fv(element(2, Cube)), gl:color3fv(element(3, Colors)), gl:vertex3fv(element(3, Cube)), gl:color3fv(element(4, Colors)), gl:vertex3fv(element(4, Cube)), gl:color3fv(element(4, Colors)), gl:vertex3fv(element(4, Cube)), gl:color3fv(element(5, Colors)), gl:vertex3fv(element(5, Cube)), gl:color3fv(element(8, Colors)), gl:vertex3fv(element(8, Cube)), gl:color3fv(element(3, Colors)), gl:vertex3fv(element(3, Cube)), gl:color3fv(element(1, Colors)), gl:vertex3fv(element(1, Cube)), gl:color3fv(element(6, Colors)), gl:vertex3fv(element(6, Cube)), gl:color3fv(element(7, Colors)), gl:vertex3fv(element(7, Cube)), gl:color3fv(element(2, Colors)), gl:vertex3fv(element(2, Cube)), gl:color3fv(element(6, Colors)), gl:vertex3fv(element(6, Cube)), gl:color3fv(element(5, Colors)), gl:vertex3fv(element(5, Cube)), gl:color3fv(element(8, Colors)), gl:vertex3fv(element(8, Cube)), gl:color3fv(element(7, Colors)), gl:vertex3fv(element(7, Cube)), gl:color3fv(element(6, Colors)), gl:vertex3fv(element(6, Cube)), gl:color3fv(element(1, Colors)), gl:vertex3fv(element(1, Cube)), gl:color3fv(element(4, Colors)), gl:vertex3fv(element(4, Cube)), gl:color3fv(element(5, Colors)), gl:vertex3fv(element(5, Cube)), gl:color3fv(element(7, Colors)), gl:vertex3fv(element(7, Cube)), gl:color3fv(element(2, Colors)), gl:vertex3fv(element(2, Cube)), gl:color3fv(element(3, Colors)), gl:vertex3fv(element(3, Cube)), gl:color3fv(element(8, Colors)), gl:vertex3fv(element(8, Cube)), gl:glEnd(), gl:matrixMode(?GL_MODELVIEW), gl:rotatef(0.1, 1.0, 1.0, 1.0), case {gl:getError(), sdl:getError()} of {0, ""} -> ok; {GL, ""} -> io:format("Errors Reported ~p => ~n", [GL]), io:format("~s~n", [glu:errorString(GL)]); {GL, SDL} -> io:format("Errors Reported ~p ~s~n", [GL, SDL]) end, enter_2d_mode(), gl:bindTexture(?GL_TEXTURE_2D, Texture), gl:'begin'(?GL_TRIANGLE_STRIP), gl:texCoord2f(MinX, MinY), gl:vertex2i(X, Y ), gl:texCoord2f(MaxX, MinY), gl:vertex2i(X+W, Y ), gl:texCoord2f(MinX, MaxY), gl:vertex2i(X, Y+H), gl:texCoord2f(MaxX, MaxY), gl:vertex2i(X+W, Y+H), gl:'end'(), leave_2d_mode(), gl:swapBuffers(), case check_event() of ok -> draw(Cube, Colors, Texture, MinX, MinY, MaxX, MaxY, X, Y, W, H); {mouse_moved, MX, MY} -> X2 = MX - W div 2, Y2 = MY - H div 2, draw(Cube, Colors, Texture, MinX, MinY, MaxX, MaxY, X2, Y2, W, H); quit -> ok end. check_event() -> case sdl_events:pollEvent() of #quit{} -> quit; #resize{} -> io:format("Maximized: ~p~n", [sdl_video:wm_isMaximized()]), ok; no_event -> ok; #keyboard{sym=$f} -> Surface = sdl_video:getVideoSurface(), io:format("~p\n", [sdl_video:wm_toggleFullScreen(Surface)]), ok; #keyboard{sym=?SDLK_q} -> quit; #keyboard{sym=?SDLK_ESCAPE} -> quit; #mousemotion{x=MX, y=MY} -> {mouse_moved, MX, MY}; Event -> io:format("Got event ~p~n", [Event]), ok end. load_texture(Surface) -> #sdl_surface{w = SW, h = SH, flags = SFlags} = Surface, #sdl_pixelformat{alpha = SAlpha} = sdl_video:getPixelFormat(Surface), %% Use the surface width and height expanded to powers of 2 W = get_power_of_two_roof(Surface#sdl_surface.w), H = get_power_of_two_roof(Surface#sdl_surface.h), MinX = 0, MinY = 0, MaxX = SW / W, MaxY = SH / H, Image = sdl_video:createRGBsurface(?SDL_SWSURFACE, W, H, _Depth=32, 16#FF000000, % createRGBsurface expects 16#00FF0000, % big endian mask values 16#0000FF00, 16#000000FF), %% Save the alpha blending attributes SavedFlags = SFlags band (?SDL_SRCALPHA bor ?SDL_RLEACCELOK), if (SavedFlags band ?SDL_SRCALPHA) == ?SDL_SRCALPHA -> sdl_video:setAlpha(Surface, 0, 0); true -> ok end, %% Copy the surface into the GL texture image Area = #sdl_rect{x = 0, y = 0, w = SW, h = SH}, sdl_video:blitSurface(Surface, Area, Image, Area), Pixels = sdl_video:getPixels(Image, #sdl_rect{x = 0, y = 0, w = W, h = H}), %% Restore the alpha blending attributes if (SavedFlags band ?SDL_SRCALPHA) == ?SDL_SRCALPHA -> sdl_video:setAlpha(Surface, SavedFlags, SAlpha); true -> ok end, %% Create an OpenGL texture for the image [Texture] = gl:genTextures(1), gl:bindTexture(?GL_TEXTURE_2D, Texture), gl:texParameteri(?GL_TEXTURE_2D, ?GL_TEXTURE_MAG_FILTER, ?GL_NEAREST), gl:texParameteri(?GL_TEXTURE_2D, ?GL_TEXTURE_MIN_FILTER, ?GL_NEAREST), gl:texImage2D(?GL_TEXTURE_2D, 0, ?GL_RGBA, W, H, 0, ?GL_RGBA, ?GL_UNSIGNED_BYTE, Pixels), sdl_video:freeSurface(Image), {Texture, MinX, MinY, MaxX, MaxY}. get_power_of_two_roof(X) -> get_power_of_two_roof_2(1, X). get_power_of_two_roof_2(N, X) when N >= X -> N; get_power_of_two_roof_2(N, X) -> get_power_of_two_roof_2(N*2, X). enter_2d_mode() -> ScreenPtr = sdl_video:getVideoSurface(), Screen = sdl_video:getSurface(ScreenPtr), W = Screen#sdl_surface.w, H = Screen#sdl_surface.h, %% Note, there may be other things you need to change, %% depending on how you have your OpenGL state set up. gl:pushAttrib(?GL_ENABLE_BIT), gl:disable(?GL_DEPTH_TEST), gl:disable(?GL_CULL_FACE), gl:enable(?GL_TEXTURE_2D), %% This allows alpha blending of 2D textures with the scene gl:enable(?GL_BLEND), gl:blendFunc(?GL_SRC_ALPHA, ?GL_ONE_MINUS_SRC_ALPHA), gl:viewport(0, 0, W, H), gl:matrixMode(?GL_PROJECTION), gl:pushMatrix(), gl:loadIdentity(), %% SDL coordinates will be upside-down in the OpenGL world. We'll %% therefore flip the bottom and top coordinates in the orthogonal %% projection to correct this. %% Note: We could flip the texture/image itself, but this will %% also work for mouse coordinates. gl:ortho(0.0, W, H, 0.0, 0.0, 1.0), gl:matrixMode(?GL_MODELVIEW), gl:pushMatrix(), gl:loadIdentity(), gl:texEnvf(?GL_TEXTURE_ENV, ?GL_TEXTURE_ENV_MODE, ?GL_REPLACE). leave_2d_mode() -> gl:matrixMode(?GL_MODELVIEW), gl:popMatrix(), gl:matrixMode(?GL_PROJECTION), gl:popMatrix(), gl:popAttrib(). esdl-1.2/test/test_glimg.erl0000644000076400010400000002622611540750060020053 0ustar familjenAdministratörer%% Copyright (c) 2007 Klas Johansson %% See the file "license.terms" for information on usage and redistribution %% of this file, and for a DISCLAIMER OF ALL WARRANTIES. %% %% $Id$ %% %%%---------------------------------------------------------------------- %%% File : test_glimg.erl %%% Author : Klas Johansson %%% Purpose : Demonstrate the use of SDL_image as OpenGL textures. %%% This is based on testgl.erl (actually test_glfont.erl). %%% Created : 19 Feb 2007 by Klas Johansson %%%---------------------------------------------------------------------- -module(test_glimg). -author('klajo at users.sourceforge.net'). -include("sdl.hrl"). -include("sdl_events.hrl"). -include("sdl_video.hrl"). -include("sdl_keyboard.hrl"). -include_lib("wx/include/gl.hrl"). -export([go/0, go/1]). -define(def_img_file, "erlang-drop-shadow.png"). go() -> go([]). go(Config) -> %% Init sdl:init(?SDL_INIT_VIDEO bor ?SDL_INIT_ERLDRIVER bor ?SDL_INIT_NOPARACHUTE), sdl_util:debug(1), Flags = case lists:member(fullscreen, Config) of true -> ?SDL_OPENGL bor ?SDL_FULLSCREEN; _ -> ?SDL_OPENGL bor ?SDL_RESIZABLE end, sdl_video:gl_setAttribute(?SDL_GL_DOUBLEBUFFER, 1), AvailableWindowedSzs = sdl_video:listModes(null, Flags bor ?SDL_FULLSCREEN), DriverName = sdl_video:videoDriverName(), io:format("Driver ~p ~n", [DriverName]), io:format("Available WindowSizes ~p ~n", [AvailableWindowedSzs]), case AvailableWindowedSzs of [{_, 0,0,W,H}|_] -> Res = [Test || Test <- [32,24,16,15], true == sdl_video:videoModeOK(W,H,Test,Flags)], io:format("A guess at max video res is ~px~p:~p ~n", [W,H, hd(Res)]); _ -> io:format("Can't guess max resolution~n", []) end, SR = sdl_video:setVideoMode(800, 600, 0, Flags), S = sdl_video:getSurface(SR), Rs= sdl_video:gl_getAttribute(?SDL_GL_RED_SIZE), Gs= sdl_video:gl_getAttribute(?SDL_GL_GREEN_SIZE), Bs= sdl_video:gl_getAttribute(?SDL_GL_BLUE_SIZE), Ds= sdl_video:gl_getAttribute(?SDL_GL_DEPTH_SIZE), Db= (1 == sdl_video:gl_getAttribute(?SDL_GL_DOUBLEBUFFER)), io:format("OpenGL attributes ~n"), io:format("Sizes in bits Red ~p Green ~p Blue ~p Depth ~p Doublebuffered ~p~n", [Rs, Gs, Bs, Ds, Db]), io:format("Vendor: ~s~n", [gl:getString(?GL_VENDOR)]), io:format("Renderer: ~s~n", [gl:getString(?GL_RENDERER)]), io:format("Version: ~s~n", [gl:getString(?GL_VERSION)]), io:format("GL AUX BUFFERS ~p~n", [gl:getIntegerv(?GL_AUX_BUFFERS)]), io:format("SDL Version ~p~n", [sdl_video:wm_getInfo()]), io:format("Extensions: ~s~n", [gl:getString(?GL_EXTENSIONS)]), io:format("Maximized: ~p~n", [sdl_video:wm_isMaximized()]), io:format("~p", [catch gl:getConvolutionParameterfv(16#8011, 16#801A)]), sdl_events:eventState(?SDL_ALLEVENTS ,?SDL_IGNORE), sdl_events:eventState(?SDL_KEYDOWN ,?SDL_ENABLE), sdl_events:eventState(?SDL_QUIT ,?SDL_ENABLE), sdl_events:eventState(?SDL_VIDEORESIZE, ?SDL_ENABLE), sdl_events:eventState(?SDL_MOUSEMOTION, ?SDL_ENABLE), ?printError(), %% Open image and draw it onto an SDL surface ImgRef = sdl_img:load(?def_img_file), Img = sdl_video:getSurface(ImgRef), %% Move this onto an OpenGL texture {Texture, MinX, MinY, MaxX, MaxY} = load_texture(Img), sdl_video:freeSurface(ImgRef), init_win(S), sdl_util:debug(0), Cube = {{ 0.5, 0.5, -0.5}, { 0.5, -0.5, -0.5}, {-0.5, -0.5, -0.5}, {-0.5, 0.5, -0.5}, {-0.5, 0.5, 0.5}, { 0.5, 0.5, 0.5}, { 0.5, -0.5, 0.5}, {-0.5, -0.5, 0.5}}, Colors = {{ 1.0, 1.0, 0.0}, { 1.0, 0.0, 0.0}, { 0.0, 0.0, 0.0}, { 0.0, 1.0, 0.0}, { 0.0, 1.0, 1.0}, { 1.0, 1.0, 1.0}, { 1.0, 0.0, 1.0}, { 0.0, 0.0, 1.0}}, draw(Cube, Colors, Texture, MinX, MinY, MaxX, MaxY, ((S#sdl_surface.w - Img#sdl_surface.w) div 2), ((S#sdl_surface.h - Img#sdl_surface.h) div 2), Img#sdl_surface.w, Img#sdl_surface.h), sdl:quit(), ok. init_win(#sdl_surface{w = W, h = H}) -> Ratio = W/H, gl:viewport(0,0,W,H), gl:matrixMode(?GL_PROJECTION), gl:loadIdentity(), gl:ortho( -2.0*Ratio, 2.0*Ratio, -2.0, 2.0, -20.0, 20.0), gl:matrixMode(?GL_MODELVIEW), gl:loadIdentity(), gl:enable(?GL_DEPTH_TEST), gl:depthFunc(?GL_LESS), gl:shadeModel(?GL_SMOOTH), gl:clearColor(1.0,1.0,1.0,1.0). draw(Cube, Colors, Texture, MinX, MinY, MaxX, MaxY, X, Y, W, H) -> gl:clear(?GL_COLOR_BUFFER_BIT bor ?GL_DEPTH_BUFFER_BIT), gl:glBegin(?GL_QUADS), gl:color3fv(element(1, Colors)), gl:vertex3fv(element(1, Cube)), gl:color3fv(element(2, Colors)), gl:vertex3fv(element(2, Cube)), gl:color3fv(element(3, Colors)), gl:vertex3fv(element(3, Cube)), gl:color3fv(element(4, Colors)), gl:vertex3fv(element(4, Cube)), gl:color3fv(element(4, Colors)), gl:vertex3fv(element(4, Cube)), gl:color3fv(element(5, Colors)), gl:vertex3fv(element(5, Cube)), gl:color3fv(element(8, Colors)), gl:vertex3fv(element(8, Cube)), gl:color3fv(element(3, Colors)), gl:vertex3fv(element(3, Cube)), gl:color3fv(element(1, Colors)), gl:vertex3fv(element(1, Cube)), gl:color3fv(element(6, Colors)), gl:vertex3fv(element(6, Cube)), gl:color3fv(element(7, Colors)), gl:vertex3fv(element(7, Cube)), gl:color3fv(element(2, Colors)), gl:vertex3fv(element(2, Cube)), gl:color3fv(element(6, Colors)), gl:vertex3fv(element(6, Cube)), gl:color3fv(element(5, Colors)), gl:vertex3fv(element(5, Cube)), gl:color3fv(element(8, Colors)), gl:vertex3fv(element(8, Cube)), gl:color3fv(element(7, Colors)), gl:vertex3fv(element(7, Cube)), gl:color3fv(element(6, Colors)), gl:vertex3fv(element(6, Cube)), gl:color3fv(element(1, Colors)), gl:vertex3fv(element(1, Cube)), gl:color3fv(element(4, Colors)), gl:vertex3fv(element(4, Cube)), gl:color3fv(element(5, Colors)), gl:vertex3fv(element(5, Cube)), gl:color3fv(element(7, Colors)), gl:vertex3fv(element(7, Cube)), gl:color3fv(element(2, Colors)), gl:vertex3fv(element(2, Cube)), gl:color3fv(element(3, Colors)), gl:vertex3fv(element(3, Cube)), gl:color3fv(element(8, Colors)), gl:vertex3fv(element(8, Cube)), gl:glEnd(), gl:matrixMode(?GL_MODELVIEW), gl:rotatef(0.1, 1.0, 1.0, 1.0), case {gl:getError(), sdl:getError()} of {0, ""} -> ok; {GL, ""} -> io:format("Errors Reported ~p => ~n", [GL]), io:format("~s~n", [glu:errorString(GL)]); {GL, SDL} -> io:format("Errors Reported ~p ~s~n", [GL, SDL]) end, enter_2d_mode(), gl:bindTexture(?GL_TEXTURE_2D, Texture), gl:'begin'(?GL_TRIANGLE_STRIP), gl:texCoord2f(MinX, MinY), gl:vertex2i(X, Y ), gl:texCoord2f(MaxX, MinY), gl:vertex2i(X+W, Y ), gl:texCoord2f(MinX, MaxY), gl:vertex2i(X, Y+H), gl:texCoord2f(MaxX, MaxY), gl:vertex2i(X+W, Y+H), gl:'end'(), leave_2d_mode(), gl:swapBuffers(), case check_event() of ok -> draw(Cube, Colors, Texture, MinX, MinY, MaxX, MaxY, X, Y, W, H); {mouse_moved, MX, MY} -> X2 = MX - W div 2, Y2 = MY - H div 2, draw(Cube, Colors, Texture, MinX, MinY, MaxX, MaxY, X2, Y2, W, H); quit -> ok end. check_event() -> case sdl_events:pollEvent() of #quit{} -> quit; #resize{} -> io:format("Maximized: ~p~n", [sdl_video:wm_isMaximized()]), ok; no_event -> ok; #keyboard{sym=$f} -> Surface = sdl_video:getVideoSurface(), io:format("~p\n", [sdl_video:wm_toggleFullScreen(Surface)]), ok; #keyboard{sym=?SDLK_q} -> quit; #keyboard{sym=?SDLK_ESCAPE} -> quit; #mousemotion{x=MX, y=MY} -> {mouse_moved, MX, MY}; Event -> io:format("Got event ~p~n", [Event]), ok end. load_texture(Surface) -> #sdl_surface{w = SW, h = SH, flags = SFlags} = Surface, #sdl_pixelformat{alpha = SAlpha} = sdl_video:getPixelFormat(Surface), %% Use the surface width and height expanded to powers of 2 W = get_power_of_two_roof(Surface#sdl_surface.w), H = get_power_of_two_roof(Surface#sdl_surface.h), MinX = 0, MinY = 0, MaxX = SW / W, MaxY = SH / H, Image = sdl_video:createRGBsurface(?SDL_SWSURFACE, W, H, _Depth=32, 16#FF000000, % createRGBsurface expects 16#00FF0000, % big endian mask values 16#0000FF00, 16#000000FF), %% Save the alpha blending attributes SavedFlags = SFlags band (?SDL_SRCALPHA bor ?SDL_RLEACCELOK), if (SavedFlags band ?SDL_SRCALPHA) == ?SDL_SRCALPHA -> sdl_video:setAlpha(Surface, 0, 0); true -> ok end, %% Copy the surface into the GL texture image Area = #sdl_rect{x = 0, y = 0, w = SW, h = SH}, sdl_video:blitSurface(Surface, Area, Image, Area), Pixels = sdl_video:getPixels(Image, #sdl_rect{x = 0, y = 0, w = W, h = H}), %% Restore the alpha blending attributes if (SavedFlags band ?SDL_SRCALPHA) == ?SDL_SRCALPHA -> sdl_video:setAlpha(Surface, SavedFlags, SAlpha); true -> ok end, %% Create an OpenGL texture for the image [Texture] = gl:genTextures(1), gl:bindTexture(?GL_TEXTURE_2D, Texture), gl:texParameteri(?GL_TEXTURE_2D, ?GL_TEXTURE_MAG_FILTER, ?GL_NEAREST), gl:texParameteri(?GL_TEXTURE_2D, ?GL_TEXTURE_MIN_FILTER, ?GL_NEAREST), gl:texImage2D(?GL_TEXTURE_2D, 0, ?GL_RGBA, W, H, 0, ?GL_RGBA, ?GL_UNSIGNED_BYTE, Pixels), sdl_video:freeSurface(Image), {Texture, MinX, MinY, MaxX, MaxY}. get_power_of_two_roof(X) -> get_power_of_two_roof_2(1, X). get_power_of_two_roof_2(N, X) when N >= X -> N; get_power_of_two_roof_2(N, X) -> get_power_of_two_roof_2(N*2, X). enter_2d_mode() -> ScreenPtr = sdl_video:getVideoSurface(), Screen = sdl_video:getSurface(ScreenPtr), W = Screen#sdl_surface.w, H = Screen#sdl_surface.h, %% Note, there may be other things you need to change, %% depending on how you have your OpenGL state set up. gl:pushAttrib(?GL_ENABLE_BIT), gl:disable(?GL_DEPTH_TEST), gl:disable(?GL_CULL_FACE), gl:enable(?GL_TEXTURE_2D), %% This allows alpha blending of 2D textures with the scene gl:enable(?GL_BLEND), gl:blendFunc(?GL_SRC_ALPHA, ?GL_ONE_MINUS_SRC_ALPHA), gl:viewport(0, 0, W, H), gl:matrixMode(?GL_PROJECTION), gl:pushMatrix(), gl:loadIdentity(), %% SDL coordinates will be upside-down in the OpenGL world. We'll %% therefore flip the bottom and top coordinates in the orthogonal %% projection to correct this. %% Note: We could flip the texture/image itself, but this will %% also work for mouse coordinates. gl:ortho(0.0, W, H, 0.0, 0.0, 1.0), gl:matrixMode(?GL_MODELVIEW), gl:pushMatrix(), gl:loadIdentity(), gl:texEnvf(?GL_TEXTURE_ENV, ?GL_TEXTURE_ENV_MODE, ?GL_REPLACE). leave_2d_mode() -> gl:matrixMode(?GL_MODELVIEW), gl:popMatrix(), gl:matrixMode(?GL_PROJECTION), gl:popMatrix(), gl:popAttrib(). esdl-1.2/test/test_ttf.erl0000644000076400010400000001524511540750060017550 0ustar familjenAdministratörer%% Copyright (c) 2007 Klas Johansson %% See the file "license.terms" for information on usage and redistribution %% of this file, and for a DISCLAIMER OF ALL WARRANTIES. %% %% $Id$ %% %%%---------------------------------------------------------------------- %%% File : test_ttf.erl %%% Author : Klas Johansson %%% Purpose : Testing; this code test various functions of the sdl_ttf API. %%% Created : 29 Jan 2007 by Klas Johansson %%%---------------------------------------------------------------------- -module(test_ttf). -author('klajo at users.sourceforge.net'). -compile(export_all). -include("sdl.hrl"). -include("sdl_events.hrl"). -include("sdl_video.hrl"). -include("sdl_keyboard.hrl"). -include("sdl_ttf.hrl"). go(FontFile, FontSize) -> go(FontFile, FontSize, []). go(FontFile, FontSize, Config) -> FontStyle = ?SDL_TTF_STYLE_NORMAL, FgColor = #sdl_color{r=0,g=153,b=255}, BgColor = #sdl_color{r=0,g=0,b=0}, TextStr = "The quick brown fox jumped over the lazy dog", Utf8Str = "The quick brown fox jumped over the lazy dog", UnicodeStr = "If you have a compatible font you'll see a Unicode fi-ligature here: " ++ [16#fb01], %% initialization sdl:init(?SDL_INIT_VIDEO), sdl_ttf:init(), sdl_util:debug(1), listen_to_keypress_events(), 1 = sdl_ttf:wasInit(), Flags = case lists:member(fullscreen, Config) of true -> ?SDL_ANYFORMAT bor ?SDL_FULLSCREEN bor ?SDL_RESIZABLE; _ -> ?SDL_ANYFORMAT bor ?SDL_RESIZABLE end, ScreenRef = sdl_video:setVideoMode(640, 480, 8, Flags), Screen = sdl_video:getSurface(ScreenRef), %% non-existing font {'EXIT', _} = (catch sdl_ttf:openFont("/tmp/no-such-font.ttf", 18)), [_|_] = sdl_ttf:getError(), %% the user-specified font F = case (catch sdl_ttf:openFont(FontFile, FontSize)) of {'EXIT', {openFont, returned_null_pointer}} -> exit({error, {failed_to_open_font, sdl_ttf:getError()}}); F0 -> F0 end, %% run the getters (and a couple of setters) io:format("Vsn=~p~n", [sdl_ttf:linkedVersion()]), sdl_ttf:byteSwappedUNICODE(0), sdl_ttf:setFontStyle(F, FontStyle), io:format("getFontStyle=0x~.16b~n", [sdl_ttf:getFontStyle(F)]), io:format("fontHeight=~p~n", [sdl_ttf:fontHeight(F)]), io:format("fontAscent=~p~n", [sdl_ttf:fontAscent(F)]), io:format("fontDescent=~p~n", [sdl_ttf:fontDescent(F)]), io:format("fontLineSkip=~p~n", [sdl_ttf:fontLineSkip(F)]), io:format("fontFaces=~p~n", [sdl_ttf:fontFaces(F)]), io:format("fontFaceIsFixedWidth=~p~n",[sdl_ttf:fontFaceIsFixedWidth(F)]), io:format("fontFaceFamilyName=~p~n", [sdl_ttf:fontFaceFamilyName(F)]), io:format("fontFaceStyleName=~p~n", [sdl_ttf:fontFaceStyleName(F)]), io:format("glyphMetrics=~p~n", [sdl_ttf:glyphMetrics(F, $A)]), io:format("sizeText=~p~n", [sdl_ttf:sizeText(F, "abcd")]), io:format("sizeUTF8=~p~n", [sdl_ttf:sizeUTF8(F, "abcd")]), io:format("sizeUNICODE=~p~n", [sdl_ttf:sizeUNICODE(F, "abcd")]), %% draw some text print_at(Screen, F, TextStr, FgColor, BgColor, latin1, solid, 10, 10), print_at(Screen, F, Utf8Str, FgColor, BgColor, utf8, shaded, 20, 40), print_at(Screen, F, UnicodeStr, FgColor, BgColor, unicode, shaded, 30, 70), %% quit at keypress await_keypress(), sdl_ttf:closeFont(F), sdl:quit(). print_at(Screen, Font, TextStr, FgColor, BgColor, TextEnc, RenderMode, X, Y)-> TextRef = mk_text_surface(Font,TextStr,FgColor,BgColor,TextEnc,RenderMode), Text = sdl_video:getSurface(TextRef), blit_text(Screen, Text, BgColor, X, Y), %% save an image containing the text, just for fun sdl_video:saveBMP(Text, "/tmp/sdl-ttf-test.bmp"), %% set the text free :-) sdl_video:freeSurface(Text). mk_text_surface(Font, TextStr, FgColor, BgColor, TextEnc, RenderMode) -> TextRef = render_text(Font,TextStr,FgColor,BgColor,TextEnc,RenderMode), Text = sdl_video:getSurface(TextRef), PFmt = sdl_video:getPixelFormat(TextRef), case PFmt#sdl_pixelformat.palette of null -> io:format("No Palette found ~n"), ignore; _Palette -> <> = sdl_video:getPixels(Text, #sdl_rect{x = 0, y = 0, w = 1, h = 1}), io:format("Palette found set key ~p to transparent ~n", [Pixel]), true = sdl_video:setColorKey(Text, ?SDL_SRCCOLORKEY bor ?SDL_RLEACCEL, Pixel) end, case sdl_video:displayFormat(Text) of null -> sdl_video:freeSurface(Text), io:format("Failed to convert background~n"), exit({error, convert_failed}); ConvS -> sdl_video:freeSurface(Text), ConvS end. render_text(Font, Text, FgColor, _BgColor, latin1, solid) -> sdl_ttf:renderTextSolid(Font, Text, FgColor); render_text(Font, Text, FgColor, BgColor, latin1, shaded) -> sdl_ttf:renderTextShaded(Font, Text, FgColor, BgColor); render_text(Font, Text, FgColor, _BgColor, latin1, blended) -> sdl_ttf:renderTextBlended(Font, Text, FgColor); render_text(Font, Text, FgColor, _BgColor, utf8, solid) -> sdl_ttf:renderUTF8Solid(Font, Text, FgColor); render_text(Font, Text, FgColor, BgColor, utf8, shaded) -> sdl_ttf:renderUTF8Shaded(Font, Text, FgColor, BgColor); render_text(Font, Text, FgColor, _BgColor, utf8, blended) -> sdl_ttf:renderUTF8Blended(Font, Text, FgColor); render_text(Font, Text, FgColor, _BgColor, unicode, solid) -> sdl_ttf:renderUNICODESolid(Font, Text, FgColor); render_text(Font, Text, FgColor, BgColor, unicode, shaded) -> sdl_ttf:renderUNICODEShaded(Font, Text, FgColor, BgColor); render_text(Font, Text, FgColor, _BgColor, unicode, blended) -> sdl_ttf:renderUNICODEBlended(Font, Text, FgColor). blit_text(Screen, Text, BgColor, X, Y) -> Background = sdl_video:mapRGB(Screen, BgColor#sdl_color.r, BgColor#sdl_color.g, BgColor#sdl_color.b), Rect = #sdl_rect{x = X, y = Y, w = Text#sdl_surface.w, h = Text#sdl_surface.h}, true = sdl_video:fillRect(Screen, null, Background), {null, ClippedRect} = sdl_video:blitSurface(Text, null, Screen, Rect), sdl_video:updateRects(Screen, [ClippedRect]), sdl_video:getSurface(Text). listen_to_keypress_events() -> sdl_events:eventState(?SDL_ALLEVENTS ,?SDL_IGNORE), sdl_events:eventState(?SDL_KEYDOWN ,?SDL_ENABLE), sdl_events:eventState(?SDL_QUIT ,?SDL_ENABLE), ?printError(). await_keypress() -> sdl_events:waitEvent(). esdl-1.2/vsn.mk0000644000076400010400000000002211540750057015361 0ustar familjenAdministratörerESDL_VSN=esdl-1.2