From 50e48e3740e8bdd296fbb6c858c0d215adf515b7 Mon Sep 17 00:00:00 2001 From: g-cont Date: Mon, 22 Nov 2010 00:00:00 +0300 Subject: [PATCH] 22 Nov 2010 --- backup.lst | 1 - cl_dll/cl_dll.h | 1 - common/com_model.h | 252 ++++++++++------ engine/client/cl_beam.c | 4 +- engine/client/cl_demo.c | 44 +-- engine/client/cl_game.c | 5 +- engine/client/cl_main.c | 11 +- engine/client/cl_scrn.c | 13 +- engine/client/cl_studio.c | 1 - engine/client/sound/s_load.c | 1 - engine/client/sound/s_main.c | 4 +- engine/client/sound/s_mix.c | 1 - engine/client/sound/s_stream.c | 1 - engine/common/avikit.c | 1 - engine/common/cm_local.h | 22 +- engine/common/cm_test.c | 186 ------------ engine/common/con_utils.c | 29 +- engine/common/console.c | 13 +- engine/common/engfuncs.c | 1 - engine/common/host.c | 4 +- engine/common/infostring.c | 1 - engine/common/{cm_model.c => model.c} | 332 ++++++++++++++++------ engine/common/net_buffer.c | 13 + engine/common/net_buffer.h | 1 + engine/common/net_chan.c | 1 - engine/common/net_encode.c | 1 - engine/common/pm_studio.c | 8 +- engine/common/pm_surface.c | 16 +- engine/common/{cm_portals.c => portals.c} | 8 +- engine/engine.dsp | 8 +- engine/server/sv_cmds.c | 3 +- engine/server/sv_game.c | 47 ++- engine/server/sv_studio.c | 4 +- engine/server/sv_world.c | 44 +-- engine/studio.h | 5 +- launch/crclib.c | 15 +- launch/filesystem.c | 38 +-- launch/hpak.c | 27 +- launch/imagelib/imagelib.h | 1 - launch/imagelib/img_bmp.c | 28 +- launch/imagelib/img_dds.c | 23 +- launch/imagelib/img_pcx.c | 32 +-- launch/imagelib/img_tga.c | 8 +- launch/imagelib/img_utils.c | 62 ++-- launch/imagelib/img_vtf.c | 42 +-- launch/imagelib/img_wad.c | 80 +++--- launch/imagelib/{jpg.lib => jpeg.lib} | Bin launch/launch.dsp | 8 +- launch/network.c | 2 - launch/soundlib/ogg.lib | Bin 27254 -> 0 bytes launch/soundlib/snd_ogg.c | 4 +- launch/soundlib/snd_utils.c | 58 +--- launch/soundlib/snd_wav.c | 11 +- launch/soundlib/soundlib.h | 6 - launch/soundlib/vorbis.lib | Bin 266902 -> 0 bytes launch/tools/conv_bsp.c | 26 +- launch/tools/conv_sprite.c | 67 +++-- launch/tools/spritegen.c | 20 +- launch/tools/wadlib.c | 13 +- public/byteorder.h | 169 ----------- public/engine_api.h | 20 -- public/launch_api.h | 20 ++ launchers.bat => utils/launchers.bat | 1 - vid_gl/r_image.c | 13 +- vid_gl/r_model.c | 92 +++--- vid_gl/r_sprite.c | 50 ++-- vid_gl/r_studio.c | 11 +- 67 files changed, 892 insertions(+), 1142 deletions(-) rename engine/common/{cm_model.c => model.c} (77%) rename engine/common/{cm_portals.c => portals.c} (92%) rename launch/imagelib/{jpg.lib => jpeg.lib} (100%) delete mode 100644 launch/soundlib/ogg.lib delete mode 100644 launch/soundlib/vorbis.lib delete mode 100644 public/byteorder.h rename launchers.bat => utils/launchers.bat (79%) diff --git a/backup.lst b/backup.lst index 01e91a8a..3fdfb895 100644 --- a/backup.lst +++ b/backup.lst @@ -9,7 +9,6 @@ debug.bat backup.lst backup.bat release.bat -launchers.bat change.log cl_dll\ diff --git a/cl_dll/cl_dll.h b/cl_dll/cl_dll.h index e2b594d1..2bb3d1ac 100644 --- a/cl_dll/cl_dll.h +++ b/cl_dll/cl_dll.h @@ -28,7 +28,6 @@ typedef unsigned char byte; typedef unsigned short word; typedef float vec_t; -typedef vec_t vec4_t[4]; typedef int (*pfnUserMsgHook)(const char *pszName, int iSize, void *pbuf); #include "util_vector.h" diff --git a/common/com_model.h b/common/com_model.h index 9e4cd67d..f072d839 100644 --- a/common/com_model.h +++ b/common/com_model.h @@ -19,9 +19,13 @@ // surface flags #define SURF_PLANEBACK BIT( 0 ) -#define CONTENTS_NODE 1 // fake contents to determine nodes #define ZISCALE ((float)0x8000) +#define MIPLEVELS 4 +#define VERTEXSIZE 7 +#define MAXLIGHTMAPS 4 +#define NUM_AMBIENTS 4 // automatic ambient sounds + // model types typedef enum { @@ -32,14 +36,6 @@ typedef enum mod_studio } modtype_t; -typedef struct alight_s -{ - int ambientlight; // clip at 128 - int shadelight; // clip at 192 - ambientlight - vec3_t color; - float *plightvec; -} alight_t; - typedef struct mplane_s { vec3_t normal; @@ -49,6 +45,137 @@ typedef struct mplane_s byte pad[2]; } mplane_t; +typedef struct +{ + vec3_t position; +} mvertex_t; + +typedef struct +{ + unsigned short v[2]; + unsigned int cachededgeoffset; +} medge_t; + +typedef struct texture_s +{ + char name[16]; + unsigned int width, height; + int gl_texturenum; + struct msurface_s *texturechain; // for gl_texsort drawing + int anim_total; // total tenths in sequence ( 0 = no) + int anim_min, anim_max; // time for this frame min <=time< max + struct texture_s *anim_next; // in the animation sequence + struct texture_s *alternate_anims; // bmodels in frmae 1 use these + unsigned int offsets[MIPLEVELS]; // four mip maps stored +} texture_t; + +typedef struct +{ + float vecs[2][4]; // [s/t] unit vectors in world space. + // [i][3] is the s/t offset relative to the origin. + // s or t = dot(3Dpoint,vecs[i])+vecs[i][3] + float mipadjust; // mipmap limits for very small surfaces + texture_t *texture; + int flags; // sky or slime, no lightmap or 256 subdivision +} mtexinfo_t; + +typedef struct glpoly_s +{ + struct glpoly_s *next; + struct glpoly_s *chain; + int numverts; + int flags; // for SURF_UNDERWATER + float verts[4][VERTEXSIZE]; // variable sized (xyz s1t1 s2t2) +} glpoly_t; + +typedef struct mnode_s +{ +// common with leaf + int contents; // 0, to differentiate from leafs + int visframe; // node needs to be traversed if current + + float minmaxs[6]; // for bounding box culling + struct mnode_s *parent; + +// node specific + mplane_t *plane; + struct mnode_s *children[2]; + + unsigned short firstsurface; + unsigned short numsurfaces; +} mnode_t; + +typedef struct msurface_s msurface_t; +typedef struct decal_s decal_t; + +// JAY: Compress this as much as possible +struct decal_s +{ + decal_t *pnext; // linked list for each surface + msurface_t *psurface; // Surface id for persistence / unlinking + short dx; // Offsets into surface texture + short dy; // (in texture coordinates, so we don't need floats) + short texture; // Decal texture + byte scale; // Pixel scale + byte flags; // Decal flags + + short entityIndex; // Entity this is attached to +}; + +typedef struct mleaf_s +{ +// common with node + int contents; + int visframe; // node needs to be traversed if current + + float minmaxs[6]; // for bounding box culling + + struct mnode_s *parent; +// leaf specific + byte *visdata; // decompressed visdata after loading + byte *pasdata; // decompressed pasdata after loading (was efrags) + + msurface_t **firstmarksurface; + int nummarksurfaces; + int key; // BSP sequence number for leaf's contents + byte ambient_sound_level[NUM_AMBIENTS]; + +} mleaf_t; + +typedef struct msurface_s +{ + int visframe; // should be drawn when node is crossed + + mplane_t *plane; // pointer to shared plane + int flags; // see SURF_ #defines + + int firstedge; // look up in model->surfedges[], negative numbers + int numedges; // are backwards edges + + short texturemins[2]; + short extents[2]; + + int light_s, light_t; // gl lightmap coordinates + + glpoly_t *polys; // multiple if warped + struct msurface_s *texturechain; + + mtexinfo_t *texinfo; + + // lighting info + int dlightframe; // last frame the surface was checked by an animated light + int dlightbits; // dynamically generated. Indicates if the surface illumination + // is modified by an animated light. + + int lightmaptexturenum; + byte styles[MAXLIGHTMAPS]; + int cached_light[MAXLIGHTMAPS]; // values currently used in lightmap + qboolean cached_dlight; // true if dynamic light in cache + + color24 *samples; // note: this is the actual lightmap data for this surface + decal_t *pdecals; +} msurface_t; + typedef struct hull_s { dclipnode_t *clipnodes; @@ -59,72 +186,13 @@ typedef struct hull_s vec3_t clip_maxs; } hull_t; -typedef struct +#ifndef CACHE_USER +#define CACHE_USER +typedef struct cache_user_s { - char name[16]; - int contents; - - // put here info about fog color and density ? -} mtexture_t; - -typedef struct -{ - float vecs[2][4]; - mtexture_t *texture; - int flags; // texture flags -} mtexinfo_t; - -typedef struct msurface_s -{ - mplane_t *plane; // pointer to shared plane - int flags; // see SURF_ #defines - - int firstedge; // look up in model->surfedges[], negative numbers - int numedges; // are backwards edges - - mtexinfo_t *texinfo; - - short texturemins[2]; - short extents[2]; - - // lighting info - byte *samples; // [numstyles*surfsize] - int numstyles; - byte styles[4]; // index into d_lightstylevalue[] for animated lights - // no one surface can be effected by more than 4 - // animated lights. -} msurface_t; - -typedef struct mleaf_s -{ -// common with node - int contents; - struct mnode_s *parent; - mplane_t *plane; // always == NULL - -// leaf specific - byte *visdata; // decompressed visdata after loading - byte *pasdata; // decompressed pasdata after loading - byte ambient_sound_level[NUM_AMBIENTS]; - struct efrag_s *efrags; - - msurface_t **firstmarksurface; - int nummarksurfaces; -} mleaf_t; - -typedef struct mnode_s -{ -// common with leaf - int contents; // CONTENTS_NODE, to differentiate from leafs - struct mnode_s *parent; - mplane_t *plane; // always != NULL - -// node specific - struct mnode_s *children[2]; - - msurface_t *firstface; // used for grab lighting info, decals etc - unsigned int numfaces; -} mnode_t; + void *data; // extradata +} cache_user_t; +#endif typedef struct model_s { @@ -136,8 +204,13 @@ typedef struct model_s int numframes; // sprite's framecount byte *mempool; // private mempool (was synctype) int flags; // hl compatibility - vec3_t mins, maxs; // bounding box at angles '0 0 0' +// +// volume occupied by the model +// + vec3_t mins, maxs; // bounding box at angles '0 0 0' + float radius; + // brush model int firstmodelsurface; int nummodelsurfaces; @@ -152,10 +225,10 @@ typedef struct model_s mleaf_t *leafs; int numvertexes; - vec3_t *vertexes; + mvertex_t *vertexes; int numedges; - dedge_t *edges; + medge_t *edges; int numnodes; mnode_t *nodes; @@ -178,12 +251,31 @@ typedef struct model_s hull_t hulls[MAX_MAP_HULLS]; int numtextures; - mtexture_t **textures; + texture_t **textures; - byte *lightdata; // for GetEntityIllum - byte *extradata; // models extradata + byte *visdata; + color24 *lightdata; char *entities; +// +// additional model data +// + cache_user_t cache; // only access through Mod_Extradata } model_t; +typedef vec_t vec4_t[4]; + +typedef struct alight_s +{ + int ambientlight; // clip at 128 + int shadelight; // clip at 192 - ambientlight + vec3_t color; + float *plightvec; +} alight_t; + +typedef struct auxvert_s +{ + float fv[3]; // viewspace x, y +} auxvert_t; + #endif//COM_MODEL_H \ No newline at end of file diff --git a/engine/client/cl_beam.c b/engine/client/cl_beam.c index fec83fd6..9cb83b7c 100644 --- a/engine/client/cl_beam.c +++ b/engine/client/cl_beam.c @@ -555,7 +555,7 @@ void CL_DrawRing( int modelIndex, float frame, int rendermode, const vec3_t sour VectorSubtract( center, last1, screen ); // Is that box in PVS && frustum? - if( !CM_BoxVisible( screen, tmp, re->GetCurrentVis( )) || re->CullBox( screen, tmp )) + if( !Mod_BoxVisible( screen, tmp, re->GetCurrentVis( )) || re->CullBox( screen, tmp )) { return; } @@ -1083,7 +1083,7 @@ qboolean CL_CullBeam( const vec3_t start, const vec3_t end, qboolean pvsOnly ) } // check bbox - if( CM_BoxVisible( mins, maxs, re->GetCurrentVis( ))) + if( Mod_BoxVisible( mins, maxs, re->GetCurrentVis( ))) { if( pvsOnly || !re->CullBox( mins, maxs )) { diff --git a/engine/client/cl_demo.c b/engine/client/cl_demo.c index 637d297f..21dce290 100644 --- a/engine/client/cl_demo.c +++ b/engine/client/cl_demo.c @@ -5,7 +5,6 @@ #include "common.h" #include "client.h" -#include "byteorder.h" #include "net_encode.h" #define dem_cmd 0 @@ -26,7 +25,7 @@ void CL_WriteDemoCmd( usercmd_t *pcmd ) usercmd_t cmd; byte c; - fl = LittleFloat(( float )host.realtime ); + fl = ( float )host.realtime; FS_Write( cls.demofile, &fl, sizeof( fl )); c = dem_cmd; @@ -34,32 +33,11 @@ void CL_WriteDemoCmd( usercmd_t *pcmd ) // correct for byte order, bytes don't matter cmd = *pcmd; - - cmd.lerp_msec = LittleShort( cmd.lerp_msec ); - cmd.msec = LittleLong( cmd.msec ); - - // byte order stuff - for( i = 0; i < 3; i++ ) - cmd.viewangles[i] = LittleFloat( cmd.viewangles[i] ); - - cmd.forwardmove = LittleFloat( cmd.forwardmove ); - cmd.sidemove = LittleFloat( cmd.sidemove ); - cmd.upmove = LittleFloat( cmd.upmove ); - cmd.lightlevel = LittleLong( cmd.lightlevel ); - cmd.buttons = LittleLong( cmd.buttons ); - cmd.impulse = LittleLong( cmd.impulse ); - cmd.weaponselect = LittleLong( cmd.weaponselect ); - cmd.impact_index = LittleLong( cmd.impact_index ); - - cmd.impact_position[0] = LittleFloat( cmd.impact_position[0] ); - cmd.impact_position[1] = LittleFloat( cmd.impact_position[1] ); - cmd.impact_position[2] = LittleFloat( cmd.impact_position[2] ); - FS_Write( cls.demofile, &cmd, sizeof( cmd )); for( i = 0; i < 3; i++ ) { - fl = LittleFloat( cl.refdef.cl_viewangles[i] ); + fl = cl.refdef.cl_viewangles[i]; FS_Write( cls.demofile, &fl, sizeof( fl )); } } @@ -73,19 +51,18 @@ Dumps the current net message, prefixed by the length */ void CL_WriteDemoMessage( sizebuf_t *msg, int head_size ) { - int len, swlen; + int swlen; if( !cls.demofile ) return; if( cl.refdef.paused || cls.key_dest == key_menu ) return; // the first eight bytes are just packet sequencing stuff - len = BF_GetNumBytesWritten( msg ) - head_size; - swlen = LittleLong( len ); + swlen = BF_GetNumBytesWritten( msg ) - head_size; if( !swlen ) return; // ignore null messages FS_Write( cls.demofile, &swlen, 4 ); - FS_Write( cls.demofile, BF_GetData( msg ) + head_size, len ); + FS_Write( cls.demofile, BF_GetData( msg ) + head_size, swlen ); } void CL_WriteDemoHeader( const char *name ) @@ -136,7 +113,7 @@ void CL_WriteDemoHeader( const char *name ) if( BF_GetNumBytesWritten( &buf ) > ( BF_GetMaxBytes( &buf ) / 2 )) { // write it out - len = LittleLong( BF_GetNumBytesWritten( &buf )); + len = BF_GetNumBytesWritten( &buf ); FS_Write( cls.demofile, &len, 4 ); FS_Write( cls.demofile, BF_GetData( &buf ), len ); BF_Clear( &buf ); @@ -157,7 +134,7 @@ void CL_WriteDemoHeader( const char *name ) if( BF_GetNumBytesWritten( &buf ) > ( BF_GetMaxBytes( &buf ) / 2 )) { // write it out - len = LittleLong( BF_GetNumBytesWritten( &buf )); + len = BF_GetNumBytesWritten( &buf ); FS_Write( cls.demofile, &len, 4 ); FS_Write( cls.demofile, BF_GetData( &buf ), len ); BF_Clear( &buf ); @@ -183,7 +160,7 @@ void CL_WriteDemoHeader( const char *name ) if( BF_GetNumBytesWritten( &buf ) > ( BF_GetMaxBytes( &buf ) / 2 )) { // write it out - len = LittleLong( BF_GetNumBytesWritten( &buf )); + len = BF_GetNumBytesWritten( &buf ); FS_Write( cls.demofile, &len, 4 ); FS_Write( cls.demofile, BF_GetData( &buf ), len ); BF_Clear( &buf ); @@ -216,7 +193,7 @@ void CL_WriteDemoHeader( const char *name ) MSG_WriteDeltaMovevars( &buf, &nullmovevars, &clgame.movevars ); // write it to the demo file - len = LittleLong( BF_GetNumBytesWritten( &buf )); + len = BF_GetNumBytesWritten( &buf ); FS_Write( cls.demofile, &len, 4 ); FS_Write( cls.demofile, BF_GetData( &buf ), len ); @@ -336,7 +313,6 @@ void CL_ReadDemoMessage( void ) return; } - curSize = LittleLong( curSize ); if( curSize == -1 ) { CL_DemoCompleted(); @@ -437,8 +413,6 @@ qboolean CL_GetComment( const char *demoname, char *comment ) return false; } - curSize = LittleLong( curSize ); - if( curSize == -1 ) { FS_Close( demfile ); diff --git a/engine/client/cl_game.c b/engine/client/cl_game.c index f48aaf96..2d47c50c 100644 --- a/engine/client/cl_game.c +++ b/engine/client/cl_game.c @@ -5,7 +5,6 @@ #include "common.h" #include "client.h" -#include "byteorder.h" #include "matrix_lib.h" #include "const.h" #include "triangleapi.h" @@ -2576,7 +2575,7 @@ pfnBoxVisible static qboolean pfnBoxVisible( const vec3_t mins, const vec3_t maxs ) { if( !re ) return false; - return CM_BoxVisible( mins, maxs, re->GetCurrentVis()); + return Mod_BoxVisible( mins, maxs, re->GetCurrentVis()); } /* @@ -3697,7 +3696,7 @@ qboolean CL_LoadProgs( const char *name ) clgame.hInstance = FS_LoadLibrary( name, false ); if( !clgame.hInstance ) return false; -Msg( "exports size %i\n", sizeof( HUD_FUNCTIONS )); + // clear exports for( func = cdll_exports; func && func->name; func++ ) *func->func = NULL; diff --git a/engine/client/cl_main.c b/engine/client/cl_main.c index 2524e70f..d14dc5e5 100644 --- a/engine/client/cl_main.c +++ b/engine/client/cl_main.c @@ -5,7 +5,6 @@ #include "common.h" #include "client.h" -#include "byteorder.h" #include "net_encode.h" #include "cl_tent.h" #include "input.h" @@ -583,7 +582,7 @@ void CL_SendConnectPacket( void ) return; } - if( adr.port == 0 ) adr.port = BigShort( PORT_SERVER ); + if( adr.port == 0 ) adr.port = BF_BigShort( PORT_SERVER ); port = Cvar_VariableValue( "net_qport" ); userinfo->modified = false; @@ -625,7 +624,7 @@ void CL_CheckForResend( void ) return; } - if( adr.port == 0 ) adr.port = BigShort( PORT_SERVER ); + if( adr.port == 0 ) adr.port = BF_BigShort( PORT_SERVER ); cls.connect_time = host.realtime; // for retransmit requests MsgDev( D_NOTE, "Connecting to %s...\n", cls.servername ); @@ -719,7 +718,7 @@ void CL_Rcon_f( void ) } NET_StringToAdr( rcon_address->string, &to ); - if( to.port == 0 ) to.port = BigShort( PORT_SERVER ); + if( to.port == 0 ) to.port = BF_BigShort( PORT_SERVER ); } NET_SendPacket( NS_CLIENT, com.strlen( message ) + 1, message, to ); @@ -864,7 +863,7 @@ void CL_LocalServers_f( void ) // send a broadcast packet adr.type = NA_BROADCAST; - adr.port = BigShort( PORT_SERVER ); + adr.port = BF_BigShort( PORT_SERVER ); Netchan_OutOfBandPrint( NS_CLIENT, adr, "info %i", PROTOCOL_VERSION ); } @@ -899,7 +898,7 @@ void CL_Packet_f( void ) return; } - if( !adr.port ) adr.port = BigShort( PORT_SERVER ); + if( !adr.port ) adr.port = BF_BigShort( PORT_SERVER ); in = Cmd_Argv( 2 ); out = send + 4; diff --git a/engine/client/cl_scrn.c b/engine/client/cl_scrn.c index 360268fc..54763f51 100644 --- a/engine/client/cl_scrn.c +++ b/engine/client/cl_scrn.c @@ -5,7 +5,6 @@ #include "common.h" #include "client.h" -#include "byteorder.h" #include "qfont.h" convar_t *scr_viewsize; @@ -286,16 +285,16 @@ static void SCR_LoadCreditsFont( void ) int i; src = (qfont_t *)buffer; - clgame.scrInfo.iCharHeight = LittleLong( src->rowheight ); + clgame.scrInfo.iCharHeight = src->rowheight; // build rectangles for( i = 0; i < 256; i++ ) { - cls.creditsFont.fontRc[i].left = LittleShort( (word)src->fontinfo[i].startoffset ) % fontWidth; - cls.creditsFont.fontRc[i].right = cls.creditsFont.fontRc[i].left + LittleShort( src->fontinfo[i].charwidth ); - cls.creditsFont.fontRc[i].top = LittleShort( (word)src->fontinfo[i].startoffset ) / fontWidth; - cls.creditsFont.fontRc[i].bottom = cls.creditsFont.fontRc[i].top + LittleLong( src->rowheight ); - clgame.scrInfo.charWidths[i] = LittleLong( src->fontinfo[i].charwidth ); + cls.creditsFont.fontRc[i].left = (word)src->fontinfo[i].startoffset % fontWidth; + cls.creditsFont.fontRc[i].right = cls.creditsFont.fontRc[i].left + src->fontinfo[i].charwidth; + cls.creditsFont.fontRc[i].top = (word)src->fontinfo[i].startoffset / fontWidth; + cls.creditsFont.fontRc[i].bottom = cls.creditsFont.fontRc[i].top + src->rowheight; + clgame.scrInfo.charWidths[i] = src->fontinfo[i].charwidth; } cls.creditsFont.valid = true; } diff --git a/engine/client/cl_studio.c b/engine/client/cl_studio.c index 60cfdafd..6482c72a 100644 --- a/engine/client/cl_studio.c +++ b/engine/client/cl_studio.c @@ -5,7 +5,6 @@ #include "common.h" #include "client.h" -#include "byteorder.h" #include "matrix_lib.h" #include "const.h" #include "r_studioint.h" diff --git a/engine/client/sound/s_load.c b/engine/client/sound/s_load.c index 8d3f6200..ef189c2f 100644 --- a/engine/client/sound/s_load.c +++ b/engine/client/sound/s_load.c @@ -5,7 +5,6 @@ #include "common.h" #include "sound.h" -#include "byteorder.h" // during registration it is possible to have more sounds // than could actually be referenced during gameplay, diff --git a/engine/client/sound/s_main.c b/engine/client/sound/s_main.c index 2c4f739d..1f777243 100644 --- a/engine/client/sound/s_main.c +++ b/engine/client/sound/s_main.c @@ -861,14 +861,14 @@ void S_Music_f( void ) else if( c == 2 ) { string intro, main, track; - char *ext[] = { "wav", "mp3", "ogg" }; + char *ext[] = { "wav", "mp3" }; int i; com.strncpy( track, Cmd_Argv( 1 ), sizeof( track )); com.snprintf( intro, sizeof( intro ), "%s_intro", Cmd_Argv( 1 )); com.snprintf( main, sizeof( main ), "%s_main", Cmd_Argv( 1 )); - for( i = 0; i < 3; i++ ) + for( i = 0; i < 2; i++ ) { if( FS_FileExists( va( "media/%s.%s", intro, ext[i] )) && FS_FileExists( va( "media/%s.%s", main, ext[i] ))) diff --git a/engine/client/sound/s_mix.c b/engine/client/sound/s_mix.c index e87a71c8..00e94f45 100644 --- a/engine/client/sound/s_mix.c +++ b/engine/client/sound/s_mix.c @@ -6,7 +6,6 @@ #include "common.h" #include "sound.h" #include "client.h" -#include "byteorder.h" #define IPAINTBUFFER 0 #define IROOMBUFFER 1 diff --git a/engine/client/sound/s_stream.c b/engine/client/sound/s_stream.c index 4a71a869..e7804b74 100644 --- a/engine/client/sound/s_stream.c +++ b/engine/client/sound/s_stream.c @@ -6,7 +6,6 @@ #include "common.h" #include "sound.h" #include "client.h" -#include "byteorder.h" portable_samplepair_t s_rawsamples[MAX_RAW_SAMPLES]; static bg_track_t s_bgTrack; diff --git a/engine/common/avikit.c b/engine/common/avikit.c index 6749ec76..32269862 100644 --- a/engine/common/avikit.c +++ b/engine/common/avikit.c @@ -5,7 +5,6 @@ #include "common.h" #include "client.h" -#include "byteorder.h" #include // video for windows typedef struct movie_state_s diff --git a/engine/common/cm_local.h b/engine/common/cm_local.h index 8ec6ec16..ef048cb7 100644 --- a/engine/common/cm_local.h +++ b/engine/common/cm_local.h @@ -18,7 +18,7 @@ #define DVIS_PVS 0 #define DVIS_PHS 1 -extern convar_t *cm_novis; +extern convar_t *sv_novis; typedef struct leaflist_s { @@ -57,13 +57,13 @@ extern model_t *worldmodel; // byte *CM_LeafPVS( int leafnum ); byte *CM_LeafPHS( int leafnum ); -int CM_PointLeafnum( const vec3_t p ); -mleaf_t *CM_PointInLeaf( const vec3_t p, mnode_t *node ); -int CM_BoxLeafnums( const vec3_t mins, const vec3_t maxs, short *list, int listsize, int *lastleaf ); -qboolean CM_BoxVisible( const vec3_t mins, const vec3_t maxs, const byte *visbits ); -int CM_HullPointContents( hull_t *hull, int num, const vec3_t p ); -int CM_PointContents( const vec3_t p ); -void CM_AmbientLevels( const vec3_t p, byte *pvolumes ); +int Mod_PointLeafnum( const vec3_t p ); +mleaf_t *Mod_PointInLeaf( const vec3_t p, mnode_t *node ); +int Mod_BoxLeafnums( const vec3_t mins, const vec3_t maxs, short *list, int listsize, int *lastleaf ); +qboolean Mod_BoxVisible( const vec3_t mins, const vec3_t maxs, const byte *visbits ); +int Mod_HullPointContents( hull_t *hull, int num, const vec3_t p ); +int Mod_PointContents( const vec3_t p ); +void Mod_AmbientLevels( const vec3_t p, byte *pvolumes ); // // cm_portals.c @@ -73,10 +73,10 @@ byte *CM_FatPVS( const vec3_t org, qboolean portal ); byte *CM_FatPHS( const vec3_t org, qboolean portal ); // -// cm_model.c +// model.c // -qboolean CM_InitPhysics( void ); -void CM_FreePhysics( void ); +void Mod_Init( void ); +void Mod_Shutdown( void ); script_t *CM_GetEntityScript( void ); void CM_SetupHulls( float mins[4][3], float maxs[4][3] ); void Mod_GetBounds( int handle, vec3_t mins, vec3_t maxs ); diff --git a/engine/common/cm_test.c b/engine/common/cm_test.c index bac5f7ba..b264ff2c 100644 --- a/engine/common/cm_test.c +++ b/engine/common/cm_test.c @@ -6,189 +6,3 @@ #include "cm_local.h" #include "mathlib.h" #include "world.h" - -/* -================== -CM_PointInLeaf - -================== -*/ -mleaf_t *CM_PointInLeaf( const vec3_t p, mnode_t *node ) -{ - mleaf_t *leaf; - - // find which leaf the point is in - while( node->plane ) - node = node->children[(node->plane->type < 3 ? p[node->plane->type] : DotProduct(p, node->plane->normal)) < node->plane->dist]; - leaf = (mleaf_t *)node; - - return leaf; -} - -int CM_PointLeafnum( const vec3_t p ) -{ - // map not loaded - if ( !worldmodel ) return 0; - return CM_PointInLeaf( p, worldmodel->nodes ) - worldmodel->leafs - 1; -} - - -/* -====================================================================== - -LEAF LISTING - -====================================================================== -*/ -void CM_BoxLeafnums_r( leaflist_t *ll, mnode_t *node ) -{ - mplane_t *plane; - int s; - - while( 1 ) - { - if( node->contents == CONTENTS_SOLID ) - return; - - if( node->contents < 0 ) - { - mleaf_t *leaf = (mleaf_t *)node; - - // it's a leaf! - if( ll->count >= ll->maxcount ) - { - ll->overflowed = true; - return; - } - - ll->list[ll->count++] = leaf - worldmodel->leafs - 1; - return; - } - - plane = node->plane; - s = BOX_ON_PLANE_SIDE( ll->mins, ll->maxs, plane ); - - if( s == 1 ) - { - node = node->children[0]; - } - else if( s == 2 ) - { - node = node->children[1]; - } - else - { - // go down both - if( ll->topnode == -1 ) - ll->topnode = node - worldmodel->nodes; - CM_BoxLeafnums_r( ll, node->children[0] ); - node = node->children[1]; - } - } -} - -/* -================== -CM_BoxLeafnums -================== -*/ -int CM_BoxLeafnums( const vec3_t mins, const vec3_t maxs, short *list, int listsize, int *topnode ) -{ - leaflist_t ll; - - if( !worldmodel ) return 0; - - cm.checkcount++; - VectorCopy( mins, ll.mins ); - VectorCopy( maxs, ll.maxs ); - ll.count = 0; - ll.maxcount = listsize; - ll.list = list; - ll.topnode = -1; - ll.overflowed = false; - - CM_BoxLeafnums_r( &ll, worldmodel->nodes ); - - if( topnode ) *topnode = ll.topnode; - return ll.count; -} - -/* -============= -CM_BoxVisible - -Returns true if any leaf in boxspace -is potentially visible -============= -*/ -qboolean CM_BoxVisible( const vec3_t mins, const vec3_t maxs, const byte *visbits ) -{ - short leafList[MAX_BOX_LEAFS]; - int i, count; - - if( !visbits || !mins || !maxs ) - return true; - - // FIXME: Could save a loop here by traversing the tree in this routine like the code above - count = CM_BoxLeafnums( mins, maxs, leafList, MAX_BOX_LEAFS, NULL ); - - for( i = 0; i < count; i++ ) - { - int leafnum = leafList[i]; - - if( visbits[leafnum>>3] & (1<<( leafnum & 7 ))) - return true; - } - return false; -} - -/* -=============================================================================== - -POINT TESTING IN HULLS - -=============================================================================== -*/ - -/* -================== -CM_HullPointContents - -================== -*/ -int CM_HullPointContents( hull_t *hull, int num, const vec3_t p ) -{ - while( num >= 0 ) - num = hull->clipnodes[num].children[(hull->planes[hull->clipnodes[num].planenum].type < 3 ? p[hull->planes[hull->clipnodes[num].planenum].type] : DotProduct (hull->planes[hull->clipnodes[num].planenum].normal, p)) < hull->planes[hull->clipnodes[num].planenum].dist]; - return num; -} - -/* -================== -CM_PointContents - -================== -*/ -int CM_PointContents( const vec3_t p ) -{ - if( !worldmodel ) return 0; - return CM_HullPointContents( &worldmodel->hulls[0], 0, p ); -} - -/* -================== -CM_AmbientLevels - -grab the ambient sound levels for current point -================== -*/ -void CM_AmbientLevels( const vec3_t p, byte *pvolumes ) -{ - mleaf_t *leaf; - - if( !worldmodel || !p || !pvolumes ) - return; - - leaf = CM_PointInLeaf( p, worldmodel->nodes ); - *(int *)pvolumes = *(int *)leaf->ambient_sound_level; -} \ No newline at end of file diff --git a/engine/common/con_utils.c b/engine/common/con_utils.c index 8286b9b4..45ffd459 100644 --- a/engine/common/con_utils.c +++ b/engine/common/con_utils.c @@ -5,7 +5,6 @@ #include "common.h" #include "client.h" -#include "byteorder.h" #include "const.h" #include "bspfile.h" #include "../cl_dll/kbutton.h" @@ -69,23 +68,23 @@ qboolean Cmd_GetMapList( const char *s, char *completedname, int length ) Mem_Set( buf, 0, MAX_SYSPATH ); FS_Read( f, buf, MAX_SYSPATH ); - ver = LittleLong(*(uint *)buf); + ver = *(uint *)buf; switch( ver ) { case Q1BSP_VERSION: case HLBSP_VERSION: header = (dheader_t *)buf; - if( LittleLong( header->lumps[LUMP_PLANES].filelen ) % sizeof( dplane_t )) + if( header->lumps[LUMP_PLANES].filelen % sizeof( dplane_t )) { - lumpofs = LittleLong( header->lumps[LUMP_PLANES].fileofs ); - lumplen = LittleLong( header->lumps[LUMP_PLANES].filelen ); + lumpofs = header->lumps[LUMP_PLANES].fileofs; + lumplen = header->lumps[LUMP_PLANES].filelen; gearbox = true; } else { - lumpofs = LittleLong( header->lumps[LUMP_ENTITIES].fileofs ); - lumplen = LittleLong( header->lumps[LUMP_ENTITIES].filelen ); + lumpofs = header->lumps[LUMP_ENTITIES].fileofs; + lumplen = header->lumps[LUMP_ENTITIES].filelen; gearbox = false; } break; @@ -270,7 +269,7 @@ qboolean Cmd_GetMusicList( const char *s, char *completedname, int length ) { const char *ext = FS_FileExtension( t->filenames[i] ); - if( !com.stricmp( ext, "wav" ) || !com.stricmp( ext, "mp3" ) || !com.stricmp( ext, "ogg" )); + if( !com.stricmp( ext, "wav" ) || !com.stricmp( ext, "mp3" )); else continue; FS_FileBase( t->filenames[i], matchbuf ); @@ -408,7 +407,7 @@ qboolean Cmd_GetSoundList( const char *s, char *completedname, int length ) { const char *ext = FS_FileExtension( t->filenames[i] ); - if( !com.stricmp( ext, "wav" ) || !com.stricmp( ext, "mp3" ) || !com.stricmp( ext, "ogg" )); + if( !com.stricmp( ext, "wav" ) || !com.stricmp( ext, "mp3" )); else continue; com.strncpy( matchbuf, t->filenames[i] + com.strlen(snddir), MAX_STRING ); @@ -655,22 +654,22 @@ qboolean Cmd_CheckMapsList_R( qboolean fRefresh, qboolean onlyingamedir ) Mem_Set( buf, 0, MAX_SYSPATH ); FS_Read( f, buf, MAX_SYSPATH ); - ver = LittleLong(*(uint *)buf); + ver = *(uint *)buf; switch( ver ) { case Q1BSP_VERSION: case HLBSP_VERSION: header = (dheader_t *)buf; - if( LittleLong( header->lumps[LUMP_PLANES].filelen ) % sizeof( dplane_t )) + if( header->lumps[LUMP_PLANES].filelen % sizeof( dplane_t )) { - lumpofs = LittleLong( header->lumps[LUMP_PLANES].fileofs ); - lumplen = LittleLong( header->lumps[LUMP_PLANES].filelen ); + lumpofs = header->lumps[LUMP_PLANES].fileofs; + lumplen = header->lumps[LUMP_PLANES].filelen; } else { - lumpofs = LittleLong( header->lumps[LUMP_ENTITIES].fileofs ); - lumplen = LittleLong( header->lumps[LUMP_ENTITIES].filelen ); + lumpofs = header->lumps[LUMP_ENTITIES].fileofs; + lumplen = header->lumps[LUMP_ENTITIES].filelen; } break; } diff --git a/engine/common/console.c b/engine/common/console.c index 7f5abd35..c3777df1 100644 --- a/engine/common/console.c +++ b/engine/common/console.c @@ -7,7 +7,6 @@ #include "client.h" #include "keydefs.h" #include "protocol.h" // get the protocol version -#include "byteorder.h" #include "con_nprint.h" #include "qfont.h" @@ -354,16 +353,16 @@ static void Con_LoadConchars( void ) int i; src = (qfont_t *)buffer; - con.charHeight = LittleLong( src->rowheight ); + con.charHeight = src->rowheight; // build rectangles for( i = 0; i < 256; i++ ) { - con.chars.fontRc[i].left = LittleShort( (word)src->fontinfo[i].startoffset ) % fontWidth; - con.chars.fontRc[i].right = con.chars.fontRc[i].left + LittleShort( src->fontinfo[i].charwidth ); - con.chars.fontRc[i].top = LittleShort( (word)src->fontinfo[i].startoffset ) / fontWidth; - con.chars.fontRc[i].bottom = con.chars.fontRc[i].top + LittleLong( src->rowheight ); - con.charWidths[i] = LittleLong( src->fontinfo[i].charwidth ); + con.chars.fontRc[i].left = (word)src->fontinfo[i].startoffset % fontWidth; + con.chars.fontRc[i].right = con.chars.fontRc[i].left + src->fontinfo[i].charwidth; + con.chars.fontRc[i].top = (word)src->fontinfo[i].startoffset / fontWidth; + con.chars.fontRc[i].bottom = con.chars.fontRc[i].top + src->rowheight; + con.charWidths[i] = src->fontinfo[i].charwidth; } con.chars.valid = true; } diff --git a/engine/common/engfuncs.c b/engine/common/engfuncs.c index 325d27cf..1c056e66 100644 --- a/engine/common/engfuncs.c +++ b/engine/common/engfuncs.c @@ -5,7 +5,6 @@ #include "common.h" #include "studio.h" -#include "byteorder.h" #include "mathlib.h" #include "const.h" #include "client.h" diff --git a/engine/common/host.c b/engine/common/host.c index 17dfed8a..ef0d78d2 100644 --- a/engine/common/host.c +++ b/engine/common/host.c @@ -806,9 +806,9 @@ void Host_Init( const int argc, const char **argv ) if( host.developer > 1 ) Cvar_SetFloat( "sv_cheats", 1.0f ); } + Mod_Init(); NET_Init(); Netchan_Init(); - CM_InitPhysics(); SV_Init(); CL_Init(); @@ -874,7 +874,7 @@ void Host_Free( void ) host.state = HOST_SHUTDOWN; // prepare host to normal shutdown com.strncpy( host.finalmsg, "Server shutdown\n", MAX_STRING ); - CM_FreePhysics(); + Mod_Shutdown(); Host_FreeRender(); S_Shutdown(); diff --git a/engine/common/infostring.c b/engine/common/infostring.c index 64dd3d7d..5465d2c3 100644 --- a/engine/common/infostring.c +++ b/engine/common/infostring.c @@ -4,7 +4,6 @@ //======================================================================= #include "common.h" -#include "byteorder.h" #define MAX_INFO_KEY 64 #define MAX_INFO_VALUE 64 diff --git a/engine/common/cm_model.c b/engine/common/model.c similarity index 77% rename from engine/common/cm_model.c rename to engine/common/model.c index e5a70825..d3747fe0 100644 --- a/engine/common/cm_model.c +++ b/engine/common/model.c @@ -5,11 +5,11 @@ #include "cm_local.h" #include "sprite.h" -#include "byteorder.h" #include "mathlib.h" #include "matrix_lib.h" #include "studio.h" #include "wadfile.h" +#include "world.h" clipmap_t cm; @@ -23,7 +23,8 @@ model_t *loadmodel; model_t *worldmodel; // cvars -convar_t *cm_novis; +convar_t *sv_novis; // disable server culling entities by vis +convar_t *gl_subdivide_size; // default hullmins static vec3_t cm_hullmins[4] = @@ -103,6 +104,190 @@ static int CM_StudioBodyVariations( model_t *mod ) return count; } +/* +================== +Mod_PointInLeaf + +================== +*/ +mleaf_t *Mod_PointInLeaf( const vec3_t p, mnode_t *node ) +{ + mleaf_t *leaf; + + // find which leaf the point is in + while( node->contents >= 0 ) + node = node->children[(node->plane->type < 3 ? p[node->plane->type] : DotProduct(p, node->plane->normal)) < node->plane->dist]; + leaf = (mleaf_t *)node; + + return leaf; +} + +int Mod_PointLeafnum( const vec3_t p ) +{ + // map not loaded + if ( !worldmodel ) return 0; + return Mod_PointInLeaf( p, worldmodel->nodes ) - worldmodel->leafs - 1; +} + +/* +====================================================================== + +LEAF LISTING + +====================================================================== +*/ +static void Mod_BoxLeafnums_r( leaflist_t *ll, mnode_t *node ) +{ + mplane_t *plane; + int s; + + while( 1 ) + { + if( node->contents == CONTENTS_SOLID ) + return; + + if( node->contents < 0 ) + { + mleaf_t *leaf = (mleaf_t *)node; + + // it's a leaf! + if( ll->count >= ll->maxcount ) + { + ll->overflowed = true; + return; + } + + ll->list[ll->count++] = leaf - worldmodel->leafs - 1; + return; + } + + plane = node->plane; + s = BOX_ON_PLANE_SIDE( ll->mins, ll->maxs, plane ); + + if( s == 1 ) + { + node = node->children[0]; + } + else if( s == 2 ) + { + node = node->children[1]; + } + else + { + // go down both + if( ll->topnode == -1 ) + ll->topnode = node - worldmodel->nodes; + Mod_BoxLeafnums_r( ll, node->children[0] ); + node = node->children[1]; + } + } +} + +/* +================== +Mod_BoxLeafnums +================== +*/ +int Mod_BoxLeafnums( const vec3_t mins, const vec3_t maxs, short *list, int listsize, int *topnode ) +{ + leaflist_t ll; + + if( !worldmodel ) return 0; + + cm.checkcount++; + VectorCopy( mins, ll.mins ); + VectorCopy( maxs, ll.maxs ); + ll.count = 0; + ll.maxcount = listsize; + ll.list = list; + ll.topnode = -1; + ll.overflowed = false; + + Mod_BoxLeafnums_r( &ll, worldmodel->nodes ); + + if( topnode ) *topnode = ll.topnode; + return ll.count; +} + +/* +============= +Mod_BoxVisible + +Returns true if any leaf in boxspace +is potentially visible +============= +*/ +qboolean Mod_BoxVisible( const vec3_t mins, const vec3_t maxs, const byte *visbits ) +{ + short leafList[MAX_BOX_LEAFS]; + int i, count; + + if( !visbits || !mins || !maxs ) + return true; + + // FIXME: Could save a loop here by traversing the tree in this routine like the code above + count = Mod_BoxLeafnums( mins, maxs, leafList, MAX_BOX_LEAFS, NULL ); + + for( i = 0; i < count; i++ ) + { + int leafnum = leafList[i]; + + if( visbits[leafnum>>3] & (1<<( leafnum & 7 ))) + return true; + } + return false; +} + +/* +=============================================================================== + +POINT TESTING IN HULLS + +=============================================================================== +*/ +/* +================== +Mod_HullPointContents + +================== +*/ +int Mod_HullPointContents( hull_t *hull, int num, const vec3_t p ) +{ + while( num >= 0 ) + num = hull->clipnodes[num].children[(hull->planes[hull->clipnodes[num].planenum].type < 3 ? p[hull->planes[hull->clipnodes[num].planenum].type] : DotProduct (hull->planes[hull->clipnodes[num].planenum].normal, p)) < hull->planes[hull->clipnodes[num].planenum].dist]; + return num; +} + +/* +================== +Mod_PointContents + +================== +*/ +int Mod_PointContents( const vec3_t p ) +{ + if( !worldmodel ) return 0; + return Mod_HullPointContents( &worldmodel->hulls[0], 0, p ); +} + +/* +================== +Mod_AmbientLevels + +grab the ambient sound levels for current point +================== +*/ +void Mod_AmbientLevels( const vec3_t p, byte *pvolumes ) +{ + mleaf_t *leaf; + + if( !worldmodel || !p || !pvolumes ) + return; + + leaf = Mod_PointInLeaf( p, worldmodel->nodes ); + *(int *)pvolumes = *(int *)leaf->ambient_sound_level; +} + /* ================ CM_FreeModel @@ -125,17 +310,16 @@ static void CM_FreeModel( model_t *mod ) =============================================================================== */ -qboolean CM_InitPhysics( void ) +void Mod_Init( void ) { - cm_novis = Cvar_Get( "cm_novis", "0", 0, "force to ignore server visibility" ); + sv_novis = Cvar_Get( "sv_novis", "0", 0, "force to ignore server visibility" ); + gl_subdivide_size = Cvar_Get( "gl_subdivide_size", "128", CVAR_ARCHIVE, "how large water polygons should be" ); cm.studiopool = Mem_AllocPool( "Studio Cache" ); - Mem_Set( cm.nullrow, 0xFF, MAX_MAP_LEAFS / 8 ); - return true; } -void CM_FreePhysics( void ) +void Mod_Shutdown( void ) { int i; @@ -157,14 +341,14 @@ void CM_FreePhysics( void ) BSP_LoadSubmodels ================= */ -static void BSP_LoadSubmodels( dlump_t *l ) +static void Mod_LoadSubmodels( dlump_t *l ) { dmodel_t *in; dmodel_t *out; int i, j, count; in = (void *)(mod_base + l->fileofs); - if( l->filelen % sizeof( *in )) Host_Error( "BSP_LoadModels: funny lump size\n" ); + if( l->filelen % sizeof( *in )) Host_Error( "Mod_LoadBModel: funny lump size\n" ); count = l->filelen / sizeof( *in ); if( count < 1 ) Host_Error( "Map %s without models\n", loadmodel->name ); @@ -180,17 +364,17 @@ static void BSP_LoadSubmodels( dlump_t *l ) for( j = 0; j < 3; j++ ) { // spread the mins / maxs by a pixel - out->mins[j] = LittleFloat( in->mins[j] ) - 1; - out->maxs[j] = LittleFloat( in->maxs[j] ) + 1; - out->origin[j] = LittleFloat( in->origin[j] ); + out->mins[j] = in->mins[j] - 1; + out->maxs[j] = in->maxs[j] + 1; + out->origin[j] = in->origin[j]; } for( j = 0; j < MAX_MAP_HULLS; j++ ) - out->headnode[j] = LittleLong( in->headnode[j] ); + out->headnode[j] = in->headnode[j]; - out->visleafs = LittleLong( in->visleafs ); - out->firstface = LittleLong( in->firstface ); - out->numfaces = LittleLong( in->numfaces ); + out->visleafs = in->visleafs; + out->firstface = in->firstface; + out->numfaces = in->numfaces; } } @@ -202,7 +386,7 @@ BSP_LoadTextures static void BSP_LoadTextures( dlump_t *l ) { dmiptexlump_t *in; - mtexture_t *out; + texture_t *out; mip_t *mt; int i; @@ -214,14 +398,12 @@ static void BSP_LoadTextures( dlump_t *l ) } in = (void *)(mod_base + l->fileofs); - in->nummiptex = LittleLong( in->nummiptex ); loadmodel->numtextures = in->nummiptex; - loadmodel->textures = (mtexture_t **)Mem_Alloc( loadmodel->mempool, loadmodel->numtextures * sizeof( mtexture_t* )); + loadmodel->textures = (texture_t **)Mem_Alloc( loadmodel->mempool, loadmodel->numtextures * sizeof( texture_t* )); for( i = 0; i < loadmodel->numtextures; i++ ) { - in->dataofs[i] = LittleLong( in->dataofs[i] ); if( in->dataofs[i] == -1 ) continue; // bad offset ? mt = (mip_t *)((byte *)in + in->dataofs[i] ); @@ -259,9 +441,9 @@ static void BSP_LoadTexInfo( const dlump_t *l ) for( i = 0; i < count; i++, in++, out++ ) { for( j = 0; j < 8; j++ ) - out->vecs[0][j] = LittleFloat( in->vecs[0][j] ); + out->vecs[0][j] = in->vecs[0][j]; - miptex = LittleLong( in->miptex ); + miptex = in->miptex; if( miptex < 0 || miptex > loadmodel->numtextures ) Host_Error( "BSP_LoadTexInfo: bad miptex number in '%s'\n", loadmodel->name ); out->texture = loadmodel->textures[miptex]; @@ -275,7 +457,8 @@ BSP_LoadLighting */ static void BSP_LoadLighting( const dlump_t *l ) { - byte d, *in, *out; + byte d, *in; + color24 *out; int i; if( !l->filelen ) return; @@ -285,15 +468,15 @@ static void BSP_LoadLighting( const dlump_t *l ) { case Q1BSP_VERSION: // expand the white lighting data - loadmodel->lightdata = Mem_Alloc( loadmodel->mempool, l->filelen * 3 ); + loadmodel->lightdata = (color24 *)Mem_Alloc( loadmodel->mempool, l->filelen * sizeof( color24 )); out = loadmodel->lightdata; - for( i = 0; i < l->filelen; i++ ) + for( i = 0; i < l->filelen; i++, out++ ) { d = *in++; - *out++ = d; - *out++ = d; - *out++ = d; + out->r = d; + out->g = d; + out->b = d; } break; case HLBSP_VERSION: @@ -375,12 +558,12 @@ static void BSP_LoadSurfaces( const dlump_t *l ) for( i = 0; i < count; i++, in++, out++ ) { - out->firstedge = LittleLong( in->firstedge ); - out->numedges = LittleLong( in->numedges ); + out->firstedge = in->firstedge; + out->numedges = in->numedges; - if( LittleShort( in->side )) out->flags |= SURF_PLANEBACK; - out->plane = loadmodel->planes + LittleLong( in->planenum ); - out->texinfo = loadmodel->texinfo + LittleLong( in->texinfo ); + if( in->side ) out->flags |= SURF_PLANEBACK; + out->plane = loadmodel->planes + in->planenum; + out->texinfo = loadmodel->texinfo + in->texinfo; // some DMC maps have bad textures if( out->texinfo->texture ) @@ -395,7 +578,7 @@ static void BSP_LoadSurfaces( const dlump_t *l ) BSP_CalcSurfaceExtents( out ); if( out->flags & SURF_DRAWTILED ) lightofs = -1; - else lightofs = LittleLong( in->lightofs ); + else lightofs = in->lightofs; if( loadmodel->lightdata && lightofs != -1 ) { @@ -403,12 +586,6 @@ static void BSP_LoadSurfaces( const dlump_t *l ) out->samples = loadmodel->lightdata + lightofs; else out->samples = loadmodel->lightdata + (lightofs * 3); } - - while( out->numstyles < LM_STYLES && in->styles[out->numstyles] != 255 ) - { - out->styles[out->numstyles] = in->styles[out->numstyles]; - out->numstyles++; - } } } @@ -420,8 +597,8 @@ BSP_LoadVertexes static void BSP_LoadVertexes( const dlump_t *l ) { dvertex_t *in; - float *out; - int i, j, count; + mvertex_t *out; + int i, count; in = (void *)( mod_base + l->fileofs ); if( l->filelen % sizeof( *in )) @@ -429,12 +606,11 @@ static void BSP_LoadVertexes( const dlump_t *l ) count = l->filelen / sizeof( *in ); loadmodel->numvertexes = count; - out = (float *)loadmodel->vertexes = Mem_Alloc( loadmodel->mempool, count * sizeof( vec3_t )); + out = loadmodel->vertexes = Mem_Alloc( loadmodel->mempool, count * sizeof( mvertex_t )); - for( i = 0; i < count; i++, in++, out += 3 ) + for( i = 0; i < count; i++, in++, out++ ) { - for( j = 0; j < 3; j++ ) - out[j] = LittleFloat( in->point[j] ); + VectorCopy( in->point, out->position ); } } @@ -445,21 +621,22 @@ BSP_LoadEdges */ static void BSP_LoadEdges( const dlump_t *l ) { - dedge_t *in, *out; + dedge_t *in; + medge_t *out; int i, count; in = (void *)( mod_base + l->fileofs ); if( l->filelen % sizeof( *in )) Host_Error( "BSP_LoadEdges: funny lump size in %s\n", loadmodel->name ); - count = l->filelen / sizeof( dedge_t ); - loadmodel->edges = out = Mem_Alloc( loadmodel->mempool, count * sizeof( dedge_t )); + count = l->filelen / sizeof( *in ); + loadmodel->edges = out = Mem_Alloc( loadmodel->mempool, count * sizeof( medge_t )); loadmodel->numedges = count; for( i = 0; i < count; i++, in++, out++ ) { - out->v[0] = (word)LittleShort( in->v[0] ); - out->v[1] = (word)LittleShort( in->v[1] ); + out->v[0] = (word)in->v[0]; + out->v[1] = (word)in->v[1]; } } @@ -471,7 +648,7 @@ BSP_LoadSurfEdges static void BSP_LoadSurfEdges( const dlump_t *l ) { dsurfedge_t *in, *out; - int i, count; + int count; in = (void *)( mod_base + l->fileofs ); if( l->filelen % sizeof( *in )) @@ -481,8 +658,7 @@ static void BSP_LoadSurfEdges( const dlump_t *l ) loadmodel->surfedges = out = Mem_Alloc( loadmodel->mempool, count * sizeof( dsurfedge_t )); loadmodel->numsurfedges = count; - for( i = 0; i < count; i++ ) - out[i] = LittleLong( in[i] ); + Mem_Copy( out, in, count * sizeof( dsurfedge_t )); } /* @@ -504,7 +680,7 @@ static void BSP_LoadMarkFaces( const dlump_t *l ) for( i = 0; i < count; i++ ) { - j = LittleLong( in[i] ); + j = in[i]; if( j < 0 || j >= loadmodel->numsurfaces ) Host_Error( "BSP_LoadMarkFaces: bad surface number in '%s'\n", loadmodel->name ); loadmodel->marksurfaces[i] = loadmodel->surfaces + j; @@ -545,15 +721,14 @@ static void BSP_LoadNodes( dlump_t *l ) for( i = 0; i < loadmodel->numnodes; i++, out++, in++ ) { - p = LittleLong( in->planenum ); + p = in->planenum; out->plane = loadmodel->planes + p; - out->contents = CONTENTS_NODE; - out->firstface = loadmodel->surfaces + LittleLong( in->firstface ); - out->numfaces = LittleLong( in->numfaces ); + out->firstsurface = in->firstface; + out->numsurfaces = in->numfaces; for( j = 0; j < 2; j++ ) { - p = LittleShort( in->children[j] ); + p = in->children[j]; if( p >= 0 ) out->children[j] = loadmodel->nodes + p; else out->children[j] = (mnode_t *)(loadmodel->leafs + ( -1 - p )); } @@ -586,11 +761,10 @@ static void BSP_LoadLeafs( dlump_t *l ) for( i = 0; i < count; i++, in++, out++ ) { - p = LittleLong( in->contents ); + p = in->contents; out->contents = p; - out->plane = NULL; // differentiate to nodes - p = LittleLong( in->visofs ); + p = in->visofs; if( p == -1 ) out->visdata = NULL; else out->visdata = cm.pvs + p; @@ -601,8 +775,8 @@ static void BSP_LoadLeafs( dlump_t *l ) for( j = 0; j < 4; j++ ) out->ambient_sound_level[j] = in->ambient_level[j]; - out->firstmarksurface = loadmodel->marksurfaces + LittleShort( in->firstmarksurface ); - out->nummarksurfaces = LittleShort( in->nummarksurfaces ); + out->firstmarksurface = loadmodel->marksurfaces + in->firstmarksurface; + out->nummarksurfaces = in->nummarksurfaces; } if( loadmodel->leafs[0].contents != CONTENTS_SOLID ) @@ -634,12 +808,12 @@ static void BSP_LoadPlanes( dlump_t *l ) { for( j = 0; j < 3; j++ ) { - out->normal[j] = LittleFloat( in->normal[j] ); + out->normal[j] = in->normal[j]; if( out->normal[j] < 0.0f ) out->signbits |= 1<dist = LittleFloat( in->dist ); - out->type = LittleLong( in->type ); + out->dist = in->dist; + out->type = in->type; } } @@ -726,9 +900,9 @@ static void BSP_LoadClipnodes( dlump_t *l ) for( i = 0; i < count; i++, out++, in++ ) { - out->planenum = LittleLong( in->planenum ); - out->children[0] = LittleShort( in->children[0] ); - out->children[1] = LittleShort( in->children[1] ); + out->planenum = in->planenum; + out->children[0] = in->children[0]; + out->children[1] = in->children[1]; } } @@ -784,7 +958,7 @@ static void CM_BrushModel( model_t *mod, byte *buffer ) int i, j; header = (dheader_t *)buffer; - i = LittleLong( header->version ); + i = header->version; switch( i ) { @@ -802,10 +976,6 @@ static void CM_BrushModel( model_t *mod, byte *buffer ) // swap all the lumps mod_base = (byte *)header; - - for( i = 0; i < sizeof( dheader_t ) / 4; i++ ) - ((int *)header)[i] = LittleLong((( int *)header)[i] ); - loadmodel->mempool = Mem_AllocPool( va( "sv: ^2%s^7", loadmodel->name )); // load into heap @@ -834,7 +1004,7 @@ static void CM_BrushModel( model_t *mod, byte *buffer ) BSP_LoadLeafs( &header->lumps[LUMP_LEAFS] ); BSP_LoadNodes( &header->lumps[LUMP_NODES] ); BSP_LoadClipnodes( &header->lumps[LUMP_CLIPNODES] ); - BSP_LoadSubmodels( &header->lumps[LUMP_MODELS] ); + Mod_LoadSubmodels( &header->lumps[LUMP_MODELS] ); CM_MakeHull0 (); @@ -893,8 +1063,8 @@ static void CM_StudioModel( model_t *mod, byte *buffer ) loadmodel->registration_sequence = cm.registration_sequence; loadmodel->mempool = Mem_AllocPool( va("^2%s^7", loadmodel->name )); - loadmodel->extradata = Mem_Alloc( loadmodel->mempool, LittleLong( phdr->length )); - Mem_Copy( loadmodel->extradata, buffer, LittleLong( phdr->length )); + loadmodel->cache.data = Mem_Alloc( loadmodel->mempool, phdr->length ); + Mem_Copy( loadmodel->cache.data, buffer, phdr->length ); // setup bounding box VectorCopy( phdr->bbmin, loadmodel->mins ); @@ -990,7 +1160,7 @@ model_t *CM_ModForName( const char *name, qboolean world ) loadmodel = mod; // call the apropriate loader - switch( LittleLong( *(uint *)buf )) + switch( *(uint *)buf ) { case IDSTUDIOHEADER: CM_StudioModel( mod, buf ); @@ -1263,6 +1433,6 @@ Mod_Extradata void *Mod_Extradata( model_t *mod ) { if( mod && mod->type == mod_studio ) - return mod->extradata; + return mod->cache.data; return NULL; } \ No newline at end of file diff --git a/engine/common/net_buffer.c b/engine/common/net_buffer.c index dae9a894..fc9b8ffc 100644 --- a/engine/common/net_buffer.c +++ b/engine/common/net_buffer.c @@ -13,6 +13,19 @@ static dword BitWriteMasks[32][33]; static dword ExtraMasks[32]; +short BF_BigShort( short swap ) +{ + short *s = &swap; + + __asm { + mov ebx, s + mov al, [ebx+1] + mov ah, [ebx ] + mov [ebx], ax + } + return *s; +} + void BF_InitMasks( void ) { uint startbit, endbit; diff --git a/engine/common/net_buffer.h b/engine/common/net_buffer.h index fba517b9..97ab2155 100644 --- a/engine/common/net_buffer.h +++ b/engine/common/net_buffer.h @@ -51,6 +51,7 @@ void BF_SeekToBit( sizebuf_t *bf, int bitPos ); void BF_SeekToByte( sizebuf_t *bf, int bytePos ); void BF_ExciseBits( sizebuf_t *bf, int startbit, int bitstoremove ); qboolean BF_CheckOverflow( sizebuf_t *bf ); +short BF_BigShort( short swap ); // init writing void BF_StartWriting( sizebuf_t *bf, void *pData, int nBytes, int iStartBit, int nBits ); diff --git a/engine/common/net_chan.c b/engine/common/net_chan.c index 0f56c528..55b06192 100644 --- a/engine/common/net_chan.c +++ b/engine/common/net_chan.c @@ -6,7 +6,6 @@ #include "common.h" #include "netchan.h" #include "mathlib.h" -#include "byteorder.h" #include "net_encode.h" #define MAKE_FRAGID( id, count ) ((( id & 0xffff ) << 16 ) | ( count & 0xffff )) diff --git a/engine/common/net_encode.c b/engine/common/net_encode.c index 7a5b763d..f2a79b6e 100644 --- a/engine/common/net_encode.c +++ b/engine/common/net_encode.c @@ -5,7 +5,6 @@ #include "common.h" #include "netchan.h" -#include "byteorder.h" #include "mathlib.h" #include "net_encode.h" #include "event_api.h" diff --git a/engine/common/pm_studio.c b/engine/common/pm_studio.c index 79b15f6f..99543528 100644 --- a/engine/common/pm_studio.c +++ b/engine/common/pm_studio.c @@ -537,10 +537,10 @@ static qboolean PM_StudioSetupModel( physent_t *pe ) { model_t *mod = pe->studiomodel; - if( !mod || !mod->extradata ) + if( !mod || !mod->cache.data ) return false; - pm_studiohdr = (studiohdr_t *)mod->extradata; + pm_studiohdr = (studiohdr_t *)mod->cache.data; PM_StudioSetUpTransform( pe ); PM_StudioSetupBones( pe ); return true; @@ -553,10 +553,10 @@ qboolean PM_StudioExtractBbox( model_t *mod, int sequence, float *mins, float *m ASSERT( mod != NULL ); - if( mod->type != mod_studio || !mod->extradata ) + if( mod->type != mod_studio || !mod->cache.data ) return false; - phdr = (studiohdr_t *)mod->extradata; + phdr = (studiohdr_t *)mod->cache.data; if( !phdr->numhitboxes ) return false; pseqdesc = (mstudioseqdesc_t *)((byte *)phdr + phdr->seqindex); diff --git a/engine/common/pm_surface.c b/engine/common/pm_surface.c index ed022e52..ed8091c0 100644 --- a/engine/common/pm_surface.c +++ b/engine/common/pm_surface.c @@ -14,7 +14,7 @@ PM_RecursiveSurfCheck ================== */ -msurface_t *PM_RecursiveSurfCheck( mnode_t *node, vec3_t p1, vec3_t p2 ) +msurface_t *PM_RecursiveSurfCheck( model_t *model, mnode_t *node, vec3_t p1, vec3_t p2 ) { float t1, t2, frac; int side, ds, dt; @@ -40,9 +40,9 @@ msurface_t *PM_RecursiveSurfCheck( mnode_t *node, vec3_t p1, vec3_t p2 ) } if( t1 >= 0 && t2 >= 0 ) - return PM_RecursiveSurfCheck( node->children[0], p1, p2 ); + return PM_RecursiveSurfCheck( model, node->children[0], p1, p2 ); if( t1 < 0 && t2 < 0 ) - return PM_RecursiveSurfCheck( node->children[1], p1, p2 ); + return PM_RecursiveSurfCheck( model, node->children[1], p1, p2 ); frac = t1 / ( t1 - t2 ); @@ -54,16 +54,16 @@ msurface_t *PM_RecursiveSurfCheck( mnode_t *node, vec3_t p1, vec3_t p2 ) side = (t1 < 0); // now this is weird. - surf = PM_RecursiveSurfCheck( node->children[side], p1, mid ); + surf = PM_RecursiveSurfCheck( model, node->children[side], p1, mid ); if( surf != NULL || ( t1 >= 0 && t2 >= 0 ) || ( t1 < 0 && t2 < 0 )) { return surf; } - surf = node->firstface; + surf = model->surfaces + node->firstsurface; - for( i = 0; i < node->numfaces; i++, surf++ ) + for( i = 0; i < node->numsurfaces; i++, surf++ ) { ds = (int)((float)DotProduct( mid, surf->texinfo->vecs[0] ) + surf->texinfo->vecs[0][3] ); dt = (int)((float)DotProduct( mid, surf->texinfo->vecs[1] ) + surf->texinfo->vecs[1][3] ); @@ -78,7 +78,7 @@ msurface_t *PM_RecursiveSurfCheck( mnode_t *node, vec3_t p1, vec3_t p2 ) } } - return PM_RecursiveSurfCheck( node->children[side^1], mid, p2 ); + return PM_RecursiveSurfCheck( model, node->children[side^1], mid, p2 ); } /* @@ -129,7 +129,7 @@ const char *PM_TraceTexture( physent_t *pe, vec3_t start, vec3_t end ) #endif } - surf = PM_RecursiveSurfCheck( &bmodel->nodes[hull->firstclipnode], start_l, end_l ); + surf = PM_RecursiveSurfCheck( bmodel, &bmodel->nodes[hull->firstclipnode], start_l, end_l ); if( !surf || !surf->texinfo || !surf->texinfo->texture ) return NULL; diff --git a/engine/common/cm_portals.c b/engine/common/portals.c similarity index 92% rename from engine/common/cm_portals.c rename to engine/common/portals.c index 4015c44e..131fd9eb 100644 --- a/engine/common/cm_portals.c +++ b/engine/common/portals.c @@ -179,7 +179,7 @@ CM_LeafPVS */ byte *CM_LeafPVS( int leafnum ) { - if( !worldmodel || leafnum <= 0 || leafnum >= worldmodel->numleafs || !cm.pvs || cm_novis->integer ) + if( !worldmodel || leafnum <= 0 || leafnum >= worldmodel->numleafs || !cm.pvs || sv_novis->integer ) return cm.nullrow; return worldmodel->leafs[leafnum+1].visdata; @@ -192,7 +192,7 @@ CM_LeafPHS */ byte *CM_LeafPHS( int leafnum ) { - if( !worldmodel || leafnum <= 0 || leafnum >= worldmodel->numleafs || !cm.phs || cm_novis->integer ) + if( !worldmodel || leafnum <= 0 || leafnum >= worldmodel->numleafs || !cm.phs || sv_novis->integer ) return cm.nullrow; return worldmodel->leafs[leafnum+1].pasdata; @@ -261,7 +261,7 @@ so we can't use a single PVS point */ byte *CM_FatPVS( const vec3_t org, qboolean portal ) { - if( !cm.pvs || cm_novis->integer ) + if( !cm.pvs || sv_novis->integer ) return cm.nullrow; bitvector = fatpvs; @@ -282,7 +282,7 @@ so we can't use a single PHS point */ byte *CM_FatPHS( const vec3_t org, qboolean portal ) { - if( !cm.pvs || cm_novis->integer ) + if( !cm.pvs || sv_novis->integer ) return cm.nullrow; bitvector = fatphs; diff --git a/engine/engine.dsp b/engine/engine.dsp index 1274e269..0b1d9f56 100644 --- a/engine/engine.dsp +++ b/engine/engine.dsp @@ -186,15 +186,11 @@ SOURCE=.\client\cl_view.c # End Source File # Begin Source File -SOURCE=.\common\cm_model.c +SOURCE=.\common\model.c # End Source File # Begin Source File -SOURCE=.\common\cm_portals.c -# End Source File -# Begin Source File - -SOURCE=.\common\cm_test.c +SOURCE=.\common\portals.c # End Source File # Begin Source File diff --git a/engine/server/sv_cmds.c b/engine/server/sv_cmds.c index a2f0dfd8..b000f1cd 100644 --- a/engine/server/sv_cmds.c +++ b/engine/server/sv_cmds.c @@ -5,7 +5,6 @@ #include "common.h" #include "server.h" -#include "byteorder.h" sv_client_t *sv_client; // current client @@ -127,7 +126,7 @@ void SV_SetMaster_f( void ) continue; } - if( !master_adr[slot].port ) master_adr[slot].port = BigShort( PORT_MASTER ); + if( !master_adr[slot].port ) master_adr[slot].port = BF_BigShort( PORT_MASTER ); Msg( "Master server at %s\n", NET_AdrToString( master_adr[slot] )); Msg( "Sending a ping.\n" ); Netchan_OutOfBandPrint( NS_SERVER, master_adr[slot], "ping" ); diff --git a/engine/server/sv_game.c b/engine/server/sv_game.c index 3555ee5d..d8c1414d 100644 --- a/engine/server/sv_game.c +++ b/engine/server/sv_game.c @@ -6,7 +6,6 @@ #include "common.h" #include "server.h" #include "net_encode.h" -#include "byteorder.h" #include "matrix_lib.h" #include "event_flags.h" #include "pm_defs.h" @@ -238,7 +237,7 @@ qboolean SV_Send( int dest, const vec3_t origin, const edict_t *ent ) // intentional fallthrough case MSG_PAS: if( origin == NULL ) return false; - leafnum = CM_PointLeafnum( origin ); + leafnum = Mod_PointLeafnum( origin ); mask = CM_LeafPHS( leafnum ); break; case MSG_PVS_R: @@ -246,7 +245,7 @@ qboolean SV_Send( int dest, const vec3_t origin, const edict_t *ent ) // intentional fallthrough case MSG_PVS: if( origin == NULL ) return false; - leafnum = CM_PointLeafnum( origin ); + leafnum = Mod_PointLeafnum( origin ); mask = CM_LeafPVS( leafnum ); break; case MSG_ONE: @@ -288,7 +287,7 @@ qboolean SV_Send( int dest, const vec3_t origin, const edict_t *ent ) viewOrg = cl->pViewEntity->v.origin; else viewOrg = cl->edict->v.origin; - leafnum = CM_PointLeafnum( viewOrg ); + leafnum = Mod_PointLeafnum( viewOrg ); if( mask && (!(mask[leafnum>>3] & (1<<( leafnum & 7 ))))) continue; } @@ -330,7 +329,7 @@ static qboolean SV_OriginIn( int mode, const vec3_t v1, const vec3_t v2 ) int leafnum; byte *mask; - leafnum = CM_PointLeafnum( v1 ); + leafnum = Mod_PointLeafnum( v1 ); switch( mode ) { @@ -345,7 +344,7 @@ static qboolean SV_OriginIn( int mode, const vec3_t v1, const vec3_t v2 ) break; } - leafnum = CM_PointLeafnum( v2 ); + leafnum = Mod_PointLeafnum( v2 ); if( mask && (!( mask[leafnum>>3] & (1<<( leafnum & 7 ))))) return false; @@ -361,8 +360,8 @@ check brush boxes in fat pvs */ static qboolean SV_BoxInPVS( const vec3_t org, const vec3_t absmin, const vec3_t absmax ) { -// if( !CM_BoxVisible( absmin, absmax, CM_FatPVS( org, false ))) - if( !CM_BoxVisible( absmin, absmax, CM_LeafPVS( CM_PointLeafnum( org )))) +// if( !Mod_BoxVisible( absmin, absmax, CM_FatPVS( org, false ))) + if( !Mod_BoxVisible( absmin, absmax, CM_LeafPVS( Mod_PointLeafnum( org )))) return false; return true; } @@ -380,22 +379,22 @@ void SV_WriteEntityPatch( const char *filename ) Mem_Set( buf, 0, MAX_SYSPATH ); FS_Read( f, buf, MAX_SYSPATH ); - ver = LittleLong(*(uint *)buf); + ver = *(uint *)buf; switch( ver ) { case Q1BSP_VERSION: case HLBSP_VERSION: header = (dheader_t *)buf; - if( LittleLong( header->lumps[LUMP_PLANES].filelen ) % sizeof( dplane_t )) + if( header->lumps[LUMP_PLANES].filelen % sizeof( dplane_t )) { - lumpofs = LittleLong( header->lumps[LUMP_PLANES].fileofs ); - lumplen = LittleLong( header->lumps[LUMP_PLANES].filelen ); + lumpofs = header->lumps[LUMP_PLANES].fileofs; + lumplen = header->lumps[LUMP_PLANES].filelen; } else { - lumpofs = LittleLong( header->lumps[LUMP_ENTITIES].fileofs ); - lumplen = LittleLong( header->lumps[LUMP_ENTITIES].filelen ); + lumpofs = header->lumps[LUMP_ENTITIES].fileofs; + lumplen = header->lumps[LUMP_ENTITIES].filelen; } break; default: @@ -432,22 +431,22 @@ script_t *SV_GetEntityScript( const char *filename ) Mem_Set( buf, 0, MAX_SYSPATH ); FS_Read( f, buf, MAX_SYSPATH ); - ver = LittleLong(*(uint *)buf); + ver = *(uint *)buf; switch( ver ) { case Q1BSP_VERSION: case HLBSP_VERSION: header = (dheader_t *)buf; - if( LittleLong( header->lumps[LUMP_PLANES].filelen ) % sizeof( dplane_t )) + if( header->lumps[LUMP_PLANES].filelen % sizeof( dplane_t )) { - lumpofs = LittleLong( header->lumps[LUMP_PLANES].fileofs ); - lumplen = LittleLong( header->lumps[LUMP_PLANES].filelen ); + lumpofs = header->lumps[LUMP_PLANES].fileofs; + lumplen = header->lumps[LUMP_PLANES].filelen; } else { - lumpofs = LittleLong( header->lumps[LUMP_ENTITIES].fileofs ); - lumplen = LittleLong( header->lumps[LUMP_ENTITIES].filelen ); + lumpofs = header->lumps[LUMP_ENTITIES].fileofs; + lumplen = header->lumps[LUMP_ENTITIES].filelen; } break; default: @@ -1918,7 +1917,7 @@ pfnBoxVisible */ static int pfnBoxVisible( const float *mins, const float *maxs, const byte *pset ) { - return CM_BoxVisible( mins, maxs, pset ); + return Mod_BoxVisible( mins, maxs, pset ); } /* @@ -3494,7 +3493,7 @@ void SV_PlaybackEventFull( int flags, const edict_t *pInvoker, word eventindex, if(!( flags & FEV_GLOBAL )) { // setup pvs cluster for invoker - leafnum = CM_PointLeafnum( pvspoint ); + leafnum = Mod_PointLeafnum( pvspoint ); mask = CM_LeafPVS( leafnum ); } @@ -3512,7 +3511,7 @@ void SV_PlaybackEventFull( int flags, const edict_t *pInvoker, word eventindex, if(!( flags & FEV_GLOBAL )) { - leafnum = CM_PointLeafnum( cl->edict->v.origin ); + leafnum = Mod_PointLeafnum( cl->edict->v.origin ); if( mask && (!(mask[leafnum>>3] & (1<<(leafnum & 7))))) continue; } @@ -3645,7 +3644,7 @@ int pfnCheckVisibility( const edict_t *ent, byte *pset ) // NOTE: uncommenat this if you want to get more accuracy culling on large brushes if( CM_GetModelType( ent->v.modelindex ) == mod_brush ) { - if( !CM_BoxVisible( ent->v.absmin, ent->v.absmax, pset )) + if( !Mod_BoxVisible( ent->v.absmin, ent->v.absmax, pset )) return 0; result = 3; // visible passed by BoxVisible } diff --git a/engine/server/sv_studio.c b/engine/server/sv_studio.c index e310c733..f92dbb4a 100644 --- a/engine/server/sv_studio.c +++ b/engine/server/sv_studio.c @@ -589,10 +589,10 @@ qboolean SV_StudioExtractBbox( model_t *mod, int sequence, float *mins, float *m ASSERT( mod != NULL ); - if( mod->type != mod_studio || !mod->extradata ) + if( mod->type != mod_studio || !mod->cache.data ) return false; - phdr = (studiohdr_t *)mod->extradata; + phdr = (studiohdr_t *)mod->cache.data; if( !phdr->numhitboxes ) return false; pseqdesc = (mstudioseqdesc_t *)((byte *)phdr + phdr->seqindex); diff --git a/engine/server/sv_world.c b/engine/server/sv_world.c index 936d4ffe..99b5e26f 100644 --- a/engine/server/sv_world.c +++ b/engine/server/sv_world.c @@ -981,7 +981,7 @@ SV_RecursiveSurfCheck ================== */ -msurface_t *SV_RecursiveSurfCheck( mnode_t *node, vec3_t p1, vec3_t p2 ) +msurface_t *SV_RecursiveSurfCheck( model_t *model, mnode_t *node, vec3_t p1, vec3_t p2 ) { float t1, t2, frac; int side, ds, dt; @@ -1007,9 +1007,9 @@ msurface_t *SV_RecursiveSurfCheck( mnode_t *node, vec3_t p1, vec3_t p2 ) } if( t1 >= 0 && t2 >= 0 ) - return SV_RecursiveSurfCheck( node->children[0], p1, p2 ); + return SV_RecursiveSurfCheck( model, node->children[0], p1, p2 ); if( t1 < 0 && t2 < 0 ) - return SV_RecursiveSurfCheck( node->children[1], p1, p2 ); + return SV_RecursiveSurfCheck( model, node->children[1], p1, p2 ); frac = t1 / ( t1 - t2 ); @@ -1021,16 +1021,16 @@ msurface_t *SV_RecursiveSurfCheck( mnode_t *node, vec3_t p1, vec3_t p2 ) side = (t1 < 0); // now this is weird. - surf = SV_RecursiveSurfCheck( node->children[side], p1, mid ); + surf = SV_RecursiveSurfCheck( model, node->children[side], p1, mid ); if( surf != NULL || ( t1 >= 0 && t2 >= 0 ) || ( t1 < 0 && t2 < 0 )) { return surf; } - surf = node->firstface; + surf = model->surfaces + node->firstsurface; - for( i = 0; i < node->numfaces; i++, surf++ ) + for( i = 0; i < node->numsurfaces; i++, surf++ ) { ds = (int)((float)DotProduct( mid, surf->texinfo->vecs[0] ) + surf->texinfo->vecs[0][3] ); dt = (int)((float)DotProduct( mid, surf->texinfo->vecs[1] ) + surf->texinfo->vecs[1][3] ); @@ -1045,7 +1045,7 @@ msurface_t *SV_RecursiveSurfCheck( mnode_t *node, vec3_t p1, vec3_t p2 ) } } - return SV_RecursiveSurfCheck( node->children[side^1], mid, p2 ); + return SV_RecursiveSurfCheck( model, node->children[side^1], mid, p2 ); } /* @@ -1096,7 +1096,7 @@ const char *SV_TraceTexture( edict_t *ent, const vec3_t start, const vec3_t end #endif } - surf = SV_RecursiveSurfCheck( &bmodel->nodes[hull->firstclipnode], start_l, end_l ); + surf = SV_RecursiveSurfCheck( bmodel, &bmodel->nodes[hull->firstclipnode], start_l, end_l ); if( !surf || !surf->texinfo || !surf->texinfo->texture ) return NULL; @@ -1390,7 +1390,7 @@ static float sv_modulate; SV_RecursiveLightPoint ================= */ -static qboolean SV_RecursiveLightPoint( mnode_t *node, const vec3_t start, const vec3_t end ) +static qboolean SV_RecursiveLightPoint( model_t *model, mnode_t *node, const vec3_t start, const vec3_t end ) { int side; mplane_t *plane; @@ -1399,7 +1399,7 @@ static qboolean SV_RecursiveLightPoint( mnode_t *node, const vec3_t start, const vec3_t mid, scale; float front, back, frac; int i, map, size, s, t; - byte *lm; + color24 *lm; // didn't hit anything if( !node->plane ) return false; @@ -1419,23 +1419,23 @@ static qboolean SV_RecursiveLightPoint( mnode_t *node, const vec3_t start, const side = front < 0; if(( back < 0 ) == side ) - return SV_RecursiveLightPoint( node->children[side], start, end ); + return SV_RecursiveLightPoint( model, node->children[side], start, end ); frac = front / ( front - back ); VectorLerp( start, frac, end, mid ); // co down front side - if( SV_RecursiveLightPoint( node->children[side], start, mid )) + if( SV_RecursiveLightPoint( model, node->children[side], start, mid )) return true; // hit something if(( back < 0 ) == side ) return false;// didn't hit anything // check for impact on this node - surf = node->firstface; + surf = model->surfaces + node->firstsurface; - for( i = 0; i < node->numfaces; i++, surf++ ) + for( i = 0; i < node->numsurfaces; i++, surf++ ) { tex = surf->texinfo; @@ -1456,16 +1456,16 @@ static qboolean SV_RecursiveLightPoint( mnode_t *node, const vec3_t start, const VectorClear( sv_pointColor ); - lm = surf->samples + 3 * (t * ((surf->extents[0] >> 4) + 1) + s); - size = ((surf->extents[0] >> 4) + 1) * ((surf->extents[1] >> 4) + 1) * 3; + lm = surf->samples + (t * ((surf->extents[0] >> 4) + 1) + s); + size = ((surf->extents[0] >> 4) + 1) * ((surf->extents[1] >> 4) + 1); - for( map = 0; map < surf->numstyles; map++ ) + for( map = 0; map < MAXLIGHTMAPS && surf->styles[map] != 255; map++ ) { VectorScale( sv.lightstyles[surf->styles[map]].rgb, sv_modulate, scale ); - sv_pointColor[0] += lm[0] * scale[0]; - sv_pointColor[1] += lm[1] * scale[1]; - sv_pointColor[2] += lm[2] * scale[2]; + sv_pointColor[0] += lm->r * scale[0]; + sv_pointColor[1] += lm->g * scale[1]; + sv_pointColor[2] += lm->b * scale[2]; lm += size; // skip to next lightmap } @@ -1473,7 +1473,7 @@ static qboolean SV_RecursiveLightPoint( mnode_t *node, const vec3_t start, const } // go down back side - return SV_RecursiveLightPoint( node->children[!side], mid, end ); + return SV_RecursiveLightPoint( model, node->children[!side], mid, end ); } void SV_RunLightStyles( void ) @@ -1561,7 +1561,7 @@ int SV_LightForEntity( edict_t *pEdict ) VectorSet( sv_pointColor, 1.0f, 1.0f, 1.0f ); sv_modulate = sv_lighting_modulate->value * (1.0f / 255); - SV_RecursiveLightPoint( worldmodel->nodes, start, end ); + SV_RecursiveLightPoint( worldmodel, worldmodel->nodes, start, end ); return VectorAvg( sv_pointColor ); } \ No newline at end of file diff --git a/engine/studio.h b/engine/studio.h index acd9c6ff..c1fb00d7 100644 --- a/engine/studio.h +++ b/engine/studio.h @@ -194,10 +194,13 @@ typedef struct vec3_t bbmax; } mstudiobbox_t; +#ifndef CACHE_USER +#define CACHE_USER typedef struct cache_user_s { - void *data; + void *data; // extradata } cache_user_t; +#endif // demand loaded sequence groups typedef struct diff --git a/launch/crclib.c b/launch/crclib.c index b8eb00a6..d2212374 100644 --- a/launch/crclib.c +++ b/launch/crclib.c @@ -5,7 +5,6 @@ #include "launch.h" #include "bspfile.h" -#include "byteorder.h" #define NUM_BYTES 256 #define CRC32_INIT_VALUE 0xFFFFFFFFUL @@ -225,8 +224,7 @@ qboolean CRC32_MapFile( dword *crcvalue, const char *filename ) file_t *f; dheader_t header; char buffer[1024]; - int i, num_bytes; - int lumpofs, lumplen; + int i, num_bytes, lumplen; qboolean blue_shift = false; f = FS_Open( filename, "rb", false ); @@ -241,10 +239,8 @@ qboolean CRC32_MapFile( dword *crcvalue, const char *filename ) return false; } - i = LittleLong( header.version ); - // invalid version ? - if( i != Q1BSP_VERSION && i != HLBSP_VERSION ) + if( header.version != Q1BSP_VERSION && header.version != HLBSP_VERSION ) { FS_Close( f ); return false; @@ -254,7 +250,7 @@ qboolean CRC32_MapFile( dword *crcvalue, const char *filename ) CRC32_Init( crcvalue ); // check for Blue-Shift maps - if( LittleLong( header.lumps[LUMP_PLANES].filelen ) % sizeof( dplane_t )) + if( header.lumps[LUMP_PLANES].filelen % sizeof( dplane_t )) blue_shift = true; for( i = 0; i < HEADER_LUMPS; i++ ) @@ -262,9 +258,8 @@ qboolean CRC32_MapFile( dword *crcvalue, const char *filename ) if( blue_shift && i == LUMP_PLANES ) continue; else if( i == LUMP_ENTITIES ) continue; - lumpofs = LittleLong( header.lumps[i].fileofs ); - lumplen = LittleLong( header.lumps[i].filelen ); - FS_Seek( f, lumpofs, SEEK_SET ); + lumplen = header.lumps[i].filelen; + FS_Seek( f, header.lumps[i].fileofs, SEEK_SET ); while( lumplen > 0 ) { diff --git a/launch/filesystem.c b/launch/filesystem.c index c4637975..3a511f8b 100644 --- a/launch/filesystem.c +++ b/launch/filesystem.c @@ -6,7 +6,6 @@ #include "launch.h" #include "wadfile.h" #include "filesystem.h" -#include "byteorder.h" #include "library.h" #include "mathlib.h" @@ -471,9 +470,6 @@ pack_t *FS_LoadPackPAK( const char *packfile ) return NULL; } - header.dirofs = LittleLong( header.dirofs ); - header.dirlen = LittleLong( header.dirlen ); - if( header.dirlen % sizeof( dpackfile_t )) { MsgDev( D_ERROR, "%s has an invalid directory size. Ignored.\n", packfile ); @@ -518,9 +514,7 @@ pack_t *FS_LoadPackPAK( const char *packfile ) // parse the directory for( i = 0; i < numpackfiles; i++ ) { - fs_offset_t offset = LittleLong( info[i].filepos ); - fs_offset_t size = LittleLong( info[i].filelen ); - FS_AddFileToPack( info[i].name, pack, offset, size ); + FS_AddFileToPack( info[i].name, pack, info[i].filepos, info[i].filelen ); } Mem_Free( info ); @@ -3553,9 +3547,6 @@ static qboolean W_ReadLumpTable( wfile_t *wad ) // swap everything for( i = 0; i < numlumps; i++ ) { - int filepos = LittleLong( srclumps[i].filepos ); - int realsize = LittleLong( srclumps[i].disksize ); - int size = LittleLong( srclumps[i].size ); char name[16]; // cleanup lumpname @@ -3565,7 +3556,7 @@ static qboolean W_ReadLumpTable( wfile_t *wad ) k = com.strlen( com.strrchr( name, '*' )); if( k ) name[com.strlen( name ) - k] = '!'; // quake1 issues (can't save images that contain '*' symbol) - W_AddFileToWad( name, wad, filepos, size, realsize, srclumps[i].type, srclumps[i].compression ); + W_AddFileToWad( name, wad, srclumps[i].filepos, srclumps[i].size, srclumps[i].disksize, srclumps[i].type, srclumps[i].compression ); } // release source lumps @@ -3662,7 +3653,7 @@ qboolean W_WriteLump( wfile_t *wad, dlumpinfo_t *lump, const void* data, size_t Mem_Free( outbuf ); return ( lump->disksize != 0 ) ? true : false; default: // CMP_NONE method - lump->size = lump->disksize = LittleLong( datasize ); + lump->size = lump->disksize = datasize; lump->compression = CMP_NONE; write( wad->handle, data, datasize ); // just write file return true; @@ -3680,8 +3671,6 @@ int W_Check( const char *filename ) { file_t *testwad; dwadinfo_t header; - int numlumps; - int infotableofs; testwad = FS_Open( filename, "rb", false ); if( !testwad ) return 0; // just not exist @@ -3704,15 +3693,14 @@ int W_Check( const char *filename ) return -2; // invalid id } - numlumps = LittleLong( header.numlumps ); - if( numlumps < 0 || numlumps > MAX_FILES_IN_WAD ) + if( header.numlumps < 0 || header.numlumps > MAX_FILES_IN_WAD ) { // invalid lump number FS_Close( testwad ); return -3; // invalid lumpcount } - infotableofs = LittleLong( header.infotableofs ); - if( FS_Seek( testwad, infotableofs, SEEK_SET )) + + if( FS_Seek( testwad, header.infotableofs, SEEK_SET )) { // corrupted or not wad FS_Close( testwad ); @@ -3757,8 +3745,8 @@ wfile_t *W_Open( const char *filename, const char *mode ) // save space for header hdr.ident = IDWAD3HEADER; - hdr.numlumps = LittleLong( wad->numlumps ); - hdr.infotableofs = LittleLong(sizeof( dwadinfo_t )); + hdr.numlumps = wad->numlumps; + hdr.infotableofs = sizeof( dwadinfo_t ); write( wad->handle, &hdr, sizeof( hdr )); write( wad->handle, comment, com.strlen( comment ) + 1 ); wad->infotableofs = tell( wad->handle ); @@ -3797,13 +3785,13 @@ wfile_t *W_Open( const char *filename, const char *mode ) return NULL; } - wad->numlumps = LittleLong( header.numlumps ); + wad->numlumps = header.numlumps; if( wad->numlumps >= MAX_FILES_IN_WAD && wad->mode == O_APPEND ) { MsgDev( D_WARN, "W_Open: %s is full (%i lumps)\n", wad->numlumps ); wad->mode = O_RDONLY; // set read-only mode } - wad->infotableofs = LittleLong( header.infotableofs ); // save infotableofs position + wad->infotableofs = header.infotableofs; // save infotableofs position if( lseek( wad->handle, wad->infotableofs, SEEK_SET ) == -1 ) { MsgDev( D_ERROR, "W_Open: %s can't find lump allocation table\n", filename ); @@ -3867,8 +3855,8 @@ void W_Close( wfile_t *wad ) // write the header hdr.ident = IDWAD3HEADER; - hdr.numlumps = LittleLong( wad->numlumps ); - hdr.infotableofs = LittleLong( ofs ); + hdr.numlumps = wad->numlumps; + hdr.infotableofs = ofs; lseek( wad->handle, 0, SEEK_SET ); write( wad->handle, &hdr, sizeof( hdr )); @@ -3920,7 +3908,7 @@ fs_offset_t W_SaveLump( wfile_t *wad, const char *lump, const void* data, size_t // write header W_CleanupName( lump, info->name ); - info->filepos = LittleLong( tell( wad->handle )); + info->filepos = tell( wad->handle ); info->compression = cmp; info->type = type; diff --git a/launch/hpak.c b/launch/hpak.c index 10a720c0..aff89a01 100644 --- a/launch/hpak.c +++ b/launch/hpak.c @@ -5,7 +5,6 @@ #include "launch.h" #include "wadfile.h" -#include "byteorder.h" #include "filesystem.h" convar_t *hpk_maxsize; @@ -402,17 +401,17 @@ static qboolean HPAK_Validate( const char *filename, qboolean quiet ) if( !quiet ) MsgDev( D_INFO, "Validating %s\n", pakname ); FS_Read( f, &hdr, sizeof( hdr )); - if( LittleLong( hdr.ident )!= IDCUSTOMHEADER || LittleLong( hdr.version ) != IDCUSTOM_VERSION ) + if( hdr.ident != IDCUSTOMHEADER || hdr.version != IDCUSTOM_VERSION ) { MsgDev( D_ERROR, "HPAK_ValidatePak: %s does not have a valid HPAK header.\n", pakname ); FS_Close( f ); return false; } - FS_Seek( f, LittleLong( hdr.seek ), SEEK_SET ); + FS_Seek( f, hdr.seek, SEEK_SET ); FS_Read( f, &num_lumps, sizeof( num_lumps )); - if( LittleLong( num_lumps ) < 1 || LittleLong( num_lumps ) > MAX_FILES_IN_WAD ) + if( num_lumps < 1 || num_lumps > MAX_FILES_IN_WAD ) { MsgDev( D_ERROR, "HPAK_ValidatePak: %s has too many lumps %u.\n", pakname, num_lumps ); FS_Close( f ); @@ -543,7 +542,7 @@ qboolean HPAK_ResourceForHash( const char *filename, char *inHash, resource_t *p FS_Read( f, &hdr, sizeof( hdr )); - if( LittleLong( hdr.ident ) != IDCUSTOMHEADER ) + if( hdr.ident != IDCUSTOMHEADER ) { MsgDev( D_ERROR, "HPAK_ResourceForHash: %s it's not a HPK file.\n", pakname ); FS_Close( f ); @@ -560,9 +559,9 @@ qboolean HPAK_ResourceForHash( const char *filename, char *inHash, resource_t *p FS_Seek( f, hdr.seek, SEEK_SET ); FS_Read( f, &hpakcontainer.count, sizeof( hpakcontainer.count )); - if( LittleLong( hpakcontainer.count ) < 1 || LittleLong( hpakcontainer.count ) > MAX_FILES_IN_WAD ) + if( hpakcontainer.count < 1 || hpakcontainer.count > MAX_FILES_IN_WAD ) { - MsgDev( D_ERROR, "HPAK_ResourceForHash: %s has too many lumps %u.\n", pakname, LittleLong( hpakcontainer.count )); + MsgDev( D_ERROR, "HPAK_ResourceForHash: %s has too many lumps %u.\n", pakname, hpakcontainer.count ); FS_Close( f ); return false; } @@ -593,7 +592,7 @@ qboolean HPAK_ResourceForIndex( const char *filename, int index, resource_t *pRe f = FS_Open( pakname, "rb", false ); FS_Read( f, &hdr, sizeof( hdr )); - if( LittleLong( hdr.ident ) != IDCUSTOMHEADER ) + if( hdr.ident != IDCUSTOMHEADER ) { MsgDev( D_ERROR, "HPAK_ResourceForIndex: %s it's not a HPK file.\n", pakname ); FS_Close( f ); @@ -610,9 +609,9 @@ qboolean HPAK_ResourceForIndex( const char *filename, int index, resource_t *pRe FS_Seek( f, hdr.seek, SEEK_SET ); FS_Read( f, &hpakcontainer.count, sizeof( hpakcontainer.count )); - if( LittleLong( hpakcontainer.count ) < 1 || LittleLong( hpakcontainer.count ) > MAX_FILES_IN_WAD ) + if( hpakcontainer.count < 1 || hpakcontainer.count > MAX_FILES_IN_WAD ) { - MsgDev( D_ERROR, "HPAK_ResourceForIndex: %s has too many lumps %u.\n", pakname, LittleLong( hpakcontainer.count )); + MsgDev( D_ERROR, "HPAK_ResourceForIndex: %s has too many lumps %u.\n", pakname, hpakcontainer.count ); FS_Close( f ); return false; } @@ -677,7 +676,7 @@ qboolean HPAK_GetDataPointer( const char *filename, resource_t *pResource, byte FS_Read( f, &hdr, sizeof( hdr )); - if( LittleLong( hdr.ident ) != IDCUSTOMHEADER ) + if( hdr.ident != IDCUSTOMHEADER ) { MsgDev( D_ERROR, "HPAK_GetDataPointer: %s it's not a HPK file.\n", pakname ); FS_Close( f ); @@ -694,7 +693,7 @@ qboolean HPAK_GetDataPointer( const char *filename, resource_t *pResource, byte FS_Seek( f, hdr.seek, SEEK_SET ); FS_Read( f, &num_lumps, sizeof( num_lumps )); - if( LittleLong( num_lumps ) < 1 || LittleLong( num_lumps ) > MAX_FILES_IN_WAD ) + if( num_lumps < 1 || num_lumps > MAX_FILES_IN_WAD ) { MsgDev( D_ERROR, "HPAK_GetDataPointer: %s has too many lumps %u.\n", filename, num_lumps ); FS_Close( f ); @@ -771,7 +770,7 @@ void HPAK_RemoveLump( const char *name, resource_t *resource ) FS_Read( f1, &hash_pack_header, sizeof( hpak_header_t )); FS_Write( f2, &hash_pack_header, sizeof( hpak_header_t )); - if( LittleLong( hash_pack_header.ident )!= IDCUSTOMHEADER || LittleLong( hash_pack_header.version ) != IDCUSTOM_VERSION ) + if( hash_pack_header.ident != IDCUSTOMHEADER || hash_pack_header.version != IDCUSTOM_VERSION ) { MsgDev( D_ERROR, "HPAK_RemoveLump: %s has invalid header.\n", read_path ); FS_Close( f1 ); @@ -783,7 +782,7 @@ void HPAK_RemoveLump( const char *name, resource_t *resource ) FS_Seek( f1, hash_pack_header.seek, SEEK_SET ); FS_Read( f1, &hpak_read.count, sizeof( hpak_read.count )); - if( LittleLong( hpak_read.count ) < 1 || LittleLong( hpak_read.count ) > MAX_FILES_IN_WAD ) + if( hpak_read.count < 1 || hpak_read.count > MAX_FILES_IN_WAD ) { MsgDev( D_ERROR, "HPAK_RemoveLump: %s has invalid number of lumps.\n", read_path ); FS_Close( f1 ); diff --git a/launch/imagelib/imagelib.h b/launch/imagelib/imagelib.h index 71f45d19..ae42c224 100644 --- a/launch/imagelib/imagelib.h +++ b/launch/imagelib/imagelib.h @@ -6,7 +6,6 @@ #define IMAGELIB_H #include "launch.h" -#include "byteorder.h" // skyorder_q2[6] = { 2, 3, 1, 0, 4, 5, }; // Quake, Half-Life skybox ordering // skyorder_ms[6] = { 4, 5, 1, 0, 2, 3 }; // Microsoft DDS ordering (reverse) diff --git a/launch/imagelib/img_bmp.c b/launch/imagelib/img_bmp.c index 30851462..6b21374b 100644 --- a/launch/imagelib/img_bmp.c +++ b/launch/imagelib/img_bmp.c @@ -23,20 +23,20 @@ qboolean Image_LoadBMP( const char *name, const byte *buffer, size_t filesize ) buf_p = (byte *)buffer; bhdr.id[0] = *buf_p++; bhdr.id[1] = *buf_p++; // move pointer - bhdr.fileSize = LittleLong(*(long *)buf_p); buf_p += 4; - bhdr.reserved0 = LittleLong(*(long *)buf_p); buf_p += 4; - bhdr.bitmapDataOffset = LittleLong(*(long *)buf_p); buf_p += 4; - bhdr.bitmapHeaderSize = LittleLong(*(long *)buf_p); buf_p += 4; - bhdr.width = LittleLong(*(long *)buf_p); buf_p += 4; - bhdr.height = LittleLong(*(long *)buf_p); buf_p += 4; - bhdr.planes = LittleShort(*(short *)buf_p); buf_p += 2; - bhdr.bitsPerPixel = LittleShort(*(short *)buf_p); buf_p += 2; - bhdr.compression = LittleLong(*(long *)buf_p); buf_p += 4; - bhdr.bitmapDataSize = LittleLong(*(long *)buf_p); buf_p += 4; - bhdr.hRes = LittleLong(*(long *)buf_p); buf_p += 4; - bhdr.vRes = LittleLong(*(long *)buf_p); buf_p += 4; - bhdr.colors = LittleLong(*(long *)buf_p); buf_p += 4; - bhdr.importantColors = LittleLong(*(long *)buf_p); buf_p += 4; + bhdr.fileSize = *(long *)buf_p; buf_p += 4; + bhdr.reserved0 = *(long *)buf_p; buf_p += 4; + bhdr.bitmapDataOffset = *(long *)buf_p; buf_p += 4; + bhdr.bitmapHeaderSize = *(long *)buf_p; buf_p += 4; + bhdr.width = *(long *)buf_p; buf_p += 4; + bhdr.height = *(long *)buf_p; buf_p += 4; + bhdr.planes = *(short *)buf_p; buf_p += 2; + bhdr.bitsPerPixel = *(short *)buf_p; buf_p += 2; + bhdr.compression = *(long *)buf_p; buf_p += 4; + bhdr.bitmapDataSize = *(long *)buf_p; buf_p += 4; + bhdr.hRes = *(long *)buf_p; buf_p += 4; + bhdr.vRes = *(long *)buf_p; buf_p += 4; + bhdr.colors = *(long *)buf_p; buf_p += 4; + bhdr.importantColors = *(long *)buf_p; buf_p += 4; // bogus file header check if( bhdr.reserved0 != 0 ) return false; diff --git a/launch/imagelib/img_dds.c b/launch/imagelib/img_dds.c index 2621a98a..61ad8653 100644 --- a/launch/imagelib/img_dds.c +++ b/launch/imagelib/img_dds.c @@ -1703,15 +1703,14 @@ qboolean Image_DecompressDXT( uint target, int level, int intformat, uint width, for( x = 0; x < w; x += 4 ) { sColor0 = *((word*)fin); - sColor0 = LittleShort(sColor0); + sColor0 = sColor0; sColor1 = *((word*)(fin + 2)); - sColor1 = LittleShort(sColor1); + sColor1 = sColor1; Image_DXTReadColor(sColor0, colours); Image_DXTReadColor(sColor1, colours + 1); bitmask = ((uint*)fin)[1]; - bitmask = LittleLong( bitmask ); fin += 8; if (sColor0 > sColor1) @@ -1779,7 +1778,6 @@ qboolean Image_DecompressDXT( uint target, int level, int intformat, uint width, fin += 8; Image_DXTReadColors( fin, colours ); bitmask = ((uint*)fin)[1]; - bitmask = LittleLong( bitmask ); fin += 8; // four-color block: derive the other two colors. @@ -1846,7 +1844,6 @@ qboolean Image_DecompressDXT( uint target, int level, int intformat, uint width, Image_DXTReadColors(fin, colours); bitmask = ((uint*)fin)[1]; - bitmask = LittleLong(bitmask); fin += 8; // four-color block: derive the other two colors. @@ -2098,10 +2095,10 @@ qboolean Image_DecompressARGB( uint target, int level, int intformat, uint width else if( image.palette ) { byte *pal = image.palette; //copy ptr - r_bitmask = BuffLittleLong( pal ); pal += 4; - g_bitmask = BuffLittleLong( pal ); pal += 4; - b_bitmask = BuffLittleLong( pal ); pal += 4; - a_bitmask = BuffLittleLong( pal ); pal += 4; + r_bitmask = *(long *)pal; pal += 4; + g_bitmask = *(long *)pal; pal += 4; + b_bitmask = *(long *)pal; pal += 4; + a_bitmask = *(long *)pal; pal += 4; } else return false; // rgba mask unset @@ -2122,10 +2119,11 @@ qboolean Image_DecompressARGB( uint target, int level, int intformat, uint width { // less than 4 byte to write? if( TempBpp == 1 ) ReadI = *((byte*) fin ); - else if( TempBpp == 2 ) ReadI = BuffLittleShort( fin ); - else if( TempBpp == 3 ) ReadI = BuffLittleLong( fin ); + else if( TempBpp == 2 ) ReadI = *(short *)fin; + else if( TempBpp == 3 ) ReadI = *(short *)fin; } - else ReadI = BuffLittleLong( fin ); + else ReadI = *(long *)fin; + fin += TempBpp; fout[i] = ((ReadI & r_bitmask)>> RedR) << RedL; @@ -2385,7 +2383,6 @@ qboolean Image_LoadDDS( const char *name, const byte *buffer, size_t filesize ) } Mem_Copy( &header, buffer, sizeof( dds_t )); - SwapBlock((int *)&header, sizeof( dds_t )); if( header.dwIdent != DDSHEADER ) return false; // it's not a dds file, just skip it if( header.dwSize != sizeof(dds_t) - sizeof( uint )) // size of the structure (minus MagicNum) diff --git a/launch/imagelib/img_pcx.c b/launch/imagelib/img_pcx.c index c3f0b6a7..02747b19 100644 --- a/launch/imagelib/img_pcx.c +++ b/launch/imagelib/img_pcx.c @@ -18,26 +18,17 @@ qboolean Image_LoadPCX( const char *name, const byte *buffer, size_t filesize ) byte *pix, *pbuf, *palette, *fin, *enddata; fin = (byte *)buffer; - Mem_Copy(&pcx, fin, sizeof(pcx)); + Mem_Copy( &pcx, fin, sizeof( pcx )); fin += sizeof(pcx); // probably it's not pcx file if( pcx.manufacturer != 0x0a || pcx.version != 5 || pcx.encoding != 1 ) return false; - if( filesize < (int)sizeof(pcx) + 768) + if( filesize < (int)sizeof(pcx) + 768 ) { MsgDev( D_ERROR, "Image_LoadPCX: file (%s) have invalid size\n", name ); return false; } - pcx.xmax = LittleShort (pcx.xmax); - pcx.xmin = LittleShort (pcx.xmin); - pcx.ymax = LittleShort (pcx.ymax); - pcx.ymin = LittleShort (pcx.ymin); - pcx.hres = LittleShort (pcx.hres); - pcx.vres = LittleShort (pcx.vres); - pcx.bytes_per_line = LittleShort (pcx.bytes_per_line); - pcx.palette_type = LittleShort (pcx.palette_type); - image.width = pcx.xmax + 1 - pcx.xmin; image.height = pcx.ymax + 1 - pcx.ymin; @@ -46,7 +37,8 @@ qboolean Image_LoadPCX( const char *name, const byte *buffer, size_t filesize ) MsgDev( D_ERROR, "Image_LoadPCX: (%s) have unknown version '%d'\n", name, pcx.version ); return false; } - if(!Image_ValidSize( name )) return false; + if( !Image_ValidSize( name )) + return false; palette = (byte *)buffer + filesize - 768; image.depth = 1; @@ -59,7 +51,7 @@ qboolean Image_LoadPCX( const char *name, const byte *buffer, size_t filesize ) for( y = 0; y < image.height && fin < enddata; y++ ) { pix = pbuf + y * image.width; - for (x = 0; x < image.width && fin < enddata;) + for( x = 0; x < image.width && fin < enddata; ) { dataByte = *fin++; if( dataByte >= 0xC0 ) @@ -74,7 +66,7 @@ qboolean Image_LoadPCX( const char *name, const byte *buffer, size_t filesize ) } // the number of bytes per line is always forced to an even number fin += pcx.bytes_per_line - image.width; - while(x < image.width) pix[x++] = 0; + while( x < image.width ) pix[x++] = 0; } // NOTE: IL_HINT_Q2 does wrong result for sprite frames. use with caution @@ -138,13 +130,13 @@ qboolean Image_SavePCX( const char *name, rgbdata_t *pix ) pcx.bits_per_pixel = 8; // 256 color pcx.xmin = 0; pcx.ymin = 0; - pcx.xmax = LittleShort((short)(pix->width - 1)); - pcx.ymax = LittleShort((short)(pix->height - 1)); - pcx.hres = LittleShort((short)pix->width); - pcx.vres = LittleShort((short)pix->height); + pcx.xmax = (short)(pix->width - 1); + pcx.ymax = (short)(pix->height - 1); + pcx.hres = (short)pix->width; + pcx.vres = (short)pix->height; pcx.color_planes = 1; // chunky image - pcx.bytes_per_line = LittleShort((short)pix->width); - pcx.palette_type = LittleShort( 1 ); // not a grey scale + pcx.bytes_per_line = (short)pix->width; + pcx.palette_type = 1; // not a grey scale // pack the image palette = pix->palette; diff --git a/launch/imagelib/img_tga.c b/launch/imagelib/img_tga.c index a713b63f..e5651462 100644 --- a/launch/imagelib/img_tga.c +++ b/launch/imagelib/img_tga.c @@ -30,10 +30,10 @@ qboolean Image_LoadTGA( const char *name, const byte *buffer, size_t filesize ) targa_header.colormap_index = buf_p[0] + buf_p[1] * 256; buf_p += 2; targa_header.colormap_length = buf_p[0] + buf_p[1] * 256; buf_p += 2; targa_header.colormap_size = *buf_p; buf_p += 1; - targa_header.x_origin = LittleShort( *((short *)buf_p )); buf_p += 2; - targa_header.y_origin = LittleShort( *((short *)buf_p )); buf_p += 2; - targa_header.width = image.width = LittleShort(*((short *)buf_p)); buf_p += 2; - targa_header.height = image.height = LittleShort(*((short *)buf_p)); buf_p += 2; + targa_header.x_origin = *(short *)buf_p; buf_p += 2; + targa_header.y_origin = *(short *)buf_p; buf_p += 2; + targa_header.width = image.width = *(short *)buf_p; buf_p += 2; + targa_header.height = image.height = *(short *)buf_p; buf_p += 2; targa_header.pixel_size = *buf_p++; targa_header.attributes = *buf_p++; if( targa_header.id_length != 0 ) buf_p += targa_header.id_length; // skip TARGA image comment diff --git a/launch/imagelib/img_utils.c b/launch/imagelib/img_utils.c index b927b662..416ecc94 100644 --- a/launch/imagelib/img_utils.c +++ b/launch/imagelib/img_utils.c @@ -498,51 +498,51 @@ void Image_SetPalette( const byte *pal, uint *d_table ) case LUMP_DECAL: for( i = 0; i < 256; i++ ) { - rgba[3] = pal[765]; - rgba[2] = pal[766]; - rgba[1] = pal[767]; - rgba[0] = i; - d_table[i] = BuffBigLong( rgba ); + rgba[0] = pal[765]; + rgba[1] = pal[766]; + rgba[2] = pal[767]; + rgba[3] = i; + d_table[i] = *(uint *)rgba; } break; case LUMP_TRANSPARENT: for( i = 0; i < 256; i++ ) { - rgba[3] = pal[i*3+0]; - rgba[2] = pal[i*3+1]; - rgba[1] = pal[i*3+2]; - rgba[0] = pal[i] == 255 ? pal[i] : 0xFF; - d_table[i] = BuffBigLong( rgba ); + rgba[0] = pal[i*3+0]; + rgba[1] = pal[i*3+1]; + rgba[2] = pal[i*3+2]; + rgba[3] = pal[i] == 255 ? pal[i] : 0xFF; + d_table[i] = *(uint *)rgba; } break; case LUMP_QFONT: - for (i = 1; i < 256; i++) + for( i = 1; i < 256; i++ ) { - rgba[3] = pal[i*3+0]; - rgba[2] = pal[i*3+1]; - rgba[1] = pal[i*3+2]; - rgba[0] = 0xFF; - d_table[i] = BuffBigLong( rgba ); + rgba[0] = pal[i*3+0]; + rgba[1] = pal[i*3+1]; + rgba[2] = pal[i*3+2]; + rgba[3] = 0xFF; + d_table[i] = *(uint *)rgba; } break; case LUMP_NORMAL: - for (i = 0; i < 256; i++) + for( i = 0; i < 256; i++ ) { - rgba[3] = pal[i*3+0]; - rgba[2] = pal[i*3+1]; - rgba[1] = pal[i*3+2]; - rgba[0] = 0xFF; - d_table[i] = BuffBigLong( rgba ); + rgba[0] = pal[i*3+0]; + rgba[1] = pal[i*3+1]; + rgba[2] = pal[i*3+2]; + rgba[3] = 0xFF; + d_table[i] = *(uint *)rgba; } break; case LUMP_EXTENDED: - for (i = 0; i < 256; i++) + for( i = 0; i < 256; i++ ) { - rgba[3] = pal[i*4+0]; - rgba[2] = pal[i*4+1]; - rgba[1] = pal[i*4+2]; - rgba[0] = pal[i*4+3]; - d_table[i] = BuffBigLong( rgba ); + rgba[0] = pal[i*4+0]; + rgba[1] = pal[i*4+1]; + rgba[2] = pal[i*4+2]; + rgba[3] = pal[i*4+3]; + d_table[i] = *(uint *)rgba; } break; } @@ -588,7 +588,7 @@ void Image_GetPaletteQ2( void ) if(!q2palette_init) { Image_SetPalette( palette_q2, d_8toQ2table ); - d_8toQ2table[255] &= LittleLong(0xffffff); + d_8toQ2table[255] &= 0xFFFFFF; q2palette_init = true; } image.d_currentpal = d_8toQ2table; @@ -614,7 +614,7 @@ void Image_GetPalettePCX( const byte *pal ) if( pal ) { Image_SetPalette( pal, d_8to24table ); - d_8to24table[255] &= LittleLong(0xffffff); + d_8to24table[255] &= 0xFFFFFF; image.d_currentpal = d_8to24table; } else Image_GetPaletteQ2(); @@ -638,7 +638,7 @@ void Image_GetPaletteLMP( const byte *pal, int rendermode ) if( pal ) { Image_SetPalette( pal, d_8to24table ); - d_8to24table[255] &= LittleLong(0xffffff); + d_8to24table[255] &= 0xFFFFFF; image.d_currentpal = d_8to24table; } else if( rendermode == LUMP_QFONT ) diff --git a/launch/imagelib/img_vtf.c b/launch/imagelib/img_vtf.c index 5ad13ff3..17163815 100644 --- a/launch/imagelib/img_vtf.c +++ b/launch/imagelib/img_vtf.c @@ -73,16 +73,14 @@ typically params: 16x16 DXT1 but can be missing size_t Image_VTFCalcLowResSize( vtf_t *hdr ) { size_t buffsize = 0; - int w, h, format; + int format; - format = Image_VTFFormat( LittleLong( hdr->lowResImageFormat )); + format = Image_VTFFormat( hdr->lowResImageFormat ); // missing lowRes image for -1 value if( format != VTF_UNKNOWN ) { - w = LittleShort( hdr->lowResImageWidth ); - h = LittleShort( hdr->lowResImageHeight ); - buffsize = Image_DXTGetLinearSize( format, w, h, 1, 0 ); + buffsize = Image_DXTGetLinearSize( format, hdr->lowResImageWidth, hdr->lowResImageHeight, 1, 0 ); } return buffsize; } @@ -100,8 +98,8 @@ size_t Image_VTFCalcMipmapSize( vtf_t *hdr, int mipNum ) size_t buffsize = 0; int w, h, mipsize; - w = max( 1, LittleShort( hdr->width )>>mipNum ); - h = max( 1, LittleShort( hdr->height )>>mipNum ); + w = max( 1, hdr->width >> mipNum ); + h = max( 1, hdr->height >> mipNum ); mipsize = Image_DXTGetLinearSize( image.type, w, h, 1, 0 ); return mipsize; } @@ -215,50 +213,52 @@ qboolean Image_LoadVTF( const char *name, const byte *buffer, size_t filesize ) byte *fin; string shortname; qboolean oldformat = false; - int i, flags, vtfFormat; uint hdrSize, biasSize, resSize, lowResSize; + int i, flags; fin = (byte *)buffer; Mem_Copy( &vtf, fin, sizeof( vtf )); - hdrSize = LittleLong( vtf.hdr_size ); + hdrSize = vtf.hdr_size; biasSize = 0; - if( LittleLong( vtf.ident ) != VTFHEADER ) + if( vtf.ident != VTFHEADER ) return false; // it's not a vtf file, just skip it FS_FileBase( name, shortname ); // bounds check - i = LittleLong( vtf.ver_major ); + i = vtf.ver_major; if( i != VTF_VERSION ) { MsgDev( D_ERROR, "Image_LoadVTF: %s has wrong ver (%i should be %i)\n", shortname, i, VTF_VERSION ); return false; } - i = LittleLong( vtf.ver_minor ); + i = vtf.ver_minor; if( i == VTF_SUBVERSION0 && vtf.hdr_size == 64 ) oldformat = true; // 7.0 hasn't envmap for cubemap images // all other subversions are valid - image.width = LittleShort( vtf.width ); - image.height = LittleShort( vtf.height ); - if(!Image_ValidSize( name )) return false; + image.width = vtf.width; + image.height = vtf.height; + + if( !Image_ValidSize( name )) + return false; // translate VF_flags into IMAGE_flags - flags = LittleLong( vtf.flags ); + flags = vtf.flags; + if(( flags & VF_ONEBITALPHA ) || ( flags & VF_EIGHTBITALPHA )) image.flags |= IMAGE_HAS_ALPHA; if( flags & VF_ENVMAP ) image.flags |= IMAGE_CUBEMAP; - vtfFormat = LittleLong( vtf.imageFormat ); - image.type = Image_VTFFormat( vtfFormat ); - image.depth = LittleLong( vtf.num_frames ); - image.num_mips = LittleLong( vtf.numMipLevels ); + image.type = Image_VTFFormat( vtf.imageFormat ); + image.depth = vtf.num_frames; + image.num_mips = vtf.numMipLevels; if( image.type == PF_UNKNOWN ) { - MsgDev( D_ERROR, "Image_LoadVTF: file (%s) has unknown format %i\n", shortname, vtfFormat ); + MsgDev( D_ERROR, "Image_LoadVTF: file (%s) has unknown format %i\n", shortname, vtf.imageFormat ); return false; } diff --git a/launch/imagelib/img_wad.c b/launch/imagelib/img_wad.c index b130fc19..aa4c4cb1 100644 --- a/launch/imagelib/img_wad.c +++ b/launch/imagelib/img_wad.c @@ -62,7 +62,7 @@ qboolean Image_LoadFNT( const char *name, const byte *buffer, size_t filesize ) qfont_t font; const byte *pal, *fin; size_t size; - int i, numcolors; + int numcolors; if( image.hint == IL_HINT_Q1 ) return false; // Quake1 doesn't have qfonts @@ -70,18 +70,6 @@ qboolean Image_LoadFNT( const char *name, const byte *buffer, size_t filesize ) if( filesize < sizeof( font )) return false; Mem_Copy( &font, buffer, sizeof( font )); - - // swap header - font.width = LittleLong( font.width ); - font.height = LittleLong( font.height ); - font.rowcount = LittleLong( font.rowcount ); - font.rowheight = LittleLong( font.rowheight ); - - for( i = 0; i < 256; i++ ) - { - font.fontinfo[i].startoffset = LittleShort( font.fontinfo[i].startoffset ); - font.fontinfo[i].charwidth = LittleShort( font.fontinfo[i].charwidth ); - } // last sixty four bytes - what the hell ???? size = sizeof( qfont_t ) - 4 + ( 128 * font.width * QCHAR_WIDTH ) + sizeof( short ) + 768 + 64; @@ -103,7 +91,7 @@ qboolean Image_LoadFNT( const char *name, const byte *buffer, size_t filesize ) fin = buffer + sizeof( font ) - 4; pal = fin + (image.width * image.height); - numcolors = BuffLittleShort( pal ), pal += sizeof( short ); + numcolors = *(short *)pal, pal += sizeof( short ); image.flags |= IMAGE_HAS_ALPHA; // fonts always have transparency if( numcolors == 768 ) @@ -142,11 +130,10 @@ qboolean Image_LoadMDL( const char *name, const byte *buffer, size_t filesize ) int i, flags; pin = (mstudiotexture_t *)buffer; - flags = LittleLong( pin->flags ); + flags = pin->flags; - // Valve never used endian functions for studiomodels... - image.width = LittleLong( pin->width ); - image.height = LittleLong( pin->height ); + image.width = pin->width; + image.height = pin->height; pixels = image.width * image.height; fin = (byte *)pin->index; // setup buffer @@ -226,8 +213,8 @@ qboolean Image_LoadSPR( const char *name, const byte *buffer, size_t filesize ) else return false; // unknown mode rejected pin = (dspriteframe_t *)buffer; - image.width = LittleLong( pin->width ); - image.height = LittleLong( pin->height ); + image.width = pin->width; + image.height = pin->height; if( filesize < image.width * image.height ) { @@ -266,13 +253,16 @@ qboolean Image_LoadWAL( const char *name, const byte *buffer, size_t filesize ) } Mem_Copy( &wal, buffer, sizeof( wal )); - flags = LittleLong(wal.flags); - value = LittleLong(wal.value); - contents = LittleLong(wal.contents); - image.width = LittleLong(wal.width); - image.height = LittleLong(wal.height); - for(i = 0; i < 4; i++) ofs[i] = LittleLong(wal.offsets[i]); - if(!Image_LumpValidSize( name )) return false; + flags = wal.flags; + value = wal.value; + contents = wal.contents; + image.width = wal.width; + image.height = wal.height; + + Mem_Copy( ofs, wal.offsets, sizeof( ofs )); + + if( !Image_LumpValidSize( name )) + return false; pixels = image.width * image.height; mipsize = (int)sizeof(wal) + ofs[0] + pixels; @@ -325,13 +315,14 @@ qboolean Image_LoadFLT( const char *name, const byte *buffer, size_t filesize ) // stupid copypaste from DevIL, but it works f = VFS_Create( buffer, filesize ); first_pos = VFS_Tell( f ); - VFS_Read(f, &flat, sizeof(flat)); + VFS_Read(f, &flat, sizeof( flat )); + + image.width = flat.width; + image.height = flat.height; + + if( !Image_LumpValidSize( name )) + return false; - image.width = LittleShort( flat.width ); - image.height = LittleShort( flat.height ); - flat.desc[0] = LittleShort( flat.desc[0] ); - flat.desc[1] = LittleShort( flat.desc[1] ); - if(!Image_LumpValidSize( name )) return false; Data = (byte *)Mem_Alloc( Sys.imagepool, image.width * image.height ); Mem_Set( Data, 247, image.width * image.height ); // set default transparency image.depth = 1; @@ -424,8 +415,8 @@ qboolean Image_LoadLMP( const char *name, const byte *buffer, size_t filesize ) { fin = (byte *)buffer; Mem_Copy( &lmp, fin, sizeof( lmp )); - image.width = LittleLong( lmp.width ); - image.height = LittleLong( lmp.height ); + image.width = lmp.width; + image.height = lmp.height; rendermode = LUMP_NORMAL; fin += sizeof(lmp); } @@ -437,7 +428,9 @@ qboolean Image_LoadLMP( const char *name, const byte *buffer, size_t filesize ) return false; } - if(!Image_ValidSize( name )) return false; + if( !Image_ValidSize( name )) + return false; + image.depth = 1; if( image.hint != IL_HINT_Q1 && filesize > (int)sizeof(lmp) + pixels ) @@ -445,7 +438,7 @@ qboolean Image_LoadLMP( const char *name, const byte *buffer, size_t filesize ) int numcolors; pal = fin + pixels; - numcolors = BuffLittleShort( pal ); + numcolors = *(short *)pal; if( numcolors != 256 ) pal = NULL; // corrupted lump ? else pal += sizeof( short ); } @@ -477,10 +470,13 @@ qboolean Image_LoadMIP( const char *name, const byte *buffer, size_t filesize ) } Mem_Copy( &mip, buffer, sizeof( mip )); - image.width = LittleLong( mip.width ); - image.height = LittleLong( mip.height ); - if(!Image_ValidSize( name )) return false; - for( i = 0; i < 4; i++ ) ofs[i] = LittleLong( mip.offsets[i] ); + image.width = mip.width; + image.height = mip.height; + + if( !Image_ValidSize( name )) + return false; + + Mem_Copy( ofs, mip.offsets, sizeof( ofs )); pixels = image.width * image.height; image.depth = 1; @@ -489,7 +485,7 @@ qboolean Image_LoadMIP( const char *name, const byte *buffer, size_t filesize ) // half-life 1.0.0.1 mip version with palette fin = (byte *)buffer + mip.offsets[0]; pal = (byte *)buffer + mip.offsets[0] + (((image.width * image.height) * 85)>>6); - numcolors = BuffLittleShort( pal ); + numcolors = *(short *)pal; if( numcolors != 256 ) pal = NULL; // corrupted mip ? else pal += sizeof( short ); // skip colorsize diff --git a/launch/imagelib/jpg.lib b/launch/imagelib/jpeg.lib similarity index 100% rename from launch/imagelib/jpg.lib rename to launch/imagelib/jpeg.lib diff --git a/launch/launch.dsp b/launch/launch.dsp index 7616c6a0..e70aefb4 100644 --- a/launch/launch.dsp +++ b/launch/launch.dsp @@ -54,7 +54,7 @@ BSC32=bscmake.exe # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 /opt:nowin98 -# ADD LINK32 jpg.lib ogg.lib vorbis.lib mpeg.lib user32.lib gdi32.lib shell32.lib advapi32.lib winmm.lib /nologo /dll /pdb:none /machine:I386 /nodefaultlib:"libc" /nodefaultlib:"libcmt" /libpath:"./imagelib" /libpath:"./soundlib" /opt:nowin98 +# ADD LINK32 jpeg.lib mpeg.lib user32.lib gdi32.lib shell32.lib advapi32.lib winmm.lib /nologo /dll /pdb:none /machine:I386 /nodefaultlib:"libc" /nodefaultlib:"libcmt" /libpath:"./imagelib" /libpath:"./soundlib" /opt:nowin98 # Begin Custom Build TargetDir=\Xash3D\src_main\temp\launch\!release InputPath=\Xash3D\src_main\temp\launch\!release\launch.dll @@ -90,7 +90,7 @@ BSC32=bscmake.exe # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept -# ADD LINK32 jpg.lib ogg.lib mpeg.lib vorbis.lib user32.lib gdi32.lib shell32.lib advapi32.lib winmm.lib /nologo /dll /debug /machine:I386 /nodefaultlib:"libcmt" /nodefaultlib:"libc" /pdbtype:sept /libpath:"./imagelib" /libpath:"./soundlib" +# ADD LINK32 jpeg.lib mpeg.lib user32.lib gdi32.lib shell32.lib advapi32.lib winmm.lib /nologo /dll /debug /machine:I386 /nodefaultlib:"libcmt" /nodefaultlib:"libc" /pdbtype:sept /libpath:"./imagelib" /libpath:"./soundlib" # Begin Custom Build TargetDir=\Xash3D\src_main\temp\launch\!debug InputPath=\Xash3D\src_main\temp\launch\!debug\launch.dll @@ -220,10 +220,6 @@ SOURCE=.\soundlib\snd_mp3.c # End Source File # Begin Source File -SOURCE=.\soundlib\snd_ogg.c -# End Source File -# Begin Source File - SOURCE=.\soundlib\snd_raw.c # End Source File # Begin Source File diff --git a/launch/network.c b/launch/network.c index db047898..feec43cc 100644 --- a/launch/network.c +++ b/launch/network.c @@ -5,8 +5,6 @@ #include #include "launch.h" -#include "engine_api.h" // network message length -#include "byteorder.h" // This is the packet payload without any header bytes (which are attached for actual sending) #define NET_MAX_PAYLOAD 80000 diff --git a/launch/soundlib/ogg.lib b/launch/soundlib/ogg.lib deleted file mode 100644 index 6802905dd695aea242d5c80d3e86e56d60aa21b5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27254 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 0 ) + while(( ret = ov_read( &vf, &sound.wav[done], (int)(sound.size - done), false, 2, 1, &dummy )) > 0 ) done += ret; sound.samples = done / ( vi->channels * 2 ); vc = ov_comment( &vf, -1 ); @@ -477,7 +477,7 @@ long Stream_ReadOGG( stream_t *stream, long bytes, void *buffer ) while( 1 ) { // read some bytes from the OGG codec - c = ov_read(( vorbisfile_t *)stream->ptr, bufPtr, bytesLeft, big_endian, 2, 1, &dummy ); + c = ov_read(( vorbisfile_t *)stream->ptr, bufPtr, bytesLeft, false, 2, 1, &dummy ); // no more bytes are left if( c <= 0 ) break; diff --git a/launch/soundlib/snd_utils.c b/launch/soundlib/snd_utils.c index 67f34cb8..39f1fac7 100644 --- a/launch/soundlib/snd_utils.c +++ b/launch/soundlib/snd_utils.c @@ -19,22 +19,14 @@ static const loadwavformat_t load_null[] = { NULL, NULL, NULL } }; -// version0 - using only ogg sounds -static const loadwavformat_t load_stalker[] = -{ -{ "sound/%s%s.%s", "ogg", Sound_LoadOGG }, -{ "%s%s.%s", "ogg", Sound_LoadOGG }, -{ NULL, NULL, NULL } -}; - -// version1 - using only Doom1 sounds +// version0 - using only Doom1 sounds static const loadwavformat_t load_doom1[] = { { "%s%s.%s", "snd", Sound_LoadSND }, { NULL, NULL, NULL } }; -// version2 - using only Quake1 sounds +// version1 - using only Quake1 sounds static const loadwavformat_t load_quake1[] = { { "sound/%s%s.%s", "wav", Sound_LoadWAV }, @@ -42,15 +34,13 @@ static const loadwavformat_t load_quake1[] = { NULL, NULL, NULL } }; -// version3 - Xash3D default sound profile +// version2 - Xash3D default sound profile static const loadwavformat_t load_xash[] = { { "sound/%s%s.%s", "wav", Sound_LoadWAV }, { "%s%s.%s", "wav", Sound_LoadWAV }, { "sound/%s%s.%s", "mp3", Sound_LoadMPG }, { "%s%s.%s", "mp3", Sound_LoadMPG }, -{ "sound/%s%s.%s", "ogg", Sound_LoadOGG }, -{ "%s%s.%s", "ogg", Sound_LoadOGG }, { NULL, NULL, NULL } }; @@ -67,25 +57,17 @@ static const streamformat_t stream_null[] = { NULL, NULL, NULL, NULL, NULL } }; -// version0 - using only ogg streams -static const streamformat_t stream_stalker[] = -{ -{ "%s%s.%s", "ogg", Stream_OpenOGG, Stream_ReadOGG, Stream_FreeOGG }, -{ NULL, NULL, NULL, NULL, NULL } -}; - -// version1 - using only wav streams +// version0 - using only wav streams static const streamformat_t stream_quake3[] = { { "%s%s.%s", "wav", Stream_OpenWAV, Stream_ReadWAV, Stream_FreeWAV }, { NULL, NULL, NULL, NULL, NULL } }; -// version3 - Xash3D default stream profile +// version1 - Xash3D default stream profile static const streamformat_t stream_xash[] = { { "%s%s.%s", "mp3", Stream_OpenMPG, Stream_ReadMPG, Stream_FreeMPG }, -{ "%s%s.%s", "ogg", Stream_OpenOGG, Stream_ReadOGG, Stream_FreeOGG }, { "%s%s.%s", "wav", Stream_OpenWAV, Stream_ReadWAV, Stream_FreeWAV }, { NULL, NULL, NULL, NULL, NULL } }; @@ -151,11 +133,6 @@ void Sound_Setup( const char *formats, const uint flags ) sound.loadformats = load_xash; sound.streamformat = stream_xash; } - else if( !com.stricmp( formats, "stalker" ) || !com.stricmp( formats, "S.T.A.L.K.E.R" )) - { - sound.loadformats = load_stalker; - sound.streamformat = stream_stalker; - } else if( !com.stricmp( formats, "Doom1" ) || !com.stricmp( formats, "Doom2" )) { sound.loadformats = load_doom1; @@ -211,25 +188,6 @@ byte *Sound_Copy( size_t size ) return out; } -/* -================= -Sound_ByteSwapRawSamples -================= -*/ -void Sound_ByteSwapRawSamples( int samples, int width, int s_channels, const byte *data ) -{ - int i; - - if( !big_endian ) return; - if( width != 2 ) return; - - if( s_channels == 2 ) - samples <<= 1; - - for( i = 0; i < samples; i++ ) - ((short *)data)[i] = LittleShort((( short *)data)[i] ); -} - /* ================ Sound_ConvertToSigned @@ -301,8 +259,8 @@ qboolean Sound_ResampleInternal( wavdata_t *sc, int inrate, int inwidth, int out if( inwidth == 2 ) { - sample = LittleShort(((short *)data)[srcsample*2+0] ); - sample2 = LittleShort(((short *)data)[srcsample*2+1] ); + sample = ((short *)data)[srcsample*2+0]; + sample2 = ((short *)data)[srcsample*2+1]; } else { @@ -329,7 +287,7 @@ qboolean Sound_ResampleInternal( wavdata_t *sc, int inrate, int inwidth, int out srcsample = samplefrac >> 8; samplefrac += fracstep; - if( inwidth == 2 ) sample = LittleShort(((short *)data)[srcsample] ); + if( inwidth == 2 ) sample = ((short *)data)[srcsample]; else sample = (int)( (char)(data[srcsample])) << 8; if( outwidth == 2 ) ((short *)sound.tempbuffer)[i] = sample; diff --git a/launch/soundlib/snd_wav.c b/launch/soundlib/snd_wav.c index 85543d8d..86a34715 100644 --- a/launch/soundlib/snd_wav.c +++ b/launch/soundlib/snd_wav.c @@ -99,7 +99,6 @@ qboolean StreamFindNextChunk( file_t *file, const char *name, int *last_chunk ) FS_Seek( file, 4, SEEK_CUR ); FS_Read( file, &iff_chunk_len, sizeof( iff_chunk_len )); - iff_chunk_len = LittleLong( iff_chunk_len ); if( iff_chunk_len < 0 ) return false; // didn't find the chunk @@ -306,7 +305,7 @@ stream_t *Stream_OpenWAV( const char *filename ) FS_Read( file, chunkName, 4 ); FS_Read( file, &t, sizeof( t )); - if( LittleShort( t ) != 1 ) + if( t != 1 ) { MsgDev( D_ERROR, "Stream_OpenWAV: %s not a microsoft PCM format\n", filename ); FS_Close( file ); @@ -314,15 +313,14 @@ stream_t *Stream_OpenWAV( const char *filename ) } FS_Read( file, &t, sizeof( t )); - sound.channels = LittleShort( t ); + sound.channels = t; FS_Read( file, &sound.rate, sizeof( int )); - sound.rate = LittleLong( sound.rate ); FS_Seek( file, 6, SEEK_CUR ); FS_Read( file, &t, sizeof( t )); - sound.width = LittleShort( t ) / 8; + sound.width = t / 8; sound.loopstart = 0; @@ -336,7 +334,7 @@ stream_t *Stream_OpenWAV( const char *filename ) } FS_Read( file, &sound.samples, sizeof( int )); - sound.samples = ( LittleLong( sound.samples ) / sound.width ) / sound.channels; + sound.samples = ( sound.samples / sound.width ) / sound.channels; // at this point we have valid stream stream = Mem_Alloc( Sys.soundpool, sizeof( stream_t )); @@ -370,7 +368,6 @@ long Stream_ReadWAV( stream_t *stream, long bytes, void *buffer ) stream->pos += bytes; samples = ( bytes / stream->width ) / stream->channels; FS_Read( stream->file, buffer, bytes ); - Sound_ByteSwapRawSamples( samples, stream->width, stream->channels, buffer ); return bytes; } diff --git a/launch/soundlib/soundlib.h b/launch/soundlib/soundlib.h index fd168e80..dba3be9f 100644 --- a/launch/soundlib/soundlib.h +++ b/launch/soundlib/soundlib.h @@ -6,7 +6,6 @@ #define SOUNDLIB_H #include "launch.h" -#include "byteorder.h" typedef struct loadwavformat_s { @@ -105,9 +104,4 @@ void Stream_FreeMPG( stream_t *stream ); // qboolean Sound_SaveWAV( const char *name, wavdata_t *pix ); -// -// snd_utils.c -// -void Sound_ByteSwapRawSamples( int samples, int width, int s_channels, const byte *data ); - #endif//SOUNDLIB_H \ No newline at end of file diff --git a/launch/soundlib/vorbis.lib b/launch/soundlib/vorbis.lib deleted file mode 100644 index 9eea37a0714237c3f17d1da4ec38612ee71524c8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 266902 zcmeFa3w+eYwFmx7c1ae9WRX>(L|tW3GzgpQ=EVkB$P*zU5J>O}EP0Y(ATim1)DRwP zkab)Hd$q;Z*0$DG+gq*nq1CntC;@yCZ8Z_FzS;{n+G6n$Yc&7wnfX1lyMVU${_p>D z{{#EW`JFj)=6z=7%$fOJo>SRUT|axw47<^#rlq=4)6z3C+(x`peofC#&lKS5F_I(= zNs{xffBi4lE=kdTOWu^Ef97}VqmpzkzXyLMNniE%`y-O1|Mh+>NfCZAiLXoll3&63 zQVjhTe*Dk<)?F#ZD8D?9_1j8beAH zdbiV=T3eNso;HHN+nHABf`dPID!toPmzJ67RNvDxD~UjPuXZ_k79_2t);Be@ZjyW( znp&z*Zb|_v0bF%TQb$DORP!t+KxRKkiOX(L!QtZxWMu0u-K)Yc%K3N^)s>cyXt$d-oY>ZTUZj>x2srw~mgf=^pr zU9FZ(rC5B1w5ZsPElvJfl?mtS8<9_*Iz#B1*5(mJt((^S>uag`auyBiRhF8MfrW-{ ztZdfjL-S~^UKiN|?O!VqjlQL})nD17mB_}1^)*c!)r3?vHQnf|sjY6R(dAdeZJ>IO zM7+V*s;^mH2(-BVjA1XbFd0Vi6P0ky8O1!ZMGwW9Y{*N;TjH`JlYh@x|)W!Ki? zzxtk4lUkLTnyJ25x>M__v+5*YU1L*Ii_=$ob8}ORzp8D0O`{sf?X0cDe^mgx-I-hx z$$?Ul710tn54;+9$jCa98#3Im-e23&+|)?2iSWuuwxD!T9>$=&62r)oQ8<6zJg*QJ z1`iBL^Gk~7dY3me*Uxb;YFRTUy|JOHoD0u6>GS81q|SusPg6!DKFn0rjjYX)lBgcN zv9?9uQ>&ZSt*c${H}no2&gZXOqc&p&Zzai8YHj%12(&SMoYIguO$>?HB1^y;;i)F0vANn; z*V44kN3#M0wz;LYrlDGEnN`)9+0~V)&g$$mcUqcDZILyV>2)<|V5yne8SdWp+uRc0I=PQ(??ygV zQR1sk6@6RHTXj<_x{fBsDEBq<45)_n8(MElL$?UW8ZcCN{w7~zYqQE7Frlj3S~jRz zan;piq`EUJYvqTU1*ejQb(PJ{4eQrL?#`~-YFBMts#dafu5_onPOE{sjOr|xzT`xX zm8TM2RoHZ7T}`#$R|T2Av64o3{wg;!4%aoc=zL@uCu*@)NxD+2E>~qX=2g!0bXQu2 zDtcUXnYxT;ssO?671FvZG9t97S^^Qp^BO?PLG z6!oq;qcqX@z@siZQyB;pJk1eBPL1htJ5w`js_QZoKaD<3nO5=u8s24?3u^fEY{7XX ze^Cx9o!W{;dAL(WN;Q9DeL&=A69>iLSgJaFY8KUlI;3L2)Ja^V*N>1)McCzx~cb(O7rjBWNc)zx8=geiE9Z(YO9f`rm1H)rBSugW;x?7OM0 za=jn%$f@+Lt6kS5f{pai;%os8W&(Uv6tw=P^|c}q^>wJ3nzm|xLldT+g2q=0NbcJl z#ssmUrmdD>fKFZv?wX9BV`hp5qjjTK}M&Im`wPpFeOGI@Yy3u!oR5*L3s&psBEOA zB=>1suN1l{x=Oz*%_mPOQQG`f$)~TOu?eF$%Js%t-$pD=z(t-Ba9+l7QlK#7ZmiW- z1S*n(8$(kAi8x2+9?HZ?j!!oOHpZ&+s6hd=G@(b-wAAT^Eq|3maagSe{w5l#91oQQ z8aH3q7$yeln6G9+#rWzg8|!E_c?K_Ea|BN;L91_UTHnY!vAnQtZf@Mb){Y`rIw697v&ZZdZA&q=XQ+{gqg7tMPO>PAmO7z3TZwy{wq@i+M^#am0|MlAy6MGZ&@ zH6VY{0`g@mqNMdJiKt3ZK9t(ZDiYQ3Yprc*sBB!{wyuiS@PzP#e4WUfpLb^<2^f)Y zj#3MT=CxWX)i*Vn8b&P$Bg#mr=7pGi}I>E?Mc()k53(#H#9q$}6ONUz@+Bfa_v-q*)UZ?wcp8Q+VQ z-1}msdNdGbFhiGTi|RXWqZ7@kfGf5xH& z#6L>AD0j1D{6|=e;on%$j#V*KT4V5!{!ZXLDEtJ_Ou#=1Nxa2B!k&3u96|9LQDA-r zZSXnDSUG)B7wG4rRQ@t6csag#|DCGn|Aq+$pWpHMT7;>_i20mO4~{trUmIzIlX2(@ z)9sAZlSkF{2)?c_y#kM-cOSWSi?VVKUw4kk&zIKUM_VI~T+c?+^BdQ>(bty7wa}MW zH-6c*X*Bg@RJGqH_!<_*0F>o~5q`9H46Q8y;#&E2oEZs#+Ik(v{Z z{O31cd`3-E6xH!pQSD+`_y4b?Yj0E+p8t1N(hz+A7qpQhHV#$gm)hmI*wpXRX+BYG z8p8J;)gT5Ho{Ak|?(jct@u6r+xk-glX(`4GL#qD;3f2Gb**ow|b9HZ|v~!OUdSGP- zSZ|D>!~JjAZXUVo8E!xmVITBgzDNCKHdfEFD=jzVvu?qjRfVouw-~!aBptrYOy?yw zDZ=r}ZiV8bSSP76M^n`Eeiw1KUeP{B2&8yLRN;Ra0{|@@hMupX|J$siv?z324sv

z^o$f_W<%oSj6{lI(HV)vjPmRxsb?gi{fjda&=zA`^O;GStIzD;dgk!Tg!PO}X!?3a z0&M1<(Z8j3O#?PA&PLSgJR_IZ`buo-p0x&Bv1Q#@cjg4Et^JGez{71+BVH@&8% zw%QK^7THb1--Tx7P5wK^3cA{=wl$72#fJg7c?6wTvd){%jf)g22|9EbY>(333GzzL zuIc{ToBcX8jvGkvp!>BBlwlV!xSe;W$_~9 zh4>@*k@1t}D19?5+B-pBE7I3u%m~rB!s)yt>4+pVjLz$gR4#ME=)&VAlH4#l@Eegn zB3W>bbYjps<$dJc3{AGd_jIm62NQqXM)r|TM7AF-gj?;PleW%X8SvbG2`X##INOYoK8v2I`{d)p_Ez3c8>+F- z-&E(fPhE1geNi*^j~l)QTRVGh)4FB|&=ye~Wy{K$-(hvVU%?9MgX@ixYtIJll3XYj-4hKKCywSLiys{9}Bp zRz9(LczF1R{h?LnGVW6rjOTxYh2~(Bg_TbWJYxw~B(MT!u+Yj%+`&aQR-P5CNMZ#! z!NO!$7kJ#Tf49+1LEIDYvq^3|&&MxLD#mj>$F0GWgrZGq!jqD3!%vdF$Db04X$(h< z!+X56jJ+3lcQEkY3YMS1iY;a36{U+qOC9!lqF%z&8p?A_<*%X;*r~uXNu3|JoyT#U z0)@cxZLZL_MhlK zEkpZ8V&3TPKP+%>>^t5!Fr5|KS-ykyjy>YPl=bX2b+cl}gx+AD!x~)bu>GmgVHMN^ zW{NcMp5=J5gC|qe3(HRqJY(%QAyt3G8C0Jt1H=W*Oz zJm+v+1D>-v4h>WCaHs>%EDr6&Go3@b@l4~;y?D;x&;xkVP#q_|jOW!HdI!%dIdl@w z$@tl%&+xp0<1CN_l*Ty83aEtpUJ59g;~aoQ2rnSYl}(ybM`srk_T$0blsdaK^w0+{ z7gyOS18=^aaWVb%x?I3z?fB6_!X4#d!V*R11Zls&j3z<(`Y98a?Qo9tvcVyE%d zPDhjMG`W#BN>f^WQ);HKlTaB9)!CEhAfYEQ3+oLobR=wh8#S;66)&OUCDFqAsBfU3 zTJ(M9Dxj9)7bjhd=VA^uUo|JM`^R1?P+qDelE{RB9F;}9=r3p~PQ-0z3mwU9sUxWr zFG-8>mb7HVYw6+>6gKdTU5*;X2GaqGmFg-9KhY0o0wQM-f28a2H(r{~^DIzb3`^1) z)0yNVKVIk_nx{9^ES>C>hQY@q=_hoQCQ}Tx6Qk2l=BOl0F*KbsI{g4i z1&}+U zF@~an)fA(&FF_^BLXv(bUish~i$fmGEjZv&Cy;htK3bZow`;NIJfDV+q40TC=0h~b z*s0BHu_yfJ{&FqU-{eq4V+=(jwifEgQX)j45?4G*pB&K`L(u@Dh1%HvNv9U-GC35{ z7(;$f1Y^_1?_Sc>yM8CqBB>4b3e~ zF_&^bNpc^YxJ%>nBbg7;Q2XIFe=_ArJ|yojevaOSUL6VXTznA{t{|ki6GI-8ZiE_gbiFawwvqlIII)njr9T)+muK43kI~bIx8o ziOmI@o_$-BNI5d+i$&gboG0;6dRccd=Ujpi>fu#xhp!!OQj}$|1YNU+l%2k+O)&J- zUSa<0t1@nmD5q7mW2QPAc!dpioaj)a7B9A4aOzk&V=SAFxxx=X%T`v}X?wpM;bnA>i+N7#nw&Uh;=L^(D-W`;|?=0edr$@gMJ(?+>)>_*c@jpN#=nHU{t zQcF%hd7<}d_~prsoZh*MppCj69?c`@xHd{B4tUrYN%{xq{z0=9I2z6(t;%UIU8P7? zB82l=yIg>#Tb9heIQ^5*y>?7tI*%sa zx(_5QH=(mDao4X2%(t*HSo=<8-MxeO>tOTDd$I0yeDdk>6%H$)srZ}J6Gw%EHB_)5 z>8R-#mM+Kq4!c-~V|jc6o)Uiq3lfgzn$JjJJ(_EYOn@bq%*57HU?-kE1r7|5-lMq* z#}-&+KcvA-8VxL^^$WB%kkiyDPTGtom4r>&jwelVY|=e=3g7Pl623oBeW@gbFGg6| zw@3ATM}+{uy*Y=TAK^zGAXd7N<{x~S7B5vmiDQxL;q*^@`^ks;DLL5hQz`O(5HDd7 zXl6xTHn%>|Rq7ub$ddeVPmuq9R~O}rD7kt8e|a$cr2#k|)sTh2Iizu_uV-FwMX=Ff zV>bhYW~r1aDbJC`yvfH41f-B3%cFNjKI3-3!13r;LUmy=2+fz3?D^xNI9d`eD0%yZZ@<2SRuwmJpOv~7#+oqv)G4rfP^gUJQS>$nz#$cB_y^sx$}L$ zg*729CkJBLNm?(nMdstQ>XMEHNOK9 zSv?PErT0a1 zR7L0n=p9p!qYnGuB+6q;9Zpg)jrv;L@jjplk@crHr$}=psZF4=5O6B^BVf_7Li_QG z5qw1!skZt;dG{tT{A4{`Bh(U9@yI$WL`8SxBae2^sm-(4B1_6a(~Fzjp}hMN2FyS^ za|2!Gz-LsY&drxFtI+JBgdFS?E3}9LOxb5TaP!No&<0*NAW*XBR7V+jQO%_sWZS8w zP=$5O4mIAFupsch8I^VimrD7PoG4D645mm55~c-16rO`y4nw@zC=~S(qG1~?DF*^w z@p}Vr$D8)CQ{7*fkj(Z`PtgJ_=$pot-j^T}n?lvx`EiGhAyaEDYvmYG03~hjY5f62 z;35~vma#lHiMvQPuoaHv&Z8YIp3@!ck!SX5$}6UQ!9vT)?~^C>L)0ttQFfErR?2Ko zAMwY!L)C&oW{QH&rG~lC`T{e4|Sx1 z*Fto4bjXWYA^KK#3M$ZSIslC_I-{#g^v{S`NTzF%N+B(?0SQ@(6{##~O8}9=&?fyz z#hKBUr{FD4A|;6My;p@^1SI&q3P|v~GFHJ&2PAMVKth@q0uo$qSD|Anl!*af_?7^= zf~RGbiaVr2ZvncT`~H`T!zE5bS;7XrRMI~1layLUVVl^E)7Zj?HKCgnjAMBZ%Y6~UT2FxmEG4#x ztMp3}ScNlKZe@k;V1bP-$_kbwv5K5vdGab>PwrHrT**fagK|F=Xc{MMQa+y3IJ68; zQ6d1OyXgTJE5-ACr2zga%0p$^Qq8$3kAIc&@OFiv`d6<~Lxo{!OamiL2JgN7_ozs` za7UvuIg?~Z9_7>40>v@VrXtp^Z9{&SN~3T;hgDZyNr=k49&!Zf-65qnOAkb@4+v4ABVOZ)J?&tj`5W3uF0=3CjfpGidIoCw>P%Jor5=7taGj?mRWk zXcV#=Sz;s~jB(M)OMW?{YILQjGlYGV&^AOklcTPfWfLYPn9-_C!K%8E5!Bk%Uy7n+ zV@rd-*5A^$9#?Z2aJq9YBkq<^$YfQ`h$sx#g(;*uHO`Dom%MTpf6iu2lA4y0oytj9 zk69RVC11Zk;E<#pa+yb3zniJ+=v{>M`%d^fN601t(dYSG_>1zSa+vmW~2Jzt_5ds&D-~GtobkMv=ofM9gmC@4oGCJVf)Cu9D@w3D4 zJ(-5+$VKCqfQd*lO-A6N@$;fWuLMmUO-A5ooQTG6HFV|8q%Vhy#_tIHz6P4>NFNSI z<4rVvEuh&h(?#P)bF4c+bBvGfH0zT2MbKL%U4U&x66A1dyd&tGs1Gk_n&knJsySNv z4uj@(nJ!xTsDHdG(@?zRqVZdb%CDgY02hs)6MpMK^BtM)O#SUK(Cj-4zfu&~^Pow- zoJXsbpH3A{K34pegQi}liCzb}LC?X&Qs{JwXN{F1N091uTpG5AH2 zSEt~SA=7X|JffxVO3395{K!S)=Y^jaG+T9a(fHjCntOG0l)f*ke=CypZ*#x0{!OvN z{p#AcGAs-e$}65E!v|Lv`^@$6>7QUJXbrY54CZ=+t$Eo_f6>~awJ|3^AhAI**}0{@ zr_e0rBp(QT5#MGB<(h+qQwOYTZ88y&1_0s?%>#LAP3oThJ6``Bs8LT)976$%v(DV`(=w4QkhegZe zwL&S!%8OV@DVD3I!@-hLR4sETb|>iNh&rHsX~Rc3jC{Hp6v zd2medIz~XPEo2pWrh|)RHN~QZ!NNTFp;%1^gH5GDAexGT zO-r%jRmze!)5O~8DitaOL;^#UVgn#@F!SID5@SdwB{QLdHPwsiEzCnfpzKDAq|(d# z{*1D6*Tz=!)_jT(jGL2>q@gd97QHp)dAT z^DM|QGvBi}Wgk%X-oet)4mbQuSz#7bUxE)(F%`Z}Rsv==5vyAl>tj7w*JELMbN0_D z(QVC0-r8xRv?Anku`ZX(B*u$@%&P3BeR6!ok_b#i43DW$sP*I{2Bfo=I*y*WoC#Wm|yaD}Pk*2$MyO3Pt!#f%}>Y z?E#d5pG|r|g?mEboMkemC~tGGu2QOa!6dn(S3Q74V# zt_DQ1)F!O~L?v&NHmK0Q0}`AMt5BZ`Ss|Nfb`}TIJH@CHuhKWT%%YX$C|;E${~)~< zI?S%F&O?67eE%qK@5#2$w34I2okC8a2OJX09pye=T1-2937zjJ-Z~X=!`_x{Hg^ug zq}1vk#eB&Fv96=6t-kZ)#9Lbski|iokC%IcB8i@{umY0umobanqRSJQ+}2r%I^%#< zF?Iz&rD*#LtXcpWhYkhXV^CrL#h-<4;CdfzH6`?v9oc5_tlY^GIw|$c{BY^;Vk;;h z>hfU)jc)NL8sMqFu@a|92>e)qTVrQa*?-yYlE{-FXjz9fWV3i)Yj=grMXuo>dQdJ67#Mf0n0;VKVdmc` zgJTJ{(J*K{36et3VEZw)fQtw;pK=QZ2WH#u4JF*p$`gVMw-3S7(~ag+kbv4%>Q-46 zV8Jez!?h|zNfl+Y4Ujgg?Zz89Wo@tkFgNR8j8bXC?6ANbMDtyqjBP4x2Cp1Syz?kX zp4f_qm>3l#vmy9wPG}pgwm#$`WcHTIX7fn=GE1-o!=#x;&7+}&xu$N~*Pzieao4k8 z#meo0e|S5tW5q*kADfTNb;Ppnwf54KBdh?aNcd*Rwnv_1l|X*kS-FiR>`ghcBxKtb z%G&|(#p3L6;4RbXhuLQ8tht`$ z=Jsu_u2AhM*$5w@a4?|6iX&%I}?gb)PY{3qHu?54>a7Pl_SjwQ6 z*~YM?zZnWH4Ge*~r>Fe{HR2K{+dP;;l_4(@2vcB7>0W%iFO(1nEe&j4yw<)%tO5`Y z#m|{eVyLNQoNvN-2A;vCPs)5r?y>wKY@d6P4or!I`9q$$=EOU0#FQpf`<{9p0>wwG z22pmjVi3?SK%&GR1|&)>@Lm$F0PL`h$ThPCQ!z)HiqT~n76~l39&h#v=FMT72~1+< zU6_Xj{g?(HVY$xUf8eDZlV7acF-~-LwbAJtz8jjfKX8kESpTl9l+1y_;kNNC*ADUt z8aW$>vi2Nq8{LyT4T+NmOu^h~tZW*Rgb6ZYa8l%fw@uiuK8V?wQ^4Jy#&!?Jnhqj0 zcn}&%!fK^=5Up{6&2wxt@C!Xa_ zL+UQ;DYWpUT%x9(gqebk2S6<)xYEnYyuoD{$n%2vIc$L!K%hG&2w*{0;D{6izSzmi za)Qg;h=(QYpe@f}v7^7x+;^#Bm@o=962S{uT$vaq`!58MyWdAEADTpqvaQU?T9(?N{|o5%&`W3m^UNQK9Rs{2tY zK$f#z^!Oj*%_e&N1I)s`Y}+sevx1kY7c=M}UY9zidD(Slsvk(!oxEE8$=SKi_KAFb z*^_HW+Z^@<^QUnOq@?{|l#JxrVSIzSVyAk)Ncp03IC0lqC`xdL1=e_3VwI6?fIHjz&BzYYe!HiR1)*bKiG?_f~C$^ z{t-Ad94tx-7G(vCa)L$PV5u!wloz~nE9ioE-ijv`0!$C!a#>L_IeQ`u(d3_7LIbunz6`IW&}hF|#{Iz1#6@?|+S ztb&DTSWp_4lm-hHvfLHONfO5|B|Mab%b^@(xvM#D1>u&nlGVY26)d-g<7x=E8be92 zpvKkZIp`k)77oN<9kAf(z?&7l$PFC{lo_zKqNzd$YLFE`vLT6yx6VO{Q@X!Fxq;mm z$V=HgOG>xA;Gr3n8A}D~>NItl0C_r%*&c>%h7z zbZAfjh6$0wi3DYFL#QlMHwLYKb8H{Uk>q}7x&`l9lxuy5B-ocbU_*hMSSS)o8hs@tZz@=d4WD`W9 zvl4e*OFUul7Q#@P(vQ|O4R&T(tS{v`!Xkf8Boj~5!N7l+VYAh5zNl|>|2%VF(Gbwn z=D*QRWzfHTsIC9xaTFU$l2QnLE?QyYt#lA2<)EBSOgk}~Wqp)R^TVNOJ3*5~sXZtX zz0|R^_fx1cV0ngA=A|5Du_&u#X5Q_38R<{hNy+J0Oy$R3NO>ic_Y{?K4tpi#k38WJ zbNK5;f&n4#vdxwKjPhsWaJ@bMW%zE-pvyc&>70R zTS_^ea+ujnK`U}SzwIN8{K@cIirFJ*9VkNck4fBjvxJAi#15%zI!pj8r7lW2$Sd6z z6SM;51c&Pg(e^%~a_3X~^VDN?G$RI4iaYmW-PCf#emDstB3N9COYBxK=#aQC4?-Ol77M*7< z$&nNDdt%`EH1Uoj_`Aj8*_XKE0EN798no;a(KKJ1)JqxTbK$E|13!lE2sG4-J>(ATN-oqDP`X(STJi!K#F-eJ>W1tVn!fIe*AdMBtOk43mYph-+3sw0jMg8P9p z^#)6mggvy-how+(IAoj3N7{rRjkH$2d{3?*G0*SS{v=Nz8v%O}npA{w0Rr0ga42U?`=n69Z7HvX zZjNEo#ssepoHQ?jkb?y_#1Kyfi75w784vT$yPp=nVr)sm65qTfo8Vb94Z~|e0j48tx1_1KopPEn$YS} z^dbPNy&qZ|cL6-VlBFcyV6K+AD1W^FqGQ%H-WXlDrQ}u+P}lp;ibN>oc-O%jl^;1_ zDM`>odT?h)$?^|0G%4vO3_03s7LG7_%RAy{w1x|}d4xy;O*5XvEwQ8wvRg@y8yIq< zBpy56ie!jg9~Z4FjB(Ky2QWX^S+8L0OOA{3e(jTg$k*Z`%?r7B5f`0OQzPTC^Y0W1 z8i~{BW4FM=7<+tJ?4vmi<&@I(*vghlE%w#GkQ>c86GSpmxRIqg254hkqr>7F%W0Ij zda?(%YjG*m{Vch zsc&O6qMBmtc#_*!|Jz@Qobt~M(UuZiqC`2>bG8C&2#-0s*95VVDQPFux4LJQIdFV!-HgaXwEW#04XJQ zRTyTL0i&cp^8rM4#IGsWEZt8eCLX?|Yj zd=XEfo-_4wBj=04IMdDpN&`<~vv1>fCTpDkB6FS;#yL5R^Q17&mv9=g+oP6{`Rxb4 zt#STb=6s1-suNKk!cnQ>1bJg)YkiA`(dX+@ppE&uBrNvJIL&IoK#Hy3Q?13GBFA-E zSibB$l)mp=7RLE7)B>w~=S#k+fHOCm->Zk!4VRrNM)`6=^f&t} zsIU(f*0lP>?U48=7=0?2uFzJ#?WcYHPfoP%!dUfta7uof@KI=Dp?-DF_^rY)GUe`J z-Dl$XW$z*xGP&-0UruK%1tq^SmLd%MKBMmAiJZMk8~!C^IZm}~M_dP?;*D2d)6Ko= zH)drPBfdr}zDQmPvZgA0oQ%kEL1YU)*UdjgTwmLWJ51E}rN+Y>1HZ-F`1NJ^L(9nR z$WI*T@^psJHp_`rZ}OxnH+=6~^D$J0hUO`wtA3T%EbjZ{-_TP~8Z|x@r@xC_^T1?R z`)r|x9&uBz;4O`rk?J&D$Z)pv99bFZ@_nLoo?{|E&k@7`u>^gbT%_|HKb0kepujW2 zc@742-w3)$=Q&Ct@vAXRKTd-I9F4-!?2q?iiSQ6D6W~ZnMY50fg5TqyIZcB&9L)uy z@p}oA^*_;s9WENbQuv(&O*T#1;fO98zg*Ci>F6S+58+pW<~|)=G=4t<&98NIk@!*i zxHy2 zR6j4bT#_vi{0{qCD~l_YUrWqulNQTxx%o-TGAtB4y&V@p#RpYCTRsHyu!QWScFSD6 zdJeb0?>W2{n!4LT3BzdD`zNSKp^IBPip3TwYzxd!306rs#GOy34(7d~guQJ35NtxO zO(A7GtSWHrfY<{rg<|YkB`hoxpwKE}14Pu;kL^J+273w{|33T$L&B9a5^U-Nv0QF-#(7{$h<08E`leru6` zRN#f-feCEAIq{L{17p=qTXq7Lckg#x$~RK&FihUN*R?NYpUjx&{CNA@LdCAr1Jbga zB!*40tI#wRs#l?nD)b{jB#&%djUvLns^Z=RByguxh*TE>m!U!nRA{XVZB!vLjuRoi zqe66WUf^C=q5o8&(<(%_nURdPNpyr>guts*fH!inl9|@q@{tgJAb{UyYpZyYvIXO* zFV-fV{z(}$+2AQGzF@^Li@IB4Cz%1PwF;Y(wMk{lk$`8cv>#SrPQ3MbB8X9pPAq{F zlHXs1;{|ffuN@`480?I=y>&jX_#jm8qA5aGpSbG?1=T~e_V zbBU5XWSGbH1#v2|cwwYBFa~k;n12HdF(-q)eFIm4$K;WL4rzg8!sBb@+kD9!ge-9r zZ>5dG#9gGDLkCH`^KJlZ?Q*%=kzA`txf!6iw8YDEA#NB5!UB(agxxh<>U?F+rC7uh!WXyJ>T=U_7gB-y$ptVr0);3TZdrm zq;@c}+@Pz4ja}#pq?<-Q8^3c_K=V`_nScl!DLe%f07PS|O`^<;p7cZ2_bt`;Jr!q0 zm5ZN zxZ)*lJ=*zkMY{_-FA1zL!P9Ksd=>Lra8C|Pc$AqR<2Sy_H@vb6l87)<@Gc! z8)m{-@EUN{dMcG4Ig>=@t-^>?9Nod8Gel@bOQ>L(YI{C}J5FHKwk+|HSIM%d$vT%! zy9VP!u#pXUUTpvCN^USp>buMF6Zzt|8sSa37Qzl#iG%h7AqFnQKKT{wFxWmvu_j}a zimkVL*)+Z>)_B{HXJ7kYeJiQ0l$I&YB*9>t3T={Xf(n2eA=6*86vq>B6=0aR<7y+~ zpM=XzsP8ADCRm{ZiAZKmQ%lRS$)#MY0sr;|Y>}NMZ|gj|DT!^du+!aNByM|Wcnhu< z{|h}+KEs{Q70HRe%e#13weqoqT8CjDf5$HnA+9w-HT)bc`TG4}0NXQM^0G{kF^FOF z6@kxVIxZ;Ix9uLk}RgG*LuU+#Ka?>|BbX&y6!jX-~> zVfd5&$%iNZSIVcRkJxLRaLXImMzd0s+@xS05^8pOp4~D*mU1Wu>W(K%u$!+XKo*|D zqMKAM)A6%$v#o16beoF%mJ0m}kc<0{Mu`eKvJMpxJfvxO!+*2^aZrKAJ$X|NHh0$U z6INIE6uJ`F)y;sgbf2&gLK>D4=I#?_AQItR-63K1-+dw$DE`G#prqatcv}YN>Q)9_ zikajBIf|VerBmE24vS7Y;9!v(!(mY1qVT<+%wea3Z9}1C5}Oj+uQPw$AFQ?MUZ3yD zA0(R2kAuZ05_c5}2EpPFF+aKy>f$BAd?8m++-O#~0qHEw%8q8mimjq$ zi76X`E;z{>6>mr@Vf1V*Q_clYQ<@z3ET&^3%eO9&Eh9x_Cxa_(1Mz4~D{T?mQn7{2 zw*`w&v6ZI`4eEN)pk7CVI;}LQql}`pU;~^trTtsRBa!OW(iZl{fYp$yz;nZ_ZHP*^ z_&t{YVc@gjU~-KACLFa`WKDeJ6-If9m3LjG^M%J5hhxY#AEM zb}oZZkP&1MZ0AuQ3zLQy3&98hbn;##5#=r<4!Xa?&{VFWrg9OI;xM+A6EF!%9>A1= z{=y0dDv>bhb2Td_$&(DpvzJSr$PI<0PBAr;RL}k`D<}oZAx21FjUTzSKTIrR8Zy>D}=n8i<$~fDzfrI3OZV43W(O0f=j=O`&7kUgtjSs zoqzIU~&|Y0ii#R019QuvCyVuRyA)$IBlSfdr>j0b4+V2Ik8` zg4^W@GY$9Itjx})ZSQ;^v&dU4>?4{*{#hqwJ|9TNp%6&$sj38TlO^~qBw;Wog_N-` z(+~F7(7cf(xV?Cp+RYKy37Wxj368&scYGf?h# zkdO7r;0s${D51vnn71Pn5*zF7JhbKSo&)XwC7QN+1<9Kno^kLtIA6dlrmg2ElQdq4Rc z*4D6)g+OIO)CPOl-s=w85Qkg4J}XK%#w+ zE=th-hYG<{`aRxAKE%n_8!iI;RgCsj?Q}J9Rh;)KJvO*5a2m7J+y0QOiwh!zEV(9sa)v2@kT8@uw>vaK8&*k zcq8X%MtfdR66b4IRsTifOw)C8!f4OutHSoJz=&KB{4)g+7W)|Z7-NrS#;4@#aeont zlF~u$3GoM7+L0wjnkyscXa;%IXW~Kqr@#MOoyPeEne%y^GrhbeW3+tz)qv5rpKB3;9 zhR#4e?x%lv1eL82r^>+j5`}Us#C?SjLF+(Eq2dH44M*UN7%W~rMvN2MO#>zii`!mw zc8yO~mL%P3#9-*WT90w30`ptsSPhlwL|io2B8<_{a01Vl6;CBM=ZBf>&@>9hnjoOI zVSSt~_gAQ|lL6WdG0F|nk{avX7RH&Rg(;>>=KP)5BiC!3t7Xn)HfQ8aHDKf{zF@K$ zAyg{|?X%0`6UsjR*=>9%#J{PzHr01iTjhHHhRR0WmqxfbPb3B-zqPEfmW@^vYa@f* z1dmTKrjboM1g@o}sbvG?uxgNG@Lf*>3%vD6rt&NMkCV~QO4n-@v}m}Oa_gM z#w|F!M&(xsnhKdN8oy?Uuu9PMp2yko%?)m4F`}HQYFE;jqI39mZp8Yi45JILH{#b2 zMi-gix-hzMepGC2=Sa8t9O*jGfsXPK3Zp|lbb}ZbnHRr3pzD=s)q0Ci&VP=?F9O}k zNOTd}>HDDjT&9iI4!V%Ocru#TxoFlqJ)nC{rj5q08GPOX&0-qk;D|07zZ*bvqmGXH z(f_#Bi~e)%U)}13^hF8cqq8%>s;n9I?=8PxHiLivI@6j^Aa^C=o2*f>Sg zZ4Ml;($|P99P&LCw^1Htox`2?0~VA|UJKCGg>7qonH25a(YoUb{A~Oiu$OZP6H!S( zRJH;l4W@tq@I6ZUiz_rSB%rh6NBSFT&6Hm3s@1bXGfQJd$y~+08Vsk8R;M+wN6v~Z*)zxKe*Zp`2?jRIh-=}2MBI?UCkQh1%FZR1{ z(pS{MLM=eUcjdPGG==s1ZBuBDk-3o zOwTP2l}ue+8rsgUI}{r{=%6t0N*a5R#T9Pbe+qfUSAP*n`{U5aBr)E2KJJd`$@?+& z63IV_-E%+w_Lv`z!5`rdPcn6oKJJc%6$bb3d|#&M7^l+k(=H!(oBd;Yc)GDwJe-e= z-Z7DmfUl?REIa!=@sZCEvn}{LUY?~>S&@^{lkzz;e_cKVK1hc@p&k|Y6XMYJb9hf; zG001je9W8FXZG&Ta7m4+pY0;?;dyEERi5WIPiNgh{!U6Zp433jc6`*xgE+QaYI?!* zQhUFu@kt<~5#=h9g#E!?KLsP8_-#80Xk07sJ{3Qk^dg?r_ISgV#zDGJvx$+lJ68dg z_lfP|vZ|i^4}p^yBw#^8F#lBe^+>#og0(}q#-JzvJrY;FgD|;iH_>+R%7j4I7r5=} zXuhTI#+?3TgMF6}JMjgcczG+iKYy_Ah8*Rtn>e~Zqj(VFXt-lC%O9ehvc8m8*eb_d zvL$?}KaUOdEsPz)jSKDng$O``PFJejjD-NjxbX%(tKVzEjR*Y_N!I@Teb2LPBn3SO zqH87Y6w(W7jpOa^3nS5cYpkh6cDtnJjfe)RrAM70l zEy|%Dne5Md6c-dc%5#I1hw>9j@iFd|36$^?6hM4$84UWCSwsPkLY7eQ%TDQDPqAe~ z?8V+s0|#RJlW&K&h|Ti}rRtmbKsff|0{iVf`KO3yaOIn!=Dg4*Gn**B$PJs7No>&& zTM7AZ4ka*L*D)H^f<0>7Dbe;pAHIrnX-~d&>!STVp#?~Nf*kD7W>cVhJX>}OF_?P$ z&AaPg5e&WQ^(z3=G?oN+#&9d-2#ZQf9`AGrQj~U22NvtoOGtIfm43P zRSPs_n_JHsrdF`)oy>|WZE#tEjh$vUvR56@#%G8J3EF5gHgPFgfqCe>~onmvR zG4pLIYT!IZAHKpxVz@aB-*Li*G%kH!(8i({4J>X)baakx zsVO}^F?hRlQ~u4gbh5EDenQ|@E3UuJ8`boozmwR^4U%g z?ubUOo2Hg#)Fg)QZBTieVpiixd4BTz(G6P3(||`#*7%2A2|#}L(}TN_v5x`P7<)90 zKPg)%zbzj>5Y%F)K0!`s{P~B23|AEBbD97;V_ebp07wx-s}1KbroSWN!fCQvI?_gQ z(H?;D+toy?eTDkwX{TVMOKBz7E&gzR#@0fscCEFf)hz0bO~ z?pIod6TCsv-pa+zI>874Rr`&^V};l_Gp}GUP3OJa}Gba zug?W79gJ}$b1Cxzc<^4Q3_02%;L1j?tFF%QHFA)Ok7zrc*=ebDRT;9cf{*YqF;4HQ z%g#=BSGp^+)6*&eKrq)-`<1BF-3h}XS9!-H>XF^n+RB#ddL?FeX0^**m*rI7ooNwM z?vgX4qZ{$bF_A-8T~(CuwHbP+@Nv~uXX~7j!@8!Hjg>7p;wrc*Eb-2V5A8s(DAwrT zCfA?jj&!h>p9r3jnw4tTxwGwzxYM)J1v%}ET*!Auu7}2kCW+)C?TpZtput7h8NtXQ zJvxGp?~K$``YUyTsc~mRhAfli2o2g^$=Rjv07P!bZx3jGF4LjSM%Ap6R`EF9mN}oUl;HjL6b=tfE$fpG=6(P^F5g^8b2q({{%EgWjYd# z(fIuhG{a}(hloaFCX+3XF_fKX{B8uzEizrS^zBA?nmb=W8HGDj`mP2|woDg|-)eZ| zg60P_Pl2Q1n5R!SRU|yslX6y>-pNJVk(ouBN1cnblScgV!{{RK$jlF;^M>sN5x>P@ zbm9DnZdnAnFS`RUpSLs&IA8U9Q+3$UZE;R-s#^Qi_5Zpu4g)EpG=9eM%}qOpXnsgD zxj6pWGMa0|@zv9n9HQ};M$b4>XPP@-_Fq`>B;j!8=O0k_Vu@-#iC1a=ZqiOuL*WZ8 zuJlA)jR=sK6|caR9}+K~Uo0p1_&`S~ zEbZB_vP`Gj_By79RwW@g4*-+6ATHi*pM;XPdFCZ;J|Fky<>Nz8_!Pxab^r@;d{kJb z#9fU1eK*ZZX&xiasEQqfYw#|hbQSWd&;k|0Vo#>KO@)3Ah+2oJ)!zdm7b{!XQd>f; zuC*(lFQYGW<3lxTV;OGrH?vYp@IvKGBJGQyeh;kLPtx&n{IKVtLIAkdhW^G%F}%&# z0ju`Aq`tr|K$|Uei<#fnSdgHe*R{}A6WR8Dgb+Ai{2K~RTRyM6jUp?h+gk0f`|&HW z_CwFj%S;U{j*32o5S{{g!M5#dn#6R)*Wu z(#%rSb{U|n@e?~w0{0N!r*hmOJg?#q9@4caGAgxL={#Q5)ceI5KmHXsYehM(?pH4O z$7v8~WFQP?9WBHqvSw16El5V{pw!*opN#vAG7VUC7Aabz$=F=RKSVH&z?qJ|O z8_x0YlVVnUr~*4f_+qw&&aNkR&Onw~sTX%$qQlcMa44#mC9qRR=b3xIfH`ZD&_m;R z60hU_uA}k&-F=4zw*N%`X`$+dM*cjCUc*3}{hYwPvA_TD8~^A(gwnCg%591s7xSC< zqLqA12C|8}u!^7tn*^#PqyPnqBnSq5)Nmn)`nyP7J~ARG{==h|6ZpnHv=PS}hx-p5 zPj;vuzYsEtC88mjLUV`di}8>zxh!Fi=M73sFmLZr;vE}lf2e|Vp*9$U_n7z6&QZ{R z8+}lO{aJi)E+2_5!Y__%+~_S%s>O32ht}aqD%CiysmbBcHaxRA^zV2IIkgXv;PNUU z!R1Xrf(!Lk!R7CO1eYN|f{PXPmw`82d<$qkhbI2IHw%E*<+{du=g{1lfbE?FG2XwP z{7xF+In(PJ8Yz|Jz8J>p*mS1Ry0M{Zg*+-(i!jRbU#0yEDh$=X({H zQl%2pFM1^!<0_t7t0~5gCyGUS_-M&5y8IKJhcg9_@4HBx7RnyZz!~Oq60o1bio-z%e}baNVOmrx-3q#1;P0ahikS z0z9y%5}$ncCl_dOtpSEyf|}Et1p-gXDLE1!!tuOEwDW#YA>pC)DI@`6ERBS)S{AxK zT4+#=?_Qmbeud<6_o)1LoSMRJ86#4tkBeq!#<<3X#bxC*tHGYAN4-=9)sYex$p~^* z9+$WdObW4=+@X+*2tcr4n;I{PN2@;)CiC}J1{HYFUs2KtG&6osl{K_w!Q{pR6&vyf%>Sf$%qjKszQGH z6k}S&dR5rW%AN+whV|T>H8r9=tB+fws+O+Md*3LOHh6&$wn}$uU3FHSM(0ee zt;$MQ)LjbRm6lywi~s7oqWBs!BP~_7hZVY?vuTM^(=)S#!7XWt(zurBTaZ)t$rTn! zOY|F6Ty>q6rXfF_ru5gZBhX#9Q-nr@kn z`cx!-cHp0rX#jE;jo$$1K06CPI&wJ*GBcf|65N^6_XE&8F4ILzA8k4P7Bnx2xwTLg zSW8#y#W=-7V)_!unQKYbz(wO{hhL^lLv-Y#<+lQKYtF)NH`?D#poyUs4IB+k(fEZx zbDvBXEq$d3|09`(_>qgo?-S6))4UZf8b1l;Hy$+OX(a|n)3a#&W`JgnOc#wGy0$bQ zG@C~9(+zbL4-G!wkZI_hTqJEA(S0itoo<3eVX1z<3%W;S+Gy!J1&=2|^U!4!O2`AA z-x28}dGI%xh7;luNef7HpG2aIkiKEiCE5kIXzBB!J}v^y^;ZZwyhg2$b)eZS(?#P) z^>Ld_BREFq_iNDgoQ2<`VA2bkZIcBziZ@z&VW9bzjxLgXxgT@LAA%>>4)H=<(JyQRWc1H#3LHNOwbjch2L(3Uwn@I-U8hRXW{o|EMz2Tj$SKLN0a+# z=}VuEa>0*W)cnF@5omlf1RdB%<<|@0?j&VIB;j;w+%FVWIBc4|2taf z)PGJ3J^L5$x<>Cg?P8C`xO41d+>h(bb8$1&QITPOLBVGgIA_!-jbUBx@lJWs)h5@J(cC@PcEuSADYsd ze*30v={w#DrnmRsmEKwN?erzP9!z&t{ycrkiKo+#O+S?W;@nr$=T3h&y(0E>`ki$# z8H-*To$=BB^E19#oSbo@?aGX_!qg1^^Enx-#?Q~Fy`nth#e|xSC*Eku_(s{bjO3?+ z87)7%E8~%jZ)a><`Cvx+wLj13dGzUwcTXS8h%vpIv3lU0j7y*Td&c*@F_{Aoj?Vnx zo9Aa9x-2>K()=qkXH7`Wy!7sz%%)e1GQa=Mvdm8oRc8jj(USSdwc9d(cULgeAGj;? zFP3j-{%+cXnT4M|nz?Dy)0tm9aWJ#+nLlRU_2YLk2V4K1*>!PD*4H~mXMMWv{H(aY zPs*yYU71z>CudgQ%ABmbzEza<_Xn0`xo)e@T3_0d^-BDW+h1_jmp=tH1W0tP|7zo^|p=DZ8M2boRL1^RpK}Gb#I*?@Y_A?1cKzs<6GI)&;2la@194q z&l~%6c3tkl?6HM^%ubv9PWJnM{vi93m!z4arjMTKOgew&L-$OYdBNjTX8wAkb7uSB zJTu2!Sv0ffs%10(5>q|%=6yHK^gO+F=E;kKGY`bxHS_3}Z_Rw}-XG5FTlwhBzrFI* z%*QPUXYRE8aprg5e0yg6cR!f9;vva%WYlQSs`tlx5*sFYZrwh`^Leh*v*rnpr*fds zQ+#r%XXWp!Jm0?MCeN08wt9Z^!A{SoukG;^F8P*c?%E%EuDa$?&)eUA%5(mUJ)Vh& z|KPEI=WS2=@((-@2Be%H9k=9sbKm%!?Vd?FF-xZ8EVVjwDz|xZ4nA6#^XG?`=A3A+ z%K3x)rkt0Wx8~e)XlKsM|Jak$<@i?4v)Mn)>HPSSoIlq-m9zcpJvmRZKji%4hPQJz zjsGC$vz5}U;4dw+{`8IUvtq|hniaZy%B&}k&6u_BI?pWchQe8U8kf%MoLM#NioZ6` zx@N)FSzErhbJou7duA1Va__9=qklN-@B1E^H8}mLS*GiIX00p!!>kn-y*;b<@Tplh zWJ$9(hAgvP>&DOC{pQ89ulm3-d-_8&X5Ti!GyAZoaCY(ZrL!{!D`(&OqvqLnPT4xU zb<@t-Z&&P@eeBS^vp?;7VD`E@ADKOA@HeyXzO-kyEAbDrC%*R9>{+*-ntkAWX--S6 zWzN^~hTcdE1ORj~$yir#7Z=&LyYH=6v?c$~m8{Zk{7aTk$)C!wlq7 zc*jX*Kr~8WKMD}Zy*McW5UrH49|efCRoIULbSHQr?-P9a^#w6#qhZ((z1}=%pEed z@Thr;vt>vb<__7rpmaFp`e6mFHvN8XLNA)oJ`>`ovkGw;AUFJ-8ux@Nzu~6eeWo8! zv<-Md2G9{uc4}A`)EZz;1XbC_RrT`jIa2*y#Kb1n*)k;S1sw=T#~9@yXUwfWZJGA< z+!?4Ol`&)^=P-P4>Y|6E5JejdkivqATM8qm|uTQ?+7#MQ=b!}KUPpMqH|Y)grO zG`7n!&(+4zdfRdGu;!hyttc&~0Y*YGhZDbQJK(@WN-mi`kV~qxC|il%%2=2tU1r8P zrWumFl7mWBXH?oudx|(HE{-p<@d8mMWM(DA2WSRYT;FU6>t_(wQJ6JKiU^lSd$PUb zSN4t!_bt*B4wvg|wPt=Q4?p8coV4b`)1RGQit$F5+^ptilH*s7g&ZTjGO=DT#4lx9 zK2kzu1$OAhgWPqu26C;GVWc++gdJjlr9sJSJG>pW!vZh8MrmaMnbv7-e&n;J9ATV# zzA`t~(&U$8EXB0FW{;Uh>Hu1AX4Fhy&BF{O7j5r5RNmT{LqUR@?w3kOY@t}=%sS*v zot%uBCN(!qZ?#-|Fz`7t@6@irFXdm&rzz+O)9?2t)M7%XOsE*#Rv~yyl7gN!AzFl@ zv?}d;1)d<2ka)E=oI1a^R)5R|e28tyTo=Asj5*}>Zc348<235m{?{CMC6-g8`WtP8 z;~TeAf^ob#_JZ*|Px1KAmVuz<%W>78V=D+P5c$_yfm(NF;C?d5KcOK-nI5b;ITx7N zu@}J6oyBS|8yLeNb*?~wTdKsAh7<^T^1Jn)GHlDYvHnRNUaXk^L}HzzV+{a~zu_TT zUFFNq)l0Fmku=~V)~KkbG(r)p!EG8RzO3gA4_D2dW&B>p7L-v z4g*XDtX6qI1=w)hcdY0m95@@+v^mO@07>r3S;-3{((%nnMc2q*ErXoVRk5as^c5`$KOP6|k96A~@kSnOkb ztuEOVIAE6^c@!;B+zmH?vdSfn_C@jY8i|@VGEm%EFbS!gCQ~VODX4f+^ZX5xA3*fN zXQb~3?la7RFFRzd5Kpo{epM`PNEj1a-$FmiGfFT~5I;q%Zy?{qOATbzh?mxrNAV5Z zFR5p-L~QfFw0;V_#pCNJBBJ3n)&Q~QPx5KyT3H`pd$C)xC9wBZaK_JXo21EvLU>CFRohLyUjgO0R#- zOMI$kryvLR$ZU=8*GyxOKrXhu)(jk>7+u}hzfy8MZz+#EO$g-1WVY0%jZmdgEzM{G zLlzBQ)0o`fj`Fa3$1AK0c*R(toxQp`;rYt6m6l*OdJd!jrc4KLv)KuhWho>e;9Luq zp=4wMfIoSa8j7Vr6^q(H=(m6^Qz~Nu5E}UF?DA(@nduEEB6P!DnOoymaavTDk-$Tg z9!3~gXQyl|r%uCCoi(zV6;>bKrHC~FDL8fk!CN#*K)wjv@cIQh`p#fu~TQR6u6e z@L8lVAD2`6+JthE;d1HM4rq~t&OnwG#M1bw^b>#--t#833i-~KZ+`zE<(vLAQ9dy04vypoB%)W36N;s98xyqeW z60p8lfT9>FB?YoR#aKf49rS4p7AobqOW8yE3|(EcYq%0{xo{=nO2y^Gm57Tc&Zpo? z$Cc+#^WSB~@|in2Grx(y|0rTdxn+P@4rHPLuveb&;YFs5TDT3-G;W7ZBCPOJec7FRB(w0?Jc2=5TE%WEsa! z^R@~7r{?&_TgDAWU%>{98*s(R>8BD2vA?UwbLj4zU-tjh3lF(^mUl!e9aBd+<>x{Q z+~@Z_CHM()Pk)Xim~$KBjf1y`Q$7Ab!i|m(${Ra z6m(cpEq7QgrFKgmdc>~$>SK7tP5epdeXwVkAPG=}=DTymEgC2yhMFNjONTk)Hp}k# z7uqb}Gg<%)Y&np{s85d=7$%_WxImam8+5LO2NmSIjyC}sWwWEleDz~#i1faPrm zkSu^nxKaKwd_)A-#qOG30c zJ_C?bqs22NId_?Fedb$Xz6CPeA&swHrs zv>{$N)EzZ5C;0^P9gwd(OGmULWBET*i_ zqwZ7N+wUAuKK(#YS${YX1YZ+2q1=Bt0T|(3>t}$ivSTdYQ&Mv?+u{RTL73?l-zK*Q z(w_n7K$_gJRDo2=?`KENnaOjZaBNU{V}Qm`5{RWACha;F9#WuI2xx_=;8H9k~NT0Ol^=5Fp9*_&meqJvjQ z^AHS`)-@6$bZH^jsq`p678L|9josWh+Zg zu{Zsl{n=cMkNpv8Yhc>?`7rD;!CfV;<7n(1@vC^6 z4tm;EYRsV*yT{3|`!@a%_^Ayk#-d@gF#P66=NVSb@g(GcfJg=Gz^Bj(QiW{%S&V#4 zeg(nI!O9n9M|#a8ycu7a`RJHC8$P>ZPG(EhO$aEH^Ise*N#2cfA!5bu^ORsWxH=jXYw9^eX(5LYT0o#*0LQjJL~_>Quo`FkTE8~Kk^Zrxudw{ zx4(FF0EET4Z09lzgSJ{ZDy5;dkbN(jAlEF%(Z;bgOw5BmOpxs%9^xAZv98uYbv!Q1 zvNFav8wzE-npu4~5h)(+mpAb+lRsYn99xxu2TL=)qwl46o?m*XZy9_mu0XT}lhp8I zRKNmc;VHh<-}UxwPHk+4PIbdG;#2uBq7O`Dv9Z(S#VyMH;j@^DSSRe&oI7sT%f!lX54eo>bZnB2GJqh9FG4QhP9 zwr^`r13!zkqi2Gnsbb}$E-VY998YMNB0uJ~*1W^|o3U`)Rh5p1SYJkLQ-8v zW7GD6>N)Upi9VSV)=a7CJv#H9ny-$cDm0{HP%a&>lCYrz3cMc$ILY!h0?MyNCJjC= z{i_jB&7X`~Milhi!M!Kh1)CIbE(=%-0uvf_>s4Sm3yd=&4>(yeyZ!Q>wij}YfRyF5 zuQNB+&7vd+oCgY!OY$Qyt)WUxcnL{!Ct7w0>;3qsO9OS$5A?;9Mhuk&avHVT3n9d; z?}d}hGS(xEsi!C~f-#)uIbQQ3VQ`84e5Z(qwGNc7o+}k&o)+Xq2X8R{R(h>HrY5OG@s+D`E|C)Ezve$2>#@vLmp~6J%G74*qTda4lfgh-{ z$hM_5?>W_F>qrzuG;KOL(vNh84qpt#T_~YGXz>~)bg2nl14z9c zZTd|z{T>DT?vf$;LWwA73!wX?p9>7?4+ycD&=^39-eS}5P7_)I2wDswRsyP%&}u-n z5?TYOMnd?}9>Ej8OL}P+$QI~Mz_NXon~aQ!C1T2+9q!1ebdC5`JANGUv1o`sGznbWqPI5o5f81y=DYThhuHY}P7bBw|vcxJNdgs5`n0Mz>sVSe-)~XI0zGJK+9>Y27Kuc@fj=X0uovaA)tGMbrLJz-2 zKEqtxP_gpmW`JVN%gb=v_c3NOps=9I+*LHFp8!quG7ClDcm{q3?5mZjIvBUZ$vfX+ zv~epCsPRxn?#8`{I0>}0x&L>*|P6D7zl!%N=3K? z=qip|xu_1E^(wohkIA&S_=edLF&s6lNFg3{R=t@Uk;SB%-%C}6OhZ+%Z;aVAIaQ@p z6&n+%Dvd2AKJkG&Qu0YL9RxCP0>G*-k;uSuj=Ke(Wv2rEvf08kn+V9^w=)Zc^Ip-g zoJtAcDzQ>dtQ6`)dP1;VpqY}lVG0?Yr5Y<}@LYoo;e5DpFH$kGY9=02EPF=)t{IrQ ztYLEf*gdD@Fn5OEey^Si=c<5pmFh$KaY&XX z><MhVTsuX=lj=|>%*{5}V?8kbX>gkn^X1wyKH8(wI8@YDzQ zSbY@ae!#3#HYDASt}1&$d0yd76u)4NDiM>cVm!9U)pLv7ZXmh#e2WPMv@P)s>k(E6 zwjDVC&xTQp&wLwLv0%Z_?Lhom-QxPKvi+&jdxxBVO%!KFH9uE~|CY_q`Uj2X2QpSr zEJd`W$gtIzAU>B35Wi8421p)q0^S;}&o3y8ncs@mGBi3>XhB2P08*g^C)|s32)V1W zrmcLsYH1+wn>ZpRcBC~+^Of{4OX6{adJLCSdk?=3T>SO{r;sbwd8;-^YNUtg$1y<4 zu5o-AqE6%(=U1X7`3vgL7U)lC&mS%H~bQyez7YuWIZ>CZjt465ChGQn%!YFEIG0e#1#)1Pna9;FjhFM z(~;aD$Nn8FTXNIJkgH}%V&;$cf9YHeze&*my4h!kR+`%x9INkHWnih9YZSEx0Y|Av zZgYTV#9pCr2tw!L;(LjsVb{v7^rcfigs$Na94W)LQiL5IR3A`w;g=OCy>tyKHX*v} z)D7*S3!#2|2Os4%dcRdqXJ)v7$r%1Tc zDG1!d5>2@$>sYC%@XW=ZVs3aToC~9GqO4;v4obgr%*BuI4P-wsI`*DU$l#nOIX?L9 zp)13&KcmN_PRMXiz$PP1mR|&Z$KwsppMVd9?5t>?bZ|Y|2aV152w{dAF$8ot&rTo6 z*sV*j=Sz=FJH2$M38Hfm57~sdnh1FwAaPvyrF&}Yy%;D3d98dNtGD!&r*TA=&Y5@- zO?f~U$^#|NYE&w6^Rg$~v%>sYs|aHy3eya3j7UemI7h`$aT+$W%`>wlaTuUQ52Z<; zNI7)kO>}w&c1h1!5~o0?v1Vl=VvNzB-qG)8fpT zV}TxuIMMlX$xxB`I=@T4E|NH2u$J5{{jZPy63!RDrRgrxn6JokzZkyJ<$h5Y%7Z0N zDha@yRg#OsCc*MW3zt-tPnEudyHIw+KbrF3E|f2kI4|Ot^e#FPMAiw>-L3A5p5uNTbNtw_ubRSLnKuZi8js--INE}^@4jT>z zEQ|6PHbQ;dGcKuVhYiEm-)#{%>8V49LE9h|GCfh8PXb;MYL8vP)c7D;ywD=8rD_?nD^- zV?Ef_+Ufj3L7tY2tGiG}@iQ0rCFR&j&qq-HTBkgu3uSgPqWLpKQs$SJ(k4TqcTaoJ zDfD`Vcs#1-TdvLw@_I*jM`-0^CQO`II0U`Bg}2NeU5Rx1{{0$lcb9D;CVISPV5VZvjwd&YD$y zOZEJjRTbqbh`ASA4?BCbJbB63|D2vad=4%Bna`;eGx3i--w0klf8K(KozhVj0nHFy zjUmokuw+pM>=;(?oF$W2NM6O_MGM18i{iGqH9YFnCOvOV2IA8L{Mfei(~+>{Jc5RH z_0VgEsNLP__aE-@9-1*?xJ2b1?=-o`dmA({KfLI=+v9C#|1i>Zv&VZm-e;VK=hYme zBfDxO;lkB)8eUI(>OKJ8=Q=LyMt6G>scKFE$4{*Q$1X%q^nM4Nmvy|J=skt-Ex?({ zF9WzRy=aSutiE^aI1&***c02uqG2=q>w%ZW9zL8&FQN-e{{md)zI>9OJB~p3=7nFWv{mu-a%Ew0F?2W+dt{!QKXg_fF z4`3=(C$=Yg7vt+`D8HcKdP?6Ryc-FeM1Bv!v8wb$Zy9h_>v%s#?=j%q$$l3c#lI(d zZNO>Q@p_`S3>7REUsU(-+Xs%HNj=erSr7=M3PizlWzZ6?09JSD%E(Gwg9X z{Wz?No!Yfb|D>o4wB~YVPLoL& zC&plB>S>Ap)?Z{#{*LMI9hrVnW;1dilb?;rqQ>UCDkoFh*6=S0B6=O!y z-q>925V;PK-+?tjgG7thkAso2ZDYAnE-Gk0VSUB2HB3v-;^j!I%3lE>mA|EcF2d#H z`U`o$m^{!cRZe_iG9>w6{03{95|;Q4{U@2bJ#3k6)dLVFaqJkx{~o4Du)rXEX4R(E z)Qr?BPPwyLL3ot2c)VNmvq%`bl#TzJysg7BukJZ&=`@*m5GOKqVcL)IZXr^xc*hD# zd%iPKVM-(e2Z=agT^DV_cZ@8mPefe#Y5vyJo>9^f)_}3}xj&4^`mcv6S-Z0GOWr2q za>_kn3L0bj6`K$MZ9aeC4Ew%U0G8_ut(etBM4SWWV#Q6^RTWlA459Zm*hWZ4<*wT< z4x1pJTYxsLGUm%?WtGLOp?^$b#14hktJ!nF@DI{Tcd7hkYT_hW49e@Nfm&FU$R&>X zF{t`uY&cV{2wQS52rO`6580cVTM5mxce}68O9L~<21vdv-D$O!nTRWBuM+WnQ5JY=UwPhcge@S zE@*h9xSyp}RWTW90yF1pO@US1H-v%GCjuc+l0850yc@x>JzifGF(whgb;cYqcbb>o zhJm>ni{47s0KRuB^0A^TctW!t2fpFV4-JYXVv+WFe{I!jzpEOAJdluxhfSGKMOH3KWg6E}%1c~vF8w%Dqx z@l(A7svPGX+OT+gE)+tFm_)nAWh^3dm!6G#su9q{9L41%0jyrsQ;6EHqh#AqmKU0s zuvSehvs4vU**e-vkThM$vML-l!irn`RfWUOg({pU0nNtc)HdR`Ttdw94HCi+3k&=t zf0a>zBEalI$x;*LiH+}9_raovyBYH)S#~a?s@VL!k!rrZQ@*XVsW+9bV*gm(x;a6$ zRYLme*3IebkgSJ^2me@QSzE3=6x;TFM8ARZt?A|4oZ+8r6=NyiHJAJDw#L*97U%iC z^VTG0?yE_t|5kHhz{XJ-W2Oy=RcET*2dL$ebF>|;TZg_7xl~*mVL~}3G|_~}CxusG zLW@kuXF{)<&~`wqz)F380EjMDKbn;Ez}+G&$#4{xRJznEF|ajJv_l#iJL6YA0hGX4 zEDTnqUs6zH8im)F6fadCX|I3=BIm zN1;m_$Yu=w#J@^Di~f`S)>qJ-wf9x7V9*r*tc+76WZ8{Hd)HZaQKiEqix4aKqI!XA@qz6Cax*`#`M?N-vXJqDa9si7 zMavoy*1w!hGAXQ<6k_88%K>nOlCU>2tHp(#lV~!Yl`y`ck}tE-{K8&ETg_iikHo1* zf~L6JNRnkFmiPcq6NWx>3ag4_QfEOp5;kfg8|`)Xk)S=2IRTTpjbtlQEqU=80O6Do zK;=1$3pxwKkvzqh+30+99|`2XZhqh{S0yUDEE?2#y^usaqV+3ZaSq|pN(R6hTN<{_PBgv7 zfzMb_hDOn9ws^9yzOD|!jnC*!lZ%0B)6WRkRT(xfq4jf4@>^7SRbjbmrq~9=1hJ<; zeWLD=pQuLF#P;m8=GN>4WI`+VXWRVQc7L|RpY6nU&*^9{oo3&H8mbSl*vW_Scl_Qe zA$F^ODk0`heVDU-RetJlDtZGXf-E5Q}G*ZIRewBJ$=slt}%|@4b12>@<7&uS? ztt6HvZ{o;XHLf^m9%C^er!=0g`W2M8JEdP9e$`uc4wWC}K=}z1`i1%SS<|oCgi7Zv zntRp6#W%ZPH(w1XxyHF*3VC?yu%SbNrD?ly*>K^Y3E2;1xrO_d7l!+m@f+gM>zh1A z@)y~hSp8YJcgdw5DrEp<`@y@>w`A&Bk_pgCiL#MS6{T~F#Ud-(53I6uP;9ZrJEi&z zKHZI{Be@Vdl$TQpF9bKC*w73R_4vk1@Lptl*-=s`=#8L4IQ3=XGL`;pFGwWn@(-&h z;x4b)rjE6ES}0jZC)x`-h`=>T*LUb-fs#9|xv+ICm&t1Wv3B&U(4X>;P4JIRl(dnR z90W?zmp!BJz*Id5Y>}Pw4^owLda81|q$-=lk)m96h`k>NoTwz>z-xalPBez4C}(S~ zteXB@GfB)xRFbNeB7^B+#+ct<5)j|ZZTDWDX>FB0nFqgowrT_zlDRd4vB=VC&v{YL z{v}@jk{th%JaEOqRjNL06&2Ze*zd9>f=swP%~DPDXXojkjk0|5x^SWj`&Xdp#R~lkZ2kpy{{n}9fwOfCPaM|#3luA$n+z*U<}S(%yjS`u8_>PDobsTIWC_j1 zuhK;e04Ys%m+AMk3GDz>kISjC{ZLx&1RzC)Es3IHh2SVE0{|&ME<{pL8K8PeWj>(Q z5~>HZOhPXKQuH>P&|4<-oe9xWilWEE)>UlhnSQw@G#8Mf4D#AiJfXjWr4VY%=-q(P zcaHclv6bunIet_+Ds6@ytBlsFhR%b6gl15x4hpr>W$H?MrAt?mVywfrIj_=XqB+B8 z10gLix+lvPa%iArqwfM!b!P3>{Ug;XHm*%C=TPwK)h^^hX`sshDQ$WsAf-8nn{Qe6 z3XfkS3cAsR*ybp|+f0aGBLbIG4o#@HKR5j-8OrYk69S;E=MP-07Ay5C_ZIQ}nBJ81bQ4?ZWyH znZR?!;v146xEK<{Z}Ftg-BKdZAC%{3wTcpFW!!jESeyte=?(>5bP9x}(qTl}PxvGa zb6o9AF&6m7aMxR6qP;RMoNElADN@5hiYXXa=`iB4hzBL9LcQ+~^_5c4IY5j>AbgF; zq`gUzj-bZ@BAK+jK)DOVVnnQ&vPuW`WthbAlxKD?23Fd{XuE;Q&IUG`%LrbLlxW#e zP+xu+2UVg?@m@U`Y*cb~1t2BgseqJxvmdP9P6hM;E~mEC^rHl;x70KW`lAWG0?3Oi zPBt~_Ex$+4^A`vxHM9|oe3yQhV_|#>>KNGn9!>x#P2ormi=V~fq=%IGM(|I z$&^Z|M{8em?%mu60~uW$kGu7Q`4}nAv%Yt$ZPNkv7{lgw$fZYdQNPh0Z{lwff8ZdX z(mjmde`iC4oP3+56ESbz|D_EP%T0;~5V;D7X}83<^jD)Ys(vkpnB=on_qAv)@Go-N z9^XVSf$Ms#HaTdCA-@^N0*})brhG1Z=z2-YT@Ue*$F^b-n!-9gc9ueP>^*IEc#4>~ z9=rU3e&N`uzv;Nyf%yv0;oIPAQRf5#+K|@<#f@f7x?KHE9OcJR5alGDh&4p~X0gOH z^B33BcTUrWp){89przPA{IzcGO5ey?uw0C8-H z_|XHW__Y#Uf<0}BaOqTUoN+Y@z=%s$KfK|Fh-k@lbfMhSCWTaBl3r5r{2gJ+@4$y{ zfTaB6+d9q!UUV*c+P1)TPLzp@e|;Fj$5`oP&jfe1ZGk@D@kcu5i>{A>EYm}u#4bL= zO&=vWSQpmChqF$Gi{=Jrz*66Y!WvJKe0^jB|%<4V^l zUo0u(wRU|}T=Xf6@`)_>!FU@T`^8;icT1ez_$3cZuC87ej(w3%*=^?Z-qYd=w=$PV zIxG>oUlmW=Wz+!}J=a4KCt7|kg->(}-Ca@$K?IJW*^+zzYG*iwuj`b#AtG9S*pG>( z+|wonmNKRP#Lw4abwCUty7zU;mz$jbTK7??pMGsI`*D6GBg8|El2u< zEPRw2v7f6`{!cbCxImSz`|X5RBF)hpy9&6`Y3^y;0t!*qi-d9a-yKeKik@b*ZGka+ zd*lyGGdixGHZmCHe)RR7E5dP=>Xf;W0TLClQf;WD%>E4BQxk8(r>jwLx9FjWqx>3s zOd;orqEo0gMBI-M#+CwfW^bujP^F)}rtcLnJZH|vS#DkZ%ByDHta&`;+1~QhA=ed5 z%<+2MIoEsKSy^6eCzv@O9mJXCixw}u33~`m3w>*K#p0zJ39uJEb8!zC<+B!6b63M@ zp=V)H95xo{zU-c>EfGuR-5Dk%z2`09zKKXgJ#6`H^U4=3S*p5027=ss5KVlET!$xL z%&u5cwRj;?jo$B)d9$l4%CQkdZAy?3&aYcEZ^6xk^$3?NT~IX_xJ%0C&7NB^6WcTl zb`2XlZuDrcLem*$>=04s@kKtVOqAcoUiWOI0g-eQg^FO_0;EZgUhOW?&jUQoQ!m;s z$js@IF!gZmjjbv=Z9Tk-w0vPTxNIc(rlnOCAYnYp9WO=})Z#{Ni9yjyi8~F^V9@A^ z-f`FGXL&i2?McT_w&xmiEZcLTvD5TbRONjc;)2kLK=`k&jvc43jvf8)u8!q?tLjDn+4@)vm3rpidy(g*w_YE$^XJP(#a(yt zs5f@*ytX)_{@T@!!Ph#szA^I2x9dmteRuH4`KGD;A&jio@ zzm1b8!rXOvj;H;`EYI3UMtN3!km;G0I>OU&-!RYk&(k~?l@0OCeCsOD$5T=~D-T}o zx#rf(JWcjXJbnIj@xO6CvtA0bbV)D-f(rhsd9$YsPQ?^F8lot%r1V%~Qlf+4N$>hi z<_k7&mKX|Uw2K@VVB3c#P8Y^tinS(;%TJ=!e6L>|BvVfL48}wGn8Jzqvquj#H~6V% z{I+=N$Q2drPwL+po_zpTSp zSpKd!iPdeXST~NP*lH+qeCE4iW9t4!Ie|67je8Fy?ye5PTx^ju zt@D7Tac}&pwV>*+b|fDZ`3}qL2eNFTL!p-a{LqAL(yuq?#EU-x#9K!6P*%f+s|gL$s!C4>cbcB(1_>3CJbz^KEQDVBG~WeY1R@+A_E8&)L;}VA`(s z;P(BaZ3k|!)qE&gIsLk9X|FurwjaDz{Z-O~E&J`e4kYfP4OApYhB`Ij5sW@pj779lj%0@AU_dRG$br?;*EB)7Eul)+W@v5w$OXV<;+r zg@9DLubMLtr#&n81G0Ft<;Mgc9j0mXA>gz05aHYZ*4Q=mQM8L3)1V^2Xe78!{qxuD zxB9|gJ$l85Qg)&CN9qy22^*bI)YTVGSbq{HIuzxlCzB5Rf~6x)bSO$fI23V|F5-PO zf8dCt;=e&Y^T(z8%#QMj%sX?eM%NkkZu<{khx5)gd30)gdpRJZzlqYq7srsI_0sM~vXQbY3XV$w*AKTUi zM%NxNo!qk)F=9YJ;@#FAUN`Bh1Kuhfx2N>Y0KG?m)2`!@<=v%^d`YL8if}#gFQYrW zZqhdrcoTHop3+A?7XxQb1fEP^H}n<(XITVZcjYky^zH-Br#jw`<@eI~h|B`)DZf|z zlXzEkhu2L$h5~Q2j@uJoG$@`4z?s0t4~~42d^xRtNcjT}_aD=dUQhfR1DxUryzcnt zMfe#y4nXO8qW2W=Ui=62mLWlZ11J>H(`$L4<$Z|6UW_trm& zx4%2Q)5_yG(ta3tZ=Izw!FttGemis=J-bpL{J-x*FZo~i^v*tZwS>>Rho|>nZ}ar~w#qZsxx{1ZbF1eU!3Cb_zWJWt z^{Mm(e|ocL>K|r%9@#R}(`&lpRv4JSrbr+qSNS=)P~cHH&msIxxbH0p|+b)(*@d2ZClk3BVN$Wv=Z zJ-BMcsGV=#F>2tn8KX9C89VA%j;lxcyl0PE^5<`_9roI`YkU3v;cHXB%e(f)zS~E# z^l)E~=hxu>8s5JKyw`xg0pT_v{07k30D2ohcLV5eKs*}|-v-3H0r77@IyN9Z8<4II zNZ$sea|6=bgmgC{{Y}V66Y|r9d^I6|O~_{x^4o-bHzEH`;6oGm(FDFUfj>>)Qxo{r z1im$ae@)CGlX2lRHS1bWW!9fPlb?9OGym*AdSEZ#b4}?pp7Qg5 z>-kmtuRT9+`=!Tv>`Bjm$Na+caMI(RKbJq|x$w7-c;dc$*z>Ehhde)d<3Z0QVR{jB>vZ)>YOo@Z8i@}>$;?ZEpyx4*N(v-g+FJwvPS^^7WL^gKPZ!80h)=P9(` zA-y~crq3M?rX>3c?_O$*Kl8(i|1TC%dl zI41L}8XjAalJ+$g!mUb0OD48V-qX&lb}%}dAh!4p#Q>lc-K69oH@;yZG|SR634oJ; z82Klh?7-7ZGJ;qQ9nz20L7W*OpdjQ(gi8eMMT|H*X|_Av*K8Yia7W17!H0v}aSAUn zVEGx_>k<{pL45w>!T~U#njXB8Svi^@pJm@WxE*g51RB5@iRHJhLIB>-cGxElw%~xD z1L}}B<`C2qEnD;@*I2@g=Nz@b7eVr{-v_rGBqz_v0Qc@8!2#=^F>YYPxAT}#X~&3> zma5~KIA(>z1)ssX{*72wj5U60!vQ-ood1uLhTJX$c7kV2eH z-^CJQs@T1YlSgPOh}By`0N@UJrf>b|*3|MGFP|phVtg@jm{ak@OsjsLmP+S;o?pDdT52XB2&-&tNmsnYvVFJNCDtC zHM!0nIafa^heDE$Wy&1eP&)Rg98Ys=C>aeU!_#rFu&}nT5^d~1+H~ywwPJj0d}yk*`ZI=rwTN%( z5`CSqH88L7N_${pXUJ=V^tV~Zg-Wf}UmP8ZB-LPx6Vh@JG-fd7>*OoM!xyh~h&MxC zYeX1*`7*{v^{q~#>=;HKC!1SEYkZDEjz$(?KMZB={xJr!}w-kDmd33vi@13 zgwDg+BDTzLYL3!U#v$Fv1`m=oAB$fasg2?aV$-jnd=uhE`0FJe+Z6?I_gbm+ zD>0#4098sq>N5o`1H`$NIL!}eoP7I$>GzoF_dKBS^6efIf^xHRgMeM0cpQpRRW0+2 z(7832WPTyG)(i^e)VBxS^?9^kUf+Qy>;7gy*4j^SluX_G%7%oIU3uKFSEdC&vTpGn zE4Tcse5v*GH0fT9=mv3syVsq)Hy}kC&a3%a`CY;V$<_T{p|9AQ+%g^K1gbk?B1PF+ z;~uN8*<=2dQ5dYQueD?B-Ugp=wZSOw$;Qqaj8)r0*7^g9TfLdBbzg}$ae`~UJ$}`N zhzQnD0yXP8)G&BpYNx-<_I@t@F}S@;d8*&W?R6IgFq$s*1mEzr*~SN3a0b~M!HuEq zI7RP`{a#yWNA<@zcn?SF$={tgZtsl)q5bmfPG&b=puTD0A%2FzYKjCo=WHyf8SLYx0i$R z=O80zF(aYo{dqRzWE|3dpww3VIgH$FwfR1`f;ElX(RknAhQ^zst_GK(lehY5Pp*03e2n)BeYVVo_8oY&@Xp^6j~R zZj{hNvzLB&_xDfh;&Hqw@Y&j@zS;WX2K~;eCmrSoe8+euL$$p`x4ffI??lPWTTl+r zdJgQQg5-A`n6|OK=D4WUr+IL8<=1r+0@FKn@v!a?n+}wn3|U{sa`(goxhK&pdp)!x z4-&E?l(XCl`PhDN6$h9h&EI^8X1t#=MK)2wE z(*}?JFZ(YaZ_WHS<|Z(3Fbg!I-T%e8iHP+J7DQ@^;TSUA-$!S^t|0!>GYLNuM|!hg z$obE(&tUkhM&lj!VgG|Wv%)^vGOXbfIWEl@EHTu=eE}tH`OA>-?7&1llvU#_0~aXW zu}JrlK9O@Jtn1;qlH1mP98f(9;?LFt5vRLZ52k@`>COdz42P;xo+wwtuR-_GRO}I> zk-hOIdR>`S_Ln1bN}a0K%rhOE?;d?YIH#+0%C;`~VlOK^FB5Ino0@=*IMMkcFT&lXgsXTtMi0d_#G8_PCj|7A`?RIO5Q8Z>VzgiL6Zt@K&{nDC180(RCwKK5K5p zO-ogn|76X)SCP;T{AS^HgR*%p1Xi!Opxq+t&Og6qei@QUSuZMH_kNf^?2*#xYvv+*^8Qa8&+xixwy;zXA+luJaY=oPci>7j@d9g5=z;kYJm_~e~%T-=FEN1W(T zF8G8)ExC3&#@mb(?$<*RCpy$cQK9evXM{SbhawI_Ma&Ca3?EAjYd^L2?lWG2Cee{K zyB?hD>QOooJRB@TQ3KO`wKGy5ChDPx6RUA;{y$g(RX*nYS=9U&1i=vc|`IJ3z zvI*-8Am=YxR9>~Pd{*`1+sp-!X>&5<1T|)-v7B|jH$63dMCzQ`H$~1?n`=y$C`;-J zGi^@y2FO7n{hB#xsl$g<44pOXn#dKvw=KCfl0rHbjnbKM4>i)F#|YEnOKu&C23LjB zeUuOg7U(di{>tgNXJdHhL4yvb4co}5ku354o%apPRr2OxT#eD|7cBI zM#j*HHF0NYpYOXquL;9>XiBB)ZcW@Yi~iEMb+cYT;N6PT@VZ+sz&2qZs?TMtLU8Pl zc(txJ$X)QC3Y?`n9_v|8^Orv0JQ#u3-F#>P2s{Ct&ln*bTk0O^p?mQlyBKhcw>x?+ z_&=fJ0FpEqrte>!|GiFMLz(kqOUZuB zHnG0%A@x67NGbEs%@3<>oMaxG;5fOwh27scIRJdAgvhcY31N`Pilvojm%MT@*rOKe zmE(9s>k+)hDDoiuQou=7HR`;B#pJRan5H>74sRvUFh)XUjL#EOcdlUxL-ek+8deZs zDj?ea&+-O{R%HxUQ!X~~@0WgIV+;}pA*CgO;=q$DAhps6*=WP^oX|R8JJc|y0Fx)e zeAUnN*2%bZQv$C=C8RRewAz5fsqL_^RmXEUojCP$v=ynlFtE@HQ=l-hq1*1jbPe#N z<<6EOkH~5$sA_LW>TBnTxkniIWSFsAQHEpki9elqb6&@g9+>)Q_^HxlD+L*_0p9%*_jiEnrH8 z8f?VS$@Z#$!B_`V+grl{&BY~iSKw<=H>L(Ta%0^tj_H*0D87T)h`EVe)>_PCaod;( z%mcx0kOM=``lHS3x8SH(3q{fpBuqbGJApM9OV~K+UcUg^m z`+MWG`^~n@mfA%aVOBN)=UHnGk(RI+8HD(b3%si2Qn!4fv%^2O8N*y)CMaBG@CZcn zVIzc82g#)N^U@9;Pk>FVd98f9*i?4o)J9~0NRF>Z+|9(RX7 z|F9Gif5nTFb(K(J_2&j#K8n?=yFd3SSo^`6XhV+joBg>j!3#nI8B>d;{Y9IN1@6}; ziriyjzd!#sV$BK{T29gOP0(M|A&Q#MYxbAz_8p3C&9x!Tnq{;t;PeKpt1q8Pb33G?6+R@=n@gG3_2O%7PSfhqO6@i8Sv!Q6Es|F9@(gIT$C zEFwjFoIe)_BZmft2Gz}HTDOIAd{(UW=Rj^~WAODr(fY!JEupgY9443Xt9ccXzfIDz zf^HxyW>32!7jiNrrb5)iS_4i3yki}+*b1_LWW|4{7lBK0EHRX z%6^On@3PH?UoQcv*vz@TiB|pWXjmI7YKvd_3`X(6d$~)%pZjp}lE~eSSw(+7SQ8ZclDDA<^WXC4K65lqKleF*{v%*@{v#rHy=9xyb&7lNKyAllr9XE)Rvn1k=kkDF z4LJd`+b5OiWz2MKwrmnMk-HOO(pHF<1-j)$^8usH?k9?Nmmm|{{8YI8Cg~=Y zWrmn^nCzM)R?38slvX(=#s#`6AJk`L_nL@F`7Si-GlCN|0Vi;^SR~SmTzOl z#+J4VExScbAy0kJ??8n6ahUo8GD-O-qw_paS_4(KDjH0o+5Qe;p=~1NWq31X>gY3n@g1c#U zXL2FT=9aBdVh;*MKtfU5CY!}p^o(zFI_hp(GtQdk`4cqi`K&s3;twDyvaDhS2ba*N zS%3`cRTSQ6PRo>Tg*M&Omb?R%Tzt!VGf>V9HRuyXvJyQm5=TU4rd@0_4b8R)PdUMiV{LKgFb^88(%GcW4U%OxC1@-lt;CaoyL%n^?z0u9M|2S(# zZgXJ5I=erAC#n_IJ&*^{&d8 zNk*HVfP@+OW$#xVbuVh468X?d9ncf`kBj^lp$n)oAP7OIPqZV+t$cn2O(V7SBa{(q zhCdg|>W~;f4F!>qjm!gj!8{Iie3~M5uWOB&)t92O>?@6>Sr_$J4gA<~F0|YT_rN03T#^)sh|SeH*c;WSuBloxIy$ z^av^y?~fzxVCIN{)jvTppbX%ABk$9y;#y@N2X?f}9udy_{7wtOLjW!NMA_qfE^E%F z8ZSd>tjjW}AI}_bt@#6U+wiIjEjxN0$kk@U*jw&;Wb9<2D8O>PzZMjCPI8Ks5)ah(1hNv1W$iXry8*ICxsmocYq!O(>|l!tZs+bC zi-Z+J*wHfT@@|ci_f>1#LN4uX`ax0!%ch#98e9|7^p(y0yXWk3r6DPGl@5Vs*Izn`1Xc0gClum=ELC7~|> zT`8ft7$8$2ZU>Yi{nh|d>HED2y$48rUmi6f?ElsM&M=|d0Od+5e*ly$q4xk?A)yn1 zE|*ZbO_{NCY8UlU=hwz*V@&8#Kq>`5rt>(TAN%2*&UZW-mK0+t9KLz%_;dnWPz!8g z4-c=X{|E}OqRTuvEzfvae6kEt(5Ry* z9ype>{tc26{szgj3h!KY=*J|YKj69Q>gEqD; z`tf+g<7TYK>V#&FU-cO2-d4uwv1K*5-_y=Xfg+DL5;a_5M%F}5`FF=bQuS+Rr5 z=03D!fB6Sd+p&)9wzQ)QM4ixqPpr&RYt3@3G18Zf2swO%wl^oRTz;vqmfz#~$3@}; z0p|m-t#1#GlrQRZvm`=aVhDZBj>~9X(9V8x&;#JD_>b7iGuO_Kv{OHDy6&(;?2L{-V~M zVnLtdq*AWHwo$pZQVr)HD-jm4re3O8`$LEsnwFj9!?@Z-A=E4Sww>$*B4#ujPOlh1 z+m}$59r%KXUwI>&rc*)=l8uXB@k>(3-5*$gKe>XB4iVh*U6vmo0CD1HWDz#g+EBA6ce)c4Ye2_IYCxFET@I0`QT9Xx$2vz50*TA7)tDW^x{wpZo!tL z=cpIGvCIbE{iL@$0Vo?)54i3dP-Y(lwl7Tct}7@IIrrIx zesUO)(7_s;d8f7JeKs81^xj!`s0|RRzOJdRH=!~Unr}kryK5YAi_=a)vRK#Sv^!9p zl~!M7LN?S3g;xTIV;)ZJUtj8DjuFoS0n>T^muy1_lcE81wGF{x5~%ajoYai)L)I{s z5;+ARD{+hq{;YV{El9pYL3og-nDNdfIy|8sXFl^$Iv43g4Cyn@=p_VQ7s;Th01hXL z_)+_-^DAn@aj{LJi<5B?Vmq$f>2aaiI4!O?ndiuSp=JTcglaCUaV`J{`_ z$u2(q4Mv%iX*F3ngR-}aPiYsQ*42Ozdkn^-2ia3hW+NjtW$EGemTx_fy^Bx%&B`dt>;`d`OK_M9_{JS2CIMJaT zGL%u*-w%~T9F0(&dMM&3zj))7=F)xKU3{*J@`dg@$EAgs|65Ydu_KZqEWd; zjJh1~f`#*zRN!~m!>v8m4Tye|7+bWc4H}gdKiUqS4&h9=``4VJEE1x?DA!k?5 z(wA?5(5=-o7gT|)9;J@QC{BNK3!*fmnzx{;V)3GdSO|hdL>REUXqWxrKJ;}W=2Di~ zi|168n@qfA_N<5}!(auLr_C8Ue7L!GC+(W_)R`HxhC~!NR_|0SUP75-T5p1pIlcTPn_!o( z@6}iVq*kl^lWSIn3>~g8X~!u+u35=GSFMXiy+E~ETrsN(i<@-E55u=qoiMymgB(Wn zn{0S4Ct%ce-P5aewGF|>bUE-!*h7G`bYbn_H@9To+?RJgC`(5y` zMj}G(Gal0WpbK7Cdc^yCcX$zMiS($1KL=i?j*IMfy9UM!|32vLjAM@nj@m}@r5k!> zz_~@o>xmwFNw)*%b}|@_(f7pX|JHFNB7P*FyNUN@;I- zc&Yy*TzBP5k$U-`#Cx?nyl(Q*1iUwO+@A8W4Dp6eqt{b;Oht<{kF641PxM@Pu|&sF zm^xp&N#BEL&wkA|4X!781z^k{f%AQW!lO7aegEoOng944Z)&FhY@H0YpYm{~M6s#p zQQt?FV#~%7alGY+*no8{^QND$W50k?+!z2+W5n2gnktTp_C4Q+rnpl>pJC(CiO^>p z=t8-jICx4;i(yA^8+|a`A@7)ncXQsKq;PC_T65-c|GEC9Hvc4hU6sB$7^n9H?B@Z) zfw3iL!2SYvx?;$Qi!U@aUke`xXYsj00EWSWJFxVD9!}quSZtDM4t0j6wYG=j|UP{+nYk=AZdUd)q6k|hn&8~^vW$|I4yU4=e~~v<#0gb6@s>Mx zsuILIjqg_V`74q4ebn#0Eb-31ZyWbkf665bV&6A=2fyu~cFH>5?>xn`9*rH;JmM(F z?dIZ`P$}0aL=3ZC1X5hPq1G5Eh+j+R;fj-A-jvxmdDtj>Wlp&j=K=}wn}w1er{QBq zht5FSl;5?0RMT84t?Vv^@JOjQ=ZSQAUw)3X5Mj9G~(6d zY9VguO{Bc5UH8I*y?X6fRg=D_v!y*28{^%92^$UvoEd>B4{3pvMurnOv5rzZ-<@RH z63Vg#^X$G)9lj$jU$Y}~7o;r970hctcqBAPLLH&3B=vlQHRL@R9G5|q)L`Cmpxj`S zUa2APalD|1eaUl(fYkyqA7TWKU|vVa+a4U3;A@l7Y(zAe%fI2cBm)X|J?u$FWs|X5 ziO^0E@2$acNu=Ge33^AD*a0OD<;TT?DTO4wNDPYvG^!QbMz#8$U_-4;3-$qCB zi9k-^P+-D~iJ`2H;EV+9gq$HkZvyH}$eS3937w0@I4i>e_gHWSGIBgP!_MuzS;sma%xqNLd zme)pa<`$B01;-yEiNhq}j`#KFP#oBi$3-!iNQLTg)J+G2oN~p*zC)wWk;+uVc z+xG)mhZ^ddTwJ8|p{^`Z6D_pQke)}3>iv+jR4ArI;5y*#%*rEW(yjh2w)LJfvE}n# zV~x{Wt@T@$A%=<7|ASG`DJZpVVu^jvsX)qo;yRmeqb*>q4`66;l$eeU(J&eCnl(84 z32P|l37lm3niiP$gcj_L9NUoLJW9hfm|4iPBAYhkGTRy)YgJ?Oq29s4Is`it(n148 z2euT_S;$bX7{$Dy1J91oxuVV{rrUdrEKkN}H)69Rw!D8PxIguVr?zK)5PwfURW_-tvs^(bytaV-2{1~-yygV3>0R-SuLV*Ap+AZJ-s9R? zIa^#H;%jytJQA39GV@bZvyk_2a9l8y^;R(N5Yl@nG#%Axe=zS@DC#vluJOqUYD*))A)*WM&h4dO~0MGEnbB99dh`&dUO;3U1W|~_A z6Z+cZe&^(U0q1I1)?igO}ekecoJ z9#9JW;=}mZlOQY*1Er z*3(qoYrF1+dW?{BgENvs-ub~9DIsrC&^tF&I+u^$lu+q>g#J(uRGJhtNS3C+9H@6j zaE2@7ogJLv4tZTc?~G9C3_g0@q0-q#tj3+OySm1Xkfl_TP>VCBg}eztZ)vEsl#kwN zp;G)OP$POB!5IZ1uQNDfO2}J4jaVuly;DM^Q}iAOS8U1rLRz30Ro0DsB625n;*2~h z#2FJp-n<}oc$eaFLeOgul}S^iv_A38So~BN|Wfx!bzbZ zAQyHPKAH?~I-3j%0vMD^eo+w8Q3NJQ=p{XMrA|`Mkjx*+CW>MPZf8j5L(E1Z9CyJp zW{o6K3N#_3A-S7bFxaae$U~t!4!kGJ#)<%FdcXh_MN23FK|ezJu&bRZvEqf5yoS|} zAVnO>CNE}#U@25EUZUU<@eIZy7Z5}w1?fX}Aza8#D%l4jh<_8)DaogjJn{`eLM~|X z#*SpLeIh5pEauWpMtD63$!-!bfdC1h1`>oIV3ZURi<)2{1X*qtVoNJf+VWHMMMcGrTC{)(AOS_?tGX)z zgD+JmXrrP=P09axX71gOd>~eA^?%{nd+yvbXXczab7t<`kD#ft>1XV-d7{te3tyIf zHs9wgmwh(SRC&Rs%BS=>zT)vBA{4UEXc3{%=d5HzKvQM2sZcWd2OKnyPAiSIjXjDV z78sw$mdd9iqos0iNg+7cSkOk8Gn?jwbLZnso6ng8Bela`FcL`)G3^+Bap=Nf8#5Ln ztqtAq7-LQSNc>y}$XW8Wg1RM;HUpGQdjM3DIQw9LdM$AFZ=j@eq`D;m|#e1 zC@3j!cz_xmILqf$Wf_YD)YAdJzXtf40u-OBkn+9)CG+-1T$j{M0jeZGJ&d?6&ps2N zdLgpQG)sWu#D`(uiVvz?Gn5~v;|KDPpuB`L5QiBy1YqN6f~VFo3YbKPw=pVq(*@B5 zv>s-WJq(jKMp1S^ljs5>maqf*7`-riWY~y7yRrY7WdAdv^+f*@Js^fX0CC~Qt*l8k z05fpzk6&4T@g%;P?_yZhJ>t)l?)kFuy-2U?ffjsoIp1OS<}5nx#5Z*MYSX5#hBrAn zgim}CY|>7C?Zj8+JcFrkV9IO?D>H2BtN7B6aO#U`38K}FN9BYUT|PMBwg+Uj%g_O?wK%j(gSk>)Ck9!H3ByADG6IgLrac&sU9KL^gKd z>p}P?xd#s&R<+9OecW^2rcKs7?h}T6xb^N$iooY>Fz4~6l zq($QQ3g>}_ez2huV_cMg3}D%f1fvkf#8Ds`@COoaD2FN5+lOmZgm1ekm`z@MNnQ&sCUl(S>J% z;S26oTy5o^gwTpdQ4+qb9^<{IgBM)-dnCqr+pFQ+yx>AxMXIyRcmzcqZNjov2VNTR zjxu>uUw|)rN1FMVPpf(fuDiT3fAUN);~I=hLlew?Tv**|#3hvhVGG{bD76cXQ@RsZkJYd3+ zVmM$`evJWyF~+LA4oY5+q+vLbS0Vg^6Owu&K>Z~^{Tt7XaJ_UgiVNG$)^j8Gg-PW> z=$%|t8}~qY3&sp;*y_iBEypPGVIUQoL9t^*4ZSVGGr@bZ;rE((XPO&%!gFyYHh5qA zqY0~#z>%8UrE({pk)49&#+AzYToeuxpN|u&N zp77GiAFOkITJxR3Iu~iV$b-^xb2aeSVnyjZ{VR<})(7|h%4e49Nuq`!i~U`nKk51h zZF#5K5aGlxE%!tWm!R=qZ1c1|pFg2BPWQylnLlm9CZT<2o%```f@OKNviP(~xWyP% zg6$Rlq{J#M7kQ8?M0fdo1#gY%+I0Q2i+nDk0glC6NRPb~HA-56Lf7#JTQuqu{?tME za}k%E@}fiNUiXsBByP!tYtav9f?8bg=o?3Zx!%xnktaMCSAB!I4((t1mtd}Uv|Qu~ z*PZu(!k<;>`sZS;f~Ok4+`jZof(dmk{wWg?t%U9&R+UdUgj&@qdRS-#xB$5g5q8b& zgO9zB2Y__Ra*diFe(WsyLXj&}@&#Qab6p-!e4)MAuWp}ht_Zg7MOt|_NS3AjOiPhH zWiXE9EpF|vs)_sfA$Qm1cOa(r__YlEdmDnU=dWt$PX@?+=nZ;te_i{_X`S!2YeMx* z@^nQx9%z_~Cj}A*=}!YBPEEWfA!%x2;J9RRV#(Bjf$v)+P8~csIgwxU=p-V!OUkV! zca+SUK3Pi-Jh2e|oekXkzvdf#uOcZqd2q70`Oka*6UDv%mWR>cT4Qu~?|&QnYUtL@ zz5j(c-`a^!-1`stIvGW*M-07FA2BqU&Tjs`MFP%UITMd&0^C@=p60!0-}DMo^{}$J$4R$Lbjgn!QXU-d=t-rk3;A!UHF_`p2cAOW_01}{+W$C zy6|-`@6IlK-OIbX3tv}x)MNe`@-03?zF(gq-^w%Kqx~N2!q>gNk96VdUf(Crknj03 z;A8zZci}_*LIyRkhyi;G`1WeN>>u6veHlicX7J=xGZ*>*(39VrY6MH*r#ruA`+k<@eGvH(W99{UjuV4Hb@+F-CAM2Oeg%5g!eBTQ!;>9IrC%&HI zWEuFXHQt`uHvuvipP{@L!S~A7$g@M<{xg(!5`4x5$bhY<`ZeHOU+}!H@v(h+()W^D zT$%ygdXiU+bIIUY9>Uj?ya&PaObB0h{i7A~HiBmz2W)J;03okayEWj%A@KaMPOyoG zIlALpjnmKL+FJ3f|M4xTAXB_F4Ng0GwLXpY7sIoZ#!mbKOuH+W?Nq1nNKTfEe$-7IS_Zx~8gEbKI&tDj@O*f`loqf{H~N}!2_Cxj zq^|{hc8#~Ea*J`|=iph4OE+!-J9lbdJNW(xp3Tc7U%*d0)sN|Ye=B+P-=6;d&;@6} z$GCAx7ryS>_j2$J(s+B)HxKes!BeO41@!Hv-ByEV{nyDuK`(-*&jV6h)>rsTH}VF7 zCtc&~seZeWKL2)h_`&PK~c8d8;92IC%bX2J%jUr|$|`Zcp;~dX5b|(^g8p zp5g)Ryi((loITs+AK?2^*Y3(_xmNKrlmxCQ*G zoBnpm8p)&o_SE05?2fM+KkW~`Uue8N=~0Hlvca=K;|sJ$H}c*D&wF1ZkL}wEp4AUa zEduho(RZ`P6Q*xB8?b*7*a&O}8Z>Odew&8v*b_T6yn_8M;B{a(upfA{6ZYbm=gCKY z=BGT$XE}OVEJsgcJyS9c(zy zc8>*;0osE46#{brw&OIQSOfK@KQMhE!1iUIVgDeg=W1XLuolqUlK!|KXgRy>sqBEi zejRp$#|In*6x4w_JAph6+1fGFae>Rd0d|y~3dCsOaV!uIFrB(i0ceLp4b*uWz_zah>Hxi+ z>p@d*wlno+8$SXt?mY)=1lZ2If%nd=o#o#-LS2=wfgR@)fHHvkvdvoo6Uw5lq`BAI z*o<`Q>eTiL*e3(o8mN07PztcEb^SwiXPfIfv#r^eR{_+WV7spc)&rsXzk*}>dNV*7 z-xRdB4wlP0u#YVRcpO?6J$AA#j{xg{X8^{}Ex-<7FMzsy7jabhQ7Yu03D_32dm%u( zhuVeu@^}%zK2`@%U+UL6wounK0BuiwX@8Efn*r+U1CE{@eH9C2eI2aeAsj#gpzApe z^ce4rj++frZB)S3FSjaLEGm7u@r?Mq!70P6ZJ+g8L1#*5Q|eM>=E zgb^?U)YS!KYkRi8Q$rs1IRJI0j^zOL=Dr#TZQszgrJid6#!x+`YyjN=P}etsmT%Us zB33Y7^n}$ow-(p{_yFok{VV`=Oa>BwSilZ2jfe-F0DUre(Bq8y;U z)R8_#J!xY?_c7{Bed%MN`qK960P4F1cpZ4RtKH9*zM@a$qm0vGJkA#aQ-ES^&tvL2 zAJFxt4^VGHZ{KC0IVYj6#42F52DY!>whf@!w!X8gYoH$_L-y&Aiu0jx;y4GO&fL2I z_9N1?)p(#3pq|u!4nV&q>HxicmxHFxY-j4a9@q%5ZFd7L-%j7J9s6QXh69Mzz+;=1 z7LR=%kO0^Lp0jG;aVkJPsWnqYgg-3hii#}K_g>v3f>(slqo z;Ju!0AjZAjhvPKWQQdpzWps#lRG8Uxs}-K-<&-^}sS<74QhK9^g1a-S_vbcWD0>^Hk0w zn1^GY|!0CnY_y3)SSXrP_90kmDqccZV6t+$J=58H(8u>_zF#C)Jq z1AT+22AIx$IlwgX@OS~heAJy-22f|prM>j_)%D$gw2(gaZQDxEFZ_$;>bmH9u&%6g zC`xf$46rZc1KGedAWx%tOq%D$13bsJrq0|i0_p*lM?YQ-P*-9NKwn|oJ_oREw*apI zZvsdDz4i^8|FYh!f1w7_x;{)}y;=WMAVC9lBJBWTG{j3N8I+f#(bSp8I>v)0m`)S}Q-D%n0Z<3j1IqyFto!+MpxNF>POopkZ()}% zeRCbsRs*!BZc`q!9PV{LTMwFj>2=_1?5mgepW2J@lJ(jKun(}Vv=Mb!1yC>cRlPsy z@q;!c&GU@4)OQWQ{FJi;coR57`+gVt2F3^W=>~vp&NgGau+FUiVqgJK4$RT$YK@++ z9qT@{9LLN{UDpDX$9CNX{1@6)*q3d$1=s+Dw%sxuv)-w`@ zb$!{k^a1Lt>rLMvI=AzCXV#CtNjrDxZ;V&03+tupMtzC_Cy=1+ld&h_wLQ-fIRJGf zN`W$f`3dSzu+6Kr{UYpH&N4u^1?{j7V7q^dHvd}PSP#~RZRG-D03%=r%zy&ev}2|- z%?eO&2ap8N9z2fKj!EYM*&!GYnqWCofH?s5UjXR(F9%J%p96LP-&XH!nk=^G8i4+^ z8dwFa1sHpH%=9OLXMpDc#+B{Be&8Qx-`~E8Z}!A1+BH-^>Y@89?YRu7*Y=@tleVC) z8vtEj`WWp^eOtaC`iAMp_MvVZA1Z-rU?HIU5NY-w##!o0A7cA5AN8f4^eMJ0ZMGYD z8#wac(^ZVo4XDFASFH}Ea`R*ydEgWO#J%XuE4?N0(DkRz>j2%qsryFY6@cx2;+wU5k8_t*kVT)UEo#|^VgYlDTdLJVn%iIRg)_Vck``vG5@1FeYY^94hw*&QJU7rKi0qif- zjXtzk+ml`n=z6XNO_t zU1&(+U=C0SOw%wPdxB}DKsi7j>byY1LhZO7d)kPy zsJD*wpq~ex19bo11)6r)4>W)KHV@NnBV@8H+FkEwj5Dk!^-2Y@fh548?VZ>sXmDXq zopS)Dlb>nK!?Y;?<}{0hMS-2BaT75SK7?=O`37(kz7 zyrSLb1H}OAYX$6p1u$te>rOpvfFp!9gO1VCE_!QQrj1%hs_Ai$A2*5r@JFuPU%jDSx>;f1|TE4lhJJ;d6Jnm6H`ViZ7 znYPzs%32&#-{*i00QKdbI@3RV!1qMwF1oReRso9u`YL^Ajz%xUo_@qWs>cud6Tx<- z-i#li?Ykex&Hugj6+XTLbzt9Sd$6u-FX}V}mAPXe!mK!?(2Y!0QGzwXg)i7c4;^2#xm;w)`j(S0CvEp?US)* zokPztP3IvW^Ds@{r-F{xK>IMAd)k1yE&`}0`^9qr{b(1!xOJA=RLmXeBa96V0Q(U2 zWo%ia;W6x=0ch(Tz<%H?+4{STos=!=O5fN9YyhasYJh&kI8qNR2be~^*8$X(afG^_ zMO&XuT}8ciqke3+EdX^}4^Ri{QVlEsDnsbSpnnapZRuBfA7Y!+K9qOp?DU~;t82IV zu@6wcWxy0*8juGR0^@;f?O5Ma_c;LdW*bxQRT>zp)&R8GMqmd(zy1&CFUny*rp?)> zsTci{?ZNuh0n~wT011E#NCotCrWFFoTDlW^f_5M;F%6*p^mUF6j3XNW`U}hV0Y}b$ zd!LbhNhmuWZ~(eqIiRT@>(28`=XvVNeGI@nHoywl0sTDlQQ!FheVpw}o9g<$0(vj- zHt_Cupflsd4uI`RJJa5Jo6^TZP&I`XcQ|-KY!wbU8pf*8{ZmT7Z5` z9@>GnZU)}_{_85@-Zs>gzM{8X9ccQ}9AF{9KC}#24X|AqGpXx#;B~+U90Is(-tM!hxwtP|@-Uu4@&0djy;ZO_=C>zofd8(>q94m;zoUNjfD5n#@fz5UY)|S;UG#G{&=$Z9SOFe$p8zmV89-ZcUk9+A z*8&>=w&!=KW2i5PSg{M`(YDV3v^n)&5!9u52sDk~|<4Ct)PbNrJZA>@yr>a-8(;+z0Oq0YRdPWH`eXF|4iM^Ml2P+%2+|Y>Vahd+fv7J z&^-4%@FGCoACR8x7oy&5Gy2pVpiILQ?CERNbtS;|WII#OZGi4;?|whqlVi5HE?|Av z0@P(1z`mCcurK9lpsv-x0)TD$2tb>#Z3*hV8KB;;0Bqy^fDbtI-_c+AChN2gSO!q1 zY`_M@11@bJi+zlSWbCOk^(_YKfyDsxQ(wl-4FKcG7JxBj7qAzAu4ki9orw%#SC;)8 zupD5!BmvaR0VDva+A;TbK!5h0&)-vDqn1v7=A(T|fjWTW4Skw1YYjmEfbM5fx3kS7 zVkqMW_2f8De+%tn&HtTxoh>~B`qAzLbzBGN{I)JADFH}H}=8RKp8L}U>sQn zFovuL*tX=MKQnH;3H(6x4AYOXvk-6r3xGwy5@3}E+JO4ff7!N-A3FfXj_;|yVfryX z-fubYmOP{}}I*06Sm=sB1Yu{l){?8tB8c z!9rje@F1`OXaK%vZ7Ih0{iqlF73;`&z8atpQg5Dn@B7szXBty^jV9*GyRc{MV1HtJ z)C1HHW0gqf`L_Y^pQ-Hc17ElLaa>pcP*1ic;|lv5b$t$?4>Feg0NRvw6muAkYa0Q! z8FecL%7HpyK0qDWrjGz?0X?RCk7FkNN5mG^QTNR?pr-(N8cMOJuG~)p76S_b+JU?T zeVVq}0r4$7z>i*sjQ^$aA9Q#%S zj4Rau+mXkNn>_aeZAYQsZq%Ri7y2aoS{cB8NIe--*p}3l@nkK)K1RLSzUaGW>L>pV zK0dE5+J^O|9xfmoNC2h*Y)@h#z&J7|1Uz2!J=YKYO01W#U08SON8M~dvUbcg(lLNl z+uN~^1>(Qo`sqF+#tZt}GJx$!UnJ;@&jB3cwgbC=82adX>HC0w3!po{u^LT%ZCaWcdjiKl6#ax>Qa8qq zwZJlfeXSFIDEf4+XSez-f_|OQIo}WEIH2D;=(Gx`1IhsQH?GCwJ83@@UAn7hKtImU zs2}HHPJn%m-=6sYi+*fB&ZUb1wjJY$5rB@}+2x0l7HB_?-5k%^cKjxj9y3kfzgUSE z^MhN<83FC(y!XHOx3&*+&ii1P)9}u) z>Ra~=bFSVtZ2jsD!&VnQF|2yWgTvPQmk(>HT{=wJws2VS`BlR#Yi=L5`--Ar_JyN{ z**Cd{?fz@>Fw31+4=ZlDe3+%xHca__^st7vqK2)$?qAt0+ds&zcD<9`vSv@V^7gju zmNz$KS1)}c+u8PDc6HQ>Z2S79+11AvW;Ya7Wj7qVJ=u59Jw$nKl^8KPYh{8vD>rsX)_Vu8&QhFLWW6`+ zqO9D1MrXZuW$&!1Z~QBB<>(JHS2n$qso3{suFQQob85y5nNvS~B2yXvQ0CO)6`50w z^_j0-cVFhzlU123EAGggdbB9>wO@?RoI1mu`P#%GnXmQjpQ)5xk$L#ei!zs9WXW7Q zqIc$77oBq7v;0GM;W;htl@s>5e|g`_?zirG!F^BclkOAuJ>)L*u5fSYU+JlUXw}_B~OYVQCwk@f%xa zhB@-OjM;1ZXW$-A#xBD~V zV*1C8Po^7eYto;xu1w$lM1A^m{`=A|yY$}lecqYr8~$0G{`oay(jOX~ng0KhuS>5x z&_DgM1V{R)xQo-p})Vrb*SODhle`$>>HYLWc$###utbF?dGS3Hm+SWbk3@kL$A2{{-Mi9EkdlR z9y)#d7C3!?$hRKdE+O)+@i;xOK{78>{YY*!Y;sztMWxryJiG&}UQe z`X6s9O&hT3zKh+P2G5$XDR%yxO~1=fH=Xm&?>D`g@Z_dVW4CO&ywtbp%Ehgl4&Tyi z^T7ws+njam^38YMn7H{*@3}TVy?ET_K`FOw9(3&9%?~#$-u$D_e!CfeYP!;4p5d4g zq5djn-u5K?A77Byj(AG2Nj5o`Y8MjeWBwG3}cgc2D^l7IRU ze*!$;VXWO-e!;jG_$NRU8`Lj9dA!JjMDaJ^x7J^b)E@(s6Z})D5%SLjDLfl0;~pG; zQyKP7G8X(BGJYy#)SPgPDd68TPa5|E|M~@La_W=EVKZmV2~(5HVfzFAlJ6$eT~T{` zG93qcYkv^<1OHC{NB$2E_QDy(|Iwi@ngw+*#v#nxOzG0n2V9OkAjg{>q5f^(y9e_f z@t#aO%;iL?6MvPO#VXC>*Y~ks2$n}uh;QfHKNB)3L~ZlTjq!=1e6OA^kF1W!7uN)J zat`{uG2$;hI}iHCcrs%T`ou|3re%yEkY?3VZ205zd7exoc7-+Dtk>6SW*Hx62*Le$*u8ohqAbHFbm~!`FyBg)7>9E=O|Z z5h(1eX&dLk!9ibi-3@5^!~?Y*(M$Yr0G!PBnuo6V{0scy_C3*0?MZ9^qm#@yl?)qO zqMzEzHbqi4l2WOp>YQU}(tPG<%2xj;nvRWnnw|nJcgi$Sg$`S^mw%fFQd1$$>W3%# zZY@(A)i0x;a72R6GXt4XA>I2^`cAJbVn{;0NaF#pkR%X2yGhy3rf{8UL(l#0ty zcZ=ams$rqhhDK2cYT-=T3esA+B&F2hie9R+g3wd_Qgv1uc*?FeMnCm(^i%(04lvm( z3sh9@WxZ;eRla%kY(8gsu!iTeT5dz5;Y+P%u9Ty5>ycr_XF+QufPkIuab)l61L*u`H^Pm{fD-@9}?xR6V8 z*K&uWYac~M*P)#ueNG)=%}9BNQa!E}?Uj!lbisQ?3!nz6@M4FW7o%p|Mvodds;0r= zk8#Mq#y-RB$&~(Fv(4toG$$VL%D>MpPpf0iHCqw5jWu7HJ+AZGD-Y|Hk6yyRS%YF6 z%?(sT>rkk>4`GVIN~^yJOwA3x^TDpX)AHH2UU&C7=<|z^a{NL)`KJi^N`*;3;ct+k z0cs}he0z$+H6DHIps#4+gqv%&IkwgZwnRuR0;1@ON}-@`!0(NM8iU`lfK?n9h_s3LEf#4U z1x5o=%3}P=9Q;F5BSjkj6jF|${ujT+fK_=OzcR;WP%_6ZP%_6}P%_8cfwS*`Dh8}d zJAQ`=suye}slEZK3RE`EMkzI*q#hnnQr=QfZgKX{pk%omWTb8{gDMu1_kywrz5@a3 zb5OiIiBfLGn9K{BC}lRNR6*SXYKWj}K@AqvQc$#Ol;Q^^bNnADnd3Mpnd4JXGDim} znPZMY&oLjA%&{1h%&`oV%<)H1GDi&JuC!@9D5+a2C~4DlP|^k?0%ym7Dn|XR%I$$P z6;z2x`zZ`KH8{T{g#!_m&9ADMX*H0e-eu91!{Rl>on-cc~R^V>OC7 zEzWt{TfjAMD}QU+OdfZ;r=l&ot^@&7t=jMX^ZvGuj=%B`L3)?ikv3|qXxOpiG^ zuufymWbF#t&}3>Kk8y>XYpLBiw~tzNWCK?2T(}Z&w|XjUDXq~jfwdee~Y(r)kyN%$JIG4t3NSy9wadW_n3 zMmZ#t$XDB;?yibV?0`}!U(AhEzeqV%6{&t+yBCRjQ}!TbPs+zti76jd4N!BB!tedY zXAL`it3>GV)`^|o`+KS9c+Ag2QfA7>m9K#p6Xj(1W^~&UsCY4D+@i$|)(09=FX?1@Ai%z2sE{lbWiN{i3}?!I1bF zE*vJb2kh4D_WdUfhkA8mIcQPaP}K_)f442A5w6Dir?ggOGCWirfgw{7EBwa4c#W@U zP7=4nYkbwWs+Q5%TPJow^T4Ekp=D^**2;#Any-?fb97x4ObTJwiKuf@t+IHHThs#G z@8Whe9`5C>`yV=*-}sF0qM*PCkMWtzl+R)Bsy20kNegY8P4L!GOG<}2BX^RH)KJw| zjaIEInv554LHqb+DQ-(;U$wVtUfyKvE0X%E7pmr!sHJM0?=kjO3)&H6(&wF`08asw zx`%#pVd73tZo8Va(mU4Vj|_|G<>#c;Y%$h+VX1r%EH7Lu>kQI=2?|PD?)}{nBz4I& ztmYrc)bCzq%3$#Q%7iZNpJ@d4gJmUzxTdK=pfbabP-$$T$ zrDj$7V^G5%MFw?EfSLkI)_xHvsqb$=$$8sqP;yT72q?EGtqGKzr|tq(EaV*oHA|d5 z21?Gy{s~Iv{Q}fX!FLLj%yE%H=erb?`jVe8-w6q8QHi67ARG;yr_0>|7OPO;+;#x^XN7_pLP8XLD~GiPajV;_bR zPMUhD#y%b~U#d7JRt0%^#%x#d2V10a4!lZw6V~#&mn0`-A+p}rWHDzPf3WG2=%G?l zVgnXCOg`g0jxhehdF_?|3|t>FhmAkj;7Vd+#d<4T<}_icX2H`qRI@C#4dv&^Yi17Z zS=LU+h~r`BO=FReF(&ZNs! z4p59c^6V1<3WUGViPvdsSwW{x^W?Xz2M`~+pzU+2?VN`p?F*Lh%Vv4`2Pu#2C%0J-p1FOIjZr;jk zL^A+a#a1kSd41Dc%*IyYSX|$XQr)I8Se;Jr8vjflT;6CGH)1fgsJUjfSxvXi=zyD> zGsca|lM`L6i`0HL_bQ&=7xzZoTWS+V7f*%7Z;bHSIqEbR{e_Y3YJp|Ar@&HynTJWu zHmXjWdVe*F89hT8HzrKfSc=*j_p17)5P|%|{o~s!K1L}iaqswhhfJty+F~nvZ}=I+ z9FM|8AQFqkxh4!RBh*nw|AP6v^zpeaZTA!s zl#Fc8f+_~AyaKE_ktA*8jj2VNqHYbb(N^_j*b($Lc&b`-6Xu%KX3qqlS1yN!a2A+6 zC9Pf~T_MEe@?uc_!gA^^KW5#Lp4<~n?ly926Nx7GNk$fbfkhv=87(lm#t4FBx5bxh z!Gu}Pbo~X*{(>WZceCGp1nK@QI@=}wM*pQv!XvTFYlDtWBAC>)MMN(V-FJ)nR^0Zu zH*tlAhS}~NflJ)|kQ=w%w+74`C1wrDXcMC2KQMVwZm#3FbrqN3hL3 z>YreVt`*Z7w^=BM1u&~LoY=NRHQUgR^@;9ApXoR68c-#Fjr=!X^DSAo|K9rI6U^X8OmqFruBcmU`9hM7N2qo50zc z+YGMgmvZVOy~cWUOWIoz)lJzF?OiW)!sH#YtZ@ZqDCIXU^f{IYEtdL?HPF!KP(}S0 z>xwKsi;6%C=n|rcDMS$!(@qO2t=G4%h$`Vy=#{Dr*)XsXDwEqzbM5TWT5fAv$}9fD zMZ6y&THe32a>qfRIw7X^0GfM=5d)FBHL+ub6dJch-M!~abxYh6u_Y4#)8u6VwSUKI1^Y(dKhpq)tEz+#5uzPQW2} zO1Gn$Ywhe4hhCxMANmKx>H2+yhDTz|3)%?pk9mQ`G4{DF>V)R3nqx+W&VY^?o?NrX zZShQKj$XvIhvNpn`=pv1y2juoj53>3G|@K)oy zk;e^cK@7AK+W8#es!>Ow8i}*28oYOc1(y_A(944gyaH#)K%)e8OnDoXj;@ zi>hSb^{l@z8hl#%g|yp?0lU3OyJdw4`J(c5_B?M%Londib3B$2pK~TjaS>5cV*=ES z096Jm0fe%;@GuHyP*g_Ov=S)|s-U@*~`9@QpTU%>kE6$ECL=v7z?B+#ji9 zElxPOYkoWKv=!dhUiqPl#jCNVyixG;aid0$)oyxX>=+lA130`TC(&@Y3gi}Sw|TJr zTEME*;dg_eMsdbc>9BHoXH+k(J>aiyg~5GO9I?39W5o?QbM%rI!CHXHkzJi>^=3x+ zjZdrje^yW<-1)6aQhnZ>T4hK-ahuJaiJ>XOXI(GVIR{fOJA29c6x;!r zvy6hx-`n?7oKfD+al~Ru8ms!$m-n>c)?Mt|unlfK#cFJ7t02@JDX&%yf*>pAYd=Qm zF+SH)lh680U{S;$^NfgexHV?@6pJ;z(o$Zn+{-&pRI?Atngc|Mt6RxNVmjgglJ z>Nu-9GDhuPv(2pjXwO%1`{MS9xzOv#S%9XBQD?^ZF#u=L!E9>IdZQY%9;(_5uc}4H zJzw~4w#U7u>)Tt+;7wthH$5Vy@!mX;7PwFhJtAG)()AmEqtD*t6_@bEx>up_@e=4rJz*R*_UZ|{hR zlpWD^NpvoCTr4VL^SkQX)!q~eQ4|67dKA$jJd#&^4S-cyir>EiQNkZ3#rS|Eh3hHw zNrPe%wr8&uR~t1atQhCed%K@Yw}(U^42R8$JF)(_*E8W{ZG)$xHF`-sr8Pe&rq3W1#5nQOZB@EBPi3 zDoFVGqlrWBu|An~`0nzdD_3|LaZ=&>BYQ+|#VmTnRzah3rm^C(I9B~-jA~rCB5sR_ zvSvIxV1E0TCf|}d=PJrXL~>)O4FY%50waX zZeKMJ`dM*4$(#C@xTC6ZKzKGA$_Qp_q2Hr&d_u+Mta;g}-cOsb|M9^U8+D1U>kmf) zgQMu?i4$tJ*|b);0$RTXSQV}WNs9i_EYkjk-@}5!k1`zX5QTj&<$r`fya`&2+Q#Oe z@H{#Y=2nsx9pasqiW_CmI3MSX=qh;51M71+4ild1_;M=`{4I$8MmdM+%5_ZRVisKl zu2{bGw=lDj7wqSC7Rz%Kin_?cFVu6gJW+T+f;iMqQ}EV$YADy=e-xmo-5dPDhH0?a zXrZsuet@Vz`8XCV71hhqt0ELX)Ob&3s808s_jL-udYTD3Yu~AN^`yuN$yX)P^#1TRjEl$~s=;7PMzzNRySvnjtP zb{w~0{X2t?wDoxbt)pPspmA&BPO;NRSGn?@iL>1Fwq}`O>!{<6stFfN>a*Q9-tXJl z`fgK-57U+j?N!roQSLT*t%)hS=Ni@4xKD(k`@zs&^9qmoJ|~B+?UkQ)-yoNvX|epe z2g@m5^ZjTVwo8GTO){#T&4CG#$#5veSGh859h6ghX~D^$q}@1+mUiQs=aDu%k&Dc{ z(8989GG<|w2=?@}a4@<#O1i)p}* zAt?rH;%&Ygk11WpdEx1^-RN2t$oGFcd*TQzO1heI!ukr-XBzDvuh+dLP8MusN zeIVLSzfQp1m%RF%TReJ)Yr6rMYhYH~xuP&RTpbm~92<9kv97t(SL(1FAISPQFE_zL zA|6Gnt6^Bx{IoVwVU=tf$0!6Xi@Z3aDX1f>CuS;Nv0Bk}lQGC({sKiYHaoO69YZVR z#~NNW>_exL_K)%4bo7!h#Y2=SZ&k&Ml_YbVFYZfkQoY}JNte3&FOdcwS#emKNTz&M z^*fY;HAyRG(%TJNyykgWUTRVYVs;9r%5F0L1!^c2A0E3+RO{F@?6j_NJ5GEGM2Rc7 zv7qD=eR96UY0qeJ_5x6n?=n!5Z#<|rk>fT{at_6(?Ihp903TR}LUW_K1FdbGcNh!Z zFU`Xwt$HYo#gWjsl@|xfrToE$jAEl~8H?%BQ{=^mip6d#77CJ@@PIYhf|2xY1CDa- zSSaho=}X)mh_}&YVeC?Mk(k63#A1R}liE+IfY;QdKBGi0xRBWp)$!D8q?*)EO|_s! zlh81QoX~iae&@A5013rvfdh&0WHHiza4;ULFeo5jUGPjhs&dfyvZ&F5XOf`S!~-=p|_o zg$BvT+3~o?b!{@j^^bXSSs6Eoz;mokA1GFopAU@ig zz-W^1$gcbuR^Jh#G1CkNa&sE@`Pn*21YnS;vYJM4xxy{U;_ z<3Jow8$C|7n$TkCX`^v&PM&J)hl6CK%KL&?0FhmOTi_8YIU55P;}bi#>u!s`w}=@q z3#?~BcSUnU!C1(2;!+V&3~KUX+m)WJ8Nd}?+l%u@n3X*>B9Q-g-+1#8d>!pJVR zNA!|q_=Ry3z{hw2-sY7uvd9O6e+9ud)uOuLQRm_EaSSHB*_F9SjYmwy`jyl{53W*y zK;ki-ramJk)38gEG39kQK^|mUIdVkT{R!6xS~Nm7yJ{Y2 z*p6{APmLO_&x~>$Nj2Ln$5t`Yp*@?7ybe>EjDxs4R*PgUBJoaMUm!|p2vC>96Sxc( zr3`?-or@#f1q3A{O*$wUk+MO_IqO$}vj+4QdG;Lk8zIFGN=B}$LCq3rTR<`NSh=KT zhT4{~{z$klCm$i#!o4?xN5RzNGdcAT(~%8YT0>lG#pP&ilW=>p|1h0AoWonLbkv-R zm{@U{Km6I93O>wpng62WSNS7+mt%h!ijD}5XlaPxQDix8lnnlhwfZ&6D`>r}XzkwN zML6B!zj*6GU#Ge7ZBRhQ_ay;JtlB|~C}j)M41xl|tpTt<&>^3U*vk}bM(ybZTCBH% znKG`{xU6eS+?n#Zx;^?&jd4xGR;a!W4C;w*$GxrY`F!scZ(i|6+}3mVBZVoU5t9Rb$y1*bmMVZE-%RV!$e%S1JG%r6h`NpI9+{5Gi0pyYv#*qE{_2j>nUkgzmQKIr&Y81rnLhjKf&B;dPvCK3+3dUe zPnH=%ew~wN-d@&!`jq@D5)|HPH7Nb3%qp2&ey0%5at#sjA^ei;Kc(cBid!9Hc!cf< zo`v#6$Z!8ClgcM)$80D=#QGw6IOt0A{{A&h z(ObD|S-rs-URG3>vM^f;DeJ?g_g@c|^&44~ViIMAYH>~%$)+xnd2b-7g`?#8=Yx_T z)Fk)mBAII*MAXA#S5IvUmUT#G63;}2=b~2_BG@9_ ze&zqXHkj)}nJDhFgy-sqGr_V3sEe-*=8B4t*~k-~i+w0q)*r4MjKxJ=FV6V6ktaOY zc}NMCl@PZOmlt|2K9|XjJmI+*mV#w@|My|6mFc;Dq2(e^crM1hV6H#> zbNx}vMV|0ne7-4Y)t1_KzYOMjUdu(E@LU&%l~uj#?FWOowrjb_15Kxv&Ya1iQf&54 za(;}|pq=*|vKV$Gc#z`n2XdgSkG_a*-!I7Z*u`nnwMS?`7$p&{reK zgE|*YEuUEmQfzk0kz$dR-=R={o7Vh!m~PuxBjL!4g2 zSz4~avaFD(g-(bX>Ji}3@2=b=^CMZQ(sGdp{v6_&$s$*%#Rhk=*bu?99=`~rNljST)mrb)N+w0ygt7WxkBxe+NC~21y3>RLwV26Jq+i?f!KCw zl84Irg!qON=M52dFw#b*zSsRZn9HZ-av~S%6Vl3QBA0GeNB+s$pcZ^@gBy9mbEP9C z*cLl}e`-=Nmr*kbdBSsLh+MkGem~|X2+z93_>M9+@`PK=g_Q6Xbat_rTkzzGyoxd| zy*F+vM&O7W-+AWdR_vW5Gn9r)c6X7SC3yH8ImL{Os7eS*{)HwvOGw6PWxST6bSW!a z$O&!ttS)77^}!Ia8^5&5EpKsjM!{m^d)VBDL2~$5FdV7jS`6zV`3AwW8o!i$?ME-% z9+b@I1i9VNMRE>O!zJI)MKVG^cxWF+zuT|vSP+!FNRylk$ru@bIeX@;axjTav_**b zjzB8pXlH+%GTA5P6iq4%WE;_?h9gC;P^*sUQbWqbIskuxF_{e^z3D-%hIyifp^Lu$1k_M z%lPhAggj6VYq`dB(LEm=;jJ^Ki|z%2rxl9-52z{qiZSKaB_G!$7f3Ba>N8g4YQZmA z2E05FVOr1ixt43JtWSvU<3uh!lC0k{<@Z6|O>_=yN5v9il*IFHnY447h<}k_xmQI;nR670k z>E$I;x;v*7mCwARgkD-k_JwloIF)O#`%FIw>BuSvRgaA!Fs;d&=do!YHj)T7&UU4Q+gUhkxVG6k(# zQeIIe+OcSI#jHC^*pkBJlM|Cf+4?bx4l7$vXA!zO6so5uP7SYm(m-is{d`hFVpyGn z>4U;*t*6Th2Y>bSq@-(y(AYQ@ODdC!%4W^H1ub{`^gEPd z&^hUDlS@k`&4Lgd&MLWm=A9+l!i7k=W9IbP!qJtYTPDrAtw(-x^IGX2kn$Fw0McXK1zm`>rHEit3?4W+5fb$5(5~U0iyBColWs3#4W^V# zo^+Q?`DMkVJIbfu4U^5RC@U=~x*hi68L^08bPHCXZOt z?SS>|EJ=*mK?}pKv#>D6qIx`|S2|JiMy03%fr1%jWn~?)Xd&xbI&=2y(vsOhTLwKy zP(g9<@2Nws4Mu`8+-bn=hYAEgU0B)7>31L|O`D2lol-HmeEQ5gg88S&`y$$}G9W4W z8hgk#aL~ZSfrG9YJaBMGB1rVa!Gn=DByos#qPR~EUi$p!z7g3EV6d<<>|+bP^TA_Y zf7g)+-TGMcYb;I`#HQkRgGTE+r(#JDy#vB@8<2tWZq^2%SLgoXhwcV=2aPJYg? z^y@CiPeyM3<@T_|kvXmrX}Rt(m)ki?-5|b+gTHrhx?4WKntn&(pu(}zfyR_iDxW^N zXmkmB;OvsZStYklpItuduKqJ`nUSoVXW`h_OWb06=yEd($iL#U-072N&73`RYPmgj z^i}qeW#t&7?w)?ft@aEw7;ZfUmK(v|&BjGyy!wFO9|?*>EvE=kq7*Kl%U25e3W^QD za-;r@+gbr#CPP4AJ6pH4*tFqWXrpp6V~Ak0vMIwi>Q24LBc~SBU*BX37q@7cAP*NX z^iA^cl0x5P$|U^|dzmsvO9{%E--YLau#|N;DnigMD?^(WGNGtsP8lu@Zb4MR z{Y3`X+0&;~l#oRu2X$i6k_UF5+(n>RtEM{$LVNVr_49$4$|Q*l z?B`dDety;E_y)CRg6{fx43|Gbw{H6ReK?=piLbkUUJSlBz&AjfU}A|!VLuPO&Onl4 z2O@B*?K0kOBMsOsdBve?I83MG#DOOzgwJU~d zjpcSHuNCS2z!PyUxnvjZN#0%H@o0QK$)g^>(RhSF{PZO6A@Du>HS+Apzv&F+9R%M8 zUn9?nihmBCYk7f&jUlP0`aK1nmo&bf^lib3o#1(t@eUi!E#!qy_n}_@Zz;mz0#~{&@9=`$4LmFRC^6U`s1bAL!EXT$$Bjk1RKRW~* z2ao(#n+#4pm3t{-;{a{o?Wx>ilrsc8D>S~->G1@3Hhqn}-6*IDJP%v|!Pr=CckRK@ z{r@x`@^N!o61r`Vhr##f5P9A8qdZjnCGbS!il1Ac+>mQsrn4C?0?$<;eBH_eUm|#F zLil>Jvll#n2;u8ao(1*$U-0~ew*j#+#PwvCe`!2|5kJB%-S~3^m(oKv;m@7?B@gG% z0pE=p@9En2cJNebd_DP#6Y}l@Pg4kAPj=Y@p2H!0-Pxrc1sw;^J-EZf?R5293Z6e{ zd_C2#7$+VD&pCD>F4&K{@q?d%=UR=gCwc2}A`LtrU8aaF&@a1@7kxRN!UeeL^1`N= zXE5)~(&nAce}CRNJK?*Vb4umD-7mX-91taf@*qKR7+}|wGgkKXC~>2Rw+8r_j=X&y zr8q#zys@BU-gr(t{rZFp}t@7{qy07+BeJ0-GG7A0+)vTcyFjU5%R?0 z#n7B_&Z=A)plC&z<_u8uESW~%ybQ34Pc6u_>cH700qTzd>QPXXZdH7NG!V*hfNq4( zSPA!{U+bT-s@+-M%em)R#aCOAD14fG;dI!u{1DD_)jc)uMi{n$|I?7CMVW(rfSaC^ z_25gC;??=Y1JkS+&1OWPiTT_Mti|_b__l^)23#OJ2KID_6FBrl1*lBDofbQJZqh{s7EM?+ufeUc50v>4PuR=~~2{2h>1^Rjp& zC#K>Eq*zr{Y?Li!OV#D_n-AV4%sHfA)sMt0OIs^Xs@vsfrA=G)FGk^85_(eLttwu! zTn*r}c=%-$vx;aXsf<7xZ~Dlzn*-Ec0jefI{W?HB0!sQyb0F|#Cr~DY#?~}g@c^*{rgfse zx?A|%Kb+-2rjbu73)9GNa)rFUB@G5A^IB`6m@?XvY4eOQNl(g*Q5lcT!j&hl_#Eo+ z%My5D@ekzH0?~*VXzejRDzv(WrdjcM2R=W+*C_TyKlK(qPE4|i`P0-k6;iEhan^zt zq6!zc<2!J0Zks#hXyqSt5442zMv4p2D6CORqNiZ7I7wRru)cetfHT zOI!pVwqLRbny@jd@BytOUROfLiqB8s!&P0s9@C7Mwmb0Mv$;RT7q0a066NCiRLyv$ zFz~e#_%6Om%de#7;=5h#tfiV}VnNeT5I!k|$g&e((T-liwamm0e4!TaJJ#;37>U=^ zP{Pi+{NSrM9o-CyWLxC;&PdgU4-h&i123Zvhkrb)q7NGJVbo`9Qls&@mWk)wR=y{` zN#*C1_G{m8;LEfxvmQI5pTaAvxhGQGN20yYG9}mA@u)OYoJ4 z(a-~3aI|X0`$_ZjMs*aRpID$q`6PZKEZ6G9i$weYL^GUvf{&l@MXm95h>8<R&^g-Hvv7^%2&g@NtT+_zDoI!+7HUFKx=o*{RxcrbHA%r!G|aL z@;frJz)WM3c`_Y;Jjj=5I#0@dI*F7`PVd991nQr_@iTzLYsBD6wo z#Xc~{>*E;qi4FMM38v5x^B79ytT{^Agx`sP?2G5aS2*67l=DRb`zGdzthIclWQ7`? z_}S-QKpAuc1cq{lbxeUb-U~iO^=WToQ?XHba&)F@HQTI)-G)zZU|gs;FyZDRb<4yX zw=(w0S3x*xjs@hnI!aLZ5g$6G^Xi|3WQ{rc@nux;$9R6OrkiU&P@S>k_|*fwb)%PT z1EX4I=9_EDs?(&tj*{bPa@5O3WS z>0;`2lTl5#)a>j)d^rG>ZAep~ktKS`|ME0m5p4W>B)+?bchS_{YMNP{W2zad%*{YT zjC=_h)xQvBCi{(%K06}#F#QeWiVtck9hQ#rbA9-#r_{X<-mDrC&?UsSbQ%^G!%gihk;E2ywL^c#ZetrG5JMYj}~1@}c%H|4r@qR*g2{vTub~ zs*UhU`__6s7JnmZ9z{jO_6AZ+pdvLdq;K?A=AGapQ)ARs4*rn{xZ}C%7!ETI>NrU4 zhamyhOHk8{7=SAsR*VBLR3oQ%qaztU4ISdu-Td~bOs#YzfATmonAHrpGHh>)Ua}hn z7vLgoFaAghNV$X{IV*s_Sm%}^As-3iP5hLPIJz5OoNM>yzi5npil6a_ zAA&z=6H^swh}4?=DC}ib|3B8g1u&-L`+sAX1Yx5V!D6upi8duA?B1CmB1j`hJX((+ z2!dckknAE-*0m`ueQNbveQVK&7Hw6$AN4M>_3jg?SG|Ie|L4rTo9v48`}=$>(^@-J4xbq0HL&TC_Cd}7HkWE}xSIF3B#BPU_{JhDJeXJ#=}z#|xeCQP3=PN?0M zdjzRO>ho$52n|438T15gg#geDg9M@b;IInwIFY#}AZ$?)_$8KCV^4BL2&NnjZk2Tn z+`1~RK;>|?!JS`vlo|&_u@a#12uDOKQ$#QR-hCdXh-ldXQtAV^zzi~E5QsCDQB+P; z2U(N~v?m~YCf7y-MjbImuf&nR5*qTl%xaC3)r|k-0p$I z;KYV>amI!KCdkWn7OgN9{w5KwNqDOW^Wlo$Q>f_)!ml%25pcoi2wcjD`U+gi8UO*r zSmPNSr5s`X-*Wa-f%)HY_EP{OBpHSQu$l(e+5RM2+K^+Nr?L6Ppxb8Mgk-IOC_fDT zsoluK5CsiGKY|#HRwr3_l|G~v3Os^hIEtiyis2}bCGmekx)p|{asNPhnhwJQ$k8a* z9vCVtbl^4_a5HEn(ZCpBh;IwV(cZN?UcZAQwDPt5KPq|H8tN$~`2e~!dP-#bEudQ? zlGBuRm>ZwS+Sl(q5DRh>jlsVl7_owBR0{@S7-&I-c*OE(@JnJ(jeU&hD}I0x%WJap zK}H6`9wquPB6?-kxoB?#yb-c)Ar8?C=*UN*BMG{TWq;Oj%-fa|S?^Is$hx9E-1V|b z_+bTalo5Unq!~%Ka-bK?CgKhj)7S2-<7g&gW{pwu6UZbaMe~ZO|5)<%i(3(KgQ{sp zj}3WVC1A)bJw~TUkV30ZgMfxXMMJC#FNPa6sJC?$8rByo}~XXER}7#F)}qw1Yq9EnNxF zfe0_#o4E{cQD(FUsfR|%wik+>PiyyDc4S=z8nU%zLIJJde5e(z85{A1iBdoRO+-Ry zG!>slbuh{p^IV8C-j8_tNDnuUhEL4dZp4ZcqlfKzz(*k15V|Y$1biZpMJuug6A3UF zh75&yOsSj*y)K`2>uMG>gP22msCPk^V%VL|xQvRS(TtGLBprsV^`rqM<9qlKsD3IalCs-oqUo~n?z z-HgguT4mj`?9$I~f%tL^U9u_KpHMzQUcd)G8uMVsN1t~Izld!@O^}?3c$ueBLofwM z#(m2c^5(nZib^h{7$OOXNa;e zCJL_>FBm*LBzHIAE%TxIgdWAmTakofYyC|4i)zw*|F3E{%Vg_4;X{uO*l>v89}lNf z4f`rfS9B154j>8o*k?bLl%+*;IX$$)=BtM74_{x*6&-uO21sJEUb%4+PAU&QSkN?KdMB;YTlxcPV! zu#70Sc=oBkwFPGSaH~G$)1raOH?7*`(xQ<7Jr@a4uYT&pipgbZ-B2;tL0S}w8yZv} zB`x}(g|_lgN$Cmk@$qg!+I2%(2q(zou~PH0v}pf^p1K;s<4qg&;Okq8y5&kiq8+VY zGX4_gnf-p*P=>j?ia8jVl~VLmeahEZeSwE4%>xo#E-l&{#UU>M5R7?IBV^D6Jw|mj z&`?_5$Mk44Ejx^f4?IeJfk#(k5sYuyiD~vNdxLWMp#>NYUI7`Q(H~7~QcN!4s%ll26?7&S@YcB zR%MvqQ!zIMX5Tt&CSuWCLyzy_tTk#ZfsQouyvFQK`+_2TZb+IXO1Zdnd9s_YTk zXju+(h=5rF9F))Ri!bd}Fb^NzZdBR`Xy4-r0cPL1ptXqQo#&8pm_cMnJsFs(PxWs9 z&APHYS5+!S)23XWL(5@qQw}rn+&J#1V$O2KU^v8wc{~NVr;^hQCgELWMaPp$;n@)78-{~Vp!8v*CSaJ-XF%^fl)R2rxzF|0$f0DN2!mLY9bZ@dM#%3?%Ty4+*+8-Y&`n3XCV4XlsT`y~IXDh!6H?+dQL&;ZEFAcH62&Gj9o{I395cUjUl2o{V zs^@WlnfY(5 z{T?tAX;pxS79t{lkM#3o_}3$j-|MNU95Vp7K!vTS946pd`hUdtIpFgD4Zb-@XdhsD z(<%TDrCU+{k^nQ>3+{3KEei1`17@ukTt)ac0%ngF+~e?>fbXaZ1E+W@!gm93T3VOj z`KS7;p~5JT6_>Xy;G{?J{ik}?&#HRXG5@We^|aIxI6X-d_Wz%@H6(FR4*X|LO_F0M zmjo#LM+2ZBEOv@!>1huMc1p4H^aFtAxG!VN3VsInb@%1d)HyZo>u2tI%-}*8dO`Rh zmV9jk(O~G#1g~8#RjqBi?$H=?cM|8C|3{tbJFD+fl!j@Rq%{~!Y2q)fDXWOBAX+0E zgnW?JS_VzB_)D%aa8bXkBJ{8oxS9A?;NZZcXpX@VMPKyL)J>0{CXhx4F_e`_ zDCgsLy(Y8=2`Bc@0`rUNv?xJVPY*FeUukBw)6r&)`y72yO+y~4sr(o0?Rq5WIonk! zb~j+A`cV31Z@4HiKf$kSG|k{9O@W2@B{B6^=6B%Ay**IgnczPMmMJz11%xu&WcU*xW6S%Z2rDSyM(8>^lS(1|mGj6+PdeJ>m>< zb@9t7YMR|jj+<|g4{i^T4)r48sP~sJo|HYyhAZAjBuk7^q zL7Md~A*Ah`t=KoGn%qVno^3c)MOF+k>`YlcE1Wm9FB&^;@dqf8Fs=3V}c$ zec!0mA#M2xmFb{Z{d{VVSbc5`stPK%*d4^qLnr#kg7#O5tt$3Ca;!@b{lj*j&QaH?|(I{T)JE;5Hr1^@pfvYRSg6`n3hvMlfsL zZsTi(f!N^0E|OWB?>6ShRY;|FO?PCVtL0D@=_9EZ#{{XG(YTfgxhBPI8Uty+MxXaG zvVp!D1~RIOjR@Mau}zh0V)JAVa!KQi=35j*V;}PRo%_mWYK-Y5Zq$h}Vh`Sv*Wl8; z(%yI&woGa%+OpVCI;=h6HZGyO?gs^$wFlkCMf$aDbL1X}l&iB{|;g z(HDg_b_h^~%W5ygCp5j)=rJL%hacoj&^Z$VoC$$)e26Dnpn7k#{16u|dk&D4)(J@k ziIxna?##B z0V1cww-Tg5w26WjpQ5kQFR&4DiHoDuOTGW|%e+B|-VN5nw?Wl&IHWC3?g7hkl1UwQMjY?m6jmADU>>0@3}P-E`E|dI!jLowf0e zeg(BEr9GY9a6_eTyr%SMOt7;XHn5>L;x*Wzbt8}pQM*CtSrhFlRNWsgdMatEW8PIR zk5~1qNx2(0ZF;ivu>DDpAEvb)I?O7yVQ5?h@DN-&6%(9297W zJI0?4z)f01ac|x=*+PU>Z|#H`D;6rk8RsdR-EXE+fpF|V1x2dcacObc zJ>f;p(Z%ZE8w2Ga8pTfH;+JP{%7(d=7Vf7hraNhLOQS5?vi?M17^ZLp?8eo8xEcs| z;5>T`*BC(WHqZ|mjn2SV5xJ-H*_#=EP!5vRI~kC_g#N1HD^#6hRE=+(F^~u1JcR+* z1#ZFA+!&QbS}*n*q+~rTScVF(Q};4p=;G2})b_@?fgZZ{dyrjdUOgLt`_^&cykVgW z8_P%R!4z|7z#cGvz(&J&KPsH|E?G_v6~oN zHU!|;vfHkOKYdbnI(lxrE&&?a7vR=7V@$wF8}q~n4GY1=!}`2=2*3!g-y9g+DLy1y z>x>W4Z#D#52ACbg=^$L-Yf7rXNR1amXC>N~5J>1=F&!NJ74!JeK>O3Uif8XpD5GDK z2biko_mFqHy7@VEi|DvSyxAv$09YlL{v$&CqthqAANs{A-9^8O!?~5ZqM38&svqyjRoJ*mZOsLf6E+iP-5(PE=9)371R2N6~ zpw``~{*0{KZ9Zqb3Sx(WnzRTe5Ay7bQ$ zhi;vFx5S~*Ot1U{{YZ*?1O3cB2zgIQ|NKAo)r&+W%kh*Kr**DE$T$gzBIp-)N2y5f z-P0{fM{N@DD7||;T-2uxLK}+47K7$}{2d@%yYTmUyj3(Ls^};D&f%{T<1e@rj;$A( zJw${i!KI8ABj8d(Nq`B4jFEq#61;?Y8+d6BU%*!qp7!~k(GHmr zT5j}<%!!9mhK3oX3?inu)J zj6n-540@NiJ12>>hK*PQ1d9n+KfeG_u3n_T6-1Fp6W2=G!e8P;&J4u0J?T19IKK)O z$&74R5kKVc11ve<5eAP)aWo4`C$5NvP=mxdEq4`pe}Pd})`?B9tmx=Ul#6i*XsKR# zOI5GDu+Z40kL6%?U6(;t!ppSE4`y8^76~bYC|c#>0z*pCpoJEZN4MONu^3>%C}9L9 zAat}+<#NYFxx0?8Qrbs~<-})-S;L;_3R_M^MP?}?bX35&x9uW<{)F0KDQGsAAs*~zI zQK4?>zlk|n#Qe{%vG9^@i~c-HeCyuKGV5DTH~Ls7VwriYiRhgM@k?Rf7S z3a;AcN(k`Si0>`lr*B+&fWOrCSznF%q^y5ae0nM?n7xGV#5I@ghx%$e)E04QETq;N zo|Xc`KB||%^Urz|{yvy}&A-#mA3X%)yFV-F*3Xk)0aQvU-IPyJK81Q{R8}6Uv41uQ zUloA9JAlxAg`amFk~ms1TZ%5EdCTSBtgH@)!iOHx!|`n$8sB{}SEPqS+X9sH7T>Jy zQigdFp~a(INKsxVs=Nk^H*Jt4-8c1$bakllsAh9F-ohfDN=VOa!n4&R3lJ+(BVmCIeH;$0h0 z0M0k9TIE`q=vpz%OYNOdxZ_A!THnBj9z~J!n>y=?X1Rr`x zf5w-7>cZC-bDeT|1|q;D<1f+d(SYfz%P<$hhn{-nFbBie7jwOGm=!ITWI$4$$F03L zybSY0_|Q|o9A-uDg<956KoHEMy{REWuy>Ckk6QO^+{+8fpzEp88VbzijR_Oda1Uw$ zQ9i+Yq{=4vb>V)<$^ki5#bHjL%+OzTvwp9z2IY4*+XISOWB>acyg z5#-yr9A@H*d@(mJhuI`x<{)?YuW4{RZi$Ln?1;k)j|u;LX`?B8eKDKLVQwa1qVSh6 zzqW8~ga>m9Z1lkkPcvZlt&QgJ^~Kz*9A>kCG2t&gA6Bz3QZUn3Z%Pc0qW9w6Q(C~+ z7js2gE+#^N=l7X5uMvs(XnOwdS}xNOgG|{@9${b{a-41I z=*Q@dkWvQ~^O02Hn>Koq23GYtMR+Mcm`b%DBE5aftY<#m;puQC0%<=q*Ia}3%-1^L z<}szc!Sa;d8%ADXco);C;{7~E`vFv`+3*Nl)MKn?627j)&3HYJv#J-4@JWDsTZJWh ztZ4V|BfxC%f_vO<;yXaF6)+=-yTL5(O8b>pYoRpn1w1_MfkR$L0$q(zYqmqX}di} z+hYu1rmJuj;X4PKngf{R_WvHA4KVXnxQg&a0ZkrY4ybTid{@*Se*vcW-{3PLeiclX zE%DMr=~jd<957K{aF3&xB|y*%Fh4&d(3SP`$IyKs#y#(+BDxO(oJocKr+R4vnDHvy zKed}3FnN#Q`%kqCda2q4-TrIs0=igjjP3tVwSYzsDk)I`ji@K}d!laWp5gS1&mT^F zIh5bftry=ADCp!$wEfsX?xmCa1>n5(TyfyoPGH171Z4 zy|5dNGj7;COd2S6)j{?nwA~@}h2TSLi zL#A@>Rfk3>L(OePdi+%H^ND~sV28_8r< z!L2FqBUu~KfV&C4nz|dhjF%}z?R^o)`kDCHh2xZnCp;;(p$|pR_yNwaoClTki$jq? z{d|%{=a#^74}MV#5w3_YWi2&rCu8apbS$FtK zj5|tK(5u)T6_B$fASXYdpjythfSjwaSrZU{CLh`Cb<^Fos35lZ%tZ(U{oDdz=iS4LPZwltpzKkdQ2A(&&ZQG&a|J4;D$rg>u0jwhjAD@TftI$_jatZ9 zDXSEKPknA5+Kb-N0)?D2vvO?C?uXFg@UwM7Op`04L_VOsfzyuS46j;!u-f4YT%_IM zGJGNKG!B-Z)*f@F7i+g^_xDlk*nuiN(r;C6N>#lTY0$V)SrwC-;HH)yf_x=YXH89# zFQ7~|{n|njo7!?ulD(7!bdex{YV>)Z;IAugqQ+%h!0>x%MojgD8Xy_8|x*lG4(R!<1mKaM96AGo5cWXUs!98}u&pi@Slg_45~E zB!j}iNl-_kK5r_%)a?VLjtHr=-JpXbg-VCChJdn6O1V(HHG~t$sa%5~;6^xby8^$} z=UqUZx^#=Q`&=+Vh7k^KSJ-A3_S#mM=TQBCLQ$o{iU75@3lix0=7k6$+JsN6E8-Ox z`j`)&(4z>N1BV#smI)~Mtq>0QC6~g{&Z1(eCOv2C1LR5+{qQB|5aGUiTtM%RDyBLF zffIS}3@GSX3>ydmM0N0o)q#MVT>+r?sN#aEAo`xg2obH6QwZyL1ZM!85npf`;S586 z(A9<`ydb{V4YPYSg=aqG_ErRl&v184aX}z8Su&tuUjk-b`Uqe>lB!goclS`kgGG1* zNMRe`q6>b(-zccLMHCRi*n$*u#A!FaBMZ7~+}$MO>pnI{qdojMOxPu%An5j!{ zgCo}65U74f!UpQqTLUN{+8kBztGgjQg9^5j#~wgN2@fMsh{%WvA|#l&(*?ax7of0l z`rIFA%mtxfE~CT8P~S3VqEfR!0Vx1AY29$80+!5KKu<K`7{R{slFF3Tkq2x63A&kx5ChSo?Ed)rEX0rt$$-ExGVGaNmm z7j(VQQaN}1?1RvJWPc<}HR9*$Qi2{5iRh_7Xx8FjI?%KLxDEB0<%)QVN+RzH-7kmv zIYYENdu7}vV8RDf=2(iAv0LnMrOMmx6yV#0fDo7<%d3l_0Ez1J{(=KNnYuJc2g8Vh z6|=u9dR?(o4T&~qg<{9@E#m4(iO*~cJpk~O{9h`?QzkJ>M3DL)vP*0cWp}G~FJ%B^ z6$aHj!tXHvup8m2;KLMO`z%BYLy62lMAHm$L%|-{3)G5-H-iH7zDefWLGH+ z4!heOn9rv@z+~?HN~z^6b1DsWTWL}Uhk|JtIf%4(L49Ts5r^Kv-&D$VRhq+TrG z2{}6|p$ZX~wti8km4G@f_cC%43q%R_sVHl-mY8fC#w=G@Er3Q)*9kr5ifdg=k>C^V z)`b`7p4RTv9)M4T_M!HQ+ZaUEKY|QpM!1c&++B19Q97_zeqzi4SopIPGh;h&6Sc>p zg5r?RgkF?AeeUy0MU!o(L`seX+i$f{EirpbgeI!`EZg z3Ze+K_iZ4;D$*Vby?|i@JqM*s6gs?d$ipBisXlKbYRaih%<>@sL{iQXL@SaoP$W7J zSR~{&OYQ5Se=F5V-KLAmUWzIW=ta~fO7Av4{Yc3(4ymnzLQzi-FYBg7PNls>9irDF zr(u+l*wUQ9L!X;YHG^ye0gbZ>$Wk0YmBC7%TZ4ja7%y+z$zo0>=wl8M!ERV%v-&wB z)e$pMjBr8vwa0-A`bQvE6co(T2LPsiq~=S$A9@XFg6^CZ{nVvX_}%?l@=et~2t8Ih z3?aVR-e0~7+hG^AmxyNM{Xi~g#YHPcqLoN>5YX<>QeY(dqaRU1BvA|zhp`rVC8;c^ zV+V4Fl$8FLF^5Wq&_v1-3ZJqIEw9nc;aET(P!s^DAW%Ng=Q)Wml)}e?JFvM7OA!#P zwlOFpOz;eQ+*_d@YX#CYl0Veruo}tPsVj)irHV+yLN3a(1G6v~8}L`d zi(yNPm|Vob5*K+J`0kO>@>k;;jo~pKq&Jrv?0KN#Ul#t~ulxt+aAgZ{J zdytY{)!NL@$d)n-=yPX-=%C7hI*kQaCCGFoaaBs=fz?N=oG!2@A!}5cAkc1Rtg4m) zaGR&&Ei=!dGGAA_n6^l0a@3X&x^?pk{Dj`sPWO;`#Zaw6ETTx8uxgoVDaam9c7Cv{ zN_9`XTYBhTFjU0DQ<9i1p(qEg0u+?0-K#EV6Ql#j~P%bcBrR^$!Dp&)OwsOgsVnP)p~S(Z z5>8Bt;E_LGsets+PfPf028nx_(fm!NgwB`YGlylDy-I2Crv2=VW)?5wcyTt2)FBT=hO4jx{ zEyLlHwNVE^bfm=4-LACYhg7UPXG8b(0wYBHZL}-mBh)K(%t5FUn2JT00(Wo$fHczu z<2y@x5LN=yF!WKAW55YLM7)E|9ESuF;Azw6-J`;QP6%8yTek;?FGQ*AH$YMlKU1x6 zghv4`6-**oV$H-*J%^%GtD{!6$52thu#zVn=`O1affSnJN<^2(07nZfhz`)N!E7WK zyN4Ci_~veazfH9#uwvimZmhlYY{m)j#>t470JKpcs1!s_Q`z-R0YIw#TYCxRNKu;s zd8E-PGxYDA%auq9Ue=@S=#%qz=p2G^_!ponkhVYi|p3t&8AKbN*@3Yo5X=3C~^=ACah<{ z(l$m>)CqXs>tt;br%CW-lCNRymU9n+S{j3M?p3lma_(sn8fNPVxoF}_ArK9*`6ngy z>({Taa=(6%%o6=a_f;={$k`r}^AL;Xb%=j)1?A?5OV`*2+46#7SF{>GA*o;Koe;r= zGhNXL18zbT(k}s`-V2CGR^|$a!YhozP$7kdF>Kt1XIj;Q~K4f03RKrrAyP0N0 zL>r#FWf;Wtaj;Cc$NmI-jG;SZLx?j;le0tDGvg*{K>Ao^Uh)!()Elos9Gd7NT&M9@ zaTUX56@JywaEi+cSB&t(9}O89AquFhsVT^U=!2+07{W%|iAI*spv@ukJxh6Pf292$ z%$_(sWbfh{@|FgD*6hlfQsUNaD9|l*SvRa_`;g2B!|wqg95Tf7{RUk4U1U~8&6|}q$_--F+SHP?aI`8X=;GuH`n6Y3 zphQ<-6ljx#0SP$jh)Rxj889`|A{@-HeBBk-R#PU|MNP{9hg^3xerSc8fM27#Yw@Wq z3Tq9opn^RRBhg#mT?yF-pekOdKswX-0K3s#40F7md5a4P_sz%e*5U^|VVOQ4oH0%u_Dn#7m&Fzf-&h7#E{f6rWgc?%BCfC0-Qvbeg(~x zc<@gkXi<%jD54@860b0_Sgl479H1+CRVoCFf>Ad^o@oMSZYoFt48dW@D~Kifj#cPe z@hCzbVs8o>M@os1@;yt%qScPMATFecvL(6$d8!_XB2d63l*UBf`yjuG`rJx1yP=v9 zgE$IWr$?eL!>NW<)4bZf+B2wHEdHs2wSS}PND@aA1!Ns0V-FWW)_BoYN(i`;_|lm& zvTO@u6eyHbFscY6{+JfwnuHcr{5~jk?SxASrK>6w7l1XpFxV-uEyQ@&1%A{^Xq`;! z96hhRw|Er&-CI#U(ABsN!eK7v#?`IyjJ z+ZCBLnpF{J2dlqkbSx5Go3uXzDaoRZ!bRfxVBsQJzgf6w&`QwWK<49+v_ZJY&Tx=$ z1;G`5x*#6?4i0_pFr|4@#0JU>;PCbHccTW|-?kj5=7Y={U)1d|RiL*esud7==+4jh z#Ilr3IftWOiJ_zV#RU+!wPiWglFQJ|715P4qR(pvG^lctf5o{1Uv(K)hMvZE8j2I= zvM!(+#Ag^jDgSX=5eVQ+3{^A-fx|@@ZL)=FPr^T4E`-|@N`HfhEhk4B`m)Qo8i>LH zEVe&NgB1UC_*13XLQlgL4OgbfM<%{vOZ}~ICFg8=aJaA={NwONY=ev~B9N;A=+-UqRzZ-FFo`vJ*W!Y)#c&xg%og+z z%Z4%Z9Z7=%hLe0WI)wInXz$D%C1mznF?mtK=)+(*3R1ALr(Z1D1xCopu*ydyj&}invh)fuTScjl=>)Av~jlRSm$%B+t%Fckcv-KUP_*l8&|MHdCoN-kM@OiTB7q_~@C z@1yNJv*^$ou4@o}HL*+J-rRO&FT&#TLv7_rn-eh~e-<%UK!#;A_oJ zBJm28vS~pgWDvMb0UZ&Y5*FL-tvoW6t@2*^j@-#fd-2BnKS{zMgesIMK&i38!YNjX zcNGpm)aQ^Z&*F=)0W1Z-B>D^y0+j<0sDz+bJ6o#)6=jbk#3N9-h8SVmtvyAgINYYP z2N;QH4DwbiW%X+zIs-8v7?N=slsxy6U>WI(5Tg_-+zf>oN?N-EMGgTl4O2pb9Hu=G zdR$0UB2g<55cPp&_sH+V1SP@81m+XtdVS*Rvw1MCrqW(JOEq!tTFFIpIR7=l*D2>Te(2Z?hVV93*Gk7}Xz0nx_|Mf5>itwbQS z!xDjn=_(##EMiI26qb<#X9!gbY~+VxZo2pYnG{uU6An=YahQ8?p#*v&qS5Jpanr9`VmqqvYH zHA;w(YC*;gAWAgDiOhMnJHlypCb0@e4IDlOX~RZ?!cF!BR%mbRNB+`4;k!_JjDH;Y zk5$yOFa)LG0Igv`=zik6qEWpxgA-Rq>|<1cNBRwaU^c4iEF}Hb-VMDj1ji{N5(3M_ z-+~`av3Et5NEj3=KP;7c6Nj22q~10X*P^dO=1qfRG6|A#Nz7xV-jI8e)H{x(-v3hC z*alHIaK%CBjhqwdQ5{Ar5^rK=Q$*%T;!Qd~VdW*>k(f3?AoxoX?+|KLk?}}-1hoV; zD5}{c#NCnqCvmsB3o%cKy3LBH+pN$1f@U$2i=k~G>V8O~?oO`w68Rp|Oz~`)kSzPM zon+a51-f}cmc64?mYqW6o|17CkokqxjhlnMxu@bF;wL9I$YT5&RG71SXP!jhZOH~O>DRli*O2%r+ zxfp&>mTlOHL!b4-79@U}YVXnRI>Z$}(}+Yp zi^^hNbI_59w|AAJ`Rf#gEmo052NNlNd~=RSd8P&z3urUAr;!W#UXu)BaO$Y`fy5ac9wl2E6jBtu9? zgT(V{^;}RDG}4hks%PI~N9aM>8sLodC}<2JEQq1*0FfOcg<=os^NLV`IFK8{EZRxY&IQ3~c!yFl@vc0p=JLhXXkQ3HVerXk3d@h(0SfhY}#L^DzS6PpN) zs${PsdYIuQq?1$~ZxzistXSI$7yf8YKqsHVs%h#AZkXhzidmUJVtoT$y6I%gqN9)# zkJpViIeRD<*~)!%kPkb1C??i&wi~@o;}Cz{7q4O>N^wz|1B4&`2onkPTS-#|L#1+k z2Bh~eIRMVZWTC<>b-UL)~of8SmkPG6eleU95Ztsgr~-SfAU! zl<>UuYiSKe$8eP^&J`E!dDIeqjWFUU)JT`F4ikRFl))jcwV@n(3>Q$#mt7s+28Mln z4G%qHIja2@XBD!s6Qh_y@^l5t0r)=9P_t4O9GYk74<3)1A(E>7HKNOYrv>IJz^s>N5lrkETUt349N*R&+hcA*4mm-lpq5 zE=_Ah$`~Y!CqSg-eKfWze0?!jbQuVp$)geG!v-&)<4`gv1u#dzr5GXbJV%8%+zL*7_`A~vhw6`~n(O9FHjmI{!CNFS4s!grKF}9HkC6GA*-#Vm`!Z*(q z84p-T$nacfMgy0Mc|^)crQOMRfG=jzTYU0dk?{aJ(?@ykaOJxN-k6o6Y-BvZ7js>} z`sTSJ;{jV#iaOKe&3)dO6^bI`0lt_;pZCdgMaBc@oF7rdjDPjL;f-0LsQTqF)0rCI zJXd5qAc`RIKD~SRbpC1L%}@EOHkt{TC=pkq88tQ!-3*x%PZiZcrUGEn;~%ePYK|DbX(`47 z=zcM7OCJ}-pXQv#tC3@)qB=!&((q|hrrO$-c}J+;whgA9^;&{R0Zbz`AeF=UPjzS??tL2m-<^?f*P%m41)k2x2Z}TDM=&6?Qd{Y9XXI~s znoxz&Jm!r2VuYEflX^YkjQk^(!xMn(Q@|Bdx5Gm-Rz+uG2Y^J!sANi6c-)!TbMQ|G zOagTPJT$gdgl{omR;X|l;hTf_9{{E$A;Lr1tO#E;U=mfhity3wGfagceDqX=FAs3u zHUS=2UYecACV=--5k9gTuv>-o zfdk~2DAzEZoT`&!Y2Vl&Cy{D`Q7kC2dNIM$qO4EotJoAA@2C9cY{x-PTXn3|H_XJU z;(6S2POG4KUO0GKAs`V}iES~fz@VyQ`v z3Y3@4HKD=f`E#jDCJc}bLjF+FF9^{{S}}MVjnqU-24Q}jI31ALD#gVoijkpv=UyXhJ)hFjbC1E7ConN-bh- zYoyyMwf)p<>c{&jRy&pEt5({4+vI1%`g($>+vs^FS!3BjjTYiT zh2QdxMs~H8M%(6`6zrU2!lmHDo$=vve}i*Cgxn285GnUII^(Uluhuyr%sI*Id{W%w zS*A6yWC_jlN}WClmr|!4;8JR`Z>ei;sf$KUB@_b38FOTdE>CV_EAj{@ttPke2_vn{zbuNhoj`myBDx{dCb4ib9A|b;^DyCSYJeS}BO%Rki zJt9H;n(_WutLxI?X%wMTpa0eBn%dX*@m@vH+yZlOC<4ubU)K2g>$38w(;ns@lUf^f zy$~t&Lw#6zJTRnL=XFj)<+>^|19%RQ)YG4O?suFx^R&Sv_|T)8 z0rax!L9o7<%Nxh@7cg_^FWxwhJSrvx^hMwb1 zAO2JZy-M*!3s4<;W5%N6kvvx|hq-K3OlZ!IjYfC(X-0 zm!^5>65Jn*Kc$bGGS{EYQc7*wxLIY_ew9T^9g#L>>Ik}LOiiVH(C~EFa_Z0_@;~8I+efr} zMqyNmPxTjkYPXy+1F?_eQ^Pz}uh#tI_*5st20a2N_|%jUwh^9q_qCE&idHpZ zU;P=+I=nTH#h+Tq^4Dx;UFM%*pKX1}HjUQvB25$C=we%b_oRileK(fBQ!A0T)DPoN zzBq=bFQ3TQw4cUTE||f)ZkWZl|DDBqkG1pd-5vb;CI@$4cJOx}ICxQsgMU;tvs0}Z z)h!F;d`qt>l66_X71m(^7p-mjH6LIfL!^!O4bX8eP0ZTQoUr@4J*B!4}W^C2&G=Z=-V`TGO=^3<;e@WEd`&jb1=^Wv9M z_~+A7`J&qs_|8U?`NY4ba5l!q-*|C4Po0>_wUuY_2191^*E6&Di^-N9?!bnv(DJNU_m4*oOBPQvlZftiu*a;kTpzA3-+FZ(1* z%Y!Q{vgwlL)|lp2o-)|F!692M_10LgPW{Q6y!fHD?UQw-sh6LW-gNYoPMsYs&DPD6 zR^D4G^*H#h)Y9>l^jVc%QqahsCGNT+-OTr68{Y|JbI#RcU)!6r4>F%(wtW`X%ofXB zlattlO(R+VzUl0%a66mS<^@(f#Ko$vS;iJMT)|RStzzljR;-pXEH zxR*_L9AR(F`I+T8e_`%dFR@A=|IOr0_t^auKR#-FW!@#NDjz(q2Dc^G;=>Z^@IO1& z=YQ5|#5-R!@g3{T+%_SEv*0k^{OhN9Xmoo%F~0+^*0wVbe?j66evIO^9(Lms8us9M z&3o}Hb)Mz=zx(j{-}K{GM<;RZgMoZ*)^ptY+YnwSVmN;|VFbS|kK#3#jpifgkL68= zj^nwFC-7st)A-mSllYtN$^2Z@6#nT;Q+dw8Y5e*f8K>4u18hgFk=H!Ear3@b=do+;Q8%E%zLJbFqUbqRpew=9}u|H_pbTyRM>8onY; z%6(he6$%D^I?I&N9Ds8wSjcfl<8lSFX$In(} ztH;84vvp+OowmcJCZ)?dmObKJna@(=xYa-bfml>a4c6%X zTdejE|6-k-@3S6*KW2BI{EStu_Bk_O`ij*!xPfJC_>MjC!4~%VtJ~S;#k*NV?vHHk zoI~uq{U?^~C}0uuPO%LyoMRgo|Hdx9e1R3c`4@ZTy=yGvvzx5j*G24$&Bd(KC=Gvo zOeNlLoQ_*3RN>)i0lZ3DHU8@OK>pp>nmm3~5N|c~3Enix!0Ys`%g?Z2J}|riAJW9g zcU5o9Gj28ET~9UTfm@pMb?>y`f%aDX;lS2B^~q4)%C9YNbm&PQ`erz9Ke8RK*CK*{ z_v9ag!Q)@!@Su%Y5#0K#*oFU4$9(#Ud!U+kKtFJ%{#|r^VYMnIa{60Uvy{l z4wdb^_mg)1TcVveoN4F&Z`%3hO?E!0z|Q}=VdqO~pkKCd@KF{A|E`aNXODF7jnf=_ zL5_ppUFzWGl@8uuHTvax2mkU12cNau!IKW5&z^Abg{Lu2|LWjB{t4JZ^!=+2{`ubs zzvbXd?l}0wyAFOEeY^wuct^}>e(2{b@IHb5Jr?gOyg%ao9q&!N#du5bDjTD7xHT}d z!-E&9N7mkxA6fLL)M?qR6`iI{ztri!CBZwby^wx{kHvX?!>wor+HT}hp zt@YM?VZ9yjo%P1b9oAb@4_eR9bz4{b_^Y*A|0~v-b?#bYs#cOdf8SsFc6be`Z^zow zn6UcNAFPSAZBh&A;aaPVE?J=HGGBk<0z1Yn7juzU@3xGA$k_ z1>8%QhR)BF=GU1c-MyV7&HH14RQoqsT6y(FsX^6c(v0xeq>o3hkXC*4jx^}*d(x(X zA4{9IeI~_8Ur58Ze=Yqn=v(RVy&t3}KG`n4HfE2M6n;R8^gk+v7oL!wI(15F_VanE z=(j(le-#%>)tg?In)kacxnI05)tIPZgSmbHHv&ZgFgU~QXqWP_}o*@fpN zc4$r%)2{BurvDtn8t8km-(#O;yA~v{_51p>cMSuXW8`y;uOG^e1&(0t#-*^Hd&jcC z@ChvKjY(`s)v0V>RtEd*W+uCyp2Zejcd&?W=d#U?9QJ%nF4O53uyyW*Z14w**e%;) zX78TIF4bGY+WobZ#czF?b$DYrJ2&lB7Src-HZ<%_)};DdY+m8p%(4F+R{isLS(8`Z zW1nYzz&53P#GZ=(gjMbIDPt|xu$@n=W3Tvq!9KkHCA;#=dX{qR8}@MbM)u|R-?CX> ze$RS+@&l{?ZazEx#x|C>YzJ%h;x3lAXb;=>!alY?XFpp!_aJ-VILv|_N7)hkG1k;^ zf)zX5Y|z}3tZmL|mY#c-)mwO;)t7%|X?ef1$}j!NPAqv-MjZuvfO1u*Sb>_`%=(_@F;4@vkpv`7alB{KTco z{H4MwJn%1n-u15l-uADmd~abjUc0b5*If$auU@FZcmGk7Fa1r=ubvO$r_R*ki6@`n zeNWWphmIKd-u-pBw7V{EwzVG5_%@ig`>H-q`m_N*v8o~e`VAxhYe^%X@j_$%?Cd6d z(qt1qKC&sdCpF_KJ(}}*k!Jo=NDDqNxFxUb--@5S*@_=KAHuKhZ_Ujc+wdu?Liypv zVLU3ME&p!Flbm;Zith>u=kYb3=0~qR%@dBck*iQ=~QU3f>ouKer$UHR45 zy76-(qxlP=-T9fnyYoLb#PAi_J@|vDSnjXw$v154$!q5H;#Ioz<|`lc<|j79@lU5d z%Z;J&yyY+PeAlae_=DaFe9yxK-fCT6UN^ZPf2C%B{@%C!IUk$I$JR>X4K^k50V4)* zqyIoYZuLOU;s^29t`6dvFAnCX+djv4?tPB88}mGGsu{vxer*VU;i;kg{`R5#??J=( zxWZw4WY%zgvU)N<_Iff;XgPw%eLjNk={%C}+B%ZQ^c=-|92mv-_D$i3j;8QIiKBVS z(b4>7!Wdq4{}{fi$5_5?%UC`kGL^rvCYASVK90Zq$~c}JFrIJ79M9kSb36}9n!s!4 zPv9Sfrty8t()j%1G=6yGME=#Ti99@X5|4IG;x{i(;!)2|=51C_=Ii~_`T3FQ{PXY9 zdCNLec(=4EyxP_&e0JTb{LOJw`S@?A@=MjH@g~nt<5fSN#y`D<-!3-ZT(8cJUwSBiP`*%7qYo^Wj3$<4So+~^9{dcbNL>A^>*IX zZ0BK-cAnYW&O?XUc}%*U|2Wsqx4vZOtykH(?n^r#u+`3+AGRZXJMVbe&U5bBd6K__ zudVIi%bGa2f2f03>)_z;M1e={<=`(RI{4p1!5@!taMxr9KQP0=*E<}%+X4sA%5(6M z%N_jAn+`6$>)??eIrzoT9K8RR4xYKe!Jqpcb7sDS58vtFFYI-2+W`k}eFW>qW0+41 z9K6OU#65#~`#kXd2LC@W*Iq!JOAdbdFU9DLk0%+cV-N8fPpZ?Fctg1Ngo=I)>( z@ZormV-9~4b9fxqW`E($!dzaAcM|6FqjENb+hG1q#G8rt6})TlZo_*N z?>W4e@LtDz8}B{55AYJd?>+B(=Kt0D%x8iZRPT6xPkzS<7p2HKcUDAxJL^(p@DI&9 z9n(D5DbjCor{B-7=``rwW1Xx`HJyV;)a$%)4lm1lA~znHYFbNKf6 zJI`pdq4RSK_jUg9^x4iow7J!J**BFfSxL1lL6aLuUUQ!|CgmtvrjDJ`+jL@u=zX7fYhCq1__5O!!v%i zG%5Ja(m(U6*px})}>F?wAQb0u*NiPV67c%vf5oOt#hx3S?k-{Tf5Zh zY`y(cl(pTLJ*+p@##`I%OR^T~hFTj8O|fn|I>EX#b(*!aakkZe#$0RD$+^}s)1B6z z7Q3wDzF2B)`sZ@%{Wfn{Z)Cr1t#a;NYrDQ5TBjXeZQYf;&Kg?smGzBJH(G0t+iZO) zVw=^V-)&u9^rN-*^}|+Y(Q)gony0M&BhFjjN&UlmVs)YQ_JeEIyTfiBG&nq@$l3q+y@dlcLu&kaE9iBsJb`k^;{)m*PuW zO6Oa&k+%15E8SQaE=}CgUV5r(N2z0CXKCIClBCykk$z5&mVVjYLuww`TUxOuUg{av zPYU@wN$MyKmZlvVBDu#WOJf65r26Z}N>@@QNWV6mEZuZZl^U;{E+tQxC4J58(u;v} zrJfJwNsF$}m-<|ML3-u4h0?HJ7fB!fzF3-Am?y2hxkQ@i_psex7OzT~*4L$4 z1K*SyXS^l7`N~RZ;kW;ie))Bk^s)W}>1XzlWSjDdWc%<_>F0B6q<0&AF6|%sr8Mwg z>m_#K8);sx$R_($nz%0Vgm&|#^V z{UqI8cU+2W>6SLUeNxJ3a7LQ^`Z;M;!(XME|N328+xmhufBhwCQS@c$hvQeJrfGjm zYjn4yQSaQ57{4b;=ZmGGFO*2}_54_IS|t{_UCT<0m08~zRao1j{%mP@RhIo?HFo7{ zb@p4|8f@75nrv``Aa;CCEq3I>6YSZ32G;%iI&4GhdhCN&gINv#2JEjH4Oy2Q)b-SjD2P?vroTn!GhbjV%OG%uy)~X*r|1)>`J?~Z1mSpvM5V9v*$m} z8ux6^8XbvXvxjtG9WHcaaT%T1w^|F!dD+U|H8WQC8_v%3>cWc7c4Z@{M>Av17}os5 z9xS6vPxi#=UhK}yIMzHko-O~T59>9kFY9`*ADj7BBD>aQ09*CvK=xAJV795l^Q^(S zA?))-!&p{_WH#&95$xloqnLk}(d^~xV_5H1sVr>3c-Em>8XNP&MD}gQWY)gz6!zoq zQ`!8LHul_e(^>DjnJnq(OqRKHHd~jF%^n0f*puVtu+hEdGIQ8GHm+t4i@2V{=KVCE zC2q)NAFp_UIp!{4$HpvVtK*!kq}?KRxW3Fxev8?~3yay4hh6Nijd`rusu$Uz#Y@=D z=}TGOh?m%kxR+U@$YrdSc{!UN^a_i6@CsXU=~dRP;59aC=j-h1S8uRCR=vr3yu5QIq@B4jrkYTM!w5J+pJ>ijqkB{^zXBal|EogZ-2m+U;2>UI`a`* zcl2YnWA`Vl-R9No_LrZsTAzHz=DxFrb$@j&dp>U++n)P5%g+9S}y=g0Z z#kh?{)Zfkm>+WEUYwu*KLA%(+8oSxb>U-Fts(abT{`=V7%0IH%y8R5t+gSBV2U)P+ zA=X!On5{24%(|8wVMPy*vSSZ_Vg(P6v66?!S?`h)Y(q%_>!JCX-O`+7+x$+k&nlf} zUun;<v1Br|DIe-TWF`*Wx<+qt)N6Nt+vNP}ohj^vPRncld4gpxqtT z_L(9!sN-Fh)#)C4-EyCOiXOS1KVV;WdB|3ED`D7C=AW(7@I130AM?H+f2L(6e(!@y z{Hs=4KI$VauiRS4-~3p|&21|4m7i4RfuU8v!&Twmg!=QFtNpntEPz`+4dBsXRe9%6 zt8!ylHD0*78hY$^K|$rjn^{{9~PpWLte(f#24IyEzA z&N*{tn%8x`Ki7%%(7~TII@qkK3%wP(h*Rx>vL!umNwFu6W%a}&IXw(Z*TdnTdeBPf zg>h}Y;1i(_mlk~}h8UpWnE|@b>WwK4y%Fiz2Y$7EVC>o#XD;=HDfL6hiGD~NX^0v7 z4AI@h2&)T>@LI1wlvnr1U*!Qfmo)$r{tUqGIAh#yHOAGTfmr%*AbLzOLBw?vtZ*EJ zl#_#CG29gUcADaIZ!`Q`ZHD@;<_MRX&CPaX}%3XdUBs2T!67z*qCL-Do$ zFvP7JhGX3FHCPa!UKQoJdw516XmZxkt$9>>#8Y`Yo3DR!c=IioC?*KQ?bX!3-6YCq4tp% zJcmz1a^^HR-kFAd1E=Fe!gK^zO~;X*-Y5?BhShOz%u$>HVd@O*-!TJ~pJyNyKB&+2 z!Ln_^}n_S{Uo?=}lcQ)l5~!7TJ?nFT#dUmQ;N#m6hYxUTMpvD5t!ROknz zH-3;>_#-vJA9`o~F;!tUM!C+$!R51Y^Y(1y=>?#5W&qw524LyS08|eO#GbG~n3n}& z{Kr73jR*o)g@`#E1l_Mem|+L{YU{HAoZodnGp;;)@Lqbuo zJrs41Ls6_h2l`%fFk;mlyt_UJV-)AY#eObcC(niX;knRgor{geVW^xLhP7+Mpi~ov zJ__@2&u$(pqvpYC=R7nv&4aOKIJ8EGqc|lT56i=G;(0jidd!Ev>wFAJn~$yK^Kta) ze8g%+;GRP#P zSUe*UyOR=;wJs6bM-t&v$N7*59hD?39F&A|rzEWMOTw^J{`N+?+?b4&2a|E~S~7~BC1dQ*WRz>9;Le~FoTL=^Pffv< zc`5j?AO#KUQ;=1bg3lLIVAQ~C#`h_xmQRIqk5puur(zMMVuD919t5Xia5BF=Hx>O0 zQgQWQDl9LjV$Qu(1inedpkJvtqQZNuebQh$EDf4S!{te7aPUvVlBhIn$w))m$}|ir zOvASQX?T7v4PS4h;r7EcWV}nm@1JRK>6#AT9_bikoQ{qW>BvDkp1Gw%Wkx!bLep_4 zme-vb+@s{C!+c{p981zM>|i=RoJmLK)pWeO&HK4e(!pBNVbY$C*B!i8RhFVfM+%F6 zytiv6h5aZg)R+`UMoTfuU5Z?9DJlZElbI*Q(KueOrc2Q?TZ+}orFgqeirxjhjxCi! zf4>y3j!CinoD@B-NRf7f*Rpq{Xl|0?-E%2!y_F*WlN7>tDK7ox>vWbOL7De$HF!;zsDddTp_i?8P+gT$ZrmxE+5 zoGU}*d>M8|%TN_B!>wc)E~m>-v_OVAi)84vg!`jhUiYq);lLUhy04ePdy@<+w(@Nk z@|tpo4Ci;suy;3ii2Jxt+|O&sgM1rD__mMpTK1$2re|bWa*jLI^Sp-ab9rVa9TMZIbS&Kod5ha|F_2Y&H1md|CjT>I{&{~|Nm9* z|F7=<-?FA_lI7lP73)dW7p%{{Wi}taZ?QR_+F~>K`~cgcPBU!JcFMJNds%M#qU5e^ z)c`rWT|qtVvh#=A%{eyS&c14nozlxJySX#h+Evt)*eP0_uye@2Za4S+6T2kVZg=8h z7s<{5O-Z)2k7RNWb4fRI8_B+t&JycN4@rsJY{{=lQ4))rGD-heizS;3S4uiIZjiW7 zE|M%8y+=}>d{}a-<&0$S#w(Hq*|#K;gN>3qyaHVb&(asFatwu_+a|&raj4)~IZ7xFmk5m`9fU7E#|j?}CJ8mzgy_Djg;n0`1pVSog6h9*LP+Qi!SrdV;67)c z@VMiEP`C4_U^?rR@Unk}(CNn|A?x8)A^6q}Vb|??VchHcf?L-|!alp_!rYW*A*;Go z_-WQARB!k$wDdP!SZPBhuMmgFACz2{t$O9aTKe5xQN-2 zuHx(WZenw+yO=FMMXX#mP24`pN9^6;D_SlL5Z~B@h_+wmiUW?#7x!dDi`5?SV%Csk z@t#_`=%1P)7R6?Y<&g{d^JI&ru{mOX%2M&hqFk|d?Q(HL=}K|Pxz%D$!&9b)>Zo#KPYUEbXV*Qjh(X>n0NBK zD2@Il4jTGb%x>)vYp2OG%hR1$ykTdya&Z^7=#wIw;?tG=t?I@ytW{XkPF1GSt2^tH zr_K}{Z8r2#wZxFxp_v+zt;dZ zwA7f@TAMJZtAkjcj~Uzh$((IjJcRih4r4z~S+KxqBUoYkNVY%UlC89{W=>5utSZBf z^)?llL!HQM(}?{uwP$PZJFs7iotTBhg^l_!nsq52%Xa#VV>-HS%>C8`HY0Bm8{syY z-BI;q&Nrv9j5S_tvG;T~!)ONk(c;5qADhM2X8EyI9<$l>0fFpIdk}M|4q-usbJ)bB zFedL2&Qga)urtb0tnzI%TU#B=%*x`~qE(4(XJRtT^-EtFg_-}| z%HFCKu!a2!d1j!9xw&j-Dc(C+W<)UyURc5gY~IPv94ciN*LShBm%G{ae|y-DUi(;@ zRT;DJC}*c5_p^S>53reK2U+xuL(KQXVKzYHC_6v$7_;;`&SWVkSYg3Qwz2XQo6~xl zsp*_$IpR6?Ah?2ctT@kpow~rPUteUA+Lzf|`$}dLd4+jzt6~#tud<#U*Vy6V*V%x; z8Wz0n21~B4W&RyESud+PRy?ns$?dq!hBn<{Lv-%3-xKb$O*sur`SJrcPOgb};2tvD z)JN>~$;T}4=Mz?L_l#XldCm@;dBH+DUb452ubE_VGn-!XhB<1ru%FZ4v9!WgcKywJ z_IkueR+IXPrC<5XerkSU@cqgr?QLh~KfkfsF+Z5N{wIrR{>5T!|1inYzpVP5jhfzvT3wrawg7$A2PPKj`$YsDt(rq3| zZ0{&K8)->vEv@L%Pb+e*uqKm5HsmwjmR@VxQB{K-breV_FI1pt3z7DI7fCqJsNWJI zZx7HL1AE>hv!^Zx9B6flBgMKn(Jl>V8u8GXy6%7fYhJSop|3MDH}r6Ubf z346V$mvkCAOrB0BjlD_w!<*LB%%Ju{A1aBTNjt{Pq7VIiX>q$R&A;wP1x5bUH)%G# zofts!CV>?6H;}aN22uC2V4AWhgkH@Gr3=<`s9Ak3O@BL=v@eB`-qv{(nix(UljqaZ zArYj~HIk$+B1uvaMYK7ZmLmE-_-^G(~ErBdc6Df9468#8Frpt~g zbk``AhRCPU)u(Cvc+%-sp_GILGHM^5L6Jonq@uNeu4OKuU0)W^?x0MnxtmGqW3qU5 zCX0TXEu`(67t%bnMKndWh-Q6WL^*-kRDU;{*x1E%_0(dD8=6BX%pr5_C1jbsgnWN4 zp{9JdK-C;w!S|{ z0rM)z`fUa2hn}bIug;TZ-~}>%c7aCwU8KZE7wLr0B~oge_ngsU{P<|^rqzeXz6*GSE^n)+O=CfhOBY4(-tliE=MA z(JzOG6m{_-wL0=#!lg&_%jq#KyZo5?yF8)ul}{*W^i%3y^_0$zc}B5UpV2Va=k)Q~ zb2>Wi1<9_zph<2o$@s=g`a9tjHPybNbCX_E@vYaid~!3T*Edt7=Nk&T^M+7xhj1O{RZ;lZEsTS$6y(>x{o-DgTd#XZ|Bog%0Yo zu!9zNlEXhoKFpaVhu4?n;MG|kmCo`Qu}B`9E9Ie}*a@MdJE1ze6U?hRVX=||o{dp} zZH@x+t}5Vh*UlK?+8K#UI-}xRXDBFlf%CX7$Xwb5XR5oPO<57f;}zk#OcB!SiYQT0 zLe+RByk4dR`5GnkRP72gx2~|x?F!U%g_CMGIJtEL<#vN*O*afwRfd+EGJY;oM$>g= zoKR80%JDqYyG#WZ*H!RMSrsS7sUmKvDh5}pqN$r2vR&0Mc!?USuc{%SYj?Dd>5c`9 zyF;m}I~FUdLvFM>Viu|6@nv;5b=E+UlLmffYQXiP2G+=H;;y|WG&3~eQlW{Mf0|g& zv~V;{3)fF;q4Ad%p4n;RS&}vyj%(xUH*FlS(!q*29fTg%fpwb>{tnm0nMhs4l9{q~-i@~kHg_0xlruO2+N=pnyR54C!|@Ykys z2IThwZuf$Rraop&(ua4RJ|qzP!%wi&g#l@r+78G;QpMkN5iFyS5?ET^QnZ zo*}MR8=^$X2(ivauv%b*cV~^T?w1iPZTjO%Y=4YD&>xkp{V~#P09FSN!0Vy`81{Go z=IR?`y_Ydgt~SPvT4UT*9*A3`2jX1jKx{iV5HY_7!q(aZpQBB%waf& zL8#n32t)4=!eT8`+@4?xttF;#yljf#4pSsc%#aaphNJ^#2zX}(GBJnBY;#m^Hb=@m zbM)36jQ!&W!!mm?_M9IKjo*VY*J=n3MGish?jh*;atKEC9SZyDL%~)L#o(HuP*xm< zMhwHIgz3FtU4SaF2k`wIvl5t4@b?X;kaQog7=?B zpm6gDMBf>K5o#mx%w;4pq$8nzd?fNdj>PXlqcF{X6n1PFg~zu>p=&ow^mnj?d9o#p z4q8I#ttFZatxz!C3X@k_p{>da3p%XOVQr1@2y0v^v4+MYYmCvc!Tj+ySdeLhtdll~ z`(y);LAL1YYl{bKZL#3GEqZpc!)9AMs72Z#yu=PCo9ysaQ-a=OB^W7{!0LzuCM^Xe0@kf7X(~!0W?zp*K%O~bM6^>*dt|}Jp!fnusvjtAFu3D(#ruf!2y>t9AJ6G z0V|sw(4g-KwTX@xvcM6xM;u|%>>`>!lMW^mN7%S7#`tIm4yg z8Iez&k)`E=EN2%)B)GtNmkYWyy5OM7XpCi}Q5`WFHie_HqHZ+mJB>lds4?gnJO=vf z#-MA}7(D$x20Kj0VzT#Gyj?OD^G=OLL(5nUH*iJFcvoyob;Z%WoF-Qksfx9 z#^LFvafquPhqj;NFvDy-%BGLU+r{JgxgHP0*W;nD>xO?$Zm5ZI!@?prnA~#1!GC-? zbOILnOhD}t?mJHK%++h|K6EBR({UnNA}3mn22zbNx17d2__3BVRrc> zWH(L1ny&6xYUPf30q(F|;g06h?#O!Mj;^|sk?1fPweu%KebZ#vU6~BGw#gXN*8@Yw zdEi&P2M!i_VDb$QH2&~_o3ST$PVz)ciYI#P^u&-lPniGlgyx_rcsh9sHl|I1q;v`{ z*G=JB)+tzRG8OmSr=nBpROppVMUR_P@#n`>)b#g4mYWxh6TGC{}=5+k9n+|EfbhIv=4yVJ@k=ZmIyA`}~a7IkAM_aFg9jcySd{Doy+R+X zz2bu(tv+zpo{1#8naKB>iH(bR{%r3|-jkmRz3($|w)ZTIbDV{W&{^o6HwyuWW?{ws zSt$843)_u+ku%yCUh{mRveFm3kNCpkfiJfH^~Dz>Ka3ddhv{K{2wCojnTPx!-1CF{ zFF)+>HX7!ZV$nL&{32tx6tAhf>-f<@w{tKi1_i@xA$LVPg0cQm zFb2N}Mro%IsPqrPG=~r@^AEu;SqRFvg<$j95JW!=fyM6--0KyJVB1hU^a_O#ABu%* zLUH6^C~n*gMeX}g{=Lg*Va(>hWy~DB4Vr_vOuj7Ozn`6hWsP%i^7|az)R~K$Bj)1R z#JN~JZ!YX}=HglLT!dek%N^=m2*2h+)*}r2Muy?i#4ub43&Za0FeGme!>Ds%xceXs z{_SD7qcIP|hs;C5n0Y7(n1?gz^Kf>G`m|Gap0W z&xfjF1n%^WK(Z1!J_N-gJt-DHmc_!iAQt-%#iF$`7P=2&Vb;p&;6H1{q18AJ`)%UjJ1!1C zX2wAl8HdjcxNlp_XQFn-;ns;bv{iH0_9za&Kg8j=Ts)3y#Usu*9{sH2aePcX1aCeQ z5XN(pY4Mnx7mvl;;<0;wJWiaC$KkqoYmj zUpx}gBOno`(TNz8!QI`8M10tqh-3Q_5q>%m8r6J0p&=3dn-j6JJrS)6NwCpMLZo35 z)(uO-9+A7faY_6;I|;IoBut1)f^udOj;=_;q^(J~zb6S3PbA?;WfHpHPJ-LhBuL*U zVcRdho)XV_>hO6ZqhurwONNt>jDKU2v1>{)9A_t^dOlyKB=gTgGUV1IV{}0>()Mx} zcsv6pGFCMwBj`&qOgoa%q@2RPb5o$vKLu-sra;jy1#_KK_?$xuI%cF` zR7eWEqEir-mV(H|DF|Ghg0Wju(05k~ULH!}pZyd#UQIz`J-_c!3LZ75U`!jI!}!BJ zqat^QnyK(MNJY}XR4lRJ`BOVSC*_n1{|TwEnwE+`{;4<|mWr8isra6rimb({kYB~K zs+&?#w<8tCW!yC$OU1T|R9v~5il=p{Xl+bI%ZpSrwx;4tdn#7`ONEzG8oFzw;iO&~ zyo}QD+AIxoMyBDRBn?hZ+(V8}!y8ZTA!qU#kRa|P!+F*i!;e#|}Jx#-d<}?iWn1F9qX9i2|4<9FFCDWUrlai{_n*yt{nm6uwWXu+JD+*^%eT!h$lRpF-KLrp9$He!dP-5$ zTZ&UgQd~9RIo-ihR1KHnxRn&!BvPJXkYb`U_oA*++@Byto`)2YX;M7$ks`rg3dLZ4 z+gvG>BczbVaBrHxU2Cco#WE?rWJzI{BSm7a6nj@nac`{@KQ~CBwUuXoi?}B(;rZa* zQuHsALgSzm-;PLe`-BvwXQYTd&vU_-`EyiBvGckVlW+2$>$!uyCxu}nf4)aj41LBQ z`;zoaBO=_kX?**qs4D8t=g zzTO<}EyHA(6)uA;g5Ms+=YnGRzQ*y#Cvbn5#C>QA-=8#|8;CXgFE4385Fo5PA}#8>RtR8_wa4*<({=n#&h!AP44F|_8|AVhq$9WEQ9M&p2a@K zz2kpba2|7Pzwp^FPBTaND#LQl6V9-9?#4M+IojX2 zN9XL|yyXo2&b>V6AmEIau;aLREJWd{`jB|tYo}grL|aZJU_tZYo{4DwhFm6FJ6}09Nc-=Cfr!gc6D%1+iUBF z+iIN{Z#((g99!R4S+;$A*V?|SEwL@NIboZz;kxbA&rfWP9oucCm0j#U1Z&y_X7;hW zsc&uv3mdz`70z~jYdq}orp&hcGCj)9_kqmrMayD4twAg8?29(o&Gjy_TRmxy-O;SW zcK6%Q*tM5jvFpC}mRg5^eQs5^0xONr1|2Nrhp9WUb31$+P6=lAULpB`-AIOE$!| zNiM(oE(s0&D{)AZ7nZnn7V?ah1h>x0!j*Tb!tX|P;a#1Ukbg^8_SQNduL&%U9c+i5o)IT3HpkGg5kLk;c$aG?a+3(_o-`A1_w*%>d z+06{0Yjvh@@#;ch+VyPVN?nei`EaRV(~>LL{8=t&X{{2f2CosOx#kNO!`2ImD>n)Q zPi_|azTPT)?olXg8^2u`xUg8rKEG2qFSlE`yHUW z!%hk&d8dWWpUw)Wyv_@*7cL41Eh>e!qAEdIuUh!Msz$i1ep3ipRVO^@aYq`B-@I?x`>@=Y??1^tI4Y^F~mOeCAHuJr zzlB#x|AadQa-w0EPU5t11u^+`Q%74DT&|YVRZFE$GK*K8(ag+xm-7EsRCu zO9MrZ>4U_%A5F!u9CLBXfFYvk`Jv(~Ukh-Y(+#yQ9T^tHz3<6UT|`)!fAWwG+ext0svXye5mG zeLTf}ucwIT4tR+!>C?r-<7bH7de0Qce3&K9yXYq-ZkR2GMFon^a>6(LT}ixN}gV#H;$;>66c38J4>lGxukMZB()CeBcjino5t#2!C0MC%wct~TpII!0W zaasSB;`1S^#38n;#W~Jv#C4O`ipTu&#cL7k#2eD};^h?^#C=5@#l=T9iJn(Ci<*zN zh!@(niUHjU#CF3%F~zP({Oqw^^q#*%Jd{%`{w*#M?Jn*VL!Xw4*&VyY_5JpU8|?Rr z%L4X^k&DVi=iTL^a_xTc!j}W$T>V30C&$C$valnf;@YEP^tof=jkm`|{T?U9X-=oa zMbW3l9ffDagSXC#2jwfo!cphNjF1bW`=*Pc#?4FOh0c}YY~hO77E>k0?7b?!czI29 z>UUjSGowblz3zsnaHm%6uXRftF}Y40zN%jATYp>pqkUJr=5F1!-0HJU|T|2N``18>E`PVdC= zQ(MKCyWWf8e?N%NJwAz}cYhW)%6$f{s(u%ThyD=FF8vhM4S$O-)BlJ& zAO01miXCF|L^*~IIhJ}ro(&7=#HQ;gupd_xn0iWQwqsr*06$cx#qvl3T_+-Rvj`e4|(gv{QPR8u5@<4W~ejw}EWWr7b z4q`1sOxcQWrfk=FGiI~QoC#io*%6~5tmyp^*7?*>)|5SrnM|=@%|^pn?@z_nCu^O`+@&A~+0+Gi4b^=A@uf9TGJotexsws32U?`q-asxH6ml zE)QUJ>jPP@1wrgiSTK{D8o~+?$_|*%VWWD?WoDhi*vb!KY;My$cI0X}i#|4=6&6P@ zhc%IGN@f&mh>m8pvtyXGM=Vo!ieuiE@vMhQ0&~(!WY3k8*q6UaEdFycoAWA#)jUXL z+iTOVu5nonbXqkY=+JbR=RBm8*En0ULP)I4OGJ9s!N#P)SayT=}vYbyp&!3QOf=; z+{Gd^cQc)ByV+;+J*@MIJ#3=OURGPbmo4(&$D%*%WBF-i?1OSSlWr_$PNw@Aj_+qN zqYtpgy9ZcO@If}A{UDpZ=n&hWdzh*3Jj_m8A7R_7j<93XkFw4!N7<6pW6VkII2&1T zoJ}8bf*rnef;oGgWGZh@GNrUr%uf9@E8KpXG3zr-qxuZf^F7O^ww+~Hv(K?8g9IknAD?cs?s<2Zx7l6RP<~Ne(X6L5dMOVQ+vru%3m@|_gAd_^DEY}<~7r{Ze|e;&FpW=8&=Wh zEjx1lEqfH$!msP_j#ce>$8sjNvh=oAR=n;#>yUh4xlcYYw}l@W%s#Q;+E46k>}TfM ztBomDw6X6&UzoniR~B{fEBi66ogMzy&I(JuvGZ=7+oyM$ShCn&Q%#vNw08y3d`-a%>kmu&oO@w|Ako@rrbOyCSXo zsYrS5O0=a^i7x+BqAp%t$+xU4-R#_ryk~Z!KZm=~aTR4+8mLSOr{V1=vAD_!J zq(VPKayx5C8U{wxl4L|p_l)SJWq(pw)1M@t`_tk{1L$4Z018z#rk`QPw4Dz=1(*&b z+rZmq(U>YmNTbO{^m6H zyg9`f4yMBygGuGtU`lovLVt^f(1uP!$u)2&X05^F_nx{p(?*Hr9ficU#aZ z<>AymZ#YHV7*79&ji4PXN049J2pTbEB=tHrl6vZmqQNPnXzIgJw3aNXrO=YR6s)Kr z*oq>rT2b%8*7PLLnofMOrczHE+I!4~Dtp;ddzvi?Pi<+PlN~9Q+EJdegv=r&)Kn*- z?N$OwHwqN>SD>WXBIQ?#RAt6UeK{jOeoK$Nc#PyUk%A%U=t5BXThNS&_B8&mJ$dRm zP-MCT6+U;M<}r@sSmsEFwVcQ<$%$@1a-u9JXBxBHnT*t3NIl+#w3=MV++j3LD;-T6 z)yB}L*fHeOIEI?+$5LeJSnAc?mF~y6((Wc#TIo2Ba(9oTts3L$LgIM({dhdNj&`HH zWp318cLJ5AO(3_I6G+Z&B3(T^k%|o_QGV7W+VpM`9rkpmXQ$n%zwu;B%AHKlzD_2; zSswJc(u39y^Q6h^J*l7E6q27ig}&EKAvs|x^(~%ClhnK@Kf#MWJn9oV!o3bx?Q`*oOl)Zii70dh3-FbXA_nr^M*w3U#duGy1-C6WeHjCD_ z%%TZXeM$ekFa0$4qt<*sYLoLPm2iKux$jSjj!h6O>Sq7qD96N5?bMKB4ILMZxl2%Q=fO1f)9DNAk+Da@Zk>mSVFbF*`){m@)G z-!F`|=7v$;&oEjUGLK4b&!Zaqa8fJ}Cl7=9bRcIw8GV~i#eorIR~JFgD3Uhqi=+_! zD00q;BFk@4WD^ukHHiiy=;(@zN?JYGb{r}0eVDn3Vjo#z|7oH9M-O)r?smnyW48AbY4wwrK_pr?`BH0+d@<0w~%mf3k`a|g?gE7C9Pmi(N@xXw3Uo|Z6lkh z+sJ*@Hj28jjn;K5;NK$!^ld=_S)41N$X^BgwJs$2*h2E$Ur77j@#__t7Ex4C5j7PS z(S%1ubh+1da`f6xS5|MQ$v3ytGnE~bICcl=EZRZGF6+G`D5i^v#gu-enAqoH z>O8E3ZiSW5_R<{e|OPA$!>a*xSMp2?xu-tyD86N58V#mLw)w_q4~{w=#ueX>KCw=WCeTa z^~1e1S$`j0oVJhb^7qlv`h8@rQATGcl#%PQGHSe9M$wApq~=`CuQ^ptQ!C0z?r%BY z#(oM-+D`+H?WY%C_S5bW2PiJ`06CW(pkD6|&==E#R3CDXjuju|f3FYHa>GNk!1oX( zZ{hjSM!wWLOc`E>DR=E*+FE~@4rv^r8xxOEYwi)!xPFA}x*es^F-K|BqN7xI=_sjn zIz|)ikI@?GF?w|77!CP-jAVAl>3-sIvOIR2^1mLZ-y=^@aP$efv;PE*`EY_NhMXi} z-bp&M`y@HMIZ4$fr)YZcDSEf#6fJmuih3KJrZax0$#2_fQhIcnju@Pwpc!YV*Tyqc zfBy`v=y8_Zr}BCIwP)!`{aGs0JV!G3b2N3uIkKodM`~&n^l^Lz-CbHi71t`Ltm}Cy z7;~QTv(M9t%JY=h`2wwQxcXy(+n#Gw{q`D-H>;*wbE;|j zu4;PTTuo7fu9JKy&$#ZqPD5W`r>cQ96ck)Tol9zH*UK83Xnccbv~N)HjvM6p;s$jY zP)nx*YAI%WEe(BMOD#q>Y47Zt6j5}OET8dfY8l?5tNyoWUEwVXeR_)o!#dLRucMZN zI=b?tj%U{EX^~$&%_*p-iBIaurr&Kc^1Dsy1-Gf=@ooCt_YS@Gy+e<--J$!B@6heO zcd5?zF4b?lOLrgNrKZ03=(+DbYTb5^emuTMO8xGWp5J{kFSt*5a-XL4Yv9*kXrN^U z4Yd1716}R+fLi<>Q1`+IH0tRC@-b|rMgEO+psS4SYlscRZriFCNkT0gtIq&|?ZIeoO~mKBhm$Psla+32i8O zLT_F@A&JRTS|0M0UhI5IcFj*|)u3n868el>c0Hq_H_xcU^f~#?eNN|gKPSVM=agm6 zue%WTg537Lpu_K8kin3bv@rZ7ec1PsX1sq%RYPBqWyCAmQT~dwKfa?TdXwCP&`T_OEZKpVeF1691O;kG-Xh-`-L$ zn-9U7V2mBj6_XwR>AWFfTD(bQHF&a~3SKdt1--cw!rd-6W_ zo}T}EPxJ7B+GQVj-uVM5%YUSNhmT~K`H}Ws{75zmpXjpFCvso-i5^}4L}6V%(|4E8 zv@rWKX;pouLZvnuI<}2Y=d{tdYi-of?F)sB`$Aurexa=EUr1B+D;2nXrD1tr>CBC< zG_HF)HB4-$kQMFp^=3OQ(D+8`lfTiHRo}?0{u>?B`c6)s-|6O>@8ommJ2mV4pxCKD z=wJR1%DMN0w0r)ft0gR7`bVE<|D%ZQ|LEQGe-tvHgPsO< z(2U{^y8W_)O0?wgY@{3vJb4Z|Rt_uI$l=;yIdr-s2gz4C#OTOlx1~IuPLW5CczL+x z%VWV&c^thfkGJje=-s0eCR%qwhF2#XO6Y{=>pDT}cqcgA?}VuDov^j10z^@(ZqlmGoityd6h`7^=$Z1l<=HH4a zH&8-_poCjKN_dj0g!h}3@awb^lpZSaSyv_W?%fpw#jY4KvnxiWb%ouQu3%@n!u}!8 zMgQT~>FC`J&SEz>&g=&Jv~Cc$bc4;AZW!^f8_fQ6gHdl~^c0n$I#U@Psmf^Etc(|@ zm2taC85e#l^X;o(lc2(Li7JRlRe{%L6^N%*VAQ07F27aKtgniz5>@P)p^EGjRRnBO z1)Wkw&qh`5B~?+?OATA>)DY#Z2FGMIXm3=*ixX-%(4dC&A8Ht@*BzR+-O(_uI|>rJ zBXE6pm>lnpH}|@u^jmiX_fSWFYjr%Ds*ZK>>X?|Xj?PEbapI0T!oI4*Kt}`Bqco7@ zsR83y4b-mIK*Avn^sd*yh0huY($s|F2u+l@Yr-i?6HiuXB6&a0YTwjE=?6`S-L+6V zR11C+wD2KZ3#qwUP}--3mDjb<^PLv9Dr>{gTpQb6wb6gBHVSgIVX#XZ`BmCbYt}}V zq7J?f)WIAV9W(^#VDv&A9NM7+gG)Nddai@F^15&{(nYzwF4X*W5hml=?rpm0cTN}a zk91M}NB94*_wMmAU0wX}k&GBj&9tV31VIqu5)y<7E98oZ+!N%2T#$rBGP%!8FoNk3 zm)@19rB|wb>S<|}mP8Pj*0pt~s!tWE)}?jVyx(=s%p_WApU>}oKcDxH_dTD_I%my3 z>#V)@+Iz2kU3;jLYde~yYe!#9YDdb_b`-U;9j)Bb4yF}n4&G@;Y3_7*bb);|II?^fXNN18e(rF{kHeB72j&AFS za@vu0-0MgmJG;=ELtSWjoC}o|xKP@QF4zO@Lj8}rkotxTT~oW#zW%QC=6F{s$#$jj zqAPWI-<7WIb*0aLa)q8c(byiHs7+ueIy9{lEuDwoYdYb4yH2$ATqm0SuoHE0=}cb_ z>r5pHovB+Nh_Fs3U?7FVBy=6Cg%A*@i4DLp6rgfvs^ShDf+HRD!qZ_?`vo+yHix0KD(vk}l_Bo5Hr<{6V|J$S!ulJ;dU-YEd(>SxL7r`T)2E)j$!|<=s>hx>H{AI?47UdLq+fRp~JO($o9>99jhlVxLv=se(zhRNAJdPjGy2gEb3fX;rXT(1%YO9E>3;O$oqjY|+n=Tn>`&vu zaW-;Re`>L~KV5jcKW(b+PYcfXr^pBWsiX4%I`1=p-iRDPiL(dLv*G~S|K0#9+ckhZ zz8^qG9u1(vj$YJ$s26RD_QKgSUUYGZ7v-<_B4LjgSuT1}n|d!=>N1d8`wpZ9F$3vt z?m(JZIgpO8A4ntj48++X1IeL&Af>nrqECkoqE<13Xj1MVdUweny0&f*dF>uVIo}VW z_a9-ee+O@BJH(qtM|oqfzBfJpoHuQH*PD*)^roxly-9fBO`7&T)XCe2dQ9-4-dTV} zz~AyA*Bw5jKI21=Zu`*XX9m;3{)1`b*uhkpF_<#u4<_B~gQ@k_!F1wV_y*hkhSKT|zSLr{FU^YZr9)Z1)OV3DRlEs5f-il^|u z)x+o^whIgk9)`WA!{}YZFgpIqFlzS6F!DG!jK*FWM$;9;X>OO{^y2X0^j0jNRXUtD ziNopBcZbs_)x&AS+2QoYo#C|f866e((@}D$j&J}oxtMfx>s1}jvC+|s2XThc6&-a` z_|e7Ae)O+leiReqN6mBm=wpi?O@7;t{@9N2Q+_n`H$VES%?L{BJ%TO=jG&z45p<(? z1kHY71pV~k2%5YX=N?@gLEeu>(5vl7(!GHrDJBfAn;9eN;oOllX4Obqu^IjghelG{ zt0O54&HLQWL>qmH&O{LjvxvGbA{w!lC}tZ`#+T^r!Of{$w2CPlfURlsU(r zCW-zy*WaJ|?C_^nr~K*1oBs5LY7|xW97U7-M^V>FIA1A$6s@fsMHAl}MNd_aqHU)~ zQQB{#NZDpIz1M3rjT$wYj!zm*8T!$5qjEGAy*HZfR*k0o)1&F?t0Qw~_fP$6;(5vqR(53AG)c<4v&AAakAGHdk%iROXbwnVIiwh)uP9UvZ97tQ% z2GY^3fpqCuAkLc#B*6)O5?uhkK_o;5(eE>HPVD?3IH6(Za#fF^(Y?k{DvhD?_%ZZS&KP=k(HQ#A8)N9R&j5$U(8oWGp>_3Rkk4bu zJOF2*hm57rl(A@E#?qaoW2yGtv9x0QSc*M9mbAZ&rGw4K(fm&1XyD*+bUJJtnbO9Q zt6>~%eqkJiZWu@3?i@!+r^nHS8+f)1L%SJ9A--Ys$%HWKI6aIErZ77BQW*9BFpSD~ zh0*>qVWhbgMiH&Xlh}1URr!vm>l4Otg-52xp@h0_GZ1X8<9pnU@;kTG-u zd8SODZwe-0FXjY#_N@u@!RHf*4o{#1mnKluqX~4ZZ3Io|6G6NEBd{kog5H=FL5c+t zl=@l(eYr7$G_?_wd@h3CyA?rKT1HY&w@6AF5=qO#B5B*SNcgZtQnO`|%G!x{C*f~$Es8#O zjHWpqqN&G#XgV4gjlGl6!#nJYxI9fb6 z4r7KmYW;p3?b;qkg~#Hk`{g(~@Gy?DpN^*%J>zNh@ObJwA)Y=>ji=$o@$}h}cp9)a zp5ELXPi^+clm2`>eR~sOEfQ#fO9CAmkU*}136zqMK&!Lydu{?LUP_<=>k}yU%LLLN zNuZ@aCg7Z#1p4TyiS$`l_`eLENSnt@qzy?EY1N#Gw6J0#Wv-k^p&w49uGJIi);ANW z>heTd^l&1DXeN<^`y~2o=p@P*H;L3Klj!5TNi<>MB)YV65*2+oi5#mZ(c*6=QH#ry zXx@WK^jn+BG_4!XFdICXJjYC?MTwK?Y|dorYo1JnFHfee>)|`|#bg?A7-yXQFqtZE zPo_^=Cek;qiS)~WL~;m7BuyNAXl5o-M?)gDUzSKuy_ralHYL*K+C=*5bRuoImPlqH ziQ?KOQMaB+bj3G`){je~v}Bx(HYbT{%}JE|auPkWK8ZfsmPEk^ljy{SB$|3Fi7quy zrgZ0II^QRmB1a_C_6f=4J}sFl^vQH#VKNO~nM?~dB-7VlCX?oHGL658-@hf(W~UUo z;G9CuJyXbiL<)_VkU|ktQz$7vh0-hFtMf_OR=?-cSFJB5ClJcZWGnnE$(UhFiLS`U~?M*pdFIdUqEPn}91>Zg*^LiqW-GL_z2HjpHWGe8(^9EEFO}Xgr&7?1spu=El74e4IqXTL z=Z@p-xSvwVatAam(kRzCjZS-{(a2$G^sg~#bbDeNg=VJFOQmUa=D9R-U6n@h8`5aW zwlvy$AdP-FlSWQIr&0HZ@GVlM(>T|3itC$Bll=f;=@gTgP9fRpG}w?%u1nJCk5%b( zYC}5mHXVMw=@fbdYLhlS(I4pyDj>(|vgba$EkwHHcWl;8_ z4Ep8e49a>pgD!5)py=HhwEde5>i*vhntv;U&Nxh`{?AM&Lsy*t?KPd6`%fqT3Dc=C zc{;s2YdRe^OsC((>GaI1>D1@_=``Z==`?2Vbc#3uxHO%{{SJD?3>wgO203?|K@YrU zU_3N~Hiplj`AOI%l0Ad8Wi#j-%M4oj>I@qF-VD0Fc?PZAHG}+)f%f|ulzV*!HLIUN zOP-oZPrJ^f6@6w>>tQpgJY*(ai=9caX*21wyqTn(H!h2+5>fv4GS}`f^St{ii&W-l)u^ zMXNF?bA2WSe};4Uc4yKrM>A>bg-j~{C6nl3Cf#e9MIW}$!v9)ik-{53QT|yJ7@kFE zCTG#CnOStNFpJ6;WKsQ!EGm5ivrQjlQS#O-s;$kUKHp~1;)_{y;nytmm$GPXt8CiS zKAV(1vMFFtHkD8|tq;qlV-vIKZbmk>*JqR0yle_wnoUuwvT4$~Y)agmO%r!!Q^cWc z8g(|C`d!J!p66`3t3^_e+~P87_d^7*r< z>#|w&<*Hc}vu+msxM>#6sh&l5z6RatS=i4#i>BY2MaS!Bk-us-z3n`k9DB^B$pdH8 zM&8A<@ z%%)pE0dCEvYxT3~Vr!g9*gl80cF&>L2jq}ZmqW23In+Bkhwdcj(2mR;nqQbhG#|e! zb7=j_9Ey7G~_I(jUJQoqZgU$5p+!R;Kn-7J^#p30@4oO3C`J(p?* zvPmq~e)pO!~EXXjDtl02GV&ZA|O zd9?SHJbJV?kNSR)NAaKLQCU?Ut=gYQpMH}^2hQiwnag=}>1H0)J%rzxQ$GEq$)|H2 z^XZ^_K5gxvPiuVhY5r*VoQ37n;JAEhF(seAnVCl zALi5C&+@5DHO_t9pHJhz$)~gD@+sq|e5$*iPg(c#>5`+K5}(r3SMBuV>!znSdh1E> z)>D$7o;C&P$!UU~ViNSUda9nj%hXdRy`JKY_;09%dfK`SXGOlMhhLzcdT-EE;3hpy z{!&lbd-PO%NKfS_^)&B$Jg?$h$y<8Le5j|1%?oIBn*!?DzJQ$E3g~-}0{V0y{Mv>W zP;>zPBOt7R&c+nb$|U%^WfYJi2YzlvIDc|(0X4G}(3%zSiF>Vpj=Whw(>4^)ub&i9 z;THvTZx^0lqqg%ozIkouh|q?SLx7w>8zeSEW!=H4%)u?|Jlrd1Ige7cA% z9g4`mYZ2Y_D55o9MHK2=MAxW@mW05^ZbA`lk1L`H$whQFy@=9h710%a5zRED@NPwCCAk`oXoB?sqT7S)#?{I;fa>4J)R8{y2v-q?r1K7n6Hz zF?C2Rrk1J2^xMp0I+I&W+lz{6wW*j2E8wrUq?kIrP)t`>7UK-YVvNh+|M%}=y1A*C z)^97O#GUxxhJEn&J5)@Qj~CO!v&Hn<55+hex0q_L7gNHWV*2l+V#-#O(Dha&l=E~6 zU2R`NQ#+T?F?aa)d6v)z154-`-xAV~ETJQTCDdnJ36)2d(Bb$J>XckU>1ic63l`ty z;+)W;5=t_{=g(Y1)s_W53)Xt%ler-`oyPqnhm)n+7T8C2V z*QJzhxtG$WKBY9rtCT#4l+p!VDLp@`lqjT>u7s7+(x_7MN+_j+Nu@MBwUi#sD5Yhy zOHq$X>Ae#0C@-at7U20@DXm)uU&EJ5F-H!6#5drF_)aMudB2o=Ho{+VGveP`O2Jj7 z^xE!Hy1KuVh8%`J^K>cve@e;!$5JY}T1x-^wG=)!rS#POQW{!cN=b?`DsNea z{!tliX3T87ckXlQ;_gi9uy_Wo#Lpm{3O5 zF=e!FVi}3aWt5d#Mjzcy1YWttg}aTFU6HrDc@-LK(Gt zwT$+!E~C=5I6L*-GCKTz85Mq1M$Vhc=(8f)C_3W%T~Z zGU|7(j6V1t-(4!BH?EdZ+h5CQ!7a#q2mX@}%cw@c|8+DsP(@3ev-*^QhCgGVa3>3iUG3LLURho(8((XP`c#3^XaoK#Rt}&vCqgjz=2kUaWzf zC&BkI*+Ao`8E9Gtd?GX9|2W$~OY;o$a-o4%mBNS8gy($xUWoAL3^ac!=$;4t%lPg! zeE&N5ya|5q80f@$1AY7<{4M`upybU48t}P+9(`e;+A942;VuJ3?=_J2E1VB|$Uv3H za5n4-1KmGupbh6C-$es8zhs~fuNWxm8qSfu4j<0n4AlQFzJFk#q|wQf9i5-kO2$vW%q4 z!8x>f2rDqsOT|X|vdl;qO-548Hy5PS1IYG~k=A_-`8OL$++w8SZAMDnZltl*@Fm@4q-Sc4bYq{9 z4t{0C*~Uhid(=p=-x{gcNh94kZKPf2jI{Iu!hSGP$4f>!d)Y{<>+ruWzu-SyZW!sn zEqrs^NZ$A0qx!%Ie_A8ynwjVaM-y3`;H%jZzM-v6l-UM8pHIU#w5^E-w}a29vxz3T znCNmR6Y1Sd^hY-nRrG*As0Ys1?PDTUKYTv`|M@Zq=jQsD=;ja;r4NHIsLn)zBk>=X z{_x)nFwwjq6I}{1QRr9`tqU_z^9k_Xj5N{b(I!&InJ6^@XY@`2pCtH#rkH5eRLGW! z|C7lu;Xi9k^kF9cr!Ct=9yunOHpfJ-<>Or50uwnFD4(CK*-jlTez zizeFt19bhPiSS3I^!sHKy?@n2$v;D1zu>>?euZ9cz;E}KiK>4?8gHAZ&0Q0He9uHN z58zAt5OMxtqW%JW4V%HA&k_D?3Y>fE1RqW%{9Rj?)5zBF#Z{@)HoOSY52oE z17AKZeBqugr~LNt+jGX5z8&E&=Ys#>=>$K*&N!Rbt(9Q!_(+b0f8aQr#Ty1c(DCKeWkNY6 zMBt3xNcg`-!Cx;Lex0%KtBiy1V|+PnNr2DaM8r24K9Py=15JWYVKTl?LE5Jvy;Bi? zD!xgBUu!zjm;t}T>F{Hm0e{??gRGUDuE6MS~d%gJjl&Q_iWKjrz5%MAa( z1@J!vd{+Tq%!Sa&BItE7d`2xe-}pJ`M#TRXErD-lCHyCsLT13%%iz1Y9QnBd`Sv{C zzW^WS7vZ-E`1&P$|1x}lUx7TYLPsl+kAUje;FG!v{8l5q|AL<*V8`q5Cw&7lufh4q zYs={j;Egw-hqvIP`8IS1c>p;IA{4!8G88?@cfM+fIM*+Tj;cpBWwGZV75WFA0u7HpOcmjgHf}c0Q|7-XL1BM)ge=eZUA*2t` z@i5{BI2}PefL{UAj>7j85PS^&seoSJ;6I=Mif_v)4{#nZ_BecG0d6PY%MG{*n0ON9 z4bbZpd|m-J0I{c0h5;^TP%Z)I03*)gJZiuLz{GQi1JL$7e1`%10q)=7OmDymz<>+T zE8rZ!`+LL%I0qPbv79OZCjh;FD5p}u0f5VY%PAA^IiSUl@C^s71zZF8UP7G)d<|&- z6Ko1#9pG2MkjwBf2h;$RS8!%HU^(C$K>MqZ6Yv_~48XMxe)51-fYSiypJ9UlF8~e! zT3>_y0rLT00B!>Y{DSk)0c!v!0qS3oH-Iw0e*l*NF4s}60P_K#0xknO-heCsBjDeF z^ME!tp+i76;5EQr!0&)=x9~ln4Dc@C2;d>0=Wi&-fD*u)fCGSA0GHoU)&VmC%K)1J zX8^)&_<{q*0A>MJ05$A<_@%2OvNsU>YDFumJE9;2prHfIWb30Y3tM12{fH zn*rzw7yuXv2m?$6Ob6%z^8w2Ms{rc&n*r5;uK}k3{{>tJJODWTf&a}0xB_|t1_E?| zAixB`M8GsaHlP4t0xSY72fPYc3s?{M58!h^HDDj$FyJKMJHREtHNbCx2LOk9=m5|L z@GQUu&=t@N&<`*O;0qW52mpiv#si`N@qk3Y6hJy)CSW!o4^Rjw1(*Qy0Sf`o0hR(* z0A2#T3Rner1Mnu`9l$!k2Ee}o8v&mHJ_T$6Yy*4=r~>Q+>;mio>;oJCd<{4RI085d z_y%wsa1w9|a0YM|a31g-;CsMDzz={Q0ha(j0WJfs0ImY+06zn+0e%7e3Sb}m8&7S zd(ABugtnk?LPtUno{_M{z@C<{CBQTiwj7vR!d?W{M#5eN_LPLJ2BwlQG05>`_8F&(ctdk zvakCg(Ql#XvsCo^lE1VdQ1sa>p?Z9ycXt)FFN=K_ihfJQot7AP_m$?0j*dIUz2a`h zs_!}A$EoVO4xT3w;<;12EY`{-2(tvbyFqMs4!;h>?Z_XV*YVzSr{j$ykHo`{bw}=d zS5=%bwSq8O@xZMOVvTOMv7;CUDG=g+s@ch~MGwu@3f=BgiHjZ@u2!lB>24T1gO_t< z%<_kLYJ*QXoDAFe(0o;)yKyRUBZ%<1JE)%G)O#NEu7Z#Ctqm#3Nt0{(Az`x4eC-&g zRby3~li;f5-!6a_LjR1J+3EZf*B|wQFx@d|cw%5q(d_J;scDJXGp7~icVf}Z*=adN{Zr*{YH&K3(QV6Mla(R?!q+kVy zP~#9Td2_oo4sqrX6wQXOx^V~!o*W`^9z1Z+T>NYlGHCFSxkyx_kb#4I=iK3c(E;vFaz7KWq+Y_=-amQdncoPBIPH zvNp&5dUsI+XMcq7*FK6n$jw)nL%*-COp(V2^q+m#nreF@^4nJo-J16tChy4XsICb zs}+DXf1>jjG@~0AMyB%z3`BLBBULFuXeEVtRW;5O1VQD3@GWS5x6-kAZkmWGjWZZQ zlDVu0jrv*sC1;+$2Jtp3KDHMfK+}P3ATBnIP4Qa+nzdFsj`vCYA`rd-G!LwFTzs11 zr*1C@T>yMF#m@~ddV^*R*DqXLU7O;!5;W_rbWQSuK%ao-SVxJS)aW$DZv`ydTDESu zn&MZ5cN;*H<;qlYb!m!UIcSzy>6+p<7d%#irb8#@CRg#M_>BThq?N8Iew-hZL9@Y1 z_jmcR12l*JfuBDjIt7{zFn)Y-1#e2e6wu^Y>6(&n3cfD^&8bFoP4W8yG`AYjJ*oV8 zA)-g1>DLvEaj}VPieD^f(yes(?1|-hBf@h))1?~_Tx>j>;ui^;saCqC_)Wq0S)e&! zrDHSS6u&E=x%UtJ{PDeGcR>gM@Wt^q#cw=lk{Z!HNq-RzXu3i3Sr3Vw(DHBiJ>63f zx&ruWD!ts?d4gs`Z<&s(Q&aMN-bWDj0r+Z)AD8E2py}=@k^OCc#DXT>O4k%WH?YY8 z&9X*xP06PMdEuP~H2zjP6pJSL#egR5ANaZ9``Msb z+K8?x`CbLhx<+(Q(z8GKeGHnLjp&-<_YgFy{`de_Q|aY$)ebZnR=U5d=dXfh-9PYi z1HX?!bF>j%Q}Ue!&CiYKo|Ik<_}#YB0F|z$_&E(gS^#`Cm0srOW~Gq``F9ij2rtn2 z{{z1WL^KvOuW`Y_WpAhR8uhxZ;a9CR5+QE>8h`)(f1=}hbMr5BUj9$2AGbm0G*IT& zRC;sqS_7K7RyuqA_*1+r_v=;~nWI&{C)CS#LHDVZwyAji!KCU>{F>6UFbFaN_-cyZ zT)gWDn%5f9HO233&}?c%_oQ;gdf5(|{@y@valB3O^94<4Bf2N?TaNFeKy%SbXSW+q z(DQ984aduuR1W^sKlMUJ{QO5< zd;%SSucr91Azuxe)uUxP?rt|F-|PTEFah{#ir-wkTMQayAXEK)f6^5+eXVp&@niXh zfM!UD%DcNXBOxJXfA}xbc(;BQ;varWB;Dc4X?edG%{t=dWitt6f130>0o}D z|0BQWK=;}|@VgFvZ-eH=ak6wxrPm*?zp&ECluf7OA?Q?LGF4OQV1DhaH2=ge4s;p+ zz;7e+Hy1Q+5i++{cu4vCr~1a}TVSQJ#f$#N6YcKeC(-?>ylB8=$)D(&D)*~F_koqR zDZOk2zfVDv5h+WDWHnij7J%kOD_v9ks_^1<&?HC8{My?2J>C!FcHT8crm@}Se%N2> zx;}~SPkOlkCOtvt6f1LM`JR*?+|FpMG%{t=?Tj<%JR0$PlHK(JlR==F)`+gD{Ky84 zp%LAa_;GeE1kG_Po!yQ{>6*%4H?X+` z8m9!A-`~mC5j1_QbWQQ&{)-Q27EF}+wZTKu-=Ff=4dI$eux$Xo{x04?(8O5jnu^yA zJd#0U`XBf`51Kds2Yw%b=BxjK-v!WI{|A1om;0a@o5-n^r`(&;%W=@$w$lBbURoug z4+G%Krk4SMLBXS9!(zh5j2_+%w}A06-P|4voDdcmK5BeWbT>EV9Vv}WA=lr{GGoHf zdr)GWH1Qma>FJbc{Z#$T)Rd_7?DVPm>51~ZB2QfR&zY9#E40;cem0jT!QSeoLNqbm zyN;iknwOKGlc9I>i0bV&Ay+?h*38nGv!}ZSV4@nI=5aFq?_W=Yg_AU0fmu6Xl7Wyg zmP0LJ8r)?%rjh9|S7d$bW`FAejA@+&HVg6>nEh8&R23-9d+Td3=dZzhzcMl^;xY&X z^Db45GoH@^m@A6DbeE@380F9w0xyFoE9%t?uHa|oBAzRd8B{L2fQ*ckm{rCXM@fhn z5(>r@Rr+W##0QVCSnq2URi**aao%UVZ{w}w9{Fo=LYU(L`D0L;cPWF+d)&-58r@~X zspQFGe5j3Im`z+|k{IF#mMv`o3Na+`Prv>D^xOBb-<1=btud<2yA&1s^cr!|UZe*^ zPLcJ85%&2eB+|R;)&}pY6lo1<`Eu4zSAbT!yGd9d+%eyTFm7o&OIR}QJddUoN^$2L z(h6of_M#no+m3NuGTkmab{H5>m$2?p38gz%m}XKyNBqW`RhYXr4q54H{#hgL;uR>1 z5@BAJ2n9lYETR0%%@UzP_PZm*IU+Jn)~0!v8;V2AIBNk=Bui-=0(;g}C}}&AT*M($dx`YjLl~ zB__H%Ta_w4!0Htio*+@*N^=$TZt=DXK0{HNpc;XTU@Lh zdQiM09uepOGItPidenAMQwnB<;`@IiAIG;>S zq$MC!`c)ZSoLL`b2?(>k3lpP5D+3ZUg^0+gXgTb7IsR-a2s1=HE=Ml74;N0hNyjIwZJI`Kdg&I3{1Xy1w>_^-OOBm-o z=eAr9+Hownl!8hM;M{5~!RJ{B^{Jz!@^DbA^|EDXF@iH^%%Yu|xNxt~U9M}3hydO4(53yQ}|P2D~=k*ltY1e0kSqlk)?!YbbI6Voh7Mc1@A^=8dO;q z)F%xWg1S!{%XVc9qTF7F+m#>wsIRvbLF<$2E7xePkd8Z#eYHXk?jt0u7v%avE7_1b- zRgQPtp5paV;Qj*cKCRx#>Ey#j;=?B<}Ce=#E>b55= z!AeVt=|O{7%dGMh!zzs%HJM4c;cn^bYO+N-R%ol>BdOPa5smwAbM zl54!Hmbg~&xLPaOGTEL*;J0kgxJM_y1tR404Hw!g{!B_6QozESO$p8PEw&h; zqU0JeSWz1+)mJFh-D)(%yIkh$_3F4<%-1xsx3wwBH6V9Hm?T|yATa=~RJIzdW(hpv&4=nyjo8u(azQ~;r4bkIlGJHIql&lO?-KNb#HC+x=svxN*e=t7 z8@H(X!=e+^$>A%-z2;q7OR&Zgr{&@jr>av~Od5+xYcVM;CY2bB5~uCHQ&(G{N=cT| z3}fJ01FPX2Y0b~m=<-yY5$~3(4M=o;OA)D*h@_TO&KT}U73eEt+*PnjeWUCam4lOD z(Nx@&nroZElC?b<9Upkq6>!f+G(@QarYn+dHrFQq(0 zZRX5T#fxpA?a{W}&<{YxcIJAXDa1!heKWLR^?GMZGAr1;$Jv%p1$t`9TodJ_GE$B* z*3creHJJpE>sSIujLT7IA<4k$;WDC$mJEuU`Rn?4uD!u3@sxNM&8cf0_og&ZpLSlg zfZZwP!}Z=rbvsdBq^?f+GiW~d=c};uM+4Aux5TDWshp@(NZOO3g$&7U?n=AO=@mtzlO=IOJ`|cdp{@ z?mMOCDGsR?@5jf=d~8t{1c1oH+5k1gQE{}qC(2z_z8l*!Rv6nYbQ7Sz2K&ap#odza zlHS>E0{435lCTh106;4ow1-`_hXE0KA=ednItXo~Ea0*vYaH1t^&{Q5`{E{7dbz8W zDWJe>BpViCvslo}AFz4QO91pTL(!D#v3G)1 zb+4x+OAR#A=k!>uXe`ARZdj$7ps8W2A*XXZFuASb8o(A@?&-~xuobw=wE&2)5x{A8 z6xv9ojlV$uJq5Nnnj_TWp1IOyF>sw>1S;f(Un{0@;AZLX}tp(R@IbI-APl2C~*3koNiu2tA z4E?1+L>SlnQ1KjRf2i(vsRp6Of zjFoZCqQqzw_xREx!~kV%BtpHU>S`Y)Nb!20jxQLAFHw6?Q#@)|X>7e<4Qf0Ox$LQ^ zf}K##yT`^aUn%}-(YuG$J?nTPQ)qiW(;?d05xtD0has{seCihwEBB2X66SyiGV77F zz8JYQ?l?mgZsO^JmgWcOrp|||(DNB3RS+GxB|_+g2>#4olz4#didQ~(<+f713$(9z zb0s=XHy!V_y;au@0d9B~#^Z^KGu$>B+DHtQh|AfM2rGnLlIkTq#w%wnYSiFDsz%G_C*;_OaS1j`QWxg783# z_J$?!hGgw!70bpb7Tjb@#C;F0Uvldtw@J>>SfLcgEs;z&4wzh%=K_=KuM&;ATswLJ zYpB0t@v9ZSZzVh{*)HbFW!P70v;yPBU>`9&wE9AGtF;m1d@RACVsKdXMTKp25RRa* z>hB$7dn8f#S6_6Lv)mHw2OiZI6jqG{2jZvq8FUuB>vc8ir4BF~v2_mKXLJt=Mu_45 zVjP$G7|YXQoFDQhBEr%tGR`vEW(tt6>IF+7q!{d1i?*u1zSdvCk2-@G4prV$M2U)f z_D%v91FabDSF5-u(FWd=i6@A0{^FtP?-iAbtzukQwB!B=@kAu2^kQ?zBlcEAi#~>y zV^Z9eKffz~t^rFiPHEBJ;}#1{K_jZ}iZOQ;-S?aCp^Wkf0dZ8$E=Ez(0JNfFtNB2E zgl#CVL^%(0cg?J~c23X|RUB0>IgO;1qr?d?vFC1 zQ+!_Vu|z5J#(OV&G#FaxBTRmX%A;`tt%g;J`XuhvyHqMVph9Y}U3aD9NvL1jcBdpZ zcc4yzpNE|vL@U?`Zq{igw9LB{QsdkY3ThBnvJ9ZYThAJoBdAhx*8$bcyGpmWTw`z= zhOm6DY*Hsf3=fnnN-au?MXLl3E2&g)o(A4S|Ky%3^07?yKwgO_w1YO;*d-s#a!v?AdBZIj#IEUc0(HhN=r1l&^{r$yXqwlkLv4_q&C>sKF87y zg3GO1Z#%}LOt}VQJ=2QC*|8Ua$+f@6j}$Z}*tqJ; zT-<@lU-$r%zX-R#MMOd|ezn2VQD`OEsWRXgcg3S$yM^D24?pJz_dwXcz|_PDDhjOFhM zkVFxJfbpde9FR6am=BQq8mKJ)hcnY0x3#}AgLzsjJVv<~*IEb0NR%p`2Q{`47lxM_ z3@;mIKY7UY=kzTHHz#Q=pc0r?=z}{;td(+}Q>qp6rr{yj6XqZ^mlC!FVLUy`y&4Ug zhESxh6}N*t=AF!A-p2zlB6c)1l7cYDo-^V)E+G{I5eFk+Rz+CI5J88HG zw&=gsV9wQMtE5=C`_VW>$UJQG5LN-SLImzFOV}LTUy?A~q~!6_K~PFL#&4{H_R579 zP`+g$Dwp!qzpYoTw2t5H3gjZ;2G9x}aPKN%xCvZE`NE(atYlf_tP}lNLr#+5HL!Gw zEBszAZ(POK0^}mpkze4F7~r`E03I-xD6!7cEVwk0+*h6f_mXG8UF8{YH>Tl|?%c5Q z;l@hh%Fh$2avURo@uid>!n=6>zgvY^f+ts@4U%j~lEPe!S(PWNP+GX)DG-?l=L%mo z9c~0}%LgBOnPCc>25gj@8&N9$mXhrYcaM}(_g)M8V@z-`bQY6*P$k@Sw=mBZ#Fd}} zW=j_=0I~P&x-0e?g34Qi>Gqt8Gd$Uew*sD$@Fo%qd_|+5d5@AuKw`YYvsw&SWC||( zGnJ9n%8wC?<6h_ltuyG%waRg}A$r07@6e6StdBj1#R#dsoW+3aWOI(9ZmcAdev%mL zD+c+&UZ6R>sT5tWdma#DZmL{jt}CMCLT_uPnOWT9yv|Cz&bhkVY9m)fZeuwLF(|b9 zQgg@am=(e>zzuyO)be&>p%xQz&p7T$fwK>&kH9=BYcQo}{nW1L<-FFo51pe+JlxARfd)juI?vvSeuKZ6EOif)<0QP z%xh5ca^^UMZ@9o#D*VTR%XI|9byPJ6Ly{QEgW@=`n1@bU-67++ihag@u~^)^=6$=O z-qfLvrO;Z3(a2KAlWngC>+Tq?h~Flqh&7n15_8dOJBT87P>eaK5)B8r6Nvd?X%dUu z3TXb<+BSwHW}ZoBS1+kYNs!xZM47aukQ?%OyO^{_TyowVW!%FvwA7h2>P4G?q73qoCpf|q93uuNT89mlOE2I{*~Ua$=fcgHuCLPf zMQ=L{A4SQZNL8qz!7qX|Y%Ht-!HbUv?9dKC3vlKrWVYaAU%*4xI$;O;i-N9Jz2qG{ zF@ovKpW0{4c!0H3#2Ybg3Rhb>!+%eIHJdEGA}tcpU35)^@Mvfl@^asDcMqS9m(J5eu1tx`HQJ zq_LsfpT~w;S^XFrwgNWHlwcTvWV>3YR>Bi8ywL5{yCb!(wq6w%#kR6Sk+6pJ<6~oF z_PDyHt$QArG0j8UF>K6}bN^4{^BX z(nSjU0C&0f$##k-QMFPXye46s+47KS05GEz=5G&+w_~r_F`jbddaM=B0@F#@bzt&P z?GZ3Jwic*uvIHHtE=qLcfXOn)*|98O!=$&Rc5DH#pQW(xfL)NV`@m#=_$l;3^_hvM zqwut3tGMNDAc9CXlz*c z`x;o1HF&~~EV&93CN6Pbjh`?q`_%JKApp~%%Z}h_Q0n%o7u7P!IG-`->v$CVidli; zjp|E^N_~H&*xz%vI9uWJt?oXS_*)KJAo0mpjxqnDL5pyKzhGfd-rU4|Ob($fLbHS* zI5Zy=^#>J_4G9QDhz3U1aW5t*{6epkK_!qNlDluLcgA;0#_G zeh*Gs%%Sc^=c$c-4pkxkUYCkCzb|^0KA`mSJPyn^!sU<1cx#o1Ny7^t2!Tmnmp|fd z-GA`bV9JwcI)9({D>wD#^OzDY*BYF}YTex;G|3?N9qVf5;}}C*XJN5NK)l>~r@CT@ z!YW?0QVdXe?uQVrE{9Q@)1o4+v(4gV)Oz!yxlmSUL2GPN;q3!|pwJ*W81s}*LM6VI zA0r8Z>T0fTWsRhVtuQ5NvdtHx{SiT5HhYTa)D<`QWekLr>&7Vya)7w%#;FQ25F3y0 zLgj=bR%i3^dM=*2>pVlolg>p-;0C12unbWx-DQMNh>b(J)AX+;BN0R$InlFHreY zhUUYvBJ!OqSrL}37$gj4F9MnCE=I>VUbg_>+8)szw?xO32N>Fj0TECTTQFU9 zk+;pBBZ<131o$bir%qQqZ7u69;L_+ug^W^~fA*56*ZkwL#O{5~ zszzS*Sh5dkw{>(-X4Dm15P(wWR%t4ZvaKOYJzL(WfB~(T%mY=FK{v+(w&fdZmll0j z`xkZFu)(pt7#>lHNe5m5z%HQ}EC7T{o%p!W%x2bV86F|dj&ZC(;gHCxA#hmRZ*@o1 z%hC}cj5SJu+B^}sjXUD@sN61XsFkCWM*{Iy`wfF+-sOx6VVDeFUggcPbW#{0nx=?x zf#R>#KPo&`eOvXepV)*vV3r5CPf5M5)hx~QQI)0jM~X-q{8 z)>xAf{tumJ?&>0+H0VA@S$oP-zG6>Pal9p1?oc;~f}A}M0bu7?1ba4Jd0IB^VMyrX zeOY9eZl`+Ld-w>MfR;^d=JJL$m{3^pFwaw%M!MU0qLasgUe%r84455L-Ur({YVzH&7Z$r=8wp(gbmJ~KvLz0KzZkS4EGtA? zG6%K+O(BamKOH#lXyNH2FWdA)2gu7cL7t9gb1HAum1|@g-pGCD0$_68Tm!5gpcRhU z!~P5G4=IfM0z5OM6-vNMwjHkm^OM5f0VdZ-?rqDp`Gy_)1DI?b6sTabEUv(0JCOc2Jj0eb*Ybsyn8rEO}P{v@m1WWP^OLDd) zIoFbm;SNux%Ojf+c;_TZI|&$Xe3pchHgzKay+wKB5U0Fhj>8WN!Ual9`X_8-=DM1K zSkb7es4q}pC#^?iaIt+fs6>UX4dQeQ>ID^Gg2}+%Vu)5u(Nsz^?D3K4inv-$8ylIJ-sPO7k2D}B7ehTx4{VR;pbyET=n-5f21L>Ek@t2qsqR48!C@N4YMw#qQe25E)j#UCu8&TIo3=d}vuDAKCk`}@r^N_G+x^@Y z6x^^R^LznUdF*156d~=bV~t1~TN}-!$u))VeL*c-9Ih=q$E+22Dpj^Ahk(iU;|E}} zbzz&Z3ZNCZgD5X+wg=Wp3L6eg{vsQgY-g4M8!Wx$rC8bG@LZd0an1viEe_iw*{VGQ zOb&a~j@f1-aoQJVBjJh?kPvUi0bE$ClZG*Rc^F_+NwXc+#16|>6sV+WKWo6bAXUSh zck|N6h;{is#z^n_hG|PTP($q}Pw@nK^D-|nKw8D;RR}T6SLt{J;|;jv__Ch{RxN_1 z%na}`*J^av4O{9Q&Yc8H#Lv?&*7(H$UQ0L==%r*y(%hZT@8ji&^VL#Wwe5D2y2nx$ zHssVeXi%PC&j$9Rq|Xbu@0BqAob9jHK5P5`>!~R{$t^MJl)_ws^^lgfx$zotlv0dT zS=$jPQ*z+oCyJKw#<6DeZ&(5%?)KwUab;~V1zYXD8q~6#R-Ap9_$mTOl+paR!VfS za4;S3HUWmIdzZs;@jL>TO50hu0f`|zu4m(-t7aDE&l*~bAv~(m=&JLT;pRFGmh?8` zH=8Mq7$4zz7~i;5ixWb*^mCEt0*pePa#}x7nLHWO{VKLOTylFsYaEr6Fbekz04;m~ zZKd})I|lX&%tgUg^2Rl^nZ{?3HI4?YIBJR*Dfba-bfbI>*tUpV3biWQUOB)>7|1tV zFc{L+&7N0Ha}JYs)HLE8_P=oE4Y3V9hrU=^lGKU*1Lq63@Q)jz9o(b9lypI7v|TEB zjPUq?1s31Az~fIHPi&Xfw??~wA?D-OT)ng>MuN6Jspzi|$2%itXZ1%sCD#`nit4|rTF|LZxRqtPCT%P<8dYt;0S_T#qqp);3ghs8RlIS@X@@T!d$c;_qd3vD>w(y zx2WQRhpM4fFEAqx^aGY&!5cAF+Dwg?D$!@LbjBh}s;TsAc}lVH$&${)X`b-fZSgrj z>Yl=OPDBcM`H^91<#@thS7YFTAJ1Fy{z}a#^G*ldUXGn*GOW15eK{5(!!CkbV-ch| z!9R)M1!Z|bSsq~Q@pmFXMXrvgGAtcgSF$jlS%u+99v8;Vu;>a8q_C=!hi(Qkjzqn4v4tO4FFIU(U%9wlFe_rQ6Y~rn zrQ2)xfV1#lbu+M5dd4&jd0>x?C*I`P@K?)_gp0}l8XLMDtM`H!#-UaB|7t7lBGDL;xIDp5#K2DM#ezI* z4_4F(xu%j-p~VD(gJ>Nd+jgvD0E`n%v9!%oAy6M?Lol9&oxrEORRDW&cxP40UtEb~ zi!STV52=xLmkZ3EeqpUOl?v@zl6zil+uVrUBR2aZ6ih=9aM}%fNhEojih*8GRx7Hpt}+hZwdNMLM%bp z%7K2ogSpDlyvy1Bp&Xj7w2k_)xDfOkTo^)|9jh0|-?f&!*y{)y+w9m~OVH&?Gml~A z0fr^$XDo#`=Kzc!z}y@ee6}K_>z@_XsvOIu}XX@eq~Y3$95Q)NlTE* za7qkP#z$CVuy#hp*z1+!AKLsKgC6p>xJp+NA#$b=9VxkoSRJm!Sm|x1Adbcco9Kwg z-i`lF47w}E{%qcr7>Q{lG3YXeUW!O@yfO;kMPP|V65hPa4Xe@itUw74h1@Ynp;nqP zP4vZ_L?1g2EXMmbik6O zw@kx3U9`ef+=Bs50vlo8imVlkxQ~{?=G(*G2Nni^n_lXyD87YB!)SItINvi;y;8`c$EO*44y3h$gfzs5T^ELnJ{D;Ggd(WkcN5c6(@ z?k>k;c$YaF2ZEOtK4prnrcNO03kRdUrxeXjRh`@i#$&++JkFggsKeJD*j;Nl#Pdv# znHtWM36dUw;JQwH|Aue4ltMenNU>I|wug<4z9Wj!<8xldpD>-MzxbFtVOwyJYdrJn z%{N@OeSus$Z1zl^;*snab{E(xDf)FVUVn+{B*%2D347BHG066Y<7ZSR3g&g*t7vJP+!sO;|nT5OKW1 z`zSUFgjTxps9va4Y~}};@>-=vJRthLBKo{6UU9Vgu}e#(@MIr->up`E!f;%Q3?hJ< z*PXPE*CV1Kikr1+DY2UZB|uh$Y+KA&ZA5QRqr0PCGEo{V^7Nsq2EQveaoi}ZJjE&* z8S9J%HwIM&;bIU=iw?;W7S&ZUFqJAvV$bs^v+j_huXq3h4ZoLxx;y@X1!lP4Zx9bk zBEQcfpONP)RW(*kIEd9YE%;iQ!CXq*SPO{~R}D_cmNbFw3#Vj{{sWD)U}M?1A@qQZ za&Eo>Ol~tceR96Ce&iYsM0gR|#%*SE>pm&A0u3t(s40pWOlETehYGnOa4XL%6i(8y z80;e?6?kcOg2`>IaH_ZN- z$NrE*VwIKSFGogMg0%AQAk>DR#aK-QB1J24IVwI5u}bgEyZryuMl4_69kR=<#1LR| zi!ch<8i2fiS+@Q&@LRU|<-lZ1-_T0zLYQpx&jFL$nxBEm{CJi_=EAd8G8b21a>?-p zCfj_}8EMVw?@9{u`lphT1&;q)x#M|-f8v(=KXc>KCUYwV_T*ArAaVQuOY#4=OELGB z{;8yJ|LFhZxc^3nEv2G(TQC3rhmQMSVPj~2Ha=mUZM9=Ff81Ny-`fzLQt<*vG*Vy> z+}$1v8Hrz-$3kN8i!b@Blni}(Hg}k$%MCL}DH*BRIr-_2h2*7AO|u4oKMv(@bha2v z;n>U#cc@p`_44_S4ReLIJ+%saFHS@k}io)qchZ+BlPhD_Z4XOa706+xUjGe z8jeT>?770$FE_+B4%rIeHc3%jr))ct~W3(M}Zl+R)xZ)V=?4m&$D%*=iOMmMI7wQVd3F~o+bAt|Ot zQyNljG#E5#YZbL5Xv7#w4Y4u(qco(XF~Rsd=bktB-aSiiGq>-Zd(Q8id+xdC-S@HF zyHwx#58#sL!AUTaFP=Sa`@TYuXG516FM26z3TbzB(I2t-x@Id~oEMT);G{WxE`KR+ zbS!C|z@zCywyBuRiT$i6=$ZT-N0x)A;+ya}_eJ z3Xma_l-m(8SHI9>dyyC9dld4$3i%#|O!r-> zP>Nr$wgkC8#W9?r zg^aX5%^R%>nZ7nL9wX!fzux<lN}>8d9-0)+^)<%rgK6TFb6ERsGZ=^F#%8 z10!Rnt8$tC9Fz;qQ+Ef2ji9EIghA!v75Y=xcvjv;6CQ>7a5#kb4ZW^Ka2Vj#e9)t(iV2#!ibA@gQ29JJu~M)r2shwc2a{ zJ&ptr>-vpIZDCz#PW(|Qi3a7eqI~F4+(_8Ux?HbrQGM@a9{NIk9*!3N@6GqEJ$F!w zMCom4zh5ZUp5-3J)xHgqezf!|?S0HclY-XYXFu2dcdNZqkoy|i`#oI{NaPjeTZ-}n zMS0z$xHk8*J+8<4l+6RoGliO><@3+do;*n$QMn+<1F)H9dLnVv(?ygU9>vwZ9j(5{ z29)+e<{@yp%PPLT@?Tc_oft(bgAMHu3B`<;8;3ie?exJB^f+ZFYgz_r^};jor+XMos1BmC5%lawN#R z74jbN`pCN#@?Pe-j+*@Q`234_yq?4nm8u}`HOS8F-iKDRZXv#>uZ>?cQnY?9l=6JT zyieKlBulwbw@=x#-$U*!AH!uQwr5K0*{_hlu8{XDx$%P)vM#N%I=4|r0K%=zm_W)^{*I4M%ZE& zE6>=z|4gJpSm>{5GYu)~4V6&!JqxP27pB=d`SAh-UCe!6kh4JculPBZa>pyHkR#?f z4={RWarTo(vBHUw|02kdAlv;p@+=i6i0`~d|CT*v87lu2DdI7-8$wAaoFVX}k}=Mn ztKYs5%iu}rEJDNHc=#Ed2ZdsAsBNR7Z1pH^P8bG%DtQ$(^{-{)+aK7T?h~nDScuVa z;-|n;@!DqU!aq*M)*!2k6!G|;Kgd$9=ZBT&N0_GxHQ96S%cZon=bM5&V(f9U4K42c zoG_x0N10~;HTmtGTk)$$fF9G5<@EaV}Q|&I(6$h>KOSYK`txg zib5_cRSKQcK^o$iEcinz7l* zkaUBUN~Te3dwwrcb!E>OOU*$IbzJJoo^jA`hkRL(#})DfOS#D73VHG~kUtXSNrik^ zAx|pgBg`|i596DjBS6O7aeR36Gwiurrqoeo&o`7kN7>*DqyeXhJ6#&ay@d+Gh_KY_D``4hCj$h_3W_p8Q5YJx>z5MYK5A# zV54r`RLB`ud1h2#V^lAX#kLsZD&bH>7>*aJQ7x(mwWwMMi+E7aO~f`6DO0wl#jZB? zi@oe==@Is<4ocX#J0LWt!*t58^8(t|I^ew$dBDk+YsjtmKeR_9VWt=nfsWyTV#RYD z8;({2sZ^tJ(ZlC)cW9KtT+ZoBfM*CJV-=TzE!wf!I-dDeC&H@73s^HQ7<4-}f)Z)0aBKCjgwQnHE&?5kT8_xE(F~6|mYCs0P%qcR zA~)lEMCS|}6h-l=!OS+T!+*B05J8yGYm8w;gExIT%-}&pTRp7OY(k(xH^-!nY>tO) zxl}Kd#;_N=i)cckLNBmg;Td({Ww{nL#pzB!mqQc^~Q8o>Z#vr8z|&q@HjuCC&pT5C!>%9UgNu XLRb+vl4GhJsRj}yNTg%U(GdJURj;C@ diff --git a/launch/tools/conv_bsp.c b/launch/tools/conv_bsp.c index c0a68fa9..d6b526cb 100644 --- a/launch/tools/conv_bsp.c +++ b/launch/tools/conv_bsp.c @@ -6,7 +6,6 @@ #include "launch.h" #include "ripper.h" #include "wadfile.h" -#include "byteorder.h" #define IDBSPMODHEADER (('P'<<24)+('S'<<16)+('B'<<8)+'I') // little-endian "IBSP" q2 bsp's #define VDBSPMODHEADER (('P'<<24)+('S'<<16)+('B'<<8)+'V') // little-endian "VBSP" hl2 bsp's @@ -219,7 +218,6 @@ void Conv_BspTextures( const char *name, dlump_t *l, const char *ext ) FS_FileBase( name, genericname ); m = (dmiptexlump_t *)(bsp_base + l->fileofs); - m->nummiptex = LittleLong( m->nummiptex ); dofs = m->dataofs; detail_txt = FS_Open( va( "%s/%s_detail.txt", gs_gamedir, name ), "wb", false ); @@ -230,7 +228,6 @@ void Conv_BspTextures( const char *name, dlump_t *l, const char *ext ) // first pass: store all names into linear array for( i = 0; i < m->nummiptex; i++ ) { - dofs[i] = LittleLong( dofs[i] ); if( dofs[i] == -1 ) continue; // needs to simulate directly loading @@ -242,7 +239,7 @@ void Conv_BspTextures( const char *name, dlump_t *l, const char *ext ) // detailtexture detected if( det_name ) FS_Printf( detail_txt, "%s detail/%s 10.0 10.0\n", mip->name, det_name ); - if( !LittleLong( mip->offsets[0] )) continue; // not in bsp, skipped + if( !mip->offsets[0] ) continue; // not in bsp, skipped // check for '*' symbol issues k = com.strlen( com.strrchr( mip->name, '*' )); @@ -256,12 +253,11 @@ void Conv_BspTextures( const char *name, dlump_t *l, const char *ext ) // second pass: convert lumps for( i = 0; i < m->nummiptex; i++ ) { - dofs[i] = LittleLong( dofs[i] ); if( dofs[i] == -1 ) continue; // needs to simulate direct loading mip = (mip_t *)((byte *)m + dofs[i]); - if( !LittleLong( mip->offsets[0] )) continue; // not in bsp + if( !mip->offsets[0] ) continue; // not in bsp buffer = ((byte *)m + dofs[i]); // buffer size = (int)sizeof(mip_t) + (((mip->width * mip->height) * 85)>>6); @@ -282,10 +278,9 @@ ConvBSP */ qboolean ConvBSP( const char *name, byte *buffer, size_t filesize, const char *ext ) { - dbspheader_t *header = (dbspheader_t *)buffer; - int i = LittleLong( header->version ); + dbspheader_t *header = (dbspheader_t *)buffer; - switch( i ) + switch( header->version ) { case 28: case 29: @@ -297,13 +292,8 @@ qboolean ConvBSP( const char *name, byte *buffer, size_t filesize, const char *e default: return false; // another bsp version } - bsp_base = (byte*)buffer; - for( i = 0; i < 15; i++ ) - { - header->lumps[i].fileofs = LittleLong(header->lumps[i].fileofs); - header->lumps[i].filelen = LittleLong(header->lumps[i].filelen); - } + bsp_base = (byte*)buffer; Conv_BspTextures( name, &header->lumps[2], ext ); // LUMP_TEXTURES return true; @@ -323,7 +313,7 @@ qboolean Conv_CheckMap( const char *mapname ) } // detect game type - switch( LittleLong( hdr.ident )) + switch( hdr.ident ) { case 28: // quake 1 beta case 29: // quake 1 release @@ -335,7 +325,7 @@ qboolean Conv_CheckMap( const char *mapname ) FS_Close( f ); return true; case IDBSPMODHEADER: // continue checking - if( LittleLong( hdr.version ) == 38 ) + if( hdr.version == 38 ) { game_family = GAME_QUAKE2; FS_Close( f ); @@ -343,7 +333,7 @@ qboolean Conv_CheckMap( const char *mapname ) } break; case VDBSPMODHEADER: // continue checking - switch( LittleLong( hdr.version )) + switch( hdr.version ) { case 18: game_family = GAME_HALFLIFE2_BETA; diff --git a/launch/tools/conv_sprite.c b/launch/tools/conv_sprite.c index 433167e9..b5c4c1fa 100644 --- a/launch/tools/conv_sprite.c +++ b/launch/tools/conv_sprite.c @@ -5,7 +5,6 @@ #include "launch.h" #include "ripper.h" -#include "byteorder.h" #include "sprite.h" // sprite_decompiler.c @@ -154,8 +153,8 @@ void *SPR_ConvertFrame( const char *name, const char *ext, void *pin, int framen int i, pixels, width, height; pinframe = (dspriteframe_t *)pin; - width = LittleLong( pinframe->width ); - height = LittleLong( pinframe->height ); + width = pinframe->width; + height = pinframe->height; fin = (byte *)(pinframe + 1); if( width <= 0 || height <= 0 ) { @@ -200,18 +199,18 @@ void *SPR_ConvertFrame( const char *name, const char *ext, void *pin, int framen { i = groupframenum - 1; com.strncpy( spr.group[spr.numgroup].frame[i].name, framename, MAX_STRING ); - spr.group[spr.numgroup].frame[i].origin[0] = -(float)LittleLong(pinframe->origin[0]); - spr.group[spr.numgroup].frame[i].origin[1] = (float)LittleLong(pinframe->origin[1]); - spr.group[spr.numgroup].frame[i].width = (float)LittleLong(pinframe->width); - spr.group[spr.numgroup].frame[i].height = (float)LittleLong(pinframe->height); + spr.group[spr.numgroup].frame[i].origin[0] = -(float)pinframe->origin[0]; + spr.group[spr.numgroup].frame[i].origin[1] = (float)pinframe->origin[1]; + spr.group[spr.numgroup].frame[i].width = (float)pinframe->width; + spr.group[spr.numgroup].frame[i].height = (float)pinframe->height; } else { com.strncpy( spr.frame[framenum].name, framename, MAX_STRING ); - spr.frame[framenum].origin[0] = -(float)LittleLong(pinframe->origin[0]); - spr.frame[framenum].origin[1] = (float)LittleLong(pinframe->origin[1]); - spr.frame[framenum].width = (float)LittleLong(pinframe->width); - spr.frame[framenum].height = (float)LittleLong(pinframe->height); + spr.frame[framenum].origin[0] = -(float)pinframe->origin[0]; + spr.frame[framenum].origin[1] = (float)pinframe->origin[1]; + spr.frame[framenum].width = (float)pinframe->width; + spr.frame[framenum].height = (float)pinframe->height; } if( FS_CheckParm( "-force32" ) && spr.texFormat == SPR_INDEXALPHA ) @@ -256,12 +255,12 @@ void *SPR_ConvertGroup( const char *name, const char *ext, void *pin, int framen void *ptemp; pingroup = (dspritegroup_t *)pin; - numframes = LittleLong( pingroup->numframes ); + numframes = pingroup->numframes; pin_intervals = (dspriteinterval_t *)(pingroup + 1); - for (i = 0; i < numframes; i++) + for( i = 0; i < numframes; i++ ) { - spr.group[spr.numgroup].interval[i] = LittleLong( pin_intervals->interval ); + spr.group[spr.numgroup].interval[i] = pin_intervals->interval; pin_intervals++; } @@ -269,7 +268,7 @@ void *SPR_ConvertGroup( const char *name, const char *ext, void *pin, int framen spr.group[spr.numgroup].numframes = numframes - 1; ptemp = (void *)pin_intervals; - for (i = 0; i < numframes; i++ ) + for( i = 0; i < numframes; i++ ) { ptemp = SPR_ConvertFrame( name, ext, ptemp, framenum + i, i + 1 ); } @@ -352,35 +351,35 @@ qboolean ConvSPR( const char *name, byte *buffer, size_t filesize, const char *e pin = (dspriteq1_t *)buffer; Mem_Set( &spr, 0, sizeof( spr )); - switch( LittleLong( pin->ident )) + switch( pin->ident ) { case IDSPRQ1HEADER: - switch( LittleLong( pin->version )) + switch( pin->version ) { case SPRITEQ1_VERSION: - spr.totalframes = LittleLong( pin->numframes ); + spr.totalframes = pin->numframes; spr.texFormat = SPR_ALPHTEST; // constant - spr.type = LittleLong( pin->type ); + spr.type = pin->type; pframetype = (dframetype_t *)(pin + 1); spr.truecolor = false; break; case SPRITE32_VERSION: - spr.totalframes = LittleLong( pin->numframes ); + spr.totalframes = pin->numframes; spr.texFormat = SPR_ADDITIVE; // constant - spr.type = LittleLong( pin->type ); + spr.type = pin->type; pframetype = (dframetype_t *)(pin + 1); spr.truecolor = true; break; case SPRITEHL_VERSION: pinhl = (dspritehl_t *)buffer; // reorganize header - spr.totalframes = LittleLong( pinhl->numframes ); - spr.texFormat = LittleLong( pinhl->texFormat ); - spr.type = LittleLong( pinhl->type ); + spr.totalframes = pinhl->numframes; + spr.texFormat = pinhl->texFormat; + spr.type = pinhl->type; numi = (short *)(pinhl + 1); spr.truecolor = false; - if( LittleShort( *numi ) == 256 ) + if( *numi == 256 ) { byte *src = (byte *)(numi + 1); rgbdata_t *pal = NULL; @@ -411,30 +410,30 @@ qboolean ConvSPR( const char *name, byte *buffer, size_t filesize, const char *e } break; default: - Msg("\"%s.%s\" unknown version %i\n", name, "spr", LittleLong( pin->version )); + Msg("\"%s.%s\" unknown version %i\n", name, "spr", pin->version ); return false; } break; case IDSPRQ2HEADER: - switch( LittleLong( pin->version )) + switch( pin->version ) { case SPRITEQ2_VERSION: pinq2 = (dspriteq2_t *)buffer; - spr.totalframes = LittleLong( pinq2->numframes ); + spr.totalframes = pinq2->numframes; spr.texFormat = SPR_ALPHTEST; // constants spr.type = SPR_FWD_PARALLEL; spr.truecolor = false; for( i = 0; i < spr.totalframes; i++ ) { - spr.frame[i].width = LittleLong( pinq2->frames[i].width ); - spr.frame[i].height = LittleLong( pinq2->frames[i].height ); - spr.frame[i].origin[0] = LittleLong( pinq2->frames[i].origin_x ); - spr.frame[i].origin[1] = LittleLong( pinq2->frames[i].origin_y ); + spr.frame[i].width = pinq2->frames[i].width; + spr.frame[i].height = pinq2->frames[i].height; + spr.frame[i].origin[0] = pinq2->frames[i].origin_x; + spr.frame[i].origin[1] = pinq2->frames[i].origin_y; SP2_ConvertFrame( pinq2->frames[i].name, ext, i ); } break; default: - Msg("\"%s.%s\" unknown version %i\n", name, "sp2", LittleLong( pin->version )); + Msg( "\"%s.%s\" unknown version %i\n", name, "sp2", pin->version ); return false; } break; @@ -446,7 +445,7 @@ qboolean ConvSPR( const char *name, byte *buffer, size_t filesize, const char *e // .SPR save frames as normal images for( i = 0; pframetype && i < spr.totalframes; i++ ) { - frametype_t frametype = LittleLong( pframetype->type ); + frametype_t frametype = pframetype->type; if( frametype == FRAME_SINGLE ) pframetype = (dframetype_t *)SPR_ConvertFrame( name, ext, (pframetype + 1), i, 0 ); diff --git a/launch/tools/spritegen.c b/launch/tools/spritegen.c index 14e5f335..f5b9c273 100644 --- a/launch/tools/spritegen.c +++ b/launch/tools/spritegen.c @@ -5,7 +5,6 @@ #include "utils.h" #include "sprite.h" -#include "byteorder.h" #include "mathlib.h" #define MAX_FRAMES 256 @@ -46,14 +45,10 @@ void WriteFrame( file_t *f, int framenum ) dspriteframe_t *pframe; pframe = (dspriteframe_t *)frames[framenum].pdata; - pframe->origin[0] = LittleLong( pframe->origin[0] ); - pframe->origin[1] = LittleLong( pframe->origin[1] ); - pframe->width = LittleLong (pframe->width); - pframe->height = LittleLong (pframe->height); // write frame as 32-bit indexed image - FS_Write(f, pframe, sizeof(*pframe)); - FS_Write(f, (byte *)(pframe + 1), pframe->height * pframe->width ); + FS_Write( f, pframe, sizeof( *pframe )); + FS_Write( f, (byte *)(pframe + 1), pframe->height * pframe->width ); } /* @@ -73,11 +68,10 @@ void WriteSprite( file_t *f ) + ((sprite.bounds[1]>>1) * (sprite.bounds[1]>>1))); // write out the sprite header - SwapBlock((int *)&sprite, sizeof(dsprite_t)); - FS_Write( f, &sprite, sizeof(sprite)); + FS_Write( f, &sprite, sizeof( sprite )); // write out palette (768 bytes) - FS_Write( f, (void *)&cnt, sizeof(cnt)); + FS_Write( f, (void *)&cnt, sizeof( cnt )); FS_Write( f, sprite_pal, cnt * 3 ); for (i = 0; i < sprite.numframes; i++) @@ -100,8 +94,8 @@ void WriteSprite( file_t *f ) numframes = frames[groupframe].numgroupframes; // set and write the group header - dsgroup.numframes = LittleLong( numframes ); - FS_Write( f, &dsgroup, sizeof(dsgroup)); + dsgroup.numframes = numframes; + FS_Write( f, &dsgroup, sizeof( dsgroup )); totinterval = 0.0f; // write the interval array for( j = 0; j < numframes; j++ ) @@ -109,7 +103,7 @@ void WriteSprite( file_t *f ) dspriteinterval_t temp; totinterval += frames[groupframe+1+j].interval; - temp.interval = LittleFloat( totinterval ); + temp.interval = totinterval; FS_Write( f, &temp, sizeof( temp )); } for( j = 0; j < numframes; j++ ) diff --git a/launch/tools/wadlib.c b/launch/tools/wadlib.c index 4c76373f..5b7b6353 100644 --- a/launch/tools/wadlib.c +++ b/launch/tools/wadlib.c @@ -5,7 +5,6 @@ #include "utils.h" #include "wadfile.h" -#include "byteorder.h" #include "mathlib.h" string wadoutname; @@ -216,8 +215,8 @@ void Cmd_GrabMip( void ) plump_end = plump + plump_size; // sentinel mip = (mip_t *)plump; - mip->width = LittleLong( w ); - mip->height = LittleLong( h ); + mip->width = w; + mip->height = h; com.strncpy( mip->name, lumpname, sizeof(mip->name)); plump = (byte *)&mip->offsets[4]; @@ -225,7 +224,7 @@ void Cmd_GrabMip( void ) linedelta = wadpic->width - w; source = plump; - mip->offsets[0] = LittleLong( plump - (byte *)mip ); + mip->offsets[0] = plump - (byte *)mip; // apply scissor to source for( y = yl; y < yh; y++ ) @@ -278,7 +277,7 @@ void Cmd_GrabMip( void ) int pixTest; VectorClear( d_color ); // no distortion yet - mip->offsets[miplevel] = LittleLong(plump - (byte *)mip); + mip->offsets[miplevel] = plump - (byte *)mip; mipstep = 1<width = LittleLong( xh - xl ); - pic->height = LittleLong( yh - yl ); + pic->width = xh - xl; + pic->height = yh - yl; // apply scissor to source plump = (byte *)(pic + 1); diff --git a/public/byteorder.h b/public/byteorder.h deleted file mode 100644 index 3ec37eaa..00000000 --- a/public/byteorder.h +++ /dev/null @@ -1,169 +0,0 @@ -//======================================================================= -// Copyright XashXT Group 2007 © -// byteorder.h - byte order functions -//======================================================================= -#ifndef BYTEORDER_H -#define BYTEORDER_H - -// byte order swap functions -_inline word WordSwap( word swap ) -{ - word *s = &swap; - - __asm { - mov ebx, s - mov al, [ebx+1] - mov ah, [ebx ] - mov [ebx], ax - } - return *s; -} - -#define ShortSwap(x) WordSwap((short)x) - -_inline uint UintSwap( uint *swap ) -{ - uint *i = swap; - - __asm { - mov ebx, i - mov eax, [ebx] - bswap eax - mov [ebx], eax - } - return *i; -} - -#define LongSwap(x) UintSwap((uint *)&x) -#define FloatSwap(x) UintSwap((uint *)&x) - -_inline double DoubleSwap( double swap ) -{ - #define dswap(x, y) t=b[x];b[x]=b[y];b[y]=b[x]; - - byte t, *b = ((byte *)&swap); - dswap(0,7); - dswap(1,6); - dswap(2,5); - dswap(3,4); - - #undef dswap - - return swap; -} - -//============================================================================ -// Endianess handling -//============================================================================ -// using BSD-style defines: BYTE_ORDER is defined to either BIG_ENDIAN or LITTLE_ENDIAN - -// Initializations -#if !defined(BYTE_ORDER) || !defined(LITTLE_ENDIAN) || !defined(BIG_ENDIAN) || (BYTE_ORDER != LITTLE_ENDIAN && BYTE_ORDER != BIG_ENDIAN) -#undef BYTE_ORDER -#undef LITTLE_ENDIAN -#undef BIG_ENDIAN -#define LITTLE_ENDIAN 1234 -#define BIG_ENDIAN 4321 -#endif - -// If we still don't know the CPU endianess at this point, we try to guess -#ifndef BYTE_ORDER -#if defined(WIN32) -#define BYTE_ORDER LITTLE_ENDIAN -#else -#if defined(SUNOS) -#if defined(__i386) || defined(__amd64) -#define BYTE_ORDER LITTLE_ENDIAN -#else -#define BYTE_ORDER BIG_ENDIAN -#endif -#else -#warning "Unable to determine the CPU endianess. Defaulting to little endian" -#define BYTE_ORDER LITTLE_ENDIAN -#endif -#endif -#endif - -#if BYTE_ORDER == LITTLE_ENDIAN -// little endian -#define big_endian false -#define BigShort(l) ShortSwap(l) -#define LittleShort(l) (l) -#define BigLong(l) LongSwap(l) -#define LittleLong(l) (l) -#define BigFloat(l) FloatSwap(l) -#define LittleFloat(l) (l) -#define BigDouble(l) DoubleSwap(l) -#define LittleDouble(l) (l) -#else -// big endian -#define big_endian true -#define BigShort(l) (l) -#define LittleShort(l) ShortSwap(l) -#define BigLong(l) (l) -#define LittleLong(l) LongSwap(l) -#define BigFloat(l) (l) -#define LittleFloat(l) FloatSwap(l) -#define BigDouble(l) (l) -#define LittleDouble(l) DoubleSwap(l) -#endif - -// extract from buffer -_inline unsigned long BuffBigLong( const byte *buf ) -{ - return (buf[0]<<24)|(buf[1]<<16)|(buf[2]<<8)|buf[3]; -} - -_inline unsigned short BuffBigShort( const byte *buf ) -{ - return (buf[0]<<8)|buf[1]; -} - -_inline float BuffBigFloat( const byte *buf ) -{ - return BuffBigLong( buf ); -} - -_inline double BuffBigDouble( const byte *buf ) -{ - return (buf[0]<<64)|(buf[1]<<56)|(buf[2]<<40)|(buf[3]<<32)|(buf[4]<<24)|(buf[5]<<16)|(buf[6]<<8)|buf[7]; -} - -_inline unsigned long BuffLittleLong( const byte *buf ) -{ - return (buf[3]<<24)|(buf[2]<<16)|(buf[1]<<8)|buf[0]; -} - -_inline unsigned short BuffLittleShort( const byte *buf ) -{ - return (buf[1]<<8)|buf[0]; -} - -_inline float BuffLittleFloat( const byte *buf ) -{ - return BuffLittleLong( buf ); -} - -_inline signed __int64 BuffLittleLong64( const byte *buf ) -{ - return (buf[7]<<64)|(buf[6]<<56)|(buf[5]<<40)|(buf[4]<<32)|(buf[3]<<24)|(buf[2]<<16)|(buf[1]<<8)|buf[0]; -} - -/* -============= -SwapBlock - -generic lump swaping -============= -*/ -_inline void SwapBlock( int *block, int sizeOfBlock ) -{ - int i; - - sizeOfBlock >>= 2; - - for( i = 0; i < sizeOfBlock; i++ ) - block[i] = LittleLong( block[i] ); -} - -#endif//BYTEORDER_H \ No newline at end of file diff --git a/public/engine_api.h b/public/engine_api.h index f2f171e2..5db886fe 100644 --- a/public/engine_api.h +++ b/public/engine_api.h @@ -53,24 +53,4 @@ #error MAX_COORD_INTEGER does not match COORD_INTEGER_BITS #endif -/* -============================================================================== - - Generic LAUNCH.DLL INTERFACE -============================================================================== -*/ -typedef struct launch_exp_s -{ - // interface validator - size_t api_size; // must matched with sizeof(launch_api_t) - size_t com_size; // must matched with sizeof(stdlib_api_t) - - void (*Init)( const int argc, const char **argv ); // init host - void (*Main)( void ); // host frame - void (*Free)( void ); // close host - void (*CPrint)( const char *msg ); // host print - void (*CmdForward)( void ); // cmd forward to server - void (*CmdComplete)( char *complete_string ); // cmd autocomplete for system console -} launch_exp_t; - #endif//ENGINE_API_H \ No newline at end of file diff --git a/public/launch_api.h b/public/launch_api.h index 075b5297..2698f6e4 100644 --- a/public/launch_api.h +++ b/public/launch_api.h @@ -722,6 +722,26 @@ typedef struct stdilib_api_s const char* (*timestamp)( int format ); // returns current time stamp } stdlib_api_t; +/* +============================================================================== + + Generic LAUNCH.DLL INTERFACE +============================================================================== +*/ +typedef struct launch_exp_s +{ + // interface validator + size_t api_size; // must matched with sizeof(launch_api_t) + size_t com_size; // must matched with sizeof(stdlib_api_t) + + void (*Init)( const int argc, const char **argv ); // init host + void (*Main)( void ); // host frame + void (*Free)( void ); // close host + void (*CPrint)( const char *msg ); // host print + void (*CmdForward)( void ); // cmd forward to server + void (*CmdComplete)( char *complete_string ); // cmd autocomplete for system console +} launch_exp_t; + // this is the only function actually exported at the linker level typedef void *(*launch_t)( stdlib_api_t*, void* ); typedef struct { size_t api_size; size_t com_size; } generic_api_t; diff --git a/launchers.bat b/utils/launchers.bat similarity index 79% rename from launchers.bat rename to utils/launchers.bat index adffe9ca..1103bb55 100644 --- a/launchers.bat +++ b/utils/launchers.bat @@ -1,6 +1,5 @@ @echo off -cd utils cd bsplib makefile.nmake diff --git a/vid_gl/r_image.c b/vid_gl/r_image.c index 4dd7bc2f..c5496f9b 100644 --- a/vid_gl/r_image.c +++ b/vid_gl/r_image.c @@ -4,7 +4,6 @@ //======================================================================= #include "r_local.h" -#include "byteorder.h" #include "mathlib.h" #include "matrix_lib.h" #include "const.h" @@ -2175,7 +2174,6 @@ static rgbdata_t *R_ParseStudioSkin( script_t *script, const byte *buf, size_t s FS_Close( f ); return NULL; } - SwapBlock( (int *)&hdr, sizeof( hdr )); if( hdr.numtextures == 0 ) { @@ -2193,7 +2191,6 @@ static rgbdata_t *R_ParseStudioSkin( script_t *script, const byte *buf, size_t s FS_Close( f ); return NULL; } - SwapBlock( (int *)&hdr, sizeof( hdr )); } if( hdr.textureindex > 0 && hdr.numtextures <= MAXSTUDIOSKINS ) @@ -3322,8 +3319,8 @@ static rgbdata_t *R_InitNoTexture( int *flags, int *samples ) for( x = 0; x < 16; x++ ) { if(( y < 8 ) ^ ( x < 8 )) - ((uint *)&data2D)[y*16+x] = LittleLong( 0xFFFF00FF ); - else ((uint *)&data2D)[y*16+x] = LittleLong( 0xFF000000 ); + ((uint *)&data2D)[y*16+x] = 0xFFFF00FF; + else ((uint *)&data2D)[y*16+x] = 0xFF000000; } } #else @@ -3333,8 +3330,8 @@ static rgbdata_t *R_InitNoTexture( int *flags, int *samples ) for( x = 0; x < 16; x++ ) { if( x == 0 || x == 15 || y == 0 || y == 15 ) - ((uint *)&data2D)[y*16+x] = LittleLong( 0xFFFFFFFF ); - else ((uint *)&data2D)[y*16+x] = LittleLong( 0xFF000000 ); + ((uint *)&data2D)[y*16+x] = 0xFFFFFFFF; + else ((uint *)&data2D)[y*16+x] = 0xFF000000; } } #endif @@ -3611,7 +3608,7 @@ static rgbdata_t *R_InitSkyTexture( int *flags, int *samples ) // skybox texture for( i = 0; i < 256; i++ ) - ((uint *)&data2D)[i] = LittleLong( 0xFFFFDEB5 ); + ((uint *)&data2D)[i] = 0xFFFFDEB5; *flags = TF_NOPICMIP|TF_UNCOMPRESSED; *samples = 3; diff --git a/vid_gl/r_model.c b/vid_gl/r_model.c index abd78d84..3a4edef5 100644 --- a/vid_gl/r_model.c +++ b/vid_gl/r_model.c @@ -26,7 +26,6 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include "wadfile.h" #include "mathlib.h" #include "matrix_lib.h" -#include "byteorder.h" #include "bspfile.h" #include "cl_entity.h" @@ -460,7 +459,7 @@ ref_model_t *Mod_ForName( const char *name, qboolean crash ) FS_FileBase( mod->name, cached.modelname ); // call the apropriate loader - switch( LittleLong( *(uint *)buf )) + switch( *(uint *)buf ) { case IDSTUDIOHEADER: Mod_StudioLoadModel( mod, buf ); @@ -1239,7 +1238,7 @@ static void Mod_LoadTextures( const dlump_t *l ) } in = (void *)(mod_base + l->fileofs); - count = LittleLong( in->nummiptex ); + count = in->nummiptex; cached.textures = Mem_Alloc( cached_mempool, count * sizeof( *out )); @@ -1251,7 +1250,7 @@ static void Mod_LoadTextures( const dlump_t *l ) for( i = 0; i < count; i++, out++ ) { - in->dataofs[i] = LittleLong( in->dataofs[i] ); + in->dataofs[i] = in->dataofs[i]; if( in->dataofs[i] == -1 ) { @@ -1273,8 +1272,8 @@ static void Mod_LoadTextures( const dlump_t *l ) com.strncpy( out->name, mt->name, sizeof( out->name )); // original dimensions for adjust lightmap on a face - out->width = LittleLong( mt->width ); - out->height = LittleLong( mt->height ); + out->width = mt->width; + out->height = mt->height; out->base = mt; // sky must be loading first @@ -1463,7 +1462,7 @@ static void Mod_LoadVertexes( const dlump_t *l ) for( i = 0; i < count; i++, in++, out += 3 ) { for( j = 0; j < 3; j++ ) - out[j] = LittleFloat( in->point[j] ); + out[j] = in->point[j]; } } @@ -1498,16 +1497,16 @@ static void Mod_LoadSubmodels( const dlump_t *l ) for( j = 0; j < 3; j++ ) { - out->mins[j] = LittleFloat( in->mins[j] ); - out->maxs[j] = LittleFloat( in->maxs[j] ); - out->origin[j] = LittleFloat( in->origin[j] ); + out->mins[j] = in->mins[j]; + out->maxs[j] = in->maxs[j]; + out->origin[j] = in->origin[j]; } out->radius = RadiusFromBounds( out->mins, out->maxs ); - out->firstnode = LittleLong( in->headnode[0] ); // drawing hull #0 - out->firstface = LittleLong( in->firstface ); - out->numfaces = LittleLong( in->numfaces ); - out->visleafs = LittleLong( in->visleafs ); + out->firstnode = in->headnode[0]; // drawing hull #0 + out->firstface = in->firstface; + out->numfaces = in->numfaces; + out->visleafs = in->visleafs; } } @@ -1537,9 +1536,9 @@ static void Mod_LoadTexInfo( const dlump_t *l ) for( i = 0; i < count; i++, in++, out++ ) { for( j = 0; j < 8; j++ ) - out->vecs[0][j] = LittleFloat( in->vecs[0][j] ); + out->vecs[0][j] = in->vecs[0][j]; - miptex = LittleLong( in->miptex ); + miptex = in->miptex; if( miptex < 0 || miptex > loadmodel->numshaders ) Host_Error( "Mod_LoadTexInfo: bad shader number in '%s'\n", loadmodel->name ); out->texturenum = miptex; @@ -1576,12 +1575,12 @@ static void Mod_LoadSurfaces( const dlump_t *l ) for( i = 0; i < count; i++, in++, out++ ) { - out->firstedge = LittleLong( in->firstedge ); - out->numedges = LittleLong( in->numedges ); + out->firstedge = in->firstedge; + out->numedges = in->numedges; - if( LittleShort( in->side )) out->flags |= SURF_PLANEBACK; - out->plane = loadbmodel->planes + LittleLong( in->planenum ); - out->texinfo = loadbmodel->texinfo + LittleLong( in->texinfo ); + if( in->side ) out->flags |= SURF_PLANEBACK; + out->plane = loadbmodel->planes + in->planenum; + out->texinfo = loadbmodel->texinfo + in->texinfo; texnum = out->texinfo->texturenum; if( texnum < 0 || texnum > cached.numtextures ) @@ -1605,7 +1604,7 @@ static void Mod_LoadSurfaces( const dlump_t *l ) out->lmHeight = (out->extents[1] >> 4) + 1; if( out->flags & SURF_DRAWTILED ) lightofs = -1; - else lightofs = LittleLong( in->lightofs ); + else lightofs = in->lightofs; if( loadbmodel->lightdata && lightofs != -1 ) { @@ -1659,7 +1658,7 @@ static void Mod_LoadMarkFaces( const dlump_t *l ) for( i = 0; i < count; i++ ) { - j = LittleLong( in[i] ); + j = in[i]; if( j < 0 || j >= loadbmodel->numsurfaces ) Host_Error( "Mod_LoadMarkFaces: bad surface number in '%s'\n", loadmodel->name ); loadbmodel->marksurfaces[i] = loadbmodel->surfaces + j; @@ -1691,15 +1690,15 @@ static void Mod_LoadNodes( const dlump_t *l ) { qboolean badBounds = false; - out->plane = loadbmodel->planes + LittleLong( in->planenum ); - out->firstface = loadbmodel->surfaces + LittleLong( in->firstface ); - out->numfaces = LittleLong( in->numfaces ); + out->plane = loadbmodel->planes + in->planenum; + out->firstface = loadbmodel->surfaces + in->firstface; + out->numfaces = in->numfaces; out->contents = CONTENTS_NODE; for( j = 0; j < 3; j++ ) { - out->mins[j] = (float)LittleShort( in->mins[j] ); - out->maxs[j] = (float)LittleShort( in->maxs[j] ); + out->mins[j] = (float)in->mins[j]; + out->maxs[j] = (float)in->maxs[j]; if( out->mins[j] > out->maxs[j] ) badBounds = true; } @@ -1715,7 +1714,7 @@ static void Mod_LoadNodes( const dlump_t *l ) for( j = 0; j < 2; j++ ) { - p = LittleShort( in->children[j] ); + p = in->children[j]; if( p >= 0 ) out->children[j] = loadbmodel->nodes + p; else out->children[j] = (mnode_t *)(loadbmodel->leafs + ( -1 - p )); } @@ -1751,8 +1750,8 @@ static void Mod_LoadLeafs( const dlump_t *l ) for( j = 0; j < 3; j++ ) { - out->mins[j] = (float)LittleShort( in->mins[j] ); - out->maxs[j] = (float)LittleShort( in->maxs[j] ); + out->mins[j] = (float)in->mins[j]; + out->maxs[j] = (float)in->maxs[j]; if( out->mins[j] > out->maxs[j] ) badBounds = true; } @@ -1767,13 +1766,13 @@ static void Mod_LoadLeafs( const dlump_t *l ) } out->plane = NULL; // to differentiate from nodes - out->contents = LittleLong( in->contents ); + out->contents = in->contents; - p = LittleLong( in->visofs ); + p = in->visofs; out->compressed_vis = (p == -1) ? NULL : loadbmodel->visdata + p; - out->firstMarkSurface = loadbmodel->marksurfaces + LittleShort( in->firstmarksurface ); - out->numMarkSurfaces = LittleShort( in->nummarksurfaces ); + out->firstMarkSurface = loadbmodel->marksurfaces + in->firstmarksurface; + out->numMarkSurfaces = in->nummarksurfaces; } } @@ -1797,8 +1796,8 @@ static void Mod_LoadEdges( const dlump_t *l ) for( i = 0; i < count; i++, in++, out++ ) { - out->v[0] = (word)LittleShort( in->v[0] ); - out->v[1] = (word)LittleShort( in->v[1] ); + out->v[0] = (word)in->v[0]; + out->v[1] = (word)in->v[1]; } } @@ -1810,7 +1809,7 @@ Mod_LoadSurfEdges static void Mod_LoadSurfEdges( const dlump_t *l ) { dsurfedge_t *in, *out; - int i, count; + int count; in = (void *)( mod_base + l->fileofs ); if( l->filelen % sizeof( *in )) @@ -1820,8 +1819,7 @@ static void Mod_LoadSurfEdges( const dlump_t *l ) cached.surfedges = out = Mem_Alloc( cached_mempool, count * sizeof( dsurfedge_t )); cached.numsurfedges = count; - for( i = 0; i < count; i++ ) - out[i] = LittleLong( in[i] ); + Mem_Copy( out, in, count * sizeof( dsurfedge_t )); } /* @@ -1847,12 +1845,10 @@ static void Mod_LoadPlanes( const dlump_t *l ) for( i = 0; i < count; i++, in++, out++ ) { - out->normal[0] = LittleFloat( in->normal[0] ); - out->normal[1] = LittleFloat( in->normal[1] ); - out->normal[2] = LittleFloat( in->normal[2] ); + VectorCopy( in->normal, out->normal ); out->signbits = SignbitsForPlane( out->normal ); - out->dist = LittleFloat( in->dist ); - out->type = LittleLong( in->type ); + out->dist = in->dist; + out->type = in->type; } } @@ -2582,7 +2578,7 @@ void Mod_BrushLoadModel( ref_model_t *mod, const void *buffer ) int i, j; header = (dheader_t *)buffer; - cached.version = LittleLong( header->version ); + cached.version = header->version; switch( cached.version ) { @@ -2597,10 +2593,6 @@ void Mod_BrushLoadModel( ref_model_t *mod, const void *buffer ) mod->type = mod_brush; mod_base = (byte *)header; - // swap all the lumps - for( i = 0; i < sizeof( dheader_t )/4; i++ ) - ((int *)header )[i] = LittleLong( ((int *)header )[i] ); - // load into heap Mod_LoadSubmodels( &header->lumps[LUMP_MODELS] ); diff --git a/vid_gl/r_sprite.c b/vid_gl/r_sprite.c index b11ab950..2ef04621 100644 --- a/vid_gl/r_sprite.c +++ b/vid_gl/r_sprite.c @@ -5,7 +5,6 @@ #include "r_local.h" #include "mathlib.h" -#include "byteorder.h" #include "const.h" #include "cl_entity.h" @@ -54,7 +53,6 @@ static dframetype_t *R_SpriteLoadFrame( ref_model_t *mod, void *pin, mspritefram com.snprintf( name, MAX_STRING, "Sprite( %s_%s_%i%i )", sp_name, frame_prefix, framenum/10, framenum%10 ); pinframe = (dspriteframe_t *)pin; - SwapBlock((int *)pinframe, sizeof( dspriteframe_t )); // setup frame description pspriteframe = Mem_Alloc( mod->mempool, sizeof( mspriteframe_t )); @@ -92,7 +90,6 @@ static dframetype_t *CL_LoadSpriteFrame( const char *szSpriteName, void *pin, in com.snprintf( name, MAX_STRING, "Sprite( \"%s_%s_%i%i\" )", sp_name, frame_prefix, framenum/10, framenum%10 ); pinframe = (dspriteframe_t *)pin; - SwapBlock((int *)pinframe, sizeof( dspriteframe_t )); // NOTE: just loading all single frame into one shader // we supported only single frames in this case @@ -118,15 +115,14 @@ static dframetype_t *CL_SpriteSkipGroup( const char *szSpriteName, void *pin, in pin_intervals = (dspriteinterval_t *)(pingroup + 1); // skip intervals - for( i = 0; i < LittleLong( pingroup->numframes ); i++ ) + for( i = 0; i < pingroup->numframes; i++ ) pin_intervals++; // skip group frames ptemp = (void *)pin_intervals; - for( i = 0; i < LittleLong( pingroup->numframes ); i++ ) + for( i = 0; i < pingroup->numframes; i++ ) { pinframe = (dspriteframe_t *)ptemp; - SwapBlock((int *)pinframe, sizeof( dspriteframe_t )); ptemp = (dframetype_t *)((byte *)(pinframe + 1) + pinframe->width * pinframe->height ); } return (dframetype_t *)ptemp; @@ -144,7 +140,7 @@ static dframetype_t *R_SpriteLoadGroup( ref_model_t *mod, void * pin, mspritefra void *ptemp; pingroup = (dspritegroup_t *)pin; - numframes = LittleLong( pingroup->numframes ); + numframes = pingroup->numframes; groupsize = sizeof(mspritegroup_t) + (numframes - 1) * sizeof( pspritegroup->frames[0] ); pspritegroup = Mem_Alloc( mod->mempool, groupsize ); @@ -157,7 +153,7 @@ static dframetype_t *R_SpriteLoadGroup( ref_model_t *mod, void * pin, mspritefra for( i = 0; i < numframes; i++ ) { - *poutintervals = LittleFloat( pin_intervals->interval ); + *poutintervals = pin_intervals->interval; if( *poutintervals <= 0.0 ) *poutintervals = 1.0f; // set error value if( frame_type == FRAME_GROUP ) R_ShaderAddStageIntervals( *poutintervals ); else if( frame_type == FRAME_ANGLED ) R_ShaderAddStageIntervals( -1.0f ); @@ -194,7 +190,7 @@ void Mod_SpriteLoadModel( ref_model_t *mod, const void *buffer ) qboolean twoSided; pin = (dsprite_t *)buffer; - i = LittleLong( pin->version ); + i = pin->version; if( i != SPRITE_VERSION ) { @@ -202,24 +198,24 @@ void Mod_SpriteLoadModel( ref_model_t *mod, const void *buffer ) return; } - numframes = LittleLong( pin->numframes ); - size = sizeof (msprite_t) + (numframes - 1) * sizeof( psprite->frames ); + numframes = pin->numframes; + size = sizeof( msprite_t ) + ( numframes - 1 ) * sizeof( psprite->frames ); psprite = Mem_Alloc( mod->mempool, size ); mod->extradata = psprite; // make link to extradata mod->numshaders = 0; // reset frames - psprite->type = LittleLong( pin->type ); - psprite->rendermode = LittleLong( pin->texFormat ); + psprite->type = pin->type; + psprite->rendermode = pin->texFormat; psprite->numframes = numframes; - twoSided = (LittleLong( pin->facetype == SPR_CULL_NONE )) ? true : false; - mod->mins[0] = mod->mins[1] = -LittleLong( pin->bounds[0] ) / 2; - mod->maxs[0] = mod->maxs[1] = LittleLong( pin->bounds[0] ) / 2; - mod->mins[2] = -LittleLong( pin->bounds[1] ) / 2; - mod->maxs[2] = LittleLong( pin->bounds[1] ) / 2; + twoSided = ( pin->facetype == SPR_CULL_NONE ) ? true : false; + mod->mins[0] = mod->mins[1] = -pin->bounds[0] / 2; + mod->maxs[0] = mod->maxs[1] = pin->bounds[0] / 2; + mod->mins[2] = -pin->bounds[1] / 2; + mod->maxs[2] = pin->bounds[1] / 2; numi = (short *)(pin + 1); - if( LittleShort( *numi ) == 256 ) + if( *numi == 256 ) { byte *src = (byte *)(numi+1); rgbdata_t *pal; @@ -271,7 +267,7 @@ void Mod_SpriteLoadModel( ref_model_t *mod, const void *buffer ) for( i = 0; i < numframes; i++ ) { - frametype_t frametype = LittleLong( pframetype->type ); + frametype_t frametype = pframetype->type; psprite->frames[i].type = frametype; frame_type = frametype; @@ -329,31 +325,31 @@ ref_shader_t *CL_LoadSprite( const char *szSpriteName ) pin = (dsprite_t *)buffer; // make sure what is really sprite - if( LittleLong( pin->ident ) != IDSPRITEHEADER ) + if( pin->ident != IDSPRITEHEADER ) { MsgDev( D_ERROR, "CL_LoadSprite: %s not a sprite\n", szSpriteName ); Mem_Free( buffer ); return NULL; } - if( LittleLong( pin->version ) != SPRITE_VERSION ) + if( pin->version != SPRITE_VERSION ) { MsgDev( D_ERROR, "CL_LoadSprite: %s invalid sprite version\n", szSpriteName ); Mem_Free( buffer ); return NULL; } - numframes = LittleLong( pin->numframes ); - twoSided = (LittleLong( pin->facetype == SPR_CULL_NONE )) ? true : false; + numframes = pin->numframes; + twoSided = ( pin->facetype == SPR_CULL_NONE ) ? true : false; numi = (short *)( pin + 1 ); - if( LittleShort( *numi ) == 256 ) + if( *numi == 256 ) { byte *src = (byte *)(numi+1); rgbdata_t *pal; // install palette - switch( LittleLong( pin->texFormat )) + switch( pin->texFormat ) { case SPR_ADDGLOW: pal = FS_LoadImage( "#normal.pal", src, 768 ); @@ -402,7 +398,7 @@ ref_shader_t *CL_LoadSprite( const char *szSpriteName ) for( i = 0; i < numframes; i++ ) { - switch( LittleLong( pframetype->type )) + switch( pframetype->type ) { case FRAME_SINGLE: pframetype = CL_LoadSpriteFrame( szSpriteName, pframetype + 1, i ); diff --git a/vid_gl/r_studio.c b/vid_gl/r_studio.c index e344d146..f90c6a3a 100644 --- a/vid_gl/r_studio.c +++ b/vid_gl/r_studio.c @@ -4,7 +4,6 @@ //======================================================================= #include "r_local.h" -#include "byteorder.h" #include "mathlib.h" #include "matrix_lib.h" #include "cl_entity.h" @@ -663,8 +662,8 @@ void Mod_StudioLoadModel( ref_model_t *mod, const void *buffer ) if( !phdr ) return; // there were problems mod->extradata = poutmodel = (mstudiodata_t *)Mod_Malloc( mod, sizeof( mstudiodata_t )); - poutmodel->phdr = (studiohdr_t *)Mod_Malloc( mod, LittleLong( phdr->length )); - Mem_Copy( poutmodel->phdr, buffer, LittleLong( phdr->length )); + poutmodel->phdr = (studiohdr_t *)Mod_Malloc( mod, phdr->length ); + Mem_Copy( poutmodel->phdr, buffer, phdr->length ); if( phdr->numtextures == 0 ) { @@ -673,8 +672,8 @@ void Mod_StudioLoadModel( ref_model_t *mod, const void *buffer ) else MsgDev( D_ERROR, "StudioLoadModel: %s missing textures file\n", mod->name ); if( !thdr ) return; // there were problems - poutmodel->thdr = (studiohdr_t *)Mod_Malloc( mod, LittleLong( thdr->length )); - Mem_Copy( poutmodel->thdr, texbuf, LittleLong( thdr->length )); + poutmodel->thdr = (studiohdr_t *)Mod_Malloc( mod, thdr->length ); + Mem_Copy( poutmodel->thdr, texbuf, thdr->length ); if( texbuf ) Mem_Free( texbuf ); } else poutmodel->thdr = poutmodel->phdr; // just make link @@ -1079,7 +1078,7 @@ mstudioanim_t *R_StudioGetAnim( ref_model_t *m_pRefModel, mstudioseqdesc_t *pseq buf = FS_LoadFile( filepath, &filesize ); if( !buf || !filesize ) Host_Error( "R_StudioGetAnim: can't load %s\n", filepath ); - if( IDSEQGRPHEADER != LittleLong(*(uint *)buf )) + if( IDSEQGRPHEADER != *(uint *)buf ) Host_Error( "R_StudioGetAnim: %s is corrupted\n", filepath ); MsgDev( D_NOTE, "R_StudioGetAnim: %s\n", filepath );