From 3d412a4b30a9f7c7f51ea6562e694315948bd3da Mon Sep 17 00:00:00 2001 From: boris Date: Wed, 28 Nov 2018 16:00:02 +1300 Subject: cleaned up in short, the cheat and loader are now separate solutions. unused stuff was moved into the legacy solution in case anyone wants to compile it or whatever. i can change this back if you want to. also, i configured the loader to compile in x64, and have separate build types for linux and win64 --- cheat/gmod/CHLClient.hpp | 83 ++ cheat/gmod/CInput.hpp | 44 + cheat/gmod/CLuaInterface.hpp | 246 ++++ cheat/gmod/CLuaShared.hpp | 15 + cheat/gmod/CUtlVector.hpp | 47 + cheat/gmod/ClientClass.hpp | 14 + cheat/gmod/GlobalVars_t.hpp | 16 + cheat/gmod/IAppSystem.hpp | 24 + cheat/gmod/IClientEntityList.hpp | 144 +++ cheat/gmod/IClientMode.hpp | 139 ++ cheat/gmod/ICvar.hpp | 206 +++ cheat/gmod/IEngineTrace.hpp | 380 ++++++ cheat/gmod/IGameEventManager.hpp | 77 ++ cheat/gmod/IMaterialSystem.hpp | 163 +++ cheat/gmod/IMemAlloc.hpp | 79 ++ cheat/gmod/IPanel.hpp | 14 + cheat/gmod/IPhysicsSurfaceProps.hpp | 79 ++ cheat/gmod/IPrediction.hpp | 129 ++ cheat/gmod/ISurface.hpp | 117 ++ cheat/gmod/IVEngineClient.hpp | 259 ++++ cheat/gmod/IVModelInfoClient.hpp | 134 ++ cheat/gmod/IVRenderView.hpp | 21 + cheat/gmod/KeyValues.cpp | 50 + cheat/gmod/KeyValues.hpp | 38 + cheat/gmod/Source.cpp | 187 +++ cheat/gmod/Valve/dt_common.h | 180 +++ cheat/gmod/Valve/dt_recv.h | 523 ++++++++ cheat/gmod/aimbot.cpp | 404 ++++++ cheat/gmod/aimbot.hpp | 38 + cheat/gmod/autowall.cpp | 305 +++++ cheat/gmod/autowall.hpp | 34 + cheat/gmod/base_cheat.cpp | 3 + cheat/gmod/base_cheat.hpp | 41 + cheat/gmod/bf_write.hpp | 34 + cheat/gmod/c_base_player.cpp | 433 +++++++ cheat/gmod/c_base_player.hpp | 258 ++++ cheat/gmod/c_base_weapon.cpp | 87 ++ cheat/gmod/c_base_weapon.hpp | 48 + cheat/gmod/chams.cpp | 157 +++ cheat/gmod/chams.hpp | 45 + cheat/gmod/color.hpp | 278 ++++ cheat/gmod/con_alias.hpp | 60 + cheat/gmod/con_fn.hpp | 172 +++ cheat/gmod/console.cpp | 324 +++++ cheat/gmod/console.hpp | 123 ++ cheat/gmod/context.cpp | 104 ++ cheat/gmod/context.hpp | 71 ++ cheat/gmod/create_move.cpp | 87 ++ cheat/gmod/d3d.cpp | 344 +++++ cheat/gmod/d3d.hpp | 122 ++ cheat/gmod/d3d_sprite.cpp | 13 + cheat/gmod/d3d_sprite.hpp | 169 +++ cheat/gmod/debug_show_spread.cpp | 16 + cheat/gmod/directx.cpp | 195 +++ cheat/gmod/do_post_screen_space_effects.cpp | 17 + cheat/gmod/draw_model_execute.cpp | 167 +++ cheat/gmod/emit_sound.cpp | 19 + cheat/gmod/extra.cpp | 86 ++ cheat/gmod/extra.hpp | 12 + cheat/gmod/factory.cpp | 110 ++ cheat/gmod/factory.hpp | 155 +++ cheat/gmod/fire_bullets.cpp | 15 + cheat/gmod/fnv.hpp | 64 + cheat/gmod/frame_stage_notify.cpp | 25 + cheat/gmod/get_screen_size.cpp | 37 + cheat/gmod/get_viewmodel_fov.cpp | 8 + cheat/gmod/gmod.vcxproj | 369 ++++++ cheat/gmod/gmod.vcxproj.filters | 385 ++++++ cheat/gmod/hooks.cpp | 48 + cheat/gmod/hooks.hpp | 64 + cheat/gmod/hud_process_input.cpp | 19 + cheat/gmod/icons.hpp | 5 + cheat/gmod/icons/config.hpp | 1752 +++++++++++++++++++++++++ cheat/gmod/icons/legit.hpp | 1798 ++++++++++++++++++++++++++ cheat/gmod/icons/misc.hpp | 1721 +++++++++++++++++++++++++ cheat/gmod/icons/rage.hpp | 1630 ++++++++++++++++++++++++ cheat/gmod/icons/visuals.hpp | 1837 +++++++++++++++++++++++++++ cheat/gmod/identity.cpp | 98 ++ cheat/gmod/identity.hpp | 16 + cheat/gmod/iface_dllmain_impl.hpp | 84 ++ cheat/gmod/in_prediction.cpp | 32 + cheat/gmod/input_system.cpp | 527 ++++++++ cheat/gmod/input_system.hpp | 186 +++ cheat/gmod/interface.cpp | 217 ++++ cheat/gmod/interface.hpp | 165 +++ cheat/gmod/is_connected.cpp | 14 + cheat/gmod/is_hltv.cpp | 31 + cheat/gmod/is_paused.cpp | 19 + cheat/gmod/lag_mgr.cpp | 79 ++ cheat/gmod/lag_mgr.hpp | 70 + cheat/gmod/legitbot.cpp | 309 +++++ cheat/gmod/legitbot.hpp | 75 ++ cheat/gmod/legitbot_lagcomp.cpp | 155 +++ cheat/gmod/listener.cpp | 217 ++++ cheat/gmod/listener.hpp | 26 + cheat/gmod/lock_cursor.cpp | 13 + cheat/gmod/math.cpp | 16 + cheat/gmod/math.hpp | 137 ++ cheat/gmod/mem.hpp | 66 + cheat/gmod/movement.cpp | 269 ++++ cheat/gmod/movement.hpp | 36 + cheat/gmod/movement_recorder.cpp | 79 ++ cheat/gmod/movement_recorder.hpp | 29 + cheat/gmod/netvar_proxy.hpp | 37 + cheat/gmod/netvars.cpp | 93 ++ cheat/gmod/netvars.hpp | 44 + cheat/gmod/on_screen_size_changed.cpp | 9 + cheat/gmod/override_mouse_input.cpp | 14 + cheat/gmod/override_view.cpp | 22 + cheat/gmod/paint.cpp | 21 + cheat/gmod/paint_traverse.cpp | 28 + cheat/gmod/pattern.hpp | 68 + cheat/gmod/play_sound.cpp | 25 + cheat/gmod/player_manager.cpp | 38 + cheat/gmod/player_manager.hpp | 67 + cheat/gmod/playerlist.cpp | 114 ++ cheat/gmod/playerlist.hpp | 54 + cheat/gmod/prediction.cpp | 111 ++ cheat/gmod/prediction.hpp | 27 + cheat/gmod/proxies.cpp | 43 + cheat/gmod/ragebot_antiaim.cpp | 750 +++++++++++ cheat/gmod/ragebot_lagcomp.cpp | 595 +++++++++ cheat/gmod/ragebot_resolver.cpp | 471 +++++++ cheat/gmod/render_view.cpp | 10 + cheat/gmod/renderer.cpp | 94 ++ cheat/gmod/renderer.hpp | 120 ++ cheat/gmod/run_command.cpp | 18 + cheat/gmod/scene_end.cpp | 43 + cheat/gmod/sdk.hpp | 26 + cheat/gmod/send_datagram.cpp | 29 + cheat/gmod/settings.hpp | 276 ++++ cheat/gmod/simple_settings.cpp | 32 + cheat/gmod/simple_settings.hpp | 171 +++ cheat/gmod/skins.cpp | 75 ++ cheat/gmod/skins.hpp | 14 + cheat/gmod/strings.hpp | 162 +++ cheat/gmod/ui.h | 457 +++++++ cheat/gmod/ui_base_item.h | 164 +++ cheat/gmod/ui_button.h | 56 + cheat/gmod/ui_checkbox.h | 68 + cheat/gmod/ui_color_picker.h | 201 +++ cheat/gmod/ui_draw.h | 163 +++ cheat/gmod/ui_dropdown.h | 217 ++++ cheat/gmod/ui_dropdown_item.h | 183 +++ cheat/gmod/ui_form.h | 187 +++ cheat/gmod/ui_key_picker.h | 164 +++ cheat/gmod/ui_label.h | 18 + cheat/gmod/ui_menu.h | 89 ++ cheat/gmod/ui_render.h | 63 + cheat/gmod/ui_slider.h | 165 +++ cheat/gmod/ui_tab_manager.h | 228 ++++ cheat/gmod/ui_text_input.h | 47 + cheat/gmod/util.cpp | 265 ++++ cheat/gmod/util.hpp | 102 ++ cheat/gmod/vector.hpp | 329 +++++ cheat/gmod/visual.hpp | 51 + cheat/gmod/visual_draw.cpp | 64 + cheat/gmod/visual_local.cpp | 503 ++++++++ cheat/gmod/visual_player.cpp | 308 +++++ cheat/gmod/visual_world.cpp | 207 +++ cheat/gmod/vmt.hpp | 94 ++ cheat/gmod/window_procedure.cpp | 98 ++ cheat/gmod/x86.hpp | 47 + 163 files changed, 28920 insertions(+) create mode 100644 cheat/gmod/CHLClient.hpp create mode 100644 cheat/gmod/CInput.hpp create mode 100644 cheat/gmod/CLuaInterface.hpp create mode 100644 cheat/gmod/CLuaShared.hpp create mode 100644 cheat/gmod/CUtlVector.hpp create mode 100644 cheat/gmod/ClientClass.hpp create mode 100644 cheat/gmod/GlobalVars_t.hpp create mode 100644 cheat/gmod/IAppSystem.hpp create mode 100644 cheat/gmod/IClientEntityList.hpp create mode 100644 cheat/gmod/IClientMode.hpp create mode 100644 cheat/gmod/ICvar.hpp create mode 100644 cheat/gmod/IEngineTrace.hpp create mode 100644 cheat/gmod/IGameEventManager.hpp create mode 100644 cheat/gmod/IMaterialSystem.hpp create mode 100644 cheat/gmod/IMemAlloc.hpp create mode 100644 cheat/gmod/IPanel.hpp create mode 100644 cheat/gmod/IPhysicsSurfaceProps.hpp create mode 100644 cheat/gmod/IPrediction.hpp create mode 100644 cheat/gmod/ISurface.hpp create mode 100644 cheat/gmod/IVEngineClient.hpp create mode 100644 cheat/gmod/IVModelInfoClient.hpp create mode 100644 cheat/gmod/IVRenderView.hpp create mode 100644 cheat/gmod/KeyValues.cpp create mode 100644 cheat/gmod/KeyValues.hpp create mode 100644 cheat/gmod/Source.cpp create mode 100644 cheat/gmod/Valve/dt_common.h create mode 100644 cheat/gmod/Valve/dt_recv.h create mode 100644 cheat/gmod/aimbot.cpp create mode 100644 cheat/gmod/aimbot.hpp create mode 100644 cheat/gmod/autowall.cpp create mode 100644 cheat/gmod/autowall.hpp create mode 100644 cheat/gmod/base_cheat.cpp create mode 100644 cheat/gmod/base_cheat.hpp create mode 100644 cheat/gmod/bf_write.hpp create mode 100644 cheat/gmod/c_base_player.cpp create mode 100644 cheat/gmod/c_base_player.hpp create mode 100644 cheat/gmod/c_base_weapon.cpp create mode 100644 cheat/gmod/c_base_weapon.hpp create mode 100644 cheat/gmod/chams.cpp create mode 100644 cheat/gmod/chams.hpp create mode 100644 cheat/gmod/color.hpp create mode 100644 cheat/gmod/con_alias.hpp create mode 100644 cheat/gmod/con_fn.hpp create mode 100644 cheat/gmod/console.cpp create mode 100644 cheat/gmod/console.hpp create mode 100644 cheat/gmod/context.cpp create mode 100644 cheat/gmod/context.hpp create mode 100644 cheat/gmod/create_move.cpp create mode 100644 cheat/gmod/d3d.cpp create mode 100644 cheat/gmod/d3d.hpp create mode 100644 cheat/gmod/d3d_sprite.cpp create mode 100644 cheat/gmod/d3d_sprite.hpp create mode 100644 cheat/gmod/debug_show_spread.cpp create mode 100644 cheat/gmod/directx.cpp create mode 100644 cheat/gmod/do_post_screen_space_effects.cpp create mode 100644 cheat/gmod/draw_model_execute.cpp create mode 100644 cheat/gmod/emit_sound.cpp create mode 100644 cheat/gmod/extra.cpp create mode 100644 cheat/gmod/extra.hpp create mode 100644 cheat/gmod/factory.cpp create mode 100644 cheat/gmod/factory.hpp create mode 100644 cheat/gmod/fire_bullets.cpp create mode 100644 cheat/gmod/fnv.hpp create mode 100644 cheat/gmod/frame_stage_notify.cpp create mode 100644 cheat/gmod/get_screen_size.cpp create mode 100644 cheat/gmod/get_viewmodel_fov.cpp create mode 100644 cheat/gmod/gmod.vcxproj create mode 100644 cheat/gmod/gmod.vcxproj.filters create mode 100644 cheat/gmod/hooks.cpp create mode 100644 cheat/gmod/hooks.hpp create mode 100644 cheat/gmod/hud_process_input.cpp create mode 100644 cheat/gmod/icons.hpp create mode 100644 cheat/gmod/icons/config.hpp create mode 100644 cheat/gmod/icons/legit.hpp create mode 100644 cheat/gmod/icons/misc.hpp create mode 100644 cheat/gmod/icons/rage.hpp create mode 100644 cheat/gmod/icons/visuals.hpp create mode 100644 cheat/gmod/identity.cpp create mode 100644 cheat/gmod/identity.hpp create mode 100644 cheat/gmod/iface_dllmain_impl.hpp create mode 100644 cheat/gmod/in_prediction.cpp create mode 100644 cheat/gmod/input_system.cpp create mode 100644 cheat/gmod/input_system.hpp create mode 100644 cheat/gmod/interface.cpp create mode 100644 cheat/gmod/interface.hpp create mode 100644 cheat/gmod/is_connected.cpp create mode 100644 cheat/gmod/is_hltv.cpp create mode 100644 cheat/gmod/is_paused.cpp create mode 100644 cheat/gmod/lag_mgr.cpp create mode 100644 cheat/gmod/lag_mgr.hpp create mode 100644 cheat/gmod/legitbot.cpp create mode 100644 cheat/gmod/legitbot.hpp create mode 100644 cheat/gmod/legitbot_lagcomp.cpp create mode 100644 cheat/gmod/listener.cpp create mode 100644 cheat/gmod/listener.hpp create mode 100644 cheat/gmod/lock_cursor.cpp create mode 100644 cheat/gmod/math.cpp create mode 100644 cheat/gmod/math.hpp create mode 100644 cheat/gmod/mem.hpp create mode 100644 cheat/gmod/movement.cpp create mode 100644 cheat/gmod/movement.hpp create mode 100644 cheat/gmod/movement_recorder.cpp create mode 100644 cheat/gmod/movement_recorder.hpp create mode 100644 cheat/gmod/netvar_proxy.hpp create mode 100644 cheat/gmod/netvars.cpp create mode 100644 cheat/gmod/netvars.hpp create mode 100644 cheat/gmod/on_screen_size_changed.cpp create mode 100644 cheat/gmod/override_mouse_input.cpp create mode 100644 cheat/gmod/override_view.cpp create mode 100644 cheat/gmod/paint.cpp create mode 100644 cheat/gmod/paint_traverse.cpp create mode 100644 cheat/gmod/pattern.hpp create mode 100644 cheat/gmod/play_sound.cpp create mode 100644 cheat/gmod/player_manager.cpp create mode 100644 cheat/gmod/player_manager.hpp create mode 100644 cheat/gmod/playerlist.cpp create mode 100644 cheat/gmod/playerlist.hpp create mode 100644 cheat/gmod/prediction.cpp create mode 100644 cheat/gmod/prediction.hpp create mode 100644 cheat/gmod/proxies.cpp create mode 100644 cheat/gmod/ragebot_antiaim.cpp create mode 100644 cheat/gmod/ragebot_lagcomp.cpp create mode 100644 cheat/gmod/ragebot_resolver.cpp create mode 100644 cheat/gmod/render_view.cpp create mode 100644 cheat/gmod/renderer.cpp create mode 100644 cheat/gmod/renderer.hpp create mode 100644 cheat/gmod/run_command.cpp create mode 100644 cheat/gmod/scene_end.cpp create mode 100644 cheat/gmod/sdk.hpp create mode 100644 cheat/gmod/send_datagram.cpp create mode 100644 cheat/gmod/settings.hpp create mode 100644 cheat/gmod/simple_settings.cpp create mode 100644 cheat/gmod/simple_settings.hpp create mode 100644 cheat/gmod/skins.cpp create mode 100644 cheat/gmod/skins.hpp create mode 100644 cheat/gmod/strings.hpp create mode 100644 cheat/gmod/ui.h create mode 100644 cheat/gmod/ui_base_item.h create mode 100644 cheat/gmod/ui_button.h create mode 100644 cheat/gmod/ui_checkbox.h create mode 100644 cheat/gmod/ui_color_picker.h create mode 100644 cheat/gmod/ui_draw.h create mode 100644 cheat/gmod/ui_dropdown.h create mode 100644 cheat/gmod/ui_dropdown_item.h create mode 100644 cheat/gmod/ui_form.h create mode 100644 cheat/gmod/ui_key_picker.h create mode 100644 cheat/gmod/ui_label.h create mode 100644 cheat/gmod/ui_menu.h create mode 100644 cheat/gmod/ui_render.h create mode 100644 cheat/gmod/ui_slider.h create mode 100644 cheat/gmod/ui_tab_manager.h create mode 100644 cheat/gmod/ui_text_input.h create mode 100644 cheat/gmod/util.cpp create mode 100644 cheat/gmod/util.hpp create mode 100644 cheat/gmod/vector.hpp create mode 100644 cheat/gmod/visual.hpp create mode 100644 cheat/gmod/visual_draw.cpp create mode 100644 cheat/gmod/visual_local.cpp create mode 100644 cheat/gmod/visual_player.cpp create mode 100644 cheat/gmod/visual_world.cpp create mode 100644 cheat/gmod/vmt.hpp create mode 100644 cheat/gmod/window_procedure.cpp create mode 100644 cheat/gmod/x86.hpp (limited to 'cheat/gmod') diff --git a/cheat/gmod/CHLClient.hpp b/cheat/gmod/CHLClient.hpp new file mode 100644 index 0000000..4ed244c --- /dev/null +++ b/cheat/gmod/CHLClient.hpp @@ -0,0 +1,83 @@ +#pragma once +#include "util.hpp" +#include "IClientEntityList.hpp" +#include "ClientClass.hpp" +#include "color.hpp" + +enum ClientFrameStage_t { + FRAME_UNDEFINED = -1, + FRAME_START, + FRAME_NET_UPDATE_START, + FRAME_NET_UPDATE_POSTDATAUPDATE_START, + FRAME_NET_UPDATE_POSTDATAUPDATE_END, + FRAME_NET_UPDATE_END, + FRAME_RENDER_START, + FRAME_RENDER_END +}; + +struct GlowObject_t { + IClientEntity* m_pEntity; + fclr_t color; + char junk0[ 8 ]; + float m_flBloomAmount; + char junk1[ 4 ]; + bool m_bRenderWhenOccluded; + bool m_bRenderWhenUnoccluded; + bool m_bFullBloom; + char junk2[ 14 ]; +}; + +struct GlowObjectManager_t { + GlowObject_t* DataPtr; //0000 + unsigned int Max; //0004 + unsigned int unk02; //0008 + unsigned int Count; //000C + unsigned int DataPtrBack; //0010 + int m_nFirstFreeSlot; //0014 + unsigned int unk1; //0018 + unsigned int unk2; //001C + unsigned int unk3; //0020 + unsigned int unk4; //0024 + unsigned int unk5; //0028 +}; + +class IBaseClientDLL +{ +public: + ClientClass* GetAllClasses( ) { + using fn = ClientClass*( __thiscall* )( void* ); + return util::get_vfunc< fn >( this, 8 )( this ); + } + + /* + DONTCARE + void SetCrosshairAngle( Vector& angle ) + { + typedef void( __thiscall* SetCrosshairAngleFn )( void*, Vector& ); + CallVFunction( this, 29 )( this, angle ); + } + + void HudProcessInput( bool enable ) + { + using fn = void( __thiscall* )( void*, bool ); + CallVFunction( this, 10 )( this, enable ); + } + + void HudUpdate( bool enable ) + { + using fn = void( __thiscall* )( void*, bool ); + CallVFunction( this, 11 )( this, enable ); + } + + void IN_ActivateMouse( ) + { + using fn = void( __thiscall* )( void* ); + CallVFunction( this, 15 )( this ); + } + + void IN_DeactivateMouse( ) + { + using fn = void( __thiscall* )( void* ); + CallVFunction( this, 16 )( this ); + }*/ +}; \ No newline at end of file diff --git a/cheat/gmod/CInput.hpp b/cheat/gmod/CInput.hpp new file mode 100644 index 0000000..613b849 --- /dev/null +++ b/cheat/gmod/CInput.hpp @@ -0,0 +1,44 @@ +#pragma once +#include "vector.hpp" +#include "IClientMode.hpp" + +class CInput { + void* pvftable; //0x00 +public: + bool m_fTrackIRAvailable; //0x04 + bool m_fMouseInitialized; //0x05 + bool m_fMouseActive; //0x06 + bool m_fJoystickAdvancedInit; //0x07 +private: + char pad_0x08[ 0x2C ]; //0x08 +public: + void* m_pKeys; //0x34 +private: + char pad_0x38[ 0x64 ]; //0x38 + int pad_0x41; + int pad_0x42; +public: + bool m_fCameraInterceptingMouse; //0x9C + bool m_fCameraInThirdPerson; //0x9D + bool m_fCameraMovingWithMouse; //0x9E + vec3_t m_vecCameraOffset; //0xA0 + bool m_fCameraDistanceMove; //0xAC + int m_nCameraOldX; //0xB0 + int m_nCameraOldY; //0xB4 + int m_nCameraX; //0xB8 + int m_nCameraY; //0xBC + bool m_CameraIsOrthographic; //0xC0 + vec3_t m_angPreviousViewAngles; //0xC4 + vec3_t m_angPreviousViewAnglesTilt; //0xD0 + float m_flLastForwardMove; //0xDC + int m_nClearInputState; //0xE0 +private: + char pad_0xE4[ 0x8 ]; //0xE4 +public: + user_cmd_t* m_pCommands; //0xEC + void* m_pVerifiedCommands; //0xF0 + + user_cmd_t* GetUserCmd( int slot, int seq_num ) { + return util::get_vfunc< 8, user_cmd_t* >( this, slot, seq_num ); + } +}; diff --git a/cheat/gmod/CLuaInterface.hpp b/cheat/gmod/CLuaInterface.hpp new file mode 100644 index 0000000..adc0f7b --- /dev/null +++ b/cheat/gmod/CLuaInterface.hpp @@ -0,0 +1,246 @@ +#pragma once + +#include +#include + +#include "vector.hpp" +#include "color.hpp" + +#define LUA_REGISTRYINDEX (-10000) +#define LUA_ENVIRONINDEX (-10001) +#define LUA_GLOBALSINDEX (-10002) + +class CLuaInterface; + +enum STATE_TYPE +{ + LUA_CLIENT = 0, + LUA_SERVER, + LUA_MENU +}; + + +enum LUA_SPECIAL +{ + SPECIAL_GLOB, + SPECIAL_ENV, + SPECIAL_REG, +}; + + +enum LUA_TYPE : int8_t { + TYPE_INVALID = -1, + TYPE_NIL, + TYPE_BOOL, + TYPE_LIGHTUSERDATA, + TYPE_NUMBER, + _TYPE_STRING, + TYPE_TABLE, + TYPE_FUNCTION, + TYPE_USERDATA, + TYPE_THREAD, + + TYPE_ENTITY, + TYPE_VECTOR, + TYPE_ANGLE, + TYPE_PHYSOBJ, + TYPE_SAVE, + TYPE_RESTORE, + TYPE_DAMAGEINFO, + TYPE_EFFECTDATA, + TYPE_MOVEDATA, + TYPE_RECIPIENTFILTER, + TYPE_USERCMD, + TYPE_SCRIPTEDVEHICLE, + + TYPE_MATERIAL, + TYPE_PANEL, + TYPE_PARTICLE, + TYPE_PARTICLEEMITTER, + TYPE_TEXTURE, + TYPE_USERMSG, + + TYPE_CONVAR, + TYPE_IMESH, + TYPE_MATRIX, + TYPE_SOUND, + TYPE_PIXELVISHANDLE, + TYPE_DLIGHT, + TYPE_VIDEO, + TYPE_FILE, + + TYPE_COUNT, + + TYPE_PLAYER = TYPE_ENTITY, +}; + +struct lua_State +{ + uint8_t header[ 69 ]; + CLuaInterface* m_lua_base; +}; + +struct UserData +{ + void* data; + LUA_TYPE type; +}; + +using CLuaFunction = int( __cdecl* )( lua_State* ); + +class CLuaInterface +{ +public: + virtual int Top( void ) = 0; + virtual void Push( int iStackPos ) = 0; + virtual void Pop( int iAmt = 1 ) = 0; + virtual void GetTable( int iStackPos ) = 0; + virtual void GetField( int iStackPos, const char* strName ) = 0; + virtual void SetField( int iStackPos, const char* strName ) = 0; + virtual void CreateTable( ) = 0; + virtual void SetTable( int i ) = 0; + virtual void SetMetaTable( int i ) = 0; + virtual bool GetMetaTable( int i ) = 0; + virtual void Call( int iArgs, int iResults ) = 0; + virtual int PCall( int iArgs, int iResults, int iErrorFunc ) = 0; + virtual int Equal( int iA, int iB ) = 0; + virtual int RawEqual( int iA, int iB ) = 0; + virtual void Insert( int iStackPos ) = 0; + virtual void Remove( int iStackPos ) = 0; + virtual int Next( int iStackPos ) = 0; + virtual void* NewUserdata( unsigned int iSize ) = 0; + virtual void ThrowError( const char* strError ) = 0; + virtual void CheckType( int iStackPos, int iType ) = 0; + virtual void ArgError( int iArgNum, const char* strMessage ) = 0; + virtual void RawGet( int iStackPos ) = 0; + virtual void RawSet( int iStackPos ) = 0; + + virtual const char* GetString( int iStackPos = -1, unsigned int* iOutLen = NULL ) = 0; + virtual double GetNumber( int iStackPos = -1 ) = 0; + virtual bool GetBool( int iStackPos = -1 ) = 0; + virtual CLuaFunction* GetCFunction( int iStackPos = -1 ) = 0; + virtual void* GetUserdata( int iStackPos = -1 ) = 0; + + virtual void PushNil( ) = 0; + virtual void PushString( const char* val, unsigned int iLen = 0 ) = 0; + virtual void PushNumber( double val ) = 0; + virtual void PushBool( bool val ) = 0; + virtual void PushCFunction( CLuaFunction* val ) = 0; + virtual void PushCClosure( CLuaFunction* val, int iVars ) = 0; + virtual void PushUserdata( void* ) = 0; + + // + // If you create a reference - don't forget to free it! + // + virtual int ReferenceCreate( ) = 0; + virtual void ReferenceFree( int i ) = 0; + virtual void ReferencePush( int i ) = 0; + + // + // Push a special value onto the top of the stack ( see below ) + // + virtual void PushSpecial( int iType ) = 0; + + // + // For type enums see Types.h + // + virtual bool IsType( int iStackPos, int iType ) = 0; + virtual int GetType( int iStackPos ) = 0; + virtual const char* GetTypeName( int iType ) = 0; + + // + // Creates a new meta table of string and type and leaves it on the stack. + // Will return the old meta table of this name if it already exists. + // + virtual void CreateMetaTableType( const char* strName, int iType ) = 0; + + // + // Like Get* but throws errors and returns if they're not of the expected type + // + virtual const char* CheckString( int iStackPos = -1 ) = 0; + virtual double CheckNumber( int iStackPos = -1 ) = 0; + + + virtual void ObjLen( int ) = 0; + virtual void GetAngle( int ) = 0; + virtual void GetVector( int ) = 0; + virtual void PushAngle( vec3_t const& ) = 0; + virtual void PushVector( vec3_t const& ) = 0; + virtual void SetState( lua_State * ) = 0; + virtual void CreateMetaTable( char const* ) = 0; + virtual void PushMetaTable( int ) = 0; + virtual void PushUserType( void *, int ) = 0; + virtual void SetUserType( int, void * ) = 0; + virtual void Init( void *, bool ) = 0; + virtual void Shutdown( void ) = 0; + virtual void Cycle( void ) = 0; + virtual void Global( void ) = 0; + virtual void* GetObject( int ) = 0; + virtual void PushLuaObject( void * ) = 0; + virtual void PushLuaFunction( CLuaFunction ) = 0; + virtual void LuaError( char const*, int ) = 0; + virtual void TypeError( char const*, int ) = 0; + virtual void CallInternal( int, int ) = 0; + virtual void CallInternalNoReturns( int ) = 0; + virtual void CallInternalGetBool( int ) = 0; + virtual void CallInternalGetString( int ) = 0; + virtual void CallInternalGet( int, void * ) = 0; + virtual void NewGlobalTable( char const* ) = 0; + virtual void NewTemporaryObject( void ) = 0; + virtual void isUserData( int ) = 0; + virtual void GetMetaTableObject( char const*, int ) = 0; + virtual void GetMetaTableObject( int ) = 0; + virtual void GetReturn( int ) = 0; + virtual void IsServer( void ) = 0; + virtual void IsClient( void ) = 0; + virtual void IsDedicatedServer( void ) = 0; + virtual void DestroyObject( void * ) = 0; + virtual void CreateObject( void ) = 0; + virtual void SetMember( void *, void *, void * ) = 0; + virtual void GetNewTable( void ) = 0; + virtual void SetMember( void *, float ) = 0; + virtual void SetMember( void *, float, void * ) = 0; + virtual void SetMember( void *, char const* ) = 0; + virtual void SetMember( void *, char const*, void * ) = 0; + virtual void SetIsServer( bool ) = 0; + virtual void PushLong( long ) = 0; + virtual void GetFlags( int ) = 0; + virtual void FindOnObjectsMetaTable( int, int ) = 0; + virtual void FindObjectOnTable( int, int ) = 0; + virtual void SetMemberFast( void *, int, int ) = 0; + virtual void RunString( char const* filename, char const* path, char const* stringtoun, bool run = true, bool showerrors = true ) = 0; + virtual void IsEqual( void *, void * ) = 0; + virtual void Error( char const* ) = 0; + virtual void GetStringOrError( int ) = 0; + virtual void RunLuaModule( char const* ) = 0; + virtual void FindAndRunScript( const char* path, bool run = true, bool showerrors = true, const char* type = "!CLIENT" ) = 0; + virtual void SetPathID( char const* ) = 0; + virtual void GetPathID( void ) = 0; + virtual void ErrorNoHalt( char const*, ... ) = 0; + virtual void Msg( char const*, ... ) = 0; + virtual void PushPath( char const* ) = 0; + virtual void PopPath( void ) = 0; + virtual void GetPath( void ) = 0; + virtual void GetColor( int ) = 0; + virtual void PushColor( clr_t ) = 0; + virtual int GetStack( int, void * ) = 0; + virtual void GetInfo( char const*, void * ) = 0; + virtual void GetLocal( void *, int ) = 0; + virtual void GetUpvalue( int, int ) = 0; + virtual void RunStringEx( void*, char const* filename, char const* path, char const* torun, bool run, bool showerrors, bool idk, bool idk2 ) = 0; + virtual void GetDataString( int, void ** ) = 0; + virtual void ErrorFromLua( char const*, ... ) = 0; + virtual void GetCurrentLocation( void ) = 0; + virtual void MsgColour( clr_t const&, char const*, ... ) = 0; + virtual void GetCurrentFile( std::string & ) = 0; + virtual void CompileString( int &, std::string const& ) = 0; + virtual void CallFunctionProtected( int, int, bool ) = 0; + virtual void Require( char const* ) = 0; + virtual void GetActualTypeName( int ) = 0; + virtual void PreCreateTable( int, int ) = 0; + virtual void PushPooledString( int ) = 0; + virtual void GetPooledString( int ) = 0; + virtual void AddThreadedCall( void * ) = 0; + + lua_State* L; +}; diff --git a/cheat/gmod/CLuaShared.hpp b/cheat/gmod/CLuaShared.hpp new file mode 100644 index 0000000..1a46e74 --- /dev/null +++ b/cheat/gmod/CLuaShared.hpp @@ -0,0 +1,15 @@ +#pragma once + +#include "CLuaInterface.hpp" + +class CLuaShared +{ +public: + virtual ~CLuaShared( ); + virtual void Init( ); + virtual void ShutDown( ); + virtual void DumpStats( ); + virtual CLuaInterface* CreateLuaInterface( STATE_TYPE, bool ); + virtual void CloseLuaInterface( CLuaInterface* ); + virtual CLuaInterface* GetLuaInterface( STATE_TYPE ); +}; \ No newline at end of file diff --git a/cheat/gmod/CUtlVector.hpp b/cheat/gmod/CUtlVector.hpp new file mode 100644 index 0000000..a212270 --- /dev/null +++ b/cheat/gmod/CUtlVector.hpp @@ -0,0 +1,47 @@ +#pragma once + +template +class CUtlMemory { +public: + T* GetBuffer( void ) { + return m_pMemory; + } + + int GetAllocationCount( void ) { + return m_nAllocationCount; + } + + int GetGrowSize( void ) { + return m_nGrowSize; + } + + T* OffsetBufferByIndex( size_t index ) { + return m_pMemory + index; + } + +private: + T* m_pMemory; + int m_nAllocationCount; + int m_nGrowSize; +}; + +template > +class CUtlVector { +public: + Allocator GetMemory( void ) { + return m_Memory; + } + + int GetSize( void ) { + return m_Size; + } + + T* GetElements( void ) { + return m_pElements; + } + +private: + Allocator m_Memory; + int m_Size; + T* m_pElements; +}; \ No newline at end of file diff --git a/cheat/gmod/ClientClass.hpp b/cheat/gmod/ClientClass.hpp new file mode 100644 index 0000000..b1d69dd --- /dev/null +++ b/cheat/gmod/ClientClass.hpp @@ -0,0 +1,14 @@ +#pragma once +#include "Valve/dt_common.h" +#include "Valve/dt_recv.h" + + +class ClientClass { +public: + void* m_create_fn; + void* m_createevent_fn; + char* m_name; + RecvTable* m_rt_table; + ClientClass* m_next; + int m_class_id; +}; \ No newline at end of file diff --git a/cheat/gmod/GlobalVars_t.hpp b/cheat/gmod/GlobalVars_t.hpp new file mode 100644 index 0000000..820fe0d --- /dev/null +++ b/cheat/gmod/GlobalVars_t.hpp @@ -0,0 +1,16 @@ +#pragma once + +class global_vars_t { +public: + float m_realtime; + int m_framecount; + float m_absframetime; + float m_curtime; + float m_frametime; + int m_maxclients; + int m_tickcount; + float m_interval_per_tick; + float m_interpolation_amount; + int m_sim_ticks; + int m_network_protocol; +}; \ No newline at end of file diff --git a/cheat/gmod/IAppSystem.hpp b/cheat/gmod/IAppSystem.hpp new file mode 100644 index 0000000..a8cf475 --- /dev/null +++ b/cheat/gmod/IAppSystem.hpp @@ -0,0 +1,24 @@ +#pragma once + +class AppSystemInfo_t; + +enum InitReturnVal_t; + +enum AppSystemTier_t { + APP_SYSTEM_TIER0 = 0, + APP_SYSTEM_TIER1, + APP_SYSTEM_TIER2, + APP_SYSTEM_TIER3, + + APP_SYSTEM_TIER_OTHER, +}; + + +class IAppSystem { +public: + virtual bool Connect( void* factory ) = 0; + virtual void Disconnect( ) = 0; + virtual void* QueryInterface( const char* pInterfaceName ) = 0; + virtual InitReturnVal_t Init( ) = 0; + virtual void Shutdown( ) = 0; +}; \ No newline at end of file diff --git a/cheat/gmod/IClientEntityList.hpp b/cheat/gmod/IClientEntityList.hpp new file mode 100644 index 0000000..2a0ac28 --- /dev/null +++ b/cheat/gmod/IClientEntityList.hpp @@ -0,0 +1,144 @@ +#pragma once +#include "util.hpp" +#include "vector.hpp" +#include "ClientClass.hpp" +#include "IVEngineClient.hpp" + +class ICollideable; +class IClientNetworkable; +class IClientRenderable; +class IClientThinkable; +class IClientEntity; +class IClientAlphaProperty; +class bf_read; +using model_t = uintptr_t; + + +class c_base_player; + +class IClientUnknown { +public: + virtual ICollideable* GetCollideable( ) = 0; + virtual IClientNetworkable* GetClientNetworkable( ) = 0; + virtual IClientRenderable* GetClientRenderable( ) = 0; + virtual IClientEntity* GetIClientEntity( ) = 0; + virtual IClientEntity* GetBaseEntity( ) = 0; + virtual IClientThinkable* GetClientThinkable( ) = 0; + //virtual IClientModelRenderable* GetClientModelRenderable() = 0; + virtual IClientAlphaProperty* GetClientAlphaProperty( ) = 0; +}; + +class IClientNetworkable { +public: + virtual IClientUnknown* GetIClientUnknown( ) = 0; + virtual void Release( ) = 0; + virtual ClientClass* GetClientClass( ) = 0; + virtual void NotifyShouldTransmit( int state ) = 0; + virtual void OnPreDataChanged( int updateType ) = 0; + virtual void OnDataChanged( int updateType ) = 0; + virtual void PreDataUpdate( int updateType ) = 0; + virtual void PostDataUpdate( int updateType ) = 0; + virtual bool IsDormant( void ) = 0; + virtual int EntIndex( void ) const = 0; + virtual void ReceiveMessage( int classID, bf_read& msg ) = 0; + virtual void* GetDataTableBasePtr( ) = 0; + virtual void SetDestroyedOnRecreateEntities( void ) = 0; +}; + +class IClientEntity { +public: + void* GetClientRenderable( ) { + return reinterpret_cast< void* >( this + 0x4 ); + } + + IClientNetworkable* GetClientNetworkable( ) { + return reinterpret_cast< IClientNetworkable* >( this + 0x8 ); + } + + ICollideable* GetCollideable( ) { + using fn = ICollideable* ( __thiscall* )( void* ); + return util::get_vfunc< fn >( this, 2 )( this ); + } + + vec3_t& GetRenderOrigin( ) { + using fn = vec3_t& ( __thiscall* )( void* ); + return util::get_vfunc< fn >( this, 9 )( this ); + } + + vec3_t& GetRenderAngles( ) { + using fn = vec3_t& ( __thiscall* )( void* ); + return util::get_vfunc< fn >( this, 10 )( this ); + } + + ClientClass* GetClientClass( ) { + try { + return GetClientNetworkable( )->GetClientClass( ); + } + catch( ... ) { + return 0; + } + } + + bool IsDormant( ) { + return GetClientNetworkable( )->IsDormant( ); + } + + int GetIndex( ) { + return GetClientNetworkable( )->EntIndex( ); + } + + model_t* GetModel( ) { + using fn = model_t* ( __thiscall* )( void* ); + return util::get_vfunc< fn >( this->GetClientRenderable( ), 9 )( this->GetClientRenderable( ) ); + } + + int DrawModel( int flags, uint8_t alpha ) { + using fn = int( __thiscall* )( void*, int, uint8_t ); + return util::get_vfunc< fn >( this->GetClientRenderable( ), 10 )( this->GetClientRenderable( ), flags, alpha ); + } + + bool SetupBones( matrix3x4* bone_to_world, int max_bones, int mask, float time ) { + using fn = bool( __thiscall* )( void*, matrix3x4*, int, int, float ); + return util::get_vfunc< fn >( GetClientRenderable( ), 16 ) + ( GetClientRenderable( ), bone_to_world, max_bones, mask, time ); + } + + void PushEntity( ) { + return util::get_vfunc< 172, void >( this ); + } + + bool IsWeapon( ) { + return util::get_vfunc< 167, bool >( this ); + } + + template < typename t > + t* as( ) { + return reinterpret_cast< t* >( this ); + } +}; + +class IClientEntityList +{ +public: + IClientNetworkable* GetClientNetworkable( int index ) { + using fn = IClientNetworkable* ( __thiscall* )( void*, int ); + return util::get_vfunc< fn >( this, 1 )( this, index ); + } + + template < typename t = c_base_player > + t* GetClientEntity( int index ) { + using fn = t* ( __thiscall* )( void*, int ); + return util::get_vfunc< fn >( this, 3 )( this, index ); + } + + template < typename t = c_base_player > + t* GetClientEntityFromHandle( uint32_t handle ) { + using fn = t* ( __thiscall* )( void*, int ); + return util::get_vfunc< fn >( this, 4 )( this, handle ); + } + + int GetHighestEntityIndex( ) { + using fn = int( __thiscall* )( void* ); + return util::get_vfunc< fn >( this, 6 )( this ); + } +}; \ No newline at end of file diff --git a/cheat/gmod/IClientMode.hpp b/cheat/gmod/IClientMode.hpp new file mode 100644 index 0000000..4996af6 --- /dev/null +++ b/cheat/gmod/IClientMode.hpp @@ -0,0 +1,139 @@ +#pragma once +#include "util.hpp" +#include "vector.hpp" + +enum player_controls_t { + IN_ATTACK = 1 << 0, + IN_JUMP = 1 << 1, + IN_DUCK = 1 << 2, + IN_FORWARD = 1 << 3, + IN_BACK = 1 << 4, + IN_USE = 1 << 5, + IN_CANCEL = 1 << 6, + IN_LEFT = 1 << 7, + IN_RIGHT = 1 << 8, + IN_MOVELEFT = 1 << 9, + IN_MOVERIGHT = 1 << 10, + IN_ATTACK2 = 1 << 11, + IN_RUN = 1 << 12, + IN_RELOAD = 1 << 13, + IN_ALT1 = 1 << 14, + IN_ALT2 = 1 << 15, + IN_SCORE = 1 << 16, + IN_SPEED = 1 << 17, + IN_WALK = 1 << 18, + IN_ZOOM = 1 << 19, + IN_WEAPON1 = 1 << 20, + IN_WEAPON2 = 1 << 21, + IN_BULLRUSH = 1 << 22, + IN_GRENADE1 = 1 << 23, + IN_GRENADE2 = 1 << 24, + IN_ATTACK3 = 1 << 25, +}; + +class user_cmd_t { +public: + int m_cmd_nr; // 0x0 virtual deconstructor removed + int m_tick_count; // 0x4 + vec3_t m_viewangles; // 0x8 + float m_forwardmove; // 0x14 + float m_sidemove; // 0x18 + float m_upmove; // 0x1C + int m_buttons; // 0x20 + uint8_t m_impulse; // 0x24 + int m_weaponselect; // 0x25 + int m_weaponsubtype; // 0x29 + int m_random_seed; // 0x2D + short m_mousedx; // 0x31 + short m_mousedy; // 0x33 + bool m_predicted; // 0x35 +private: + uint8_t m_pad_0x36[ 0x6 ]; // 0x36 +public: + bool m_world_clicking; // 0x3F + vec3_t m_world_click_direction; // 0x40 + + + __forceinline user_cmd_t clamp( ) { + m_viewangles.clamp( ); + + m_forwardmove = std::clamp( m_forwardmove, -10000.f, 10000.f ); + m_sidemove = std::clamp( m_sidemove, -10000.f, 10000.f ); + m_upmove = std::clamp( m_upmove, -10000.f, 10000.f ); + + return *this; + } + +private: + uint8_t m_pad_0x52[ 0xF2 ]; // 0x52 sizeof( user_cmd_t ) = 0x144 HUGE in gmod +}; + +class CHudChat { +public: + void ChatPrintf( int iPlayerIndex, int iFilter, const char* fmt ) { + using fn = void( __cdecl* )( void*, int, int, const char* ); + util::get_vfunc< fn >( this, 26 )( this, iPlayerIndex, iFilter, fmt ); + } +}; + +enum StereoEye_t +{ + STEREO_EYE_MONO = 0, + STEREO_EYE_LEFT = 1, + STEREO_EYE_RIGHT = 2, + STEREO_EYE_MAX = 3, +}; + + +class CViewSetup +{ +public: + int x; + int m_nUnscaledX; + int y; + int m_nUnscaledY; + int width; + int m_nUnscaledWidth; + int height; + StereoEye_t m_eStereoEye; + int m_nUnscaledHeight; + + bool m_bOrtho; + float m_OrthoLeft; + float m_OrthoTop; + float m_OrthoRight; + float m_OrthoBottom; + + float fov; + float fovViewmodel; + + vec3_t origin; + + vec3_t angles; + float zNear; + float zFar; + + float zNearViewmodel; + float zFarViewmodel; + + bool m_bRenderToSubrectOfLargerScreen; + float m_flAspectRatio; + + bool m_bOffCenter; + float m_flOffCenterTop; + float m_flOffCenterBottom; + float m_flOffCenterLeft; + float m_flOffCenterRight; + + bool m_bDoBloomAndToneMapping; + bool m_bCacheFullSceneState; + bool m_bViewToProjectionOverride; +}; + + +class IClientMode { +public: + char _pad[ 28 ]; + + CHudChat* m_pChatElement; //0x2A +}; \ No newline at end of file diff --git a/cheat/gmod/ICvar.hpp b/cheat/gmod/ICvar.hpp new file mode 100644 index 0000000..8cdfca9 --- /dev/null +++ b/cheat/gmod/ICvar.hpp @@ -0,0 +1,206 @@ +#pragma once +#include "IAppSystem.hpp" +#include "util.hpp" +#include "color.hpp" + +using CVarDLLIdentifier_t = int; +class IConVar; +using FnChangeCallback_t = void( *)( IConVar *var, const char *pOldValue, float flOldValue ); +class ConCommandBase; +class ConCommand; +class ICvarQuery; + +class IConsoleDisplayFunc { +public: + virtual void ColorPrint( const uint8_t* clr, const char *pMessage ) = 0; + virtual void Print( const char *pMessage ) = 0; + virtual void DPrint( const char *pMessage ) = 0; +}; + +#define FCVAR_NONE 0 + +// Command to ConVars and ConCommands +// ConVar Systems +#define FCVAR_UNREGISTERED (1<<0) // If this is set, don't add to linked list, etc. +#define FCVAR_DEVELOPMENTONLY (1<<1) // Hidden in released products. Flag is removed automatically if ALLOW_DEVELOPMENT_CVARS is defined. +#define FCVAR_GAMEDLL (1<<2) // defined by the game DLL +#define FCVAR_CLIENTDLL (1<<3) // defined by the client DLL +#define FCVAR_HIDDEN (1<<4) // Hidden. Doesn't appear in find or autocomplete. Like DEVELOPMENTONLY, but can't be compiled out. + +// ConVar only +#define FCVAR_PROTECTED (1<<5) // It's a server cvar, but we don't send the data since it's a password, etc. Sends 1 if it's not bland/zero, 0 otherwise as value +#define FCVAR_SPONLY (1<<6) // This cvar cannot be changed by clients connected to a multiplayer server. +#define FCVAR_ARCHIVE (1<<7) // set to cause it to be saved to vars.rc +#define FCVAR_NOTIFY (1<<8) // notifies players when changed +#define FCVAR_USERINFO (1<<9) // changes the client's info string +#define FCVAR_CHEAT (1<<14) // Only useable in singleplayer / debug / multiplayer & sv_cheats + +#define FCVAR_PRINTABLEONLY (1<<10) // This cvar's string cannot contain unprintable characters ( e.g., used for player name etc ). +#define FCVAR_UNLOGGED (1<<11) // If this is a FCVAR_SERVER, don't log changes to the log file / console if we are creating a log +#define FCVAR_NEVER_AS_STRING (1<<12) // never try to print that cvar + +// It's a ConVar that's shared between the client and the server. +// At signon, the values of all such ConVars are sent from the server to the client (skipped for local +// client, of course ) +// If a change is requested it must come from the console (i.e., no remote client changes) +// If a value is changed while a server is active, it's replicated to all connected clients +#define FCVAR_REPLICATED (1<<13) // server setting enforced on clients, TODO rename to FCAR_SERVER at some time +#define FCVAR_DEMO (1<<16) // record this cvar when starting a demo file +#define FCVAR_DONTRECORD (1<<17) // don't record these command in demofiles +#define FCVAR_RELOAD_MATERIALS (1<<20) // If this cvar changes, it forces a material reload +#define FCVAR_RELOAD_TEXTURES (1<<21) // If this cvar changes, if forces a texture reload + +#define FCVAR_NOT_CONNECTED (1<<22) // cvar cannot be changed by a client that is connected to a server +#define FCVAR_MATERIAL_SYSTEM_THREAD (1<<23) // Indicates this cvar is read from the material system thread +#define FCVAR_ARCHIVE_XBOX (1<<24) // cvar written to config.cfg on the Xbox + +#define FCVAR_ACCESSIBLE_FROM_THREADS (1<<25) // used as a debugging tool necessary to check material system thread convars + +#define FCVAR_SERVER_CAN_EXECUTE (1<<28)// the server is allowed to execute this command on clients via ClientCommand/NET_StringCmd/CBaseClientState::ProcessStringCmd. +#define FCVAR_SERVER_CANNOT_QUERY (1<<29)// If this is set, then the server is not allowed to query this cvar's value (via IServerPluginHelpers::StartQueryCvarValue). +#define FCVAR_CLIENTCMD_CAN_EXECUTE (1<<30) // IVEngineClient::ClientCmd is allowed to execute this command. + + +class cvar_t { +public: + void set_value( const char* value ) { + using fn = void( __thiscall* )( void*, const char* ); + return util::get_vfunc< fn >( this, 14 )( this, value ); + } + + void set_value( float value ) { + using fn = void( __thiscall* )( void*, float ); + return util::get_vfunc< fn >( this, 15 )( this, value ); + } + + void set_value( int value ) { + using fn = void( __thiscall* )( void*, int ); + return util::get_vfunc< fn >( this, 16 )( this, value ); + } + + void set_value( clr_t value ) { + using fn = void( __thiscall* )( void*, clr_t ); + return util::get_vfunc< fn >( this, 17 )( this, value ); + } + + char* get_name( ) { + using fn = char*( __thiscall* )( void* ); + return util::get_vfunc< fn >( this, 5 )( this ); + } + + char* get_default( ) { + return m_default; + } + + const char* get_string( ) { + return m_string; + } + + float get_float( ) { + using fn = float( __thiscall* )( void* ); + return util::get_vfunc< fn >( this, 12 )( this ); + } + + int get_int( ) { + using fn = int( __thiscall* )( void* ); + return util::get_vfunc< fn >( this, 13 )( this ); + } + +private: + char pad_0x0000[ 0x4 ]; //0x0000 +public: + cvar_t* m_next; //0x0004 + __int32 m_registered; //0x0008 + char* m_name; //0x000C + char* m_help_str; //0x0010 + __int32 m_flags; //0x0014 +private: + char pad_0x0018[ 0x4 ]; //0x0018 +public: + cvar_t* m_parent; //0x001C + char* m_default; //0x0020 + char* m_string; //0x0024 + __int32 m_str_len; //0x0028 + float m_flvalue; //0x002C + __int32 m_nvalue; //0x0030 + __int32 m_has_min; //0x0034 + float m_min; //0x0038 + __int32 m_hax_max; //0x003C + float m_max; //0x0040 + void* m_change_callback; //0x0044 +};//Size=0x0048 + +class ICVar : public IAppSystem +{ +public: + // Allocate a unique DLL identifier + virtual CVarDLLIdentifier_t AllocateDLLIdentifier( ) = 0; + + // Register, unregister commands + virtual void RegisterConCommand( ConCommandBase *pCommandBase ) = 0; + virtual void UnregisterConCommand( ConCommandBase *pCommandBase ) = 0; + virtual void UnregisterConCommands( CVarDLLIdentifier_t id ) = 0; + + // If there is a + on the command line, this returns the value. + // Otherwise, it returns NULL. + virtual const char* GetCommandLineValue( const char *pVariableName ) = 0; + + // Try to find the cvar pointer by name + virtual ConCommandBase* FindCommandBase( const char *name ) = 0; + virtual const ConCommandBase* FindCommandBase( const char *name ) const = 0; + virtual cvar_t *FindVar( const char *var_name ) = 0; + virtual const cvar_t *FindVar( const char *var_name ) const = 0; + virtual ConCommand *FindCommand( const char *name ) = 0; + virtual const ConCommand *FindCommand( const char *name ) const = 0; + + + + // Install a global change callback (to be called when any convar changes) + virtual void InstallGlobalChangeCallback( FnChangeCallback_t callback ) = 0; + virtual void RemoveGlobalChangeCallback( FnChangeCallback_t callback ) = 0; + virtual void CallGlobalChangeCallbacks( cvar_t *var, const char *pOldString, float flOldValue ) = 0; + + // Install a console printer + virtual void InstallConsoleDisplayFunc( IConsoleDisplayFunc* pDisplayFunc ) = 0; + virtual void RemoveConsoleDisplayFunc( IConsoleDisplayFunc* pDisplayFunc ) = 0; + virtual void ConsoleColorPrintf( const clr_t& clr, const char *pFormat, ... ) const = 0; + virtual void ConsolePrintf( const char *pFormat, ... ) const = 0; + virtual void ConsoleDPrintf( const char *pFormat, ... ) const = 0; + + // Reverts cvars which contain a specific flag + virtual void RevertFlaggedConVars( int nFlag ) = 0; + + // Method allowing the engine ICvarQuery interface to take over + // A little hacky, owing to the fact the engine is loaded + // well after ICVar, so we can't use the standard connect pattern + virtual void InstallCVarQuery( ICvarQuery *pQuery ) = 0; + + + virtual void SetMaxSplitScreenSlots( int nSlots ) = 0; + virtual int GetMaxSplitScreenSlots( ) const = 0; + + virtual void AddSplitScreenConVars( ) = 0; + virtual void RemoveSplitScreenConVars( CVarDLLIdentifier_t id ) = 0; + + virtual int GetConsoleDisplayFuncCount( ) const = 0; + virtual void GetConsoleText( int nDisplayFuncIndex, char *pchText, size_t bufSize ) const = 0; + + // Utilities for convars accessed by the material system thread + virtual bool IsMaterialThreadSetAllowed( ) const = 0; + virtual void QueueMaterialThreadSetValue( cvar_t *pConVar, const char *pValue ) = 0; + virtual void QueueMaterialThreadSetValue( cvar_t *pConVar, int nValue ) = 0; + virtual void QueueMaterialThreadSetValue( cvar_t *pConVar, float flValue ) = 0; + virtual bool HasQueuedMaterialThreadConVarSets( ) const = 0; + virtual int ProcessQueuedMaterialThreadConVarSets( ) = 0; + + class ICVarIteratorInternal + { + public: + virtual void SetFirst( ) = 0; + virtual void Next( ) = 0; + virtual bool IsAlive( ) = 0; + virtual ConCommandBase *Get( ) = 0; + }; + + virtual ICVarIteratorInternal* FactoryInternalIterator( ) = 0; +}; \ No newline at end of file diff --git a/cheat/gmod/IEngineTrace.hpp b/cheat/gmod/IEngineTrace.hpp new file mode 100644 index 0000000..142fef9 --- /dev/null +++ b/cheat/gmod/IEngineTrace.hpp @@ -0,0 +1,380 @@ +#pragma once +#include "vector.hpp" +#include "IClientEntityList.hpp" + +enum TraceType_t { + TRACE_EVERYTHING = 0, + TRACE_WORLD_ONLY, // NOTE: This does *not* test static props!!! + TRACE_ENTITIES_ONLY, // NOTE: This version will *not* test static props + TRACE_EVERYTHING_FILTER_PROPS, // NOTE: This version will pass the IHandleEntity for props through the filter, unlike all other filters +}; + +enum SurfaceFlags_t { + DISPSURF_FLAG_SURFACE = 1 << 0, + DISPSURF_FLAG_WALKABLE = 1 << 1, + DISPSURF_FLAG_BUILDABLE = 1 << 2, + DISPSURF_FLAG_SURFPROP1 = 1 << 3, + DISPSURF_FLAG_SURFPROP2 = 1 << 4, +}; + +enum Hitgroup_t { + HITGROUP_GENERIC, + HITGROUP_HEAD, + HITGROUP_CHEST, + HITGROUP_STOMACH, + HITGROUP_LEFTARM, + HITGROUP_RIGHTARM, + HITGROUP_LEFTLEG, + HITGROUP_RIGHTLEG, + HITGROUP_GEAR +}; + +struct csurface_t { + const char* name; + short surfaceProps; + unsigned short flags; +}; + +struct cplane_t { + vec3_t normal; + float dist; + uint8_t type; + uint8_t signbits; + uint8_t pad[ 2 ]; +}; + +class ITraceFilter { +public: + virtual bool ShouldHitEntity( void* pEntity, int contentsMask ) = 0; + virtual TraceType_t GetTraceType( ) const = 0; +}; + +class CTraceFilter : public ITraceFilter { +public: + CTraceFilter( ) {} + + CTraceFilter( void *ent ) + : pSkip( ent ) {} + + bool ShouldHitEntity( void* pEntityHandle, int contentsMask ) override { + return !( pEntityHandle == pSkip ); + } + + TraceType_t GetTraceType( ) const override { + return TRACE_EVERYTHING; + } + + void* pSkip; +}; + +class CTraceFilterOneEntity : public ITraceFilter { +public: + bool ShouldHitEntity( void* entity_handle, int contents ) override { + return entity_handle == ent; + } + + TraceType_t GetTraceType( ) const override { + return TRACE_ENTITIES_ONLY; + } + + void* ent; +}; + +class CTraceFilterWorldAndPropsOnly : public ITraceFilter { +public: + bool ShouldHitEntity( void* pEntityHandle, int contentsMask ) override { + return false; + } + + TraceType_t GetTraceType( ) const override { + return TRACE_EVERYTHING; + } +}; + +class CTraceFilterEntitiesOnly : public ITraceFilter { +public: + bool ShouldHitEntity( void* pEntityHandle, int contentsMask ) override { + return !( pEntityHandle == pSkip ); + } + + TraceType_t GetTraceType( ) const override { + return TRACE_ENTITIES_ONLY; + } + + void* pSkip; +}; + +class CTraceFilterPlayersOnly : public ITraceFilter { +public: + bool ShouldHitEntity( void* pEntityHandle, int contentsMask ) override { + IClientEntity* hit_entity = ( IClientEntity* )pEntityHandle; + int index = hit_entity->GetIndex( ); + return !( pEntityHandle == pSkip || index < 1 || index > 64 ); + } + + TraceType_t GetTraceType( ) const override { + return TRACE_ENTITIES_ONLY; + } + + void* pSkip; +}; + +class CTraceFilterWorldOnly : public ITraceFilter { +public: + bool ShouldHitEntity( void* pEntityHandle, int contentsMask ) override { + return false; + } + + TraceType_t GetTraceType( ) const override { + return TRACE_WORLD_ONLY; + } + + void* pSkip; +}; + +class CTraceFilterSkipTwoEntities : public ITraceFilter { +public: + CTraceFilterSkipTwoEntities( ) { + + } + + CTraceFilterSkipTwoEntities( void* pPassEnt1, void* pPassEnt2 ) { + passentity1 = pPassEnt1; + passentity2 = pPassEnt2; + } + + bool ShouldHitEntity( void* pEntityHandle, int contentsMask ) override { + return !( pEntityHandle == passentity1 || pEntityHandle == passentity2 ); + } + + TraceType_t GetTraceType( ) const override { + return TRACE_EVERYTHING; + } + + void* passentity1; + void* passentity2; +}; + +class __declspec( align( 16 ) )VectorAligned : public vec3_t { +public: + VectorAligned( float _x, float _y, float _z ) { + x = _x; + y = _y; + z = _z; + w = 0; + } + + VectorAligned( ) { } + + void operator=( const vec3_t& vOther ) { + x = vOther.x; + y = vOther.y; + z = vOther.z; + } + + float w; +}; + +struct Ray_t +{ + VectorAligned m_Start; + VectorAligned m_Delta; + VectorAligned m_StartOffset; + VectorAligned m_Extents; + + bool m_IsRay; + bool m_IsSwept; + + Ray_t( ){ } + + void Init( const vec3_t& start, const vec3_t& end ) { + m_Delta = end - start; + + m_IsSwept = m_Delta.lengthsqr( ) != 0; + + m_Extents = vec3_t( 0.f, 0.f, 0.f ); + m_IsRay = true; + + m_StartOffset = vec3_t( 0.f, 0.f, 0.f ); + m_Start = start; + } + + void Init( const vec3_t& start, const vec3_t& end, const vec3_t& mins, const vec3_t& maxs ) { + m_Delta = end - start; + + m_IsSwept = m_Delta.lengthsqr( ) != 0; + + m_Extents = maxs - mins; + m_Extents *= 0.5f; + m_IsRay = m_Extents.lengthsqr( ) < 1e-6; + + m_StartOffset = mins + maxs; + m_StartOffset *= 0.5f; + m_Start = start + m_StartOffset; + m_StartOffset *= -1.0f; + } +}; + +class CBaseTrace +{ +public: + bool IsDispSurface( ) const { return ( dispFlags & DISPSURF_FLAG_SURFACE ) != 0; } + bool IsDispSurfaceWalkable( ) const { return ( dispFlags & DISPSURF_FLAG_WALKABLE ) != 0; } + bool IsDispSurfaceBuildable( ) const { return ( dispFlags & DISPSURF_FLAG_BUILDABLE ) != 0; } + bool IsDispSurfaceProp1( ) const { return ( dispFlags & DISPSURF_FLAG_SURFPROP1 ) != 0; } + bool IsDispSurfaceProp2( ) const { return ( dispFlags & DISPSURF_FLAG_SURFPROP2 ) != 0; } + +public: + vec3_t startpos; + vec3_t endpos; + cplane_t plane; + + float fraction; + + int contents; + unsigned short dispFlags; + + bool allsolid; + bool startsolid; + + CBaseTrace( ) {} + +private: + CBaseTrace( const CBaseTrace& vOther ); +}; + +class CGameTrace : public CBaseTrace +{ +public: + bool DidHitWorld( ) const; + + bool DidHitNonWorldEntity( ) const; + + int GetEntityIndex( ) const; + + bool DidHit( ) const + { + return fraction < 1 || allsolid || startsolid; + } + +public: + float fractionleftsolid; + csurface_t surface; + + int hitgroup; + + short physicsbone; + unsigned short worldSurfaceIndex; + + IClientEntity* m_pEnt; + int hitbox; + + CGameTrace( ) {} + CGameTrace( const CGameTrace& vOther ); +}; + +class IEngineTrace { +public: + int GetPointContents( const vec3_t& vecAbsPosition, int contentsMask = 0xffffffff ) { + using fn = int( __thiscall* )( void*, const vec3_t&, int, void* ); + return util::get_vfunc< fn >( this, 0 )( this, vecAbsPosition, contentsMask, nullptr ); + } + + void TraceRay( const Ray_t& ray, unsigned int fMask, ITraceFilter* pTraceFilter, CBaseTrace* pTrace ) { + return util::get_vfunc< 4, void >( this, ray, fMask, pTraceFilter, pTrace ); + } + + void ClipRayToEntity( const Ray_t& ray, unsigned int fMask, IClientEntity* pEnt, CBaseTrace* pTrace ) { + return util::get_vfunc< 2, void >( this, ray, fMask, pEnt, pTrace ); + } +}; + +#define CONTENTS_EMPTY 0 + +#define CONTENTS_SOLID 0x1 +#define CONTENTS_WINDOW 0x2 +#define CONTENTS_SOLID_SURF 0x3 +#define CONTENTS_AUX 0x4 +#define CONTENTS_LIGHT_SURF 0x7 +#define CONTENTS_GRATE 0x8 +#define CONTENTS_SLIME 0x10 +#define CONTENTS_WATER 0x20 +#define CONTENTS_BLOCKLOS 0x40 +#define CONTENTS_OPAQUE 0x80 +#define LAST_VISIBLE_CONTENTS CONTENTS_OPAQUE + +#define ALL_VISIBLE_CONTENTS (LAST_VISIBLE_CONTENTS | (LAST_VISIBLE_CONTENTS-1)) + +#define CONTENTS_TESTFOGVOLUME 0x100 +#define CONTENTS_UNUSED 0x200 +#define CONTENTS_BLOCKLIGHT 0x400 +#define CONTENTS_TEAM1 0x800 +#define CONTENTS_TEAM2 0x1000 +#define CONTENTS_IGNORE_NODRAW_OPAQUE 0x2000 +#define CONTENTS_MOVEABLE 0x4000 +#define CONTENTS_AREAPORTAL 0x8000 +#define CONTENTS_PLAYERCLIP 0x10000 +#define CONTENTS_MONSTERCLIP 0x20000 +#define CONTENTS_CURRENT_0 0x40000 +#define CONTENTS_CURRENT_90 0x80000 +#define CONTENTS_CURRENT_180 0x100000 +#define CONTENTS_CURRENT_270 0x200000 +#define CONTENTS_CURRENT_UP 0x400000 +#define CONTENTS_CURRENT_DOWN 0x800000 + +#define CONTENTS_ORIGIN 0x1000000 + +#define CONTENTS_MONSTER 0x2000000 +#define CONTENTS_DEBRIS 0x4000000 +#define CONTENTS_DETAIL 0x8000000 +#define CONTENTS_TRANSLUCENT 0x10000000 +#define CONTENTS_LADDER 0x20000000 +#define CONTENTS_HITBOX 0x40000000 + +#define SURF_LIGHT 0x0001 +#define SURF_SKY2D 0x0002 +#define SURF_SKY 0x0004 +#define SURF_WARP 0x0008 +#define SURF_TRANS 0x0010 +#define SURF_NOPORTAL 0x0020 +#define SURF_TRIGGER 0x0040 +#define SURF_NODRAW 0x0080 + +#define SURF_HINT 0x0100 + +#define SURF_SKIP 0x0200 +#define SURF_NOLIGHT 0x0400 +#define SURF_BUMPLIGHT 0x0800 +#define SURF_NOSHADOWS 0x1000 +#define SURF_NODECALS 0x2000 +#define SURF_NOPAINT SURF_NODECALS +#define SURF_NOCHOP 0x4000 +#define SURF_HITBOX 0x8000 + +// ----------------------------------------------------- +// spatial content masks - used for spatial queries (traceline,etc.) +// ----------------------------------------------------- +#define MASK_ALL (0xFFFFFFFF) +#define MASK_SOLID (CONTENTS_SOLID|CONTENTS_MOVEABLE|CONTENTS_WINDOW|CONTENTS_MONSTER|CONTENTS_GRATE) +#define MASK_PLAYERSOLID (CONTENTS_SOLID|CONTENTS_MOVEABLE|CONTENTS_PLAYERCLIP|CONTENTS_WINDOW|CONTENTS_MONSTER|CONTENTS_GRATE) +#define MASK_NPCSOLID (CONTENTS_SOLID|CONTENTS_MOVEABLE|CONTENTS_MONSTERCLIP|CONTENTS_WINDOW|CONTENTS_MONSTER|CONTENTS_GRATE) +#define MASK_NPCFLUID (CONTENTS_SOLID|CONTENTS_MOVEABLE|CONTENTS_MONSTERCLIP|CONTENTS_WINDOW|CONTENTS_MONSTER) +#define MASK_WATER (CONTENTS_WATER|CONTENTS_MOVEABLE|CONTENTS_SLIME) +#define MASK_OPAQUE (CONTENTS_SOLID|CONTENTS_MOVEABLE|CONTENTS_OPAQUE) +#define MASK_OPAQUE_AND_NPCS (MASK_OPAQUE|CONTENTS_MONSTER) +#define MASK_BLOCKLOS (CONTENTS_SOLID|CONTENTS_MOVEABLE|CONTENTS_BLOCKLOS) +#define MASK_BLOCKLOS_AND_NPCS (MASK_BLOCKLOS|CONTENTS_MONSTER) +#define MASK_VISIBLE (MASK_OPAQUE|CONTENTS_IGNORE_NODRAW_OPAQUE) +#define MASK_VISIBLE_AND_NPCS (MASK_OPAQUE_AND_NPCS|CONTENTS_IGNORE_NODRAW_OPAQUE) +#define MASK_SHOT (CONTENTS_SOLID|CONTENTS_MOVEABLE|CONTENTS_MONSTER|CONTENTS_WINDOW|CONTENTS_DEBRIS|CONTENTS_HITBOX) +#define MASK_SHOT_BRUSHONLY (CONTENTS_SOLID|CONTENTS_MOVEABLE|CONTENTS_WINDOW|CONTENTS_DEBRIS) +#define MASK_SHOT_HULL (CONTENTS_SOLID|CONTENTS_MOVEABLE|CONTENTS_MONSTER|CONTENTS_WINDOW|CONTENTS_DEBRIS|CONTENTS_GRATE) +#define MASK_SHOT_PORTAL (CONTENTS_SOLID|CONTENTS_MOVEABLE|CONTENTS_WINDOW|CONTENTS_MONSTER) +#define MASK_SOLID_BRUSHONLY (CONTENTS_SOLID|CONTENTS_MOVEABLE|CONTENTS_WINDOW|CONTENTS_GRATE) +#define MASK_PLAYERSOLID_BRUSHONLY (CONTENTS_SOLID|CONTENTS_MOVEABLE|CONTENTS_WINDOW|CONTENTS_PLAYERCLIP|CONTENTS_GRATE) +#define MASK_NPCSOLID_BRUSHONLY (CONTENTS_SOLID|CONTENTS_MOVEABLE|CONTENTS_WINDOW|CONTENTS_MONSTERCLIP|CONTENTS_GRATE) +#define MASK_NPCWORLDSTATIC (CONTENTS_SOLID|CONTENTS_WINDOW|CONTENTS_MONSTERCLIP|CONTENTS_GRATE) +#define MASK_NPCWORLDSTATIC_FLUID (CONTENTS_SOLID|CONTENTS_WINDOW|CONTENTS_MONSTERCLIP) +#define MASK_SPLITAREAPORTAL (CONTENTS_WATER|CONTENTS_SLIME) +#define MASK_CURRENT (CONTENTS_CURRENT_0|CONTENTS_CURRENT_90|CONTENTS_CURRENT_180|CONTENTS_CURRENT_270|CONTENTS_CURRENT_UP|CONTENTS_CURRENT_DOWN) +#define MASK_DEADSOLID (CONTENTS_SOLID|CONTENTS_PLAYERCLIP|CONTENTS_WINDOW|CONTENTS_GRATE) \ No newline at end of file diff --git a/cheat/gmod/IGameEventManager.hpp b/cheat/gmod/IGameEventManager.hpp new file mode 100644 index 0000000..f2e7c25 --- /dev/null +++ b/cheat/gmod/IGameEventManager.hpp @@ -0,0 +1,77 @@ +#pragma once +#include "util.hpp" + +class IGameEvent +{ +public: + const char* GetName( ) { + return util::get_vfunc< 1, const char* >( this ); + } + + int GetInt( const char* szKeyName, int nDefault = 0 ) { + return util::get_vfunc< 6, int >( this, szKeyName, nDefault ); + } + + float GetFloat( const char* name, float default_ = 0 ) { + return util::get_vfunc< 8, float >( this, name, default_ ); + } + + const char* GetString( const char* szKeyName ) { + return util::get_vfunc< 9, const char* >( this, szKeyName, 0 ); + } + + void SetString( const char* szKeyName, const char* szValue ) { + return util::get_vfunc< 16, void >( this, szKeyName, szValue ); + } +}; + +class IGameEventListener2 { +public: + virtual ~IGameEventListener2( void ) {}; + + // FireEvent is called by EventManager if event just occured + // KeyValue memory will be freed by manager if not needed anymore + virtual void FireGameEvent( IGameEvent* event ) = 0; + + virtual int GetEventDebugID( void ) = 0; +}; + +class IGameEventManager2 { +public: + virtual ~IGameEventManager2( void ) {}; + + // load game event descriptions from a file eg "resource\gameevents.res" + virtual int LoadEventsFromFile( const char* filename ) = 0; + + // removes all and anything + virtual void Reset( ) = 0; + + // adds a listener for a particular event + virtual bool AddListener( IGameEventListener2* listener, const char* name, bool bServerSide ) = 0; + + // returns true if this listener is listens to given event + virtual bool FindListener( IGameEventListener2* listener, const char* name ) = 0; + + // removes a listener + virtual void RemoveListener( IGameEventListener2* listener ) = 0; + + // create an event by name, but doesn't fire it. returns NULL is event is not + // known or no listener is registered for it. bForce forces the creation even if no listener is active + virtual IGameEvent* CreateEvent( const char* name, bool bForce = false, int* pCookie = nullptr ) = 0; + + // fires a server event created earlier, if bDontBroadcast is set, event is not send to clients + virtual bool FireEvent( IGameEvent* event, bool bDontBroadcast = false ) = 0; + + // fires an event for the local client only, should be used only by client code + virtual bool FireEventClientSide( IGameEvent* event ) = 0; + + // create a new copy of this event, must be free later + virtual IGameEvent* DuplicateEvent( IGameEvent* event ) = 0; + + // if an event was created but not fired for some reason, it has to bee freed, same UnserializeEvent + virtual void FreeEvent( IGameEvent* event ) = 0; + + // write/read event to/from bitbuffer + virtual bool SerializeEvent( IGameEvent* event, int* buf ) = 0; + virtual IGameEvent* UnserializeEvent( void* buf ) = 0; // create new KeyValues, must be deleted +}; \ No newline at end of file diff --git a/cheat/gmod/IMaterialSystem.hpp b/cheat/gmod/IMaterialSystem.hpp new file mode 100644 index 0000000..c9b9490 --- /dev/null +++ b/cheat/gmod/IMaterialSystem.hpp @@ -0,0 +1,163 @@ +#pragma once +#include "util.hpp" +#include "ISurface.hpp" + +using MaterialHandle_t = unsigned short; + +enum MaterialVarFlags_t { + MATERIAL_VAR_DEBUG = 1 << 0, + MATERIAL_VAR_NO_DEBUG_OVERRIDE = 1 << 1, + MATERIAL_VAR_NO_DRAW = 1 << 2, + MATERIAL_VAR_USE_IN_FILLRATE_MODE = 1 << 3, + + MATERIAL_VAR_VERTEXCOLOR = 1 << 4, + MATERIAL_VAR_VERTEXALPHA = 1 << 5, + MATERIAL_VAR_SELFILLUM = 1 << 6, + MATERIAL_VAR_ADDITIVE = 1 << 7, + MATERIAL_VAR_ALPHATEST = 1 << 8, + MATERIAL_VAR_MULTIPASS = 1 << 9, + MATERIAL_VAR_ZNEARER = 1 << 10, + MATERIAL_VAR_MODEL = 1 << 11, + MATERIAL_VAR_FLAT = 1 << 12, + MATERIAL_VAR_NOCULL = 1 << 13, + MATERIAL_VAR_NOFOG = 1 << 14, + MATERIAL_VAR_IGNOREZ = 1 << 15, + MATERIAL_VAR_DECAL = 1 << 16, + MATERIAL_VAR_ENVMAPSPHERE = 1 << 17, + MATERIAL_VAR_NOALPHAMOD = 1 << 18, + MATERIAL_VAR_ENVMAPCAMERASPACE = 1 << 19, + MATERIAL_VAR_BASEALPHAENVMAPMASK = 1 << 20, + MATERIAL_VAR_TRANSLUCENT = 1 << 21, + MATERIAL_VAR_NORMALMAPALPHAENVMAPMASK = 1 << 22, + MATERIAL_VAR_NEEDS_SOFTWARE_SKINNING = 1 << 23, + MATERIAL_VAR_OPAQUETEXTURE = 1 << 24, + MATERIAL_VAR_ENVMAPMODE = 1 << 25, + MATERIAL_VAR_SUPPRESS_DECALS = 1 << 26, + MATERIAL_VAR_HALFLAMBERT = 1 << 27, + MATERIAL_VAR_WIREFRAME = 1 << 28, +}; + +class ITexture { +public: + int GetActualWidth( ) { + return util::get_vfunc< 3, int >( this ); + } + + int GetActualHeight( ) { + return util::get_vfunc< 4, int >( this ); + } +}; + +class IMaterial { +public: + auto GetName( ) { + return util::get_vfunc< 0, const char* >( this ); + } + + auto GetTextureGroupName( ) { + return util::get_vfunc< 1, const char* >( this ); + } + + void IncrementReferenceCount( ) { + return util::get_vfunc< 14, void >( this ); + } + + void AlphaModulate( float alpha ) { + return util::get_vfunc< 27, void >( this, alpha ); + } + + void ColorModulate( float r, float g, float b ) { + return util::get_vfunc< 28, void >( this, r, g, b ); + } + + void SetMaterialVarFlag( MaterialVarFlags_t flag, bool on ) { + return util::get_vfunc< 29, void >( this, flag, on ); + } + + bool GetMaterialVarFlag( MaterialVarFlags_t flag ) { + return util::get_vfunc< 30, bool >( this, flag ); + } + + auto GetAlphaModulation( ) { + return util::get_vfunc< 44, float >( this ); + } + + void GetColorModulate( float* r, float* g, float* b ) { + return util::get_vfunc< 45, void >( this, r, g, b ); + } + + void Refresh( ) { + return util::get_vfunc< 37, void >( this ); + } +}; + +class IMaterialSystem +{ +public: + enum RenderTargetSizeMode_t { + RT_SIZE_NO_CHANGE = 0, // Only allowed for render targets that don't want a depth buffer + // (because if they have a depth buffer, the render target must be less than or equal to the size of the framebuffer). + RT_SIZE_DEFAULT = 1, // Don't play with the specified width and height other than making sure it fits in the framebuffer. + RT_SIZE_PICMIP = 2, // Apply picmip to the render target's width and height. + RT_SIZE_HDR = 3, // frame_buffer_width / 4 + RT_SIZE_FULL_FRAME_BUFFER = 4, // Same size as frame buffer, or next lower power of 2 if we can't do that. + RT_SIZE_OFFSCREEN = 5, // Target of specified size, don't mess with dimensions + RT_SIZE_FULL_FRAME_BUFFER_ROUNDED_UP = 6 // Same size as the frame buffer, rounded up if necessary for systems that can't do non-power of two textures. + }; + + enum MaterialRenderTargetDepth_t { + MATERIAL_RT_DEPTH_SHARED = 0x0, + MATERIAL_RT_DEPTH_SEPARATE = 0x1, + MATERIAL_RT_DEPTH_NONE = 0x2, + MATERIAL_RT_DEPTH_ONLY = 0x3, + }; + + ImageFormat GetBackBufferFormat( ) { + return util::get_vfunc< 36, ImageFormat >( this ); + } + + IMaterial* CreateMaterial( const char* pMaterialName, void* pVMTKeyValues ) { + return util::get_vfunc< 83, IMaterial* >( this, pMaterialName, pVMTKeyValues ); + } + + IMaterial* FindMaterial( const char* pMaterialName, const char* pTextureGroupName = "Model textures", bool complain = true, const char* pComplainPrefix = nullptr ) { + return util::get_vfunc< 84, IMaterial* >( this, pMaterialName, pTextureGroupName, complain, pComplainPrefix ); + } + + MaterialHandle_t FirstMaterial( ) { + return util::get_vfunc< 86, MaterialHandle_t >( this ); + } + + MaterialHandle_t NextMaterial( MaterialHandle_t h ) { + return util::get_vfunc< 87, MaterialHandle_t >( this, h ); + } + + MaterialHandle_t InvalidMaterial( ) { + return util::get_vfunc< 88, MaterialHandle_t >( this ); + } + + IMaterial* GetMaterial( MaterialHandle_t h ) { + return util::get_vfunc< 89, IMaterial* >( this, h ); + } + + void BeginRenderTargetAllocation( ) { + return util::get_vfunc< 94, void >( this ); + } + + void EndRenderTargetAllocation( ) { + return util::get_vfunc< 95, void >( this ); + } + + ITexture* CreateNamedRenderTargetTextureEx( const char* name, int w, int h, RenderTargetSizeMode_t sizeMode, + ImageFormat format, MaterialRenderTargetDepth_t depth ) + { + const int textureFlags = 0x4 | 0x8; //TEXTUREFLAGS_CLAMPS, TEXTUREFLAGS_CLAMPT + const int renderTargetFlags = 0x1; //CREATERENDERTARGETFLAGS_HDR + return util::get_vfunc< 97, ITexture* >( this, name, w, h, sizeMode, format, depth, textureFlags, renderTargetFlags ); + } + + /*void* GetRenderContext( ) { + typedef IMatRenderContext*( __thiscall* GetRenderContextFn )( void* ); + return CallVFunction( this, 115 )( this ); + }*/ +}; \ No newline at end of file diff --git a/cheat/gmod/IMemAlloc.hpp b/cheat/gmod/IMemAlloc.hpp new file mode 100644 index 0000000..2ad76be --- /dev/null +++ b/cheat/gmod/IMemAlloc.hpp @@ -0,0 +1,79 @@ +#pragma once + +typedef size_t( *MemAllocFailHandler_t )( size_t ); + +class IMemAlloc { +public: + // Release versions + virtual void *Alloc( size_t nSize ) = 0; + virtual void *Realloc( void *pMem, size_t nSize ) = 0; + virtual void Free( void *pMem ) = 0; + virtual void *Expand_NoLongerSupported( void *pMem, size_t nSize ) = 0; + + // Debug versions + virtual void *Alloc( size_t nSize, const char *pFileName, int nLine ) = 0; + virtual void *Realloc( void *pMem, size_t nSize, const char *pFileName, int nLine ) = 0; + virtual void Free( void *pMem, const char *pFileName, int nLine ) = 0; + virtual void *Expand_NoLongerSupported( void *pMem, size_t nSize, const char *pFileName, int nLine ) = 0; + + // Returns size of a particular allocation + virtual size_t GetSize( void *pMem ) = 0; + + // Force file + line information for an allocation + virtual void PushAllocDbgInfo( const char *pFileName, int nLine ) = 0; + virtual void PopAllocDbgInfo( ) = 0; + + // FIXME: Remove when we have our own allocator + // these methods of the Crt debug code is used in our codebase currently + virtual long CrtSetBreakAlloc( long lNewBreakAlloc ) = 0; + virtual int CrtSetReportMode( int nReportType, int nReportMode ) = 0; + virtual int CrtIsValidHeapPointer( const void *pMem ) = 0; + virtual int CrtIsValidPointer( const void *pMem, unsigned int size, int access ) = 0; + virtual int CrtCheckMemory( void ) = 0; + virtual int CrtSetDbgFlag( int nNewFlag ) = 0; + virtual void CrtMemCheckpoint( void *pState ) = 0; + + // FIXME: Make a better stats interface + virtual void DumpStats( ) = 0; + virtual void DumpStatsFileBase( char const *pchFileBase ) = 0; + + // FIXME: Remove when we have our own allocator + virtual void* CrtSetReportFile( int nRptType, void* hFile ) = 0; + virtual void* CrtSetReportHook( void* pfnNewHook ) = 0; + virtual int CrtDbgReport( int nRptType, const char * szFile, + int nLine, const char * szModule, const char * pMsg ) = 0; + + virtual int heapchk( ) = 0; + + virtual bool IsDebugHeap( ) = 0; + + virtual void GetActualDbgInfo( const char *&pFileName, int &nLine ) = 0; + virtual void RegisterAllocation( const char *pFileName, int nLine, int nLogicalSize, int nActualSize, unsigned nTime ) = 0; + virtual void RegisterDeallocation( const char *pFileName, int nLine, int nLogicalSize, int nActualSize, unsigned nTime ) = 0; + + virtual int GetVersion( ) = 0; + + virtual void CompactHeap( ) = 0; + + // Function called when malloc fails or memory limits hit to attempt to free up memory (can come in any thread) + virtual MemAllocFailHandler_t SetAllocFailHandler( MemAllocFailHandler_t pfnMemAllocFailHandler ) = 0; + + virtual void DumpBlockStats( void * ) = 0; + +#if defined( _MEMTEST ) + virtual void SetStatsExtraInfo( const char *pMapName, const char *pComment ) = 0; +#endif + + // Returns 0 if no failure, otherwise the size_t of the last requested chunk + // "I'm sure this is completely thread safe!" Brian Deen 7/19/2012. + virtual size_t MemoryAllocFailed( ) = 0; + + // handles storing allocation info for coroutines + virtual unsigned GetDebugInfoSize( ) = 0; + virtual void SaveDebugInfo( void *pvDebugInfo ) = 0; + virtual void RestoreDebugInfo( const void *pvDebugInfo ) = 0; + virtual void InitDebugInfo( void *pvDebugInfo, const char *pchRootFileName, int nLine ) = 0; + + // Replacement for ::GlobalMemoryStatus which accounts for unused memory in our system + virtual void GlobalMemoryStatus( size_t *pUsedMemory, size_t *pFreeMemory ) = 0; +}; \ No newline at end of file diff --git a/cheat/gmod/IPanel.hpp b/cheat/gmod/IPanel.hpp new file mode 100644 index 0000000..8b66fb1 --- /dev/null +++ b/cheat/gmod/IPanel.hpp @@ -0,0 +1,14 @@ +#pragma once +#include "util.hpp" + +class IPanel { +public: + const char* GetName( int panel ) { + using fn = const char* ( __thiscall* )( void*, int ); + return util::get_vfunc< fn >( this, 36 )( this, panel ); + } + + void SetMouseInputEnabled( unsigned int panel, bool enable ) { + return util::get_vfunc< 32, void >( this, panel, enable ); + } +}; \ No newline at end of file diff --git a/cheat/gmod/IPhysicsSurfaceProps.hpp b/cheat/gmod/IPhysicsSurfaceProps.hpp new file mode 100644 index 0000000..d7003f2 --- /dev/null +++ b/cheat/gmod/IPhysicsSurfaceProps.hpp @@ -0,0 +1,79 @@ +#pragma once + +struct surfacephysicsparams_t { + // vphysics physical properties + float friction; + float elasticity; // collision elasticity - used to compute coefficient of restitution + float density; // physical density (in kg / m^3) + float thickness; // material thickness if not solid (sheet materials) in inches + float dampening; +}; + +struct surfaceaudioparams_t { + float reflectivity; // like elasticity, but how much sound should be reflected by this surface + float hardnessFactor; // like elasticity, but only affects impact sound choices + float roughnessFactor; // like friction, but only affects scrape sound choices + float roughThreshold; // surface roughness > this causes "rough" scrapes, < this causes "smooth" scrapes + float hardThreshold; // surface hardness > this causes "hard" impacts, < this causes "soft" impacts + float hardVelocityThreshold; // collision velocity > this causes "hard" impacts, < this causes "soft" impacts + float highPitchOcclusion; //a value betweeen 0 and 100 where 0 is not occluded at all and 100 is silent (except for any additional reflected sound) + float midPitchOcclusion; + float lowPitchOcclusion; +}; + +struct surfacesoundnames_t { + unsigned short walkStepLeft; + unsigned short walkStepRight; + unsigned short runStepLeft; + unsigned short runStepRight; + unsigned short impactSoft; + unsigned short impactHard; + unsigned short scrapeSmooth; + unsigned short scrapeRough; + unsigned short bulletImpact; + unsigned short rolling; + unsigned short breakSound; + unsigned short strainSound; +}; + +struct surfacegameprops_t { + float maxspeedfactor; + float jumpfactor; + float penetrationmodifier; + float damagemodifier; + uint16_t material; + uint8_t climbable; +}; + +struct surfacedata_t { + surfacephysicsparams_t physics; // physics parameters + surfaceaudioparams_t audio; // audio parameters + surfacesoundnames_t sounds; // names of linked sounds + surfacegameprops_t game; // Game data / properties +}; + +class IPhysicsSurfaceProps +{ +public: + virtual ~IPhysicsSurfaceProps( void ) {} + + // parses a text file containing surface prop keys + virtual int ParseSurfaceData( const char* pFilename, const char* pTextfile ) = 0; + // current number of entries in the database + virtual int SurfacePropCount( void ) const = 0; + + virtual int GetSurfaceIndex( const char* pSurfacePropName ) const = 0; + virtual void GetPhysicsProperties( int surfaceDataIndex, float* density, float* thickness, float* friction, float* elasticity ) const = 0; + + virtual surfacedata_t* GetSurfaceData( int surfaceDataIndex ) = 0; + virtual const char* GetString( unsigned short stringTableIndex ) const = 0; + + virtual const char* GetPropName( int surfaceDataIndex ) const = 0; + + // sets the global index table for world materials + // UNDONE: Make this per-CPhysCollide + virtual void SetWorldMaterialIndexTable( int* pMapArray, int mapSize ) = 0; + + // NOTE: Same as GetPhysicsProperties, but maybe more convenient + //virtual void GetPhysicsParameters(int surfaceDataIndex, surfacephysicsparams_t* pParamsOut) const = 0; +}; \ No newline at end of file diff --git a/cheat/gmod/IPrediction.hpp b/cheat/gmod/IPrediction.hpp new file mode 100644 index 0000000..575e270 --- /dev/null +++ b/cheat/gmod/IPrediction.hpp @@ -0,0 +1,129 @@ +#pragma once +#include "vector.hpp" + +//forward declarations +class user_cmd_t; +class IClientEntity; + +class IMoveHelper { +private: + virtual void UnknownVirtual( ) = 0; +public: + virtual void SetHost( IClientEntity* host ) = 0; +}; + +class CMoveData { +public: + bool m_bFirstRunOfFunctions : 1; + bool m_bGameCodeMovedPlayer : 1; + bool m_bNoAirControl : 1; + + unsigned long m_nPlayerHandle; + int m_nImpulseCommand; + vec3_t m_vecViewAngles; + vec3_t m_vecAbsViewAngles; + int m_nButtons; + int m_nOldButtons; + float m_flForwardMove; + float m_flSideMove; + float m_flUpMove; + + float m_flMaxSpeed; + float m_flClientMaxSpeed; + + vec3_t m_vecVelocity; + vec3_t m_vecOldVelocity; + float somefloat; + vec3_t m_vecAngles; + vec3_t m_vecOldAngles; + + float m_outStepHeight; + vec3_t m_outWishVel; + vec3_t m_outJumpVel; + + vec3_t m_vecConstraintCenter; + float m_flConstraintRadius; + float m_flConstraintWidth; + float m_flConstraintSpeedFactor; + bool m_bConstraintPastRadius; + + void SetAbsOrigin( const vec3_t& vec ); + const vec3_t& GetAbsOrigin( ) const; + +private: + vec3_t m_vecAbsOrigin; // edict::origin + uint8_t pad_ending_001[0x160]; +}; + +class ICSGameMovement { +public: + void ProcessMovement( IClientEntity* ent, void* data ) { + using fn = void( __thiscall* )( void*, IClientEntity*, void* ); + return util::get_vfunc< fn >( this, 1 )( this, ent, data ); + } + + void StartTrackPredictionErrors( IClientEntity* ent ) { + using fn = void( __thiscall* )( void*, IClientEntity* ); + return util::get_vfunc< fn >( this, 2 )( this, ent ); + } + + void FinishTrackPredictionErrors( IClientEntity* ent ) { + using fn = void( __thiscall* )( void*, IClientEntity* ); + return util::get_vfunc< fn >( this, 3 )( this, ent ); + } +}; + +class IPrediction { +public: + virtual ~IPrediction( ) { }; + + virtual void Init( ) = 0; + virtual void Shutdown( ) = 0; + + // Run prediction + virtual void Update + ( + int startframe, // World update ( un-modded ) most recently received + bool validframe, // Is frame data valid + int incoming_acknowledged, // Last command acknowledged to have been run by server (un-modded) + int outgoing_command // Last command (most recent) sent to server (un-modded) + ) = 0; + + // We are about to get a network update from the server. We know the update #, so we can pull any + // data purely predicted on the client side and transfer it to the new from data state. + virtual void PreEntityPacketReceived( int commands_acknowledged, int current_world_update_packet ) = 0; + virtual void PostEntityPacketReceived( ) = 0; + virtual void PostNetworkDataReceived( int commands_acknowledged ) = 0; + + virtual void OnReceivedUncompressedPacket( ) = 0; + + // The engine needs to be able to access a few predicted values + virtual void GetViewOrigin( vec3_t& org ) = 0; + virtual void SetViewOrigin( vec3_t& org ) = 0; + virtual void GetViewAngles( vec3_t& ang ) = 0; + virtual void SetViewAngles( vec3_t& ang ) = 0; + virtual void GetLocalViewAngles( vec3_t& ang ) = 0; + virtual void SetLocalViewAngles( vec3_t& ang ) = 0; + + virtual bool InPrediction( ) const = 0; + virtual bool IsFirstTimePredicted( ) const = 0; + + virtual int GetIncomingPacketNumber( ) const = 0; + + virtual void RunCommand( IClientEntity *player, user_cmd_t *ucmd, IMoveHelper *moveHelper ) = 0; + + virtual void SetupMove( IClientEntity *player, user_cmd_t *ucmd, IMoveHelper *pHelper, CMoveData *move ) = 0; + virtual void FinishMove( IClientEntity *player, user_cmd_t *ucmd, CMoveData *move ) = 0; + virtual void SetIdealPitch( int nSlot, IClientEntity *player, const vec3_t& origin, const vec3_t& angles, const vec3_t& viewheight ) = 0; + + virtual void CheckError( int nSlot, IClientEntity *player, int commands_acknowledged ) = 0; + + virtual void _Update + ( + int nSlot, + bool received_new_world_update, + bool validframe, // Is frame data valid + int incoming_acknowledged, // Last command acknowledged to have been run by server (un-modded) + int outgoing_command // Last command (most recent) sent to server (un-modded) + ) = 0; +}; diff --git a/cheat/gmod/ISurface.hpp b/cheat/gmod/ISurface.hpp new file mode 100644 index 0000000..5756191 --- /dev/null +++ b/cheat/gmod/ISurface.hpp @@ -0,0 +1,117 @@ +#pragma once +#include "IAppSystem.hpp" +#include "vector.hpp" +#include "color.hpp" + +enum FontDrawType_t { + FONT_DRAW_DEFAULT = 0, + FONT_DRAW_NONADDITIVE, + FONT_DRAW_ADDITIVE, + FONT_DRAW_TYPE_COUNT = 2, +}; + +enum FontFlags_t { + FONTFLAG_NONE, + FONTFLAG_ITALIC = 0x001, + FONTFLAG_UNDERLINE = 0x002, + FONTFLAG_STRIKEOUT = 0x004, + FONTFLAG_SYMBOL = 0x008, + FONTFLAG_ANTIALIAS = 0x010, + FONTFLAG_GAUSSIANBLUR = 0x020, + FONTFLAG_ROTARY = 0x040, + FONTFLAG_DROPSHADOW = 0x080, + FONTFLAG_ADDITIVE = 0x100, + FONTFLAG_OUTLINE = 0x200, + FONTFLAG_CUSTOM = 0x400, + FONTFLAG_BITMAP = 0x800, +}; + +enum ImageFormat { + IMAGE_FORMAT_UNKNOWN = -1, + IMAGE_FORMAT_RGBA8888 = 0, + IMAGE_FORMAT_ABGR8888, + IMAGE_FORMAT_RGB888, + IMAGE_FORMAT_BGR888, + IMAGE_FORMAT_RGB565, + IMAGE_FORMAT_I8, + IMAGE_FORMAT_IA88, + IMAGE_FORMAT_P8, + IMAGE_FORMAT_A8, + IMAGE_FORMAT_RGB888_BLUESCREEN, + IMAGE_FORMAT_BGR888_BLUESCREEN, + IMAGE_FORMAT_ARGB8888, + IMAGE_FORMAT_BGRA8888, + IMAGE_FORMAT_DXT1, + IMAGE_FORMAT_DXT3, + IMAGE_FORMAT_DXT5, + IMAGE_FORMAT_BGRX8888, + IMAGE_FORMAT_BGR565, + IMAGE_FORMAT_BGRX5551, + IMAGE_FORMAT_BGRA4444, + IMAGE_FORMAT_DXT1_ONEBITALPHA, + IMAGE_FORMAT_BGRA5551, + IMAGE_FORMAT_UV88, + IMAGE_FORMAT_UVWQ8888, + IMAGE_FORMAT_RGBA16161616F, + IMAGE_FORMAT_RGBA16161616, + IMAGE_FORMAT_UVLX8888, + IMAGE_FORMAT_R32F, // Single-channel 32-bit floating point + IMAGE_FORMAT_RGB323232F, + IMAGE_FORMAT_RGBA32323232F, + + // Depth-stencil texture formats for shadow depth mapping + IMAGE_FORMAT_NV_DST16, // + IMAGE_FORMAT_NV_DST24, // + IMAGE_FORMAT_NV_INTZ, // Vendor-specific depth-stencil texture + IMAGE_FORMAT_NV_RAWZ, // formats for shadow depth mapping + IMAGE_FORMAT_ATI_DST16, // + IMAGE_FORMAT_ATI_DST24, // + IMAGE_FORMAT_NV_NULL, // Dummy format which takes no video memory + + // Compressed normal map formats + IMAGE_FORMAT_ATI2N, // One-surface ATI2N / DXN format + IMAGE_FORMAT_ATI1N, // Two-surface ATI1N format + + NUM_IMAGE_FORMATS +}; + +struct vertex_t { + vertex_t( ) {} + + vertex_t( const vec2_t& pos, const vec2_t& coord = vec2_t( 0, 0 ) ) { + m_position = pos; + m_tex_coord = coord; + } + + void init( float x, float y, const vec2_t& coord = vec2_t( 0, 0 ) ) { + m_position = vec2_t( x, y ); + m_tex_coord = coord; + } + + vec2_t m_position; + vec2_t m_tex_coord; +}; + +using HFont = unsigned long; +using VPANEL = unsigned long; +class IntRect; +class IHTMLEvents; +class IHTML; +using HCursor = unsigned long; +using HTexture = unsigned long; +class CharRenderInfo; +class IVguiMatInfo; +class IImage; +class DrawTexturedRectParms_t; +class IHTMLChromeController; + +class ISurface : public IAppSystem { +public: + void SetCursorAlwaysVisible( bool state ) { + return util::get_vfunc< 52, void >( this, state ); + } + + void UnlockCursor( ) { + return util::get_vfunc< 61, void >( this ); + } +}; \ No newline at end of file diff --git a/cheat/gmod/IVEngineClient.hpp b/cheat/gmod/IVEngineClient.hpp new file mode 100644 index 0000000..4357dc2 --- /dev/null +++ b/cheat/gmod/IVEngineClient.hpp @@ -0,0 +1,259 @@ +#pragma once +#include +#include + +#include "util.hpp" +#include "vector.hpp" + +//using matrix3x4 = float[ 3 ][ 4 ]; + +struct VMatrix +{ + float m_matrix[ 4 ][ 4 ]; + + float* operator[]( int i ) { + return m_matrix[ i ]; + } + + const float* operator[]( int i ) const { + return m_matrix[ i ]; + } +}; + +struct matrix3x4 +{ + float m_matrix[ 3 ][ 4 ]; + + matrix3x4( ) = default; + + matrix3x4( + float m00, float m01, float m02, float m03, + float m10, float m11, float m12, float m13, + float m20, float m21, float m22, float m23 ) { + m_matrix[ 0 ][ 0 ] = m00; m_matrix[ 0 ][ 1 ] = m01; m_matrix[ 0 ][ 2 ] = m02; m_matrix[ 0 ][ 3 ] = m03; + m_matrix[ 1 ][ 0 ] = m10; m_matrix[ 1 ][ 1 ] = m11; m_matrix[ 1 ][ 2 ] = m12; m_matrix[ 1 ][ 3 ] = m13; + m_matrix[ 2 ][ 0 ] = m20; m_matrix[ 2 ][ 1 ] = m21; m_matrix[ 2 ][ 2 ] = m22; m_matrix[ 2 ][ 3 ] = m23; + } + + float* operator[]( int i ) { + return m_matrix[ i ]; + } + + const float* operator[]( int i ) const { + return m_matrix[ i ]; + } +}; + + +typedef struct player_info_s { + char name[ 32 ];//32 + int m_userid; + char m_steamid[ 33 ];//32 + unsigned m_friendId; + char m_friendsname[ 32 ]; + bool m_isfakeplayer; + bool m_ishltv; + uint32_t m_customfiles[ 4 ]; + uint8_t m_filesdownloaded; +} player_info_t; + +class INetChannelInfo { +public: + enum + { + GENERIC = 0, // must be first and is default group + LOCALPLAYER, // bytes for local player entity update + OTHERPLAYERS, // bytes for other players update + ENTITIES, // all other entity bytes + SOUNDS, // game sounds + EVENTS, // event messages + TEMPENTS, // temp entities + USERMESSAGES, // user messages + ENTMESSAGES, // entity messages + VOICE, // voice data + STRINGTABLE, // a stringtable update + MOVE, // client move cmds + STRINGCMD, // string command + SIGNON, // various signondata + TOTAL, // must be last and is not a real group + }; + + virtual const char* GetName( ) const = 0; // get channel name + virtual const char* GetAddress( ) const = 0; // get channel IP address as string + virtual float GetTime( ) const = 0; // current net time + virtual float GetTimeConnected( ) const = 0; // get connection time in seconds + virtual int GetBufferSize( ) const = 0; // netchannel packet history size + virtual int GetDataRate( ) const = 0; // send data rate in byte/sec + + virtual bool IsLoopback( ) const = 0; // true if loopback channel + virtual bool IsTimingOut( ) const = 0; // true if timing out + virtual bool IsPlayback( ) const = 0; // true if demo playback + + virtual float GetLatency( int flow ) const = 0; // current latency (RTT), more accurate but jittering + virtual float GetAvgLatency( int flow ) const = 0; // average packet latency in seconds + virtual float GetAvgLoss( int flow ) const = 0; // avg packet loss[0..1] + virtual float GetAvgChoke( int flow ) const = 0; // avg packet choke[0..1] + virtual float GetAvgData( int flow ) const = 0; // data flow in bytes/sec + virtual float GetAvgPackets( int flow ) const = 0; // avg packets/sec + virtual int GetTotalData( int flow ) const = 0; // total flow in/out in bytes + virtual int GetTotalPackets( int flow ) const = 0; + virtual int GetSequenceNr( int flow ) const = 0; // last send seq number + virtual bool IsValidPacket( int flow, int frame_number ) const = 0; // true if packet was not lost/dropped/chocked/flushed + virtual float GetPacketTime( int flow, int frame_number ) const = 0; // time when packet was send + virtual int GetPacketBytes( int flow, int frame_number, int group ) const = 0; // group size of this packet + virtual bool GetStreamProgress( int flow, int* received, int* total ) const = 0; // TCP progress if transmitting + virtual float GetTimeSinceLastReceived( ) const = 0; // get time since last recieved packet in seconds + virtual float GetCommandInterpolationAmount( int flow, int frame_number ) const = 0; + virtual void GetPacketResponseLatency( int flow, int frame_number, int* pnLatencyMsecs, int* pnChoke ) const = 0; + virtual void GetRemoteFramerate( float* pflFrameTime, float* pflFrameTimeStdDeviation ) const = 0; + + virtual float GetTimeoutSeconds( ) const = 0; +}; + +class INetChannel { +public: + char pad_0000[ 20 ]; //0x0000 + bool m_bProcessingMessages; //0x0014 + bool m_bShouldDelete; //0x0015 + char pad_0016[ 2 ]; //0x0016 + int32_t m_nOutSequenceNr; //0x0018 last send outgoing sequence number + int32_t m_nInSequenceNr; //0x001C last received incoming sequnec number + int32_t m_nOutSequenceNrAck; //0x0020 last received acknowledge outgoing sequnce number + int32_t m_nOutReliableState; //0x0024 state of outgoing reliable data (0/1) flip flop used for loss detection + int32_t m_nInReliableState; //0x0028 state of incoming reliable data + int32_t m_nChokedPackets; //0x002C number of choked packets + char pad_0030[ 1044 ]; //0x0030 + + bool transmit( bool only_reliable ) { + return util::get_vfunc< 49, bool >( this, only_reliable ); + } +}; //Size: 0x0444 + +struct INetMessage { + virtual ~INetMessage( ); +}; + +template +class CNetMessagePB : public INetMessage, public T {}; + +class CCLCMsg_Move { +private: + char __PAD0[ 0x8 ]; +public: + int numBackupCommands; + int numNewCommands; +}; + +using CCLCMsg_Move_t = CNetMessagePB; + +class CClientState { +public: + char pad0[ 0x9C ]; + INetChannel* netchannel; + char pad1[ 0xD4 ]; + int32_t m_nDeltaTick; //0x174 + char pad2[ 0x4B34 ]; + float m_frameTime; + int32_t lastoutgoingcommand; + int32_t chokedcommands; + int32_t last_command_ack; +}; + +class CGlobalState { +public: + uintptr_t* m_manager; + CClientState *m_def_clientstate; + + __forceinline CClientState* get_client_state( ) { + return m_def_clientstate; + } +}; + +class IVEngineClient +{ +public: + void GetScreenSize( int& width, int& height ) { + using fn = void( __thiscall* )( void*, int&, int& ); + return util::get_vfunc< fn >( this, 5 )( this, width, height ); + } + + void ClientCmd( const char* szCommandString ) { + std::string command( szCommandString ); + std::replace( command.begin( ), command.end( ), ';', ':' ); + std::replace( command.begin( ), command.end( ), '"', '*' ); + using fn = void( __thiscall* )( void*, const char* ); + return util::get_vfunc< fn >( this, 7 )( this, command.c_str( ) ); + } + + void ClientCmd_Unrestricted( const char* szCommandString ) { + std::string command( szCommandString ); + std::replace( command.begin( ), command.end( ), ';', ':' ); + std::replace( command.begin( ), command.end( ), '"', '*' ); + using fn = void( __thiscall* )( void*, const char*, const char* ); + return util::get_vfunc< fn >( this, 114 )( this, command.c_str( ), nullptr ); + } + + bool GetPlayerInfo( int index, player_info_t* pInfo ) { + using fn = bool( __thiscall* )( void*, int, player_info_t* ); + return util::get_vfunc< fn >( this, 8 )( this, index, pInfo ); + } + + int GetPlayerForUserID( int UserID ) { + using fn = int( __thiscall* )( void*, int ); + return util::get_vfunc< fn >( this, 9 )( this, UserID ); + } + + int GetLocalPlayer( ) { + using fn = int( __thiscall* )( void* ); + return util::get_vfunc< fn >( this, 12 )( this ); + } + + float Time( ) { + using fn = float( __thiscall* )( void* ); + return util::get_vfunc< fn >( this, 14 )( this ); + } + + void GetViewAngles( vec3_t& ang ) { + using fn = void( __thiscall* )( void*, vec3_t& ); + return util::get_vfunc< fn >( this, 19 )( this, ang ); + } + + void SetViewAngles( vec3_t& ang ) { + using fn = void( __thiscall* )( void*, vec3_t& ); + return util::get_vfunc< fn >( this, 20 )( this, ang ); + } + + int GetMaxClients( ) { + using fn = int( __thiscall* )( void* ); + return util::get_vfunc< fn >( this, 21 )( this ); + } + + bool IsInGame( ) { + using fn = bool( __thiscall* )( void* ); + return util::get_vfunc< fn >( this, 26 )( this ); + } + + bool IsConnected( ) { + using fn = bool( __thiscall* )( void* ); + return util::get_vfunc< fn >( this, 27 )( this ); + } + + bool IsPaused( ) { + return util::get_vfunc< 91, bool >( this ); + } + + const VMatrix& WorldToScreenMatrix( ) { + using fn = const VMatrix& ( __thiscall* )( void* ); + return util::get_vfunc< fn >( this, 36 )( this ); + } + + const char* GetLevelName( ) { + using fn = const char* ( __thiscall* )( void* ); + return util::get_vfunc< fn >( this, 52 )( this ); + } + + INetChannelInfo* GetNetChannelInfo( ) { + using fn = INetChannelInfo* ( __thiscall* )( void* ); + return util::get_vfunc< fn >( this, 72 )( this ); + } +}; \ No newline at end of file diff --git a/cheat/gmod/IVModelInfoClient.hpp b/cheat/gmod/IVModelInfoClient.hpp new file mode 100644 index 0000000..957c6d9 --- /dev/null +++ b/cheat/gmod/IVModelInfoClient.hpp @@ -0,0 +1,134 @@ +#pragma once +#include "IVEngineClient.hpp" +#include "IClientEntityList.hpp" + +struct DrawModelState_t; + +struct mstudiobbox_t +{ + int bone; + int group; + vec3_t min; + vec3_t max; + int szhitboxnameindex; + + const char* get_name( ) { + if( szhitboxnameindex == 0 ) + return ""; + + return ( ( const char* )this ) + szhitboxnameindex; + } + + int unused[ 8 ]; +}; + +struct mstudiobone_t +{ + int sznameindex; + inline char * const get_name( void ) const { return ( ( char * )this ) + sznameindex; } + int parent; + char pad01[ 152 ]; + int flags; + char pad02[ 52 ]; +}; + +struct mstudiohitboxset_t +{ + int sznameindex; + inline char * const get_name( void ) const { return ( ( char * )this ) + sznameindex; } + int numhitboxes; + int hitboxindex; + inline mstudiobbox_t *get_hitbox( int i ) const { return ( mstudiobbox_t * )( ( ( unsigned char * )this ) + hitboxindex ) + i; }; +}; + +struct studiohdr_t +{ + char pad00[ 12 ]; + char name[ 64 ]; + char pad01[ 80 ]; + int numbones; + int boneIndex; + inline mstudiobone_t *get_bone( int i ) { return ( mstudiobone_t * )( ( ( unsigned char* )this ) + boneIndex ) + i; } + char pad02[ 8 ]; + int numhitboxsets; + int hitboxsetindex; + + mstudiohitboxset_t* get_hitbox_set( int i ) { + return ( mstudiohitboxset_t * )( ( ( char * )this ) + hitboxsetindex ) + i; + } + + char pad03[ 24 ]; + int numtextures; + inline mstudiobbox_t* get_hit_box( int index ) { return ( ( mstudiohitboxset_t* )( ( unsigned char* )this + hitboxsetindex ) )->get_hitbox( index ); } +}; + +struct ModelRenderInfo_t { + vec3_t m_origin; + vec3_t m_angles; + char pad[ 0x4 ]; + void* m_renderable; + const model_t* m_model; + const matrix3x4* m_model2world; + const matrix3x4* m_light_offset; + const vec3_t* m_light_origin; + int m_flags; + int m_entity_index; + int m_skin; + int m_body; + int m_hitboxset; + uint16_t* m_instance; + + ModelRenderInfo_t( ) { + m_model2world = nullptr; + m_light_offset = nullptr; + m_light_origin = nullptr; + } +}; + +class IVModelInfoClient { +public: + model_t* GetModel( int index ) { + using fn = model_t*( __thiscall* )( void*, int ); + return util::get_vfunc< fn >( this, 1 )( this, index ); + } + + int GetModelIndex( const char* name ) { + using fn = int( __thiscall* )( void*, const char* ); + return util::get_vfunc< fn >( this, 2 )( this, name ); + } + + const char* GetModelName( const model_t* model ) { + using fn = const char* ( __thiscall* )( void*, const model_t* ); + return util::get_vfunc< fn >( this, 3 )( this, model ); + } + + studiohdr_t* GetStudiomodel( const model_t* mod ) { + using fn = studiohdr_t* ( __thiscall* )( void*, const model_t* ); + return util::get_vfunc< fn >( this, 28 )( this, mod ); + } + + void GetModelMaterials( const model_t *model, int count, class IMaterial** ppMaterial ) { + using fn = const void( __thiscall* )( void*, const model_t*, int, IMaterial** ); + util::get_vfunc< fn >( this, 16 )( this, model, count, ppMaterial ); + } +}; + +enum OverrideType_t { + OVERRIDE_NORMAL = 0, + OVERRIDE_BUILD_SHADOWS, + OVERRIDE_DEPTH_WRITE, + OVERRIDE_SSAO_DEPTH_WRITE, +}; + +class IVModelRender { +public: + void ForcedMaterialOverride( IMaterial* newMaterial, OverrideType_t nOverrideType = OVERRIDE_NORMAL, int unk = 0 ) { + using fn = void( __thiscall* )( void*, IMaterial*, OverrideType_t, int ); + return util::get_vfunc< fn >( this, 1 )( this, newMaterial, nOverrideType, unk ); + } + + void DrawModelExecute( void* matctx, const DrawModelState_t& state, const ModelRenderInfo_t& pInfo, matrix3x4* pCustomBoneToWorld ) { + using fn = void( __thiscall* )( void*, void*, const DrawModelState_t&, const ModelRenderInfo_t&, matrix3x4* ); + util::get_vfunc< fn >( this, 21 )( this, matctx, state, pInfo, pCustomBoneToWorld ); + } +}; \ No newline at end of file diff --git a/cheat/gmod/IVRenderView.hpp b/cheat/gmod/IVRenderView.hpp new file mode 100644 index 0000000..fef45ae --- /dev/null +++ b/cheat/gmod/IVRenderView.hpp @@ -0,0 +1,21 @@ +#pragma once +#include "util.hpp" + +class IVRenderView { +public: + void SetBlend( float blend ) { + return util::get_vfunc< 4, void >( this, blend ); + } + + float GetBlend( ) { + return util::get_vfunc< 5, float >( this ); + } + + void SetColorModulation( float const* blend ) { + return util::get_vfunc< 6, void >( this, blend ); + } + + void GetColorModulation( float* blend ) { + return util::get_vfunc< 7, void >( this, blend ); + } +}; \ No newline at end of file diff --git a/cheat/gmod/KeyValues.cpp b/cheat/gmod/KeyValues.cpp new file mode 100644 index 0000000..265cfd8 --- /dev/null +++ b/cheat/gmod/KeyValues.cpp @@ -0,0 +1,50 @@ +#include "KeyValues.hpp" +#include "pattern.hpp" +#include "interface.hpp" + +int IKeyValuesSystem::GetSymbolForString( const char* str, bool create ) { + static auto offset = pattern::first_code_match( GetModuleHandleA( xors( "vstdlib.dll" ) ), xors( "55 8B EC 83 EC 0C 53 8B 5D 08 57" ) ); + using fn = int( __thiscall* )( void*, const char*, bool ); + + int symbol = ( ( fn )( offset ) )( this, str, create ); + printf( "%s: %d\n", str, symbol ); + return symbol; +} + +const char* IKeyValuesSystem::GetStringForSymbol( int symbol ) { + static auto offset = pattern::first_code_match( GetModuleHandleA( xors( "vstdlib.dll" ) ), xors( "55 8B EC 8B 55 08 83 FA FF" ) ); + using fn = const char*( __thiscall* )( void*, int ); + + auto result = ( ( fn )( offset ) )( this, symbol ); + printf( "%d: %d\n", symbol, *( int* )( &result ) ); + + return result; +} + +KeyValues::KeyValues( const char* setName ) { + static bool inc{ }; + static auto key_values_fn = pattern::first_code_match( g_gmod.m_chl.dll( ), xors( "68 ? ? ? ? 8B C8 E8 ? ? ? ? 89 45 FC EB 07 C7 45 ? ? ? ? ? 8B 03 56" ) ) + 7; + if ( !inc ) { + key_values_fn += *reinterpret_cast< uintptr_t* >( key_values_fn + 1 ) + 5; + inc = true; + } + + reinterpret_cast< void( __thiscall* )( KeyValues*, const char* ) >( key_values_fn )( this, setName ); +} + +bool KeyValues::LoadFromBuffer( char const *resourceName, const char *pBuffer, void* pFileSystem, const char *pPathID, bool( *unknown )( const char* ) ) { + static auto load_from_buffer = pattern::first_code_match( g_gmod.m_chl.dll( ), xors( "55 8B EC 83 E4 F8 83 EC 34 53 8B 5D 0C 89 4C 24 04" ) ); + return reinterpret_cast< bool( __thiscall* )( KeyValues*, const char*, const char*, void*, const char*, bool( *)( const char* ) ) >( load_from_buffer ) + ( this, resourceName, pBuffer, pFileSystem, pPathID, unknown ); +} + +KeyValues* KeyValues::FindKey( const char* name ) { + auto key = g_gmod.m_keyvalues->GetSymbolForString( name, false ); + for( auto dat = m_pSub; !!dat; dat = dat->m_pPeer ) { + if( dat->m_iKeyName == key ) { + return dat; + } + } + + return nullptr; +} \ No newline at end of file diff --git a/cheat/gmod/KeyValues.hpp b/cheat/gmod/KeyValues.hpp new file mode 100644 index 0000000..0b11698 --- /dev/null +++ b/cheat/gmod/KeyValues.hpp @@ -0,0 +1,38 @@ +#pragma once +#include "util.hpp" + +class IKeyValuesSystem { +public: + int GetSymbolForString( const char* string, bool create ); + const char* GetStringForSymbol( int symbol ); +}; + +class KeyValues +{ +public: + KeyValues( const char *setName ); + bool LoadFromBuffer( char const *resourceName, const char *pBuffer, void* pFileSystem = nullptr, const char *pPathID = nullptr, bool( *unknown )( const char* ) = nullptr ); + + int m_iKeyName; + + char *m_sValue; + wchar_t *m_wsValue; + + // we don't delete these + union { + int m_iValue; + float m_flValue; + void *m_pValue; + unsigned char m_Color[ 4 ]; + }; + + char m_iDataType; + char m_bHasEscapeSequences; + char m_bEvaluateConditionals; + + KeyValues* FindKey( const char* key_name ); + + KeyValues *m_pPeer; // pointer to next key in list + KeyValues *m_pSub; // pointer to Start of a new sub key list + KeyValues *m_pChain;// Search here if it's not in our list +}; \ No newline at end of file diff --git a/cheat/gmod/Source.cpp b/cheat/gmod/Source.cpp new file mode 100644 index 0000000..6c8d000 --- /dev/null +++ b/cheat/gmod/Source.cpp @@ -0,0 +1,187 @@ +//this cheat was a mistake + +#include +#include + +#include "hooks.hpp" +#include "console.hpp" +#include "input_system.hpp" +#include "mem.hpp" + +HMODULE g_dll; + +void main_thread( HINSTANCE uh ) { +#ifdef IFACE_DLLMAIN + util::memset( ( uint8_t* )uh, 0x90, 0x1000 ); +#endif + g_gmod.initialize( ); + + while ( !g_gmod.m_panic ) { + std::this_thread::sleep_for( std::chrono::milliseconds( 1 ) ); + } + + g_gmod.uninitialize( ); + ExitThread( 0 ); +} + +long __stdcall exception_handler( EXCEPTION_POINTERS* e ) { + const char* title = xors( "you crashed, retard" ); + std::string msg = xors( "unknown" ); + + ulong_t e_code = e->ExceptionRecord->ExceptionCode; + ulong_t e_info_0 = e->ExceptionRecord->ExceptionInformation[ 0 ]; + ulong_t e_info_1 = e->ExceptionRecord->ExceptionInformation[ 1 ]; + ulong_t e_info_2 = e->ExceptionRecord->ExceptionInformation[ 2 ]; + + switch( e_code ) { + case EXCEPTION_ACCESS_VIOLATION: + if( !e_info_0 ) + msg = xors( "read access violation at " ); + else if( e_info_0 == 1 ) + msg = xors( "write access violation at " ); + else + msg = xors( "access violation at " ); + + msg += util::to_hex_str( e_info_1 ); + break; + + case EXCEPTION_ARRAY_BOUNDS_EXCEEDED: + msg = xors( "array bounds exceeded" ); + break; + + case EXCEPTION_BREAKPOINT: + msg = xors( "triggered breakpoint" ); + break; + + case EXCEPTION_FLT_DENORMAL_OPERAND: + case EXCEPTION_FLT_DIVIDE_BY_ZERO: + case EXCEPTION_FLT_INEXACT_RESULT: + case EXCEPTION_FLT_INVALID_OPERATION: + case EXCEPTION_FLT_OVERFLOW: + case EXCEPTION_FLT_UNDERFLOW: + case EXCEPTION_FLT_STACK_CHECK: + msg = xors( "invalid floating point operation" ); + break; + + case EXCEPTION_IN_PAGE_ERROR: + if( !e_info_0 ) + msg = xors( "page error - read access violation at " ); + else if( e_info_0 == 1 ) + msg = xors( "page error - write access violation at " ); + else + msg = xors( "page error - access violation at " ); + + msg += util::to_hex_str( e_info_1 ); + msg += '\n'; + msg += xors( "NTSTATUS: " ); + msg += util::to_hex_str( e_info_2 ); + break; + + case EXCEPTION_INT_DIVIDE_BY_ZERO: + case EXCEPTION_INT_OVERFLOW: + msg = xors( "invalid integer operation" ); + break; + + case EXCEPTION_STACK_OVERFLOW: + msg = xors( "stack overflow" ); + break; + + default: + msg = xors( "exception code: " ); + msg += util::to_hex_str( e_code ); + msg += xors( "\nexception variables: \n" ); + msg += util::to_hex_str( e_info_0 ); msg += '\n'; + msg += util::to_hex_str( e_info_1 ); msg += '\n'; + msg += util::to_hex_str( e_info_2 ); msg += '\n'; + break; + } + + msg += xors( "\nregister dump: \n" ); + msg += xors( "eax: " ); msg += util::to_hex_str( e->ContextRecord->Eax ); msg += '\n'; + msg += xors( "esi: " ); msg += util::to_hex_str( e->ContextRecord->Esi ); msg += '\n'; + msg += xors( "ebx: " ); msg += util::to_hex_str( e->ContextRecord->Ebx ); msg += '\n'; + msg += xors( "edi: " ); msg += util::to_hex_str( e->ContextRecord->Edi ); msg += '\n'; + msg += xors( "ecx: " ); msg += util::to_hex_str( e->ContextRecord->Ecx ); msg += '\n'; + msg += xors( "ebp: " ); msg += util::to_hex_str( e->ContextRecord->Ebp ); msg += '\n'; + msg += xors( "edx: " ); msg += util::to_hex_str( e->ContextRecord->Edx ); msg += '\n'; + msg += xors( "esp: " ); msg += util::to_hex_str( e->ContextRecord->Esp ); msg += '\n'; + + if( e->ExceptionRecord->ExceptionAddress ) { + msg += xors( "\nin module: " ); + MEMORY_BASIC_INFORMATION info; + VirtualQuery( ( void* )e->ExceptionRecord->ExceptionAddress, &info, sizeof( MEMORY_BASIC_INFORMATION ) ); + + char module_buf[ 32 ]; + K32GetModuleBaseNameA( GetCurrentProcess( ), ( HMODULE )info.AllocationBase, module_buf, 32 ); + msg += std::string( module_buf ); + msg += " ( "; + msg += util::to_hex_str( ( uintptr_t )info.AllocationBase ); + msg += " ) "; + + msg += xors( "at: " ); + msg += util::to_hex_str( ( uintptr_t )e->ExceptionRecord->ExceptionAddress ); + } + + auto file = CreateFileA( xors( "./moneybot_dump.dmp" ), GENERIC_READ | GENERIC_WRITE, FILE_SHARE_WRITE, + nullptr, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, nullptr ); + + if( file ) { + WriteFile( file, msg.data( ), msg.size( ), nullptr, nullptr ); + CloseHandle( file ); + } + + return EXCEPTION_CONTINUE_EXECUTION; +} + +int __stdcall DllMain( HINSTANCE inst, DWORD reason, LPVOID reserved ) { + HANDLE thread; + + uintptr_t wanted_reason; +#ifdef _DEBUG + wanted_reason = DLL_PROCESS_ATTACH; +#else + wanted_reason = DLL_PROCESS_ATTACH; +#endif + + if ( reason == wanted_reason +#ifdef IFACE_DLLMAIN + && !!reserved +#endif + ) { +#ifdef IFACE_DLLMAIN + g_factory.init( ( uintptr_t )( reserved ) ); +#endif + + g_dll = inst; + + //yayo + //SetUnhandledExceptionFilter( exception_handler ); + DisableThreadLibraryCalls( inst ); + + thread = CreateThread( nullptr, 0, + ( LPTHREAD_START_ROUTINE )( main_thread ), + inst, 0, nullptr ); + + if( !thread ) + return 0; + + CloseHandle( thread ); + + return 1; + } + +#ifdef IFACE_DLLMAIN + else if( !reserved ) { + MessageBoxA( nullptr, "interface data nullptr (loader error?)", "error", MB_OK ); + return 1; + } +#endif + + + if( reason == DLL_PROCESS_DETACH ) { + g_gmod.m_panic = true; + //SetUnhandledExceptionFilter( nullptr ); + } + + return 0; +} \ No newline at end of file diff --git a/cheat/gmod/Valve/dt_common.h b/cheat/gmod/Valve/dt_common.h new file mode 100644 index 0000000..44bc2a2 --- /dev/null +++ b/cheat/gmod/Valve/dt_common.h @@ -0,0 +1,180 @@ +//========= Copyright © 1996-2005, Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +// $NoKeywords: $ +// +//=============================================================================// + +#pragma once + +//#include +#include + +// Max number of properties in a datatable and its children. +#define MAX_DATATABLES 1024 // must be a power of 2. +#define MAX_DATATABLE_PROPS 4096 + +#define MAX_ARRAY_ELEMENTS 2048 // a network array should have more that 1024 elements + +#define HIGH_DEFAULT -121121.121121f + +#define BITS_FULLRES -1 // Use the full resolution of the type being encoded. +#define BITS_WORLDCOORD -2 // Encode as a world coordinate. + +#define DT_MAX_STRING_BITS 9 +#define DT_MAX_STRING_BUFFERSIZE (1<varName ) + +// Gets the size of a variable in a class. +#define PROPSIZEOF(className, varName) sizeof(((className*)0)->varName) + + +// SendProp::m_Flags. +#define SPROP_UNSIGNED (1<<0) // Unsigned integer data. + +#define SPROP_COORD (1<<1) // If this is set, the float/vector is treated like a world coordinate. +// Note that the bit count is ignored in this case. + +#define SPROP_NOSCALE (1<<2) // For floating point, don't scale into range, just take value as is. + +#define SPROP_ROUNDDOWN (1<<3) // For floating point, limit high value to range minus one bit unit + +#define SPROP_ROUNDUP (1<<4) // For floating point, limit low value to range minus one bit unit + +#define SPROP_NORMAL (1<<5) // If this is set, the vector is treated like a normal (only valid for vectors) + +#define SPROP_EXCLUDE (1<<6) // This is an exclude prop (not excludED, but it points at another prop to be excluded). + +#define SPROP_XYZE (1<<7) // Use XYZ/Exponent encoding for vectors. + +#define SPROP_INSIDEARRAY (1<<8) // This tells us that the property is inside an array, so it shouldn't be put into the +// flattened property list. Its array will point at it when it needs to. + +#define SPROP_PROXY_ALWAYS_YES (1<<9) // Set for datatable props using one of the default datatable proxies like +// SendProxy_DataTableToDataTable that always send the data to all clients. + +#define SPROP_CHANGES_OFTEN (1<<10) // this is an often changed field, moved to head of sendtable so it gets a small index + +#define SPROP_IS_A_VECTOR_ELEM (1<<11) // Set automatically if SPROP_VECTORELEM is used. + +#define SPROP_COLLAPSIBLE (1<<12) // Set automatically if it's a datatable with an offset of 0 that doesn't change the pointer +// (ie: for all automatically-chained base classes). +// In this case, it can get rid of this SendPropDataTable altogether and spare the +// trouble of walking the hierarchy more than necessary. + +#define SPROP_COORD_MP (1<<13) // Like SPROP_COORD, but special handling for multiplayer games +#define SPROP_COORD_MP_LOWPRECISION (1<<14) // Like SPROP_COORD, but special handling for multiplayer games where the fractional component only gets a 3 bits instead of 5 +#define SPROP_COORD_MP_INTEGRAL (1<<15) // SPROP_COORD_MP, but coordinates are rounded to integral boundaries +#define SPROP_NUMFLAGBITS_NETWORKED 16 + +// This is server side only, it's used to mark properties whose SendProxy_* functions encode against gpGlobals->tickcount (the only ones that currently do this are +// m_flAnimTime and m_flSimulationTime. MODs shouldn't need to mess with this probably +#define SPROP_ENCODED_AGAINST_TICKCOUNT (1<<16) + +// See SPROP_NUMFLAGBITS_NETWORKED for the ones which are networked +#define SPROP_NUMFLAGBITS 17 + +// Used by the SendProp and RecvProp functions to disable debug checks on type sizes. +#define SIZEOF_IGNORE -1 + + +// Use this to extern send and receive datatables, and reference them. +#define EXTERN_SEND_TABLE(tableName) namespace tableName {extern SendTable g_SendTable;} +#define EXTERN_RECV_TABLE(tableName) namespace tableName {extern RecvTable g_RecvTable;} + +#define REFERENCE_SEND_TABLE(tableName) tableName::g_SendTable +#define REFERENCE_RECV_TABLE(tableName) tableName::g_RecvTable + + +class SendProp; + + +typedef enum +{ + DPT_Int = 0, + DPT_Float, + DPT_Vector, + DPT_VectorXY, + DPT_String, + DPT_Array, // An array of the base types (can't be of datatables). + DPT_DataTable, +#if 0 // We can't ship this since it changes the size of DTVariant to be 20 bytes instead of 16 and that breaks MODs!!! + DPT_Quaternion, +#endif + DPT_NUMSendPropTypes +} SendPropType; + + +class DVariant +{ +public: + DVariant( ) { m_Type = DPT_Float; } + DVariant( float val ) { m_Type = DPT_Float; m_Float = val; } + + const char *ToString( ) { + static char text[ 128 ]; + + switch( m_Type ) { + case DPT_Int: + sprintf_s( text, sizeof( text ), "%i", m_Int ); + break; + case DPT_Float: + sprintf_s( text, sizeof( text ), "%.3f", m_Float ); + break; + case DPT_Vector: + sprintf_s( text, sizeof( text ), "(%.3f,%.3f,%.3f)", + m_Vector[ 0 ], m_Vector[ 1 ], m_Vector[ 2 ] ); + break; + #if 0 // We can't ship this since it changes the size of DTVariant to be 20 bytes instead of 16 and that breaks MODs!!! + case DPT_Quaternion: + sprintf_s( text, sizeof( text ), "(%.3f,%.3f,%.3f %.3f)", + m_Vector[ 0 ], m_Vector[ 1 ], m_Vector[ 2 ], m_Vector[ 3 ] ); + break; + #endif + case DPT_String: + if( m_pString ) + return m_pString; + else + return "NULL"; + break; + case DPT_Array: + sprintf_s( text, sizeof( text ), "Array" ); + break; + case DPT_DataTable: + sprintf_s( text, sizeof( text ), "DataTable" ); + break; + default: + sprintf_s( text, sizeof( text ), "DVariant type %i unknown", m_Type ); + break; + } + + return text; + } + + union + { + float m_Float; + long m_Int; + char *m_pString; + void *m_pData; // For DataTables. + #if 0 // We can't ship this since it changes the size of DTVariant to be 20 bytes instead of 16 and that breaks MODs!!! + float m_Vector[ 4 ]; + #else + float m_Vector[ 3 ]; + #endif + }; + SendPropType m_Type; +}; + + +// This can be used to set the # of bits used to transmit a number between 0 and nMaxElements-1. +inline int NumBitsForCount( int nMaxElements ) { + int nBits = 0; + while( nMaxElements > 0 ) { + ++nBits; + nMaxElements >>= 1; + } + return nBits; +} \ No newline at end of file diff --git a/cheat/gmod/Valve/dt_recv.h b/cheat/gmod/Valve/dt_recv.h new file mode 100644 index 0000000..aaec6cc --- /dev/null +++ b/cheat/gmod/Valve/dt_recv.h @@ -0,0 +1,523 @@ +//========= Copyright © 1996-2005, Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +// $NoKeywords: $ +// +//=============================================================================// + +#ifndef DATATABLE_RECV_H +#define DATATABLE_RECV_H + +#ifdef _WIN32 +#pragma once +#endif + +#include "dt_common.h" + +#define ADDRESSPROXY_NONE -1 + + +class RecvTable; +class RecvProp; + + +// This is passed into RecvProxy functions. +class CRecvProxyData +{ +public: + const RecvProp *m_pRecvProp; // The property it's receiving. + + DVariant m_Value; // The value given to you to store. + + int m_iElement; // Which array element you're getting. + + int m_ObjectID; // The object being referred to. +}; + + +//----------------------------------------------------------------------------- +// pStruct = the base structure of the datatable this variable is in (like C_BaseEntity) +// pOut = the variable that this this proxy represents (like C_BaseEntity::m_SomeValue). +// +// Convert the network-standard-type value in m_Value into your own format in pStruct/pOut. +//----------------------------------------------------------------------------- +typedef void( *RecvVarProxyFn )( const CRecvProxyData *pData, void *pStruct, void *pOut ); + +// ------------------------------------------------------------------------ // +// ArrayLengthRecvProxies are optionally used to get the length of the +// incoming array when it changes. +// ------------------------------------------------------------------------ // +typedef void( *ArrayLengthRecvProxyFn )( void *pStruct, int objectID, int currentArrayLength ); + + +// NOTE: DataTable receive proxies work differently than the other proxies. +// pData points at the object + the recv table's offset. +// pOut should be set to the location of the object to unpack the data table into. +// If the parent object just contains the child object, the default proxy just does *pOut = pData. +// If the parent object points at the child object, you need to dereference the pointer here. +// NOTE: don't ever return null from a DataTable receive proxy function. Bad things will happen. +typedef void( *DataTableRecvVarProxyFn )( const RecvProp *pProp, void **pOut, void *pData, int objectID ); + + +// This is used to fork over the standard proxy functions to the engine so it can +// make some optimizations. +class CStandardRecvProxies +{ +public: + CStandardRecvProxies( ); + + RecvVarProxyFn m_Int32ToInt8; + RecvVarProxyFn m_Int32ToInt16; + RecvVarProxyFn m_Int32ToInt32; + RecvVarProxyFn m_FloatToFloat; + RecvVarProxyFn m_VectorToVector; +}; +extern CStandardRecvProxies g_StandardRecvProxies; + + +class CRecvDecoder; + + +class RecvProp +{ + // This info comes from the receive data table. +public: + RecvProp( ); + + void InitArray( int nElements, int elementStride ); + + int GetNumElements( ) const; + void SetNumElements( int nElements ); + + int GetElementStride( ) const; + void SetElementStride( int stride ); + + int GetFlags( ) const; + + const char* GetName( ) const; + SendPropType GetType( ) const; + + RecvTable* GetDataTable( ) const; + void SetDataTable( RecvTable *pTable ); + + RecvVarProxyFn GetProxyFn( ) const; + void SetProxyFn( RecvVarProxyFn fn ); + + DataTableRecvVarProxyFn GetDataTableProxyFn( ) const; + void SetDataTableProxyFn( DataTableRecvVarProxyFn fn ); + + int GetOffset( ) const; + void SetOffset( int o ); + + // Arrays only. + RecvProp* GetArrayProp( ) const; + void SetArrayProp( RecvProp *pProp ); + + // Arrays only. + void SetArrayLengthProxy( ArrayLengthRecvProxyFn proxy ); + ArrayLengthRecvProxyFn GetArrayLengthProxy( ) const; + + bool IsInsideArray( ) const; + void SetInsideArray( ); + + // Some property types bind more data to the prop in here. + const void* GetExtraData( ) const; + void SetExtraData( const void *pData ); + + // If it's one of the numbered "000", "001", etc properties in an array, then + // these can be used to get its array property name for debugging. + const char* GetParentArrayPropName( ); + void SetParentArrayPropName( const char *pArrayPropName ); + +public: + + const char *m_pVarName; + SendPropType m_RecvType; + int m_Flags; + int m_StringBufferSize; + + +public: + + bool m_bInsideArray; // Set to true by the engine if this property sits inside an array. + + // Extra data that certain special property types bind to the property here. + const void *m_pExtraData; + + // If this is an array (DPT_Array). + RecvProp *m_pArrayProp; + ArrayLengthRecvProxyFn m_ArrayLengthProxy; + + RecvVarProxyFn m_ProxyFn; + DataTableRecvVarProxyFn m_DataTableProxyFn; // For RDT_DataTable. + + RecvTable *m_pDataTable; // For RDT_DataTable. + int m_Offset; + + int m_ElementStride; + int m_nElements; + + // If it's one of the numbered "000", "001", etc properties in an array, then + // these can be used to get its array property name for debugging. + const char *m_pParentArrayPropName; +}; + + +class RecvTable +{ +public: + + typedef RecvProp PropType; + + RecvTable( ); + RecvTable( RecvProp *pProps, int nProps, const char *pNetTableName ); + ~RecvTable( ); + + void Construct( RecvProp *pProps, int nProps, const char *pNetTableName ); + + int GetNumProps( ); + RecvProp* GetProp( int i ); + + const char* GetName( ); + + // Used by the engine while initializing array props. + void SetInitialized( bool bInitialized ); + bool IsInitialized( ) const; + + // Used by the engine. + void SetInMainList( bool bInList ); + bool IsInMainList( ) const; + + +public: + + // Properties described in a table. + RecvProp *m_pProps; + int m_nProps; + + // The decoder. NOTE: this covers each RecvTable AND all its children (ie: its children + // will have their own decoders that include props for all their children). + CRecvDecoder *m_pDecoder; + + const char *m_pNetTableName; // The name matched between client and server. + + +public: + + bool m_bInitialized; + bool m_bInMainList; +}; + + +inline int RecvTable::GetNumProps( ) { + return m_nProps; +} + +inline RecvProp* RecvTable::GetProp( int i ) { + // Assert( i >= 0 && i < m_nProps ); + return &m_pProps[ i ]; +} + +inline const char* RecvTable::GetName( ) { + return m_pNetTableName; +} + +inline void RecvTable::SetInitialized( bool bInitialized ) { + m_bInitialized = bInitialized; +} + +inline bool RecvTable::IsInitialized( ) const { + return m_bInitialized; +} + +inline void RecvTable::SetInMainList( bool bInList ) { + m_bInMainList = bInList; +} + +inline bool RecvTable::IsInMainList( ) const { + return m_bInMainList; +} + + +// ------------------------------------------------------------------------------------------------------ // +// See notes on BEGIN_SEND_TABLE for a description. These macros work similarly. +// ------------------------------------------------------------------------------------------------------ // +#define BEGIN_RECV_TABLE(className, tableName) \ + BEGIN_RECV_TABLE_NOBASE(className, tableName) \ + RecvPropDataTable("baseclass", 0, 0, className::BaseClass::m_pClassRecvTable, DataTableRecvProxy_StaticDataTable), + +#define BEGIN_RECV_TABLE_NOBASE(className, tableName) \ + template int ClientClassInit(T *); \ + namespace tableName { \ + struct ignored; \ + } \ + template <> int ClientClassInit(tableName::ignored *); \ + namespace tableName { \ + RecvTable g_RecvTable; \ + int g_RecvTableInit = ClientClassInit((tableName::ignored *)NULL); \ + } \ + template <> int ClientClassInit(tableName::ignored *) \ + { \ + typedef className currentRecvDTClass; \ + const char *pRecvTableName = #tableName; \ + RecvTable &RecvTable = tableName::g_RecvTable; \ + static RecvProp RecvProps[] = { \ + RecvPropInt("should_never_see_this", 0, sizeof(int)), // It adds a dummy property at the start so you can define "empty" SendTables. + +#define END_RECV_TABLE() \ + }; \ + RecvTable.Construct(RecvProps+1, sizeof(RecvProps) / sizeof(RecvProp) - 1, pRecvTableName); \ + return 1; \ + } + + +#define RECVINFO(varName) #varName, offsetof(currentRecvDTClass, varName), sizeof(((currentRecvDTClass*)0)->varName) +#define RECVINFO_NAME(varName, remoteVarName) #remoteVarName, offsetof(currentRecvDTClass, varName), sizeof(((currentRecvDTClass*)0)->varName) +#define RECVINFO_STRING(varName) #varName, offsetof(currentRecvDTClass, varName), STRINGBUFSIZE(currentRecvDTClass, varName) +#define RECVINFO_BASECLASS(tableName) RecvPropDataTable("this", 0, 0, &REFERENCE_RECV_TABLE(tableName)) +#define RECVINFO_ARRAY(varName) #varName, offsetof(currentRecvDTClass, varName), sizeof(((currentRecvDTClass*)0)->varName[0]), sizeof(((currentRecvDTClass*)0)->varName)/sizeof(((currentRecvDTClass*)0)->varName[0]) + +// Just specify the name and offset. Used for strings and data tables. +#define RECVINFO_NOSIZE(varName) #varName, offsetof(currentRecvDTClass, varName) +#define RECVINFO_DT(varName) RECVINFO_NOSIZE(varName) +#define RECVINFO_DTNAME(varName,remoteVarName) #remoteVarName, offsetof(currentRecvDTClass, varName) + + +void RecvProxy_FloatToFloat( const CRecvProxyData *pData, void *pStruct, void *pOut ); +void RecvProxy_VectorToVector( const CRecvProxyData *pData, void *pStruct, void *pOut ); +void RecvProxy_QuaternionToQuaternion( const CRecvProxyData *pData, void *pStruct, void *pOut ); +void RecvProxy_Int32ToInt8( const CRecvProxyData *pData, void *pStruct, void *pOut ); +void RecvProxy_Int32ToInt16( const CRecvProxyData *pData, void *pStruct, void *pOut ); +void RecvProxy_StringToString( const CRecvProxyData *pData, void *pStruct, void *pOut ); +void RecvProxy_Int32ToInt32( const CRecvProxyData *pData, void *pStruct, void *pOut ); + +// StaticDataTable does *pOut = pData. +void DataTableRecvProxy_StaticDataTable( const RecvProp *pProp, void **pOut, void *pData, int objectID ); + +// PointerDataTable does *pOut = *((void**)pData) (ie: pData is a pointer to the object to decode into). +void DataTableRecvProxy_PointerDataTable( const RecvProp *pProp, void **pOut, void *pData, int objectID ); + + +RecvProp RecvPropFloat( + const char *pVarName, + int offset, + int sizeofVar = SIZEOF_IGNORE, // Handled by RECVINFO macro, but set to SIZEOF_IGNORE if you don't want to bother. + int flags = 0, + RecvVarProxyFn varProxy = RecvProxy_FloatToFloat +); + +RecvProp RecvPropVector( + const char *pVarName, + int offset, + int sizeofVar = SIZEOF_IGNORE, // Handled by RECVINFO macro, but set to SIZEOF_IGNORE if you don't want to bother. + int flags = 0, + RecvVarProxyFn varProxy = RecvProxy_VectorToVector +); + +// This is here so the RecvTable can look more like the SendTable. +#define RecvPropQAngles RecvPropVector + +#if 0 // We can't ship this since it changes the size of DTVariant to be 20 bytes instead of 16 and that breaks MODs!!! + +RecvProp RecvPropQuaternion( + const char *pVarName, + int offset, + int sizeofVar = SIZEOF_IGNORE, // Handled by RECVINFO macro, but set to SIZEOF_IGNORE if you don't want to bother. + int flags = 0, + RecvVarProxyFn varProxy = RecvProxy_QuaternionToQuaternion +); +#endif + +RecvProp RecvPropInt( + const char *pVarName, + int offset, + int sizeofVar = SIZEOF_IGNORE, // Handled by RECVINFO macro, but set to SIZEOF_IGNORE if you don't want to bother. + int flags = 0, + RecvVarProxyFn varProxy = 0 +); + +RecvProp RecvPropString( + const char *pVarName, + int offset, + int bufferSize, + int flags = 0, + RecvVarProxyFn varProxy = RecvProxy_StringToString +); + +RecvProp RecvPropDataTable( + const char *pVarName, + int offset, + int flags, + RecvTable *pTable, + DataTableRecvVarProxyFn varProxy = DataTableRecvProxy_StaticDataTable +); + +RecvProp RecvPropArray3( + const char *pVarName, + int offset, + int sizeofVar, + int elements, + RecvProp pArrayProp, + DataTableRecvVarProxyFn varProxy = DataTableRecvProxy_StaticDataTable +); + +// Use the macro to let it automatically generate a table name. You shouldn't +// ever need to reference the table name. If you want to exclude this array, then +// reference the name of the variable in varTemplate. +RecvProp InternalRecvPropArray( + const int elementCount, + const int elementStride, + const char *pName, + ArrayLengthRecvProxyFn proxy +); + + +// +// Use this if you want to completely manage the way the array data is stored. +// You'll need to provide a proxy inside varTemplate that looks for 'iElement' +// to figure out where to store the specified element. +// +#define RecvPropVirtualArray( arrayLengthProxy, maxArrayLength, varTemplate, propertyName ) \ + varTemplate, \ + InternalRecvPropArray( \ + maxArrayLength, \ + 0, \ + #propertyName, \ + arrayLengthProxy \ + ) + + +// Use this and pass the array name and it will figure out the count and stride automatically. +#define RecvPropVariableLengthArray( arrayLengthProxy, varTemplate, arrayName ) \ + varTemplate, \ + InternalRecvPropArray( \ + sizeof(((currentRecvDTClass*)0)->arrayName) / PROPSIZEOF(currentRecvDTClass, arrayName[0]), \ + PROPSIZEOF(currentRecvDTClass, arrayName[0]), \ + #arrayName, \ + arrayLengthProxy \ + ) + + +// Use this and pass the array name and it will figure out the count and stride automatically. +#define RecvPropArray( varTemplate, arrayName ) \ + RecvPropVariableLengthArray( 0, varTemplate, arrayName ) + + +// Use this one to specify the element count and stride manually. +#define RecvPropArray2( arrayLengthProxy, varTemplate, elementCount, elementStride, arrayName ) \ + varTemplate, \ + InternalRecvPropArray( elementCount, elementStride, #arrayName, arrayLengthProxy ) + + +// ---------------------------------------------------------------------------------------- // +// Inlines. +// ---------------------------------------------------------------------------------------- // + +inline void RecvProp::InitArray( int nElements, int elementStride ) { + m_RecvType = DPT_Array; + m_nElements = nElements; + m_ElementStride = elementStride; +} + +inline int RecvProp::GetNumElements( ) const { + return m_nElements; +} + +inline void RecvProp::SetNumElements( int nElements ) { + m_nElements = nElements; +} + +inline int RecvProp::GetElementStride( ) const { + return m_ElementStride; +} + +inline void RecvProp::SetElementStride( int stride ) { + m_ElementStride = stride; +} + +inline int RecvProp::GetFlags( ) const { + return m_Flags; +} + +inline const char* RecvProp::GetName( ) const { + return m_pVarName; +} + +inline SendPropType RecvProp::GetType( ) const { + return m_RecvType; +} + +inline RecvTable* RecvProp::GetDataTable( ) const { + return m_pDataTable; +} + +inline void RecvProp::SetDataTable( RecvTable *pTable ) { + m_pDataTable = pTable; +} + +inline RecvVarProxyFn RecvProp::GetProxyFn( ) const { + return m_ProxyFn; +} + +inline void RecvProp::SetProxyFn( RecvVarProxyFn fn ) { + m_ProxyFn = fn; +} + +inline DataTableRecvVarProxyFn RecvProp::GetDataTableProxyFn( ) const { + return m_DataTableProxyFn; +} + +inline void RecvProp::SetDataTableProxyFn( DataTableRecvVarProxyFn fn ) { + m_DataTableProxyFn = fn; +} + +inline int RecvProp::GetOffset( ) const { + return m_Offset; +} + +inline void RecvProp::SetOffset( int o ) { + m_Offset = o; +} + +inline RecvProp* RecvProp::GetArrayProp( ) const { + return m_pArrayProp; +} + +inline void RecvProp::SetArrayProp( RecvProp *pProp ) { + m_pArrayProp = pProp; +} + +inline void RecvProp::SetArrayLengthProxy( ArrayLengthRecvProxyFn proxy ) { + m_ArrayLengthProxy = proxy; +} + +inline ArrayLengthRecvProxyFn RecvProp::GetArrayLengthProxy( ) const { + return m_ArrayLengthProxy; +} + +inline bool RecvProp::IsInsideArray( ) const { + return m_bInsideArray; +} + +inline void RecvProp::SetInsideArray( ) { + m_bInsideArray = true; +} + +inline const void* RecvProp::GetExtraData( ) const { + return m_pExtraData; +} + +inline void RecvProp::SetExtraData( const void *pData ) { + m_pExtraData = pData; +} + +inline const char* RecvProp::GetParentArrayPropName( ) { + return m_pParentArrayPropName; +} + +inline void RecvProp::SetParentArrayPropName( const char *pArrayPropName ) { + m_pParentArrayPropName = pArrayPropName; +} + +#endif // DATATABLE_RECV_H diff --git a/cheat/gmod/aimbot.cpp b/cheat/gmod/aimbot.cpp new file mode 100644 index 0000000..313b927 --- /dev/null +++ b/cheat/gmod/aimbot.cpp @@ -0,0 +1,404 @@ + +#include "aimbot.hpp" +#include "interface.hpp" +#include "settings.hpp" +#include "context.hpp" +#include "math.hpp" +#include "base_cheat.hpp" +#include "input_system.hpp" + +namespace features +{ + void c_aimbot::operator()( user_cmd_t* cmd ) { + m_cmd = cmd; + run( ); + } + + c_aimbot::aim_target_t c_aimbot::find_best_target( ) const { + aim_target_t ret{ -1, vec3_t{ } }; + vec3_t angle{ }; + + g_gmod.m_engine( )->GetViewAngles( angle ); + + vec3_t angle_dir = math::angle_vectors( angle ); + vec3_t eye_pos = g_ctx.m_local->get_eye_pos( ); + float closest_to = std::numeric_limits< float >::max( ); + + for( int i{ 1 }; i <= g_gmod.m_globals->m_maxclients; ++i ) { + auto ent = g_gmod.m_entlist( )->GetClientEntity( i ); + if( !ent || ent == g_ctx.m_local || !ent->is_valid( ) ) + continue; + + if( g_settings.rage.ignore_team && + g_ctx.m_local->m_iTeamNum( ) == ent->m_iTeamNum( ) ) + continue; + + if( g_settings.rage.ignore_teamcolor && + g_ctx.m_local->get_team_color( ) == ent->get_team_color( ) ) + continue; + + if( g_settings.rage.ignore_spawnprot && + ent->m_clrRender( ).a( ) < 250 ) + continue; + + player_info_t info; + if( !g_gmod.m_engine( )->GetPlayerInfo( i, &info ) ) + continue; + + // whitelisted. + if( g_cheat.m_playerlist.is_friend( info.m_steamid ) ) + continue; + + const auto ent_pos = get_entity_position( ent ); + if( ent_pos.is_zero( ) ) + continue; + + auto dir = ( ent_pos - eye_pos ); + dir.normalize_vector( ); + + const float fov = angle_dir.fov_to( dir ) * M_RADPI; + if( fov > g_settings.rage.fov ) + continue; + + if( g_settings.rage.selection_type( ) == 0 ) { + if( fov < closest_to ) { + closest_to = fov; + ret.m_ent_index = i; + ret.m_position = ent_pos; + } + } + else if( g_settings.rage.selection_type( ) == 1 ) { + float dist = eye_pos.dist_to( ent_pos ); + if( dist < closest_to ) { + closest_to = dist; + ret.m_ent_index = i; + ret.m_position = ent_pos; + } + } + } + return ret; + } + + vec3_t c_aimbot::get_entity_position( c_base_player* ent ) const { + matrix3x4 matrix[ 256 ]{ }; + bool found_valid_hitbox{ }; + // the idea behind this is that some players can have really weird models and our aimbot will not work on them + // so if they don't have a valid hitbox, we then get the OOB center of their model and use that instead. + // fuck gmod. + // const const const const + bool hitscan = g_settings.rage.hitbox == -1; + const char* hitbox_selection[ ] = { + "Head", + "Neck", + "Pelvis", + "Chest" + }; + + + if( !ent->ce( )->SetupBones( matrix, 256, 0x100, g_gmod.m_globals->m_curtime ) ) + return vec3_t{ }; + + const auto model = ent->ce( )->GetModel( ); + if( !model ) + return vec3_t{ }; + + const auto hdr = g_gmod.m_model_info( )->GetStudiomodel( model ); + if( !hdr ) + return vec3_t{ }; + + const auto set = hdr->get_hitbox_set( ent->m_nHitboxSet( ) ); + if( !set ) + return vec3_t{ }; + + for( int i{ }; i < set->numhitboxes; ++i ) { + const auto hitbox = set->get_hitbox( i ); + if( !hitbox ) + continue; + + const auto bone = hdr->get_bone( hitbox->bone ); + if( !bone ) + continue; + + const std::string name = bone->get_name( ); + if( name.empty( ) ) + continue; + + if( hitscan ) { + if( name.find( "Head" ) == std::string::npos ) + continue; + } + else { + if( name.find( hitbox_selection[ g_settings.rage.hitbox ] ) == std::string::npos ) + continue; + } + + const auto pos = math::vector_transform( ( hitbox->min + hitbox->max ) * 0.5f, matrix[ hitbox->bone ] ); + if( pos.is_zero( ) ) + continue; + + found_valid_hitbox = true; + if( ent->is_visible( pos ) ) + return pos; + } + + if( hitscan ) { // ghetto but it works fine. + for( int i{ }; i < set->numhitboxes; ++i ) { + const auto hitbox = set->get_hitbox( i ); + if( !hitbox ) + continue; + + const auto pos = math::vector_transform( ( hitbox->min + hitbox->max ) * 0.5f, matrix[ hitbox->bone ] ); + if( pos.is_zero( ) ) + continue; + + if( ent->is_visible( pos ) ) + return pos; + } + } + + if( !found_valid_hitbox ) { + auto pos = ent->ce( )->GetRenderOrigin( ); + pos += ( ent->m_vecMins( ) + ent->m_vecMaxs( ) ) * 0.5f; + if( ent->is_visible( pos ) ) + return pos; + } + + return vec3_t{ }; + } + + void c_aimbot::fix_accuracy( vec3_t& angle ) { + auto srand = []( double seed ) -> void { + if( !g_ctx.m_lua ) + return; + + const auto lua = g_ctx.m_lua; + + lua->GetField( LUA_GLOBALSINDEX, xors( "math" ) ); + if( !lua->IsType( -1, LUA_TYPE::TYPE_TABLE ) ) { + lua->Pop( 1 ); + return; + } + + lua->GetField( -1, xors( "randomseed" ) ); + if( !lua->IsType( -1, LUA_TYPE::TYPE_FUNCTION ) ) { + lua->Pop( 2 ); + return; + } + + lua->PushNumber( seed ); + lua->Call( 1, 0 ); + + lua->Pop( 1 ); + }; + + auto rand = []( const double low, const double high ) -> double { + if( !g_ctx.m_lua ) + return 0.0; + + const auto lua = g_ctx.m_lua; + + lua->GetField( LUA_GLOBALSINDEX, xors( "math" ) ); + if( !lua->IsType( -1, LUA_TYPE::TYPE_TABLE ) ) { + lua->Pop( 1 ); + return 0.0; + } + + lua->GetField( -1, xors( "Rand" ) ); + if( !lua->IsType( -1, LUA_TYPE::TYPE_FUNCTION ) ) { + lua->Pop( 2 ); + return 0.0; + } + + lua->PushNumber( low ); + lua->PushNumber( high ); + + lua->Call( 2, 1 ); + if( !lua->IsType( -1, LUA_TYPE::TYPE_NUMBER ) ) { + lua->Pop( 2 ); + return 0.0; + } + + double rand = lua->GetNumber( -1 ); + + lua->Pop( 2 ); + + return rand; + }; + + + auto weapon = g_ctx.m_local->get_weapon( ); + if( !weapon ) + return; + + bool is_cw20 = weapon->is_cw20( ); // own spread handling weapon packs (big). + bool is_fas2 = weapon->is_fas2( ); + bool is_custom = is_cw20 || is_fas2; + + auto weapon_name = weapon->get_class_name( ); + if( !is_custom && !weapon_name ) + return; + + auto cone = m_spread[ weapon_name ]; + if( !is_custom && cone.is_zero( ) ) + return; + + float cur_cone = weapon->get_custom_cone( ); + if( is_custom || cur_cone ) { // may be custom weapon similar to FAS2/CW20 + if ( g_settings.rage.norecoil ) + angle -= g_ctx.m_local->m_vecPunchAngle( ); + + if( !g_settings.rage.nospread ) + return; + + if( is_cw20 ) { + srand( m_cmd->m_cmd_nr ); + + if( g_ctx.m_local->m_fFlags( ) & FL_DUCKING ) + cur_cone *= 0.85f; + } + else if ( is_fas2 ) { + srand( g_ctx.m_local->m_nTickBase( ) * g_gmod.m_globals->m_interval_per_tick ); // FPS has to be over tickrate otherwise this fucks up, do not know how to fix. + } + else { + srand( g_ctx.m_local->m_nTickBase( ) * g_gmod.m_globals->m_interval_per_tick ); // some other custom ones based on FAS2 or CW20 use this. + } + + angle.x -= ( float )( rand( -cur_cone, cur_cone ) * 25.0 ); + angle.y -= ( float )( rand( -cur_cone, cur_cone ) * 25.0 ); + } + else { + // if hl2 + // no recoil... figure this out. + + if( !g_settings.rage.nospread ) + return; + + util::set_random_seed( m_cmd->m_random_seed & 0xff ); + + float rand_a = util::get_random_float( -0.5f, 0.5f ) + util::get_random_float( -0.5f, 0.5f ); + float rand_b = util::get_random_float( -0.5f, 0.5f ) + util::get_random_float( -0.5f, 0.5f ); + + float spread_x = cone.x * rand_a; + float spread_y = cone.y * rand_b; + + vec3_t forward, right, up; + math::angle_vectors( angle, &forward, &right, &up ); + + vec3_t spread_dir = forward + ( right * -spread_x ) + ( up * -spread_y ); + spread_dir.normalize_vector( ); + + angle = math::vector_angles( vec3_t{ }, spread_dir ); + } + } + + void c_aimbot::aim_at_target( const c_aimbot::aim_target_t& target ) { + // we're not gonna be checking for m_flNextPrimaryFire due to server side anticheats checking if IN_ATTACK is sent when you can fire, you will get banned. + // I'm gonna do some ghetto autopistol if we find that the weapon is not automatic (we can find this easily using a lua member of the weapon). + vec3_t eye_pos = g_ctx.m_local->get_eye_pos( ); + vec3_t angle_to_target = math::vector_angles( eye_pos, target.m_position ); + auto weapon = g_ctx.m_local->get_weapon( ); + float yaw = m_cmd->m_viewangles.y; + + fix_accuracy( angle_to_target ); + + if( g_settings.rage.silent != 2 || weapon->is_fas2( ) || weapon->is_cw20( ) || weapon->get_custom_cone( ) ) { // These custom weapons cannot do pSilent as they handle shot direction themselves... should probably warn users about this. + m_cmd->m_viewangles = angle_to_target.clamp( ); + + vec3_t delta = m_last_viewangles - ( m_cmd->m_viewangles - m_last_viewangles ); + m_cmd->m_mousedx = -( short )( delta.x / 0.022f ); // serverside anticheats detect this stuff. + m_cmd->m_mousedy = ( short )( delta.y / 0.022f ); + + if( g_settings.rage.silent == 1 ) { + vec3_t move = vec3_t( m_cmd->m_forwardmove, m_cmd->m_sidemove, m_cmd->m_upmove ); + float len = move.length( ); + + if( len ) { + move = math::angle_vectors( ( math::vector_angles( vec3_t{ }, move ) + vec3_t( 0, m_cmd->m_viewangles.y - yaw, 0 ) ) ) * len; + m_cmd->m_forwardmove = move.x; + m_cmd->m_sidemove = move.y; + } + } + } + else { + m_shot_dir = math::angle_vectors( angle_to_target.clamp( ) ); // save for later. this is really inaccurate and i do not know why. + m_shot_dir.normalize_vector( ); + } + + if( g_settings.rage.silent( ) == 0 ) + g_gmod.m_engine( )->SetViewAngles( m_cmd->m_viewangles ); + + if( g_settings.rage.auto_fire ) + m_cmd->m_buttons |= IN_ATTACK; + } + + void c_aimbot::log_shot( c_base_player* ent, fire_bullets_info* info ) { + // we log shot spread cones due to not having a proper function to give us weapon spread... + if( !ent || !info ) + return; + + if( info->spread.is_zero( ) ) + return; + + auto weapon = ent->get_weapon( ); + if( !weapon ) + return; + + auto weapon_name = weapon->get_class_name( ); + if( !weapon_name ) + return; + + m_spread[ weapon_name ] = info->spread; + } + + void c_aimbot::silent( ) { + // the idea behind this was using the context menu used in sandbox and darkrp ( C menu ) + // you can fire anywhere in the menu but it doesn't change your view angles + // worldclick stuff gets set in C_GMOD_Player::CreateMove so we must set it after the call to it. + // however this method has some problems, the weapon back has to be using the lua call player:GetAimVector() for src direction in FireBullets + // otherwise it will not work, 2 of the biggest weapon packs do not use this function so its kinda bork + // another problem is that if you do not aim within a 30 degree cone of your target or are close to them, lag compensation will not take effect ( thanks garry ) + // - kolo + + if( !m_cmd ) + return; + + m_last_viewangles = m_cmd->m_viewangles; // for mousedx garbage. + + if( !g_settings.rage.enabled ) + return; + + if( g_settings.rage.silent != 2 ) + return; + + if( m_shot_dir.is_zero( ) ) + return; + + m_cmd->m_world_clicking = true; + m_cmd->m_world_click_direction = m_shot_dir; + + m_shot_dir = vec3_t{ }; // useless now. + } + + void c_aimbot::run( ) { + if( !g_settings.rage.enabled ) + return; + + if( g_settings.rage.activation_type != 0 && + !g_input.is_key_pressed( ( VirtualKeys_t )g_settings.rage.aimkey( ) ) ) + return; + + auto weapon = g_ctx.m_local->get_weapon( ); + if( !weapon ) + return; + + //auto wpn_data = weapon->get_wpn_data( ); // only works for hl2 weapons.. + //if( !wpn_data ) // however you can get lua weapon data, cast to C_WeaponSWEP and call correct functions. + // return; + + auto target = find_best_target( ); + if( target.m_ent_index != -1 ) { + aim_at_target( target ); + } + } +} + diff --git a/cheat/gmod/aimbot.hpp b/cheat/gmod/aimbot.hpp new file mode 100644 index 0000000..5b6ad5f --- /dev/null +++ b/cheat/gmod/aimbot.hpp @@ -0,0 +1,38 @@ +#pragma once +#include +#include +#include + +#include "sdk.hpp" +#include "console.hpp" + +namespace features +{ + class c_aimbot + { + public: + c_aimbot( ) = default; + + private: + struct aim_target_t + { + int m_ent_index; + vec3_t m_position; + }; + + vec3_t m_shot_dir{ }, m_last_viewangles{ }; + user_cmd_t* m_cmd{ }; + std::map< const char*, vec3_t > m_spread{ }; // sorry not sorry + + void run( ); + + aim_target_t find_best_target( ) const; + vec3_t get_entity_position( c_base_player* ent ) const; + void aim_at_target( const aim_target_t& target ); + void fix_accuracy( vec3_t& angle ); + public: + void operator()( user_cmd_t* cmd ); + void silent( ); + void log_shot( c_base_player* local, fire_bullets_info* info ); + }; +} diff --git a/cheat/gmod/autowall.cpp b/cheat/gmod/autowall.cpp new file mode 100644 index 0000000..d94afbc --- /dev/null +++ b/cheat/gmod/autowall.cpp @@ -0,0 +1,305 @@ +#include + +#include "autowall.hpp" +#include "settings.hpp" +#include "context.hpp" +#include "math.hpp" + +namespace features +{ + bool c_autowall::is_armored( c_base_player* ent, int armor_value, int hitgroup ) { + if ( armor_value <= 0 ) return false; + + switch ( hitgroup ) { + case HITGROUP_GENERIC: + case HITGROUP_CHEST: + case HITGROUP_STOMACH: + case HITGROUP_LEFTARM: + case HITGROUP_RIGHTARM: + return true; + case HITGROUP_HEAD: + return ent->m_bHasHelmet( ); + } + + return false; + } + + void c_autowall::trace_line( const vec3_t& start, const vec3_t& end, unsigned mask, void* ignore, CGameTrace* tr ) { + CTraceFilter filter; + Ray_t ray; + + filter.pSkip = ignore; + ray.Init( start, end ); + + g_csgo.m_trace( )->TraceRay( ray, mask, &filter, tr ); + } + + void c_autowall::scale_damage( c_base_player* ent, int hitgroup, float weapon_armor_ratio, float& damage ) { + float multiplier; + float armor_ratio; + float new_damage; + int armor; + + auto get_hitgroup_mul = []( int hitgroup ) { + switch ( hitgroup ) { + case HITGROUP_HEAD: + return 4.f; + case HITGROUP_STOMACH: + return 1.25f; + case HITGROUP_LEFTLEG: + case HITGROUP_RIGHTLEG: + return 0.75f; + } + + return 1.0f; + }; + + multiplier = get_hitgroup_mul( hitgroup ); + damage *= multiplier; + armor = ent->m_ArmorValue( ); + + if ( is_armored( ent, armor, hitgroup ) ) { + armor_ratio = weapon_armor_ratio * 0.5f; + new_damage = damage * armor_ratio; + if ( hitgroup != HITGROUP_HEAD && damage - damage * armor_ratio * 0.5f > armor ) { + new_damage = damage - armor * 2.0f; + } + + damage = new_damage; + } + } + + bool c_autowall::is_breakable( IClientEntity* ent ) { + static auto is_breakable_ptr = pattern::first_code_match( g_csgo.m_chl.dll( ), xors( "55 8B EC 51 56 8B F1 85 F6 74 68 83 BE" ) ); + + auto& v2 = *reinterpret_cast< uint8_t* >( uintptr_t( ent ) + 0x27c ); + uint8_t backup_value = v2; + + auto clientclass = ent->GetClientClass( ); + if( clientclass->m_class_id != CFuncBrush && clientclass->m_class_id != CBaseDoor ) + v2 = 2; + + auto is_breakable_fn = reinterpret_cast< bool( __thiscall* )( void* ) >( is_breakable_ptr ); + + bool is_breakable = is_breakable_fn( ent ); + v2 = backup_value; + + return is_breakable; + } + + bool c_autowall::trace_to_exit( vec3_t start, vec3_t& dir, vec3_t& out_end, CGameTrace& tr, CGameTrace* exit_trace ) { + float dist = 0.f; + CTraceFilter filter; + Ray_t ray, ray_2; + + while( dist <= 90.f ) { + dist += 4.f; + + out_end = start + dir * dist; + + int contents = g_csgo.m_trace( )->GetPointContents( out_end, MASK_SHOT_HULL | CONTENTS_HITBOX ); + + if( contents & MASK_SHOT_HULL && !( contents & CONTENTS_HITBOX ) ) + continue; + + ray.Init( out_end, out_end - dir * 4.f ); + g_csgo.m_trace( )->TraceRay( ray, MASK_SHOT_HULL | CONTENTS_HITBOX, 0, exit_trace ); + + if( exit_trace->startsolid && exit_trace->surface.flags & SURF_HITBOX ) { + filter.pSkip = exit_trace->m_pEnt; + + ray_2.Init( out_end, start ); + g_csgo.m_trace( )->TraceRay( ray, MASK_SHOT_HULL, &filter, exit_trace ); + + if( exit_trace->DidHit( ) && !exit_trace->startsolid ) { + out_end = exit_trace->endpos; + return true; + } + } + else if( !exit_trace->DidHit( ) || exit_trace->startsolid ) { + if( tr.m_pEnt && tr.m_pEnt->GetIndex( ) ) { + if( is_breakable( tr.m_pEnt ) ) + return true; + + start = tr.endpos; + } + } + else if( ( ( exit_trace->surface.flags >> 7 ) & 1 ) && !( ( tr.surface.flags >> 7 ) & 1 ) ) + continue; + else if( exit_trace->plane.normal.dot( dir ) <= 1.0f ) { + auto fraction = exit_trace->fraction * 4.0f; + out_end = out_end - dir * fraction; + + return true; + } + } + + return false; + } + + bool c_autowall::handle_bullet_penetration( weapon_info_t* wpn_data, fire_bullet_data_t& data ) { + surfacedata_t* enter_surface_data = g_csgo.m_phys_props( )->GetSurfaceData( data.enter_trace.surface.surfaceProps ); + int enter_material = enter_surface_data->game.material; + float enter_surf_penetration_mod = enter_surface_data->game.penetrationmodifier; + + data.trace_length += data.enter_trace.fraction * data.trace_length_remaining; + data.current_damage *= static_cast( pow( wpn_data->range_modifier, data.trace_length * 0.002 ) ); + + if( data.trace_length > 3000.f || enter_surf_penetration_mod < 0.1f ) + data.penetrate_count = 0; + + if( data.penetrate_count <= 0 ) + return false; + + vec3_t dummy; + CGameTrace trace_exit; + if( !trace_to_exit( data.enter_trace.endpos, data.direction, dummy, data.enter_trace, &trace_exit ) ) + return false; + + surfacedata_t* exit_surface_data = g_csgo.m_phys_props( )->GetSurfaceData( trace_exit.surface.surfaceProps ); + + int exit_material = exit_surface_data->game.material; + float exit_surf_penetration_mod = exit_surface_data->game.penetrationmodifier; + + float final_damage_modifier = 0.16f; + float combined_penetration_modifier = 0.0f; + + if( ( data.enter_trace.contents & CONTENTS_GRATE ) != 0 || enter_material == 89 || enter_material == 71 ) { + combined_penetration_modifier = 3.0f; + final_damage_modifier = 0.05f; + } + else { + combined_penetration_modifier = ( enter_surf_penetration_mod + exit_surf_penetration_mod ) * 0.5f; + } + + if( enter_material == exit_material ) { + if( exit_material == 87 || exit_material == 85 ) + combined_penetration_modifier = 3.0f; + else if( exit_material == 76 ) + combined_penetration_modifier = 2.0f; + } + + float modifier = fmaxf( 0.f, 1.0f / combined_penetration_modifier ); + float taken_damage = ( data.current_damage * final_damage_modifier ) + modifier * 3.0f * fmaxf( 0.0f, + ( float )( 3.0 / ( wpn_data->penetration ) ) * 1.25f ); + float thickness = ( trace_exit.endpos - data.enter_trace.endpos ).lengthsqr( ); + + thickness *= modifier; + thickness *= 0.041666668f; + + float lost_damage = fmaxf( 0.0f, taken_damage + thickness ); + + if( lost_damage > data.current_damage ) + return false; + + if( lost_damage >= 0.0f ) + data.current_damage -= lost_damage; + + if( data.current_damage < 1.0f ) + return false; + + data.src = trace_exit.endpos; + data.penetrate_count--; + + return true; + } + + bool c_autowall::fire_bullet( c_base_player* shooter, c_base_player* target, weapon_info_t* wep_data, fire_bullet_data_t& data, bool ent_check, bool scale ) { + data.penetrate_count = 4; + data.trace_length = 0.f; + + if ( !wep_data ) + return false; + + data.current_damage = ( float )( wep_data->damage ); + + while ( data.penetrate_count > 0 && data.current_damage > 1.0f ) { + if ( !ent_check ) { + data.trace_length_remaining = data.length_to_end - data.trace_length; + } + else { + data.trace_length_remaining = wep_data->range - data.trace_length; + } + + vec3_t end = data.src + data.direction * data.trace_length_remaining; + trace_line( data.src, end, MASK_SHOT | CONTENTS_GRATE, shooter, &data.enter_trace ); + + util::clip_trace_to_player( target->ce( ), data.src, end + data.direction * 40.f, MASK_SHOT | CONTENTS_GRATE, &data.filter, &data.enter_trace ); + + if ( data.enter_trace.fraction == 1.0f ) { + if ( !ent_check ) { + data.trace_length += data.enter_trace.fraction * data.trace_length_remaining; + data.current_damage *= std::pow( wep_data->range_modifier, data.trace_length * 0.002f ); + + if( scale ) + scale_damage( target, HITGROUP_HEAD, wep_data->armor_ratio, data.current_damage ); + return true; + } + + break; + } + + + if ( data.enter_trace.hitgroup <= HITGROUP_RIGHTLEG && data.enter_trace.hitgroup >= HITGROUP_HEAD + && data.enter_trace.m_pEnt == target->ce( ) ) { + data.trace_length += data.enter_trace.fraction * data.trace_length_remaining; + data.current_damage *= std::pow( wep_data->range_modifier, data.trace_length * 0.002f ); + + auto enemy = ( c_base_player* )( data.enter_trace.m_pEnt ); + auto cl = enemy->ce( )->GetClientClass( ); + if ( cl->m_class_id != CCSPlayer ) { + return false; + } + + if ( shooter->m_iTeamNum( ) == enemy->m_iTeamNum( ) && !g_settings.rage.friendlies ) { + return false; + } + + if( scale ) + scale_damage( enemy, data.enter_trace.hitgroup, wep_data->armor_ratio, data.current_damage ); + + return true; + } + + if ( !handle_bullet_penetration( wep_data, data ) ) + break; + } + + return false; + } + + float c_autowall::run( c_base_player* shooter, c_base_player* target, const vec3_t& end, bool ent_check ) { + if ( !shooter || !target ) { + return 0.f; + } + + auto wep = shooter->get_weapon( ); + if ( !wep ) { + return 0.f; + } + + fire_bullet_data_t data; + data.src = shooter->m_vecOrigin( ); + data.filter.pSkip = shooter; + + if ( shooter == g_ctx.m_local ) { + data.src += shooter->m_vecViewOffset( ); + } + else { + data.src += 72.f; + } + + data.length_to_end = ( end - data.src ).length( ); + + vec3_t angles = math::vector_angles( data.src, end ); + data.direction = math::angle_vectors( angles ); + + data.direction.normalize_vector( ); + + if ( fire_bullet( shooter, target, wep->get_wpn_info( ), data, ent_check ) ) { + return data.current_damage; + } + + return 0.f; + } +} diff --git a/cheat/gmod/autowall.hpp b/cheat/gmod/autowall.hpp new file mode 100644 index 0000000..dfddbcc --- /dev/null +++ b/cheat/gmod/autowall.hpp @@ -0,0 +1,34 @@ +#pragma once +#include "sdk.hpp" +#include "pattern.hpp" +#include "interface.hpp" + +struct fire_bullet_data_t { + vec3_t src; + CGameTrace enter_trace; + vec3_t direction; + CTraceFilter filter; + float trace_length; + float trace_length_remaining; + float length_to_end; + float current_damage; + int penetrate_count; +}; + +namespace features +{ + class c_autowall { + private: + bool is_armored( c_base_player* entity, int armor_value, int hitgroup ); + void scale_damage( c_base_player* entity, int hitgroup, float weapon_armor_ratio, float& damage ); + void trace_line( const vec3_t& abs_start, const vec3_t& abs_end, unsigned mask, void* ignore, CGameTrace* trace ); + bool is_breakable( IClientEntity* ent ); + + bool trace_to_exit( vec3_t start, vec3_t& dir, vec3_t& out_end, CGameTrace& tr, CGameTrace* exit_trace ); + + public: + bool handle_bullet_penetration( weapon_info_t* wpn_data, fire_bullet_data_t& data ); + bool fire_bullet( c_base_player* shooter, c_base_player* target, weapon_info_t* wep_data, fire_bullet_data_t& data, bool ent_check = true, bool scale_damage = true ); + float run( c_base_player* shooter, c_base_player* target, const vec3_t& end, bool ent_check = true ); + }; +} \ No newline at end of file diff --git a/cheat/gmod/base_cheat.cpp b/cheat/gmod/base_cheat.cpp new file mode 100644 index 0000000..1a44474 --- /dev/null +++ b/cheat/gmod/base_cheat.cpp @@ -0,0 +1,3 @@ +#include "base_cheat.hpp" + +features::c_base_cheat g_cheat; \ No newline at end of file diff --git a/cheat/gmod/base_cheat.hpp b/cheat/gmod/base_cheat.hpp new file mode 100644 index 0000000..b842f98 --- /dev/null +++ b/cheat/gmod/base_cheat.hpp @@ -0,0 +1,41 @@ +#pragma once +#include "util.hpp" +#include "movement.hpp" +#include "prediction.hpp" +#include "playerlist.hpp" +// #include "legitbot.hpp" +// #include "chams.hpp" +// #include "autowall.hpp" +#include "aimbot.hpp" +// #include "identity.hpp" +#include "lag_mgr.hpp" +#include "visual.hpp" +#include "extra.hpp" +// #include "movement_recorder.hpp" +// #include "player_manager.hpp" +// #include "skins.hpp" + +NAMESPACE_REGION( features ) + +class c_base_cheat { +public: + //have your cheat classes in here + c_movement m_movement; + c_prediction m_prediction; + c_player_list m_playerlist; + //c_legitbot m_legitbot; + //c_autowall m_autowall; + c_aimbot m_aimbot; + //c_identity m_identity; + //c_chams m_chams; + c_lagmgr m_lagmgr; + c_extra m_extra; + //c_skins m_skins; + c_visuals m_visuals; + //c_move_recorder m_move_rec; + //c_player_manager m_player_mgr; +}; + +END_REGION + +extern features::c_base_cheat g_cheat; \ No newline at end of file diff --git a/cheat/gmod/bf_write.hpp b/cheat/gmod/bf_write.hpp new file mode 100644 index 0000000..80960e3 --- /dev/null +++ b/cheat/gmod/bf_write.hpp @@ -0,0 +1,34 @@ +#pragma once + +class bf_write { +public: + bf_write( void* data, int bytes, int max_bits = -1 ) { + m_data = ( unsigned char* )data; + m_bytes = bytes; + if( max_bits == -1 ) + m_bits = bytes * 8; + else + m_bits = max_bits; + } + + bf_write( const char* debug_name, void* data, int bytes, int max_bits = -1 ) { + m_debug_name = debug_name; + m_data = ( unsigned char* )data; + m_bytes = bytes; + if( max_bits == -1 ) + m_bits = bytes * 8; + else + m_bits = max_bits; + } + +public: + unsigned char* m_data{ }; + int m_bytes{ }; + int m_bits{ }; + int m_cur_bit{ }; + +private: + bool m_overflow{ }; + bool m_assert_on_overflow{ }; + const char* m_debug_name{ }; +}; \ No newline at end of file diff --git a/cheat/gmod/c_base_player.cpp b/cheat/gmod/c_base_player.cpp new file mode 100644 index 0000000..caf1ea0 --- /dev/null +++ b/cheat/gmod/c_base_player.cpp @@ -0,0 +1,433 @@ +#include "c_base_player.hpp" +#include "interface.hpp" +#include "math.hpp" +#include "context.hpp" +#include "base_cheat.hpp" + +#undef max + +//CCSGOPlayerAnimState* c_base_player::sm_player_animstate[ 65 ]; +// +//void CCSGOPlayerAnimState::update( float yaw, float pitch ) { +// static auto fn_ptr = pattern::first_code_match( g_gmod.m_chl.dll( ), xors( "55 8B EC 83 E4 F8 83 EC 18 56 57 8B F9 F3 0F 11 54 24" ) ); +// uintptr_t alloc = ( uintptr_t )this; +// +// +// //vectorcall is GAY +// if( fn_ptr ) { +// __asm { +// push 0 +// mov ecx, alloc +// +// movss xmm1, dword ptr[ yaw ] +// movss xmm2, dword ptr[ pitch ] +// +// call fn_ptr +// } +// } +//} +// +//void CCSGOPlayerAnimState::reset( ) { +// static auto fn_ptr = pattern::first_code_match( g_gmod.m_chl.dll( ), xors( "56 6A 01 68 ? ? ? ? 8B F1" ) ); +// if( fn_ptr ) { +// auto fn = ( void( __thiscall* )( void* ) )( fn_ptr ); +// fn( this ); +// } +//} +// +//uintptr_t c_base_player::get_player_resource( ) { +// for( int i{ 1 }; i < g_gmod.m_entlist( )->GetHighestEntityIndex( ); ++i ) { +// auto ent = g_gmod.m_entlist( )->GetClientEntity< IClientEntity >( i ); +// if( !ent ) continue; +// auto class_ = ent->GetClientClass( ); +// if( class_ ) { +// if( class_->m_class_id == CCSPlayerResource ) { +// return uintptr_t( ent ); +// } +// } +// } +// +// return 0; +//} +// +////use is_zero( ) on the vector to figure out if it returns a valid value +//vec3_t c_base_player::get_hitbox_pos( int hitbox ) { +// auto ce = this->ce( ); +// +// const auto model = ce->GetModel( ); +// if( !model ) return vec3_t{ }; +// +// auto hdr = g_gmod.m_model_info( )->GetStudiomodel( model ); +// if( !hdr ) return vec3_t{ }; +// +// matrix3x4 bone_matrix[ 128 ]; +// if( !ce->SetupBones( bone_matrix, 128, 0x100, g_gmod.m_globals->m_curtime ) ) { +// return vec3_t{ }; +// } +// +// auto set = hdr->pHitboxSet( m_nHitboxSet( ) ); +// if( !set ) return vec3_t{ }; +// +// auto box = set->pHitbox( hitbox ); +// if( !box ) return vec3_t{ }; +// +// vec3_t center = ( box->bbmin + box->bbmax ) * 0.5f; +// +// return math::vector_transform( center, bone_matrix[ box->bone ] ); +//} +// + +c_base_player* c_base_player::get_observer_target( ) { + return g_gmod.m_entlist( )->GetClientEntityFromHandle( m_hObserverTarget( ) ); +} + + +const char* c_base_player::get_rank( ) { + if( !g_ctx.m_lua ) + return ""; + + const auto lua = g_ctx.m_lua; + + this->ce( )->PushEntity( ); + if( !lua->IsType( -1, LUA_TYPE::TYPE_ENTITY ) ) { + lua->Pop( 1 ); + return ""; + } + + lua->GetField( -1, "GetUserGroup" ); + if( !lua->IsType( -1, LUA_TYPE::TYPE_FUNCTION ) ) { + lua->Pop( 2 ); + return ""; + } + + lua->Push( -2 ); // have to push the current entity. + + lua->Call( 1, 1 ); + if( !lua->IsType( -1, LUA_TYPE::_TYPE_STRING ) ) { + lua->Pop( 2 ); + return ""; + } + + const char* rank = lua->GetString( -1 ); + + lua->Pop( 2 ); + + return rank; +} + +clr_t c_base_player::get_team_color( ) { + if( !g_ctx.m_lua ) + return clr_t{ }; + + const auto lua = g_ctx.m_lua; + + clr_t ret{ }; + + lua->GetField( LUA_GLOBALSINDEX, xors( "team" ) ); // team + if( !lua->IsType( -1, LUA_TYPE::TYPE_TABLE ) ) { + lua->Pop( 1 ); + return clr_t{ }; + } + + lua->GetField( -1, xors( "GetColor" ) ); // team, GetColor + if( !lua->IsType( -1, LUA_TYPE::TYPE_FUNCTION ) ) { + lua->Pop( 2 ); + return clr_t{ }; + } + + lua->PushNumber( ( double )m_iTeamNum( ) ); // team, GetColor, team_number + lua->Call( 1, 1 ); // team, color_table + if( !lua->IsType( -1, LUA_TYPE::TYPE_TABLE ) ) { + lua->Pop( 2 ); + return clr_t{ }; + } + + lua->PushString( xors( "r" ) ); // team, color_table, "r" + lua->GetTable( -2 ); // team, color_table, r_value + if( !lua->IsType( -1, LUA_TYPE::TYPE_NUMBER ) ) { + lua->Pop( 3 ); + return clr_t{ }; + } + + ret.r( ) = lua->GetNumber( -1 ); + lua->Pop( 1 ); + + lua->PushString( xors( "g" ) ); // team, color_table, "g" + lua->GetTable( -2 ); // team, color_table, g_value + if( !lua->IsType( -1, LUA_TYPE::TYPE_NUMBER ) ) { + lua->Pop( 3 ); + return clr_t{ }; + } + + ret.g( ) = lua->GetNumber( -1 ); + lua->Pop( 1 ); + + lua->PushString( xors( "b" ) ); // team, color_table, "b" + lua->GetTable( -2 ); // team, color_table, b_value + if( !lua->IsType( -1, LUA_TYPE::TYPE_NUMBER ) ) { + lua->Pop( 3 ); + return clr_t{ }; + } + + ret.b( ) = lua->GetNumber( -1 ); + lua->Pop( 3 ); // stack cleaned up. + + return ret; +} + +c_base_weapon* c_base_player::get_weapon( ) { + return g_gmod.m_entlist( )->GetClientEntityFromHandle< c_base_weapon >( m_hActiveWeapon( ) ); +} +bool c_base_player::is_visible( const vec3_t& pos ) { + vec3_t start = g_ctx.m_local->get_eye_pos( ); + return util::trace_ray( start, pos, g_ctx.m_local->ce( ), this->ce( ) ); +} + +// +//bool c_base_player::is_visible( int hitbox ) { +// vec3_t start = g_ctx.m_local->get_eye_pos( ); +// vec3_t end = get_hitbox_pos( hitbox ); +// +// if( !end ) return false; +// return util::trace_ray( start, end, g_ctx.m_local->ce( ), this->ce( ) ); +//} +// +//float c_base_player::get_hitbox_radius( int hitbox ) { +// auto model = ce( )->GetModel( ); +// auto hdr = g_gmod.m_model_info( )->GetStudiomodel( model ); +// auto set = hdr->pHitboxSet( m_nHitboxSet( ) ); +// +// if( !model || !hdr || !set ) +// return 0.f; +// +// auto box = set->pHitbox( hitbox ); +// +// if( box ) { +// auto dist = box->bbmin.dist_to( box->bbmax ); +// return dist + box->m_flRadius > 0 ? box->m_flRadius : 0.f; +// } +// +// return 0.f; +//} +// +//bool c_base_player::is_fakewalking( ) { +// auto walk_layer = m_AnimOverlay( ).GetElements( )[ 6 ]; +// auto velocity = m_vecVelocity( ).length2d( ); +// bool on_ground = m_fFlags( ) & FL_ONGROUND; +// if( walk_layer.m_flWeight < 0.03f && velocity > 0.1f && on_ground ) { +// return true; +// } +// +// return false; +//} +// +//int c_base_player::get_choked_ticks( ) { +// auto simtime = m_flSimulationTime( ); +// +// return TIME_TO_TICKS( g_gmod.m_globals->m_curtime - simtime ) + 1; +//} +// +//bool c_base_player::is_breaking_lc( ) { +// auto choked = get_choked_ticks( ); +// auto velocity = m_vecVelocity( ); +// auto ipt = g_gmod.m_globals->m_interval_per_tick; +// +// vec3_t travel_origin = m_vecOrigin( ) + velocity * ( ipt * choked ); +// return travel_origin.dist_to_sqr( m_vecOrigin( ) ) > 4096.f; +//} +// +//bool c_base_player::can_attack( bool ignore_rapid ) { +// if( g_ctx.m_has_fired_this_frame ) return false; +// if( !is_alive( ) ) return false; +// +// auto weapon = get_weapon( ); +// if( !weapon ) return false; +// +// float time = g_ctx.pred_time( ); +// +// float next_attack = m_flNextAttack( ); +// if( next_attack > time ) return false; +// +// float next_primary_attack = weapon->m_flNextPrimaryAttack( ); +// if( next_primary_attack > time ) return false; +// +// if( weapon->m_iItemDefinitionIndex( ) == WEAPON_R8REVOLVER ) { +// float ready_time = weapon->m_flPostponeFireReadyTime( ); +// if( ready_time == FLT_MAX ) return false; +// +// float time_to_shoot = ready_time - time; +// return TIME_TO_TICKS( time_to_shoot ) < 1; +// } +// +// return true; +//} +// +//int c_base_player::get_seq_activity( int sequence ) { +// static uintptr_t fn_offset = pattern::first_code_match( g_gmod.m_chl.dll( ), xors( "55 8B EC 83 7D 08 FF 56 8B F1 74 3D" ) ); +// auto fn = ( int( __thiscall* )( void*, int ) )( fn_offset ); +// +// return fn ? fn( this, sequence ) : -2; +//} +// +//void c_base_player::set_abs_angles( vec3_t angles ) { +// static uintptr_t fn_addr = pattern::first_code_match( g_gmod.m_chl.dll( ), xors( "55 8B EC 83 E4 F8 83 EC 64 53 56 57 8B F1 E8" ) ); +// auto fn = ( void( __thiscall* )( void*, vec3_t& ) )( fn_addr ); +// +// return fn( this, angles ); +//} +// +//void c_base_player::set_abs_origin( vec3_t origin ) { +// static uintptr_t fn_addr = pattern::first_code_match( g_gmod.m_chl.dll( ), xors( "55 8B EC 83 E4 F8 51 53 56 57 8B F1" ) ); +// auto fn = ( void( __thiscall* )( void*, vec3_t& ) )( fn_addr ); +// +// return fn( this, origin ); +//} +// +//void c_base_player::create_animstate( CCSGOPlayerAnimState* state ) { +// static auto fn_addr = pattern::first_code_match( g_gmod.m_chl.dll( ), xors( "55 8B EC 56 8B F1 B9 ? ? ? ? C7 46" ) ); +// auto fn = ( void( __thiscall* )( CCSGOPlayerAnimState*, decltype( this ) ) )( fn_addr ); +// +// fn( state, this ); +//} +// +//void c_base_player::enforce_animations( ) { +// int idx = this->ce( )->GetIndex( ); +// auto animstate = sm_player_animstate[ idx ]; +// +// if( animstate && animstate->pBaseEntity == this ) { +// memcpy( get_animstate( ), animstate, sizeof( CCSGOPlayerAnimState ) ); +// } +// +// //get< bool >( 0x38CD ) = false; +// //get< bool >( 0x35F8 ) = false; +// //m_bClientSideAnimation( ) = false; +//} +// +//void c_base_player::fix_animations( CCSGOPlayerAnimState* saved_state ) { +// bool valid = false; +// int idx = this->ce( )->GetIndex( ); +// +// C_AnimationLayer anim_backup[ 13 ]{ }; +// float pose_param_backup[ 24 ]{ }; +// +// memcpy( anim_backup, +// m_AnimOverlay( ).GetElements( ), +// sizeof( anim_backup ) ); +// +// memcpy( pose_param_backup, +// m_flPoseParameter( ), +// sizeof( pose_param_backup ) ); +// +// auto sequence_backup = m_nSequence( ); +// auto flags_backup = m_fFlags( ); +// auto cycle_backup = m_flCycle( ); +// auto eye_angles = m_angEyeAngles( ); +// auto render_angles = ce( )->GetRenderAngles( ); +// auto origin = m_vecOrigin( ); +// +// //these change but idk what they are +// m_bClientSideAnimation( ) = true; +// this->invalidate_bone_cache( ); +// +// auto backup_curtime = g_gmod.m_globals->m_curtime; +// auto backup_frametime = g_gmod.m_globals->m_frametime; +// auto backup_interp = g_gmod.m_globals->m_interpolation_amount; +// +// g_gmod.m_globals->m_curtime = m_flSimulationTime( ) - util::get_lerptime( ); +// g_gmod.m_globals->m_frametime = TICK_INTERVAL( ); +// +// int framecount = g_gmod.m_globals->m_framecount; +// +// auto csgo_animstate = get_animstate( ); +// if( csgo_animstate ) { +// if( !saved_state ) { +// if( !sm_player_animstate[ idx ] ) { +// sm_player_animstate[ idx ] = ( CCSGOPlayerAnimState* )g_gmod.m_alloc->Alloc( sizeof( CCSGOPlayerAnimState ) ); +// this->create_animstate( sm_player_animstate[ idx ] ); +// } +// else if( sm_player_animstate[ idx ]->pBaseEntity != this ) { +// sm_player_animstate[ idx ]->reset( ); +// this->create_animstate( sm_player_animstate[ idx ] ); +// sm_player_animstate[ idx ]->pBaseEntity = this; +// } +// else { +// valid = true; +// sm_player_animstate[ idx ]->m_iLastClientSideAnimationUpdateFramecount = 0; +// sm_player_animstate[ idx ]->m_flLastClientSideAnimationUpdateTime = 0.f; +// sm_player_animstate[ idx ]->update( eye_angles.y, eye_angles.x ); +// } +// } +// } +// else { +// g_con->log( xors( "couldnt update animstate for player %d!" ), ce( )->GetIndex( ) ); +// return; +// } +// +// //call updateclientsideanimation +// util::get_vfunc< 218, void >( this ); +// +// if( saved_state ) +// memcpy( csgo_animstate, saved_state, sizeof( CCSGOPlayerAnimState ) ); +// else if( valid ) +// memcpy( csgo_animstate, sm_player_animstate[ idx ], sizeof( CCSGOPlayerAnimState ) ); +// +// this->ce( )->GetRenderAngles( ).y = std::remainderf( ce( )->GetRenderAngles( ).y, 360.f ); +// this->ce( )->GetRenderOrigin( ) = m_vecOrigin( ); +// set_abs_angles( this->ce( )->GetRenderAngles( ) ); +// set_abs_origin( m_vecOrigin( ) ); +// m_fFlags( ) = flags_backup; +// m_flCycle( ) = cycle_backup; +// m_nSequence( ) = sequence_backup; +// +// //*( int* )( uintptr_t( this ) + 0xa30 ) = 0; +// //m_nWriteableBones( ) = 0; +// +// memcpy( m_AnimOverlay( ).GetElements( ), +// anim_backup, +// sizeof( anim_backup ) ); +// +// memcpy( m_flPoseParameter( ), +// pose_param_backup, +// sizeof( pose_param_backup ) ); +// +// m_flLastBoneSetupTime( ) = 0.f; +// m_iMostRecentModelBoneCounter( ) = 0; +// +// ce( )->SetupBones( nullptr, -1, 0x100, m_flSimulationTime( ) ); +// +// m_flLastBoneSetupTime( ) = std::numeric_limits< float >::quiet_NaN( ); +// m_iMostRecentModelBoneCounter( ) = 0; +// +// g_gmod.m_globals->m_curtime = backup_curtime; +// g_gmod.m_globals->m_frametime = backup_frametime; +// +// m_bClientSideAnimation( ) = false; +//} +// +player_info_t c_base_player::get_info( ) { + player_info_t info; + g_gmod.m_engine( )->GetPlayerInfo( ce( )->GetIndex( ), &info ); + + return info; +} + +void c_base_player::get_name_safe( char* buf ) { + player_info_t info; + if( g_gmod.m_engine( )->GetPlayerInfo( this->ce( )->GetIndex( ), &info ) ) { + for( size_t i{ }; i < 32; ++i ) { + switch( info.name[ i ] ) { + case '"': + case '\\': + case ';': + case '\n': + buf[ i ] = ' '; + break; + default: + buf[ i ] = info.name[ i ]; + break; + } + } + + buf[ 31 ] = 0; + } +} \ No newline at end of file diff --git a/cheat/gmod/c_base_player.hpp b/cheat/gmod/c_base_player.hpp new file mode 100644 index 0000000..085f4a2 --- /dev/null +++ b/cheat/gmod/c_base_player.hpp @@ -0,0 +1,258 @@ +#pragma once +#include "util.hpp" +#include "IClientEntityList.hpp" +#include "netvars.hpp" +#include "pattern.hpp" +#include "c_base_weapon.hpp" +#include "CUtlVector.hpp" +#include "settings.hpp" + +enum PlayerState_t { + FL_ONGROUND = 1 << 0, + FL_DUCKING = 1 << 1, + FL_WATERJUMP = 1 << 2, + FL_ONTRAIN = 1 << 3, + FL_INRAIN = 1 << 4, + FL_FROZEN = 1 << 5, + FL_ATCONTROLS = 1 << 6, + FL_CLIENT = 1 << 7, + FL_FAKECLIENT = 1 << 8, + FL_INWATER = 1 << 9, +}; + +enum MoveType_t { + MOVETYPE_NONE = 0, // never moves + MOVETYPE_ISOMETRIC, // For players -- in TF2 commander view, etc. + MOVETYPE_WALK, // Player only - moving on the ground + MOVETYPE_STEP, // gravity, special edge handling -- monsters use this + MOVETYPE_FLY, // No gravity, but still collides with stuff + MOVETYPE_FLYGRAVITY, // flies through the air + is affected by gravity + MOVETYPE_VPHYSICS, // uses VPHYSICS for simulation + MOVETYPE_PUSH, // no clip to world, push and crush + MOVETYPE_NOCLIP, // No gravity, no collisions, still do velocity/avelocity + MOVETYPE_LADDER, // Used by players only when going onto a ladder + MOVETYPE_OBSERVER, // Observer movement, depends on player's observer mode + MOVETYPE_CUSTOM, // Allows the entity to describe its own physics + MOVETYPE_LAST = MOVETYPE_CUSTOM, // should always be defined as the last item in the list + MOVETYPE_MAX_BITS = 4, +}; + +enum LifeState_t { + LIFE_ALIVE = 0, // alive + LIFE_DYING, // playing death animation or still falling off of a ledge waiting to hit ground + LIFE_DEAD, // dead. lying still. + LIFE_RESPAWNABLE, + LIFE_DISCARDBODY, +}; + +class fire_bullets_info +{ +public: + int32_t shots; //0x0000 + vec3_t src; //0x0004 + vec3_t dir; //0x0010 + vec3_t spread; //0x001C + float distance; //0x0028 + int32_t ammo_type; //0x002C + int32_t tracer_freq; //0x0030 + float damage; //0x0034 + int32_t player_damager; //0x0038 + int32_t flags; //0x003C + char pad_0040[ 18 ]; //0x0040 +}; //Size: 0x0054 + + + +struct clientanimating_t { + void* m_pAnimating; + unsigned int m_fFlags; + clientanimating_t( void* _pAnim, unsigned int _flags ) : m_pAnimating( _pAnim ), m_fFlags( _flags ) {} +}; + + + +class VarMapEntry_t { +public: + unsigned short type; + unsigned short m_bNeedsToInterpolate; // Set to false when this var doesn't + // need Interpolate() called on it anymore. + void* data; + void* watcher; +}; + +struct VarMapping_t { + CUtlVector< VarMapEntry_t > m_Entries; + int m_nInterpolatedEntries; // +0x14 + float m_lastInterpolationTime; // +0x18 +}; + +class c_base_player { +private: + +public: + //NETVAR( m_YourFunctionName, "Name", "Table", extra, type ) + + NETVAR( m_nMoveType, "m_Collision", "DT_BaseEntity", -0x24, MoveType_t ); + NETVAR( m_iHealth, "m_iHealth", "DT_BaseEntity", 0, int ); + NETVAR( m_lifeState, "m_lifeState", "DT_BasePlayer", 0, uint8_t ); + NETVAR( m_nTickBase, "m_nTickBase", "DT_BasePlayer", 0, int ); + NETVAR( m_fFlags, "m_fFlags", "DT_BasePlayer", 0, int ); + //NETVAR( m_vecVelocity, "m_vecVelocity[0]", "DT_BasePlayer", 0, vec3_t ); + NETVAR( m_nHitboxSet, "m_nHitboxSet", "DT_BaseAnimating", 0, int ); + NETVAR( m_vecOrigin, "m_vecOrigin", "DT_BaseEntity", 0, vec3_t ); + NETVAR( m_vecViewOffset, "m_vecViewOffset[0]", "DT_BasePlayer", 0, vec3_t ); + NETVAR( m_hActiveWeapon, "m_hActiveWeapon", "DT_BaseCombatCharacter", 0, ulong_t ); + NETVAR( m_iTeamNum, "m_iTeamNum", "DT_BaseEntity", 0, int ); + NETVAR( m_dwBoneMatrix, "m_nForceBone", "DT_BaseAnimating", 28, uintptr_t ); + NETVAR( m_bHasHelmet, "m_bHasHelmet", "DT_CSPlayer", 0, bool ); + NETVAR( m_ArmorValue, "m_ArmorValue", "DT_CSPlayer", 0, int ); + NETVAR( m_flNextAttack, "m_flNextAttack", "DT_BaseCombatCharacter", 0, float ); + NETVAR( m_angEyeAngles, "m_angEyeAngles[0]", "DT_CSPlayer", 0, vec3_t ); + NETVAR( m_AnimOverlay, "m_hLightingOrigin", "DT_BaseAnimating", 0x3c, int ); + NETVAR( m_flSimulationTime, "m_flSimulationTime", "DT_BaseEntity", 0, float ); + NETVAR( m_flCycle, "m_flCycle", "DT_BaseAnimating", 0, float ); + NETVAR( m_nSequence, "m_nSequence", "DT_BaseAnimating", 0, int ); + PNETVAR( m_flPoseParameter, "m_flPoseParameter", "DT_BaseAnimating", 0, float ); + NETVAR( m_bClientSideAnimation, "m_bClientSideAnimation", "DT_BaseAnimating", 0, bool ); + NETVAR( m_flLastBoneSetupTime, "m_hLightingOrigin", "DT_BaseAnimating", -0x20, float ); + NETVAR( m_iMostRecentModelBoneCounter, "m_nForceBone", "DT_BaseAnimating", 0x4, int ); + NETVAR( m_nWriteableBones, "m_nForceBone", "DT_BaseAnimating", 0x20, int ); + NETVAR( m_vecThirdpersonAngles, "deadflag", "DT_BasePlayer", 0x4, vec3_t ); + NETVAR( m_hObserverTarget, "m_hObserverTarget", "DT_BasePlayer", 0, uint32_t ); + NETVAR( m_iObserverMode, "m_iObserverMode", "DT_BasePlayer", 0, int ); + NETVAR( m_csgoAnimState, "m_bIsScoped", "DT_CSPlayer", -0xe, void* ); + NETVAR( m_flOldSimulationTime, "m_flSimulationTime", "DT_BaseEntity", 0x4, float ); + NETVAR( m_CoordinateFrame, "m_CollisionGroup", "DT_BaseEntity", -0x4C, matrix3x4 ); + NETVAR( m_vecMins, "m_vecMins", "DT_BaseEntity", 0, vec3_t ); + NETVAR( m_vecMaxs, "m_vecMaxs", "DT_BaseEntity", 0, vec3_t ); + NETVAR( m_bIsScoped, "m_bIsScoped", "DT_CSPlayer", 0, bool ); + NETVAR( m_viewPunchAngle, "m_viewPunchAngle", "DT_BasePlayer", 0, vec3_t ); + NETVAR( m_flMaxFlashAlpha, "m_flFlashMaxAlpha", "DT_CSPlayer", 0, float ); + NETVAR( m_flFlashDuration, "m_flFlashDuration", "DT_CSPlayer", 0, float ); + NETVAR( m_flFlashTime, "m_flFlashMaxAlpha", "DT_CSPlayer", -0x10, float ); + NETVAR( m_bGunGameImmunity, "m_bGunGameImmunity", "DT_CSPlayer", 0, bool ); + NETVAR( m_hViewModel, "m_hViewModel[0]", "DT_BasePlayer", 0, uint32_t ); + NETVAR( m_bSpotted, "m_bSpotted", "DT_CSPlayer", 0, bool ); + NETVAR( m_clrRender, "m_clrRender", "DT_BaseEntity", 0, clr_t ); + NETVAR( m_vecPunchAngle, "m_vecPunchAngle", "DT_BasePlayer", 0, vec3_t ); + + OFFSET( m_CachedBoneData, 0x28FC + sizeof( void* ), CUtlVector< matrix3x4 > ); + OFFSET( m_flSpawnTime, 0xa290, float ); + OFFSET( m_vecVelocity, 0xf4, vec3_t ); + +public: + static uintptr_t get_player_resource( ); + + /*makes it much more organized: functions from IClientEntity + dont interfere with our defined functions*/ + __forceinline IClientEntity* ce( ) { + return reinterpret_cast< IClientEntity* >( this ); + } + + __forceinline operator IClientEntity*( ) { + return reinterpret_cast< IClientEntity* >( this ); + } + + template < typename t > + __forceinline t& get( std::ptrdiff_t offset ) { + return *reinterpret_cast< t* >( uintptr_t( this ) + offset ); + } + + __forceinline bool is_alive( ) { + return m_iHealth( ) > 0; + } + + bool is_flashed( ); + bool is_reloading( ); + + __forceinline auto& m_aimPunchAngle( bool real = false ) { + static vec3_t backup_var{ }; + static auto offset = g_netvars.get_netvar( fnv( "DT_BasePlayer" ), fnv( "m_aimPunchAngle" ) ); + if( g_settings.misc.no_recoil( ) && !real ) { + backup_var = { 0.f, 0.f, 0.f }; + return backup_var; + } + + return get< vec3_t >( offset ); + } + + __forceinline void* get_animstate( ) { + static std::ptrdiff_t offset = g_netvars.get_netvar( fnv( "DT_CSPlayer" ), + fnv( "m_bIsScoped" ) ); + + if( !offset ) { + return nullptr; + } + + return *reinterpret_cast< void** >( uintptr_t( this ) + offset - 0xa ); + } + + __forceinline void disable_interpolaton( ) { + VarMapping_t* varmapping = ( VarMapping_t* )( uintptr_t( this ) + 0x24 ); + + for( int i{ }; i < varmapping->m_nInterpolatedEntries; ++i ) { + if( !varmapping->m_Entries.GetElements( ) ) { + continue; + } + + auto e = &varmapping->m_Entries.GetElements( )[ i ]; + + if( e ) + e->m_bNeedsToInterpolate = false; + } + + //this is the only thing that actually disables interpolation + //to re-enable it, u want to backup and restore m_nInterpolatedEntries + //theres no need to re-enable it because the game will do it for you + //as soon as you stop forcing it off + varmapping->m_nInterpolatedEntries = 0; + varmapping->m_lastInterpolationTime = 0.f; + } + + __forceinline void update_clientside_animation( ) { + bool backup = m_bClientSideAnimation( ); + m_bClientSideAnimation( ) = true; + util::get_vfunc< 218, void >( this ); + m_bClientSideAnimation( ) = backup; + } + + __forceinline void invalidate_bone_cache( ) { + m_flLastBoneSetupTime( ) = -FLT_MAX; + m_iMostRecentModelBoneCounter( ) -= 1; + m_nWriteableBones( ) = 0; + } + + __forceinline vec3_t get_eye_pos( ) { + vec3_t yes; + util::get_vfunc< void( __thiscall* )( void*, vec3_t& ) >( this, 286 )( this, yes ); + return yes; + } + + __forceinline bool is_valid( ) { + return !ce( )->IsDormant( ) && is_alive( ); + } + + c_base_player* get_observer_target( ); + const char* get_rank( ); + clr_t get_team_color( ); + bool is_fakewalking( ); + player_info_t get_info( ); + void get_name_safe( char* buf ); + c_base_weapon* get_weapon( ); + vec3_t get_hitbox_pos( int hitbox ); + bool is_visible( int hitbox ); + bool is_visible( const vec3_t& pos ); + bool can_attack( bool ignore_rapid = false ); + int get_choked_ticks( ); + float get_hitbox_radius( int hitbox ); + + void set_abs_origin( vec3_t origin ); + void set_abs_angles( vec3_t angles ); + void enforce_animations( ); + + void create_animstate( void* state ); + int get_seq_activity( int sequence ); + + void fix_animations( void* saved_state = nullptr ); + bool is_breaking_lc( ); +}; \ No newline at end of file diff --git a/cheat/gmod/c_base_weapon.cpp b/cheat/gmod/c_base_weapon.cpp new file mode 100644 index 0000000..94c5ec6 --- /dev/null +++ b/cheat/gmod/c_base_weapon.cpp @@ -0,0 +1,87 @@ +#include "c_base_weapon.hpp" +#include "context.hpp" +#include "base_cheat.hpp" + +void* c_base_weapon::get_wpn_data( ) { + static auto func = pattern::first_code_match< void*( __thiscall* )( void* ) >( g_gmod.m_chl.dll( ), "0F B7 81 ? ? ? ? 50 E8 ? ? ? ? 83 C4 04 C3" ); + + if ( func ) + return func( this ); + + return nullptr; +} + +bool c_base_weapon::is_cw20( ) { + if( !g_ctx.m_lua ) + return false; + + const auto lua = g_ctx.m_lua; + + this->ce( )->PushEntity( ); + if( !lua->IsType( -1, LUA_TYPE::TYPE_ENTITY ) ) { + lua->Pop( 2 ); + return false; + } + + lua->GetField( -1, xors( "CW20Weapon" ) ); + if( !lua->IsType( -1, LUA_TYPE::TYPE_BOOL ) ) { + lua->Pop( 2 ); + return false; + } + + bool is_cw20 = lua->GetBool( -1 ); + + lua->Pop( 2 ); + + return is_cw20; +} + +bool c_base_weapon::is_fas2( ) { + if( !g_ctx.m_lua ) + return false; + + const auto lua = g_ctx.m_lua; + + this->ce( )->PushEntity( ); + if( !lua->IsType( -1, LUA_TYPE::TYPE_ENTITY ) ) { + lua->Pop( 2 ); + return false; + } + + lua->GetField( -1, xors( "IsFAS2Weapon" ) ); + if( !lua->IsType( -1, LUA_TYPE::TYPE_BOOL ) ) { + lua->Pop( 2 ); + return false; + } + + bool is_fas2 = lua->GetBool( -1 ); + + lua->Pop( 2 ); + + return is_fas2; +} + +float c_base_weapon::get_custom_cone( ) { + if( !g_ctx.m_lua ) + return 0.f; + + const auto lua = g_ctx.m_lua; + + this->ce( )->PushEntity( ); // thank god for this function. + if( !lua->IsType( -1, LUA_TYPE::TYPE_ENTITY ) ) { + lua->Pop( 2 ); + return false; + } + + lua->GetField( -1, xors( "CurCone" ) ); + if( !lua->IsType( -1, LUA_TYPE::TYPE_NUMBER ) ) { + lua->Pop( 2 ); + return false; + } + + float cone = lua->GetNumber( -1 ); + + lua->Pop( 2 ); + + return cone; +} \ No newline at end of file diff --git a/cheat/gmod/c_base_weapon.hpp b/cheat/gmod/c_base_weapon.hpp new file mode 100644 index 0000000..76884c8 --- /dev/null +++ b/cheat/gmod/c_base_weapon.hpp @@ -0,0 +1,48 @@ +#pragma once +#include "util.hpp" +#include "IClientEntityList.hpp" +#include "netvars.hpp" +#include "pattern.hpp" + + + +class c_base_weapon { +public: + NETVAR( m_iClip1, "m_iClip1", "DT_BaseCombatWeapon", 0, int ); + NETVAR( m_flNextPrimaryAttack, "m_flNextPrimaryAttack", "DT_BaseCombatWeapon", 0, float ); + NETVAR( m_hOwner, "m_hOwner", "DT_BaseCombatWeapon", 0, uint32_t ); + NETVAR( m_nModelIndex, "m_nModelIndex", "DT_BaseEntity", 0, int ); + + __forceinline IClientEntity* ce( ) { + return reinterpret_cast< IClientEntity* >( this ); + } + + __forceinline operator IClientEntity*( ) { + return reinterpret_cast< IClientEntity* >( this ); + } + + template < typename t > + __forceinline t& get( std::ptrdiff_t offset ) { + return *reinterpret_cast< t* >( uintptr_t( this ) + offset ); + } + + int get_max_clip1( ) { + return util::get_vfunc< 355, int >( this ); + } + + const char* get_class_name( ) { + return util::get_vfunc< 366, const char* >( this ); + } + + const char* get_print_name( ) { + return util::get_vfunc< 367, const char* >( this ); + } + + void* get_wpn_data( ); + + char get_hud_icon( ); + + bool is_cw20( ); + bool is_fas2( ); + float get_custom_cone( ); +}; \ No newline at end of file diff --git a/cheat/gmod/chams.cpp b/cheat/gmod/chams.cpp new file mode 100644 index 0000000..09abe58 --- /dev/null +++ b/cheat/gmod/chams.cpp @@ -0,0 +1,157 @@ +#include "chams.hpp" +#include "interface.hpp" + +static auto chams_mat = xors_raw( ( + R"("VertexLitGeneric" +{ + "$basetexture" "vgui/white" + "$model" "1" + "$envmap" "env_cubemap" + "$envmaptint" "[.3 .3 .3]" + "$envmapcontrast" ".4" + "$envmapsaturation" "1.0" + "$flat" "0" + "$nocull" "1" + "$halflambert" "1" + "$nofog" "1" + "$ignorez" "0" + "$znearer" "0" + "$wireframe" "0" + "$phong" "1" + "$phongexponent" "255.0" + "$normalmapalphaenvmask" "1" + "$phongboost" "6.0" + "$phongfresnelranges" "[0 0.5 1]" + "$BasemapAlphaPhongMask" "1" +})" +) ); + +static auto chams_mat_shine = xors_raw( ( + R"("VertexLitGeneric" +{ + "$basetexture" "vgui/white" + "$envmap" "env_cubemap" + "$envmaptint" "[.3 .3 .3]" + "$reflectivity" "[1.0 1.0 1.0]" + "$envmapcontrast" ".4" + "$envmapsaturation" "1.0" + "$model" "1" + "$flat" "0" + "$nocull" "1" + "$selfillum" "1" + "$halflambert" "1" + "$nofog" "1" + "$ignorez" "0" + "$znearer" "0" + "$wireframe" "0" +})" +) ); + +static auto chams_mat_flat = xors_raw( ( + R"("UnlitGeneric" +{ + "$basetexture" "vgui/white" + "$model" "1" + "$flat" "1" + "$nocull" "1" + "$selfillum" "1" + "$halflambert" "1" + "$nofog" "1" + "$ignorez" "0" + "$znearer" "0" + "$wireframe" "0" +})" +) ); + +namespace features +{ + void c_materials::make_cham_buffer( char* buf, int len, int type ) { + switch ( type ) { + case 1: + sprintf_s( buf, len - 1, chams_mat_flat.decrypt( ) ); + break; + case 2: + sprintf_s( buf, len - 1, chams_mat_shine.decrypt( ) ); + break; + default: + sprintf_s( buf, len - 1, chams_mat.decrypt( ) ); + } + } + + void c_material::init( const char* name, const char* buf ) { + m_keyvalues = new KeyValues( name ); + m_keyvalues->LoadFromBuffer( name, buf ); + + m_mat = g_csgo.m_mat_system( )->CreateMaterial( name, m_keyvalues ); + m_mat->IncrementReferenceCount( ); + } + + void c_materials::force_material( IMaterial* mat, fclr_t clr ) { + if( !mat ) return; + + float col[ ] = { clr.r( ), clr.g( ), clr.b( ) }; + g_csgo.m_render_view( )->SetBlend( clr.a( ) ); + g_csgo.m_render_view( )->SetColorModulation( col ); + + g_csgo.m_model_render( )->ForcedMaterialOverride( mat ); + } + + void c_materials::initialize_materials( ) { + char buffer[ 1024 ]; + + make_cham_buffer( buffer, sizeof( buffer ), 0 ); + m_chams.init( xors( "chamsmat" ), buffer ); + memset( buffer, 0, 1024 ); + + make_cham_buffer( buffer, sizeof( buffer ), 1 ); + m_chams_flat.init( xors( "chamsmat_flat" ), buffer ); + memset( buffer, 0, 1024 ); + m_initialized = true; + } + + void c_materials::update_materials( ) { + if( !m_initialized ) return; + static float last_reflectivity{ }; + static float last_shine{ }; + static KeyValues* reflectivity; + static KeyValues* shine; + + if( !reflectivity ) { + for( auto it = m_chams.m_keyvalues->m_pSub; !!it; it = it->m_pPeer ) { + if( it->m_iDataType != 1 ) continue; + if( strstr( it->m_sValue, xors( "[.3 .3 .3]" ) ) ) { + reflectivity = it; + } + } + } + + if( !shine ) { + for( auto it = m_chams.m_keyvalues->m_pSub; !!it; it = it->m_pPeer ) { + if( it->m_flValue == 6.0f ) + shine = it; + } + } + + if( reflectivity ) { + if( last_reflectivity != g_settings.visuals.chams.reflectivity( ) ) { + char buf[ 32 ]; + sprintf_s< 32 >( buf, xors( "[%1.1f %1.1f %1.1f]" ), + g_settings.visuals.chams.reflectivity( ), + g_settings.visuals.chams.reflectivity( ), + g_settings.visuals.chams.reflectivity( ) ); + + strcpy( reflectivity->m_sValue, buf ); + m_chams.m_mat->Refresh( ); + } + last_reflectivity = g_settings.visuals.chams.reflectivity( ); + } + + if( shine ) { + if( last_shine != g_settings.visuals.chams.shine( ) ) { + shine->m_flValue = g_settings.visuals.chams.shine( ) * 100.f; + m_chams.m_mat->Refresh( ); + } + last_shine = g_settings.visuals.chams.shine( ); + } + } +} \ No newline at end of file diff --git a/cheat/gmod/chams.hpp b/cheat/gmod/chams.hpp new file mode 100644 index 0000000..2c3e317 --- /dev/null +++ b/cheat/gmod/chams.hpp @@ -0,0 +1,45 @@ +#pragma once + +#include "sdk.hpp" + +namespace features +{ + enum ChamBufferType_t { + TYPE_NORMAL, + TYPE_FLAT, + TYPE_SHINE + }; + + class c_material { + public: + c_material( ) = default; + + void init( const char* mat, const char* buf ); + + operator IMaterial*( ) { + return m_mat; + } + + public: + IMaterial* m_mat; + KeyValues* m_keyvalues; + }; + + class c_materials { + public: + c_material m_chams{ }; + c_material m_chams_flat{ }; + + void make_cham_buffer( char* buf, int len, int type ); //type, 0 = normal, 1 = flat, 2 = shine + public: + void initialize_materials( ); + void force_material( IMaterial* material, fclr_t color ); + void update_materials( ); + bool m_initialized{ }; + }; + + class c_chams { + public: + c_materials m_materials; + }; +} \ No newline at end of file diff --git a/cheat/gmod/color.hpp b/cheat/gmod/color.hpp new file mode 100644 index 0000000..38bb442 --- /dev/null +++ b/cheat/gmod/color.hpp @@ -0,0 +1,278 @@ +#pragma once +#include +#include + +//this is a fucking mess + +class fclr_t { + float R, G, B, A; +public: + fclr_t( ) : R( 0 ), G( 0 ), B( 0 ), A( 0 ) { } + + fclr_t( float r, float g, float b, float a ) : R( r ), G( g ), B( b ), A( a ) { } + + fclr_t( float r, float g, float b ) : R( r ), G( g ), B( b ), A( 255 ) { } + + float& r( ) { return R; } + float& g( ) { return G; } + float& b( ) { return B; } + float& a( ) { return A; } + + fclr_t& operator =( fclr_t& c ) { + R = c.r( ); + G = c.g( ); + B = c.b( ); + A = c.a( ); + return *this; + } + + fclr_t operator+( const fclr_t& v ) const { + return fclr_t( R + v.R, G + v.G, B + v.B, A + v.A ); + } + + explicit operator bool( ) const noexcept { + return ( R > 0 || G > 0 || B > 0 || A > 0 ); + } + + bool operator==( fclr_t& c ) const { + return ( R == c.r( ) && G == c.g( ) && B == c.b( ) ); + } +}; + +class clr_t { + uint8_t R, G, B, A; +public: + clr_t( ) : R( 0 ), G( 0 ), B( 0 ), A( 0 ) { } + + clr_t( uint8_t r, uint8_t g, uint8_t b, uint8_t a ) : R( r ), G( g ), B( b ), A( a ) { } + + clr_t( uint8_t r, uint8_t g, uint8_t b ) : R( r ), G( g ), B( b ), A( 255 ) { } + + uint8_t& r( ) { return R; } + uint8_t& g( ) { return G; } + uint8_t& b( ) { return B; } + uint8_t& a( ) { return A; } + + clr_t& operator =( const clr_t& c ) { + R = c.R; + G = c.G; + B = c.B; + A = c.A; + return *this; + } + + clr_t operator+( const clr_t& v ) const { + return clr_t( R + v.R, G + v.G, B + v.B, A + v.A ); + } + + clr_t operator*( float f ) { + return clr_t( uint8_t( R * f ), uint8_t( G * f ), uint8_t( B * f ), A ); + } + + explicit operator bool( ) const noexcept { + return ( R > 0 || G > 0 || B > 0 || A > 0 ); + } + + float brightness( ) { + typedef struct { + float h, s, v; + } hsv; + hsv out; + + float min = static_cast( R < G ? R : G ); + min = static_cast( min < B ? min : B ); + + float max = static_cast( R > G ? R : G ); + max = static_cast( max > B ? max : B ); + + out.v = max; + float delta = max - min; + if ( delta < 0.0010f ) { + out.s = 0.f; + out.h = 0.f; + return out.h; + } + if ( max > 0.0f ) { + out.s = delta / max; + } + else { + out.s = 0.0f; + out.h = NAN; + return out.h; + } + if ( R >= max ) + out.h = static_cast( G - B ) / delta; + else if ( G >= max ) + out.h = 2.0f + static_cast( B - R ) / delta; + else + out.h = 4.0f + static_cast( R - G ) / delta; + + out.h *= 60.0f; + out.h /= 360.f; + + if ( out.h < 0.0f ) + out.h += 360.0f; + + return out.v; + } + + float saturation( ) { + typedef struct { + float h, s, v; + } hsv; + hsv out; + + float min = static_cast( R < G ? R : G ); + min = static_cast( min < B ? min : B ); + + float max = static_cast( R > G ? R : G ); + max = static_cast( max > B ? max : B ); + + out.v = max; + float delta = max - min; + if ( delta < 0.0010f ) { + out.s = 0.f; + out.h = 0.f; + return out.h; + } + if ( max > 0.0f ) { + out.s = delta / max; + } + else { + out.s = 0.0f; + out.h = NAN; + return out.h; + } + if ( R >= max ) + out.h = static_cast( G - B ) / delta; + else if ( G >= max ) + out.h = 2.0f + static_cast( B - R ) / delta; + else + out.h = 4.0f + static_cast( R - G ) / delta; + + out.h *= 60.0f; + out.h /= 360.f; + + if ( out.h < 0.0f ) + out.h += 360.0f; + + return out.s; + } + + static clr_t from_hsb( float hue, float saturation, float brightness ) { + float h = hue == 1.0f ? 0 : hue * 6.0f; + float f = h - ( int )h; + float p = brightness * ( 1.0f - saturation ); + float q = brightness * ( 1.0f - saturation * f ); + float t = brightness * ( 1.0f - ( saturation * ( 1.0f - f ) ) ); + + if ( h < 1 ) { + return clr_t( + ( unsigned char )( brightness * 255 ), + ( unsigned char )( t * 255 ), + ( unsigned char )( p * 255 ) + ); + } + else if ( h < 2 ) { + return clr_t( + ( unsigned char )( q * 255 ), + ( unsigned char )( brightness * 255 ), + ( unsigned char )( p * 255 ) + ); + } + else if ( h < 3 ) { + return clr_t( + ( unsigned char )( p * 255 ), + ( unsigned char )( brightness * 255 ), + ( unsigned char )( t * 255 ) + ); + } + else if ( h < 4 ) { + return clr_t( + ( unsigned char )( p * 255 ), + ( unsigned char )( q * 255 ), + ( unsigned char )( brightness * 255 ) + ); + } + else if ( h < 5 ) { + return clr_t( + ( unsigned char )( t * 255 ), + ( unsigned char )( p * 255 ), + ( unsigned char )( brightness * 255 ) + ); + } + else { + return clr_t( + ( unsigned char )( brightness * 255 ), + ( unsigned char )( p * 255 ), + ( unsigned char )( q * 255 ) + ); + } + } + + static clr_t blend( clr_t first, clr_t second, float t ) { + return clr_t( + first.r( ) + static_cast< int >( t * ( second.r( ) - first.r( ) ) ), + first.g( ) + static_cast< int >( t * ( second.g( ) - first.g( ) ) ), + first.b( ) + static_cast< int >( t * ( second.b( ) - first.b( ) ) ), + first.a( ) + static_cast< int >( t * ( second.a( ) - first.a( ) ) ) + ); + } + + float hue( ) { + typedef struct { + float h, s, v; + } hsv; + hsv out; + float min, max, delta; + + min = static_cast< float >( R < G ? R : G ); + min = static_cast< float >( min < B ? min : B ); + + max = static_cast< float >( R > G ? R : G ); + max = static_cast< float >( max > B ? max : B ); + + out.v = max; + delta = max - min; + if ( delta < 0.0010f ) { + out.s = 0.f; + out.h = 0.f; + return out.h; + } + if ( max > 0.0f ) { + out.s = ( delta / max ); + } + else { + out.s = 0.0f; + out.h = ( float )NAN; + return out.h; + } + if ( R >= max ) + out.h = static_cast< float >( G - B ) / delta; + else + if ( G >= max ) + out.h = 2.0f + static_cast< float >( B - R ) / delta; + else + out.h = 4.0f + static_cast< float >( R - G ) / delta; + + out.h *= 60.0f; + out.h /= 360.f; + + if ( out.h < 0.0f ) + out.h += 360.0f; + + return out.h; + } + + fclr_t to_fclr( ) { + return fclr_t{ R / 255.f, G / 255.f, B / 255.f, A / 255.f }; + } + + operator fclr_t( ) { + return this->to_fclr( ); + } + + bool operator==( const clr_t& c ) const { + return ( R == c.R && G == c.G && B == c.B ); + } +}; \ No newline at end of file diff --git a/cheat/gmod/con_alias.hpp b/cheat/gmod/con_alias.hpp new file mode 100644 index 0000000..f00e7df --- /dev/null +++ b/cheat/gmod/con_alias.hpp @@ -0,0 +1,60 @@ +#pragma once + +#include +#include "simple_settings.hpp" + +template< typename var_type = bool > +class con_alias : public ISetting { +public: + con_alias( hash_t hash, con_var< var_type >* var ) : + m_var( var ), + m_value( var_type{ } ), + m_name( hash ), + m_is_var( true ) { }; + + con_alias( hash_t hash ) : + m_name( hash ), + m_value( 0 ), + m_var( nullptr ), + m_is_var( false ) { }; + + con_alias( hash_t hash, var_type&& rhs ) : + m_name( hash ), + m_value( rhs ), + m_var( nullptr ), + m_is_var( false ) { }; + + virtual std::string get_string( ) override { + if( m_is_var ) + return m_var->get_string( ); + else + return std::to_string( m_value ); + } + + virtual void set_value( int value ) override { + set_value_internal( value ); + } + + virtual void set_value( float value ) override { + set_value_internal( value ); + } + + virtual void set_value( ulong_t value ) override { + set_value_internal( value ); + } + +private: + template < typename t > + void set_value_internal( t&& val ) { + if( m_is_var ) + m_var->set( val ); + else + m_value = ( var_type )( val ); + } + +private: + bool m_is_var; + hash_t m_name; + var_type m_value; + con_var< var_type >* m_var; +}; \ No newline at end of file diff --git a/cheat/gmod/con_fn.hpp b/cheat/gmod/con_fn.hpp new file mode 100644 index 0000000..59fb0a3 --- /dev/null +++ b/cheat/gmod/con_fn.hpp @@ -0,0 +1,172 @@ +#pragma once +#include + +#include "simple_settings.hpp" + +//KEEP THIS UP TO DATE!! +enum ConFnVarType_t { + TYPE_NULL = 0, + TYPE_FLOAT = 'F', + TYPE_STRING = 'S', + TYPE_INTEGER = 'D', + TYPE_HEX = 'X' +}; + +class con_fn_base { +public: + virtual bool execute( const char* str ) = 0; + virtual const char* get_syntax( ) = 0; + virtual hash_t get_hash( ) = 0; +}; + +class con_fn : public con_fn_base { +public: + con_fn( hash_t hash, std::function< void __cdecl( const char*, const char* ) > function, const char* syntax ) { + m_hash = hash; + m_function = function; + strcpy_s< 64 >( m_syntax, syntax ); + for( size_t i{ }; i < strlen( m_syntax ); ++i ) { + if( m_syntax[ i ] == '%' ) { + m_args++; + } + } + } + + static ConFnVarType_t get_var_type( size_t arg, const char* syntax ) { + size_t cur_arg = 0; + for( size_t i{ }; i < strlen( syntax ); ++i ) { + if( syntax[ i ] == '%' ) { + if( cur_arg++ == arg ) { + return ( ConFnVarType_t )( syntax[ i + 1 ] ); + } + } + } + + return TYPE_NULL; + } + + template < typename t > + static t get_arg( const char* str, size_t arg_index, const char* syntax ) { + auto arg_type = get_var_type( arg_index, syntax ); + + size_t cur_arg = 0; + for( size_t i{ }; i < strlen( str ); ++i ) { + if( str[ i ] == ' ' ) { + if( cur_arg++ == arg_index ) { + size_t start = i + 1; + size_t end = strlen( str ); + for( size_t i2 = start; i2 < strlen( str ); ++i2 ) { + if( str[ i2 ] == ' ' ) { + end = i2; + break; + } + } + + std::string str( str + start, end - start ); + + char* end_ptr = ( char* )str.c_str( ) + end; + if constexpr( std::is_integral_v< t > ) { + auto radix = get_var_type( arg_index, syntax ) == TYPE_HEX ? 16 : 10; + return std::strtol( str.c_str( ), &end_ptr, radix ); + } + + if constexpr( std::is_floating_point_v< t > ) { + return std::strtof( str.c_str( ), &end_ptr ); + } + + return ( t )str.c_str( ); + } + } + } + + return t{ }; + } + + virtual const char* get_syntax( ) override { + return m_syntax; + } + + virtual hash_t get_hash( ) override { + return m_hash; + } + + ConFnVarType_t get_var_type( size_t arg ) { + size_t cur_arg = 0; + for( size_t i{ }; i < strlen( m_syntax ); ++i ) { + if( m_syntax[ i ] == '%' ) { + if( cur_arg++ == arg ) { + return ( ConFnVarType_t )( m_syntax[ i + 1 ] ); + } + } + } + + return TYPE_NULL; + } + + //returns false on failed execution + virtual bool execute( const char* str ) override { + size_t arg_count{ }; + for( size_t i{ }; i < strlen( str ); ++i ) { + if( str[ i ] == ' ' ) { + arg_count++; + } + } + + if( arg_count != m_args ) { + return false; + } + + std::string pass_str( " " ); + + size_t cur_arg = 0; + for( size_t i{ }; i < strlen( str ); ++i ) { + if( str[ i ] == ' ' ) { + size_t end = strlen( str ); + for( size_t i2 = i + 2; i2 < strlen( str ); ++i2 ) { + if( str[ i2 ] == ' ' ) { + end = i2; + } + } + + char* end_ptr = ( char* )( str + i + end ); + switch( get_var_type( cur_arg ) ) { + case TYPE_FLOAT: { + pass_str += std::to_string( strtof( str + i, &end_ptr ) ); + break; + } + case TYPE_INTEGER: { + pass_str += std::to_string( strtol( str + i, &end_ptr, 10 ) ); + break; + } + case TYPE_HEX: { + char buf[ 10 ]; + sprintf_s< 10 >( buf, "%08x", strtol( str + i, &end_ptr, 16 ) ); + pass_str += buf; + break; + } + case TYPE_STRING: { + std::string add_str( str + i, end - i ); + pass_str += add_str; + break; + } + default: + return false; + } + + if( end != strlen( str ) ) { + pass_str += ' '; + } + ++cur_arg; + } + } + + m_function( pass_str.c_str( ), m_syntax ); + return true; + } + +private: + hash_t m_hash{ }; + size_t m_args{ }; + char m_syntax[ 64 ]{ }; + std::function< void( __cdecl )( const char*, const char* ) > m_function{ }; +}; \ No newline at end of file diff --git a/cheat/gmod/console.cpp b/cheat/gmod/console.cpp new file mode 100644 index 0000000..174fc25 --- /dev/null +++ b/cheat/gmod/console.cpp @@ -0,0 +1,324 @@ +#include "console.hpp" +#include "interface.hpp" +#include "settings.hpp" +#include "d3d.hpp" +#include "ui_draw.h" + +std::shared_ptr< console > g_con = std::make_shared< console >( ); + + +void console::draw_text( int x, int y, bool greyed, const char* fmt, ... ) { + va_list args; + char buf[ 512 ]; + + __crt_va_start( args, fmt ); + vsprintf_s< 512 >( buf, fmt, args ); + __crt_va_end( args ); + + g_d3d.draw_text< ALIGN_LEFT >( d3d::fonts.f_con, greyed ? clr_t( 160, 160, 160 ) : clr_t( 255, 255, 255 ), x, y, D3DFONTFLAG_DROPSHADOW, "%s", buf ); + //g_d3d.draw_text< ALIGN_LEFT >( d3d::fonts.f_con, greyed ? clr_t( 160, 160, 160 ) : clr_t( 255, 255, 255 ), x, y, D3DFONTFLAG_DROPSHADOW, buf ); +} + +void console::draw_text( int x, int y, const char* fmt, ... ) { + va_list args; + char buf[ 512 ]; + + __crt_va_start( args, fmt ); + vsprintf_s< 512 >( buf, fmt, args ); + __crt_va_end( args ); + + g_d3d.draw_text< ALIGN_LEFT >( d3d::fonts.f_con, clr_t( 255, 255, 255 ), x, y, D3DFONTFLAG_DROPSHADOW, buf ); +} + +void console::draw_rect( int x, int y, int w, int h, clr_t col ) { + g_d3d.draw_filled_rect( col, x, y, w, h ); +} + +void console::register_alias( std::shared_ptr< ISetting >& alias ) { + m_aliases.push_back( alias ); +} + +void console::capture_command( ) { + float current_time = GetTickCount( ) * 0.001f; + size_t length = strlen( m_cur_cmd ); + + for( size_t i{ }; i < 0xfe; ++i ) { + if( m_input->is_key_pressed( i ) ) { + float delta_time = current_time - m_last_key_input[ i ]; + if( fabs( delta_time ) > 0.2f ) { + if( i == KEYS_BACK ) { + m_cur_cmd[ length - 1 ] = 0; + m_last_key_input[ i ] = current_time; + continue; + } + + m_key_states[ i ] = 0xf0; + wchar_t pressed_char; + const auto scan = MapVirtualKeyA( i, 2 ); + auto ret = ToAscii( i, scan, ( BYTE* )m_key_states, ( LPWORD )&pressed_char, 1 ); + + if( ret == 1 ) { + if( length < 200 ) { + m_cur_cmd[ length ] = ( char )( pressed_char ); + m_cur_cmd[ length + 1 ] = 0; + } + } + m_last_key_input[ i ] = current_time; + } + } + else { + m_last_key_input[ i ] = 0.f; + m_key_states[ i ] = 0; + } + } +} + +ISetting* console::find_var( hash_t var ) { + for( auto& it : data::holder_.get_nodes( ) ) { + auto setting = static_cast< ISetting* >( it ); + if( var == setting->get_hash( ) ) { + return setting; + } + } + + return nullptr; +} + +ISetting* console::find_alias( hash_t alias ) { + for( auto& it : m_aliases ) { + if( it->get_hash( ) == alias ) + return it.get( ); + } + + return nullptr; +} + +con_fn_base* console::find_fn( hash_t name ) { + for( auto& it : m_functions ) { + if( it->get_hash( ) == name ) { + return it; + } + } + + return nullptr; +} + +std::string console::impl_alias_str( std::string str ) { + for( size_t i{ }; i < str.length( ); ++i ) { + if( str[ i ] == ' ' && str[ i + 1 ] != ' ' ) { + size_t end = 0; + for( size_t i2{ i + 1 }; i2 < str.length( ); ++i ) { + if( str[ i2 ] == ' ' ) + end = i2; + } + + if( end ) { + std::string alias_str( str.c_str( ) + i, end - i ); + auto alias = find_alias( hash::fnv1a( alias_str ) ); + if( alias ) { + str.replace( alias_str.begin( ), alias_str.end( ), alias->get_string( ) ); + } + else { + g_con->log( xors( "couldnt find alias %s" ), alias_str.c_str( ) ); + } + } + } + } + + return str; +} + +void console::execute_command( const char* cmd ) { + if( !cmd[ 0 ] ) return; + std::string first_param( cmd, strlen( cmd ) ); + + size_t end{ }; + bool one_arg = true; + for( size_t i{ }; i < strlen( cmd ); ++i ) { + if( cmd[ i ] == ' ' ) { + first_param.resize( i ); + end = i; + one_arg = false; + break; + } + } + + if( one_arg ) { + first_param.resize( first_param.length( ) - 1 ); + } + + //find a command to execute + auto fn = find_fn( hash::fnv1a( first_param ) ); + if( fn ) { + //std::string alias_cmd = impl_alias_str( cmd ); + + if( !fn->execute( cmd ) ) { + log( xors( "invalid syntax" ) ); + } + return; + } + + //command not found, we're managing vars + if( !one_arg ) { + std::string second_param = ( cmd + end + 1 ); + bool is_floating_point = second_param.find( '.' ) != std::string::npos; + auto var = find_var( hash::fnv1a( first_param ) ); + + if( var ) { + auto setting_cast = static_cast< con_var< void* >* >( var ); + if( !setting_cast->is_integral( ) && !setting_cast->is_floating_point( ) ) { + auto value = std::strtol( second_param.c_str( ), 0, 16 ); + printf( xors( "value: %08x\n" ), value ); + var->set( value ); + } + + if( is_floating_point ) { + float value = std::strtof( second_param.c_str( ), 0 ); + var->set( value ); + } + else { + int value = std::strtol( second_param.c_str( ), 0, 10 ); + var->set( value ); + } + log( xors( "%s %s\n" ), first_param.c_str( ), second_param.c_str( ) ); + return; + } + } + + + log( xors( "unknown command: %s" ), first_param.c_str( ) ); +} + +void console::input( ) { + static int drag_x, drag_y; + int cursor_x, cursor_y; + int x = m_x, y = m_y; + bool clicked = m_input->is_key_pressed( KEYS_MOUSE1 ); + static bool is_hovered{ }; + m_input->get_cursor_pos( cursor_x, cursor_y ); + + auto is_top_hovered = [ &x, &y, + &cursor_x, &cursor_y ]( ) { + return cursor_x > x && cursor_x < x + WIDTH + && cursor_y > y && cursor_y < y + TOP_HEIGHT; + }; + + auto is_window_hovered = [ &x, &y, + &cursor_x, &cursor_y ]( ) { + return cursor_x > x && cursor_x < x + WIDTH + && cursor_y > y && cursor_y < y + HEIGHT; + }; + + auto is_bottom_hovered = [ &x, &y, + &cursor_x, &cursor_y ]( ) { + return cursor_x > x && cursor_x < x + WIDTH + && cursor_y > y + HEIGHT - TOP_HEIGHT + && cursor_y < y + HEIGHT; + }; + + if( clicked ) { + //m_consuming_input = is_window_hovered( ); + } + + if( !clicked && is_top_hovered( ) ) { + drag_x = cursor_x - m_x; + drag_y = cursor_y - m_y; + } + + if( clicked && is_hovered ) { + is_hovered = true; + m_x = cursor_x - drag_x; + m_y = cursor_y - drag_y; + } + else { + is_hovered = is_top_hovered( ); + } + + if( clicked ) { + m_active = is_bottom_hovered( ); + } + + if( m_active ) { + capture_command( ); + + static bool was_held{ }; + if( m_input->is_key_pressed( KEYS_RETURN ) ) { + if( !was_held ) { + execute_command( m_cur_cmd ); + m_cur_cmd[ 0 ] = 0; + } + was_held = true; + } + else was_held = false; + } +} + +void console::draw( ) { + if( !m_open ) { + m_consuming_input = false; + m_active = false; + return; + } + + static clr_t col = clr_t( 31, 31, 31, 255 ); + + input( ); + + RECT prev_rect{ }; + RECT new_rect{ m_x - 1, m_y - 1, + m_x + WIDTH + 1, m_y + HEIGHT + 1 }; + g_d3d.get_device( )->GetScissorRect( &prev_rect ); + + g_d3d.get_device( )->SetScissorRect( &new_rect ); + + draw_rect( m_x - 1, m_y - 1, WIDTH + 2, HEIGHT + 2, ui::ui_get_accent_col( ) ); + draw_rect( m_x, m_y, WIDTH, HEIGHT, col ); + draw_rect( m_x + 1, m_y, WIDTH - 2, TOP_HEIGHT, clr_t( 41, 41, 41 ) ); + + draw_rect( m_x + 1, m_y + HEIGHT - TOP_HEIGHT, WIDTH - 2, TOP_HEIGHT, clr_t( 41, 41, 41 ) ); + if( m_active ) { + draw_rect( m_x + 2, m_y + HEIGHT - TOP_HEIGHT + 1, WIDTH - 4, TOP_HEIGHT - 2, clr_t( 31, 31, 31 ) ); + auto fn = find_fn( hash::fnv1a( m_cur_cmd ) ); + if( fn ) { + std::string fn_str = m_cur_cmd; + fn_str += ' '; + fn_str += fn->get_syntax( ); + + draw_text( m_x + 2, m_y + HEIGHT - TOP_HEIGHT / 2 - 3, true, "%s", fn_str.c_str( ) ); + } + + else { + auto var = find_var( hash::fnv1a( m_cur_cmd ) ); + if( var ) { + std::string var_str = m_cur_cmd; + var_str += ' '; + + var_str += var->get_string( ); + + draw_text( m_x + 2, m_y + HEIGHT - TOP_HEIGHT / 2 - 3, true, var_str.c_str( ) ); + } + } + } + + std::string cur_cmd_str = m_cur_cmd; + if( m_active ) { + cur_cmd_str += '_'; + } + draw_text( m_x + 2, m_y + HEIGHT - TOP_HEIGHT / 2 - 3, cur_cmd_str.c_str( ) ); + draw_text( m_x + 3, m_y + TOP_HEIGHT / 2 - 3, xors( "console" ) ); + + int cur_y = m_y + HEIGHT - TOP_HEIGHT; + for( int i = m_logs.size( ) - 1; i >= 0; --i ) { + constexpr int LINE_HEIGHT = 14; + auto& log = m_logs.at( i ); + + if( cur_y - LINE_HEIGHT < m_y + TOP_HEIGHT ) { + m_logs.erase( m_logs.begin( ) + i ); + continue; + } + + draw_text( m_x + 2, cur_y -= LINE_HEIGHT, log.m_msg ); + } + + g_d3d.get_device( )->SetScissorRect( &prev_rect ); +} \ No newline at end of file diff --git a/cheat/gmod/console.hpp b/cheat/gmod/console.hpp new file mode 100644 index 0000000..cfeb255 --- /dev/null +++ b/cheat/gmod/console.hpp @@ -0,0 +1,123 @@ +#pragma once +#include +#include +#include +#include + +#include "con_fn.hpp" +#include "con_alias.hpp" +#include "input_system.hpp" +#include "math.hpp" + +#pragma warning(disable: 4996) + +class console { +public: + console( ) { + m_input = std::make_shared< util::c_input_manager >( ); + } + + static constexpr size_t TOP_HEIGHT = 22; + static constexpr size_t WIDTH = 400; + static constexpr size_t HEIGHT = 450; + + bool m_consuming_input{ }; + bool m_active{ }; + bool m_open{ }; + + struct con_log { + float m_time; + char m_msg[ 128 ]; + }; + + void draw_text( int x, int y, bool greyed, const char* msg, ... ); + void draw_text( int x, int y, const char* msg, ... ); + void draw_rect( int x, int y, int w, int h, clr_t col ); + void register_fn( con_fn_base* fn ) { m_functions.push_back( fn ); } + + void input( ); + void draw( ); + + auto& get_input( ) { + return m_input; + } + + void log( const char* fmt, ... ) { + va_list args; + char buf[ 128 ]; + + __crt_va_start( args, fmt ); + vsprintf_s< 128 >( buf, fmt, args ); + __crt_va_end( args ); + + con_log log; + log.m_time = ( float )GetTickCount( ) * 0.001f; + memcpy( log.m_msg, buf, 128 ); + + print( "%s\n", buf ); + + m_logs.push_back( log ); + } + + void print( const char* fmt, ... ) { + va_list args; + va_start( args, fmt ); + vprintf_s( fmt, args ); + va_end( args ); + } + + void create( ) { + #ifdef _DEBUG + AllocConsole( ); + freopen( xors( "CONOUT$" ), "w", stdout ); + const char* hack_names[ ] = { + xors( "dunk hack" ), + xors( "dweeb dumpster" ), + xors( "nova killER" ), + xors( "moms credit card" ), + xors( "dad hook" ), + xors( "retard remover" ), + xors( "slam hook" ), + xors( "swoosh" ), + xors( "retard remover" ), + xors( "shotgun hack" ), + }; + + SetConsoleTitleA( hack_names[ math::random_number( 0, 9 ) ] ); + #endif + game_console_print = reinterpret_cast< msg_t >( GetProcAddress( GetModuleHandleA( "tier0.dll" ), "Msg" ) ); + } + + void destroy( ) { + //FreeConsole( ); + //fclose( stdout ); + } + + std::vector< con_log > m_logs; + std::vector< con_fn_base* > m_functions; + std::vector< std::shared_ptr< ISetting > > m_aliases; + + void register_alias( std::shared_ptr< ISetting >& alias ); + + using msg_t = void( __cdecl* )( const char*, ... ); + msg_t game_console_print; + +private: + ISetting* find_var( hash_t name ); + ISetting* find_alias( hash_t name ); + + std::string impl_alias_str( std::string str ); + + con_fn_base* find_fn( hash_t name ); + void capture_command( ); + void execute_command( const char* cmd ); + + int m_x{ 100 }, m_y{ 100 }; + + char m_cur_cmd[ 200 ]{ }; + uint8_t m_key_states[ 256 ]{ }; + float m_last_key_input[ 256 ]{ }; + std::shared_ptr< util::c_input_manager > m_input; +}; + +extern std::shared_ptr< console > g_con; \ No newline at end of file diff --git a/cheat/gmod/context.cpp b/cheat/gmod/context.cpp new file mode 100644 index 0000000..752585e --- /dev/null +++ b/cheat/gmod/context.cpp @@ -0,0 +1,104 @@ +#include "context.hpp" +#include "console.hpp" +#include "hooks.hpp" +#include "base_cheat.hpp" + +context::c_context g_ctx; + +NAMESPACE_REGION( context ) + +bool c_context::run_frame( ) { + m_local = g_gmod.m_entlist( )->GetClientEntity< >( + g_gmod.m_engine( )->GetLocalPlayer( ) ); + + return !!m_local; +} +// +void c_context::on_cmove_end( user_cmd_t* cmd ) { + auto send = g_cheat.m_lagmgr.get_state( ); + + if( send ) { + m_thirdperson_angle = m_last_realangle; + m_last_fakeangle = cmd->m_viewangles; + m_last_origin = m_local->m_vecOrigin( ); + } + else { + m_last_realangle = cmd->m_viewangles; + m_last_realangle.x = m_last_fakeangle.x; + } + + m_thirdperson_angle.x = cmd->m_viewangles.x; + if( g_cheat.m_lagmgr.get_sent( ) > 1 ) { + m_thirdperson_angle.y = m_last_fakeangle.y; + } + *get_last_cmd( ) = *cmd; +} +// +//void c_context::reset_shot_queue( ) { +// m_last_shot = m_last_shot_ack = 0; +// m_shot_data = { }; +//} +// +////predicted servertime of player, use this for breaking lby etc +//float c_context::pred_time( ) { +// calculate_tickbase( ); +// +// return m_tickbase * g_gmod.m_globals->m_interval_per_tick; +//} +// +////calculate tickbase depending on whether last ucmd was predicted +//bool c_context::calculate_tickbase( ) { +// if ( !m_local ) { +// return false; +// } +// +// //get current tickbase +// auto player_tickbase = m_local->m_nTickBase( ); +// +// //disabled due to our engine pred being shit +// m_tickbase = player_tickbase; +// return true; +// +// if ( m_snapshot.empty( ) ) { +// m_tickbase = player_tickbase; +// return false; +// } +// +// //if cmd wasnt predicted increment tickbase +// auto snap_cmd = &m_snapshot.front( ); +// if ( !snap_cmd->m_predicted ) { +// if ( !m_tickbase ) { +// m_tickbase = player_tickbase; +// } +// +// m_tickbase++; +// snap_cmd->m_predicted = true; +// } +// else { +// m_tickbase = player_tickbase; +// } +// +// return true; +//} +// +//save snapshots of usercommands +bool c_context::create_snapshot( user_cmd_t* ucmd ) { + user_cmd_t ucmd_copy; + + while ( m_snapshot.size( ) >= 64 ) { + m_snapshot.pop_back( ); + } + + if ( !ucmd ) { + return false; + } + + memcpy( &ucmd_copy, + ucmd, + sizeof( ucmd_copy ) ); + + m_snapshot.push_front( ucmd_copy ); + return true; +} + +END_REGION \ No newline at end of file diff --git a/cheat/gmod/context.hpp b/cheat/gmod/context.hpp new file mode 100644 index 0000000..a478776 --- /dev/null +++ b/cheat/gmod/context.hpp @@ -0,0 +1,71 @@ +#pragma once +#include + +#include "util.hpp" +#include "sdk.hpp" + +NAMESPACE_REGION( context ) + +struct shot_data_t { + vec3_t m_local_pos; + vec3_t m_angle; + vec3_t m_enemy_pos; + int m_enemy_index; + int m_resolver_shots; + bool m_resolver_state; + bool m_missed{ true }; + float m_hitbox_radius; + int m_hitgroup; +}; + +//replacement to the old global:: namespace +class c_context { +public: + //run localplayer check, pointer, is valid etc + bool run_frame( ); + float pred_time( ); + + void on_cmove_end( user_cmd_t* cmd ); + bool create_snapshot( user_cmd_t* ); + //calculate accurate tickbase + bool calculate_tickbase( ); + + user_cmd_t* get_last_cmd( ) { + return m_snapshot.empty( ) ? nullptr : &m_snapshot.front( ); + } + +public: + c_base_player* m_local{ }; + int m_stage{ }; + //accurate tickbase + int m_tickbase{ }; + + bool m_drawing_postscreenspace{ }; + bool m_has_incremented_shots{ }; + bool m_drawing_screneend{ }; + + bool m_has_fired_this_frame{ }; + + vec3_t m_last_realangle{ }; + vec3_t m_last_fakeangle{ }; + vec3_t m_thirdperson_angle{ }; + vec3_t m_last_origin{ }; + + float m_fov{ 90.f }; + + CLuaInterface* m_lua{ }; + +public: + void reset_shot_queue( ); + + int m_last_shot_ack; + int m_last_shot; + + std::array< shot_data_t, 128 > m_shot_data; +private: + std::deque< user_cmd_t > m_snapshot; +}; + +END_REGION + +extern context::c_context g_ctx; \ No newline at end of file diff --git a/cheat/gmod/create_move.cpp b/cheat/gmod/create_move.cpp new file mode 100644 index 0000000..c25d0c5 --- /dev/null +++ b/cheat/gmod/create_move.cpp @@ -0,0 +1,87 @@ +#include + +#include "hooks.hpp" +#include "mem.hpp" +#include "interface.hpp" +#include "context.hpp" +#include "input_system.hpp" +#include "math.hpp" + +#include "base_cheat.hpp" + + +bool __fastcall hooks::create_move( void* ecx_, void* edx_, float input_sample_frametime, user_cmd_t* ucmd ) { + static auto create_move_o = g_gmod.m_clientmode->get_old_function< decltype( &hooks::create_move ) >( 21 ); + + // call from CInput::ExtraMouseSample with dummy cmd. + if( !ucmd->m_cmd_nr || !ucmd->m_tick_count || g_gmod.m_panic ) + return create_move_o( ecx_, 0, input_sample_frametime, ucmd ); + + // for interfacing with lua related stuff. + g_ctx.m_lua = g_gmod.m_lua_shared( )->GetLuaInterface( LUA_CLIENT ); + if( !g_ctx.m_lua ) + return create_move_o( ecx_, 0, input_sample_frametime, ucmd ); + + // random_seed isn't generated in ClientMode::CreateMove yet (since CInput::CreateMove handles that), we must generate it ourselves. + ucmd->m_random_seed = math::md5_pseudorandom( ucmd->m_cmd_nr ) & 0x7fffffff; + + //get sendpacket off the stack + stack_t stack( get_baseptr( ) ); + byte *send_packet = stack.next( ).next( ).next( ).local< byte* >( 0x1 ); + + g_ctx.create_snapshot( ucmd ); + + //return create_move_o( ecx_, 0, input_sample_frametime, ucmd ); + + /* + g_cheat.m_extra.update_netchannel( ); + g_cheat.m_identity( ); + */ + + if( g_ctx.run_frame( ) && g_ctx.m_local->is_alive( ) ) { + static int last_frame = g_gmod.m_globals->m_framecount; + if( last_frame != g_gmod.m_globals->m_framecount ) + g_ctx.m_has_fired_this_frame = false; + + last_frame = g_gmod.m_globals->m_framecount; + + // hook fire bullets for spread compensation. + if( !fire_bullets_o ) { + fire_bullets_o = decltype( &hooks::fire_bullets )( c_vmt::hook_method( g_ctx.m_local, 16, hooks::fire_bullets ) ); + } + + g_cheat.m_prediction( ucmd ); + g_cheat.m_movement( ucmd ); + + g_cheat.m_lagmgr( ucmd, send_packet ); + + g_cheat.m_aimbot( ucmd ); + + //if( auto weapon = g_ctx.m_local->get_weapon( ) ) { + // if( auto c_class = weapon->ce( )->GetClientClass( ) ) { + // g_con->print( "%s\n", c_class->m_name ); + // } + //} + + g_cheat.m_extra.use_spammer( ucmd ); + + if( g_cheat.m_lagmgr.get_choked( ) > 15 ) { + g_cheat.m_lagmgr.set_state( true ); + } + + g_cheat.m_lagmgr.on_cmove_end( ); + + g_ctx.on_cmove_end( ucmd ); + + ucmd->clamp( ); + // call original *after* any changes due to anticheats detecting changes between this and any changes after. + create_move_o( ecx_, 0, input_sample_frametime, ucmd ); + + g_cheat.m_aimbot.silent( ); + } + else { + create_move_o( ecx_, 0, input_sample_frametime, ucmd ); + } + + return false; +} diff --git a/cheat/gmod/d3d.cpp b/cheat/gmod/d3d.cpp new file mode 100644 index 0000000..6802239 --- /dev/null +++ b/cheat/gmod/d3d.cpp @@ -0,0 +1,344 @@ +#include "d3d.hpp" +#include "interface.hpp" +#include "math.hpp" +#include "d3d_sprite.hpp" + +d3d::c_renderer g_d3d; +d3d::d3d_fonts_t d3d::fonts; + + +//theres shit still left to add like drawrect etc but thats really simple +//this is the base and it works so thats ok +//love +// - nave + +// note - dex; probably better idea to batch all calls up into one DrawPrimitive / DrawIndexedPrimitive call each (if you want to have index buffers too) +// DrawPrimitiveUP for each object will slow stuff down eventually +// dont know much about DrawIndexedPrimitive myself but msdn suggests to use strips over anything else + +namespace d3d +{ + void d3d_fonts_t::release( ) { + if( f_12 ) f_12->Release( ); + if( f_14 ) f_14->Release( ); + if( f_16 ) f_16->Release( ); + if( f_18 ) f_18->Release( ); + if( f_menu ) f_menu->Release( ); + if( f_con ) f_con->Release( ); + } + + void d3d_fonts_t::create( IDirect3DDevice9* device ) { + auto create_font = [ & ]( ID3DXFont** font, const char* font_name, int width, int size, int weight ) { + //auto wide_str = util::ascii_to_unicode( std::string( font_name ) ); + + auto code = D3DXCreateFontA( device, size, width, weight, 0, false, DEFAULT_CHARSET, + OUT_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH, font_name, font ); + + if( code < 0 ) throw xors( "fuck d3d" ); + }; + + create_font( &f_12, xors( "Verdana" ), 0, 12, 0 ); //change this idc + create_font( &f_esp_small, xors( "Tahoma" ), 0, 11, 500 ); + create_font( &f_14, xors( "Verdana" ), 0, 14, 0 ); + create_font( &f_16, xors( "Verdana" ), 0, 16, 0 ); + create_font( &f_18, xors( "Verdana" ), 0, 18, 0 ); + create_font( &f_menu, xors( "Tahoma" ), 0, 12, 300 ); + create_font( &f_con, xors( "Consolas" ), 6, 12, 300 ); + } + + + c_renderer::c_renderer( IDirect3DDevice9* device ) : m_device( device ) { + create_objects( ); + } + + bool c_renderer::run_frame( IDirect3DDevice9* device ) { + if( g_gmod.m_panic ) { + return false; + } + + if( !m_device ) { + m_device = device; + create_objects( ); + return false; + } + + return true; + } + + c_renderer::~c_renderer( ) { + invalidate_objects( ); + } + + void c_renderer::on_device_lost( ) { + invalidate_objects( ); + } + + void c_renderer::on_device_reset( ) { + create_objects( ); + } + + void c_renderer::invalidate_objects( ) { + if( m_block ) m_block->Release( ); + fonts.release( ); + } + + void c_renderer::create_objects( ) { + D3DVIEWPORT9 viewport; + + if( !m_device ) return; + + if( m_device->GetViewport( &viewport ) < 0 ) { + return; + } + + if( m_device->CreateStateBlock( D3DSBT_ALL, &m_block ) < 0 ) { + return; + } + + if( !m_block ) { + return; + } + + // get display size. + m_width = viewport.Width; + m_height = viewport.Height; + + fonts.create( m_device ); + } + + void c_renderer::begin( ) { + if( !m_device ) return; + + D3DVIEWPORT9 vp{ 0, 0, m_width, m_height, 0.f, 1.f }; + + m_device->SetViewport( &vp ); + + //m_sil_txt->GetSurfaceLevel( 0, &m_surface ); + + // set vertex stream declaration. + m_device->SetVertexShader( nullptr ); + m_device->SetPixelShader( nullptr ); + m_device->SetFVF( D3DFVF_XYZRHW | D3DFVF_DIFFUSE ); + m_block->Capture( ); + + m_device->SetRenderState( D3DRS_LIGHTING, false ); + m_device->SetRenderState( D3DRS_FOGENABLE, false ); + m_device->SetRenderState( D3DRS_CULLMODE, D3DCULL_NONE ); + m_device->SetRenderState( D3DRS_FILLMODE, D3DFILL_SOLID ); + + m_device->SetRenderState( D3DRS_ZENABLE, D3DZB_FALSE ); + m_device->SetRenderState( D3DRS_SCISSORTESTENABLE, true ); + m_device->SetRenderState( D3DRS_ZWRITEENABLE, false ); + m_device->SetRenderState( D3DRS_STENCILENABLE, false ); + + m_device->SetRenderState( D3DRS_MULTISAMPLEANTIALIAS, false ); + m_device->SetRenderState( D3DRS_ANTIALIASEDLINEENABLE, true ); + + m_device->SetRenderState( D3DRS_ALPHABLENDENABLE, true ); + m_device->SetRenderState( D3DRS_ALPHATESTENABLE, false ); + m_device->SetRenderState( D3DRS_SEPARATEALPHABLENDENABLE, true ); + + m_device->SetTexture( 0, nullptr ); + m_device->SetTexture( 1, nullptr ); + m_device->SetTexture( 2, nullptr ); + m_device->SetTexture( 3, nullptr ); + + m_device->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_MODULATE ); + m_device->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE ); + m_device->SetTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_DIFFUSE ); + m_device->SetTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_MODULATE ); + m_device->SetTextureStageState( 0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE ); + m_device->SetTextureStageState( 0, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE ); + m_device->SetTextureStageState( 0, D3DTSS_TEXCOORDINDEX, 0 ); + m_device->SetTextureStageState( 0, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_DISABLE ); + m_device->SetTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_DISABLE ); + m_device->SetTextureStageState( 1, D3DTSS_ALPHAOP, D3DTOP_DISABLE ); + + m_device->SetRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCALPHA ); + m_device->SetRenderState( D3DRS_SRCBLENDALPHA, D3DBLEND_INVDESTALPHA ); + m_device->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA ); + m_device->SetRenderState( D3DRS_DESTBLENDALPHA, D3DBLEND_ONE ); + m_device->SetRenderState( D3DRS_BLENDOP, D3DBLENDOP_ADD ); + + m_device->SetRenderState( D3DRS_SRGBWRITEENABLE, false ); + m_device->SetRenderState( D3DRS_COLORWRITEENABLE, 0xffffffff ); + /* commented out until further notice */ + //m_device->SetSamplerState( 0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR ); + //m_device->SetSamplerState( 0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR ); + // todo - dex; if we use textures, need to set those rendering states too + } + + void c_renderer::end( ) { + + //m_device->SetTexture( 0, nullptr ); + //m_device->SetTexture( 1, nullptr ); + //m_device->SetTexture( 2, nullptr ); + //m_device->SetTexture( 3, nullptr ); + m_block->Apply( ); + //m_block->Release( ); + } + + void c_renderer::draw_line( clr_t color, int x0, int y0, int x1, int y1 ) { + d3d_vertex_t v[ 2 ] = { + d3d_vertex_t( float( x0 ), float( y0 ), 1.0f, color ), //because fuck you thats why + d3d_vertex_t( float( x1 ), float( y1 ), 1.0f, color ) + }; //edit: do we wanna use z for shit? i mean we could for like menu stuff + //so it renders above other stuff + + m_device->DrawPrimitiveUP( D3DPT_LINELIST, 1, v, VERTEX_SIZE ); + } + + void c_renderer::draw_rect( clr_t color, int x, int y, int w, int h ) { + d3d_vertex_t v[ 5 ] = { + d3d_vertex_t( float( x ), float( y ), 1.0f, color ), + d3d_vertex_t( float( x + w ), float( y ), 1.0f, color ), + d3d_vertex_t( float( x + w ), float( y + h ), 1.0f, color ), + d3d_vertex_t( float( x ), float( y + h ), 1.0f, color ), + d3d_vertex_t( float( x ), float( y ), 1.0f, color ) + }; + + m_device->DrawPrimitiveUP( D3DPT_LINESTRIP, 4, v, VERTEX_SIZE ); + } + + void c_renderer::draw_filled_rect( clr_t color, int x, int y, int w, int h ) { + d3d_vertex_t v[ 6 ] = { + d3d_vertex_t( float( x + w ), float( y ), 1.0f, color ), + d3d_vertex_t( float( x ), float( y + h ), 1.0f, color ), + d3d_vertex_t( float( x + w ), float( y + h ), 1.0f, color ), + d3d_vertex_t( float( x ), float( y ), 1.0f, color ), + d3d_vertex_t( float( x ), float( y + h ), 1.0f, color ), + d3d_vertex_t( float( x + w ), float( y ), 1.0f, color ) + }; + + + m_device->DrawPrimitiveUP( D3DPT_TRIANGLELIST, 2, v, VERTEX_SIZE ); + } + + void c_renderer::draw_gradient( clr_t start, clr_t end, int x, int y, int w, int h, GradientType_t type ) { + d3d_vertex_t v[ 4 ]; + + switch( type ) { + case GRADIENT_VERTICAL: + v[ 0 ] = { float( x ), float( y ), 1.0f, start }; + v[ 1 ] = { float( x + w ), float( y ), 1.0f, start }; + v[ 2 ] = { float( x ), float( y + h ), 1.0f, end }; + v[ 3 ] = { float( x + w ), float( y + h ), 1.0f, end }; + break; + case GRADIENT_HORIZONTAL: + v[ 0 ] = { float( x ), float( y ), 1.0f, start }; + v[ 1 ] = { float( x + w ), float( y ), 1.0f, end }; + v[ 2 ] = { float( x ), float( y + h ), 1.0f, start }; + v[ 3 ] = { float( x + w ), float( y + h ), 1.0f, end }; + break; + } + + //m_device->SetRenderState( D3DRS_MULTISAMPLEANTIALIAS, true ); + m_device->DrawPrimitiveUP( D3DPT_TRIANGLESTRIP, 2, &v, VERTEX_SIZE ); + //m_device->SetRenderState( D3DRS_MULTISAMPLEANTIALIAS, false ); + } + + void c_renderer::draw_circle( clr_t color, int x, int y, int r, int res ) { + constexpr float PI = 3.1415926f; + const float step = PI * 2.0f / float( res ); + + int point_x = x + r, + point_y = y - r, + point_x_o{ }, + point_y_o{ }; + + m_device->SetRenderState( D3DRS_MULTISAMPLEANTIALIAS, true ); + for( int i{ }; i <= res; i++ ) { + float theta = float( i ) * step; + + point_x = x + ( int )( r * cos( theta ) ); + point_y = y - ( int )( r * sin( theta ) ); + if( i ) draw_line( color, point_x, point_y, point_x_o, point_y_o ); + point_x_o = point_x; + point_y_o = point_y; + } + m_device->SetRenderState( D3DRS_MULTISAMPLEANTIALIAS, false ); + } + + void c_renderer::draw_filled_circle( clr_t color, int x, int y, int r, int res ) { + d3d_vertex_t* v = ( d3d_vertex_t* )_alloca( VERTEX_SIZE * res ); + const float step = M_PI * 2.0f / res; + + for( size_t i{ }; i < res; ++i ) { + float theta = i * step; + float x_off = r * cos( theta ); + float y_off = r * sin( theta ); + + v[ i ] = { float( x + x_off ), float( y + y_off ), 1.0f, color }; + } + + m_device->SetRenderState( D3DRS_MULTISAMPLEANTIALIAS, true ); + m_device->DrawPrimitiveUP( D3DPT_TRIANGLESTRIP, res, v, VERTEX_SIZE ); + m_device->SetRenderState( D3DRS_MULTISAMPLEANTIALIAS, false ); + } + + void c_renderer::draw_text( ID3DXFont* font, clr_t color, + int x, int y, FontAlign_t align, long font_flags, const char* msg ) { + if( !msg ) return; + if( !font ) return; + + auto d3d_black = D3DCOLOR_RGBA( 0, 0, 0, color.a( ) ); + auto d3d_color = D3DCOLOR_RGBA( color.r( ), color.g( ), color.b( ), color.a( ) ); + auto buf = msg; + + if( align == ALIGN_CENTER ) x -= get_text_width( font, font_flags, msg ) / 2; + if( align == ALIGN_RIGHT ) x -= get_text_width( font, font_flags, msg ); + RECT rect{ x, y, 1000, 100 }; + + ulong_t flags = DT_NOCLIP | DT_LEFT | DT_TOP; + + if( font_flags & D3DFONTFLAG_DROPSHADOW ) { + RECT r{ rect }; + r.left++; + r.top++; + font->DrawTextA( 0, buf, -1, &r, flags, d3d_black ); + } + + if( font_flags & D3DFONTFLAG_OUTLINE ) { + for( int i = -1; i < 2; i++ ) { + RECT r{ rect }; + r.left += i; + r.top += i; + font->DrawTextA( 0, buf, -1, &r, flags, d3d_black ); + } + } + + font->DrawTextA( 0, buf, -1, &rect, flags, d3d_color ); + } + + int c_renderer::get_text_width( ID3DXFont* font, long flags, const char* msg, ... ) { + char* buffer = ( char* )_alloca( 2048 ); + va_list list{ }; + + memset( buffer, 0, 2048 ); + + __crt_va_start( list, msg ); + vsprintf_s( buffer, 2048, msg, list ); + __crt_va_end( list ); + + RECT temp{ }; + font->DrawTextA( 0, buffer, -1, &temp, DT_CALCRECT, 0x0 ); + + return ( temp.right - temp.left ); + } + + int c_renderer::get_text_height( ID3DXFont* font, long flags, const char* msg, ... ) { + char* buffer = ( char* )_alloca( 2048 ); + va_list list{ }; + + memset( buffer, 0, 2048 ); + + __crt_va_start( list, msg ); + vsprintf_s( buffer, 2048, msg, list ); + __crt_va_end( list ); + + RECT temp{ }; + font->DrawTextA( 0, buffer, -1, &temp, DT_CALCRECT, 0x0 ); + + return ( temp.bottom - temp.top ); + } +} diff --git a/cheat/gmod/d3d.hpp b/cheat/gmod/d3d.hpp new file mode 100644 index 0000000..c4088a3 --- /dev/null +++ b/cheat/gmod/d3d.hpp @@ -0,0 +1,122 @@ +#ifndef D3D_HEADER //stackoverflow my niggas +#define D3D_HEADER + +#include +#include + +#pragma comment(lib, "d3d9.lib") +#pragma comment(lib, "d3dx9.lib") +#pragma warning(disable : 4838) + +#include +#include + +#include +#pragma comment(lib, "dwmapi.lib") + +#include "util.hpp" +#include "color.hpp" +#include "renderer.hpp" + +enum D3DFontFlags_t { + D3DFONTFLAG_OUTLINE = 0x10, + D3DFONTFLAG_DROPSHADOW = 0x100, +}; + +enum GradientType_t { + GRADIENT_HORIZONTAL, + GRADIENT_VERTICAL +}; + +//suck my dick +namespace d3d +{ + struct d3d_vertex_t { + d3d_vertex_t( float x, float y, float z, clr_t color ) : + m_x( x ), m_y( y ), m_z( z ), + m_clr( D3DCOLOR_RGBA( color.r( ), color.g( ), color.b( ), color.a( ) ) ) { }; + + d3d_vertex_t( ) : m_x( 0.f ), m_y( 0.f ), m_z( 0.f ), + m_clr( 0 ) { }; + + float m_x; + float m_y; + float m_z; + float m_rhw = 1.f; + D3DCOLOR m_clr; + }; + + constexpr size_t VERTEX_SIZE = sizeof( d3d_vertex_t ); + + struct d3d_fonts_t { + void release( ); + void create( IDirect3DDevice9* device ); + + ID3DXFont* f_12; + ID3DXFont* f_esp_small; + ID3DXFont* f_14; + ID3DXFont* f_16; + ID3DXFont* f_18; + ID3DXFont* f_menu; + ID3DXFont* f_con; + }; + + class c_renderer { + private: + IDirect3DDevice9* m_device; + IDirect3DStateBlock9* m_block; + public: + ulong_t m_width; + ulong_t m_height; + + c_renderer( ) { }; + c_renderer( IDirect3DDevice9* device ); + ~c_renderer( ); + + void on_device_lost( ); + void on_device_reset( ); + auto get_device( ) { + return m_device; + } + + bool run_frame( IDirect3DDevice9* device ); + void begin( ); + void end( ); + + void draw_line( clr_t color, int x0, int y0, int x1, int y1 ); + void draw_rect( clr_t color, int x, int y, int w, int h ); + void draw_filled_rect( clr_t color, int x, int y, int w, int h ); + void draw_circle( clr_t color, int x, int y, int r, int steps = 48 ); + void draw_filled_circle( clr_t color, int x, int y, int r, int steps = 48 ); + void draw_gradient( clr_t start, clr_t end, int x, int y, int w, int h, GradientType_t type ); + + void draw_text( ID3DXFont* font, clr_t color, int x, int y, FontAlign_t align, long font_flags, const char* msg ); + + template < FontAlign_t align = ALIGN_CENTER > + void draw_text( ID3DXFont* font, clr_t color, int x, int y, long font_flags, const char* msg, ... ) { + char* buffer = ( char* )_alloca( 2048 ); + va_list list{ }; + + memset( buffer, 0, 2048 ); + + __crt_va_start( list, msg ); + vsprintf_s( buffer, 2048, msg, list ); + __crt_va_end( list ); + + draw_text( font, color, x, y, align, font_flags, buffer ); + } + + int get_text_width( ID3DXFont* font, long font_flags, const char* msg, ... ); + int get_text_height( ID3DXFont* font, long font_flags, const char* msg, ... ); + + private: + void invalidate_objects( ); + void create_objects( ); + }; + + extern d3d::d3d_fonts_t fonts; +} + +extern d3d::c_renderer g_d3d; + +#endif \ No newline at end of file diff --git a/cheat/gmod/d3d_sprite.cpp b/cheat/gmod/d3d_sprite.cpp new file mode 100644 index 0000000..8dd6705 --- /dev/null +++ b/cheat/gmod/d3d_sprite.cpp @@ -0,0 +1,13 @@ +#include "d3d_sprite.hpp" + +std::vector< d3d::c_sprite* > d3d::sprites; + +namespace icons +{ + d3d::c_sprite sprite_legit; + d3d::c_sprite sprite_visuals_; + d3d::c_sprite sprite_rage; + d3d::c_sprite sprite_visuals; + d3d::c_sprite sprite_misc; + d3d::c_sprite sprite_config; +} \ No newline at end of file diff --git a/cheat/gmod/d3d_sprite.hpp b/cheat/gmod/d3d_sprite.hpp new file mode 100644 index 0000000..42c09c1 --- /dev/null +++ b/cheat/gmod/d3d_sprite.hpp @@ -0,0 +1,169 @@ +#pragma once +#include "d3d.hpp" +#include "console.hpp" + + +namespace d3d +{ + class c_sprite; + + extern std::vector< c_sprite* > sprites; + + class c_sprite { + public: + size_t m_width{ }; + size_t m_height{ }; + + IDirect3DDevice9* m_device{ }; + ID3DXSprite* m_sprite{ }; + IDirect3DTexture9* m_texture{ }; + const byte* m_image{ }; + size_t m_image_size{ }; + + + public: + c_sprite( ) { + sprites.push_back( this ); + } + + ~c_sprite( ) { + on_reset( ); + } + + void init( IDirect3DDevice9* device, const byte* file, size_t img_size, size_t width, size_t height ) { + m_width = width; + m_height = height; + + m_device = device; + m_image = file; + m_image_size = img_size; + } + + void begin( IDirect3DDevice9* device ) { + m_device = device; + + if( !m_device ) { + return; + } + + if( !m_sprite ) + D3DXCreateSprite( m_device, &m_sprite ); + + if( m_sprite ) + m_sprite->Begin( D3DXSPRITE_DONOTMODIFY_RENDERSTATE ); + + if( !m_texture ) { + auto hr = D3DXCreateTextureFromFileInMemoryEx( m_device, + m_image, + m_image_size, + m_width, + m_height, + -1, + 0, + D3DFORMAT( 0 ), + D3DPOOL_DEFAULT, + -1, + -1, + 0, + 0, + 0, + &m_texture ); + } + } + + void end( ) { + if( !m_device || !m_sprite || !m_texture ) return; + if( m_sprite ) m_sprite->End( ); + } + + void on_reset( ) { + if( m_sprite && m_device && m_texture ) { + m_sprite->OnLostDevice( ); + m_texture->Release( ); + m_texture = nullptr; + } + } + + void on_reset_end( ) { + if( m_sprite && m_device ) + m_sprite->OnResetDevice( ); + } + + void draw( int x, int y, clr_t color ) { + if( !m_device || !m_texture || !m_sprite ) { + return; + } + + const float scale = 0.8f; + + ulong_t + fill_mode, + adaptive_tess, + dest_blend, + cull, + stencil, + vertex_blend, + alpha_test; + + m_device->GetRenderState( D3DRENDERSTATETYPE::D3DRS_FILLMODE, &fill_mode ); + m_device->GetRenderState( D3DRENDERSTATETYPE::D3DRS_ENABLEADAPTIVETESSELLATION, &adaptive_tess ); + m_device->GetRenderState( D3DRENDERSTATETYPE::D3DRS_DESTBLEND, &dest_blend ); + m_device->GetRenderState( D3DRENDERSTATETYPE::D3DRS_CULLMODE, &cull ); + m_device->GetRenderState( D3DRENDERSTATETYPE::D3DRS_STENCILENABLE, &stencil ); + m_device->GetRenderState( D3DRENDERSTATETYPE::D3DRS_VERTEXBLEND, &vertex_blend ); + m_device->GetRenderState( D3DRENDERSTATETYPE::D3DRS_ALPHATESTENABLE, &alpha_test ); + + ulong_t mag_filter; + ulong_t min_filter; + m_device->GetSamplerState( 0, D3DSAMPLERSTATETYPE::D3DSAMP_MAGFILTER, &mag_filter ); + m_device->GetSamplerState( 0, D3DSAMPLERSTATETYPE::D3DSAMP_MINFILTER, &min_filter ); + + m_device->SetSamplerState( 0, D3DSAMP_MINFILTER, D3DTEXF_ANISOTROPIC ); + m_device->SetSamplerState( 0, D3DSAMP_MAGFILTER, D3DTEXF_ANISOTROPIC ); + + m_device->SetRenderState( D3DRENDERSTATETYPE::D3DRS_FILLMODE, D3DFILL_SOLID ); + m_device->SetRenderState( D3DRENDERSTATETYPE::D3DRS_ENABLEADAPTIVETESSELLATION, false ); + m_device->SetRenderState( D3DRENDERSTATETYPE::D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA ); + m_device->SetRenderState( D3DRENDERSTATETYPE::D3DRS_CULLMODE, D3DCULL_NONE ); + m_device->SetRenderState( D3DRENDERSTATETYPE::D3DRS_STENCILENABLE, false ); + m_device->SetRenderState( D3DRENDERSTATETYPE::D3DRS_VERTEXBLEND, false ); + m_device->SetRenderState( D3DRENDERSTATETYPE::D3DRS_ALPHATESTENABLE, D3DLINECAPS_ALPHACMP ); + m_device->SetRenderState( D3DRENDERSTATETYPE::D3DRS_MULTISAMPLEANTIALIAS, D3DMULTISAMPLE_4_SAMPLES ); + + + ulong_t hr; + D3DXVECTOR2 center = D3DXVECTOR2( ( m_width * scale ) * 0.5f, ( m_height * scale ) * 0.5f ); + D3DXVECTOR2 trans = D3DXVECTOR2( x - center.x, y - center.y ); + D3DXMATRIX matrix; + D3DXVECTOR2 scale_vec( scale, scale ); + D3DXMatrixTransformation2D( &matrix, 0, 0.f, &scale_vec, ¢er, 0.f, &trans ); + + hr = m_sprite->SetTransform( &matrix ); + + auto d3dcolor = D3DCOLOR_RGBA( color.r( ), + color.g( ), color.b( ), color.a( ) ); + hr = m_sprite->Draw( m_texture, 0, 0, 0, d3dcolor ); + + m_device->SetRenderState( D3DRENDERSTATETYPE::D3DRS_MULTISAMPLEANTIALIAS, false ); + m_device->SetRenderState( D3DRENDERSTATETYPE::D3DRS_FILLMODE, fill_mode ); + m_device->SetRenderState( D3DRENDERSTATETYPE::D3DRS_ENABLEADAPTIVETESSELLATION, adaptive_tess ); + m_device->SetRenderState( D3DRENDERSTATETYPE::D3DRS_DESTBLEND, dest_blend ); + m_device->SetRenderState( D3DRENDERSTATETYPE::D3DRS_CULLMODE, cull ); + m_device->SetRenderState( D3DRENDERSTATETYPE::D3DRS_STENCILENABLE, stencil ); + m_device->SetRenderState( D3DRENDERSTATETYPE::D3DRS_VERTEXBLEND, vertex_blend ); + m_device->SetRenderState( D3DRENDERSTATETYPE::D3DRS_ALPHATESTENABLE, alpha_test ); + + m_device->SetSamplerState( 0, D3DSAMPLERSTATETYPE::D3DSAMP_MAGFILTER, mag_filter ); + } + }; +} + +namespace icons +{ + extern d3d::c_sprite sprite_legit; + extern d3d::c_sprite sprite_visuals_; + extern d3d::c_sprite sprite_rage; + extern d3d::c_sprite sprite_visuals; + extern d3d::c_sprite sprite_misc; + extern d3d::c_sprite sprite_config; +} \ No newline at end of file diff --git a/cheat/gmod/debug_show_spread.cpp b/cheat/gmod/debug_show_spread.cpp new file mode 100644 index 0000000..68931b2 --- /dev/null +++ b/cheat/gmod/debug_show_spread.cpp @@ -0,0 +1,16 @@ +#include "hooks.hpp" +#include "context.hpp" + +int __fastcall hooks::debug_show_spread_get_int( void* ecx_, void* edx_ ) { + static auto original_fn = g_csgo.m_debug_show_spread->get_old_function< decltype( &debug_show_spread_get_int ) >( 13 ); + if( !g_settings.visuals.snipers_crosshair || !g_ctx.run_frame( ) || !g_ctx.m_local->is_valid( ) || g_ctx.m_local->m_bIsScoped( ) ) { + return original_fn( ecx_, 0 ); + } + + auto weapon = g_ctx.m_local->get_weapon( ); + if( !weapon || !weapon->is_sniper( ) ) { + return original_fn( ecx_, 0 ); + } + + return 3; +} \ No newline at end of file diff --git a/cheat/gmod/directx.cpp b/cheat/gmod/directx.cpp new file mode 100644 index 0000000..dd42588 --- /dev/null +++ b/cheat/gmod/directx.cpp @@ -0,0 +1,195 @@ +#include + +#include "settings.hpp" +#include "hooks.hpp" +#include "ui.h" +#include "base_cheat.hpp" +#include "context.hpp" +#include "mem.hpp" + + +using namespace d3d; + +void on_d3d( IDirect3DDevice9* device ) { + constexpr float step = 1.0f / 2.f; + constexpr float fade_step = 1.0f / 7.f; + static float anim_time{ }; + static bool flip{ }; + static int anim_progress{ }; + + static bool sprites_init{ }; + if( !sprites_init ) { + ui::setup_sprites( device ); + sprites_init = true; + } + + if( g_settings.menu.open ) { + if( anim_time >= 0.95f ) { + flip = true; + } + if( anim_time <= 0.05f ) { + flip = false; + } + + if( flip ) + anim_time -= fade_step * ui::ui_get_frametime( ); + else + anim_time += fade_step * ui::ui_get_frametime( ); + + anim_time = std::clamp( anim_time, 0.f, 1.0f ); + + ui::set_animtime( anim_time ); + + anim_progress += ui::ui_get_frametime( ) * step * 255; + anim_progress = std::clamp( anim_progress, 0, 50 ); + g_d3d.draw_filled_rect( clr_t( 0, 0, 0, anim_progress ), + 0, 0, g_d3d.m_width, g_d3d.m_height ); + + ui::render( ); + } + else { + anim_progress = 0; + } +} + +long __stdcall hooks::d3d::end_scene( IDirect3DDevice9* device ) { + static auto end_scene_o = g_gmod.m_d3d->get_old_function< decltype( &hooks::d3d::end_scene ) >( 42 ); + if ( g_gmod.m_panic ) return end_scene_o( device ); + auto ret = end_scene_o( device ); + + static uintptr_t return_address = 0; + static uintptr_t gameoverlay_return_address = 0; + + + if( !gameoverlay_return_address ) { + MEMORY_BASIC_INFORMATION info; + VirtualQuery( _ReturnAddress( ), &info, sizeof( MEMORY_BASIC_INFORMATION ) ); + + char mod[ MAX_PATH ]; + GetModuleFileNameA( ( HMODULE )info.AllocationBase, mod, MAX_PATH ); + + if( strstr( mod, xors( "gameoverlay" ) ) ) + gameoverlay_return_address = ( uintptr_t )( _ReturnAddress( ) ); + } + + if( !return_address ) { + return_address = ( uintptr_t )( _ReturnAddress( ) ); + } + + // only using gameoverlay stuff as you can't be screenshotted. any other method requires more effort and frankly i cannot be bothered. + if( gameoverlay_return_address && gameoverlay_return_address != ( uintptr_t )( _ReturnAddress( ) ) ) + return ret; + + if( !g_gmod.m_panic && g_d3d.run_frame( device ) ) { + for( auto& it : ::d3d::sprites ) + it->begin( device ); + g_d3d.begin( ); + + on_d3d( device ); + + g_cheat.m_visuals( ); + + if( g_settings.menu.open || g_con->m_open ) { + ui::ui_draw_cursor( ); + } + + std::chrono::high_resolution_clock timer; + static auto last = timer.now( ); + auto now = timer.now( ); + + std::chrono::duration< double > delta = now - last; + last = timer.now( ); + + g_gmod.m_frametime = delta.count( ); + + if( !g_con->m_logs.empty( ) && g_settings.menu.logs_enable ) { + auto& logs = g_con->m_logs; + float time = ( float )GetTickCount( ) * 0.001f; + + auto data = logs.data( ); + + int cur_pos = 2; + for( int i = logs.size( ) - 1; i >= 0; --i ) { + if( cur_pos > g_d3d.m_height - 200 ) { + cur_pos -= 8; + break; + } + + float delta = time - data[ i ].m_time; + if( delta >= 5.0f ) { + break; + } + + clr_t col( 255, 255, 255 ); + if( delta > 4.f ) col.a( ) *= ( 6.f - delta ); + + g_d3d.draw_text< ALIGN_RIGHT >( fonts.f_con, col, g_d3d.m_width - 5, cur_pos, D3DFONTFLAG_DROPSHADOW, data[ i ].m_msg ); + cur_pos += 10; + } + } + + for( auto& it : ::d3d::sprites ) + it->end( ); + + g_d3d.end( ); + } + + return ret; +} + +long __stdcall hooks::d3d::present( IDirect3DDevice9* device, RECT* source, RECT* dest, HWND wnd_override, RGNDATA* reg ) { + static auto present_o = g_gmod.m_d3d->get_old_function< decltype( &hooks::d3d::present ) >( 17 ); + + static uintptr_t return_address = 0; + if( !return_address ) { + return_address = ( uintptr_t )( _ReturnAddress( ) ); + } + + if( return_address && return_address != ( uintptr_t )( _ReturnAddress( ) ) ) + return present_o( device, source, dest, wnd_override, reg ); + + if( g_d3d.run_frame( device ) ) { + g_d3d.begin( ); + if( g_settings.misc.watermark ) { + static std::string str( xors( "moneybot | " ) ); + static bool transform = false; + if( !transform ) { + str += __DATE__; + str += ", "; + str += __TIME__; + + std::transform( str.begin( ), str.end( ), str.begin( ), + [ ]( char c ) { return ::tolower( c ); } ); + transform = true; + } + + g_d3d.draw_text< ALIGN_RIGHT >( ::d3d::fonts.f_menu, + ui::ui_get_text_col( ), g_d3d.m_width - 10, 8, + D3DFONTFLAG_DROPSHADOW, str.c_str( ) ); + } + + g_con->draw( ); + g_d3d.end( ); + } + + return present_o( device, source, dest, wnd_override, reg ); +} + +long __stdcall hooks::d3d::reset( IDirect3DDevice9* device, D3DPRESENT_PARAMETERS* params ) { + static auto reset_o = g_gmod.m_d3d->get_old_function< decltype( &hooks::d3d::reset ) >( 16 ); + if ( g_gmod.m_panic ) { + return reset_o( device, params ); + } + + for( auto& sprite : ::d3d::sprites ) + sprite->on_reset( ); + + g_d3d.on_device_lost( ); + long result = reset_o( device, params ); + g_d3d.on_device_reset( ); + + for( auto& sprite : ::d3d::sprites ) + sprite->on_reset_end( ); + + return result; +} \ No newline at end of file diff --git a/cheat/gmod/do_post_screen_space_effects.cpp b/cheat/gmod/do_post_screen_space_effects.cpp new file mode 100644 index 0000000..0766233 --- /dev/null +++ b/cheat/gmod/do_post_screen_space_effects.cpp @@ -0,0 +1,17 @@ +#include "hooks.hpp" +#include "base_cheat.hpp" +#include "context.hpp" + +bool __fastcall hooks::do_post_screen_space_effects( void* ecx_, void* edx_, CViewSetup* setup ) { + static auto old_fn = g_csgo.m_clientmode->get_old_function< decltype( &do_post_screen_space_effects ) >( 44 ); + + g_ctx.m_drawing_postscreenspace = true; + if( g_csgo.m_engine( )->IsInGame( ) && g_ctx.m_local ) { + g_cheat.m_visuals.update_glow( ); + } + + bool ret = old_fn( ecx_, 0, setup ); + g_ctx.m_drawing_postscreenspace = false; + + return ret; +} \ No newline at end of file diff --git a/cheat/gmod/draw_model_execute.cpp b/cheat/gmod/draw_model_execute.cpp new file mode 100644 index 0000000..354a3d4 --- /dev/null +++ b/cheat/gmod/draw_model_execute.cpp @@ -0,0 +1,167 @@ +#include "hooks.hpp" +#include "base_cheat.hpp" +#include "context.hpp" +#include "util.hpp" +#include "settings.hpp" +//this is so ugly dont even look at it + +//gets called once per frame for every entity +void __fastcall hooks::draw_model_execute( IVModelRender* ecx_, void* edx_, + void* render_ctx, const DrawModelState_t& state, + const ModelRenderInfo_t& info, matrix3x4* bone_to_world ) { + static auto dme_o = g_csgo.m_model_render->get_old_function< decltype( &hooks::draw_model_execute ) >( 21 ); + + if( g_csgo.m_panic || g_ctx.m_drawing_postscreenspace ) + return dme_o( ecx_, edx_, render_ctx, state, info, bone_to_world ); + + bool draw = true; + IMaterial* mat = g_settings.visuals.chams.flat( ) ? g_cheat.m_chams.m_materials.m_chams_flat : g_cheat.m_chams.m_materials.m_chams; + auto model_name = g_csgo.m_model_info( )->GetModelName( info.m_model ); + auto local_index = g_csgo.m_engine( )->GetLocalPlayer( ); + int local_team = 0; + if( g_ctx.m_local ) + local_team = g_ctx.m_local->m_iTeamNum( ); + int team = 0; + bool is_player = false; + + if( strstr( model_name, xors( "models/player" ) ) && info.m_entity_index == local_index ) { + if( g_settings.misc.thirdperson( ) && g_ctx.m_local && g_ctx.m_local->is_valid( ) + && g_ctx.m_local->m_bIsScoped( ) ) { + float clr[ ] = { 1.0f, 1.0f, 1.0f }; + g_csgo.m_render_view( )->SetColorModulation( clr ); + g_csgo.m_render_view( )->SetBlend( 0.5f ); + return dme_o( ecx_, edx_, render_ctx, state, info, bone_to_world ); + } + } + + if( strstr( model_name, xors( "models/player" ) ) && info.m_entity_index ) { + auto player = g_csgo.m_entlist( )->GetClientEntity< >( info.m_entity_index ); + + if( player && player->is_valid( ) && !player->m_bGunGameImmunity( ) ) { + is_player = true; + team = player->m_iTeamNum( ); + + if( g_settings.visuals.chams.enabled ) { + if( g_settings.visuals.chams.ignore_z && !g_ctx.m_drawing_screneend && ( team != local_team || g_settings.visuals.chams.friendlies( ) ) ) + draw = false; + else if( !g_settings.visuals.chams.ignore_z && ( team != local_team || g_settings.visuals.chams.friendlies( ) ) ) { + fclr_t clr = team != local_team ? g_settings.visuals.chams.color_visible_enemy( ) : g_settings.visuals.chams.color_visible_friendly( ); + + mat->SetMaterialVarFlag( MATERIAL_VAR_IGNOREZ, false ); + g_cheat.m_chams.m_materials.force_material( mat, clr ); + dme_o( ecx_, 0, render_ctx, state, info, bone_to_world ); + g_csgo.m_model_render( )->ForcedMaterialOverride( nullptr ); + g_csgo.m_render_view( )->SetBlend( 1.0f ); + draw = false; + } + } + + } + } + + if( g_settings.misc.transparent_vm && strstr( model_name, xors( "weapon" ) ) ) { + if( strstr( model_name, xors( "arms" ) ) ) { + g_csgo.m_render_view( )->SetBlend( 0.6f ); + } + } + + if( is_player ) { + if( g_settings.rage.resolver( ) && g_settings.rage.bt_visualize( ) && ( team != local_team || g_settings.rage.friendlies( ) ) ) { + RecordType_t record_type = g_cheat.m_ragebot.m_lagcomp->can_backtrack_entity( info.m_entity_index ); + auto record = g_cheat.m_ragebot.m_lagcomp->get_render_record( info.m_entity_index ); + + if( record && record_type ) { + fclr_t clr_hid = team != local_team ? g_settings.visuals.chams.color_hidden_enemy( ).to_fclr( ) : g_settings.visuals.chams.color_hidden_friendly( ).to_fclr( ); + + float backup_modulation[ 3 ]{ }; + bool backup_ignorez = false; + float backup_blend = 1.0f; + + backup_blend = g_csgo.m_render_view( )->GetBlend( ); + g_csgo.m_render_view( )->GetColorModulation( backup_modulation ); + + //BIG ROFL + if( backup_modulation[ 0 ] == clr_hid.r( ) && backup_modulation[ 1 ] == clr_hid.g( ) && backup_modulation[ 2 ] == clr_hid.b( ) + && backup_blend == clr_hid.a( ) ) { + backup_ignorez = true; + } + + if( !backup_ignorez ) { + auto flat_mat = g_cheat.m_chams.m_materials.m_chams_flat.m_mat; + flat_mat->SetMaterialVarFlag( MATERIAL_VAR_IGNOREZ, g_settings.visuals.chams.ignore_z && g_settings.visuals.chams.enabled ); + g_cheat.m_chams.m_materials.force_material( g_cheat.m_chams.m_materials.m_chams_flat, g_settings.rage.bt_col( ) ); + dme_o( ecx_, edx_, render_ctx, state, info, record->m_matrix ); + flat_mat->SetMaterialVarFlag( MATERIAL_VAR_IGNOREZ, false ); + } + + g_csgo.m_render_view( )->SetBlend( backup_blend ); + g_csgo.m_render_view( )->SetColorModulation( backup_modulation ); + g_csgo.m_model_render( )->ForcedMaterialOverride( g_settings.visuals.chams.enabled( ) && + ( team != local_team || g_settings.visuals.chams.friendlies( ) ) ? mat : nullptr ); + + if( draw ) { + dme_o( ecx_, edx_, render_ctx, state, info, bone_to_world ); + draw = false; + } + } + } + + + if( g_settings.legit.backtracking_visualize( ) && ( team != local_team || g_settings.legit.friendlies( ) ) ) { + auto ent = g_csgo.m_entlist( )->GetClientEntity< >( info.m_entity_index ); + auto record = g_cheat.m_legitbot.m_lagcomp.find_best_record( info.m_entity_index ); + { //idk + auto records = g_cheat.m_legitbot.m_lagcomp.get_records( info.m_entity_index ); + if( records.size( ) ) { + for( auto& it : util::reverse_iterator( records ) ) { + if( it.is_valid( ) ) { + record = ⁢ + break; + } + } + } + } + + if( record && record->is_valid( ) && record->m_position.dist_to( ent->get_hitbox_pos( 0 ) ) > 5.f ) { + fclr_t clr_hid = team != local_team ? g_settings.visuals.chams.color_hidden_enemy( ).to_fclr( ) : g_settings.visuals.chams.color_hidden_friendly( ).to_fclr( ); + + float backup_modulation[ 3 ]{ }; + bool backup_ignorez = false; + float backup_blend = 1.0f; + + backup_blend = g_csgo.m_render_view( )->GetBlend( ); + g_csgo.m_render_view( )->GetColorModulation( backup_modulation ); + + //BIG ROFL + if( backup_modulation[ 0 ] == clr_hid.r( ) && backup_modulation[ 1 ] == clr_hid.g( ) && backup_modulation[ 2 ] == clr_hid.b( ) + && backup_blend == clr_hid.a( ) ) { + backup_ignorez = true; + } + + if( !backup_ignorez ) { + auto flat_mat = g_cheat.m_chams.m_materials.m_chams_flat.m_mat; + flat_mat->SetMaterialVarFlag( MATERIAL_VAR_IGNOREZ, g_settings.visuals.chams.ignore_z && g_settings.visuals.chams.enabled ); + g_cheat.m_chams.m_materials.force_material( g_cheat.m_chams.m_materials.m_chams_flat, g_settings.legit.backtracking_col( ) ); + dme_o( ecx_, edx_, render_ctx, state, info, record->m_matrix ); + flat_mat->SetMaterialVarFlag( MATERIAL_VAR_IGNOREZ, false ); + } + + g_csgo.m_render_view( )->SetBlend( backup_blend ); + g_csgo.m_render_view( )->SetColorModulation( backup_modulation ); + g_csgo.m_model_render( )->ForcedMaterialOverride( g_settings.visuals.chams.enabled( ) && + ( team != local_team || g_settings.visuals.chams.friendlies( ) ) ? mat : nullptr ); + + if( draw ) { + dme_o( ecx_, edx_, render_ctx, state, info, bone_to_world ); + draw = false; + } + } + } + } + + if( draw ) { + dme_o( ecx_, 0, render_ctx, state, info, bone_to_world ); + } + + g_csgo.m_model_render( )->ForcedMaterialOverride( nullptr ); +} \ No newline at end of file diff --git a/cheat/gmod/emit_sound.cpp b/cheat/gmod/emit_sound.cpp new file mode 100644 index 0000000..547828c --- /dev/null +++ b/cheat/gmod/emit_sound.cpp @@ -0,0 +1,19 @@ +#include "base_cheat.hpp" +#include "hooks.hpp" + +void __fastcall hooks::emit_sound( void* ecx_, void* edx_, void* filter, int ent, int channel, const char* sound, uint32_t hash, + const char* sample, float volume, float attenuation, int seed, int flags, int pitch, const vec3_t* origin, + const vec3_t* direction, vec3_t* origins, bool update_pos, float sound_time, int speaker_entry ) { + static auto emit_sound_o = g_csgo.m_engine_sound->get_old_function< decltype( &hooks::emit_sound ) >( 5 ); + + if( !g_csgo.m_panic && origin ) { + auto entity = g_csgo.m_entlist( )->GetClientEntity< >( ent ); + if( entity && entity->is_player( ) && entity->ce( )->IsDormant( ) && + ent >= 0 && ent <= 64 ) + g_cheat.m_visuals.update_position( ent, *origin ); + } + + emit_sound_o( ecx_, 0, filter, ent, channel, sound, hash, sample, + volume, attenuation, seed, flags, pitch, origin, direction, + origins, update_pos, sound_time, speaker_entry ); +} \ No newline at end of file diff --git a/cheat/gmod/extra.cpp b/cheat/gmod/extra.cpp new file mode 100644 index 0000000..454971e --- /dev/null +++ b/cheat/gmod/extra.cpp @@ -0,0 +1,86 @@ +#include "base_cheat.hpp" +#include "context.hpp" +#include "input_system.hpp" +#include "math.hpp" +#include "hooks.hpp" +#include "interface.hpp" +#undef min + +namespace features +{ + void c_extra::use_spammer( user_cmd_t* cmd ) { + if( !g_settings.misc.use_spam( ) ) + return; + + if( !g_input.is_key_pressed( g_settings.misc.use_spam_key( ) ) ) + return; + + static bool toggle{ }; + + if( toggle ) + cmd->m_buttons |= IN_USE; + else + cmd->m_buttons &= ~IN_USE; + + toggle ^= 1; + } + + void c_extra::third_person( ) { + if( !g_ctx.m_local ) + return; + + static bool enabled = false; + static bool toggle = true; + static bool key_held = false; + + + if( g_input.is_key_pressed( ( VirtualKeys_t )g_settings.misc.thirdperson_key( ) ) ) { + if( !key_held ) { + toggle ^= 1; + } + key_held = true; + } + else { + key_held = false; + } + + if( !g_settings.misc.thirdperson || !toggle ) { + if( enabled ) { + g_gmod.m_input->m_fCameraInThirdPerson = false; + enabled = false; + } + + return; + } + + vec3_t viewangles{ }; + if( g_ctx.m_local->is_alive( ) ) { + g_gmod.m_engine( )->GetViewAngles( viewangles ); + g_gmod.m_input->m_fCameraInThirdPerson = true; + g_gmod.m_input->m_vecCameraOffset = vec3_t( viewangles.x, viewangles.y, 150.0f ); + + constexpr float cam_hull_offset{ 16.f }; + + const vec3_t cam_hull_min( -cam_hull_offset, -cam_hull_offset, -cam_hull_offset ); + const vec3_t cam_hull_max( cam_hull_offset, cam_hull_offset, cam_hull_offset ); + vec3_t cam_forward, origin = g_ctx.m_local->get_eye_pos( ); + + cam_forward = math::angle_vectors( vec3_t( viewangles.x, viewangles.y, 0.f ) ); + + CTraceFilterWorldAndPropsOnly filter; + Ray_t ray; + CGameTrace tr; + + ray.Init( origin, origin - ( cam_forward * 150.f ), cam_hull_min, cam_hull_max ); + + g_gmod.m_trace( )->TraceRay( ray, MASK_SOLID & ~CONTENTS_MONSTER, &filter, &tr ); + g_gmod.m_input->m_vecCameraOffset.z = 150.f * tr.fraction; + + enabled = true; + } + else if( g_gmod.m_entlist( )->GetClientEntityFromHandle< >( g_ctx.m_local->m_hObserverTarget( ) ) ) { + g_gmod.m_input->m_fCameraInThirdPerson = false; + g_ctx.m_local->m_iObserverMode( ) = 5; + } + } +} \ No newline at end of file diff --git a/cheat/gmod/extra.hpp b/cheat/gmod/extra.hpp new file mode 100644 index 0000000..8d01603 --- /dev/null +++ b/cheat/gmod/extra.hpp @@ -0,0 +1,12 @@ +#pragma once +#include +#include + +namespace features +{ + class c_extra { + public: + void use_spammer( user_cmd_t* cmd ); + void third_person( ); + }; +} \ No newline at end of file diff --git a/cheat/gmod/factory.cpp b/cheat/gmod/factory.cpp new file mode 100644 index 0000000..4133e39 --- /dev/null +++ b/cheat/gmod/factory.cpp @@ -0,0 +1,110 @@ +#include "factory.hpp" +#ifndef IFACE_DLLMAIN +#include "fnv.hpp" + +#include + +NAMESPACE_REGION( factory ) +NAMESPACE_REGION( interfaces ) + +//iterate all exports inside of a module and find createinterface +uintptr_t c_interface_manager::find_createinterface( void* module_ ) { + IMAGE_DOS_HEADER* dos_header; + IMAGE_NT_HEADERS* nt_headers; + uintptr_t export_address; + IMAGE_EXPORT_DIRECTORY* export_dir; + const char* export_name; + uintptr_t* names; + uintptr_t* funcs; + uint16_t* ords; + uint32_t export_hash; + + dos_header = reinterpret_cast< decltype( dos_header ) >( uintptr_t( module_ ) ); + nt_headers = reinterpret_cast< decltype( nt_headers ) >( uintptr_t( module_ ) + dos_header->e_lfanew ); + + //find addresses of functions from nt headers + export_address = nt_headers->OptionalHeader.DataDirectory[ 0 ].VirtualAddress; + export_dir = reinterpret_cast< decltype( export_dir ) >( uintptr_t( module_ ) + export_address ); + + if ( !export_dir->NumberOfFunctions ) + return uintptr_t{ }; + + names = reinterpret_cast< uintptr_t* >( uintptr_t( module_ ) + export_dir->AddressOfNames ); + funcs = reinterpret_cast< uintptr_t* >( uintptr_t( module_ ) + export_dir->AddressOfFunctions ); + + ords = reinterpret_cast< uint16_t* >( uintptr_t( module_ ) + export_dir->AddressOfNameOrdinals ); + + if ( names && funcs && ords ) { + //iterate the exports + for ( size_t i{ }; i < export_dir->NumberOfNames; ++i ) { + export_name = reinterpret_cast< const char* >( uintptr_t( module_ ) + names[ i ] ); + export_hash = hash::fnv1a( export_name ); + + if ( export_hash == fnv( "CreateInterface" ) ) { + return uintptr_t( module_ ) + funcs[ ords[ i ] ]; + } + } + } + + return uintptr_t{ }; +} + +c_interface_manager::c_interface_manager( ) { + auto teb = reinterpret_cast< PTEB >( __readfsdword( uintptr_t( &static_cast< NT_TIB* >( nullptr )->Self ) ) ); + auto peb = teb->ProcessEnvironmentBlock; + + auto root = &peb->Ldr->InMemoryOrderModuleList; + //iterate module list + for ( auto entry = root->Flink->Flink->Flink->Flink; entry != root; entry = entry->Flink ) { + PLDR_DATA_TABLE_ENTRY data_table; + HMODULE module_base; + uintptr_t create_interface_export; + uintptr_t create_interface_; + uintptr_t* list_iterator_ptr; + interface_iterator_t* list_iterator; + + data_table = reinterpret_cast< PLDR_DATA_TABLE_ENTRY >( entry ); + module_base = reinterpret_cast< HMODULE >( data_table->Reserved2[ 0 ] ); + create_interface_export = find_createinterface( module_base ); + + if ( !create_interface_export || !is_createinterface_export( create_interface_export ) ) { + continue; + } + + //find the createinterface function + create_interface_ = follow_createinterface_export( create_interface_export ); + if ( !is_createinterface_fn( create_interface_ ) ) { + continue; + } + + //find the list iterator + list_iterator_ptr = find_list_ptr( create_interface_ ); + + //iterate the interface list + for ( list_iterator = reinterpret_cast< interface_iterator_t* >( + list_iterator_ptr ); + !!list_iterator; + list_iterator = list_iterator->m_next + ) { + std::string name( list_iterator->m_name ); + std::string module_name( util::unicode_to_ascii( + std::wstring( data_table->FullDllName.Buffer, data_table->FullDllName.Length ) ) ); + + uintptr_t ptr = static_cast< uintptr_t( *)( ) >( list_iterator->m_create_fn )( ); + + size_t version = [ & ]( ) { + std::string ret( name ); + ret.erase( std::remove_if( ret.begin( ), ret.end( ), + [ & ]( int i ) { return !::isdigit( i ); } + ), ret.end( ) ); + return atoi( ret.c_str( ) ); + }( ); + + m_interfaces.emplace_back( interface_data_t{ name, module_name, version, ptr } ); + } + } +} + +END_REGION +END_REGION +#endif \ No newline at end of file diff --git a/cheat/gmod/factory.hpp b/cheat/gmod/factory.hpp new file mode 100644 index 0000000..a3565e0 --- /dev/null +++ b/cheat/gmod/factory.hpp @@ -0,0 +1,155 @@ +#pragma once +#include +#include +#include +#include +#include "vmt.hpp" +#include "util.hpp" +#include "x86.hpp" +#include "console.hpp" + +//IFACE_DLLMAIN - interfaces are passed through dllmain and below code doesnt need to be ran +#ifndef _DEBUG +//#define IFACE_DLLMAIN +#endif + +#ifdef IFACE_DLLMAIN +#include "iface_dllmain_impl.hpp" +#else + +NAMESPACE_REGION( factory ) + +namespace interfaces +{ + struct interface_iterator_t { + void* m_create_fn; + char* m_name; + + interface_iterator_t* m_next; + }; + + inline auto follow_createinterface_export( uintptr_t export_ ) { + /* + .text:006F5F00 CreateInterface proc near + .text:006F5F00 push ebp + .text:006F5F01 mov ebp, esp + .text:006F5F03 pop ebp + .text:006F5F04 jmp sub_6F5E90 + */ + uintptr_t jmp = export_ + 0x4; + uintptr_t jmp_target = jmp + *( uintptr_t* )( jmp + 0x1 ) + 0x5; + + return jmp_target; + } + + inline auto find_list_ptr( uintptr_t createinterface ) { + /* + .text:006F5E90 push ebp + .text:006F5E91 mov ebp, esp + .text:006F5E93 push esi + .text:006F5E94 mov esi, dword_2EEFDE4 + .text:006F5E9A push edi + */ + auto iterator_ptr = **( uintptr_t*** )( createinterface + 0x6 ); + + return iterator_ptr; + } + + inline bool is_createinterface_export( uintptr_t export_ ) { + return ( *( uint8_t* )( export_ ) == x86::encode_push_reg( x86::reg::ebp ) + && *( uint8_t* )( export_ + 4 ) == 0xe9 + && *( uint8_t* )( export_ + 9 ) == 0xcc + && *( uint8_t* )( export_ + 10 ) == 0xcc ); + } + + inline bool is_createinterface_fn( uintptr_t fn_ ) { + return ( *( uint8_t* )( fn_ ) == x86::encode_push_reg( x86::reg::ebp ) + && *( uint8_t* )( fn_ + 4 ) == 0x8b + && *( uint8_t* )( fn_ + 10 ) == x86::encode_push_reg( x86::reg::edi ) ); + } + + class c_interface_manager { + public: + struct interface_data_t { + std::string m_name; + std::string m_module; + size_t m_version; + uintptr_t m_ptr; + + template < typename t > __forceinline t get( ) { + return reinterpret_cast< t >( m_ptr ); + } + }; + + c_interface_manager( ); + + //iterate the interface list to find our desired version + template < typename t = void* > + t find_interface( const std::string& module_, std::string name ) { + //avoid finding interfaces with matching names + if( !::isdigit( name[ name.length( ) - 1 ] ) ) + name += "0"; + + for( auto& it : m_interfaces ) { + if( !it.m_module.compare( module_ ) + && !it.m_name.compare( name ) ) { + g_con->print( xors( "%s version %u found in %s at 0x%08x\n" ), + name.c_str( ), + it.m_version, + it.m_module.c_str( ), + it.m_ptr ); + + return it.get< t >( ); + } + } + + g_con->print( xors( "%s not found\n" ), name.c_str( ) ); + + return t{ }; + } + + template < typename t = void* > + t find_interface( std::string name ) { + //avoid finding interfaces with matching names + if( !::isdigit( name[ name.length( ) - 1 ] ) ) + name += '0'; + + for( auto& it : m_interfaces ) { + if( strstr( it.m_name.c_str( ), name.c_str( ) ) ) { + g_con->print( xors( "%s version %u found in %s at 0x%08x\n" ), + name.c_str( ), + it.m_version, + it.m_module.c_str( ), + it.m_ptr ); + + return it.get< t >( ); + } + } + + g_con->print( xors( "%s not found\n" ), name.c_str( ) ); + + return t{ }; + } + + void dump_interface_list( ) { + for( auto& it : m_interfaces ) { + g_con->print( xors( "%s version %u in %s at 0x%08x\n" ), + it.m_name.c_str( ), + it.m_version, + it.m_module.c_str( ), + it.m_ptr ); + } + } + + private: + uintptr_t find_createinterface( void* module_ ); + + std::vector< interface_data_t > m_interfaces; + }; +} + +END_REGION +#endif + +extern HMODULE g_dll; +extern factory::interfaces::c_interface_manager g_factory; \ No newline at end of file diff --git a/cheat/gmod/fire_bullets.cpp b/cheat/gmod/fire_bullets.cpp new file mode 100644 index 0000000..6bc4297 --- /dev/null +++ b/cheat/gmod/fire_bullets.cpp @@ -0,0 +1,15 @@ +#include "hooks.hpp" +#include "context.hpp" +#include "base_cheat.hpp" + +decltype( &hooks::fire_bullets ) hooks::fire_bullets_o{ }; +void __fastcall hooks::fire_bullets( void* ecx, void* edx, fire_bullets_info* info ) { + if( g_gmod.m_panic ) return fire_bullets_o( ecx, edx, info ); + + if( g_ctx.run_frame( ) && + g_ctx.m_local == ecx ) { // only our shots. + g_cheat.m_aimbot.log_shot( ( c_base_player* )ecx, info ); // dynamically logging spread vectors for nospread. + } + + return fire_bullets_o( ecx, edx, info ); +} \ No newline at end of file diff --git a/cheat/gmod/fnv.hpp b/cheat/gmod/fnv.hpp new file mode 100644 index 0000000..a3f2dc9 --- /dev/null +++ b/cheat/gmod/fnv.hpp @@ -0,0 +1,64 @@ +#pragma once + +#pragma warning( disable : 4307 ) // '*': integral constant overflow +#pragma warning( disable : 4244 ) // possible loss of data + +#include +#include + +using hash_t = unsigned int; + +// used for compile-time FNV-1a 32bit hashes. +#define fnv( str ) \ + [&]() { \ + constexpr hash_t out = hash::fnv1a( str ); \ + \ + return out; \ + }() + +// used for compile-time FNV-1a 32bit hashes when above macro cant be used for constexpr variables. +#define fnv_const( str ) Hash::fnv1a_32( str ) + +namespace hash // FNV-1a ( Fowler-Noll-Vo hash ). +{ + // FNV-1a constants. + enum : hash_t { + FNV1A_PRIME = 0x1000193, + FNV1A_BASIS = 0x811C9DC5 + }; + + // compile-time strlen. + __forceinline constexpr size_t ct_strlen( const char *str ) { + size_t out = 1; + + for( ; str[ out ] != '\0'; ++out ); + + return out; + } + + // hash data. + __forceinline constexpr hash_t fnv1a( const uint8_t *data, const size_t len ) { + hash_t out = FNV1A_BASIS; + + for( size_t i = 0; i < len; ++i ) + out = ( out ^ data[ i ] ) * FNV1A_PRIME; + + return out; + } + + // hash c-style string. + __forceinline constexpr hash_t fnv1a( const char *str ) { + hash_t out = FNV1A_BASIS; + size_t len = ct_strlen( str ); + + for( size_t i = 0; i < len; ++i ) + out = ( out ^ str[ i ] ) * FNV1A_PRIME; + + return out; + } + + // hash C++-style string ( runtime only ). + __forceinline hash_t fnv1a( const std::string &str ) { + return fnv1a( ( uint8_t* )str.c_str( ), str.length( ) ); + } +} \ No newline at end of file diff --git a/cheat/gmod/frame_stage_notify.cpp b/cheat/gmod/frame_stage_notify.cpp new file mode 100644 index 0000000..c371eb0 --- /dev/null +++ b/cheat/gmod/frame_stage_notify.cpp @@ -0,0 +1,25 @@ +#include "hooks.hpp" +#include "context.hpp" +#include "settings.hpp" +#include "base_cheat.hpp" + + +void __fastcall hooks::frame_stage_notify( void* ecx_, void* edx_, ClientFrameStage_t stage ) { + static auto frame_stage_notify_o = g_gmod.m_chl->get_old_function< decltype( &hooks::frame_stage_notify ) >( 35 ); + if ( g_gmod.m_panic ) return frame_stage_notify_o( ecx_, edx_, stage ); + + g_ctx.m_stage = stage; + + switch( stage ) { + case FRAME_NET_UPDATE_START: + break; + case FRAME_NET_UPDATE_POSTDATAUPDATE_START: + break; + case FRAME_RENDER_START: + break; + case FRAME_RENDER_END: + break; + } + + frame_stage_notify_o( ecx_, edx_, stage ); +} \ No newline at end of file diff --git a/cheat/gmod/get_screen_size.cpp b/cheat/gmod/get_screen_size.cpp new file mode 100644 index 0000000..19d9908 --- /dev/null +++ b/cheat/gmod/get_screen_size.cpp @@ -0,0 +1,37 @@ +#include "hooks.hpp" +#include "settings.hpp" + +#include +#include "context.hpp" +#include "mem.hpp" + +void __fastcall hooks::get_screen_size( void* ecx, void* edx, int& w, int& h ) { + static auto get_screen_size_o = g_csgo.m_surface->get_old_function< decltype( &hooks::get_screen_size ) >( 44 ); + static auto draw_crosshair_h = pattern::first_code_match( g_csgo.m_chl.dll( ), xors( "8B 0D ? ? ? ? 99 2B C2 D1 F8 89" ) ); + + stack_t stack( get_baseptr( ) ); + auto ret = stack.next( ).return_address( ); + //call original + get_screen_size_o( ecx, edx, w, h ); + + //alter screen width and height to adjust the crosshair position on screen + if( g_settings.visuals.recoil_crosshair && g_ctx.m_local ) { + if( ret == draw_crosshair_h || ret == draw_crosshair_h - 14 /* width call is 14 bytes above height call*/ ) { + w /= 2; + h /= 2; + + vec3_t punch_angles = g_ctx.m_local->m_aimPunchAngle( ) * 2.f; + + if( punch_angles.x < -0.1f ) { + float fov = g_ctx.m_fov; + float angle_step = h / fov; + + w -= int( punch_angles.y * angle_step ); + h += int( punch_angles.x * angle_step ); + } + + w *= 2; + h *= 2; + } + } +} \ No newline at end of file diff --git a/cheat/gmod/get_viewmodel_fov.cpp b/cheat/gmod/get_viewmodel_fov.cpp new file mode 100644 index 0000000..e4722e2 --- /dev/null +++ b/cheat/gmod/get_viewmodel_fov.cpp @@ -0,0 +1,8 @@ +#include "hooks.hpp" +#include "settings.hpp" + +float __fastcall hooks::get_viewmodel_fov( void* ecx, void* edx ) { + static auto get_viewmodel_fov_o = g_csgo.m_clientmode->get_old_function< decltype( &hooks::get_viewmodel_fov ) >( 35 ); + + return get_viewmodel_fov_o( ecx, nullptr ) + float( g_settings.misc.viewmodel_fov ); +} diff --git a/cheat/gmod/gmod.vcxproj b/cheat/gmod/gmod.vcxproj new file mode 100644 index 0000000..e20139f --- /dev/null +++ b/cheat/gmod/gmod.vcxproj @@ -0,0 +1,369 @@ + + + + + Debug + Win32 + + + pHit + Win32 + + + pHit + x64 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + optimize_test + Win32 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 15.0 + {82E7C50B-01E3-4D65-AECC-196E9494DFF4} + gmod + 10.0.17763.0 + + + DynamicLibrary + true + v141 + MultiByte + + + + DynamicLibrary + true + v141 + MultiByte + + + DynamicLibrary + false + v141 + true + MultiByte + + + DynamicLibrary + false + v141 + true + MultiByte + + + Application + true + v141 + MultiByte + + + Application + false + v141 + true + MultiByte + + + Application + false + v141 + true + MultiByte + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C:\Program Files %28x86%29\Microsoft DirectX SDK %28June 2010%29\Include;$(IncludePath) + C:\Program Files %28x86%29\Microsoft DirectX SDK %28June 2010%29\Lib\x86;$(LibraryPath) + $(SolutionDir)\bin + + + C:\Program Files %28x86%29\Microsoft DirectX SDK %28June 2010%29\Include;$(IncludePath) + C:\Program Files %28x86%29\Microsoft DirectX SDK %28June 2010%29\Lib\x86;$(LibraryPath) + $(SolutionDir)bin + + + $(SolutionDir)bin + false + C:\Program Files %28x86%29\Microsoft DirectX SDK %28June 2010%29\Include;$(IncludePath) + C:\Program Files %28x86%29\Microsoft DirectX SDK %28June 2010%29\Lib\x86;$(LibraryPath) + + + $(SolutionDir)bin + false + C:\Program Files %28x86%29\Microsoft DirectX SDK %28June 2010%29\Include;$(IncludePath) + C:\Program Files %28x86%29\Microsoft DirectX SDK %28June 2010%29\Lib\x86;$(LibraryPath) + + + + Level2 + Full + true + /std:c++latest /Zc:threadSafeInit- %(AdditionalOptions) + _WINDLL;%(PreprocessorDefinitions);_CRT_SECURE_NO_WARNINGS;_DEBUG;_SILENCE_ALL_CXX17_DEPRECATION_WARNINGS + true + false + Default + AnySuitable + true + StreamingSIMDExtensions2 + Fast + true + MultiThreadedDLL + _DEBUG + NotUsing + precompiled.hpp + + + false + /FAs %(AdditionalOptions) + DebugFastLink + false + false + + + + + Level3 + MaxSpeed + true + true + true + true + stdcpplatest + _CRT_SECURE_NO_WARNINGS;_WINDLL;%(PreprocessorDefinitions) + + + true + true + + + + + Level3 + MaxSpeed + true + true + true + true + stdcpplatest + _CRT_SECURE_NO_WARNINGS;_WINDLL;%(PreprocessorDefinitions) + + + true + true + + + + + Level3 + Disabled + true + false + stdcpplatest + _CRT_SECURE_NO_WARNINGS;_MBCS;%(PreprocessorDefinitions) + EditAndContinue + true + + + DebugFastLink + + + + + Level3 + Disabled + true + true + + + + + Level3 + MaxSpeed + true + true + true + true + + + true + true + + + + + Level3 + MaxSpeed + true + true + true + true + + + true + true + + + + + + \ No newline at end of file diff --git a/cheat/gmod/gmod.vcxproj.filters b/cheat/gmod/gmod.vcxproj.filters new file mode 100644 index 0000000..c0bbeec --- /dev/null +++ b/cheat/gmod/gmod.vcxproj.filters @@ -0,0 +1,385 @@ + + + + + {35d8e768-6ac4-4c43-818b-c2bcc4c3d527} + + + {1c1f773e-855b-43aa-afc8-5b8ee2cdbbc0} + + + {d47a6098-6f48-477c-8e9d-2e9ad3c0427d} + + + {f0e1c4a3-598f-4287-b0a6-63c19c84ad72} + + + {120ffcba-bfc7-4d07-97f1-ff5da4f08801} + + + {87974e05-d739-4f24-9c3b-2d96f0148b15} + + + {1df4716c-8aa1-49bd-bc47-e879bc145159} + + + {2b412e0a-8891-49f0-a4e2-752d774d9715} + + + {7306897e-ecec-49ec-b65d-d0e24ae31128} + + + {95cd308d-e344-423e-9068-935c019ffdff} + + + + + ui + + + ui + + + ui + + + ui + + + ui + + + ui + + + ui + + + ui + + + ui + + + ui + + + ui + + + ui + + + ui + + + ui + + + ui + + + ui + + + icons + + + icons + + + icons + + + icons + + + icons + + + sdk\valve + + + sdk\valve + + + sdk + + + sdk + + + sdk + + + sdk + + + sdk + + + sdk + + + sdk + + + sdk + + + sdk + + + sdk + + + sdk + + + sdk + + + sdk + + + sdk + + + sdk + + + sdk + + + sdk + + + sdk + + + sdk + + + sdk + + + sdk + + + sdk + + + sdk + + + sdk + + + sdk + + + hooks + + + util + + + util + + + util + + + util + + + util + + + util + + + util + + + util + + + hooks\hookers + + + hooks\hookers + + + factory + + + factory + + + factory + + + factory + + + context + + + context + + + context + + + util + + + util + + + util + + + sdk + + + sdk + + + features + + + features + + + features + + + features + + + sdk + + + sdk + + + features + + + features + + + features + + + features + + + + + sdk + + + sdk + + + sdk + + + hooks + + + hooks + + + hooks + + + util + + + util + + + util + + + util + + + util + + + factory + + + factory + + + factory + + + context + + + context + + + util + + + util + + + + features + + + features + + + features + + + hooks + + + features + + + features + + + hooks + + + features + + + features + + + hooks + + + hooks + + + features + + + hooks + + + hooks + + + features + + + hooks + + + \ No newline at end of file diff --git a/cheat/gmod/hooks.cpp b/cheat/gmod/hooks.cpp new file mode 100644 index 0000000..a5cb91e --- /dev/null +++ b/cheat/gmod/hooks.cpp @@ -0,0 +1,48 @@ +#include "hooks.hpp" +#include "interface.hpp" + +hooks::c_netvar_proxy hooks::lby_proxy; +hooks::c_netvar_proxy hooks::last_shot_proxy; + + + + + +bool hooks::commit( factory::c_gmod* instance ) { + while ( !( instance->m_hwnd = FindWindowA( xors( "Valve001" ), 0 ) ) ) + Sleep( 100 ); + + window_procedure_o = reinterpret_cast< decltype( window_procedure_o ) >( + SetWindowLongA( instance->m_hwnd, GWLP_WNDPROC, + ( long )window_procedure ) + ); + + instance->m_d3d->hook( 42, &hooks::d3d::end_scene ); + instance->m_d3d->hook( 16, &hooks::d3d::reset ); + instance->m_d3d->hook( 17, &hooks::d3d::present ); + instance->m_surface->hook( 62, &hooks::lock_cursor ); + //instance->m_view_render->hook( 6, &hooks::render_view ); + instance->m_engine_vgui->hook( 13, &hooks::paint ); + //instance->m_engine->hook( 93, &hooks::is_hltv_proxy ); + //instance->m_engine->hook( 91, &hooks::is_paused ); + //instance->m_engine->hook( 27, &hooks::is_connected ); + //instance->m_panel->hook( 41, &hooks::paint_traverse ); + instance->m_clientmode->hook( 21, &hooks::create_move ); + //instance->m_clientmode->hook( 23, &hooks::override_mouse_input ); + //instance->m_clientmode->hook( 35, &hooks::get_viewmodel_fov ); + //instance->m_clientmode->hook( 44, &hooks::do_post_screen_space_effects ); + instance->m_clientmode->hook( 16, &hooks::override_view ); + //instance->m_chl->hook( 35, &hooks::frame_stage_notify ); + //instance->m_chl->hook( 10, &hooks::hud_process_input ); + instance->m_prediction->hook( 17, &hooks::run_command ); + //instance->m_prediction->hook( 14, &hooks::in_prediction ); + //instance->m_model_render->hook( 21, &hooks::draw_model_execute ); + //instance->m_render_view->hook( 9, &hooks::scene_end ); + //instance->m_surface->hook( 44, &hooks::get_screen_size ); + //instance->m_surface->hook( 116, &hooks::on_screen_size_changed ); + //instance->m_surface->hook( 82, &hooks::play_sound ); + //instance->m_engine_sound->hook( 5, &hooks::emit_sound ); + //instance->m_debug_show_spread->hook( 13, &hooks::debug_show_spread_get_int ); + + return true; +} diff --git a/cheat/gmod/hooks.hpp b/cheat/gmod/hooks.hpp new file mode 100644 index 0000000..e4a6239 --- /dev/null +++ b/cheat/gmod/hooks.hpp @@ -0,0 +1,64 @@ +#pragma once +#include + +#include "util.hpp" +#include "d3d.hpp" +#include "interface.hpp" +#include "netvar_proxy.hpp" + +namespace hooks +{ + //hook like the hooker that u are + + long __stdcall window_procedure( HWND, uint32_t, uint32_t, long ); + extern decltype( &window_procedure ) window_procedure_o; + + void __fastcall fire_bullets( void*, void*, fire_bullets_info* ); + extern decltype( &fire_bullets ) fire_bullets_o; + + void __fastcall lock_cursor( void*, void* ); + void __fastcall paint( void*, void*, int ); + void __fastcall render_view( void*, void*, CViewSetup&, int, int ); + void __fastcall paint_traverse( void*, void*, unsigned int, bool, bool ); + bool __fastcall create_move( void*, void*, float, user_cmd_t* ); + void __fastcall frame_stage_notify( void*, void*, ClientFrameStage_t ); + void __fastcall run_command( void*, void*, IClientEntity*, user_cmd_t*, IMoveHelper* ); + void __fastcall override_mouse_input( void*, void*, float*, float* ); + void __fastcall draw_model_execute( IVModelRender*, void*, void*, const DrawModelState_t&, const ModelRenderInfo_t&, matrix3x4* ); + void __fastcall scene_end( void*, void* ); + bool __fastcall is_hltv_proxy( void*, void* ); + bool __fastcall is_hltv( void* thisptr, uintptr_t pvs_entity ); + float __fastcall get_viewmodel_fov( void*, void* ); + void __fastcall get_screen_size( void*, void*, int&, int& ); + void __fastcall override_view( void* ecx_, void* edx_, CViewSetup* setup ); + void __fastcall emit_sound( void* ecx_, void* edx_, void* filter, int ent, int channel, const char* sound, uint32_t hash, + const char* sample, float volume, float attenuation, int seed, int flags, int pitch, const vec3_t* origin, + const vec3_t* direction, vec3_t* origins, bool update_pos, float sound_time, int speaker_entry ); + + bool __fastcall is_connected( void* ecx_, void* edx_ ); + + bool __fastcall in_prediction( void* ecx_, void* edx_ ); + + void __cdecl lby_proxy_fn( const CRecvProxyData* proxy_data_const, void* entity, void* output ); + void __cdecl last_shot_proxy_fn( const CRecvProxyData* proxy_data_const, void* entity, void* output ); + int __fastcall send_datagram( INetChannel* channel, void* edx, void* datagram ); + bool __fastcall is_paused( void* ecx_, void* edx_ ); + bool __fastcall do_post_screen_space_effects( void* ecx_, void* edx_, CViewSetup* setup ); + void __fastcall on_screen_size_changed( void* ecx_, void* edx_, int old_h, int old_w ); + void __fastcall play_sound( void* ecx_, void* edx_, const char* name ); + void __fastcall hud_process_input( void* ecx_, void* edx_, bool repaint ); + + int __fastcall debug_show_spread_get_int( void* ecx_, void* edx_ ); + + extern c_netvar_proxy lby_proxy; + extern c_netvar_proxy last_shot_proxy; + + //do we wanna only run menu in d3d or visuals too? + namespace d3d { + long __stdcall end_scene( IDirect3DDevice9* ); + long __stdcall reset( IDirect3DDevice9*, D3DPRESENT_PARAMETERS* ); + long __stdcall present( IDirect3DDevice9*, RECT*, RECT*, HWND, RGNDATA* ); + } + + extern bool commit( factory::c_gmod* ); +} \ No newline at end of file diff --git a/cheat/gmod/hud_process_input.cpp b/cheat/gmod/hud_process_input.cpp new file mode 100644 index 0000000..b68c9c1 --- /dev/null +++ b/cheat/gmod/hud_process_input.cpp @@ -0,0 +1,19 @@ +#include "context.hpp" +#include "hooks.hpp" + +void __fastcall hooks::hud_process_input( void* ecx_, void* edx_, bool active ) { + static auto hud_update_o = g_csgo.m_chl->get_old_function< decltype( &hooks::hud_process_input ) >( 10 ); + + static auto g_vecRenderAngle = *pattern::first_code_match< vec3_t** >( g_csgo.m_chl.dll( ), + xors( "F3 0F 10 05 ? ? ? ? F3 0F 5C 05 ? ? ? ? F3 0F 11 86" ), 0x4 ); + + if( g_ctx.run_frame( ) ) { + float backup = g_vecRenderAngle->y; + g_vecRenderAngle->y = g_ctx.m_last_fakeangle.y; + hud_update_o( ecx_, 0, active ); + g_vecRenderAngle->y = backup; + return; + } + + return hud_update_o( ecx_, 0, active ); +} \ No newline at end of file diff --git a/cheat/gmod/icons.hpp b/cheat/gmod/icons.hpp new file mode 100644 index 0000000..bffd94e --- /dev/null +++ b/cheat/gmod/icons.hpp @@ -0,0 +1,5 @@ +#include "icons/legit.hpp" +#include "icons/rage.hpp" +#include "icons/visuals.hpp" +#include "icons/misc.hpp" +#include "icons/config.hpp" \ No newline at end of file diff --git a/cheat/gmod/icons/config.hpp b/cheat/gmod/icons/config.hpp new file mode 100644 index 0000000..be45039 --- /dev/null +++ b/cheat/gmod/icons/config.hpp @@ -0,0 +1,1752 @@ +/* E:\Users\admin\Desktop\stuff\icons\config.png (4/1/2018 10:00:36 PM) + StartOffset: 00000000, EndOffset: 0000519A, Length: 0000519B */ + +namespace icons { +constexpr static size_t config_size = 20891; +namespace raw { +static unsigned char config[20891] = { + 0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A, 0x00, 0x00, 0x00, 0x0D, + 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x78, + 0x08, 0x06, 0x00, 0x00, 0x00, 0x39, 0x64, 0x36, 0xD2, 0x00, 0x00, 0x00, + 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x2E, 0x23, 0x00, 0x00, 0x2E, + 0x23, 0x01, 0x78, 0xA5, 0x3F, 0x76, 0x00, 0x00, 0x0A, 0x4F, 0x69, 0x43, + 0x43, 0x50, 0x50, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x20, + 0x49, 0x43, 0x43, 0x20, 0x70, 0x72, 0x6F, 0x66, 0x69, 0x6C, 0x65, 0x00, + 0x00, 0x78, 0xDA, 0x9D, 0x53, 0x67, 0x54, 0x53, 0xE9, 0x16, 0x3D, 0xF7, + 0xDE, 0xF4, 0x42, 0x4B, 0x88, 0x80, 0x94, 0x4B, 0x6F, 0x52, 0x15, 0x08, + 0x20, 0x52, 0x42, 0x8B, 0x80, 0x14, 0x91, 0x26, 0x2A, 0x21, 0x09, 0x10, + 0x4A, 0x88, 0x21, 0xA1, 0xD9, 0x15, 0x51, 0xC1, 0x11, 0x45, 0x45, 0x04, + 0x1B, 0xC8, 0xA0, 0x88, 0x03, 0x8E, 0x8E, 0x80, 0x8C, 0x15, 0x51, 0x2C, + 0x0C, 0x8A, 0x0A, 0xD8, 0x07, 0xE4, 0x21, 0xA2, 0x8E, 0x83, 0xA3, 0x88, + 0x8A, 0xCA, 0xFB, 0xE1, 0x7B, 0xA3, 0x6B, 0xD6, 0xBC, 0xF7, 0xE6, 0xCD, + 0xFE, 0xB5, 0xD7, 0x3E, 0xE7, 0xAC, 0xF3, 0x9D, 0xB3, 0xCF, 0x07, 0xC0, + 0x08, 0x0C, 0x96, 0x48, 0x33, 0x51, 0x35, 0x80, 0x0C, 0xA9, 0x42, 0x1E, + 0x11, 0xE0, 0x83, 0xC7, 0xC4, 0xC6, 0xE1, 0xE4, 0x2E, 0x40, 0x81, 0x0A, + 0x24, 0x70, 0x00, 0x10, 0x08, 0xB3, 0x64, 0x21, 0x73, 0xFD, 0x23, 0x01, + 0x00, 0xF8, 0x7E, 0x3C, 0x3C, 0x2B, 0x22, 0xC0, 0x07, 0xBE, 0x00, 0x01, + 0x78, 0xD3, 0x0B, 0x08, 0x00, 0xC0, 0x4D, 0x9B, 0xC0, 0x30, 0x1C, 0x87, + 0xFF, 0x0F, 0xEA, 0x42, 0x99, 0x5C, 0x01, 0x80, 0x84, 0x01, 0xC0, 0x74, + 0x91, 0x38, 0x4B, 0x08, 0x80, 0x14, 0x00, 0x40, 0x7A, 0x8E, 0x42, 0xA6, + 0x00, 0x40, 0x46, 0x01, 0x80, 0x9D, 0x98, 0x26, 0x53, 0x00, 0xA0, 0x04, + 0x00, 0x60, 0xCB, 0x63, 0x62, 0xE3, 0x00, 0x50, 0x2D, 0x00, 0x60, 0x27, + 0x7F, 0xE6, 0xD3, 0x00, 0x80, 0x9D, 0xF8, 0x99, 0x7B, 0x01, 0x00, 0x5B, + 0x94, 0x21, 0x15, 0x01, 0xA0, 0x91, 0x00, 0x20, 0x13, 0x65, 0x88, 0x44, + 0x00, 0x68, 0x3B, 0x00, 0xAC, 0xCF, 0x56, 0x8A, 0x45, 0x00, 0x58, 0x30, + 0x00, 0x14, 0x66, 0x4B, 0xC4, 0x39, 0x00, 0xD8, 0x2D, 0x00, 0x30, 0x49, + 0x57, 0x66, 0x48, 0x00, 0xB0, 0xB7, 0x00, 0xC0, 0xCE, 0x10, 0x0B, 0xB2, + 0x00, 0x08, 0x0C, 0x00, 0x30, 0x51, 0x88, 0x85, 0x29, 0x00, 0x04, 0x7B, + 0x00, 0x60, 0xC8, 0x23, 0x23, 0x78, 0x00, 0x84, 0x99, 0x00, 0x14, 0x46, + 0xF2, 0x57, 0x3C, 0xF1, 0x2B, 0xAE, 0x10, 0xE7, 0x2A, 0x00, 0x00, 0x78, + 0x99, 0xB2, 0x3C, 0xB9, 0x24, 0x39, 0x45, 0x81, 0x5B, 0x08, 0x2D, 0x71, + 0x07, 0x57, 0x57, 0x2E, 0x1E, 0x28, 0xCE, 0x49, 0x17, 0x2B, 0x14, 0x36, + 0x61, 0x02, 0x61, 0x9A, 0x40, 0x2E, 0xC2, 0x79, 0x99, 0x19, 0x32, 0x81, + 0x34, 0x0F, 0xE0, 0xF3, 0xCC, 0x00, 0x00, 0xA0, 0x91, 0x15, 0x11, 0xE0, + 0x83, 0xF3, 0xFD, 0x78, 0xCE, 0x0E, 0xAE, 0xCE, 0xCE, 0x36, 0x8E, 0xB6, + 0x0E, 0x5F, 0x2D, 0xEA, 0xBF, 0x06, 0xFF, 0x22, 0x62, 0x62, 0xE3, 0xFE, + 0xE5, 0xCF, 0xAB, 0x70, 0x40, 0x00, 0x00, 0xE1, 0x74, 0x7E, 0xD1, 0xFE, + 0x2C, 0x2F, 0xB3, 0x1A, 0x80, 0x3B, 0x06, 0x80, 0x6D, 0xFE, 0xA2, 0x25, + 0xEE, 0x04, 0x68, 0x5E, 0x0B, 0xA0, 0x75, 0xF7, 0x8B, 0x66, 0xB2, 0x0F, + 0x40, 0xB5, 0x00, 0xA0, 0xE9, 0xDA, 0x57, 0xF3, 0x70, 0xF8, 0x7E, 0x3C, + 0x3C, 0x45, 0xA1, 0x90, 0xB9, 0xD9, 0xD9, 0xE5, 0xE4, 0xE4, 0xD8, 0x4A, + 0xC4, 0x42, 0x5B, 0x61, 0xCA, 0x57, 0x7D, 0xFE, 0x67, 0xC2, 0x5F, 0xC0, + 0x57, 0xFD, 0x6C, 0xF9, 0x7E, 0x3C, 0xFC, 0xF7, 0xF5, 0xE0, 0xBE, 0xE2, + 0x24, 0x81, 0x32, 0x5D, 0x81, 0x47, 0x04, 0xF8, 0xE0, 0xC2, 0xCC, 0xF4, + 0x4C, 0xA5, 0x1C, 0xCF, 0x92, 0x09, 0x84, 0x62, 0xDC, 0xE6, 0x8F, 0x47, + 0xFC, 0xB7, 0x0B, 0xFF, 0xFC, 0x1D, 0xD3, 0x22, 0xC4, 0x49, 0x62, 0xB9, + 0x58, 0x2A, 0x14, 0xE3, 0x51, 0x12, 0x71, 0x8E, 0x44, 0x9A, 0x8C, 0xF3, + 0x32, 0xA5, 0x22, 0x89, 0x42, 0x92, 0x29, 0xC5, 0x25, 0xD2, 0xFF, 0x64, + 0xE2, 0xDF, 0x2C, 0xFB, 0x03, 0x3E, 0xDF, 0x35, 0x00, 0xB0, 0x6A, 0x3E, + 0x01, 0x7B, 0x91, 0x2D, 0xA8, 0x5D, 0x63, 0x03, 0xF6, 0x4B, 0x27, 0x10, + 0x58, 0x74, 0xC0, 0xE2, 0xF7, 0x00, 0x00, 0xF2, 0xBB, 0x6F, 0xC1, 0xD4, + 0x28, 0x08, 0x03, 0x80, 0x68, 0x83, 0xE1, 0xCF, 0x77, 0xFF, 0xEF, 0x3F, + 0xFD, 0x47, 0xA0, 0x25, 0x00, 0x80, 0x66, 0x49, 0x92, 0x71, 0x00, 0x00, + 0x5E, 0x44, 0x24, 0x2E, 0x54, 0xCA, 0xB3, 0x3F, 0xC7, 0x08, 0x00, 0x00, + 0x44, 0xA0, 0x81, 0x2A, 0xB0, 0x41, 0x1B, 0xF4, 0xC1, 0x18, 0x2C, 0xC0, + 0x06, 0x1C, 0xC1, 0x05, 0xDC, 0xC1, 0x0B, 0xFC, 0x60, 0x36, 0x84, 0x42, + 0x24, 0xC4, 0xC2, 0x42, 0x10, 0x42, 0x0A, 0x64, 0x80, 0x1C, 0x72, 0x60, + 0x29, 0xAC, 0x82, 0x42, 0x28, 0x86, 0xCD, 0xB0, 0x1D, 0x2A, 0x60, 0x2F, + 0xD4, 0x40, 0x1D, 0x34, 0xC0, 0x51, 0x68, 0x86, 0x93, 0x70, 0x0E, 0x2E, + 0xC2, 0x55, 0xB8, 0x0E, 0x3D, 0x70, 0x0F, 0xFA, 0x61, 0x08, 0x9E, 0xC1, + 0x28, 0xBC, 0x81, 0x09, 0x04, 0x41, 0xC8, 0x08, 0x13, 0x61, 0x21, 0xDA, + 0x88, 0x01, 0x62, 0x8A, 0x58, 0x23, 0x8E, 0x08, 0x17, 0x99, 0x85, 0xF8, + 0x21, 0xC1, 0x48, 0x04, 0x12, 0x8B, 0x24, 0x20, 0xC9, 0x88, 0x14, 0x51, + 0x22, 0x4B, 0x91, 0x35, 0x48, 0x31, 0x52, 0x8A, 0x54, 0x20, 0x55, 0x48, + 0x1D, 0xF2, 0x3D, 0x72, 0x02, 0x39, 0x87, 0x5C, 0x46, 0xBA, 0x91, 0x3B, + 0xC8, 0x00, 0x32, 0x82, 0xFC, 0x86, 0xBC, 0x47, 0x31, 0x94, 0x81, 0xB2, + 0x51, 0x3D, 0xD4, 0x0C, 0xB5, 0x43, 0xB9, 0xA8, 0x37, 0x1A, 0x84, 0x46, + 0xA2, 0x0B, 0xD0, 0x64, 0x74, 0x31, 0x9A, 0x8F, 0x16, 0xA0, 0x9B, 0xD0, + 0x72, 0xB4, 0x1A, 0x3D, 0x8C, 0x36, 0xA1, 0xE7, 0xD0, 0xAB, 0x68, 0x0F, + 0xDA, 0x8F, 0x3E, 0x43, 0xC7, 0x30, 0xC0, 0xE8, 0x18, 0x07, 0x33, 0xC4, + 0x6C, 0x30, 0x2E, 0xC6, 0xC3, 0x42, 0xB1, 0x38, 0x2C, 0x09, 0x93, 0x63, + 0xCB, 0xB1, 0x22, 0xAC, 0x0C, 0xAB, 0xC6, 0x1A, 0xB0, 0x56, 0xAC, 0x03, + 0xBB, 0x89, 0xF5, 0x63, 0xCF, 0xB1, 0x77, 0x04, 0x12, 0x81, 0x45, 0xC0, + 0x09, 0x36, 0x04, 0x77, 0x42, 0x20, 0x61, 0x1E, 0x41, 0x48, 0x58, 0x4C, + 0x58, 0x4E, 0xD8, 0x48, 0xA8, 0x20, 0x1C, 0x24, 0x34, 0x11, 0xDA, 0x09, + 0x37, 0x09, 0x03, 0x84, 0x51, 0xC2, 0x27, 0x22, 0x93, 0xA8, 0x4B, 0xB4, + 0x26, 0xBA, 0x11, 0xF9, 0xC4, 0x18, 0x62, 0x32, 0x31, 0x87, 0x58, 0x48, + 0x2C, 0x23, 0xD6, 0x12, 0x8F, 0x13, 0x2F, 0x10, 0x7B, 0x88, 0x43, 0xC4, + 0x37, 0x24, 0x12, 0x89, 0x43, 0x32, 0x27, 0xB9, 0x90, 0x02, 0x49, 0xB1, + 0xA4, 0x54, 0xD2, 0x12, 0xD2, 0x46, 0xD2, 0x6E, 0x52, 0x23, 0xE9, 0x2C, + 0xA9, 0x9B, 0x34, 0x48, 0x1A, 0x23, 0x93, 0xC9, 0xDA, 0x64, 0x6B, 0xB2, + 0x07, 0x39, 0x94, 0x2C, 0x20, 0x2B, 0xC8, 0x85, 0xE4, 0x9D, 0xE4, 0xC3, + 0xE4, 0x33, 0xE4, 0x1B, 0xE4, 0x21, 0xF2, 0x5B, 0x0A, 0x9D, 0x62, 0x40, + 0x71, 0xA4, 0xF8, 0x53, 0xE2, 0x28, 0x52, 0xCA, 0x6A, 0x4A, 0x19, 0xE5, + 0x10, 0xE5, 0x34, 0xE5, 0x06, 0x65, 0x98, 0x32, 0x41, 0x55, 0xA3, 0x9A, + 0x52, 0xDD, 0xA8, 0xA1, 0x54, 0x11, 0x35, 0x8F, 0x5A, 0x42, 0xAD, 0xA1, + 0xB6, 0x52, 0xAF, 0x51, 0x87, 0xA8, 0x13, 0x34, 0x75, 0x9A, 0x39, 0xCD, + 0x83, 0x16, 0x49, 0x4B, 0xA5, 0xAD, 0xA2, 0x95, 0xD3, 0x1A, 0x68, 0x17, + 0x68, 0xF7, 0x69, 0xAF, 0xE8, 0x74, 0xBA, 0x11, 0xDD, 0x95, 0x1E, 0x4E, + 0x97, 0xD0, 0x57, 0xD2, 0xCB, 0xE9, 0x47, 0xE8, 0x97, 0xE8, 0x03, 0xF4, + 0x77, 0x0C, 0x0D, 0x86, 0x15, 0x83, 0xC7, 0x88, 0x67, 0x28, 0x19, 0x9B, + 0x18, 0x07, 0x18, 0x67, 0x19, 0x77, 0x18, 0xAF, 0x98, 0x4C, 0xA6, 0x19, + 0xD3, 0x8B, 0x19, 0xC7, 0x54, 0x30, 0x37, 0x31, 0xEB, 0x98, 0xE7, 0x99, + 0x0F, 0x99, 0x6F, 0x55, 0x58, 0x2A, 0xB6, 0x2A, 0x7C, 0x15, 0x91, 0xCA, + 0x0A, 0x95, 0x4A, 0x95, 0x26, 0x95, 0x1B, 0x2A, 0x2F, 0x54, 0xA9, 0xAA, + 0xA6, 0xAA, 0xDE, 0xAA, 0x0B, 0x55, 0xF3, 0x55, 0xCB, 0x54, 0x8F, 0xA9, + 0x5E, 0x53, 0x7D, 0xAE, 0x46, 0x55, 0x33, 0x53, 0xE3, 0xA9, 0x09, 0xD4, + 0x96, 0xAB, 0x55, 0xAA, 0x9D, 0x50, 0xEB, 0x53, 0x1B, 0x53, 0x67, 0xA9, + 0x3B, 0xA8, 0x87, 0xAA, 0x67, 0xA8, 0x6F, 0x54, 0x3F, 0xA4, 0x7E, 0x59, + 0xFD, 0x89, 0x06, 0x59, 0xC3, 0x4C, 0xC3, 0x4F, 0x43, 0xA4, 0x51, 0xA0, + 0xB1, 0x5F, 0xE3, 0xBC, 0xC6, 0x20, 0x0B, 0x63, 0x19, 0xB3, 0x78, 0x2C, + 0x21, 0x6B, 0x0D, 0xAB, 0x86, 0x75, 0x81, 0x35, 0xC4, 0x26, 0xB1, 0xCD, + 0xD9, 0x7C, 0x76, 0x2A, 0xBB, 0x98, 0xFD, 0x1D, 0xBB, 0x8B, 0x3D, 0xAA, + 0xA9, 0xA1, 0x39, 0x43, 0x33, 0x4A, 0x33, 0x57, 0xB3, 0x52, 0xF3, 0x94, + 0x66, 0x3F, 0x07, 0xE3, 0x98, 0x71, 0xF8, 0x9C, 0x74, 0x4E, 0x09, 0xE7, + 0x28, 0xA7, 0x97, 0xF3, 0x7E, 0x8A, 0xDE, 0x14, 0xEF, 0x29, 0xE2, 0x29, + 0x1B, 0xA6, 0x34, 0x4C, 0xB9, 0x31, 0x65, 0x5C, 0x6B, 0xAA, 0x96, 0x97, + 0x96, 0x58, 0xAB, 0x48, 0xAB, 0x51, 0xAB, 0x47, 0xEB, 0xBD, 0x36, 0xAE, + 0xED, 0xA7, 0x9D, 0xA6, 0xBD, 0x45, 0xBB, 0x59, 0xFB, 0x81, 0x0E, 0x41, + 0xC7, 0x4A, 0x27, 0x5C, 0x27, 0x47, 0x67, 0x8F, 0xCE, 0x05, 0x9D, 0xE7, + 0x53, 0xD9, 0x53, 0xDD, 0xA7, 0x0A, 0xA7, 0x16, 0x4D, 0x3D, 0x3A, 0xF5, + 0xAE, 0x2E, 0xAA, 0x6B, 0xA5, 0x1B, 0xA1, 0xBB, 0x44, 0x77, 0xBF, 0x6E, + 0xA7, 0xEE, 0x98, 0x9E, 0xBE, 0x5E, 0x80, 0x9E, 0x4C, 0x6F, 0xA7, 0xDE, + 0x79, 0xBD, 0xE7, 0xFA, 0x1C, 0x7D, 0x2F, 0xFD, 0x54, 0xFD, 0x6D, 0xFA, + 0xA7, 0xF5, 0x47, 0x0C, 0x58, 0x06, 0xB3, 0x0C, 0x24, 0x06, 0xDB, 0x0C, + 0xCE, 0x18, 0x3C, 0xC5, 0x35, 0x71, 0x6F, 0x3C, 0x1D, 0x2F, 0xC7, 0xDB, + 0xF1, 0x51, 0x43, 0x5D, 0xC3, 0x40, 0x43, 0xA5, 0x61, 0x95, 0x61, 0x97, + 0xE1, 0x84, 0x91, 0xB9, 0xD1, 0x3C, 0xA3, 0xD5, 0x46, 0x8D, 0x46, 0x0F, + 0x8C, 0x69, 0xC6, 0x5C, 0xE3, 0x24, 0xE3, 0x6D, 0xC6, 0x6D, 0xC6, 0xA3, + 0x26, 0x06, 0x26, 0x21, 0x26, 0x4B, 0x4D, 0xEA, 0x4D, 0xEE, 0x9A, 0x52, + 0x4D, 0xB9, 0xA6, 0x29, 0xA6, 0x3B, 0x4C, 0x3B, 0x4C, 0xC7, 0xCD, 0xCC, + 0xCD, 0xA2, 0xCD, 0xD6, 0x99, 0x35, 0x9B, 0x3D, 0x31, 0xD7, 0x32, 0xE7, + 0x9B, 0xE7, 0x9B, 0xD7, 0x9B, 0xDF, 0xB7, 0x60, 0x5A, 0x78, 0x5A, 0x2C, + 0xB6, 0xA8, 0xB6, 0xB8, 0x65, 0x49, 0xB2, 0xE4, 0x5A, 0xA6, 0x59, 0xEE, + 0xB6, 0xBC, 0x6E, 0x85, 0x5A, 0x39, 0x59, 0xA5, 0x58, 0x55, 0x5A, 0x5D, + 0xB3, 0x46, 0xAD, 0x9D, 0xAD, 0x25, 0xD6, 0xBB, 0xAD, 0xBB, 0xA7, 0x11, + 0xA7, 0xB9, 0x4E, 0x93, 0x4E, 0xAB, 0x9E, 0xD6, 0x67, 0xC3, 0xB0, 0xF1, + 0xB6, 0xC9, 0xB6, 0xA9, 0xB7, 0x19, 0xB0, 0xE5, 0xD8, 0x06, 0xDB, 0xAE, + 0xB6, 0x6D, 0xB6, 0x7D, 0x61, 0x67, 0x62, 0x17, 0x67, 0xB7, 0xC5, 0xAE, + 0xC3, 0xEE, 0x93, 0xBD, 0x93, 0x7D, 0xBA, 0x7D, 0x8D, 0xFD, 0x3D, 0x07, + 0x0D, 0x87, 0xD9, 0x0E, 0xAB, 0x1D, 0x5A, 0x1D, 0x7E, 0x73, 0xB4, 0x72, + 0x14, 0x3A, 0x56, 0x3A, 0xDE, 0x9A, 0xCE, 0x9C, 0xEE, 0x3F, 0x7D, 0xC5, + 0xF4, 0x96, 0xE9, 0x2F, 0x67, 0x58, 0xCF, 0x10, 0xCF, 0xD8, 0x33, 0xE3, + 0xB6, 0x13, 0xCB, 0x29, 0xC4, 0x69, 0x9D, 0x53, 0x9B, 0xD3, 0x47, 0x67, + 0x17, 0x67, 0xB9, 0x73, 0x83, 0xF3, 0x88, 0x8B, 0x89, 0x4B, 0x82, 0xCB, + 0x2E, 0x97, 0x3E, 0x2E, 0x9B, 0x1B, 0xC6, 0xDD, 0xC8, 0xBD, 0xE4, 0x4A, + 0x74, 0xF5, 0x71, 0x5D, 0xE1, 0x7A, 0xD2, 0xF5, 0x9D, 0x9B, 0xB3, 0x9B, + 0xC2, 0xED, 0xA8, 0xDB, 0xAF, 0xEE, 0x36, 0xEE, 0x69, 0xEE, 0x87, 0xDC, + 0x9F, 0xCC, 0x34, 0x9F, 0x29, 0x9E, 0x59, 0x33, 0x73, 0xD0, 0xC3, 0xC8, + 0x43, 0xE0, 0x51, 0xE5, 0xD1, 0x3F, 0x0B, 0x9F, 0x95, 0x30, 0x6B, 0xDF, + 0xAC, 0x7E, 0x4F, 0x43, 0x4F, 0x81, 0x67, 0xB5, 0xE7, 0x23, 0x2F, 0x63, + 0x2F, 0x91, 0x57, 0xAD, 0xD7, 0xB0, 0xB7, 0xA5, 0x77, 0xAA, 0xF7, 0x61, + 0xEF, 0x17, 0x3E, 0xF6, 0x3E, 0x72, 0x9F, 0xE3, 0x3E, 0xE3, 0x3C, 0x37, + 0xDE, 0x32, 0xDE, 0x59, 0x5F, 0xCC, 0x37, 0xC0, 0xB7, 0xC8, 0xB7, 0xCB, + 0x4F, 0xC3, 0x6F, 0x9E, 0x5F, 0x85, 0xDF, 0x43, 0x7F, 0x23, 0xFF, 0x64, + 0xFF, 0x7A, 0xFF, 0xD1, 0x00, 0xA7, 0x80, 0x25, 0x01, 0x67, 0x03, 0x89, + 0x81, 0x41, 0x81, 0x5B, 0x02, 0xFB, 0xF8, 0x7A, 0x7C, 0x21, 0xBF, 0x8E, + 0x3F, 0x3A, 0xDB, 0x65, 0xF6, 0xB2, 0xD9, 0xED, 0x41, 0x8C, 0xA0, 0xB9, + 0x41, 0x15, 0x41, 0x8F, 0x82, 0xAD, 0x82, 0xE5, 0xC1, 0xAD, 0x21, 0x68, + 0xC8, 0xEC, 0x90, 0xAD, 0x21, 0xF7, 0xE7, 0x98, 0xCE, 0x91, 0xCE, 0x69, + 0x0E, 0x85, 0x50, 0x7E, 0xE8, 0xD6, 0xD0, 0x07, 0x61, 0xE6, 0x61, 0x8B, + 0xC3, 0x7E, 0x0C, 0x27, 0x85, 0x87, 0x85, 0x57, 0x86, 0x3F, 0x8E, 0x70, + 0x88, 0x58, 0x1A, 0xD1, 0x31, 0x97, 0x35, 0x77, 0xD1, 0xDC, 0x43, 0x73, + 0xDF, 0x44, 0xFA, 0x44, 0x96, 0x44, 0xDE, 0x9B, 0x67, 0x31, 0x4F, 0x39, + 0xAF, 0x2D, 0x4A, 0x35, 0x2A, 0x3E, 0xAA, 0x2E, 0x6A, 0x3C, 0xDA, 0x37, + 0xBA, 0x34, 0xBA, 0x3F, 0xC6, 0x2E, 0x66, 0x59, 0xCC, 0xD5, 0x58, 0x9D, + 0x58, 0x49, 0x6C, 0x4B, 0x1C, 0x39, 0x2E, 0x2A, 0xAE, 0x36, 0x6E, 0x6C, + 0xBE, 0xDF, 0xFC, 0xED, 0xF3, 0x87, 0xE2, 0x9D, 0xE2, 0x0B, 0xE3, 0x7B, + 0x17, 0x98, 0x2F, 0xC8, 0x5D, 0x70, 0x79, 0xA1, 0xCE, 0xC2, 0xF4, 0x85, + 0xA7, 0x16, 0xA9, 0x2E, 0x12, 0x2C, 0x3A, 0x96, 0x40, 0x4C, 0x88, 0x4E, + 0x38, 0x94, 0xF0, 0x41, 0x10, 0x2A, 0xA8, 0x16, 0x8C, 0x25, 0xF2, 0x13, + 0x77, 0x25, 0x8E, 0x0A, 0x79, 0xC2, 0x1D, 0xC2, 0x67, 0x22, 0x2F, 0xD1, + 0x36, 0xD1, 0x88, 0xD8, 0x43, 0x5C, 0x2A, 0x1E, 0x4E, 0xF2, 0x48, 0x2A, + 0x4D, 0x7A, 0x92, 0xEC, 0x91, 0xBC, 0x35, 0x79, 0x24, 0xC5, 0x33, 0xA5, + 0x2C, 0xE5, 0xB9, 0x84, 0x27, 0xA9, 0x90, 0xBC, 0x4C, 0x0D, 0x4C, 0xDD, + 0x9B, 0x3A, 0x9E, 0x16, 0x9A, 0x76, 0x20, 0x6D, 0x32, 0x3D, 0x3A, 0xBD, + 0x31, 0x83, 0x92, 0x91, 0x90, 0x71, 0x42, 0xAA, 0x21, 0x4D, 0x93, 0xB6, + 0x67, 0xEA, 0x67, 0xE6, 0x66, 0x76, 0xCB, 0xAC, 0x65, 0x85, 0xB2, 0xFE, + 0xC5, 0x6E, 0x8B, 0xB7, 0x2F, 0x1E, 0x95, 0x07, 0xC9, 0x6B, 0xB3, 0x90, + 0xAC, 0x05, 0x59, 0x2D, 0x0A, 0xB6, 0x42, 0xA6, 0xE8, 0x54, 0x5A, 0x28, + 0xD7, 0x2A, 0x07, 0xB2, 0x67, 0x65, 0x57, 0x66, 0xBF, 0xCD, 0x89, 0xCA, + 0x39, 0x96, 0xAB, 0x9E, 0x2B, 0xCD, 0xED, 0xCC, 0xB3, 0xCA, 0xDB, 0x90, + 0x37, 0x9C, 0xEF, 0x9F, 0xFF, 0xED, 0x12, 0xC2, 0x12, 0xE1, 0x92, 0xB6, + 0xA5, 0x86, 0x4B, 0x57, 0x2D, 0x1D, 0x58, 0xE6, 0xBD, 0xAC, 0x6A, 0x39, + 0xB2, 0x3C, 0x71, 0x79, 0xDB, 0x0A, 0xE3, 0x15, 0x05, 0x2B, 0x86, 0x56, + 0x06, 0xAC, 0x3C, 0xB8, 0x8A, 0xB6, 0x2A, 0x6D, 0xD5, 0x4F, 0xAB, 0xED, + 0x57, 0x97, 0xAE, 0x7E, 0xBD, 0x26, 0x7A, 0x4D, 0x6B, 0x81, 0x5E, 0xC1, + 0xCA, 0x82, 0xC1, 0xB5, 0x01, 0x6B, 0xEB, 0x0B, 0x55, 0x0A, 0xE5, 0x85, + 0x7D, 0xEB, 0xDC, 0xD7, 0xED, 0x5D, 0x4F, 0x58, 0x2F, 0x59, 0xDF, 0xB5, + 0x61, 0xFA, 0x86, 0x9D, 0x1B, 0x3E, 0x15, 0x89, 0x8A, 0xAE, 0x14, 0xDB, + 0x17, 0x97, 0x15, 0x7F, 0xD8, 0x28, 0xDC, 0x78, 0xE5, 0x1B, 0x87, 0x6F, + 0xCA, 0xBF, 0x99, 0xDC, 0x94, 0xB4, 0xA9, 0xAB, 0xC4, 0xB9, 0x64, 0xCF, + 0x66, 0xD2, 0x66, 0xE9, 0xE6, 0xDE, 0x2D, 0x9E, 0x5B, 0x0E, 0x96, 0xAA, + 0x97, 0xE6, 0x97, 0x0E, 0x6E, 0x0D, 0xD9, 0xDA, 0xB4, 0x0D, 0xDF, 0x56, + 0xB4, 0xED, 0xF5, 0xF6, 0x45, 0xDB, 0x2F, 0x97, 0xCD, 0x28, 0xDB, 0xBB, + 0x83, 0xB6, 0x43, 0xB9, 0xA3, 0xBF, 0x3C, 0xB8, 0xBC, 0x65, 0xA7, 0xC9, + 0xCE, 0xCD, 0x3B, 0x3F, 0x54, 0xA4, 0x54, 0xF4, 0x54, 0xFA, 0x54, 0x36, + 0xEE, 0xD2, 0xDD, 0xB5, 0x61, 0xD7, 0xF8, 0x6E, 0xD1, 0xEE, 0x1B, 0x7B, + 0xBC, 0xF6, 0x34, 0xEC, 0xD5, 0xDB, 0x5B, 0xBC, 0xF7, 0xFD, 0x3E, 0xC9, + 0xBE, 0xDB, 0x55, 0x01, 0x55, 0x4D, 0xD5, 0x66, 0xD5, 0x65, 0xFB, 0x49, + 0xFB, 0xB3, 0xF7, 0x3F, 0xAE, 0x89, 0xAA, 0xE9, 0xF8, 0x96, 0xFB, 0x6D, + 0x5D, 0xAD, 0x4E, 0x6D, 0x71, 0xED, 0xC7, 0x03, 0xD2, 0x03, 0xFD, 0x07, + 0x23, 0x0E, 0xB6, 0xD7, 0xB9, 0xD4, 0xD5, 0x1D, 0xD2, 0x3D, 0x54, 0x52, + 0x8F, 0xD6, 0x2B, 0xEB, 0x47, 0x0E, 0xC7, 0x1F, 0xBE, 0xFE, 0x9D, 0xEF, + 0x77, 0x2D, 0x0D, 0x36, 0x0D, 0x55, 0x8D, 0x9C, 0xC6, 0xE2, 0x23, 0x70, + 0x44, 0x79, 0xE4, 0xE9, 0xF7, 0x09, 0xDF, 0xF7, 0x1E, 0x0D, 0x3A, 0xDA, + 0x76, 0x8C, 0x7B, 0xAC, 0xE1, 0x07, 0xD3, 0x1F, 0x76, 0x1D, 0x67, 0x1D, + 0x2F, 0x6A, 0x42, 0x9A, 0xF2, 0x9A, 0x46, 0x9B, 0x53, 0x9A, 0xFB, 0x5B, + 0x62, 0x5B, 0xBA, 0x4F, 0xCC, 0x3E, 0xD1, 0xD6, 0xEA, 0xDE, 0x7A, 0xFC, + 0x47, 0xDB, 0x1F, 0x0F, 0x9C, 0x34, 0x3C, 0x59, 0x79, 0x4A, 0xF3, 0x54, + 0xC9, 0x69, 0xDA, 0xE9, 0x82, 0xD3, 0x93, 0x67, 0xF2, 0xCF, 0x8C, 0x9D, + 0x95, 0x9D, 0x7D, 0x7E, 0x2E, 0xF9, 0xDC, 0x60, 0xDB, 0xA2, 0xB6, 0x7B, + 0xE7, 0x63, 0xCE, 0xDF, 0x6A, 0x0F, 0x6F, 0xEF, 0xBA, 0x10, 0x74, 0xE1, + 0xD2, 0x45, 0xFF, 0x8B, 0xE7, 0x3B, 0xBC, 0x3B, 0xCE, 0x5C, 0xF2, 0xB8, + 0x74, 0xF2, 0xB2, 0xDB, 0xE5, 0x13, 0x57, 0xB8, 0x57, 0x9A, 0xAF, 0x3A, + 0x5F, 0x6D, 0xEA, 0x74, 0xEA, 0x3C, 0xFE, 0x93, 0xD3, 0x4F, 0xC7, 0xBB, + 0x9C, 0xBB, 0x9A, 0xAE, 0xB9, 0x5C, 0x6B, 0xB9, 0xEE, 0x7A, 0xBD, 0xB5, + 0x7B, 0x66, 0xF7, 0xE9, 0x1B, 0x9E, 0x37, 0xCE, 0xDD, 0xF4, 0xBD, 0x79, + 0xF1, 0x16, 0xFF, 0xD6, 0xD5, 0x9E, 0x39, 0x3D, 0xDD, 0xBD, 0xF3, 0x7A, + 0x6F, 0xF7, 0xC5, 0xF7, 0xF5, 0xDF, 0x16, 0xDD, 0x7E, 0x72, 0x27, 0xFD, + 0xCE, 0xCB, 0xBB, 0xD9, 0x77, 0x27, 0xEE, 0xAD, 0xBC, 0x4F, 0xBC, 0x5F, + 0xF4, 0x40, 0xED, 0x41, 0xD9, 0x43, 0xDD, 0x87, 0xD5, 0x3F, 0x5B, 0xFE, + 0xDC, 0xD8, 0xEF, 0xDC, 0x7F, 0x6A, 0xC0, 0x77, 0xA0, 0xF3, 0xD1, 0xDC, + 0x47, 0xF7, 0x06, 0x85, 0x83, 0xCF, 0xFE, 0x91, 0xF5, 0x8F, 0x0F, 0x43, + 0x05, 0x8F, 0x99, 0x8F, 0xCB, 0x86, 0x0D, 0x86, 0xEB, 0x9E, 0x38, 0x3E, + 0x39, 0x39, 0xE2, 0x3F, 0x72, 0xFD, 0xE9, 0xFC, 0xA7, 0x43, 0xCF, 0x64, + 0xCF, 0x26, 0x9E, 0x17, 0xFE, 0xA2, 0xFE, 0xCB, 0xAE, 0x17, 0x16, 0x2F, + 0x7E, 0xF8, 0xD5, 0xEB, 0xD7, 0xCE, 0xD1, 0x98, 0xD1, 0xA1, 0x97, 0xF2, + 0x97, 0x93, 0xBF, 0x6D, 0x7C, 0xA5, 0xFD, 0xEA, 0xC0, 0xEB, 0x19, 0xAF, + 0xDB, 0xC6, 0xC2, 0xC6, 0x1E, 0xBE, 0xC9, 0x78, 0x33, 0x31, 0x5E, 0xF4, + 0x56, 0xFB, 0xED, 0xC1, 0x77, 0xDC, 0x77, 0x1D, 0xEF, 0xA3, 0xDF, 0x0F, + 0x4F, 0xE4, 0x7C, 0x20, 0x7F, 0x28, 0xFF, 0x68, 0xF9, 0xB1, 0xF5, 0x53, + 0xD0, 0xA7, 0xFB, 0x93, 0x19, 0x93, 0x93, 0xFF, 0x04, 0x03, 0x98, 0xF3, + 0xFC, 0x63, 0x33, 0x2D, 0xDB, 0x00, 0x00, 0x3A, 0xFD, 0x69, 0x54, 0x58, + 0x74, 0x58, 0x4D, 0x4C, 0x3A, 0x63, 0x6F, 0x6D, 0x2E, 0x61, 0x64, 0x6F, + 0x62, 0x65, 0x2E, 0x78, 0x6D, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, + 0x3F, 0x78, 0x70, 0x61, 0x63, 0x6B, 0x65, 0x74, 0x20, 0x62, 0x65, 0x67, + 0x69, 0x6E, 0x3D, 0x22, 0xEF, 0xBB, 0xBF, 0x22, 0x20, 0x69, 0x64, 0x3D, + 0x22, 0x57, 0x35, 0x4D, 0x30, 0x4D, 0x70, 0x43, 0x65, 0x68, 0x69, 0x48, + 0x7A, 0x72, 0x65, 0x53, 0x7A, 0x4E, 0x54, 0x63, 0x7A, 0x6B, 0x63, 0x39, + 0x64, 0x22, 0x3F, 0x3E, 0x0A, 0x3C, 0x78, 0x3A, 0x78, 0x6D, 0x70, 0x6D, + 0x65, 0x74, 0x61, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, 0x3A, 0x78, 0x3D, + 0x22, 0x61, 0x64, 0x6F, 0x62, 0x65, 0x3A, 0x6E, 0x73, 0x3A, 0x6D, 0x65, + 0x74, 0x61, 0x2F, 0x22, 0x20, 0x78, 0x3A, 0x78, 0x6D, 0x70, 0x74, 0x6B, + 0x3D, 0x22, 0x41, 0x64, 0x6F, 0x62, 0x65, 0x20, 0x58, 0x4D, 0x50, 0x20, + 0x43, 0x6F, 0x72, 0x65, 0x20, 0x35, 0x2E, 0x36, 0x2D, 0x63, 0x31, 0x33, + 0x38, 0x20, 0x37, 0x39, 0x2E, 0x31, 0x35, 0x39, 0x38, 0x32, 0x34, 0x2C, + 0x20, 0x32, 0x30, 0x31, 0x36, 0x2F, 0x30, 0x39, 0x2F, 0x31, 0x34, 0x2D, + 0x30, 0x31, 0x3A, 0x30, 0x39, 0x3A, 0x30, 0x31, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x3C, 0x72, + 0x64, 0x66, 0x3A, 0x52, 0x44, 0x46, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, + 0x3A, 0x72, 0x64, 0x66, 0x3D, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, + 0x2F, 0x77, 0x77, 0x77, 0x2E, 0x77, 0x33, 0x2E, 0x6F, 0x72, 0x67, 0x2F, + 0x31, 0x39, 0x39, 0x39, 0x2F, 0x30, 0x32, 0x2F, 0x32, 0x32, 0x2D, 0x72, + 0x64, 0x66, 0x2D, 0x73, 0x79, 0x6E, 0x74, 0x61, 0x78, 0x2D, 0x6E, 0x73, + 0x23, 0x22, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, + 0x64, 0x66, 0x3A, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6F, 0x6E, 0x20, 0x72, 0x64, 0x66, 0x3A, 0x61, 0x62, 0x6F, 0x75, 0x74, + 0x3D, 0x22, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, 0x3A, 0x78, 0x6D, + 0x70, 0x3D, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x6E, 0x73, + 0x2E, 0x61, 0x64, 0x6F, 0x62, 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x78, + 0x61, 0x70, 0x2F, 0x31, 0x2E, 0x30, 0x2F, 0x22, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, 0x6C, + 0x6E, 0x73, 0x3A, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3D, 0x22, 0x68, 0x74, + 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x6E, 0x73, 0x2E, 0x61, 0x64, 0x6F, 0x62, + 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x78, 0x61, 0x70, 0x2F, 0x31, 0x2E, + 0x30, 0x2F, 0x6D, 0x6D, 0x2F, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, + 0x3A, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3D, 0x22, 0x68, 0x74, 0x74, 0x70, + 0x3A, 0x2F, 0x2F, 0x6E, 0x73, 0x2E, 0x61, 0x64, 0x6F, 0x62, 0x65, 0x2E, + 0x63, 0x6F, 0x6D, 0x2F, 0x78, 0x61, 0x70, 0x2F, 0x31, 0x2E, 0x30, 0x2F, + 0x73, 0x54, 0x79, 0x70, 0x65, 0x2F, 0x52, 0x65, 0x73, 0x6F, 0x75, 0x72, + 0x63, 0x65, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x23, 0x22, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, + 0x6C, 0x6E, 0x73, 0x3A, 0x70, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, + 0x70, 0x3D, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x6E, 0x73, + 0x2E, 0x61, 0x64, 0x6F, 0x62, 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x70, + 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x2F, 0x31, 0x2E, 0x30, + 0x2F, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, 0x3A, 0x64, 0x63, 0x3D, + 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x70, 0x75, 0x72, 0x6C, + 0x2E, 0x6F, 0x72, 0x67, 0x2F, 0x64, 0x63, 0x2F, 0x65, 0x6C, 0x65, 0x6D, + 0x65, 0x6E, 0x74, 0x73, 0x2F, 0x31, 0x2E, 0x31, 0x2F, 0x22, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, + 0x6D, 0x6C, 0x6E, 0x73, 0x3A, 0x74, 0x69, 0x66, 0x66, 0x3D, 0x22, 0x68, + 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x6E, 0x73, 0x2E, 0x61, 0x64, 0x6F, + 0x62, 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x74, 0x69, 0x66, 0x66, 0x2F, + 0x31, 0x2E, 0x30, 0x2F, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, 0x3A, + 0x65, 0x78, 0x69, 0x66, 0x3D, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, + 0x2F, 0x6E, 0x73, 0x2E, 0x61, 0x64, 0x6F, 0x62, 0x65, 0x2E, 0x63, 0x6F, + 0x6D, 0x2F, 0x65, 0x78, 0x69, 0x66, 0x2F, 0x31, 0x2E, 0x30, 0x2F, 0x22, + 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, + 0x78, 0x6D, 0x70, 0x3A, 0x43, 0x72, 0x65, 0x61, 0x74, 0x6F, 0x72, 0x54, + 0x6F, 0x6F, 0x6C, 0x3E, 0x41, 0x64, 0x6F, 0x62, 0x65, 0x20, 0x50, 0x68, + 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x20, 0x43, 0x43, 0x20, 0x32, + 0x30, 0x31, 0x37, 0x20, 0x28, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, + 0x29, 0x3C, 0x2F, 0x78, 0x6D, 0x70, 0x3A, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x6F, 0x72, 0x54, 0x6F, 0x6F, 0x6C, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x3A, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x65, 0x3E, 0x32, 0x30, 0x31, + 0x38, 0x2D, 0x30, 0x34, 0x2D, 0x30, 0x31, 0x54, 0x32, 0x32, 0x3A, 0x30, + 0x30, 0x3A, 0x33, 0x33, 0x2B, 0x30, 0x38, 0x3A, 0x30, 0x30, 0x3C, 0x2F, + 0x78, 0x6D, 0x70, 0x3A, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, + 0x74, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x3A, 0x4D, 0x65, 0x74, 0x61, 0x64, 0x61, + 0x74, 0x61, 0x44, 0x61, 0x74, 0x65, 0x3E, 0x32, 0x30, 0x31, 0x38, 0x2D, + 0x30, 0x34, 0x2D, 0x30, 0x31, 0x54, 0x32, 0x32, 0x3A, 0x30, 0x30, 0x3A, + 0x33, 0x33, 0x2B, 0x30, 0x38, 0x3A, 0x30, 0x30, 0x3C, 0x2F, 0x78, 0x6D, + 0x70, 0x3A, 0x4D, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x44, 0x61, + 0x74, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x3A, 0x4D, 0x6F, 0x64, 0x69, 0x66, 0x79, + 0x44, 0x61, 0x74, 0x65, 0x3E, 0x32, 0x30, 0x31, 0x38, 0x2D, 0x30, 0x34, + 0x2D, 0x30, 0x31, 0x54, 0x32, 0x32, 0x3A, 0x30, 0x30, 0x3A, 0x33, 0x33, + 0x2B, 0x30, 0x38, 0x3A, 0x30, 0x30, 0x3C, 0x2F, 0x78, 0x6D, 0x70, 0x3A, + 0x4D, 0x6F, 0x64, 0x69, 0x66, 0x79, 0x44, 0x61, 0x74, 0x65, 0x3E, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x78, 0x6D, + 0x70, 0x4D, 0x4D, 0x3A, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, + 0x49, 0x44, 0x3E, 0x78, 0x6D, 0x70, 0x2E, 0x69, 0x69, 0x64, 0x3A, 0x66, + 0x32, 0x30, 0x35, 0x37, 0x36, 0x34, 0x39, 0x2D, 0x37, 0x30, 0x65, 0x34, + 0x2D, 0x39, 0x35, 0x34, 0x39, 0x2D, 0x62, 0x65, 0x38, 0x61, 0x2D, 0x32, + 0x37, 0x63, 0x64, 0x38, 0x65, 0x38, 0x34, 0x34, 0x64, 0x31, 0x64, 0x3C, + 0x2F, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x49, 0x6E, 0x73, 0x74, 0x61, + 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x44, + 0x6F, 0x63, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x49, 0x44, 0x3E, 0x61, 0x64, + 0x6F, 0x62, 0x65, 0x3A, 0x64, 0x6F, 0x63, 0x69, 0x64, 0x3A, 0x70, 0x68, + 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x3A, 0x30, 0x36, 0x32, 0x33, + 0x62, 0x65, 0x64, 0x36, 0x2D, 0x33, 0x35, 0x62, 0x35, 0x2D, 0x31, 0x31, + 0x65, 0x38, 0x2D, 0x39, 0x31, 0x61, 0x34, 0x2D, 0x38, 0x38, 0x34, 0x37, + 0x30, 0x37, 0x30, 0x65, 0x31, 0x35, 0x34, 0x62, 0x3C, 0x2F, 0x78, 0x6D, + 0x70, 0x4D, 0x4D, 0x3A, 0x44, 0x6F, 0x63, 0x75, 0x6D, 0x65, 0x6E, 0x74, + 0x49, 0x44, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x4F, 0x72, 0x69, 0x67, + 0x69, 0x6E, 0x61, 0x6C, 0x44, 0x6F, 0x63, 0x75, 0x6D, 0x65, 0x6E, 0x74, + 0x49, 0x44, 0x3E, 0x78, 0x6D, 0x70, 0x2E, 0x64, 0x69, 0x64, 0x3A, 0x37, + 0x61, 0x32, 0x34, 0x30, 0x39, 0x32, 0x30, 0x2D, 0x63, 0x66, 0x39, 0x35, + 0x2D, 0x64, 0x39, 0x34, 0x38, 0x2D, 0x39, 0x62, 0x38, 0x66, 0x2D, 0x36, + 0x66, 0x66, 0x39, 0x62, 0x39, 0x31, 0x35, 0x37, 0x35, 0x39, 0x64, 0x3C, + 0x2F, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x4F, 0x72, 0x69, 0x67, 0x69, + 0x6E, 0x61, 0x6C, 0x44, 0x6F, 0x63, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x49, + 0x44, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x3C, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x48, 0x69, 0x73, 0x74, 0x6F, + 0x72, 0x79, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x64, 0x66, 0x3A, 0x53, 0x65, 0x71, + 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x64, 0x66, 0x3A, 0x6C, 0x69, + 0x20, 0x72, 0x64, 0x66, 0x3A, 0x70, 0x61, 0x72, 0x73, 0x65, 0x54, 0x79, + 0x70, 0x65, 0x3D, 0x22, 0x52, 0x65, 0x73, 0x6F, 0x75, 0x72, 0x63, 0x65, + 0x22, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, + 0x45, 0x76, 0x74, 0x3A, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x63, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, + 0x74, 0x3A, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x69, + 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3E, 0x78, 0x6D, + 0x70, 0x2E, 0x69, 0x69, 0x64, 0x3A, 0x37, 0x61, 0x32, 0x34, 0x30, 0x39, + 0x32, 0x30, 0x2D, 0x63, 0x66, 0x39, 0x35, 0x2D, 0x64, 0x39, 0x34, 0x38, + 0x2D, 0x39, 0x62, 0x38, 0x66, 0x2D, 0x36, 0x66, 0x66, 0x39, 0x62, 0x39, + 0x31, 0x35, 0x37, 0x35, 0x39, 0x64, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, + 0x74, 0x3A, 0x69, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, + 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x45, + 0x76, 0x74, 0x3A, 0x77, 0x68, 0x65, 0x6E, 0x3E, 0x32, 0x30, 0x31, 0x38, + 0x2D, 0x30, 0x34, 0x2D, 0x30, 0x31, 0x54, 0x32, 0x32, 0x3A, 0x30, 0x30, + 0x3A, 0x33, 0x33, 0x2B, 0x30, 0x38, 0x3A, 0x30, 0x30, 0x3C, 0x2F, 0x73, + 0x74, 0x45, 0x76, 0x74, 0x3A, 0x77, 0x68, 0x65, 0x6E, 0x3E, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, + 0x73, 0x6F, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x41, 0x67, 0x65, 0x6E, + 0x74, 0x3E, 0x41, 0x64, 0x6F, 0x62, 0x65, 0x20, 0x50, 0x68, 0x6F, 0x74, + 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x20, 0x43, 0x43, 0x20, 0x32, 0x30, 0x31, + 0x37, 0x20, 0x28, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x29, 0x3C, + 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x73, 0x6F, 0x66, 0x74, 0x77, + 0x61, 0x72, 0x65, 0x41, 0x67, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x3C, 0x2F, 0x72, 0x64, 0x66, 0x3A, 0x6C, 0x69, 0x3E, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x3C, 0x72, 0x64, 0x66, 0x3A, 0x6C, 0x69, 0x20, 0x72, 0x64, + 0x66, 0x3A, 0x70, 0x61, 0x72, 0x73, 0x65, 0x54, 0x79, 0x70, 0x65, 0x3D, + 0x22, 0x52, 0x65, 0x73, 0x6F, 0x75, 0x72, 0x63, 0x65, 0x22, 0x3E, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, + 0x3A, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x73, 0x61, 0x76, 0x65, + 0x64, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x61, 0x63, 0x74, + 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, + 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x69, 0x6E, 0x73, 0x74, 0x61, 0x6E, + 0x63, 0x65, 0x49, 0x44, 0x3E, 0x78, 0x6D, 0x70, 0x2E, 0x69, 0x69, 0x64, + 0x3A, 0x66, 0x32, 0x30, 0x35, 0x37, 0x36, 0x34, 0x39, 0x2D, 0x37, 0x30, + 0x65, 0x34, 0x2D, 0x39, 0x35, 0x34, 0x39, 0x2D, 0x62, 0x65, 0x38, 0x61, + 0x2D, 0x32, 0x37, 0x63, 0x64, 0x38, 0x65, 0x38, 0x34, 0x34, 0x64, 0x31, + 0x64, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x69, 0x6E, 0x73, + 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3E, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x77, 0x68, + 0x65, 0x6E, 0x3E, 0x32, 0x30, 0x31, 0x38, 0x2D, 0x30, 0x34, 0x2D, 0x30, + 0x31, 0x54, 0x32, 0x32, 0x3A, 0x30, 0x30, 0x3A, 0x33, 0x33, 0x2B, 0x30, + 0x38, 0x3A, 0x30, 0x30, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, + 0x77, 0x68, 0x65, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x73, 0x6F, 0x66, 0x74, 0x77, + 0x61, 0x72, 0x65, 0x41, 0x67, 0x65, 0x6E, 0x74, 0x3E, 0x41, 0x64, 0x6F, + 0x62, 0x65, 0x20, 0x50, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, + 0x20, 0x43, 0x43, 0x20, 0x32, 0x30, 0x31, 0x37, 0x20, 0x28, 0x57, 0x69, + 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x29, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, + 0x74, 0x3A, 0x73, 0x6F, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x41, 0x67, + 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, + 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x63, 0x68, 0x61, 0x6E, 0x67, 0x65, + 0x64, 0x3E, 0x2F, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x63, + 0x68, 0x61, 0x6E, 0x67, 0x65, 0x64, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, + 0x2F, 0x72, 0x64, 0x66, 0x3A, 0x6C, 0x69, 0x3E, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x72, + 0x64, 0x66, 0x3A, 0x53, 0x65, 0x71, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x78, 0x6D, 0x70, 0x4D, 0x4D, + 0x3A, 0x48, 0x69, 0x73, 0x74, 0x6F, 0x72, 0x79, 0x3E, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x70, 0x68, 0x6F, 0x74, + 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x3A, 0x44, 0x6F, 0x63, 0x75, 0x6D, 0x65, + 0x6E, 0x74, 0x41, 0x6E, 0x63, 0x65, 0x73, 0x74, 0x6F, 0x72, 0x73, 0x3E, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x3C, 0x72, 0x64, 0x66, 0x3A, 0x42, 0x61, 0x67, 0x3E, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x3C, 0x72, 0x64, 0x66, 0x3A, 0x6C, 0x69, 0x3E, 0x78, 0x6D, + 0x70, 0x2E, 0x64, 0x69, 0x64, 0x3A, 0x39, 0x30, 0x39, 0x62, 0x39, 0x65, + 0x35, 0x32, 0x2D, 0x39, 0x37, 0x62, 0x64, 0x2D, 0x34, 0x32, 0x39, 0x33, + 0x2D, 0x38, 0x30, 0x64, 0x32, 0x2D, 0x31, 0x31, 0x64, 0x65, 0x62, 0x64, + 0x36, 0x61, 0x33, 0x33, 0x65, 0x62, 0x3C, 0x2F, 0x72, 0x64, 0x66, 0x3A, + 0x6C, 0x69, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x72, 0x64, 0x66, 0x3A, 0x42, 0x61, + 0x67, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x3C, 0x2F, 0x70, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x3A, + 0x44, 0x6F, 0x63, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x41, 0x6E, 0x63, 0x65, + 0x73, 0x74, 0x6F, 0x72, 0x73, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3C, 0x70, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, + 0x6F, 0x70, 0x3A, 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x4D, 0x6F, 0x64, 0x65, + 0x3E, 0x33, 0x3C, 0x2F, 0x70, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, + 0x70, 0x3A, 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x4D, 0x6F, 0x64, 0x65, 0x3E, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x70, + 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x3A, 0x49, 0x43, 0x43, + 0x50, 0x72, 0x6F, 0x66, 0x69, 0x6C, 0x65, 0x3E, 0x73, 0x52, 0x47, 0x42, + 0x20, 0x49, 0x45, 0x43, 0x36, 0x31, 0x39, 0x36, 0x36, 0x2D, 0x32, 0x2E, + 0x31, 0x3C, 0x2F, 0x70, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, + 0x3A, 0x49, 0x43, 0x43, 0x50, 0x72, 0x6F, 0x66, 0x69, 0x6C, 0x65, 0x3E, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, + 0x63, 0x3A, 0x66, 0x6F, 0x72, 0x6D, 0x61, 0x74, 0x3E, 0x69, 0x6D, 0x61, + 0x67, 0x65, 0x2F, 0x70, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x63, 0x3A, 0x66, + 0x6F, 0x72, 0x6D, 0x61, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3C, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x4F, 0x72, + 0x69, 0x65, 0x6E, 0x74, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x31, 0x3C, + 0x2F, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x4F, 0x72, 0x69, 0x65, 0x6E, 0x74, + 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3C, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x58, 0x52, + 0x65, 0x73, 0x6F, 0x6C, 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x33, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x2F, 0x31, 0x30, 0x30, 0x30, 0x30, 0x3C, + 0x2F, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x58, 0x52, 0x65, 0x73, 0x6F, 0x6C, + 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3C, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x59, 0x52, + 0x65, 0x73, 0x6F, 0x6C, 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x33, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x2F, 0x31, 0x30, 0x30, 0x30, 0x30, 0x3C, + 0x2F, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x59, 0x52, 0x65, 0x73, 0x6F, 0x6C, + 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3C, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x52, 0x65, + 0x73, 0x6F, 0x6C, 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x55, 0x6E, 0x69, 0x74, + 0x3E, 0x32, 0x3C, 0x2F, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x52, 0x65, 0x73, + 0x6F, 0x6C, 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x55, 0x6E, 0x69, 0x74, 0x3E, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x65, + 0x78, 0x69, 0x66, 0x3A, 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x53, 0x70, 0x61, + 0x63, 0x65, 0x3E, 0x31, 0x3C, 0x2F, 0x65, 0x78, 0x69, 0x66, 0x3A, 0x43, + 0x6F, 0x6C, 0x6F, 0x72, 0x53, 0x70, 0x61, 0x63, 0x65, 0x3E, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x65, 0x78, 0x69, + 0x66, 0x3A, 0x50, 0x69, 0x78, 0x65, 0x6C, 0x58, 0x44, 0x69, 0x6D, 0x65, + 0x6E, 0x73, 0x69, 0x6F, 0x6E, 0x3E, 0x31, 0x32, 0x30, 0x3C, 0x2F, 0x65, + 0x78, 0x69, 0x66, 0x3A, 0x50, 0x69, 0x78, 0x65, 0x6C, 0x58, 0x44, 0x69, + 0x6D, 0x65, 0x6E, 0x73, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x65, 0x78, 0x69, 0x66, 0x3A, + 0x50, 0x69, 0x78, 0x65, 0x6C, 0x59, 0x44, 0x69, 0x6D, 0x65, 0x6E, 0x73, + 0x69, 0x6F, 0x6E, 0x3E, 0x31, 0x32, 0x30, 0x3C, 0x2F, 0x65, 0x78, 0x69, + 0x66, 0x3A, 0x50, 0x69, 0x78, 0x65, 0x6C, 0x59, 0x44, 0x69, 0x6D, 0x65, + 0x6E, 0x73, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x3C, 0x2F, 0x72, 0x64, 0x66, 0x3A, 0x44, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x3C, + 0x2F, 0x72, 0x64, 0x66, 0x3A, 0x52, 0x44, 0x46, 0x3E, 0x0A, 0x3C, 0x2F, + 0x78, 0x3A, 0x78, 0x6D, 0x70, 0x6D, 0x65, 0x74, 0x61, 0x3E, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x3C, + 0x3F, 0x78, 0x70, 0x61, 0x63, 0x6B, 0x65, 0x74, 0x20, 0x65, 0x6E, 0x64, + 0x3D, 0x22, 0x77, 0x22, 0x3F, 0x3E, 0x55, 0x32, 0xFE, 0xAE, 0x00, 0x00, + 0x00, 0x20, 0x63, 0x48, 0x52, 0x4D, 0x00, 0x00, 0x7A, 0x25, 0x00, 0x00, + 0x80, 0x83, 0x00, 0x00, 0xF9, 0xFF, 0x00, 0x00, 0x80, 0xE9, 0x00, 0x00, + 0x75, 0x30, 0x00, 0x00, 0xEA, 0x60, 0x00, 0x00, 0x3A, 0x98, 0x00, 0x00, + 0x17, 0x6F, 0x92, 0x5F, 0xC5, 0x46, 0x00, 0x00, 0x0B, 0xBD, 0x49, 0x44, + 0x41, 0x54, 0x78, 0xDA, 0xEC, 0x9D, 0x7B, 0x90, 0x95, 0x65, 0x1D, 0xC7, + 0x3F, 0xE7, 0xEC, 0xC2, 0xDE, 0x61, 0x59, 0x59, 0x02, 0x44, 0x28, 0x58, + 0xC0, 0x58, 0x09, 0x2C, 0x15, 0x44, 0x25, 0x35, 0x75, 0x6C, 0x14, 0xBB, + 0x20, 0x3A, 0x89, 0x63, 0xD9, 0xFD, 0xDE, 0x4C, 0xC3, 0x54, 0x96, 0x8D, + 0x91, 0x35, 0x43, 0x6A, 0x37, 0x2D, 0x29, 0x13, 0xB5, 0x2C, 0x2A, 0x8B, + 0xA9, 0x94, 0xA9, 0x2C, 0xBB, 0xDF, 0x30, 0x1C, 0xE4, 0xB2, 0x54, 0xC8, + 0x2D, 0x10, 0x01, 0xB9, 0x2E, 0xEC, 0xB2, 0xF7, 0x73, 0x9E, 0xFE, 0xF8, + 0xFD, 0x8E, 0x6E, 0xDC, 0xDE, 0xE7, 0x3D, 0x97, 0xF7, 0x76, 0x9E, 0xEF, + 0xCC, 0x99, 0xDD, 0x85, 0xF7, 0x3D, 0xE7, 0x3D, 0xEF, 0xF7, 0x7D, 0x9E, + 0xE7, 0x77, 0xF9, 0xFE, 0x7E, 0x4F, 0xCA, 0x18, 0x83, 0x43, 0x72, 0x91, + 0x76, 0xB7, 0xC0, 0x11, 0xEC, 0xE0, 0x08, 0x76, 0x70, 0x04, 0x3B, 0x38, + 0x82, 0x1D, 0x1C, 0xC1, 0x0E, 0x8E, 0x60, 0x07, 0x47, 0x70, 0x19, 0xA1, + 0x32, 0x61, 0xDF, 0xA7, 0x0A, 0x38, 0x13, 0xA8, 0x05, 0x1A, 0x80, 0x61, + 0xFA, 0xB3, 0x6E, 0xD0, 0xC3, 0x9C, 0x01, 0x8E, 0x01, 0x47, 0xF5, 0xD5, + 0x01, 0x74, 0x01, 0xCF, 0xEB, 0xFF, 0x39, 0x82, 0x23, 0x86, 0x51, 0xC0, + 0x6B, 0xF4, 0xE7, 0xAB, 0x81, 0x69, 0x40, 0x35, 0x50, 0xAF, 0xC4, 0xD6, + 0xEA, 0xDF, 0x29, 0x3D, 0x3E, 0x0B, 0xF4, 0x00, 0xDD, 0x40, 0xA7, 0xBE, + 0xBA, 0x80, 0xF5, 0xC0, 0x73, 0xC0, 0x3E, 0xE0, 0x59, 0xE0, 0x48, 0x12, + 0x08, 0x4E, 0xC5, 0x34, 0x54, 0x59, 0x0D, 0xCC, 0x00, 0xCE, 0x03, 0x66, + 0x02, 0xD3, 0x81, 0x26, 0x7D, 0x35, 0x28, 0x99, 0x69, 0x7D, 0xA5, 0x4E, + 0xF1, 0x1E, 0x46, 0xC9, 0xCE, 0xEA, 0xEF, 0xED, 0xC0, 0x21, 0xE0, 0x30, + 0xF0, 0x0C, 0xB0, 0x01, 0x78, 0x1A, 0x68, 0xD3, 0x63, 0x1C, 0xC1, 0x01, + 0xA0, 0x1E, 0xB8, 0x18, 0x98, 0x0B, 0xCC, 0x02, 0xA6, 0x02, 0x8D, 0x40, + 0x4D, 0x11, 0xED, 0x89, 0xAC, 0x4E, 0xE1, 0x87, 0x80, 0x8D, 0xC0, 0xDF, + 0x81, 0xBF, 0xEA, 0xCF, 0x7E, 0x47, 0x70, 0x69, 0x30, 0x14, 0xB8, 0x0C, + 0xB8, 0x0A, 0x78, 0x3D, 0x30, 0x51, 0x47, 0x6A, 0xA9, 0x97, 0x98, 0x01, + 0x1D, 0xD1, 0x9B, 0x81, 0xA7, 0x80, 0x27, 0x81, 0x7F, 0xE8, 0x88, 0x77, + 0x04, 0x17, 0x09, 0xD3, 0x80, 0xEB, 0x81, 0x6B, 0x74, 0xC4, 0x36, 0x84, + 0x60, 0xFD, 0x67, 0x95, 0xE8, 0x36, 0xE0, 0x71, 0x60, 0x05, 0xB0, 0xC3, + 0x11, 0x5C, 0xB8, 0x01, 0x78, 0x25, 0xF0, 0x7E, 0x60, 0x36, 0x30, 0x32, + 0x02, 0x6E, 0x5D, 0x06, 0xD8, 0x03, 0xFC, 0x11, 0x78, 0x10, 0xF8, 0x93, + 0x23, 0x38, 0x3F, 0x8C, 0x04, 0xDE, 0x09, 0xDC, 0xA0, 0x16, 0xF2, 0x90, + 0x88, 0x5D, 0x5F, 0x17, 0xB0, 0x16, 0x58, 0x06, 0xFC, 0x48, 0xFF, 0x76, + 0x6E, 0x92, 0x25, 0x26, 0x01, 0x1F, 0x07, 0xAE, 0x03, 0xC6, 0x46, 0x34, + 0x18, 0x53, 0xAB, 0x46, 0xDE, 0x19, 0xC0, 0x78, 0xE0, 0x9B, 0xC0, 0x7E, + 0x37, 0x82, 0xBD, 0x71, 0x0E, 0x70, 0x3B, 0xF0, 0x46, 0x0D, 0x52, 0x14, + 0x82, 0x0E, 0xF5, 0x65, 0xBB, 0x4E, 0x12, 0xC0, 0x18, 0xA2, 0x24, 0x35, + 0xEA, 0xCF, 0x7C, 0x61, 0xD4, 0x6F, 0x5E, 0x01, 0xDC, 0x09, 0xEC, 0x75, + 0x04, 0x9F, 0xDE, 0x98, 0x5A, 0x02, 0x5C, 0xA1, 0x6E, 0x4F, 0x3E, 0xD8, + 0xA1, 0x16, 0xEF, 0x0B, 0x1A, 0xB8, 0xD8, 0xA7, 0x24, 0x67, 0x4E, 0x32, + 0x73, 0x8D, 0x00, 0x5E, 0xA1, 0xFE, 0xF4, 0x68, 0x0D, 0x92, 0x8C, 0xC9, + 0xF3, 0x73, 0x8F, 0x02, 0x8F, 0x01, 0x77, 0x00, 0xBB, 0x1D, 0xC1, 0x27, + 0x62, 0x22, 0x70, 0x8F, 0x5A, 0xCA, 0x43, 0x7D, 0x9E, 0xDB, 0xA7, 0xAE, + 0xCB, 0x7A, 0x60, 0x95, 0x12, 0xDC, 0xAE, 0x53, 0x66, 0xAF, 0xBA, 0x3A, + 0xC7, 0x7F, 0xC9, 0x94, 0x7E, 0x4E, 0xB5, 0xAE, 0xF7, 0x8D, 0xFA, 0x80, + 0x9D, 0x0F, 0x9C, 0xAB, 0x46, 0x5D, 0x3E, 0x33, 0xC6, 0x72, 0xE0, 0xB3, + 0x51, 0x9A, 0xAE, 0xA3, 0x40, 0xF0, 0x08, 0xE0, 0x6E, 0x60, 0xA1, 0xDE, + 0x70, 0x3F, 0xF8, 0x3D, 0xF0, 0x3B, 0xB5, 0x6A, 0x77, 0x68, 0x70, 0xA2, + 0x17, 0x7F, 0x91, 0xA7, 0x94, 0xBE, 0x6A, 0x74, 0x4D, 0x7D, 0x25, 0x70, + 0xB5, 0xCE, 0x24, 0xE7, 0xFB, 0xBC, 0x9E, 0x76, 0xE0, 0x3E, 0x9D, 0xAE, + 0xFB, 0x1D, 0xC1, 0x50, 0x01, 0xDC, 0x06, 0x2C, 0x02, 0x86, 0xFB, 0x38, + 0xEF, 0x3F, 0xC0, 0x4F, 0x81, 0x95, 0x3A, 0x62, 0x4F, 0x36, 0x0D, 0x17, + 0x72, 0x4D, 0x67, 0x00, 0xAD, 0xC0, 0x5B, 0x80, 0xF9, 0x6A, 0xEC, 0xD9, + 0x62, 0x17, 0xB0, 0x58, 0xDD, 0xA8, 0xB2, 0x27, 0x78, 0x3E, 0xF0, 0x15, + 0xB5, 0x44, 0x6D, 0xF1, 0x2B, 0x60, 0xA9, 0x4E, 0xC7, 0x07, 0x29, 0x5D, + 0x9C, 0xB8, 0x02, 0xC9, 0x4C, 0xCD, 0x05, 0xDE, 0x87, 0x84, 0x48, 0x6D, + 0xF1, 0x6F, 0x75, 0xF3, 0x56, 0x95, 0x33, 0xC1, 0x13, 0x75, 0xCD, 0xBA, + 0x80, 0x53, 0x27, 0x04, 0x8E, 0xB7, 0x58, 0x97, 0x02, 0x0F, 0xEB, 0x7A, + 0xDB, 0x17, 0xD0, 0x75, 0xD6, 0x00, 0xAF, 0x03, 0x3E, 0x0A, 0x2C, 0xB0, + 0x3C, 0x27, 0xAB, 0xB3, 0xCB, 0x2D, 0x84, 0x9C, 0x95, 0xAA, 0x0C, 0xF1, + 0x73, 0x3F, 0xAC, 0x37, 0xCE, 0x86, 0xDC, 0x8C, 0x8E, 0xF4, 0xA5, 0xBA, + 0xD6, 0x06, 0x99, 0xDD, 0xE9, 0x56, 0x23, 0xAE, 0x5D, 0xAD, 0xE5, 0x77, + 0x59, 0x9C, 0x93, 0x46, 0xA2, 0x70, 0x6F, 0x07, 0xEE, 0x0D, 0x93, 0xE0, + 0xB0, 0x82, 0x08, 0x17, 0x02, 0x6F, 0xF3, 0xF1, 0x80, 0xDD, 0x03, 0x7C, + 0x1D, 0xD8, 0x4E, 0x38, 0xA9, 0xBB, 0x0C, 0x92, 0x59, 0x5A, 0xE2, 0x63, + 0x6D, 0xAD, 0xD1, 0xA9, 0x7D, 0x7A, 0xB9, 0x11, 0x5C, 0x0B, 0x7C, 0x40, + 0x7D, 0x4F, 0x1B, 0x3C, 0xA8, 0x96, 0xE9, 0x0B, 0x21, 0x2F, 0x67, 0x06, + 0xD8, 0x0A, 0x7C, 0x49, 0xA7, 0x5F, 0x1B, 0x4C, 0x05, 0x6E, 0x2E, 0x30, + 0x98, 0x12, 0x2B, 0x82, 0x2B, 0x90, 0x10, 0xDF, 0xD5, 0x96, 0xC7, 0xFF, + 0x41, 0xA7, 0xE6, 0xB0, 0xC9, 0x3D, 0x19, 0xC9, 0x1B, 0x2C, 0xBF, 0xEF, + 0x0D, 0xC0, 0xAB, 0xCA, 0x85, 0xE0, 0x34, 0xF0, 0x0E, 0xF5, 0x7D, 0xBD, + 0xF0, 0xBC, 0xFA, 0xC7, 0x9B, 0x88, 0x16, 0x0C, 0xA2, 0xF4, 0xB8, 0x0B, + 0x91, 0xFB, 0x78, 0x61, 0x82, 0x0F, 0xE3, 0x2C, 0xF6, 0x04, 0x4F, 0xF1, + 0x31, 0x7A, 0x1F, 0x45, 0xD2, 0x71, 0x51, 0x94, 0xCB, 0xF4, 0xEB, 0x34, + 0xFD, 0x43, 0xCB, 0x40, 0xCA, 0x8D, 0x48, 0xC4, 0xAC, 0x22, 0xE9, 0x04, + 0xCF, 0x07, 0x9A, 0x2D, 0x8E, 0x5B, 0x45, 0xC4, 0xD3, 0x70, 0x6A, 0x55, + 0x7F, 0x57, 0x0D, 0x3F, 0x2F, 0xB4, 0x00, 0xD7, 0x86, 0xF1, 0xB0, 0x06, + 0x49, 0x70, 0x35, 0x22, 0xB9, 0xB1, 0x71, 0x8B, 0x1E, 0x8E, 0xE0, 0xD4, + 0x7C, 0x32, 0x3C, 0x6B, 0x39, 0x8A, 0x2B, 0x91, 0xF4, 0xA7, 0x49, 0x32, + 0xC1, 0xB3, 0x81, 0xC9, 0x16, 0xC7, 0xAD, 0x47, 0x62, 0xCB, 0x7D, 0x31, + 0x20, 0xB8, 0x0B, 0x91, 0xF0, 0xD8, 0x64, 0x90, 0x5A, 0x81, 0x71, 0x49, + 0x26, 0x78, 0x0E, 0x92, 0xB5, 0xF1, 0xC2, 0x13, 0xC0, 0x4E, 0xE2, 0x83, + 0x8D, 0x48, 0xF8, 0xD4, 0x0B, 0x63, 0x10, 0xC1, 0x60, 0x62, 0x09, 0x9E, + 0x84, 0xB7, 0xF4, 0xE6, 0x00, 0x92, 0x21, 0xEA, 0x89, 0x11, 0xC1, 0x9D, + 0xD8, 0x69, 0xB3, 0xEA, 0x10, 0xF9, 0x51, 0x22, 0x09, 0x1E, 0xAE, 0x4E, + 0xBF, 0xD7, 0xFA, 0xBB, 0x5A, 0x47, 0x44, 0xDC, 0xB0, 0x0E, 0x51, 0x5C, + 0x7A, 0x59, 0xD3, 0x89, 0x9D, 0xA2, 0xA7, 0x5A, 0x3A, 0xFB, 0x5B, 0x90, + 0x0C, 0x51, 0xDC, 0xB0, 0x1D, 0x11, 0xE1, 0x79, 0x11, 0x3C, 0xC9, 0xD2, + 0x8B, 0x88, 0x1D, 0xC1, 0x63, 0x90, 0xAA, 0x04, 0xAF, 0x00, 0xC2, 0x26, + 0x44, 0x81, 0x11, 0x37, 0x74, 0x5A, 0x1A, 0x5A, 0x13, 0x80, 0xB3, 0x93, + 0x48, 0x70, 0xBD, 0x85, 0x93, 0xFF, 0x22, 0x92, 0x47, 0x8D, 0x23, 0x8C, + 0xCE, 0x3E, 0x5E, 0x0F, 0x67, 0xAD, 0xA5, 0xA1, 0x19, 0x3B, 0x82, 0xEB, + 0x2C, 0x3E, 0x6B, 0x3F, 0x22, 0x92, 0x8B, 0x2B, 0xB6, 0xE3, 0x9D, 0xFB, + 0xCD, 0x69, 0xC1, 0x12, 0x47, 0xF0, 0x30, 0x8B, 0xCF, 0xEA, 0x8C, 0x99, + 0xF5, 0x7C, 0x3C, 0x8E, 0x20, 0xD1, 0x2D, 0x2F, 0x82, 0xAB, 0x92, 0x48, + 0xB0, 0xCD, 0x97, 0xEA, 0x25, 0x86, 0xD5, 0x7B, 0x83, 0xD0, 0x87, 0x88, + 0x03, 0xBC, 0x30, 0x24, 0x89, 0x04, 0x1B, 0xBC, 0xC3, 0x74, 0x71, 0x6F, + 0x27, 0x91, 0xB6, 0xFC, 0x0E, 0xA9, 0x24, 0x12, 0xDC, 0x6B, 0x41, 0x70, + 0x25, 0xF1, 0xEE, 0x38, 0x90, 0xB2, 0xB8, 0xFE, 0x6C, 0xD0, 0xCB, 0x50, + 0x50, 0x04, 0x77, 0xE0, 0x2D, 0x6B, 0xAD, 0x0F, 0xDA, 0x00, 0x29, 0x32, + 0x9A, 0x2D, 0x7D, 0xDC, 0x81, 0x24, 0x12, 0xDC, 0x65, 0x31, 0x82, 0xC7, + 0x22, 0xA2, 0xF3, 0xB8, 0x62, 0x32, 0xDE, 0xDA, 0xEE, 0x34, 0x01, 0xA7, + 0x0C, 0x83, 0x24, 0xD8, 0xCB, 0x0F, 0x6E, 0x44, 0x04, 0x01, 0x71, 0x85, + 0x4D, 0xFD, 0x72, 0x07, 0x01, 0x27, 0x52, 0x82, 0x22, 0x78, 0x0B, 0x52, + 0x21, 0xEF, 0xB5, 0x06, 0x9F, 0x19, 0x53, 0x63, 0x6B, 0x04, 0x12, 0x86, + 0xF4, 0x32, 0x34, 0xB7, 0x03, 0xDB, 0x92, 0x48, 0xF0, 0x36, 0xA4, 0xC4, + 0xC4, 0x0B, 0xE7, 0x91, 0x7F, 0x85, 0x5F, 0x98, 0x18, 0x0F, 0x5C, 0x64, + 0x71, 0xDC, 0x2E, 0x02, 0x16, 0xC2, 0x07, 0x45, 0xF0, 0x31, 0xFD, 0x72, + 0x5E, 0x78, 0xAD, 0xC5, 0x48, 0x88, 0x22, 0x5A, 0xF1, 0x2E, 0xBF, 0x31, + 0x48, 0xBC, 0x3A, 0x93, 0x44, 0x82, 0x0D, 0x12, 0x67, 0xEE, 0xF5, 0x38, + 0x6E, 0x38, 0xF0, 0x86, 0x98, 0x91, 0x5B, 0x83, 0x94, 0xBD, 0x7A, 0xD9, + 0x18, 0x9D, 0xC0, 0x9F, 0xC3, 0x70, 0xCE, 0x83, 0xC2, 0x53, 0xD8, 0x89, + 0xE8, 0xAE, 0x27, 0x44, 0x1D, 0x71, 0x1E, 0x98, 0x01, 0x5C, 0x6E, 0x71, + 0xDC, 0x51, 0x44, 0x6E, 0x9B, 0x58, 0x82, 0xDB, 0xB0, 0x53, 0x20, 0x4E, + 0x41, 0x5A, 0x38, 0xC4, 0xC1, 0xD8, 0xAA, 0x42, 0x94, 0xA2, 0xA3, 0x2C, + 0x8E, 0x5D, 0x45, 0x08, 0x85, 0xE1, 0x41, 0xDE, 0xC4, 0x2E, 0xEC, 0x15, + 0x88, 0xEF, 0x45, 0x44, 0x02, 0x51, 0xC7, 0x4C, 0x44, 0xD4, 0x6E, 0x73, + 0x1F, 0x1F, 0x23, 0x84, 0x58, 0x7B, 0xD0, 0xA3, 0xE4, 0xB7, 0xD8, 0xA5, + 0x04, 0x5B, 0x91, 0xFA, 0x5A, 0x08, 0x41, 0x2C, 0x6E, 0x89, 0x6A, 0xA4, + 0x1B, 0xD0, 0x59, 0x16, 0xC7, 0x6E, 0xC4, 0x5B, 0xF1, 0x91, 0x08, 0x82, + 0xB7, 0x22, 0xAA, 0x49, 0x9B, 0x51, 0x7C, 0x93, 0x4E, 0x7F, 0x51, 0x6B, + 0xF1, 0x9B, 0xCB, 0x06, 0xDD, 0xEA, 0x63, 0x29, 0xF9, 0x09, 0x21, 0x35, + 0x67, 0x09, 0x9A, 0xE0, 0x63, 0xC0, 0xF7, 0x2C, 0x47, 0xF1, 0x18, 0xE0, + 0x33, 0x48, 0x53, 0x94, 0x28, 0xA1, 0x1F, 0x98, 0x07, 0x7C, 0x0C, 0x69, + 0xAB, 0x68, 0x33, 0x7A, 0x7F, 0x4E, 0x48, 0x55, 0x1A, 0x41, 0x13, 0x6C, + 0x80, 0x35, 0x96, 0xA3, 0x38, 0x85, 0xC8, 0x4C, 0x17, 0x23, 0x5A, 0xA6, + 0x28, 0xAD, 0xBB, 0xB7, 0x23, 0xE5, 0x28, 0x36, 0x58, 0x81, 0xF4, 0xA1, + 0x36, 0xE5, 0x40, 0x70, 0xCE, 0x1F, 0x5C, 0x66, 0x19, 0xF8, 0xA8, 0x50, + 0xBF, 0xF8, 0x73, 0x48, 0x18, 0x33, 0x6C, 0x4C, 0x47, 0x2A, 0x1E, 0x67, + 0x5A, 0xDA, 0x06, 0x1B, 0x91, 0x66, 0x31, 0xDD, 0x61, 0x5D, 0x70, 0x58, + 0xAE, 0xC8, 0x1A, 0xE0, 0x01, 0xCB, 0x63, 0x6B, 0x75, 0x2D, 0xFE, 0x2A, + 0xD2, 0xAC, 0x2C, 0x2C, 0x5C, 0x08, 0x7C, 0x03, 0xB8, 0x04, 0xBB, 0xB4, + 0x66, 0x2F, 0xD2, 0xBE, 0xE1, 0xB9, 0x30, 0x9F, 0xC8, 0xB0, 0x08, 0xEE, + 0x45, 0x2A, 0xF3, 0x7E, 0x69, 0x79, 0x7C, 0x03, 0x12, 0x2D, 0xBA, 0xCF, + 0x32, 0xA8, 0x50, 0x6C, 0x2C, 0x00, 0xBE, 0xA6, 0x24, 0xDB, 0x6A, 0xAA, + 0x96, 0xEB, 0xF4, 0xDC, 0x1B, 0x26, 0xC1, 0x61, 0x76, 0xD9, 0x49, 0xEB, + 0xF4, 0xFB, 0x00, 0xF6, 0x79, 0xE0, 0x7E, 0xA4, 0x47, 0xD6, 0x32, 0xBD, + 0x81, 0xA5, 0x0E, 0x1C, 0x8C, 0x47, 0x9A, 0xAE, 0xDC, 0xAC, 0x76, 0x80, + 0xAD, 0xCB, 0xB6, 0x1A, 0xF8, 0x08, 0x21, 0x44, 0xAE, 0xA2, 0x44, 0x30, + 0x48, 0x1C, 0x77, 0xA1, 0x8E, 0x4C, 0xDB, 0x2E, 0x77, 0x59, 0xB5, 0xC2, + 0x9F, 0x06, 0x1E, 0x02, 0xFE, 0x82, 0x77, 0x2A, 0xD2, 0x2F, 0xC6, 0xE8, + 0x4C, 0x71, 0xAB, 0xAE, 0xB7, 0x4D, 0xD8, 0x6B, 0xA9, 0xF6, 0x22, 0x81, + 0x9A, 0x27, 0x89, 0x40, 0x85, 0x64, 0x14, 0x5A, 0x19, 0x0E, 0x57, 0x97, + 0x63, 0xB1, 0xCF, 0xF3, 0x7A, 0x90, 0x36, 0x0F, 0xFF, 0x04, 0x7E, 0xA6, + 0x81, 0x84, 0xAD, 0x05, 0x5E, 0x4B, 0x2B, 0x92, 0xB2, 0x7C, 0x13, 0x92, + 0xD9, 0x1A, 0x8B, 0x3F, 0x15, 0x64, 0xBF, 0x8E, 0xDC, 0x47, 0x89, 0x48, + 0xF1, 0x7A, 0x54, 0x9A, 0x91, 0x8E, 0x46, 0x9A, 0x78, 0x7E, 0x30, 0x0F, + 0xB7, 0xAB, 0x4B, 0x47, 0xF4, 0x66, 0xA4, 0x32, 0x71, 0x27, 0x52, 0x98, + 0xBD, 0xC3, 0xC2, 0x7A, 0xAD, 0x53, 0x52, 0xA7, 0x20, 0x69, 0xCA, 0xAB, + 0x90, 0x02, 0xB1, 0x51, 0xBA, 0xD6, 0xFA, 0x55, 0x40, 0xDE, 0x86, 0xF4, + 0xF2, 0x8A, 0xCC, 0x96, 0x3C, 0x51, 0x21, 0x38, 0xA5, 0x6B, 0xDC, 0x22, + 0xE0, 0x43, 0x79, 0xFA, 0xD7, 0xFD, 0x7A, 0x63, 0xBB, 0x95, 0xEC, 0x5C, + 0xD7, 0xD9, 0xBE, 0x53, 0x1C, 0x9F, 0x6B, 0x3E, 0x3A, 0x4D, 0x5D, 0xB0, + 0x3A, 0x44, 0x36, 0x94, 0xCE, 0x83, 0xD8, 0x2C, 0xF0, 0x45, 0xB5, 0x9A, + 0x0F, 0x44, 0x29, 0x2A, 0x13, 0xA5, 0x7E, 0xD1, 0x29, 0x44, 0x95, 0x78, + 0xAD, 0x92, 0x3C, 0x33, 0x4F, 0x2B, 0x3F, 0x47, 0x76, 0x0F, 0x12, 0xE6, + 0xCC, 0x9E, 0xC6, 0xC8, 0xAB, 0x54, 0xA2, 0x2B, 0xC8, 0x4F, 0xAF, 0x3C, + 0x00, 0xFC, 0x0D, 0xB8, 0x1F, 0x49, 0x87, 0x1E, 0x22, 0x62, 0x88, 0x92, + 0x0E, 0x39, 0xD7, 0x3D, 0xFD, 0x80, 0x92, 0x93, 0x2A, 0xE0, 0x41, 0x19, + 0x4A, 0x30, 0x12, 0xDC, 0x14, 0x12, 0x7E, 0x7D, 0x31, 0x8A, 0xE4, 0x46, + 0x69, 0x04, 0xB7, 0x20, 0xF1, 0xDD, 0x59, 0xBA, 0x16, 0xB6, 0x10, 0x70, + 0x15, 0x5E, 0x01, 0xD8, 0xAF, 0xCB, 0xC1, 0x36, 0x64, 0xF3, 0xAC, 0x5F, + 0x10, 0xA1, 0xAE, 0xEF, 0x61, 0x13, 0x3C, 0x47, 0xA7, 0xE4, 0xCB, 0x91, + 0xB4, 0x5B, 0x93, 0x5A, 0xAD, 0x69, 0x02, 0x2E, 0xF1, 0x28, 0x00, 0xB9, + 0xED, 0xF1, 0xFA, 0x91, 0xE2, 0xF5, 0x2D, 0x48, 0x5A, 0x74, 0x25, 0xD2, + 0x50, 0xA6, 0x2C, 0x09, 0x9E, 0xA6, 0x01, 0x84, 0x2B, 0xD5, 0x15, 0x69, + 0x8C, 0x19, 0xA9, 0x5E, 0xEB, 0x7F, 0xBB, 0x12, 0xFD, 0x1B, 0x0D, 0xE4, + 0xEC, 0x29, 0x17, 0x82, 0x1B, 0x94, 0xD8, 0x85, 0x48, 0x25, 0x40, 0x18, + 0xBB, 0x98, 0x05, 0x85, 0x01, 0x44, 0x87, 0xB5, 0x01, 0x78, 0x04, 0x69, + 0xEC, 0xD6, 0x93, 0x64, 0x82, 0x2F, 0x02, 0x3E, 0x89, 0xF4, 0xCB, 0x6A, + 0x22, 0xBA, 0x4A, 0x8D, 0x62, 0x23, 0xA3, 0xEB, 0xF4, 0xAF, 0x91, 0x78, + 0xF6, 0xBA, 0xA4, 0x11, 0x3C, 0x04, 0x78, 0x37, 0xD2, 0x00, 0xBC, 0x85, + 0x78, 0x17, 0x98, 0x15, 0x82, 0x4E, 0x44, 0x78, 0xF8, 0x65, 0x24, 0x85, + 0x98, 0xB3, 0xC2, 0x4D, 0x9C, 0x09, 0x6E, 0x46, 0x54, 0x19, 0x37, 0x22, + 0xD1, 0xA1, 0x62, 0x4D, 0xC7, 0xFD, 0x1A, 0xD0, 0x18, 0x1C, 0xC4, 0xC8, + 0x6D, 0x80, 0x55, 0x45, 0x7E, 0x5B, 0xF3, 0xF4, 0xEA, 0xAC, 0x52, 0x7B, + 0x9C, 0xBB, 0x55, 0x4D, 0xF1, 0x8A, 0xB6, 0x07, 0x74, 0x3D, 0xBE, 0x1F, + 0x69, 0x70, 0xDE, 0x1D, 0xE7, 0x11, 0x3C, 0x01, 0xF8, 0x3C, 0xB2, 0x73, + 0x49, 0x43, 0x81, 0xEF, 0xB5, 0x67, 0x90, 0xAF, 0xB9, 0x1A, 0x91, 0xDF, + 0x1E, 0xD6, 0x51, 0x91, 0x1D, 0xE4, 0xAE, 0xF4, 0xAB, 0xC1, 0x56, 0x8F, + 0x7D, 0x15, 0x5F, 0x5A, 0xDF, 0xA7, 0x5D, 0x89, 0x6C, 0x1E, 0xF4, 0xEF, + 0x0D, 0xBA, 0x9C, 0x4C, 0x46, 0x62, 0xD3, 0x4D, 0x48, 0x22, 0x62, 0x64, + 0x81, 0x86, 0xD8, 0x61, 0x44, 0x61, 0x7A, 0x07, 0x25, 0x6E, 0x1B, 0x55, + 0x2A, 0x82, 0x27, 0x20, 0xED, 0xEF, 0xE7, 0x21, 0x21, 0xC0, 0x7C, 0x70, + 0x48, 0xFD, 0xCA, 0xAD, 0x48, 0x63, 0xF0, 0x2D, 0x3A, 0x4A, 0x8F, 0xE8, + 0x88, 0xCB, 0x45, 0xA9, 0xCC, 0xA0, 0xB5, 0xCE, 0xE8, 0x28, 0x4C, 0xFB, + 0x98, 0xFA, 0x52, 0xFA, 0x3E, 0x19, 0xFD, 0xBD, 0x62, 0xD0, 0xBF, 0xA7, + 0xF5, 0xEF, 0x6A, 0x25, 0x7B, 0x18, 0x22, 0xE7, 0x9D, 0xAB, 0xCB, 0xCD, + 0x9C, 0x02, 0x1E, 0xDE, 0x0E, 0xE0, 0x07, 0xC0, 0xA7, 0x29, 0x7E, 0x36, + 0xAC, 0xA4, 0x04, 0x8F, 0x43, 0x3A, 0xA2, 0xBF, 0x99, 0xFC, 0x5A, 0xD9, + 0xB7, 0x21, 0x42, 0x80, 0x35, 0x48, 0xA6, 0xA8, 0x53, 0x6F, 0x46, 0x1F, + 0x76, 0xAD, 0x20, 0x4A, 0x76, 0xAF, 0x78, 0xB9, 0x89, 0x4A, 0xBD, 0xCE, + 0x14, 0xB3, 0x91, 0x8D, 0x45, 0xAE, 0xC1, 0x5E, 0xA3, 0x75, 0x3C, 0xC9, + 0xDF, 0xD7, 0x65, 0xEC, 0x70, 0x1C, 0x08, 0x1E, 0x81, 0x04, 0xDC, 0xDF, + 0x9A, 0x07, 0xB9, 0xEB, 0x80, 0x1F, 0xEB, 0x68, 0xDD, 0xA4, 0x2E, 0x45, + 0x0F, 0xD1, 0xDD, 0x6D, 0x3B, 0xB7, 0x5B, 0x5A, 0x35, 0x22, 0x0E, 0xBC, + 0x42, 0x6D, 0x0D, 0xBF, 0x44, 0x77, 0x02, 0xDF, 0xD6, 0x91, 0xDC, 0x17, + 0x65, 0x82, 0xAB, 0xF4, 0x22, 0x17, 0xF9, 0x24, 0xF7, 0x20, 0x2F, 0xCB, + 0x5B, 0xD6, 0x22, 0xB1, 0xDD, 0xB8, 0x75, 0xBB, 0x1B, 0xA2, 0x4B, 0xD1, + 0x2C, 0x25, 0xF9, 0x26, 0xFC, 0xB5, 0x4B, 0x3A, 0xAC, 0x2E, 0xE4, 0x77, + 0xA2, 0x4C, 0xF0, 0x3C, 0x44, 0x4A, 0xD3, 0xEC, 0x73, 0xD4, 0xDE, 0x85, + 0xE4, 0x71, 0x0F, 0x12, 0xEF, 0x36, 0x4A, 0xB9, 0x87, 0x7C, 0xA4, 0x4E, + 0xD9, 0x9F, 0xC0, 0x5F, 0x29, 0xEC, 0x26, 0xE0, 0x3D, 0x88, 0x42, 0xA5, + 0x78, 0x30, 0xC6, 0x14, 0xE3, 0xD5, 0x62, 0x8C, 0x59, 0x6B, 0xFC, 0xE1, + 0x21, 0x63, 0xCC, 0x0C, 0x63, 0x4C, 0x8D, 0x31, 0x26, 0x55, 0xA4, 0xEB, + 0x88, 0xC2, 0x2B, 0x65, 0x8C, 0xA9, 0x33, 0xC6, 0x5C, 0x60, 0x8C, 0x59, + 0xE9, 0xE3, 0x7E, 0x0C, 0x18, 0x63, 0x1E, 0x37, 0xC6, 0x8C, 0x2B, 0xE6, + 0xF5, 0x14, 0xC3, 0x2F, 0x1D, 0xA6, 0x4F, 0x5E, 0xAB, 0x0F, 0x5F, 0x70, + 0x89, 0xBA, 0x08, 0x6D, 0xEA, 0x0B, 0x1A, 0x92, 0x03, 0xA3, 0xCB, 0xCC, + 0x1A, 0x44, 0x8A, 0xF4, 0x88, 0xE5, 0x79, 0x15, 0x48, 0x6C, 0x7E, 0x5E, + 0xD4, 0xA6, 0xE8, 0x8B, 0x91, 0x14, 0x59, 0x93, 0x65, 0xD8, 0xEE, 0x0B, + 0xBA, 0xD6, 0xEC, 0x4E, 0x18, 0xB1, 0xA7, 0xF2, 0xB1, 0xC7, 0x23, 0x7A, + 0xB3, 0x5B, 0x2C, 0xCF, 0xF9, 0xAF, 0x1A, 0x6C, 0x5B, 0x8B, 0x75, 0x01, + 0x85, 0xA0, 0x1A, 0x51, 0x5F, 0x34, 0x59, 0x1E, 0x7F, 0x2F, 0xA2, 0x59, + 0x2A, 0x07, 0x72, 0x51, 0xFF, 0x7A, 0x27, 0x52, 0xEA, 0xB2, 0xC2, 0xF2, + 0x9C, 0xF1, 0xC8, 0x96, 0x78, 0xA9, 0x28, 0x10, 0x7C, 0x09, 0x70, 0x99, + 0xE5, 0xB1, 0x4F, 0x20, 0xBB, 0x98, 0xED, 0x2B, 0x13, 0x72, 0x07, 0x93, + 0xBC, 0x0B, 0xF8, 0x14, 0xF0, 0x8C, 0x25, 0x27, 0x0B, 0x28, 0x52, 0x97, + 0x83, 0x42, 0x09, 0xBE, 0xCE, 0xD2, 0x6A, 0xDE, 0xA9, 0xD3, 0xD4, 0xEE, + 0x32, 0x23, 0x77, 0xF0, 0xBA, 0xBC, 0x4D, 0x6D, 0x0F, 0x1B, 0xC5, 0xE5, + 0x59, 0x1A, 0x4B, 0x08, 0x95, 0xE0, 0x16, 0x1D, 0xC1, 0x36, 0xEF, 0xF1, + 0x2D, 0xA4, 0x10, 0x2B, 0x4B, 0xF9, 0x22, 0x8B, 0xA4, 0x0C, 0x97, 0x5B, + 0x1A, 0x5C, 0x97, 0x6A, 0x20, 0x25, 0x34, 0x82, 0xCF, 0xC5, 0xAE, 0x18, + 0x6C, 0x15, 0x22, 0x4C, 0xEF, 0xC1, 0xE1, 0x18, 0xB2, 0x9B, 0xAA, 0x8D, + 0x01, 0x35, 0x07, 0xD9, 0x3C, 0x3B, 0x34, 0x82, 0x5B, 0xF1, 0x56, 0x65, + 0x66, 0x90, 0xDC, 0xE7, 0x16, 0xC7, 0xED, 0x4B, 0xC8, 0x15, 0x84, 0xDB, + 0xB8, 0x9F, 0x67, 0x87, 0x45, 0x70, 0xA3, 0x9A, 0xF2, 0x5E, 0xE7, 0xB7, + 0x21, 0xB1, 0xE5, 0x01, 0xC7, 0xEB, 0x4B, 0xE8, 0x45, 0x36, 0xD2, 0xDA, + 0x6B, 0xC1, 0xCD, 0x39, 0x61, 0x11, 0x3C, 0x12, 0xBB, 0xC6, 0xA1, 0x9B, + 0x91, 0x12, 0x12, 0x87, 0xFF, 0xC7, 0xBF, 0xB0, 0xDB, 0x67, 0xE9, 0x52, + 0xEC, 0x37, 0xD2, 0x2E, 0x2A, 0xC1, 0xCD, 0x78, 0xAB, 0x26, 0x06, 0x90, + 0x0A, 0xC0, 0x76, 0xC7, 0xE7, 0x09, 0x68, 0xC7, 0x6E, 0x83, 0xE9, 0xD1, + 0x14, 0x28, 0x96, 0xC8, 0x97, 0xE0, 0xD1, 0x78, 0x8B, 0xE6, 0x0E, 0x21, + 0xBA, 0xE0, 0x8C, 0xE3, 0xF3, 0x04, 0x74, 0x23, 0x89, 0x16, 0xAF, 0xF4, + 0x60, 0xA5, 0xAE, 0xC5, 0x81, 0x13, 0x3C, 0xDC, 0xE2, 0xDC, 0xA3, 0xC4, + 0x73, 0x17, 0xB3, 0xA0, 0xB0, 0xCF, 0xC2, 0x27, 0x4E, 0x87, 0x45, 0x70, + 0x2D, 0xDE, 0xA1, 0xB4, 0x7E, 0xE2, 0xB1, 0x45, 0x6C, 0x98, 0x2E, 0x93, + 0xD7, 0xFD, 0x49, 0x91, 0x9F, 0x2A, 0xA6, 0x60, 0x82, 0xAB, 0x2D, 0x09, + 0x76, 0xD6, 0xF3, 0xE9, 0xEF, 0x8F, 0x4D, 0xE0, 0xC7, 0x84, 0x41, 0xB0, + 0x0D, 0x32, 0x94, 0x77, 0xE4, 0xCA, 0x0B, 0x7D, 0x04, 0x10, 0xB6, 0x2D, + 0x65, 0xF9, 0x68, 0x13, 0x92, 0xDB, 0x9C, 0x41, 0xC0, 0xBB, 0x7D, 0xC5, + 0x84, 0xDC, 0xE9, 0xE4, 0xAF, 0x38, 0x8D, 0x04, 0xC1, 0xE3, 0x80, 0x3B, + 0x29, 0xCF, 0xE4, 0x82, 0x0D, 0x2A, 0x08, 0xA0, 0xCA, 0xA3, 0xB2, 0xC4, + 0x5F, 0xA0, 0xC2, 0xF1, 0x18, 0x2E, 0xD2, 0xEE, 0x16, 0x38, 0x82, 0x1D, + 0x1C, 0xC1, 0x0E, 0x8E, 0x60, 0x07, 0x47, 0xB0, 0x43, 0x74, 0x08, 0xCE, + 0x15, 0x62, 0x39, 0x94, 0x16, 0x05, 0xDF, 0xE7, 0x7C, 0xDD, 0xA4, 0x23, + 0x48, 0x3D, 0x4D, 0x35, 0x2E, 0x5A, 0x55, 0xCA, 0xC1, 0xD7, 0x41, 0x81, + 0x45, 0xE2, 0x51, 0xEA, 0x74, 0xE7, 0xE0, 0xD6, 0x60, 0x07, 0x47, 0xB0, + 0x83, 0x23, 0xD8, 0x11, 0xEC, 0xE0, 0x08, 0x76, 0x70, 0x04, 0x3B, 0x38, + 0x82, 0x1D, 0x1C, 0xC1, 0x0E, 0x8E, 0x60, 0x07, 0x47, 0x70, 0xD9, 0xE2, + 0x7F, 0x03, 0x00, 0xFF, 0x90, 0x57, 0xA9, 0xA4, 0xD4, 0xE2, 0xD9, 0x00, + 0x00, 0x00, 0x00, 0x49, 0x45, 0x4E, 0x44, 0xAE, 0x42, 0x60, 0x82 +}; +} +static unsigned char* config_icon = raw::config; +} \ No newline at end of file diff --git a/cheat/gmod/icons/legit.hpp b/cheat/gmod/icons/legit.hpp new file mode 100644 index 0000000..c5db680 --- /dev/null +++ b/cheat/gmod/icons/legit.hpp @@ -0,0 +1,1798 @@ +/* E:\Users\admin\Desktop\stuff\icons\legit.png (4/1/2018 9:59:16 PM) + StartOffset: 00000000, EndOffset: 000053B8, Length: 000053B9 */ + +namespace icons { +constexpr static size_t legit_size = 21433; +namespace raw { +static unsigned char legit[21433] = { + 0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A, 0x00, 0x00, 0x00, 0x0D, + 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x78, + 0x08, 0x06, 0x00, 0x00, 0x00, 0x39, 0x64, 0x36, 0xD2, 0x00, 0x00, 0x00, + 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x2E, 0x23, 0x00, 0x00, 0x2E, + 0x23, 0x01, 0x78, 0xA5, 0x3F, 0x76, 0x00, 0x00, 0x0A, 0x4F, 0x69, 0x43, + 0x43, 0x50, 0x50, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x20, + 0x49, 0x43, 0x43, 0x20, 0x70, 0x72, 0x6F, 0x66, 0x69, 0x6C, 0x65, 0x00, + 0x00, 0x78, 0xDA, 0x9D, 0x53, 0x67, 0x54, 0x53, 0xE9, 0x16, 0x3D, 0xF7, + 0xDE, 0xF4, 0x42, 0x4B, 0x88, 0x80, 0x94, 0x4B, 0x6F, 0x52, 0x15, 0x08, + 0x20, 0x52, 0x42, 0x8B, 0x80, 0x14, 0x91, 0x26, 0x2A, 0x21, 0x09, 0x10, + 0x4A, 0x88, 0x21, 0xA1, 0xD9, 0x15, 0x51, 0xC1, 0x11, 0x45, 0x45, 0x04, + 0x1B, 0xC8, 0xA0, 0x88, 0x03, 0x8E, 0x8E, 0x80, 0x8C, 0x15, 0x51, 0x2C, + 0x0C, 0x8A, 0x0A, 0xD8, 0x07, 0xE4, 0x21, 0xA2, 0x8E, 0x83, 0xA3, 0x88, + 0x8A, 0xCA, 0xFB, 0xE1, 0x7B, 0xA3, 0x6B, 0xD6, 0xBC, 0xF7, 0xE6, 0xCD, + 0xFE, 0xB5, 0xD7, 0x3E, 0xE7, 0xAC, 0xF3, 0x9D, 0xB3, 0xCF, 0x07, 0xC0, + 0x08, 0x0C, 0x96, 0x48, 0x33, 0x51, 0x35, 0x80, 0x0C, 0xA9, 0x42, 0x1E, + 0x11, 0xE0, 0x83, 0xC7, 0xC4, 0xC6, 0xE1, 0xE4, 0x2E, 0x40, 0x81, 0x0A, + 0x24, 0x70, 0x00, 0x10, 0x08, 0xB3, 0x64, 0x21, 0x73, 0xFD, 0x23, 0x01, + 0x00, 0xF8, 0x7E, 0x3C, 0x3C, 0x2B, 0x22, 0xC0, 0x07, 0xBE, 0x00, 0x01, + 0x78, 0xD3, 0x0B, 0x08, 0x00, 0xC0, 0x4D, 0x9B, 0xC0, 0x30, 0x1C, 0x87, + 0xFF, 0x0F, 0xEA, 0x42, 0x99, 0x5C, 0x01, 0x80, 0x84, 0x01, 0xC0, 0x74, + 0x91, 0x38, 0x4B, 0x08, 0x80, 0x14, 0x00, 0x40, 0x7A, 0x8E, 0x42, 0xA6, + 0x00, 0x40, 0x46, 0x01, 0x80, 0x9D, 0x98, 0x26, 0x53, 0x00, 0xA0, 0x04, + 0x00, 0x60, 0xCB, 0x63, 0x62, 0xE3, 0x00, 0x50, 0x2D, 0x00, 0x60, 0x27, + 0x7F, 0xE6, 0xD3, 0x00, 0x80, 0x9D, 0xF8, 0x99, 0x7B, 0x01, 0x00, 0x5B, + 0x94, 0x21, 0x15, 0x01, 0xA0, 0x91, 0x00, 0x20, 0x13, 0x65, 0x88, 0x44, + 0x00, 0x68, 0x3B, 0x00, 0xAC, 0xCF, 0x56, 0x8A, 0x45, 0x00, 0x58, 0x30, + 0x00, 0x14, 0x66, 0x4B, 0xC4, 0x39, 0x00, 0xD8, 0x2D, 0x00, 0x30, 0x49, + 0x57, 0x66, 0x48, 0x00, 0xB0, 0xB7, 0x00, 0xC0, 0xCE, 0x10, 0x0B, 0xB2, + 0x00, 0x08, 0x0C, 0x00, 0x30, 0x51, 0x88, 0x85, 0x29, 0x00, 0x04, 0x7B, + 0x00, 0x60, 0xC8, 0x23, 0x23, 0x78, 0x00, 0x84, 0x99, 0x00, 0x14, 0x46, + 0xF2, 0x57, 0x3C, 0xF1, 0x2B, 0xAE, 0x10, 0xE7, 0x2A, 0x00, 0x00, 0x78, + 0x99, 0xB2, 0x3C, 0xB9, 0x24, 0x39, 0x45, 0x81, 0x5B, 0x08, 0x2D, 0x71, + 0x07, 0x57, 0x57, 0x2E, 0x1E, 0x28, 0xCE, 0x49, 0x17, 0x2B, 0x14, 0x36, + 0x61, 0x02, 0x61, 0x9A, 0x40, 0x2E, 0xC2, 0x79, 0x99, 0x19, 0x32, 0x81, + 0x34, 0x0F, 0xE0, 0xF3, 0xCC, 0x00, 0x00, 0xA0, 0x91, 0x15, 0x11, 0xE0, + 0x83, 0xF3, 0xFD, 0x78, 0xCE, 0x0E, 0xAE, 0xCE, 0xCE, 0x36, 0x8E, 0xB6, + 0x0E, 0x5F, 0x2D, 0xEA, 0xBF, 0x06, 0xFF, 0x22, 0x62, 0x62, 0xE3, 0xFE, + 0xE5, 0xCF, 0xAB, 0x70, 0x40, 0x00, 0x00, 0xE1, 0x74, 0x7E, 0xD1, 0xFE, + 0x2C, 0x2F, 0xB3, 0x1A, 0x80, 0x3B, 0x06, 0x80, 0x6D, 0xFE, 0xA2, 0x25, + 0xEE, 0x04, 0x68, 0x5E, 0x0B, 0xA0, 0x75, 0xF7, 0x8B, 0x66, 0xB2, 0x0F, + 0x40, 0xB5, 0x00, 0xA0, 0xE9, 0xDA, 0x57, 0xF3, 0x70, 0xF8, 0x7E, 0x3C, + 0x3C, 0x45, 0xA1, 0x90, 0xB9, 0xD9, 0xD9, 0xE5, 0xE4, 0xE4, 0xD8, 0x4A, + 0xC4, 0x42, 0x5B, 0x61, 0xCA, 0x57, 0x7D, 0xFE, 0x67, 0xC2, 0x5F, 0xC0, + 0x57, 0xFD, 0x6C, 0xF9, 0x7E, 0x3C, 0xFC, 0xF7, 0xF5, 0xE0, 0xBE, 0xE2, + 0x24, 0x81, 0x32, 0x5D, 0x81, 0x47, 0x04, 0xF8, 0xE0, 0xC2, 0xCC, 0xF4, + 0x4C, 0xA5, 0x1C, 0xCF, 0x92, 0x09, 0x84, 0x62, 0xDC, 0xE6, 0x8F, 0x47, + 0xFC, 0xB7, 0x0B, 0xFF, 0xFC, 0x1D, 0xD3, 0x22, 0xC4, 0x49, 0x62, 0xB9, + 0x58, 0x2A, 0x14, 0xE3, 0x51, 0x12, 0x71, 0x8E, 0x44, 0x9A, 0x8C, 0xF3, + 0x32, 0xA5, 0x22, 0x89, 0x42, 0x92, 0x29, 0xC5, 0x25, 0xD2, 0xFF, 0x64, + 0xE2, 0xDF, 0x2C, 0xFB, 0x03, 0x3E, 0xDF, 0x35, 0x00, 0xB0, 0x6A, 0x3E, + 0x01, 0x7B, 0x91, 0x2D, 0xA8, 0x5D, 0x63, 0x03, 0xF6, 0x4B, 0x27, 0x10, + 0x58, 0x74, 0xC0, 0xE2, 0xF7, 0x00, 0x00, 0xF2, 0xBB, 0x6F, 0xC1, 0xD4, + 0x28, 0x08, 0x03, 0x80, 0x68, 0x83, 0xE1, 0xCF, 0x77, 0xFF, 0xEF, 0x3F, + 0xFD, 0x47, 0xA0, 0x25, 0x00, 0x80, 0x66, 0x49, 0x92, 0x71, 0x00, 0x00, + 0x5E, 0x44, 0x24, 0x2E, 0x54, 0xCA, 0xB3, 0x3F, 0xC7, 0x08, 0x00, 0x00, + 0x44, 0xA0, 0x81, 0x2A, 0xB0, 0x41, 0x1B, 0xF4, 0xC1, 0x18, 0x2C, 0xC0, + 0x06, 0x1C, 0xC1, 0x05, 0xDC, 0xC1, 0x0B, 0xFC, 0x60, 0x36, 0x84, 0x42, + 0x24, 0xC4, 0xC2, 0x42, 0x10, 0x42, 0x0A, 0x64, 0x80, 0x1C, 0x72, 0x60, + 0x29, 0xAC, 0x82, 0x42, 0x28, 0x86, 0xCD, 0xB0, 0x1D, 0x2A, 0x60, 0x2F, + 0xD4, 0x40, 0x1D, 0x34, 0xC0, 0x51, 0x68, 0x86, 0x93, 0x70, 0x0E, 0x2E, + 0xC2, 0x55, 0xB8, 0x0E, 0x3D, 0x70, 0x0F, 0xFA, 0x61, 0x08, 0x9E, 0xC1, + 0x28, 0xBC, 0x81, 0x09, 0x04, 0x41, 0xC8, 0x08, 0x13, 0x61, 0x21, 0xDA, + 0x88, 0x01, 0x62, 0x8A, 0x58, 0x23, 0x8E, 0x08, 0x17, 0x99, 0x85, 0xF8, + 0x21, 0xC1, 0x48, 0x04, 0x12, 0x8B, 0x24, 0x20, 0xC9, 0x88, 0x14, 0x51, + 0x22, 0x4B, 0x91, 0x35, 0x48, 0x31, 0x52, 0x8A, 0x54, 0x20, 0x55, 0x48, + 0x1D, 0xF2, 0x3D, 0x72, 0x02, 0x39, 0x87, 0x5C, 0x46, 0xBA, 0x91, 0x3B, + 0xC8, 0x00, 0x32, 0x82, 0xFC, 0x86, 0xBC, 0x47, 0x31, 0x94, 0x81, 0xB2, + 0x51, 0x3D, 0xD4, 0x0C, 0xB5, 0x43, 0xB9, 0xA8, 0x37, 0x1A, 0x84, 0x46, + 0xA2, 0x0B, 0xD0, 0x64, 0x74, 0x31, 0x9A, 0x8F, 0x16, 0xA0, 0x9B, 0xD0, + 0x72, 0xB4, 0x1A, 0x3D, 0x8C, 0x36, 0xA1, 0xE7, 0xD0, 0xAB, 0x68, 0x0F, + 0xDA, 0x8F, 0x3E, 0x43, 0xC7, 0x30, 0xC0, 0xE8, 0x18, 0x07, 0x33, 0xC4, + 0x6C, 0x30, 0x2E, 0xC6, 0xC3, 0x42, 0xB1, 0x38, 0x2C, 0x09, 0x93, 0x63, + 0xCB, 0xB1, 0x22, 0xAC, 0x0C, 0xAB, 0xC6, 0x1A, 0xB0, 0x56, 0xAC, 0x03, + 0xBB, 0x89, 0xF5, 0x63, 0xCF, 0xB1, 0x77, 0x04, 0x12, 0x81, 0x45, 0xC0, + 0x09, 0x36, 0x04, 0x77, 0x42, 0x20, 0x61, 0x1E, 0x41, 0x48, 0x58, 0x4C, + 0x58, 0x4E, 0xD8, 0x48, 0xA8, 0x20, 0x1C, 0x24, 0x34, 0x11, 0xDA, 0x09, + 0x37, 0x09, 0x03, 0x84, 0x51, 0xC2, 0x27, 0x22, 0x93, 0xA8, 0x4B, 0xB4, + 0x26, 0xBA, 0x11, 0xF9, 0xC4, 0x18, 0x62, 0x32, 0x31, 0x87, 0x58, 0x48, + 0x2C, 0x23, 0xD6, 0x12, 0x8F, 0x13, 0x2F, 0x10, 0x7B, 0x88, 0x43, 0xC4, + 0x37, 0x24, 0x12, 0x89, 0x43, 0x32, 0x27, 0xB9, 0x90, 0x02, 0x49, 0xB1, + 0xA4, 0x54, 0xD2, 0x12, 0xD2, 0x46, 0xD2, 0x6E, 0x52, 0x23, 0xE9, 0x2C, + 0xA9, 0x9B, 0x34, 0x48, 0x1A, 0x23, 0x93, 0xC9, 0xDA, 0x64, 0x6B, 0xB2, + 0x07, 0x39, 0x94, 0x2C, 0x20, 0x2B, 0xC8, 0x85, 0xE4, 0x9D, 0xE4, 0xC3, + 0xE4, 0x33, 0xE4, 0x1B, 0xE4, 0x21, 0xF2, 0x5B, 0x0A, 0x9D, 0x62, 0x40, + 0x71, 0xA4, 0xF8, 0x53, 0xE2, 0x28, 0x52, 0xCA, 0x6A, 0x4A, 0x19, 0xE5, + 0x10, 0xE5, 0x34, 0xE5, 0x06, 0x65, 0x98, 0x32, 0x41, 0x55, 0xA3, 0x9A, + 0x52, 0xDD, 0xA8, 0xA1, 0x54, 0x11, 0x35, 0x8F, 0x5A, 0x42, 0xAD, 0xA1, + 0xB6, 0x52, 0xAF, 0x51, 0x87, 0xA8, 0x13, 0x34, 0x75, 0x9A, 0x39, 0xCD, + 0x83, 0x16, 0x49, 0x4B, 0xA5, 0xAD, 0xA2, 0x95, 0xD3, 0x1A, 0x68, 0x17, + 0x68, 0xF7, 0x69, 0xAF, 0xE8, 0x74, 0xBA, 0x11, 0xDD, 0x95, 0x1E, 0x4E, + 0x97, 0xD0, 0x57, 0xD2, 0xCB, 0xE9, 0x47, 0xE8, 0x97, 0xE8, 0x03, 0xF4, + 0x77, 0x0C, 0x0D, 0x86, 0x15, 0x83, 0xC7, 0x88, 0x67, 0x28, 0x19, 0x9B, + 0x18, 0x07, 0x18, 0x67, 0x19, 0x77, 0x18, 0xAF, 0x98, 0x4C, 0xA6, 0x19, + 0xD3, 0x8B, 0x19, 0xC7, 0x54, 0x30, 0x37, 0x31, 0xEB, 0x98, 0xE7, 0x99, + 0x0F, 0x99, 0x6F, 0x55, 0x58, 0x2A, 0xB6, 0x2A, 0x7C, 0x15, 0x91, 0xCA, + 0x0A, 0x95, 0x4A, 0x95, 0x26, 0x95, 0x1B, 0x2A, 0x2F, 0x54, 0xA9, 0xAA, + 0xA6, 0xAA, 0xDE, 0xAA, 0x0B, 0x55, 0xF3, 0x55, 0xCB, 0x54, 0x8F, 0xA9, + 0x5E, 0x53, 0x7D, 0xAE, 0x46, 0x55, 0x33, 0x53, 0xE3, 0xA9, 0x09, 0xD4, + 0x96, 0xAB, 0x55, 0xAA, 0x9D, 0x50, 0xEB, 0x53, 0x1B, 0x53, 0x67, 0xA9, + 0x3B, 0xA8, 0x87, 0xAA, 0x67, 0xA8, 0x6F, 0x54, 0x3F, 0xA4, 0x7E, 0x59, + 0xFD, 0x89, 0x06, 0x59, 0xC3, 0x4C, 0xC3, 0x4F, 0x43, 0xA4, 0x51, 0xA0, + 0xB1, 0x5F, 0xE3, 0xBC, 0xC6, 0x20, 0x0B, 0x63, 0x19, 0xB3, 0x78, 0x2C, + 0x21, 0x6B, 0x0D, 0xAB, 0x86, 0x75, 0x81, 0x35, 0xC4, 0x26, 0xB1, 0xCD, + 0xD9, 0x7C, 0x76, 0x2A, 0xBB, 0x98, 0xFD, 0x1D, 0xBB, 0x8B, 0x3D, 0xAA, + 0xA9, 0xA1, 0x39, 0x43, 0x33, 0x4A, 0x33, 0x57, 0xB3, 0x52, 0xF3, 0x94, + 0x66, 0x3F, 0x07, 0xE3, 0x98, 0x71, 0xF8, 0x9C, 0x74, 0x4E, 0x09, 0xE7, + 0x28, 0xA7, 0x97, 0xF3, 0x7E, 0x8A, 0xDE, 0x14, 0xEF, 0x29, 0xE2, 0x29, + 0x1B, 0xA6, 0x34, 0x4C, 0xB9, 0x31, 0x65, 0x5C, 0x6B, 0xAA, 0x96, 0x97, + 0x96, 0x58, 0xAB, 0x48, 0xAB, 0x51, 0xAB, 0x47, 0xEB, 0xBD, 0x36, 0xAE, + 0xED, 0xA7, 0x9D, 0xA6, 0xBD, 0x45, 0xBB, 0x59, 0xFB, 0x81, 0x0E, 0x41, + 0xC7, 0x4A, 0x27, 0x5C, 0x27, 0x47, 0x67, 0x8F, 0xCE, 0x05, 0x9D, 0xE7, + 0x53, 0xD9, 0x53, 0xDD, 0xA7, 0x0A, 0xA7, 0x16, 0x4D, 0x3D, 0x3A, 0xF5, + 0xAE, 0x2E, 0xAA, 0x6B, 0xA5, 0x1B, 0xA1, 0xBB, 0x44, 0x77, 0xBF, 0x6E, + 0xA7, 0xEE, 0x98, 0x9E, 0xBE, 0x5E, 0x80, 0x9E, 0x4C, 0x6F, 0xA7, 0xDE, + 0x79, 0xBD, 0xE7, 0xFA, 0x1C, 0x7D, 0x2F, 0xFD, 0x54, 0xFD, 0x6D, 0xFA, + 0xA7, 0xF5, 0x47, 0x0C, 0x58, 0x06, 0xB3, 0x0C, 0x24, 0x06, 0xDB, 0x0C, + 0xCE, 0x18, 0x3C, 0xC5, 0x35, 0x71, 0x6F, 0x3C, 0x1D, 0x2F, 0xC7, 0xDB, + 0xF1, 0x51, 0x43, 0x5D, 0xC3, 0x40, 0x43, 0xA5, 0x61, 0x95, 0x61, 0x97, + 0xE1, 0x84, 0x91, 0xB9, 0xD1, 0x3C, 0xA3, 0xD5, 0x46, 0x8D, 0x46, 0x0F, + 0x8C, 0x69, 0xC6, 0x5C, 0xE3, 0x24, 0xE3, 0x6D, 0xC6, 0x6D, 0xC6, 0xA3, + 0x26, 0x06, 0x26, 0x21, 0x26, 0x4B, 0x4D, 0xEA, 0x4D, 0xEE, 0x9A, 0x52, + 0x4D, 0xB9, 0xA6, 0x29, 0xA6, 0x3B, 0x4C, 0x3B, 0x4C, 0xC7, 0xCD, 0xCC, + 0xCD, 0xA2, 0xCD, 0xD6, 0x99, 0x35, 0x9B, 0x3D, 0x31, 0xD7, 0x32, 0xE7, + 0x9B, 0xE7, 0x9B, 0xD7, 0x9B, 0xDF, 0xB7, 0x60, 0x5A, 0x78, 0x5A, 0x2C, + 0xB6, 0xA8, 0xB6, 0xB8, 0x65, 0x49, 0xB2, 0xE4, 0x5A, 0xA6, 0x59, 0xEE, + 0xB6, 0xBC, 0x6E, 0x85, 0x5A, 0x39, 0x59, 0xA5, 0x58, 0x55, 0x5A, 0x5D, + 0xB3, 0x46, 0xAD, 0x9D, 0xAD, 0x25, 0xD6, 0xBB, 0xAD, 0xBB, 0xA7, 0x11, + 0xA7, 0xB9, 0x4E, 0x93, 0x4E, 0xAB, 0x9E, 0xD6, 0x67, 0xC3, 0xB0, 0xF1, + 0xB6, 0xC9, 0xB6, 0xA9, 0xB7, 0x19, 0xB0, 0xE5, 0xD8, 0x06, 0xDB, 0xAE, + 0xB6, 0x6D, 0xB6, 0x7D, 0x61, 0x67, 0x62, 0x17, 0x67, 0xB7, 0xC5, 0xAE, + 0xC3, 0xEE, 0x93, 0xBD, 0x93, 0x7D, 0xBA, 0x7D, 0x8D, 0xFD, 0x3D, 0x07, + 0x0D, 0x87, 0xD9, 0x0E, 0xAB, 0x1D, 0x5A, 0x1D, 0x7E, 0x73, 0xB4, 0x72, + 0x14, 0x3A, 0x56, 0x3A, 0xDE, 0x9A, 0xCE, 0x9C, 0xEE, 0x3F, 0x7D, 0xC5, + 0xF4, 0x96, 0xE9, 0x2F, 0x67, 0x58, 0xCF, 0x10, 0xCF, 0xD8, 0x33, 0xE3, + 0xB6, 0x13, 0xCB, 0x29, 0xC4, 0x69, 0x9D, 0x53, 0x9B, 0xD3, 0x47, 0x67, + 0x17, 0x67, 0xB9, 0x73, 0x83, 0xF3, 0x88, 0x8B, 0x89, 0x4B, 0x82, 0xCB, + 0x2E, 0x97, 0x3E, 0x2E, 0x9B, 0x1B, 0xC6, 0xDD, 0xC8, 0xBD, 0xE4, 0x4A, + 0x74, 0xF5, 0x71, 0x5D, 0xE1, 0x7A, 0xD2, 0xF5, 0x9D, 0x9B, 0xB3, 0x9B, + 0xC2, 0xED, 0xA8, 0xDB, 0xAF, 0xEE, 0x36, 0xEE, 0x69, 0xEE, 0x87, 0xDC, + 0x9F, 0xCC, 0x34, 0x9F, 0x29, 0x9E, 0x59, 0x33, 0x73, 0xD0, 0xC3, 0xC8, + 0x43, 0xE0, 0x51, 0xE5, 0xD1, 0x3F, 0x0B, 0x9F, 0x95, 0x30, 0x6B, 0xDF, + 0xAC, 0x7E, 0x4F, 0x43, 0x4F, 0x81, 0x67, 0xB5, 0xE7, 0x23, 0x2F, 0x63, + 0x2F, 0x91, 0x57, 0xAD, 0xD7, 0xB0, 0xB7, 0xA5, 0x77, 0xAA, 0xF7, 0x61, + 0xEF, 0x17, 0x3E, 0xF6, 0x3E, 0x72, 0x9F, 0xE3, 0x3E, 0xE3, 0x3C, 0x37, + 0xDE, 0x32, 0xDE, 0x59, 0x5F, 0xCC, 0x37, 0xC0, 0xB7, 0xC8, 0xB7, 0xCB, + 0x4F, 0xC3, 0x6F, 0x9E, 0x5F, 0x85, 0xDF, 0x43, 0x7F, 0x23, 0xFF, 0x64, + 0xFF, 0x7A, 0xFF, 0xD1, 0x00, 0xA7, 0x80, 0x25, 0x01, 0x67, 0x03, 0x89, + 0x81, 0x41, 0x81, 0x5B, 0x02, 0xFB, 0xF8, 0x7A, 0x7C, 0x21, 0xBF, 0x8E, + 0x3F, 0x3A, 0xDB, 0x65, 0xF6, 0xB2, 0xD9, 0xED, 0x41, 0x8C, 0xA0, 0xB9, + 0x41, 0x15, 0x41, 0x8F, 0x82, 0xAD, 0x82, 0xE5, 0xC1, 0xAD, 0x21, 0x68, + 0xC8, 0xEC, 0x90, 0xAD, 0x21, 0xF7, 0xE7, 0x98, 0xCE, 0x91, 0xCE, 0x69, + 0x0E, 0x85, 0x50, 0x7E, 0xE8, 0xD6, 0xD0, 0x07, 0x61, 0xE6, 0x61, 0x8B, + 0xC3, 0x7E, 0x0C, 0x27, 0x85, 0x87, 0x85, 0x57, 0x86, 0x3F, 0x8E, 0x70, + 0x88, 0x58, 0x1A, 0xD1, 0x31, 0x97, 0x35, 0x77, 0xD1, 0xDC, 0x43, 0x73, + 0xDF, 0x44, 0xFA, 0x44, 0x96, 0x44, 0xDE, 0x9B, 0x67, 0x31, 0x4F, 0x39, + 0xAF, 0x2D, 0x4A, 0x35, 0x2A, 0x3E, 0xAA, 0x2E, 0x6A, 0x3C, 0xDA, 0x37, + 0xBA, 0x34, 0xBA, 0x3F, 0xC6, 0x2E, 0x66, 0x59, 0xCC, 0xD5, 0x58, 0x9D, + 0x58, 0x49, 0x6C, 0x4B, 0x1C, 0x39, 0x2E, 0x2A, 0xAE, 0x36, 0x6E, 0x6C, + 0xBE, 0xDF, 0xFC, 0xED, 0xF3, 0x87, 0xE2, 0x9D, 0xE2, 0x0B, 0xE3, 0x7B, + 0x17, 0x98, 0x2F, 0xC8, 0x5D, 0x70, 0x79, 0xA1, 0xCE, 0xC2, 0xF4, 0x85, + 0xA7, 0x16, 0xA9, 0x2E, 0x12, 0x2C, 0x3A, 0x96, 0x40, 0x4C, 0x88, 0x4E, + 0x38, 0x94, 0xF0, 0x41, 0x10, 0x2A, 0xA8, 0x16, 0x8C, 0x25, 0xF2, 0x13, + 0x77, 0x25, 0x8E, 0x0A, 0x79, 0xC2, 0x1D, 0xC2, 0x67, 0x22, 0x2F, 0xD1, + 0x36, 0xD1, 0x88, 0xD8, 0x43, 0x5C, 0x2A, 0x1E, 0x4E, 0xF2, 0x48, 0x2A, + 0x4D, 0x7A, 0x92, 0xEC, 0x91, 0xBC, 0x35, 0x79, 0x24, 0xC5, 0x33, 0xA5, + 0x2C, 0xE5, 0xB9, 0x84, 0x27, 0xA9, 0x90, 0xBC, 0x4C, 0x0D, 0x4C, 0xDD, + 0x9B, 0x3A, 0x9E, 0x16, 0x9A, 0x76, 0x20, 0x6D, 0x32, 0x3D, 0x3A, 0xBD, + 0x31, 0x83, 0x92, 0x91, 0x90, 0x71, 0x42, 0xAA, 0x21, 0x4D, 0x93, 0xB6, + 0x67, 0xEA, 0x67, 0xE6, 0x66, 0x76, 0xCB, 0xAC, 0x65, 0x85, 0xB2, 0xFE, + 0xC5, 0x6E, 0x8B, 0xB7, 0x2F, 0x1E, 0x95, 0x07, 0xC9, 0x6B, 0xB3, 0x90, + 0xAC, 0x05, 0x59, 0x2D, 0x0A, 0xB6, 0x42, 0xA6, 0xE8, 0x54, 0x5A, 0x28, + 0xD7, 0x2A, 0x07, 0xB2, 0x67, 0x65, 0x57, 0x66, 0xBF, 0xCD, 0x89, 0xCA, + 0x39, 0x96, 0xAB, 0x9E, 0x2B, 0xCD, 0xED, 0xCC, 0xB3, 0xCA, 0xDB, 0x90, + 0x37, 0x9C, 0xEF, 0x9F, 0xFF, 0xED, 0x12, 0xC2, 0x12, 0xE1, 0x92, 0xB6, + 0xA5, 0x86, 0x4B, 0x57, 0x2D, 0x1D, 0x58, 0xE6, 0xBD, 0xAC, 0x6A, 0x39, + 0xB2, 0x3C, 0x71, 0x79, 0xDB, 0x0A, 0xE3, 0x15, 0x05, 0x2B, 0x86, 0x56, + 0x06, 0xAC, 0x3C, 0xB8, 0x8A, 0xB6, 0x2A, 0x6D, 0xD5, 0x4F, 0xAB, 0xED, + 0x57, 0x97, 0xAE, 0x7E, 0xBD, 0x26, 0x7A, 0x4D, 0x6B, 0x81, 0x5E, 0xC1, + 0xCA, 0x82, 0xC1, 0xB5, 0x01, 0x6B, 0xEB, 0x0B, 0x55, 0x0A, 0xE5, 0x85, + 0x7D, 0xEB, 0xDC, 0xD7, 0xED, 0x5D, 0x4F, 0x58, 0x2F, 0x59, 0xDF, 0xB5, + 0x61, 0xFA, 0x86, 0x9D, 0x1B, 0x3E, 0x15, 0x89, 0x8A, 0xAE, 0x14, 0xDB, + 0x17, 0x97, 0x15, 0x7F, 0xD8, 0x28, 0xDC, 0x78, 0xE5, 0x1B, 0x87, 0x6F, + 0xCA, 0xBF, 0x99, 0xDC, 0x94, 0xB4, 0xA9, 0xAB, 0xC4, 0xB9, 0x64, 0xCF, + 0x66, 0xD2, 0x66, 0xE9, 0xE6, 0xDE, 0x2D, 0x9E, 0x5B, 0x0E, 0x96, 0xAA, + 0x97, 0xE6, 0x97, 0x0E, 0x6E, 0x0D, 0xD9, 0xDA, 0xB4, 0x0D, 0xDF, 0x56, + 0xB4, 0xED, 0xF5, 0xF6, 0x45, 0xDB, 0x2F, 0x97, 0xCD, 0x28, 0xDB, 0xBB, + 0x83, 0xB6, 0x43, 0xB9, 0xA3, 0xBF, 0x3C, 0xB8, 0xBC, 0x65, 0xA7, 0xC9, + 0xCE, 0xCD, 0x3B, 0x3F, 0x54, 0xA4, 0x54, 0xF4, 0x54, 0xFA, 0x54, 0x36, + 0xEE, 0xD2, 0xDD, 0xB5, 0x61, 0xD7, 0xF8, 0x6E, 0xD1, 0xEE, 0x1B, 0x7B, + 0xBC, 0xF6, 0x34, 0xEC, 0xD5, 0xDB, 0x5B, 0xBC, 0xF7, 0xFD, 0x3E, 0xC9, + 0xBE, 0xDB, 0x55, 0x01, 0x55, 0x4D, 0xD5, 0x66, 0xD5, 0x65, 0xFB, 0x49, + 0xFB, 0xB3, 0xF7, 0x3F, 0xAE, 0x89, 0xAA, 0xE9, 0xF8, 0x96, 0xFB, 0x6D, + 0x5D, 0xAD, 0x4E, 0x6D, 0x71, 0xED, 0xC7, 0x03, 0xD2, 0x03, 0xFD, 0x07, + 0x23, 0x0E, 0xB6, 0xD7, 0xB9, 0xD4, 0xD5, 0x1D, 0xD2, 0x3D, 0x54, 0x52, + 0x8F, 0xD6, 0x2B, 0xEB, 0x47, 0x0E, 0xC7, 0x1F, 0xBE, 0xFE, 0x9D, 0xEF, + 0x77, 0x2D, 0x0D, 0x36, 0x0D, 0x55, 0x8D, 0x9C, 0xC6, 0xE2, 0x23, 0x70, + 0x44, 0x79, 0xE4, 0xE9, 0xF7, 0x09, 0xDF, 0xF7, 0x1E, 0x0D, 0x3A, 0xDA, + 0x76, 0x8C, 0x7B, 0xAC, 0xE1, 0x07, 0xD3, 0x1F, 0x76, 0x1D, 0x67, 0x1D, + 0x2F, 0x6A, 0x42, 0x9A, 0xF2, 0x9A, 0x46, 0x9B, 0x53, 0x9A, 0xFB, 0x5B, + 0x62, 0x5B, 0xBA, 0x4F, 0xCC, 0x3E, 0xD1, 0xD6, 0xEA, 0xDE, 0x7A, 0xFC, + 0x47, 0xDB, 0x1F, 0x0F, 0x9C, 0x34, 0x3C, 0x59, 0x79, 0x4A, 0xF3, 0x54, + 0xC9, 0x69, 0xDA, 0xE9, 0x82, 0xD3, 0x93, 0x67, 0xF2, 0xCF, 0x8C, 0x9D, + 0x95, 0x9D, 0x7D, 0x7E, 0x2E, 0xF9, 0xDC, 0x60, 0xDB, 0xA2, 0xB6, 0x7B, + 0xE7, 0x63, 0xCE, 0xDF, 0x6A, 0x0F, 0x6F, 0xEF, 0xBA, 0x10, 0x74, 0xE1, + 0xD2, 0x45, 0xFF, 0x8B, 0xE7, 0x3B, 0xBC, 0x3B, 0xCE, 0x5C, 0xF2, 0xB8, + 0x74, 0xF2, 0xB2, 0xDB, 0xE5, 0x13, 0x57, 0xB8, 0x57, 0x9A, 0xAF, 0x3A, + 0x5F, 0x6D, 0xEA, 0x74, 0xEA, 0x3C, 0xFE, 0x93, 0xD3, 0x4F, 0xC7, 0xBB, + 0x9C, 0xBB, 0x9A, 0xAE, 0xB9, 0x5C, 0x6B, 0xB9, 0xEE, 0x7A, 0xBD, 0xB5, + 0x7B, 0x66, 0xF7, 0xE9, 0x1B, 0x9E, 0x37, 0xCE, 0xDD, 0xF4, 0xBD, 0x79, + 0xF1, 0x16, 0xFF, 0xD6, 0xD5, 0x9E, 0x39, 0x3D, 0xDD, 0xBD, 0xF3, 0x7A, + 0x6F, 0xF7, 0xC5, 0xF7, 0xF5, 0xDF, 0x16, 0xDD, 0x7E, 0x72, 0x27, 0xFD, + 0xCE, 0xCB, 0xBB, 0xD9, 0x77, 0x27, 0xEE, 0xAD, 0xBC, 0x4F, 0xBC, 0x5F, + 0xF4, 0x40, 0xED, 0x41, 0xD9, 0x43, 0xDD, 0x87, 0xD5, 0x3F, 0x5B, 0xFE, + 0xDC, 0xD8, 0xEF, 0xDC, 0x7F, 0x6A, 0xC0, 0x77, 0xA0, 0xF3, 0xD1, 0xDC, + 0x47, 0xF7, 0x06, 0x85, 0x83, 0xCF, 0xFE, 0x91, 0xF5, 0x8F, 0x0F, 0x43, + 0x05, 0x8F, 0x99, 0x8F, 0xCB, 0x86, 0x0D, 0x86, 0xEB, 0x9E, 0x38, 0x3E, + 0x39, 0x39, 0xE2, 0x3F, 0x72, 0xFD, 0xE9, 0xFC, 0xA7, 0x43, 0xCF, 0x64, + 0xCF, 0x26, 0x9E, 0x17, 0xFE, 0xA2, 0xFE, 0xCB, 0xAE, 0x17, 0x16, 0x2F, + 0x7E, 0xF8, 0xD5, 0xEB, 0xD7, 0xCE, 0xD1, 0x98, 0xD1, 0xA1, 0x97, 0xF2, + 0x97, 0x93, 0xBF, 0x6D, 0x7C, 0xA5, 0xFD, 0xEA, 0xC0, 0xEB, 0x19, 0xAF, + 0xDB, 0xC6, 0xC2, 0xC6, 0x1E, 0xBE, 0xC9, 0x78, 0x33, 0x31, 0x5E, 0xF4, + 0x56, 0xFB, 0xED, 0xC1, 0x77, 0xDC, 0x77, 0x1D, 0xEF, 0xA3, 0xDF, 0x0F, + 0x4F, 0xE4, 0x7C, 0x20, 0x7F, 0x28, 0xFF, 0x68, 0xF9, 0xB1, 0xF5, 0x53, + 0xD0, 0xA7, 0xFB, 0x93, 0x19, 0x93, 0x93, 0xFF, 0x04, 0x03, 0x98, 0xF3, + 0xFC, 0x63, 0x33, 0x2D, 0xDB, 0x00, 0x00, 0x3A, 0xFD, 0x69, 0x54, 0x58, + 0x74, 0x58, 0x4D, 0x4C, 0x3A, 0x63, 0x6F, 0x6D, 0x2E, 0x61, 0x64, 0x6F, + 0x62, 0x65, 0x2E, 0x78, 0x6D, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, + 0x3F, 0x78, 0x70, 0x61, 0x63, 0x6B, 0x65, 0x74, 0x20, 0x62, 0x65, 0x67, + 0x69, 0x6E, 0x3D, 0x22, 0xEF, 0xBB, 0xBF, 0x22, 0x20, 0x69, 0x64, 0x3D, + 0x22, 0x57, 0x35, 0x4D, 0x30, 0x4D, 0x70, 0x43, 0x65, 0x68, 0x69, 0x48, + 0x7A, 0x72, 0x65, 0x53, 0x7A, 0x4E, 0x54, 0x63, 0x7A, 0x6B, 0x63, 0x39, + 0x64, 0x22, 0x3F, 0x3E, 0x0A, 0x3C, 0x78, 0x3A, 0x78, 0x6D, 0x70, 0x6D, + 0x65, 0x74, 0x61, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, 0x3A, 0x78, 0x3D, + 0x22, 0x61, 0x64, 0x6F, 0x62, 0x65, 0x3A, 0x6E, 0x73, 0x3A, 0x6D, 0x65, + 0x74, 0x61, 0x2F, 0x22, 0x20, 0x78, 0x3A, 0x78, 0x6D, 0x70, 0x74, 0x6B, + 0x3D, 0x22, 0x41, 0x64, 0x6F, 0x62, 0x65, 0x20, 0x58, 0x4D, 0x50, 0x20, + 0x43, 0x6F, 0x72, 0x65, 0x20, 0x35, 0x2E, 0x36, 0x2D, 0x63, 0x31, 0x33, + 0x38, 0x20, 0x37, 0x39, 0x2E, 0x31, 0x35, 0x39, 0x38, 0x32, 0x34, 0x2C, + 0x20, 0x32, 0x30, 0x31, 0x36, 0x2F, 0x30, 0x39, 0x2F, 0x31, 0x34, 0x2D, + 0x30, 0x31, 0x3A, 0x30, 0x39, 0x3A, 0x30, 0x31, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x3C, 0x72, + 0x64, 0x66, 0x3A, 0x52, 0x44, 0x46, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, + 0x3A, 0x72, 0x64, 0x66, 0x3D, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, + 0x2F, 0x77, 0x77, 0x77, 0x2E, 0x77, 0x33, 0x2E, 0x6F, 0x72, 0x67, 0x2F, + 0x31, 0x39, 0x39, 0x39, 0x2F, 0x30, 0x32, 0x2F, 0x32, 0x32, 0x2D, 0x72, + 0x64, 0x66, 0x2D, 0x73, 0x79, 0x6E, 0x74, 0x61, 0x78, 0x2D, 0x6E, 0x73, + 0x23, 0x22, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, + 0x64, 0x66, 0x3A, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6F, 0x6E, 0x20, 0x72, 0x64, 0x66, 0x3A, 0x61, 0x62, 0x6F, 0x75, 0x74, + 0x3D, 0x22, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, 0x3A, 0x78, 0x6D, + 0x70, 0x3D, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x6E, 0x73, + 0x2E, 0x61, 0x64, 0x6F, 0x62, 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x78, + 0x61, 0x70, 0x2F, 0x31, 0x2E, 0x30, 0x2F, 0x22, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, 0x6C, + 0x6E, 0x73, 0x3A, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3D, 0x22, 0x68, 0x74, + 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x6E, 0x73, 0x2E, 0x61, 0x64, 0x6F, 0x62, + 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x78, 0x61, 0x70, 0x2F, 0x31, 0x2E, + 0x30, 0x2F, 0x6D, 0x6D, 0x2F, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, + 0x3A, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3D, 0x22, 0x68, 0x74, 0x74, 0x70, + 0x3A, 0x2F, 0x2F, 0x6E, 0x73, 0x2E, 0x61, 0x64, 0x6F, 0x62, 0x65, 0x2E, + 0x63, 0x6F, 0x6D, 0x2F, 0x78, 0x61, 0x70, 0x2F, 0x31, 0x2E, 0x30, 0x2F, + 0x73, 0x54, 0x79, 0x70, 0x65, 0x2F, 0x52, 0x65, 0x73, 0x6F, 0x75, 0x72, + 0x63, 0x65, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x23, 0x22, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, + 0x6C, 0x6E, 0x73, 0x3A, 0x70, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, + 0x70, 0x3D, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x6E, 0x73, + 0x2E, 0x61, 0x64, 0x6F, 0x62, 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x70, + 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x2F, 0x31, 0x2E, 0x30, + 0x2F, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, 0x3A, 0x64, 0x63, 0x3D, + 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x70, 0x75, 0x72, 0x6C, + 0x2E, 0x6F, 0x72, 0x67, 0x2F, 0x64, 0x63, 0x2F, 0x65, 0x6C, 0x65, 0x6D, + 0x65, 0x6E, 0x74, 0x73, 0x2F, 0x31, 0x2E, 0x31, 0x2F, 0x22, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, + 0x6D, 0x6C, 0x6E, 0x73, 0x3A, 0x74, 0x69, 0x66, 0x66, 0x3D, 0x22, 0x68, + 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x6E, 0x73, 0x2E, 0x61, 0x64, 0x6F, + 0x62, 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x74, 0x69, 0x66, 0x66, 0x2F, + 0x31, 0x2E, 0x30, 0x2F, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, 0x3A, + 0x65, 0x78, 0x69, 0x66, 0x3D, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, + 0x2F, 0x6E, 0x73, 0x2E, 0x61, 0x64, 0x6F, 0x62, 0x65, 0x2E, 0x63, 0x6F, + 0x6D, 0x2F, 0x65, 0x78, 0x69, 0x66, 0x2F, 0x31, 0x2E, 0x30, 0x2F, 0x22, + 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, + 0x78, 0x6D, 0x70, 0x3A, 0x43, 0x72, 0x65, 0x61, 0x74, 0x6F, 0x72, 0x54, + 0x6F, 0x6F, 0x6C, 0x3E, 0x41, 0x64, 0x6F, 0x62, 0x65, 0x20, 0x50, 0x68, + 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x20, 0x43, 0x43, 0x20, 0x32, + 0x30, 0x31, 0x37, 0x20, 0x28, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, + 0x29, 0x3C, 0x2F, 0x78, 0x6D, 0x70, 0x3A, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x6F, 0x72, 0x54, 0x6F, 0x6F, 0x6C, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x3A, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x65, 0x3E, 0x32, 0x30, 0x31, + 0x38, 0x2D, 0x30, 0x34, 0x2D, 0x30, 0x31, 0x54, 0x32, 0x31, 0x3A, 0x35, + 0x39, 0x3A, 0x31, 0x34, 0x2B, 0x30, 0x38, 0x3A, 0x30, 0x30, 0x3C, 0x2F, + 0x78, 0x6D, 0x70, 0x3A, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, + 0x74, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x3A, 0x4D, 0x65, 0x74, 0x61, 0x64, 0x61, + 0x74, 0x61, 0x44, 0x61, 0x74, 0x65, 0x3E, 0x32, 0x30, 0x31, 0x38, 0x2D, + 0x30, 0x34, 0x2D, 0x30, 0x31, 0x54, 0x32, 0x31, 0x3A, 0x35, 0x39, 0x3A, + 0x31, 0x34, 0x2B, 0x30, 0x38, 0x3A, 0x30, 0x30, 0x3C, 0x2F, 0x78, 0x6D, + 0x70, 0x3A, 0x4D, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x44, 0x61, + 0x74, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x3A, 0x4D, 0x6F, 0x64, 0x69, 0x66, 0x79, + 0x44, 0x61, 0x74, 0x65, 0x3E, 0x32, 0x30, 0x31, 0x38, 0x2D, 0x30, 0x34, + 0x2D, 0x30, 0x31, 0x54, 0x32, 0x31, 0x3A, 0x35, 0x39, 0x3A, 0x31, 0x34, + 0x2B, 0x30, 0x38, 0x3A, 0x30, 0x30, 0x3C, 0x2F, 0x78, 0x6D, 0x70, 0x3A, + 0x4D, 0x6F, 0x64, 0x69, 0x66, 0x79, 0x44, 0x61, 0x74, 0x65, 0x3E, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x78, 0x6D, + 0x70, 0x4D, 0x4D, 0x3A, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, + 0x49, 0x44, 0x3E, 0x78, 0x6D, 0x70, 0x2E, 0x69, 0x69, 0x64, 0x3A, 0x32, + 0x33, 0x31, 0x33, 0x66, 0x37, 0x35, 0x35, 0x2D, 0x32, 0x37, 0x39, 0x32, + 0x2D, 0x66, 0x33, 0x34, 0x39, 0x2D, 0x61, 0x62, 0x33, 0x63, 0x2D, 0x35, + 0x35, 0x37, 0x35, 0x64, 0x62, 0x32, 0x39, 0x36, 0x62, 0x30, 0x33, 0x3C, + 0x2F, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x49, 0x6E, 0x73, 0x74, 0x61, + 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x44, + 0x6F, 0x63, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x49, 0x44, 0x3E, 0x61, 0x64, + 0x6F, 0x62, 0x65, 0x3A, 0x64, 0x6F, 0x63, 0x69, 0x64, 0x3A, 0x70, 0x68, + 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x3A, 0x64, 0x63, 0x38, 0x34, + 0x38, 0x37, 0x30, 0x30, 0x2D, 0x33, 0x35, 0x62, 0x34, 0x2D, 0x31, 0x31, + 0x65, 0x38, 0x2D, 0x39, 0x31, 0x61, 0x34, 0x2D, 0x38, 0x38, 0x34, 0x37, + 0x30, 0x37, 0x30, 0x65, 0x31, 0x35, 0x34, 0x62, 0x3C, 0x2F, 0x78, 0x6D, + 0x70, 0x4D, 0x4D, 0x3A, 0x44, 0x6F, 0x63, 0x75, 0x6D, 0x65, 0x6E, 0x74, + 0x49, 0x44, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x4F, 0x72, 0x69, 0x67, + 0x69, 0x6E, 0x61, 0x6C, 0x44, 0x6F, 0x63, 0x75, 0x6D, 0x65, 0x6E, 0x74, + 0x49, 0x44, 0x3E, 0x78, 0x6D, 0x70, 0x2E, 0x64, 0x69, 0x64, 0x3A, 0x61, + 0x32, 0x66, 0x61, 0x64, 0x37, 0x64, 0x61, 0x2D, 0x66, 0x61, 0x64, 0x37, + 0x2D, 0x39, 0x66, 0x34, 0x30, 0x2D, 0x62, 0x64, 0x33, 0x31, 0x2D, 0x61, + 0x37, 0x35, 0x61, 0x36, 0x31, 0x30, 0x39, 0x31, 0x32, 0x32, 0x63, 0x3C, + 0x2F, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x4F, 0x72, 0x69, 0x67, 0x69, + 0x6E, 0x61, 0x6C, 0x44, 0x6F, 0x63, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x49, + 0x44, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x3C, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x48, 0x69, 0x73, 0x74, 0x6F, + 0x72, 0x79, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x64, 0x66, 0x3A, 0x53, 0x65, 0x71, + 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x64, 0x66, 0x3A, 0x6C, 0x69, + 0x20, 0x72, 0x64, 0x66, 0x3A, 0x70, 0x61, 0x72, 0x73, 0x65, 0x54, 0x79, + 0x70, 0x65, 0x3D, 0x22, 0x52, 0x65, 0x73, 0x6F, 0x75, 0x72, 0x63, 0x65, + 0x22, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, + 0x45, 0x76, 0x74, 0x3A, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x63, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, + 0x74, 0x3A, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x69, + 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3E, 0x78, 0x6D, + 0x70, 0x2E, 0x69, 0x69, 0x64, 0x3A, 0x61, 0x32, 0x66, 0x61, 0x64, 0x37, + 0x64, 0x61, 0x2D, 0x66, 0x61, 0x64, 0x37, 0x2D, 0x39, 0x66, 0x34, 0x30, + 0x2D, 0x62, 0x64, 0x33, 0x31, 0x2D, 0x61, 0x37, 0x35, 0x61, 0x36, 0x31, + 0x30, 0x39, 0x31, 0x32, 0x32, 0x63, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, + 0x74, 0x3A, 0x69, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, + 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x45, + 0x76, 0x74, 0x3A, 0x77, 0x68, 0x65, 0x6E, 0x3E, 0x32, 0x30, 0x31, 0x38, + 0x2D, 0x30, 0x34, 0x2D, 0x30, 0x31, 0x54, 0x32, 0x31, 0x3A, 0x35, 0x39, + 0x3A, 0x31, 0x34, 0x2B, 0x30, 0x38, 0x3A, 0x30, 0x30, 0x3C, 0x2F, 0x73, + 0x74, 0x45, 0x76, 0x74, 0x3A, 0x77, 0x68, 0x65, 0x6E, 0x3E, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, + 0x73, 0x6F, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x41, 0x67, 0x65, 0x6E, + 0x74, 0x3E, 0x41, 0x64, 0x6F, 0x62, 0x65, 0x20, 0x50, 0x68, 0x6F, 0x74, + 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x20, 0x43, 0x43, 0x20, 0x32, 0x30, 0x31, + 0x37, 0x20, 0x28, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x29, 0x3C, + 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x73, 0x6F, 0x66, 0x74, 0x77, + 0x61, 0x72, 0x65, 0x41, 0x67, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x3C, 0x2F, 0x72, 0x64, 0x66, 0x3A, 0x6C, 0x69, 0x3E, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x3C, 0x72, 0x64, 0x66, 0x3A, 0x6C, 0x69, 0x20, 0x72, 0x64, + 0x66, 0x3A, 0x70, 0x61, 0x72, 0x73, 0x65, 0x54, 0x79, 0x70, 0x65, 0x3D, + 0x22, 0x52, 0x65, 0x73, 0x6F, 0x75, 0x72, 0x63, 0x65, 0x22, 0x3E, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, + 0x3A, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x73, 0x61, 0x76, 0x65, + 0x64, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x61, 0x63, 0x74, + 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, + 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x69, 0x6E, 0x73, 0x74, 0x61, 0x6E, + 0x63, 0x65, 0x49, 0x44, 0x3E, 0x78, 0x6D, 0x70, 0x2E, 0x69, 0x69, 0x64, + 0x3A, 0x32, 0x33, 0x31, 0x33, 0x66, 0x37, 0x35, 0x35, 0x2D, 0x32, 0x37, + 0x39, 0x32, 0x2D, 0x66, 0x33, 0x34, 0x39, 0x2D, 0x61, 0x62, 0x33, 0x63, + 0x2D, 0x35, 0x35, 0x37, 0x35, 0x64, 0x62, 0x32, 0x39, 0x36, 0x62, 0x30, + 0x33, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x69, 0x6E, 0x73, + 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3E, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x77, 0x68, + 0x65, 0x6E, 0x3E, 0x32, 0x30, 0x31, 0x38, 0x2D, 0x30, 0x34, 0x2D, 0x30, + 0x31, 0x54, 0x32, 0x31, 0x3A, 0x35, 0x39, 0x3A, 0x31, 0x34, 0x2B, 0x30, + 0x38, 0x3A, 0x30, 0x30, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, + 0x77, 0x68, 0x65, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x73, 0x6F, 0x66, 0x74, 0x77, + 0x61, 0x72, 0x65, 0x41, 0x67, 0x65, 0x6E, 0x74, 0x3E, 0x41, 0x64, 0x6F, + 0x62, 0x65, 0x20, 0x50, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, + 0x20, 0x43, 0x43, 0x20, 0x32, 0x30, 0x31, 0x37, 0x20, 0x28, 0x57, 0x69, + 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x29, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, + 0x74, 0x3A, 0x73, 0x6F, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x41, 0x67, + 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, + 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x63, 0x68, 0x61, 0x6E, 0x67, 0x65, + 0x64, 0x3E, 0x2F, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x63, + 0x68, 0x61, 0x6E, 0x67, 0x65, 0x64, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, + 0x2F, 0x72, 0x64, 0x66, 0x3A, 0x6C, 0x69, 0x3E, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x72, + 0x64, 0x66, 0x3A, 0x53, 0x65, 0x71, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x78, 0x6D, 0x70, 0x4D, 0x4D, + 0x3A, 0x48, 0x69, 0x73, 0x74, 0x6F, 0x72, 0x79, 0x3E, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x70, 0x68, 0x6F, 0x74, + 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x3A, 0x44, 0x6F, 0x63, 0x75, 0x6D, 0x65, + 0x6E, 0x74, 0x41, 0x6E, 0x63, 0x65, 0x73, 0x74, 0x6F, 0x72, 0x73, 0x3E, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x3C, 0x72, 0x64, 0x66, 0x3A, 0x42, 0x61, 0x67, 0x3E, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x3C, 0x72, 0x64, 0x66, 0x3A, 0x6C, 0x69, 0x3E, 0x78, 0x6D, + 0x70, 0x2E, 0x64, 0x69, 0x64, 0x3A, 0x39, 0x30, 0x39, 0x62, 0x39, 0x65, + 0x35, 0x32, 0x2D, 0x39, 0x37, 0x62, 0x64, 0x2D, 0x34, 0x32, 0x39, 0x33, + 0x2D, 0x38, 0x30, 0x64, 0x32, 0x2D, 0x31, 0x31, 0x64, 0x65, 0x62, 0x64, + 0x36, 0x61, 0x33, 0x33, 0x65, 0x62, 0x3C, 0x2F, 0x72, 0x64, 0x66, 0x3A, + 0x6C, 0x69, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x72, 0x64, 0x66, 0x3A, 0x42, 0x61, + 0x67, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x3C, 0x2F, 0x70, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x3A, + 0x44, 0x6F, 0x63, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x41, 0x6E, 0x63, 0x65, + 0x73, 0x74, 0x6F, 0x72, 0x73, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3C, 0x70, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, + 0x6F, 0x70, 0x3A, 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x4D, 0x6F, 0x64, 0x65, + 0x3E, 0x33, 0x3C, 0x2F, 0x70, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, + 0x70, 0x3A, 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x4D, 0x6F, 0x64, 0x65, 0x3E, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x70, + 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x3A, 0x49, 0x43, 0x43, + 0x50, 0x72, 0x6F, 0x66, 0x69, 0x6C, 0x65, 0x3E, 0x73, 0x52, 0x47, 0x42, + 0x20, 0x49, 0x45, 0x43, 0x36, 0x31, 0x39, 0x36, 0x36, 0x2D, 0x32, 0x2E, + 0x31, 0x3C, 0x2F, 0x70, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, + 0x3A, 0x49, 0x43, 0x43, 0x50, 0x72, 0x6F, 0x66, 0x69, 0x6C, 0x65, 0x3E, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, + 0x63, 0x3A, 0x66, 0x6F, 0x72, 0x6D, 0x61, 0x74, 0x3E, 0x69, 0x6D, 0x61, + 0x67, 0x65, 0x2F, 0x70, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x63, 0x3A, 0x66, + 0x6F, 0x72, 0x6D, 0x61, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3C, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x4F, 0x72, + 0x69, 0x65, 0x6E, 0x74, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x31, 0x3C, + 0x2F, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x4F, 0x72, 0x69, 0x65, 0x6E, 0x74, + 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3C, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x58, 0x52, + 0x65, 0x73, 0x6F, 0x6C, 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x33, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x2F, 0x31, 0x30, 0x30, 0x30, 0x30, 0x3C, + 0x2F, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x58, 0x52, 0x65, 0x73, 0x6F, 0x6C, + 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3C, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x59, 0x52, + 0x65, 0x73, 0x6F, 0x6C, 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x33, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x2F, 0x31, 0x30, 0x30, 0x30, 0x30, 0x3C, + 0x2F, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x59, 0x52, 0x65, 0x73, 0x6F, 0x6C, + 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3C, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x52, 0x65, + 0x73, 0x6F, 0x6C, 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x55, 0x6E, 0x69, 0x74, + 0x3E, 0x32, 0x3C, 0x2F, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x52, 0x65, 0x73, + 0x6F, 0x6C, 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x55, 0x6E, 0x69, 0x74, 0x3E, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x65, + 0x78, 0x69, 0x66, 0x3A, 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x53, 0x70, 0x61, + 0x63, 0x65, 0x3E, 0x31, 0x3C, 0x2F, 0x65, 0x78, 0x69, 0x66, 0x3A, 0x43, + 0x6F, 0x6C, 0x6F, 0x72, 0x53, 0x70, 0x61, 0x63, 0x65, 0x3E, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x65, 0x78, 0x69, + 0x66, 0x3A, 0x50, 0x69, 0x78, 0x65, 0x6C, 0x58, 0x44, 0x69, 0x6D, 0x65, + 0x6E, 0x73, 0x69, 0x6F, 0x6E, 0x3E, 0x31, 0x32, 0x30, 0x3C, 0x2F, 0x65, + 0x78, 0x69, 0x66, 0x3A, 0x50, 0x69, 0x78, 0x65, 0x6C, 0x58, 0x44, 0x69, + 0x6D, 0x65, 0x6E, 0x73, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x65, 0x78, 0x69, 0x66, 0x3A, + 0x50, 0x69, 0x78, 0x65, 0x6C, 0x59, 0x44, 0x69, 0x6D, 0x65, 0x6E, 0x73, + 0x69, 0x6F, 0x6E, 0x3E, 0x31, 0x32, 0x30, 0x3C, 0x2F, 0x65, 0x78, 0x69, + 0x66, 0x3A, 0x50, 0x69, 0x78, 0x65, 0x6C, 0x59, 0x44, 0x69, 0x6D, 0x65, + 0x6E, 0x73, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x3C, 0x2F, 0x72, 0x64, 0x66, 0x3A, 0x44, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x3C, + 0x2F, 0x72, 0x64, 0x66, 0x3A, 0x52, 0x44, 0x46, 0x3E, 0x0A, 0x3C, 0x2F, + 0x78, 0x3A, 0x78, 0x6D, 0x70, 0x6D, 0x65, 0x74, 0x61, 0x3E, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x3C, + 0x3F, 0x78, 0x70, 0x61, 0x63, 0x6B, 0x65, 0x74, 0x20, 0x65, 0x6E, 0x64, + 0x3D, 0x22, 0x77, 0x22, 0x3F, 0x3E, 0x78, 0xE1, 0xB7, 0x9F, 0x00, 0x00, + 0x00, 0x20, 0x63, 0x48, 0x52, 0x4D, 0x00, 0x00, 0x7A, 0x25, 0x00, 0x00, + 0x80, 0x83, 0x00, 0x00, 0xF9, 0xFF, 0x00, 0x00, 0x80, 0xE9, 0x00, 0x00, + 0x75, 0x30, 0x00, 0x00, 0xEA, 0x60, 0x00, 0x00, 0x3A, 0x98, 0x00, 0x00, + 0x17, 0x6F, 0x92, 0x5F, 0xC5, 0x46, 0x00, 0x00, 0x0D, 0xDB, 0x49, 0x44, + 0x41, 0x54, 0x78, 0xDA, 0xEC, 0x9D, 0x79, 0x70, 0xD5, 0xD5, 0x15, 0xC7, + 0xBF, 0x2F, 0x21, 0x46, 0x88, 0x24, 0x84, 0x04, 0x15, 0xC4, 0x32, 0xE0, + 0x82, 0x88, 0x8A, 0x80, 0x48, 0x47, 0xAA, 0x8E, 0xD6, 0x05, 0x5C, 0xAA, + 0xA2, 0xD6, 0xB1, 0x08, 0x6A, 0xD5, 0x56, 0xB4, 0x75, 0x5F, 0x6A, 0xDD, + 0x82, 0x6B, 0xC5, 0xE2, 0x86, 0xB4, 0xD6, 0xDA, 0xD6, 0x8D, 0x8A, 0x75, + 0x5C, 0xC6, 0x1D, 0xB4, 0x3A, 0x50, 0xB7, 0xBA, 0x55, 0x45, 0x44, 0x91, + 0x28, 0x22, 0xAB, 0x52, 0x76, 0x49, 0x42, 0x96, 0x6F, 0xFF, 0xB8, 0xDF, + 0x37, 0xF3, 0x4C, 0x21, 0xF9, 0x9D, 0x9B, 0xDF, 0x7B, 0xEF, 0x17, 0x72, + 0xCF, 0xCC, 0x6F, 0x70, 0xCC, 0xFB, 0xBD, 0x7B, 0xDF, 0xFD, 0xFC, 0xCE, + 0xB9, 0xE7, 0xDE, 0x7B, 0xCE, 0xF9, 0xA5, 0x48, 0x22, 0xC8, 0x96, 0x2B, + 0x05, 0x61, 0x08, 0x02, 0xE0, 0x20, 0x01, 0x70, 0x90, 0x00, 0x38, 0x48, + 0x00, 0x1C, 0x24, 0x00, 0x0E, 0x12, 0x00, 0x07, 0x09, 0x80, 0x03, 0xE0, + 0x20, 0x01, 0x70, 0x90, 0x00, 0x38, 0x48, 0x00, 0x1C, 0x24, 0x00, 0x0E, + 0x12, 0x00, 0x07, 0x09, 0x80, 0x03, 0xE0, 0x20, 0x01, 0x70, 0x90, 0xF6, + 0x27, 0x9D, 0x12, 0xD2, 0x8F, 0x42, 0x00, 0x83, 0x00, 0x1C, 0x09, 0x60, + 0x00, 0x80, 0x62, 0x00, 0x5F, 0x01, 0x78, 0x0B, 0xC0, 0x8B, 0x00, 0xBE, + 0x03, 0xD0, 0x98, 0x60, 0x25, 0xD9, 0x19, 0xC0, 0xF1, 0x00, 0x06, 0x02, + 0xD8, 0x06, 0xC0, 0x22, 0x00, 0xEF, 0x02, 0x78, 0x0A, 0xC0, 0xEA, 0x8E, + 0x0E, 0xB8, 0x04, 0xC0, 0xD1, 0x00, 0x2E, 0x05, 0x30, 0xA4, 0xD9, 0xDF, + 0x96, 0x01, 0x98, 0x0A, 0xE0, 0x3E, 0x00, 0x9F, 0x01, 0x48, 0x5A, 0x7C, + 0x51, 0x31, 0x80, 0x91, 0xEA, 0xFB, 0x88, 0x66, 0x7F, 0x5B, 0x07, 0xA0, + 0x3F, 0x80, 0x5B, 0x01, 0xAC, 0xCC, 0x5B, 0x0F, 0x49, 0xE6, 0xFB, 0xDA, + 0x9D, 0xE4, 0x7B, 0xDC, 0xBC, 0x6C, 0x20, 0x79, 0x3B, 0xC9, 0x01, 0x24, + 0x53, 0x09, 0xE8, 0x6F, 0xFA, 0xEA, 0x42, 0xF2, 0xF8, 0x56, 0xFA, 0x5E, + 0x4F, 0xF2, 0x12, 0x92, 0x9D, 0xF2, 0xD5, 0xCF, 0x24, 0xCC, 0xC1, 0x7B, + 0x00, 0xD8, 0xBD, 0x85, 0xBF, 0x77, 0x06, 0x70, 0x2E, 0x80, 0x73, 0xA4, + 0x11, 0xA9, 0x04, 0xF4, 0xB9, 0x0B, 0x80, 0x23, 0x00, 0x5C, 0xB1, 0x09, + 0xAB, 0xD3, 0xDC, 0x42, 0x8E, 0x94, 0x95, 0xEA, 0xB0, 0x4E, 0x56, 0x5F, + 0x00, 0x5B, 0xB7, 0xF2, 0x99, 0x22, 0x00, 0xE3, 0x75, 0xED, 0x92, 0x10, + 0xB3, 0x7C, 0x25, 0x80, 0xA1, 0x11, 0x3E, 0xBF, 0x03, 0x80, 0xD2, 0x8E, + 0x0C, 0x38, 0xAA, 0xF3, 0x54, 0x28, 0xC0, 0xE7, 0x49, 0x93, 0xF3, 0x21, + 0x5B, 0x4B, 0x73, 0xAF, 0x06, 0xB0, 0x77, 0xC4, 0x7B, 0x9A, 0xF2, 0xE9, + 0x3B, 0x24, 0x01, 0xF0, 0xE7, 0x00, 0xD6, 0x47, 0xFC, 0x6C, 0x11, 0x80, + 0x33, 0x01, 0x5C, 0x98, 0x07, 0xC8, 0xC5, 0x00, 0x46, 0x01, 0xA8, 0x32, + 0xC0, 0x05, 0x80, 0x2F, 0x01, 0xAC, 0xED, 0xC8, 0x80, 0x3F, 0x00, 0xF0, + 0x86, 0xE1, 0x29, 0x2F, 0x06, 0x70, 0x1A, 0x80, 0x8B, 0x00, 0xEC, 0x96, + 0xA3, 0x39, 0x39, 0x6D, 0x96, 0x27, 0x00, 0xD8, 0xCB, 0x70, 0xDF, 0x72, + 0x00, 0x33, 0x00, 0xD4, 0x75, 0x64, 0xC0, 0x5F, 0x03, 0xB8, 0x01, 0xC0, + 0x6C, 0x83, 0xB9, 0x2E, 0x06, 0x70, 0x86, 0x96, 0x27, 0x03, 0x65, 0xBE, + 0xB3, 0x25, 0x5B, 0x01, 0xF8, 0x89, 0xFA, 0xB8, 0xA7, 0xE1, 0xBE, 0xD5, + 0x00, 0xEE, 0x01, 0x30, 0x0D, 0x40, 0x7D, 0x47, 0x5E, 0x26, 0xA5, 0xAF, + 0xFD, 0x49, 0xBE, 0x4F, 0xB2, 0x81, 0xD1, 0xA5, 0x9E, 0xE4, 0xBD, 0x24, + 0x07, 0x91, 0x2C, 0xCC, 0x42, 0x9F, 0x8A, 0x49, 0x9E, 0x48, 0xF2, 0x23, + 0xDA, 0x64, 0x25, 0xC9, 0xEB, 0x49, 0x6E, 0x9B, 0xEF, 0x71, 0x4D, 0x12, + 0xE0, 0x34, 0xE4, 0xF7, 0x3C, 0x20, 0xFF, 0x99, 0xE4, 0xE0, 0x98, 0x21, + 0x77, 0x26, 0x79, 0x12, 0xC9, 0x8F, 0x8D, 0x70, 0x57, 0x90, 0x9C, 0x40, + 0xB2, 0x22, 0x09, 0x63, 0x9A, 0x34, 0xC0, 0x20, 0xB9, 0x1F, 0xC9, 0x77, + 0x8D, 0x90, 0x1B, 0x05, 0x79, 0x08, 0xC9, 0xA2, 0x18, 0xFA, 0x50, 0x42, + 0x72, 0x0C, 0xC9, 0xB9, 0x46, 0xB8, 0xDF, 0x08, 0x6E, 0x59, 0x52, 0xC6, + 0x33, 0x5B, 0x5F, 0x9C, 0x22, 0x59, 0xA0, 0x2B, 0x57, 0x90, 0x99, 0x01, + 0xB9, 0x2D, 0x3B, 0x47, 0xDB, 0x90, 0x1C, 0x47, 0xF2, 0x13, 0x63, 0xDB, + 0xCB, 0x48, 0x5E, 0x4B, 0xB2, 0x7B, 0x92, 0x14, 0x26, 0x15, 0x73, 0xFA, + 0x68, 0xA1, 0x36, 0xDB, 0xCB, 0xB5, 0xDB, 0x03, 0x2D, 0x81, 0x56, 0xE9, + 0xC0, 0xA0, 0xC9, 0xF0, 0x5D, 0x23, 0x00, 0x4C, 0x02, 0xB0, 0x8F, 0xC1, + 0x89, 0x6A, 0x02, 0xF0, 0x17, 0x00, 0xF7, 0xCA, 0x3B, 0x6F, 0x30, 0xF6, + 0xBF, 0x14, 0xC0, 0x71, 0x19, 0xCE, 0x5B, 0x54, 0x59, 0x06, 0x60, 0x0A, + 0x80, 0xC9, 0x00, 0xD6, 0x18, 0xC7, 0xAB, 0x44, 0xFF, 0x52, 0xFD, 0x8F, + 0xF5, 0x60, 0x25, 0x4E, 0xC0, 0x85, 0xDA, 0x65, 0x1A, 0x07, 0xE0, 0x30, + 0x00, 0x83, 0x35, 0xC0, 0x6F, 0x03, 0x78, 0x16, 0xC0, 0x63, 0x00, 0x16, + 0x1A, 0x07, 0x7D, 0x18, 0x80, 0x3B, 0x00, 0x0C, 0x37, 0x7A, 0xCA, 0x0F, + 0x00, 0xF8, 0x03, 0x80, 0xF7, 0x0D, 0xED, 0x75, 0xD3, 0x89, 0xD0, 0x25, + 0x5A, 0x7E, 0x45, 0xF2, 0x51, 0x01, 0x2C, 0x01, 0x70, 0xB7, 0xAE, 0xF5, + 0x86, 0x3E, 0x96, 0xC8, 0x2B, 0x3F, 0x04, 0xC0, 0xF6, 0xEA, 0xE7, 0x5A, + 0x00, 0xCF, 0x68, 0x6F, 0x60, 0x4D, 0x2C, 0x1B, 0x24, 0x31, 0x9A, 0x83, + 0x3E, 0x24, 0xA7, 0xB6, 0x60, 0xC2, 0x1E, 0x22, 0x39, 0xCC, 0x63, 0x8E, + 0xDC, 0x97, 0xE4, 0xDB, 0x1E, 0xE6, 0xFA, 0xAF, 0x24, 0x87, 0x46, 0x34, + 0xD7, 0x65, 0x24, 0x7F, 0x4E, 0xF2, 0x53, 0xC3, 0xF7, 0x37, 0x91, 0x5C, + 0x4C, 0xF2, 0xB7, 0x24, 0xBB, 0x1A, 0x7F, 0x53, 0x19, 0xC9, 0xD3, 0xF5, + 0xBB, 0x9A, 0xCB, 0xDB, 0x24, 0xCF, 0x8E, 0x6B, 0x1E, 0x8F, 0xD3, 0xE3, + 0xBC, 0x3A, 0xC2, 0xA0, 0x4C, 0xF5, 0x84, 0x3C, 0x9C, 0xE4, 0x9B, 0x1E, + 0x90, 0xFF, 0x26, 0xEF, 0xBA, 0x25, 0xC8, 0xDD, 0x34, 0xD8, 0x56, 0xB8, + 0x8B, 0x04, 0x77, 0x1B, 0xE3, 0x6F, 0x29, 0x27, 0x79, 0x16, 0xC9, 0xEA, + 0x16, 0xBE, 0x7F, 0xAE, 0x56, 0x14, 0xA9, 0xA4, 0x00, 0xEE, 0x4E, 0xF2, + 0xB9, 0x88, 0x83, 0xF3, 0xA8, 0x80, 0x59, 0x1D, 0xA1, 0xA1, 0x24, 0x5F, + 0xD7, 0xB2, 0xC8, 0x22, 0x7F, 0x27, 0xB9, 0xCF, 0x66, 0xDA, 0x2B, 0xD3, + 0x60, 0xCF, 0x37, 0xC2, 0xFD, 0x5A, 0xC7, 0x80, 0x25, 0x1E, 0x70, 0xCF, + 0xD5, 0xC3, 0xD1, 0x9A, 0xDC, 0x11, 0xC7, 0x8A, 0x20, 0x2E, 0xC0, 0x95, + 0x24, 0x9F, 0x37, 0x0C, 0xD2, 0x23, 0xF2, 0x76, 0xAD, 0xEB, 0xD6, 0x7D, + 0x48, 0xBE, 0xE1, 0x01, 0x79, 0xDA, 0x26, 0xDA, 0x2B, 0x25, 0x79, 0x06, + 0xC9, 0xCF, 0x8D, 0x70, 0x97, 0x90, 0xBC, 0x4C, 0xE7, 0xC1, 0x96, 0xBE, + 0x97, 0xCA, 0xF4, 0x2E, 0x8C, 0xD8, 0xD6, 0x73, 0x24, 0xB7, 0x4A, 0x0A, + 0xE0, 0x72, 0x92, 0x4F, 0x19, 0x07, 0xFD, 0x61, 0x92, 0x7B, 0x7B, 0x40, + 0x1E, 0xE6, 0x09, 0x79, 0x6A, 0x06, 0xE4, 0x2E, 0x24, 0x4F, 0x25, 0x39, + 0xCF, 0x08, 0x77, 0x29, 0xC9, 0x2B, 0x3C, 0xE6, 0xDC, 0xF4, 0xC3, 0x54, + 0x6D, 0x68, 0xEF, 0x49, 0x92, 0x5B, 0x27, 0x05, 0x70, 0x21, 0xC9, 0x5F, + 0x91, 0xAC, 0x35, 0x0E, 0xD8, 0x63, 0x32, 0xBD, 0xD6, 0x27, 0x75, 0x08, + 0xC9, 0x59, 0x24, 0x37, 0x7A, 0x40, 0xDE, 0x83, 0xE4, 0xC9, 0x46, 0xCD, + 0x6D, 0x94, 0xE6, 0x5E, 0xE2, 0xA1, 0xB9, 0xE5, 0x46, 0xCD, 0x4D, 0xB7, + 0x77, 0x77, 0x92, 0x34, 0x18, 0x24, 0x7B, 0x92, 0x7C, 0x96, 0x64, 0x9D, + 0x71, 0xD0, 0x1F, 0x6F, 0x61, 0x8E, 0x6C, 0xE9, 0xDA, 0x9B, 0xE4, 0x4C, + 0x23, 0xE4, 0x26, 0x92, 0xCF, 0x78, 0x3A, 0x54, 0x17, 0xCB, 0x99, 0xB4, + 0x6A, 0xEE, 0x99, 0x11, 0xE7, 0xDC, 0x4C, 0xB8, 0xD5, 0x24, 0x47, 0x24, + 0xC9, 0xC9, 0xCA, 0x1C, 0xF4, 0x7F, 0x7A, 0x40, 0x9E, 0x26, 0x4D, 0xB6, + 0x3A, 0x15, 0x83, 0x3D, 0x35, 0xD9, 0x3A, 0xE7, 0xFA, 0x38, 0x54, 0x5D, + 0x49, 0x9E, 0x66, 0x34, 0xCB, 0x8D, 0xD2, 0xF4, 0x5F, 0x7B, 0x58, 0x8A, + 0x9C, 0x6D, 0x55, 0x0E, 0x22, 0x39, 0xC3, 0x13, 0xF2, 0x0F, 0x3D, 0xE6, + 0x9D, 0xC1, 0x24, 0x5F, 0xC9, 0x02, 0xE4, 0xC6, 0x0C, 0x6F, 0xD9, 0xBA, + 0x14, 0x4A, 0xAF, 0x73, 0x2D, 0xD3, 0x40, 0x03, 0xC9, 0x05, 0x9A, 0xEA, + 0x4A, 0x93, 0xBE, 0x17, 0xBD, 0x9B, 0xBC, 0xC0, 0x5A, 0xE3, 0xA0, 0x3E, + 0x4D, 0xF2, 0x40, 0x0F, 0x53, 0xB8, 0x17, 0xC9, 0x97, 0x3C, 0x1E, 0xAA, + 0x96, 0x06, 0xFB, 0x4B, 0x92, 0xE7, 0x79, 0x3C, 0x70, 0x15, 0x9E, 0x73, + 0xEE, 0x7C, 0x92, 0xBF, 0xD4, 0x11, 0x65, 0xBB, 0x38, 0x4D, 0x1A, 0xE0, + 0x09, 0xF9, 0x09, 0x4F, 0xC8, 0x83, 0x48, 0xBE, 0x1C, 0x03, 0xE4, 0x06, + 0x92, 0x5F, 0xC8, 0x4C, 0x5A, 0x07, 0xBB, 0xBB, 0x20, 0x2D, 0xF4, 0x98, + 0x73, 0xCF, 0x8D, 0x1B, 0x6E, 0x2E, 0x8E, 0x0B, 0x07, 0xC8, 0xF1, 0xAA, + 0xF1, 0x70, 0xBC, 0xF6, 0xF7, 0x98, 0x87, 0x06, 0xC9, 0x07, 0xA8, 0xCD, + 0x31, 0xDC, 0x54, 0x86, 0xE6, 0x7E, 0x65, 0x6C, 0x6F, 0xBE, 0xEE, 0xEB, + 0xC2, 0x76, 0x7A, 0x1E, 0xDC, 0x5F, 0xC0, 0x6A, 0x3C, 0xCC, 0xF5, 0xC1, + 0x1E, 0xF3, 0xDF, 0x40, 0x92, 0x2F, 0x78, 0x40, 0x6E, 0xD0, 0xBA, 0x78, + 0xBC, 0xD1, 0xD9, 0x4B, 0x29, 0x72, 0xE3, 0x02, 0xCD, 0xD9, 0x96, 0xF6, + 0xE6, 0x6A, 0xAE, 0xDE, 0x8A, 0xED, 0xFC, 0xC0, 0x7F, 0x67, 0x6D, 0x84, + 0x58, 0x21, 0x3F, 0x4B, 0xF2, 0x10, 0x0F, 0x73, 0x3D, 0x90, 0xE4, 0x74, + 0x03, 0xE4, 0x46, 0x92, 0x9F, 0x49, 0x93, 0xAC, 0x70, 0x7B, 0x90, 0xBC, + 0x50, 0xDE, 0xB6, 0xF5, 0x61, 0x3A, 0xBD, 0x0D, 0x67, 0xE6, 0x89, 0x8B, + 0xE8, 0xE8, 0xAF, 0x35, 0xA8, 0x15, 0xF2, 0x93, 0x9A, 0x93, 0xAD, 0xCE, + 0xCE, 0x1E, 0xF2, 0xE6, 0x5B, 0xF3, 0xAE, 0x9B, 0x32, 0xCC, 0xA4, 0x15, + 0x6E, 0x25, 0xC9, 0xF3, 0x75, 0xAA, 0x64, 0x85, 0x7B, 0x56, 0xB6, 0xE1, + 0xE6, 0x23, 0x64, 0x67, 0x27, 0x99, 0xEB, 0x0D, 0x1E, 0xE6, 0xFA, 0x20, + 0x0F, 0xC8, 0xBB, 0x93, 0xFC, 0x57, 0x2B, 0xDB, 0x9A, 0x8B, 0x65, 0x96, + 0x3B, 0x79, 0x98, 0xE5, 0x8B, 0x8C, 0x70, 0xEB, 0x15, 0xE3, 0x75, 0x3A, + 0x73, 0x94, 0x67, 0x95, 0x8F, 0x30, 0x92, 0x7E, 0x9E, 0xE6, 0x7A, 0x3A, + 0xC9, 0x03, 0x3C, 0xCC, 0xF5, 0x01, 0xDA, 0xBB, 0x5E, 0x2F, 0x6D, 0x6D, + 0xD2, 0xF7, 0xD5, 0xC9, 0xAC, 0x5E, 0xEE, 0xA1, 0xB9, 0xDB, 0x69, 0x67, + 0x6B, 0xB9, 0x51, 0x73, 0x3F, 0x21, 0x39, 0x76, 0x4B, 0x88, 0xC9, 0x8A, + 0x32, 0x27, 0x3F, 0xED, 0x01, 0xF9, 0x05, 0x01, 0xB3, 0x2E, 0x27, 0x06, + 0x91, 0x7C, 0x40, 0xA6, 0x78, 0x81, 0x3C, 0xDD, 0xE9, 0x3A, 0xE4, 0xB7, + 0x3A, 0x38, 0x95, 0x9A, 0x73, 0x2D, 0x70, 0x1B, 0xB5, 0x3D, 0x7A, 0x5A, + 0x7B, 0x8F, 0xC9, 0xB2, 0xC8, 0x4E, 0x8A, 0xB9, 0x3A, 0x4C, 0x19, 0x84, + 0x51, 0xE5, 0x45, 0x00, 0x37, 0x29, 0x14, 0xC8, 0x92, 0x31, 0x50, 0xA1, + 0x50, 0x9C, 0x46, 0xA5, 0xC0, 0x2C, 0x50, 0xD0, 0x3D, 0x8C, 0xDF, 0x31, + 0x16, 0xC0, 0x65, 0x00, 0x7A, 0x1A, 0x72, 0xAF, 0xAA, 0x01, 0xDC, 0x0C, + 0xE0, 0x21, 0xE4, 0x3A, 0x91, 0x3D, 0xCF, 0x51, 0x7F, 0xFD, 0xE4, 0x44, + 0x59, 0xE7, 0xE4, 0xE7, 0x3D, 0x1D, 0xAF, 0xB6, 0x44, 0x89, 0x56, 0x68, + 0x29, 0x64, 0xF5, 0x96, 0xE7, 0x4A, 0x73, 0xF3, 0x92, 0x23, 0x9C, 0x84, + 0xD0, 0xCE, 0x3E, 0xDA, 0xBD, 0xB2, 0x42, 0x9E, 0xA1, 0x25, 0x54, 0x97, + 0x1C, 0xC0, 0xDD, 0x56, 0x66, 0xF9, 0x1B, 0xA3, 0x59, 0x4E, 0xC3, 0xCD, + 0x5B, 0xE2, 0x7A, 0x52, 0xE2, 0x77, 0xFB, 0xEA, 0x6C, 0x78, 0x9D, 0x11, + 0xF2, 0xCB, 0x24, 0x0F, 0xCD, 0x22, 0xE4, 0x34, 0x5C, 0x1F, 0x87, 0x6A, + 0x2E, 0x5D, 0x7C, 0x75, 0x51, 0x3E, 0xC7, 0x36, 0x49, 0x19, 0x0D, 0xFD, + 0x14, 0xCA, 0x63, 0x85, 0xFC, 0x12, 0xC9, 0x51, 0x1E, 0x51, 0x16, 0x51, + 0xE0, 0xF6, 0xD4, 0x69, 0x92, 0xC5, 0x2C, 0xA7, 0x97, 0x42, 0x63, 0xB3, + 0xB9, 0x43, 0xD5, 0x1E, 0x01, 0x67, 0x86, 0xDE, 0x5A, 0x21, 0xCF, 0x22, + 0x39, 0x32, 0xC6, 0x79, 0xAE, 0x80, 0xE4, 0x8E, 0x74, 0x09, 0x64, 0x2B, + 0x8C, 0x70, 0x67, 0x2B, 0x62, 0xA4, 0x30, 0x09, 0x63, 0x9A, 0xC4, 0xDC, + 0xA4, 0xDE, 0x24, 0x1F, 0xF4, 0x80, 0xFC, 0x38, 0xC9, 0xED, 0x63, 0xEA, + 0x43, 0x0F, 0x92, 0x37, 0x69, 0x1E, 0xB5, 0xC0, 0xFD, 0x90, 0x2E, 0x61, + 0x2D, 0x31, 0xE3, 0x99, 0xC4, 0x42, 0x68, 0x8B, 0x54, 0xFF, 0xE2, 0x29, + 0xD8, 0x6A, 0x4C, 0x1D, 0x0B, 0x57, 0x63, 0x2B, 0x0E, 0xD9, 0x53, 0x49, + 0xE6, 0x51, 0xC7, 0x67, 0xA3, 0xF2, 0x9B, 0x6F, 0x06, 0xF0, 0x68, 0x92, + 0x06, 0x33, 0xA9, 0x95, 0xEE, 0xBE, 0x06, 0x70, 0x1D, 0x80, 0xD7, 0x0C, + 0xE9, 0x1B, 0x4D, 0xCA, 0x89, 0x8A, 0x43, 0xB6, 0x37, 0xAC, 0x73, 0x1B, + 0x00, 0x7C, 0xA4, 0x04, 0xF1, 0x69, 0x49, 0x1B, 0xC8, 0xA4, 0x02, 0x2E, + 0x03, 0xD0, 0x4B, 0x1B, 0x19, 0x51, 0x01, 0xA7, 0x94, 0xBF, 0x14, 0x47, + 0x49, 0x87, 0x72, 0x43, 0xBB, 0x0D, 0x00, 0x66, 0x01, 0x78, 0x39, 0x89, + 0x03, 0x99, 0x44, 0xC0, 0x25, 0x4A, 0xC8, 0xBA, 0x45, 0xC9, 0x60, 0x51, + 0xFB, 0xB8, 0x0C, 0xC0, 0x17, 0x31, 0x55, 0xB4, 0x59, 0x21, 0xB3, 0x1B, + 0x35, 0xE9, 0xEE, 0x47, 0x00, 0xC6, 0x00, 0xD8, 0x36, 0x69, 0x83, 0xD9, + 0x29, 0x81, 0x70, 0x0F, 0x56, 0x81, 0x95, 0xE1, 0x86, 0xFB, 0x6A, 0x00, + 0x3C, 0x01, 0x60, 0x71, 0x4C, 0xFD, 0xF8, 0x1C, 0xC0, 0x5C, 0x44, 0xAB, + 0xA6, 0x53, 0x04, 0x60, 0x5F, 0x00, 0xBD, 0x95, 0x32, 0xFB, 0x20, 0x80, + 0x6F, 0x83, 0x06, 0xFF, 0xBF, 0x74, 0x05, 0x70, 0x28, 0x5C, 0xF5, 0xB8, + 0xFD, 0x0C, 0xF7, 0xAD, 0x07, 0x30, 0x1D, 0xC0, 0x44, 0x55, 0xB5, 0x89, + 0x43, 0xE6, 0x2B, 0xCF, 0x78, 0xA9, 0xC1, 0x22, 0xF4, 0xD2, 0x83, 0x39, + 0x0E, 0x40, 0x0F, 0x24, 0xA3, 0x22, 0x5F, 0x62, 0x96, 0x49, 0x5D, 0x49, + 0x8E, 0x66, 0xCB, 0x75, 0x1F, 0x37, 0x25, 0x6B, 0x48, 0xDE, 0x4F, 0xB2, + 0x57, 0x16, 0xFA, 0x54, 0xA4, 0xBD, 0xE7, 0x6A, 0xDA, 0xB2, 0x1A, 0x97, + 0x90, 0xBC, 0x54, 0x3B, 0x60, 0xA9, 0xB0, 0x0E, 0x76, 0x31, 0x57, 0xC7, + 0x91, 0x7C, 0xC7, 0x08, 0x77, 0x35, 0xC9, 0xFB, 0xB4, 0x66, 0xCD, 0xE6, + 0x3E, 0xF4, 0x38, 0x92, 0x73, 0x8C, 0x90, 0x17, 0xD3, 0x25, 0xA8, 0xF5, + 0xCC, 0x37, 0xE4, 0x7C, 0x82, 0x4D, 0x29, 0x40, 0x7C, 0x34, 0xC9, 0x7F, + 0x1B, 0xE1, 0xAE, 0x24, 0x79, 0x8F, 0xCE, 0x66, 0x73, 0xD1, 0xD7, 0xB1, + 0xDA, 0x7E, 0xB4, 0x42, 0xBE, 0x5C, 0x1B, 0x37, 0x1D, 0xEE, 0xB0, 0x21, + 0xA5, 0x18, 0xE2, 0x31, 0x74, 0xC5, 0x56, 0x2C, 0xF2, 0x5F, 0xBA, 0xDC, + 0xD9, 0x6E, 0x6D, 0x68, 0xDB, 0xE7, 0xBE, 0x93, 0x49, 0x7E, 0xE0, 0x61, + 0xAE, 0xAF, 0xD4, 0xB6, 0x67, 0x5E, 0x20, 0xE7, 0xCB, 0x8B, 0x2E, 0x87, + 0xAB, 0xFB, 0x78, 0x11, 0x5A, 0x2E, 0xC7, 0xDB, 0x5C, 0x56, 0xC2, 0x15, + 0x08, 0x9F, 0x60, 0xD8, 0xE5, 0x4A, 0xC1, 0x55, 0xAB, 0xEB, 0xAC, 0x02, + 0x31, 0x05, 0x00, 0x36, 0xE8, 0xAA, 0x31, 0x38, 0x51, 0x8F, 0xE8, 0xDF, + 0xCB, 0xB4, 0xD3, 0x15, 0xA5, 0x66, 0x48, 0x4F, 0xB8, 0x52, 0xC8, 0x94, + 0x77, 0xBD, 0xC4, 0x58, 0x88, 0xA6, 0xDD, 0x2D, 0x93, 0x52, 0x2A, 0x76, + 0x32, 0x12, 0xC0, 0xF9, 0x9E, 0x70, 0xAB, 0xE0, 0xAA, 0xF6, 0x44, 0x6D, + 0xAF, 0x52, 0xCB, 0x9D, 0xBD, 0x00, 0xF4, 0x13, 0xEC, 0xC5, 0x00, 0x3E, + 0x01, 0xF0, 0x8E, 0x0A, 0xC3, 0x44, 0x8D, 0xB2, 0x78, 0x54, 0xB0, 0x2E, + 0x37, 0x42, 0x1E, 0xAF, 0xFF, 0x7E, 0x58, 0xBB, 0x74, 0xDC, 0x12, 0xBD, + 0xE8, 0x74, 0x98, 0xE9, 0x29, 0x74, 0x25, 0x0B, 0x2D, 0xB2, 0x9C, 0xE4, + 0xEF, 0x3D, 0xCC, 0x72, 0x05, 0xC9, 0x5F, 0xC8, 0xB4, 0x6E, 0xEA, 0x3B, + 0x27, 0x29, 0x3E, 0xCC, 0x7A, 0xF2, 0x73, 0x92, 0x7E, 0x83, 0x25, 0x09, + 0x7D, 0x29, 0xC9, 0x6B, 0x72, 0x6D, 0xAE, 0x73, 0x09, 0xB8, 0x92, 0x2E, + 0xAB, 0xFE, 0x03, 0x8F, 0x39, 0xF7, 0x56, 0xDA, 0xAB, 0xCE, 0x74, 0x57, + 0x34, 0x45, 0x4B, 0xB9, 0xC0, 0x75, 0x24, 0x27, 0xEA, 0x2C, 0xBA, 0xC0, + 0x13, 0x72, 0x83, 0x11, 0xF2, 0x95, 0x24, 0x77, 0xD8, 0xD2, 0xC2, 0x66, + 0xCB, 0xE4, 0x89, 0xBE, 0xE7, 0x01, 0x77, 0x92, 0x51, 0x73, 0x53, 0xFA, + 0x7C, 0x54, 0x4B, 0xB1, 0x5A, 0xE7, 0xBE, 0x7D, 0x3C, 0x06, 0xFD, 0x44, + 0x0F, 0xC7, 0x6B, 0x19, 0x5D, 0x45, 0xA2, 0x9C, 0x40, 0xCE, 0x15, 0xDC, + 0x9F, 0x91, 0xFC, 0x8F, 0x11, 0xEE, 0x0A, 0x92, 0xB7, 0x19, 0x23, 0x35, + 0xD2, 0xC1, 0x71, 0x63, 0x75, 0x36, 0x6B, 0x79, 0x90, 0x6E, 0xF0, 0x84, + 0x7C, 0xBC, 0x7E, 0x9B, 0x05, 0xF2, 0xB7, 0x24, 0xAB, 0x72, 0xB1, 0x84, + 0xCA, 0x36, 0xDC, 0x6E, 0xDA, 0x28, 0xF8, 0xD0, 0x03, 0xEE, 0x24, 0xDA, + 0x13, 0xA1, 0x2B, 0x34, 0x0D, 0xCC, 0xF6, 0xC8, 0x2C, 0x5C, 0x25, 0x4D, + 0xF6, 0x99, 0x23, 0x4F, 0xF0, 0x84, 0x7C, 0xAD, 0x76, 0xE1, 0x52, 0xED, + 0x11, 0x70, 0x99, 0xD6, 0xB9, 0x1F, 0xE7, 0x40, 0x73, 0xD3, 0xED, 0x9D, + 0xE2, 0x61, 0x29, 0x36, 0x65, 0xAE, 0x7D, 0x21, 0x5B, 0xE7, 0xE4, 0x15, + 0x72, 0xBC, 0xB2, 0x66, 0xAE, 0xB3, 0x6D, 0x96, 0x3F, 0xF6, 0xD4, 0xDC, + 0x7C, 0xC0, 0x4D, 0xCB, 0x3A, 0x99, 0x6B, 0x1F, 0xC8, 0xC7, 0xCA, 0xCF, + 0xA8, 0x37, 0x4E, 0x0F, 0xD7, 0x65, 0xCB, 0xBB, 0xCE, 0x96, 0x59, 0x1E, + 0x43, 0x7B, 0x95, 0xF4, 0x6F, 0x3D, 0xE1, 0xA6, 0xDB, 0x9B, 0xCD, 0xF8, + 0x64, 0x4D, 0x1B, 0x20, 0x8F, 0xF6, 0x80, 0xBC, 0x8A, 0xAE, 0xCE, 0xF4, + 0x0F, 0xE2, 0x86, 0x1C, 0x37, 0xDC, 0x72, 0x2D, 0x4D, 0xE6, 0x78, 0xC0, + 0x9D, 0x48, 0x7B, 0xB2, 0x77, 0xDA, 0x5B, 0x9E, 0xC3, 0xF8, 0x65, 0x9D, + 0x02, 0xEF, 0xFA, 0x78, 0x42, 0x7E, 0xC7, 0x53, 0x93, 0x63, 0x85, 0x1C, + 0xF7, 0xF1, 0xDA, 0x4F, 0x69, 0xAB, 0x41, 0x45, 0x65, 0x0B, 0xFC, 0x8E, + 0xF6, 0x32, 0x45, 0x69, 0xB8, 0x16, 0xCD, 0x6D, 0x32, 0x46, 0x4A, 0xAE, + 0x25, 0x79, 0x8B, 0xD6, 0xC9, 0xD6, 0x41, 0x3F, 0x86, 0xE4, 0x5B, 0xB4, + 0x55, 0xFF, 0x59, 0x21, 0xCB, 0xD1, 0x97, 0x31, 0xE5, 0x0E, 0xC7, 0x05, + 0xB7, 0x80, 0xAE, 0x98, 0xD9, 0xEB, 0x46, 0xB8, 0x4B, 0x49, 0xDE, 0x6C, + 0xCC, 0x4C, 0x48, 0x65, 0x6C, 0x62, 0x58, 0xCD, 0xF2, 0x42, 0xF9, 0x05, + 0x35, 0x46, 0x4D, 0x4E, 0x6F, 0x86, 0x58, 0x77, 0xBC, 0x8E, 0xA6, 0x4B, + 0x5D, 0xDD, 0x68, 0xD4, 0xE4, 0x1B, 0xE9, 0x52, 0x54, 0x13, 0x03, 0xB8, + 0x84, 0xE4, 0x9D, 0x1E, 0x70, 0x6F, 0xF0, 0x30, 0xCB, 0x95, 0x74, 0xD5, + 0xE3, 0xE6, 0x7A, 0xB4, 0xF7, 0x1B, 0x79, 0xBB, 0xAF, 0xD2, 0x56, 0x8D, + 0x67, 0xAD, 0x20, 0xEF, 0xEA, 0x01, 0xF9, 0x18, 0x41, 0xAE, 0x33, 0x5A, + 0xB5, 0xD1, 0x4C, 0x50, 0xA5, 0xBB, 0x4A, 0xBA, 0xEA, 0x36, 0x96, 0xC1, + 0xAE, 0xA2, 0x3D, 0x99, 0xBB, 0x52, 0x7B, 0xCB, 0x9F, 0x7A, 0xC0, 0xBD, + 0x2E, 0x23, 0xF3, 0x61, 0x24, 0x5D, 0xE6, 0x7F, 0x9D, 0x51, 0x93, 0x6F, + 0xA7, 0xAB, 0x1C, 0x64, 0x85, 0x7C, 0x14, 0xC9, 0xD7, 0x8C, 0xED, 0xDD, + 0xCF, 0x04, 0x95, 0x13, 0xAE, 0xA0, 0x4B, 0xCE, 0xB6, 0xC0, 0xB5, 0x9A, + 0xE5, 0x4A, 0xBA, 0x1A, 0x54, 0x56, 0xCD, 0x5D, 0xA2, 0xF6, 0x9A, 0xA7, + 0x9A, 0x1E, 0xE1, 0x31, 0xE8, 0x6B, 0x75, 0x16, 0xDD, 0xDF, 0x63, 0x8E, + 0x4C, 0xB7, 0x17, 0xD5, 0xF1, 0x9A, 0xCE, 0x18, 0xEA, 0x66, 0xC5, 0x05, + 0xB8, 0x94, 0xAE, 0xBA, 0x7A, 0x94, 0xC1, 0x9E, 0x60, 0xD4, 0xDC, 0x14, + 0x5D, 0x4A, 0xCA, 0xD9, 0x74, 0x95, 0x70, 0x2C, 0xB2, 0x58, 0x1B, 0x09, + 0x9B, 0x7B, 0x98, 0x8E, 0xF4, 0x84, 0xEC, 0x7B, 0x0A, 0x75, 0x94, 0x1C, + 0xAF, 0x28, 0x90, 0xFF, 0xC1, 0x84, 0x95, 0x13, 0x3E, 0x91, 0x9B, 0x4F, + 0xB1, 0x4C, 0x17, 0xF5, 0xBC, 0xC6, 0xC3, 0x2C, 0x6F, 0x47, 0x57, 0x24, + 0x65, 0x9E, 0x87, 0xE6, 0x5E, 0x15, 0xA1, 0xBD, 0x51, 0x74, 0xC9, 0x6B, + 0x56, 0x73, 0x7D, 0x9B, 0xA7, 0x26, 0x1F, 0xC9, 0xD6, 0x2B, 0xD7, 0xD7, + 0x6A, 0xAC, 0x0A, 0x99, 0xA0, 0x65, 0x52, 0x67, 0x2D, 0x77, 0x16, 0xA9, + 0x83, 0x0D, 0xFA, 0x11, 0x35, 0x74, 0xD5, 0xE3, 0xAE, 0xA2, 0x5F, 0xDD, + 0xC7, 0x73, 0x3C, 0x34, 0x37, 0x0D, 0x37, 0x6A, 0xFA, 0xE6, 0xE1, 0x6C, + 0xBD, 0x1A, 0x4F, 0x73, 0xF9, 0x4E, 0x8E, 0xE5, 0x2E, 0x1E, 0xCE, 0x50, + 0xBA, 0xBD, 0xDA, 0xCD, 0xC0, 0x7D, 0x95, 0xAE, 0x42, 0x50, 0x9B, 0x9D, + 0xAC, 0xC2, 0xAA, 0xAA, 0xAA, 0xB8, 0x62, 0x07, 0x1A, 0x00, 0x7C, 0xA8, + 0x8C, 0x80, 0x0D, 0xCA, 0x0E, 0x58, 0x00, 0xF7, 0xFE, 0xA2, 0xA9, 0x70, + 0xAF, 0xB9, 0xA9, 0x35, 0xD6, 0xC3, 0x38, 0x01, 0xC0, 0x05, 0xB0, 0xBD, + 0x4A, 0x76, 0x29, 0xDC, 0x4B, 0x21, 0x27, 0x1A, 0xB2, 0x13, 0xAA, 0x15, + 0x53, 0xBD, 0x8B, 0xF2, 0x92, 0xA2, 0xC4, 0x8B, 0x17, 0x29, 0xAA, 0xA3, + 0x40, 0x81, 0xF2, 0x96, 0x44, 0xB9, 0x6A, 0x25, 0xD9, 0x55, 0x2A, 0x94, + 0x68, 0x23, 0xDC, 0xFB, 0x92, 0x56, 0x01, 0x78, 0x1D, 0xEE, 0x55, 0x42, + 0x6F, 0xC6, 0x12, 0x42, 0xC3, 0xEC, 0x14, 0x61, 0xE9, 0xAD, 0xCE, 0x37, + 0x29, 0xCA, 0x7F, 0xA9, 0xF1, 0xFE, 0x4A, 0xA5, 0xAD, 0x5C, 0x0C, 0xDB, + 0x1B, 0xBF, 0x33, 0xE1, 0xD6, 0x7A, 0xF4, 0x7B, 0x14, 0xDC, 0xCB, 0x9F, + 0x87, 0x2A, 0xB4, 0x27, 0x8A, 0x6C, 0x80, 0x7B, 0x11, 0xD7, 0x64, 0xB8, + 0x77, 0x05, 0x5B, 0x06, 0x74, 0x37, 0x7C, 0xFF, 0xBD, 0x49, 0x6B, 0x00, + 0x3C, 0x07, 0x60, 0x9E, 0x1E, 0x9C, 0xA6, 0xF6, 0x14, 0xB2, 0x63, 0x89, + 0xC4, 0x18, 0x4F, 0x5B, 0x21, 0xED, 0xB4, 0x59, 0xBE, 0x9A, 0x6D, 0xCF, + 0xAA, 0x3F, 0x54, 0x73, 0xB2, 0xC5, 0x5C, 0xD7, 0x91, 0xBC, 0xCB, 0xD3, + 0x5C, 0x77, 0xA8, 0x04, 0xF0, 0xEE, 0x5A, 0xE7, 0x5A, 0x1D, 0xAA, 0x74, + 0xBC, 0x53, 0x5C, 0xE5, 0x78, 0x0F, 0xA7, 0xFD, 0x15, 0x3E, 0x75, 0x24, + 0x27, 0x27, 0x0D, 0x72, 0x92, 0xE0, 0xF6, 0xD0, 0x3A, 0xD7, 0xEA, 0x50, + 0x2D, 0x92, 0xE6, 0xC6, 0x5D, 0x6B, 0x79, 0xA4, 0x20, 0x5B, 0xB6, 0x19, + 0x6B, 0x32, 0x1C, 0xAF, 0x82, 0x00, 0xF8, 0xFB, 0x4B, 0xA1, 0xF3, 0xE4, + 0x6D, 0x5B, 0xE1, 0x5E, 0xC1, 0xEC, 0xD5, 0xA0, 0xFA, 0xB1, 0x3C, 0x5A, + 0x4B, 0x69, 0xE2, 0x5A, 0x92, 0x53, 0xE4, 0x05, 0x77, 0x0A, 0x80, 0xDD, + 0xA9, 0x90, 0x15, 0x6E, 0xE6, 0xAB, 0xE5, 0xB2, 0x5D, 0xC9, 0xE6, 0x20, + 0xDA, 0x8B, 0x8C, 0xD7, 0x92, 0xFC, 0x23, 0x5D, 0x59, 0xE3, 0xBC, 0x42, + 0xCE, 0x77, 0xFA, 0x68, 0x01, 0x80, 0xFD, 0x15, 0x04, 0xDF, 0x37, 0xAA, + 0x5F, 0xA8, 0x60, 0xF5, 0x29, 0x70, 0xA5, 0x10, 0x37, 0x66, 0xB9, 0x8F, + 0xAF, 0x02, 0xB8, 0x51, 0xE5, 0x24, 0xA2, 0x96, 0x4E, 0x2C, 0x06, 0x70, + 0x2A, 0x80, 0x33, 0xB5, 0xDC, 0xEB, 0xB0, 0xF9, 0xC1, 0x65, 0x70, 0xB5, + 0x1F, 0xFB, 0x19, 0xEE, 0x59, 0x08, 0xE0, 0x4E, 0x00, 0xB7, 0xC2, 0x56, + 0xAB, 0xB2, 0x2D, 0xF2, 0x0A, 0x80, 0xEB, 0x55, 0xAA, 0x61, 0x43, 0xC4, + 0x7B, 0x3A, 0xEB, 0xB7, 0xF5, 0xED, 0xC8, 0x80, 0x7B, 0xC1, 0xBD, 0x00, + 0x3A, 0xAA, 0xE6, 0x7E, 0x05, 0xE0, 0x2E, 0x5D, 0x0D, 0x39, 0xEE, 0xEB, + 0x4C, 0x69, 0xF2, 0x2C, 0xC3, 0x83, 0x55, 0x01, 0x57, 0x74, 0xB5, 0xC3, + 0x96, 0x70, 0xE8, 0xA4, 0x1D, 0xA1, 0xA8, 0x70, 0x27, 0x0B, 0x6E, 0x63, + 0x9E, 0xFA, 0x3B, 0x33, 0x43, 0x31, 0x0E, 0x94, 0x29, 0x8E, 0x02, 0x39, + 0x9E, 0x4D, 0x8B, 0x76, 0x08, 0xF8, 0x3B, 0xED, 0x74, 0xF5, 0x6E, 0xE5, + 0x73, 0x0B, 0xB4, 0x7D, 0x37, 0x25, 0x8F, 0x70, 0x33, 0x21, 0x33, 0xC3, + 0x7F, 0x28, 0x6E, 0x65, 0xFB, 0x76, 0x49, 0x47, 0x36, 0xD1, 0xCB, 0x35, + 0xBF, 0xD5, 0xB7, 0xA2, 0xB9, 0xB7, 0x27, 0x04, 0x6E, 0x5A, 0x66, 0x69, + 0x4E, 0x9E, 0xD9, 0x82, 0xB9, 0x26, 0x80, 0x4F, 0x01, 0xCC, 0xC9, 0x69, + 0x36, 0x61, 0xC2, 0x34, 0x78, 0x1D, 0x5C, 0x91, 0xEC, 0x61, 0x00, 0x06, + 0xC3, 0x55, 0xD9, 0x49, 0x9B, 0xB3, 0x7A, 0x69, 0xEE, 0xBD, 0x3A, 0xA8, + 0x48, 0x0A, 0xDC, 0x4C, 0xC8, 0x54, 0x5F, 0x47, 0xC0, 0x55, 0xD8, 0x29, + 0xD4, 0xFF, 0xAB, 0x57, 0x8A, 0xEA, 0x9F, 0xE4, 0x14, 0xE6, 0x0D, 0x70, + 0x3E, 0x2B, 0xBE, 0x67, 0xCA, 0x21, 0x3A, 0x5C, 0x18, 0xA2, 0x8D, 0xF7, + 0x95, 0x70, 0x65, 0x8C, 0x66, 0x28, 0xA7, 0xB6, 0x01, 0xC9, 0x95, 0xE1, + 0x00, 0x4E, 0x51, 0xDF, 0x77, 0xD4, 0x81, 0xC1, 0x3C, 0xB8, 0xC2, 0x68, + 0x0F, 0xEB, 0x21, 0x46, 0x47, 0x07, 0x0C, 0xB8, 0xC4, 0xF0, 0xA1, 0x00, + 0x76, 0xD5, 0x51, 0xDA, 0xFB, 0x88, 0xAF, 0xEE, 0x55, 0xB6, 0xA5, 0x14, + 0x2E, 0xC9, 0x7C, 0x4F, 0x4D, 0x3B, 0xEF, 0xCA, 0xFA, 0xE4, 0x5D, 0x92, + 0x04, 0x38, 0xC8, 0x16, 0xE8, 0x64, 0x05, 0x09, 0x80, 0x83, 0x04, 0xC0, + 0x41, 0x02, 0xE0, 0x00, 0x38, 0x48, 0x00, 0x1C, 0x24, 0x00, 0x0E, 0x12, + 0x00, 0x07, 0x09, 0x80, 0x83, 0x04, 0xC0, 0x41, 0x02, 0xE0, 0x20, 0x01, + 0x70, 0x00, 0x1C, 0x24, 0x00, 0x0E, 0x12, 0x00, 0x07, 0x09, 0x80, 0x83, + 0x64, 0x47, 0xFE, 0x37, 0x00, 0x03, 0xCE, 0x9A, 0x67, 0x1F, 0xCC, 0x4A, + 0xE6, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4E, 0x44, 0xAE, 0x42, 0x60, + 0x82 +}; +} +static unsigned char* legit_icon = raw::legit; +} \ No newline at end of file diff --git a/cheat/gmod/icons/misc.hpp b/cheat/gmod/icons/misc.hpp new file mode 100644 index 0000000..9e78249 --- /dev/null +++ b/cheat/gmod/icons/misc.hpp @@ -0,0 +1,1721 @@ +/* E:\Users\admin\Desktop\stuff\icons\misc.png (4/1/2018 10:00:14 PM) + StartOffset: 00000000, EndOffset: 00005025, Length: 00005026 */ + +namespace icons { +constexpr static size_t misc_size = 20518; +namespace raw { +static unsigned char misc[20518] = { + 0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A, 0x00, 0x00, 0x00, 0x0D, + 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x78, + 0x08, 0x06, 0x00, 0x00, 0x00, 0x39, 0x64, 0x36, 0xD2, 0x00, 0x00, 0x00, + 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x2E, 0x23, 0x00, 0x00, 0x2E, + 0x23, 0x01, 0x78, 0xA5, 0x3F, 0x76, 0x00, 0x00, 0x0A, 0x4F, 0x69, 0x43, + 0x43, 0x50, 0x50, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x20, + 0x49, 0x43, 0x43, 0x20, 0x70, 0x72, 0x6F, 0x66, 0x69, 0x6C, 0x65, 0x00, + 0x00, 0x78, 0xDA, 0x9D, 0x53, 0x67, 0x54, 0x53, 0xE9, 0x16, 0x3D, 0xF7, + 0xDE, 0xF4, 0x42, 0x4B, 0x88, 0x80, 0x94, 0x4B, 0x6F, 0x52, 0x15, 0x08, + 0x20, 0x52, 0x42, 0x8B, 0x80, 0x14, 0x91, 0x26, 0x2A, 0x21, 0x09, 0x10, + 0x4A, 0x88, 0x21, 0xA1, 0xD9, 0x15, 0x51, 0xC1, 0x11, 0x45, 0x45, 0x04, + 0x1B, 0xC8, 0xA0, 0x88, 0x03, 0x8E, 0x8E, 0x80, 0x8C, 0x15, 0x51, 0x2C, + 0x0C, 0x8A, 0x0A, 0xD8, 0x07, 0xE4, 0x21, 0xA2, 0x8E, 0x83, 0xA3, 0x88, + 0x8A, 0xCA, 0xFB, 0xE1, 0x7B, 0xA3, 0x6B, 0xD6, 0xBC, 0xF7, 0xE6, 0xCD, + 0xFE, 0xB5, 0xD7, 0x3E, 0xE7, 0xAC, 0xF3, 0x9D, 0xB3, 0xCF, 0x07, 0xC0, + 0x08, 0x0C, 0x96, 0x48, 0x33, 0x51, 0x35, 0x80, 0x0C, 0xA9, 0x42, 0x1E, + 0x11, 0xE0, 0x83, 0xC7, 0xC4, 0xC6, 0xE1, 0xE4, 0x2E, 0x40, 0x81, 0x0A, + 0x24, 0x70, 0x00, 0x10, 0x08, 0xB3, 0x64, 0x21, 0x73, 0xFD, 0x23, 0x01, + 0x00, 0xF8, 0x7E, 0x3C, 0x3C, 0x2B, 0x22, 0xC0, 0x07, 0xBE, 0x00, 0x01, + 0x78, 0xD3, 0x0B, 0x08, 0x00, 0xC0, 0x4D, 0x9B, 0xC0, 0x30, 0x1C, 0x87, + 0xFF, 0x0F, 0xEA, 0x42, 0x99, 0x5C, 0x01, 0x80, 0x84, 0x01, 0xC0, 0x74, + 0x91, 0x38, 0x4B, 0x08, 0x80, 0x14, 0x00, 0x40, 0x7A, 0x8E, 0x42, 0xA6, + 0x00, 0x40, 0x46, 0x01, 0x80, 0x9D, 0x98, 0x26, 0x53, 0x00, 0xA0, 0x04, + 0x00, 0x60, 0xCB, 0x63, 0x62, 0xE3, 0x00, 0x50, 0x2D, 0x00, 0x60, 0x27, + 0x7F, 0xE6, 0xD3, 0x00, 0x80, 0x9D, 0xF8, 0x99, 0x7B, 0x01, 0x00, 0x5B, + 0x94, 0x21, 0x15, 0x01, 0xA0, 0x91, 0x00, 0x20, 0x13, 0x65, 0x88, 0x44, + 0x00, 0x68, 0x3B, 0x00, 0xAC, 0xCF, 0x56, 0x8A, 0x45, 0x00, 0x58, 0x30, + 0x00, 0x14, 0x66, 0x4B, 0xC4, 0x39, 0x00, 0xD8, 0x2D, 0x00, 0x30, 0x49, + 0x57, 0x66, 0x48, 0x00, 0xB0, 0xB7, 0x00, 0xC0, 0xCE, 0x10, 0x0B, 0xB2, + 0x00, 0x08, 0x0C, 0x00, 0x30, 0x51, 0x88, 0x85, 0x29, 0x00, 0x04, 0x7B, + 0x00, 0x60, 0xC8, 0x23, 0x23, 0x78, 0x00, 0x84, 0x99, 0x00, 0x14, 0x46, + 0xF2, 0x57, 0x3C, 0xF1, 0x2B, 0xAE, 0x10, 0xE7, 0x2A, 0x00, 0x00, 0x78, + 0x99, 0xB2, 0x3C, 0xB9, 0x24, 0x39, 0x45, 0x81, 0x5B, 0x08, 0x2D, 0x71, + 0x07, 0x57, 0x57, 0x2E, 0x1E, 0x28, 0xCE, 0x49, 0x17, 0x2B, 0x14, 0x36, + 0x61, 0x02, 0x61, 0x9A, 0x40, 0x2E, 0xC2, 0x79, 0x99, 0x19, 0x32, 0x81, + 0x34, 0x0F, 0xE0, 0xF3, 0xCC, 0x00, 0x00, 0xA0, 0x91, 0x15, 0x11, 0xE0, + 0x83, 0xF3, 0xFD, 0x78, 0xCE, 0x0E, 0xAE, 0xCE, 0xCE, 0x36, 0x8E, 0xB6, + 0x0E, 0x5F, 0x2D, 0xEA, 0xBF, 0x06, 0xFF, 0x22, 0x62, 0x62, 0xE3, 0xFE, + 0xE5, 0xCF, 0xAB, 0x70, 0x40, 0x00, 0x00, 0xE1, 0x74, 0x7E, 0xD1, 0xFE, + 0x2C, 0x2F, 0xB3, 0x1A, 0x80, 0x3B, 0x06, 0x80, 0x6D, 0xFE, 0xA2, 0x25, + 0xEE, 0x04, 0x68, 0x5E, 0x0B, 0xA0, 0x75, 0xF7, 0x8B, 0x66, 0xB2, 0x0F, + 0x40, 0xB5, 0x00, 0xA0, 0xE9, 0xDA, 0x57, 0xF3, 0x70, 0xF8, 0x7E, 0x3C, + 0x3C, 0x45, 0xA1, 0x90, 0xB9, 0xD9, 0xD9, 0xE5, 0xE4, 0xE4, 0xD8, 0x4A, + 0xC4, 0x42, 0x5B, 0x61, 0xCA, 0x57, 0x7D, 0xFE, 0x67, 0xC2, 0x5F, 0xC0, + 0x57, 0xFD, 0x6C, 0xF9, 0x7E, 0x3C, 0xFC, 0xF7, 0xF5, 0xE0, 0xBE, 0xE2, + 0x24, 0x81, 0x32, 0x5D, 0x81, 0x47, 0x04, 0xF8, 0xE0, 0xC2, 0xCC, 0xF4, + 0x4C, 0xA5, 0x1C, 0xCF, 0x92, 0x09, 0x84, 0x62, 0xDC, 0xE6, 0x8F, 0x47, + 0xFC, 0xB7, 0x0B, 0xFF, 0xFC, 0x1D, 0xD3, 0x22, 0xC4, 0x49, 0x62, 0xB9, + 0x58, 0x2A, 0x14, 0xE3, 0x51, 0x12, 0x71, 0x8E, 0x44, 0x9A, 0x8C, 0xF3, + 0x32, 0xA5, 0x22, 0x89, 0x42, 0x92, 0x29, 0xC5, 0x25, 0xD2, 0xFF, 0x64, + 0xE2, 0xDF, 0x2C, 0xFB, 0x03, 0x3E, 0xDF, 0x35, 0x00, 0xB0, 0x6A, 0x3E, + 0x01, 0x7B, 0x91, 0x2D, 0xA8, 0x5D, 0x63, 0x03, 0xF6, 0x4B, 0x27, 0x10, + 0x58, 0x74, 0xC0, 0xE2, 0xF7, 0x00, 0x00, 0xF2, 0xBB, 0x6F, 0xC1, 0xD4, + 0x28, 0x08, 0x03, 0x80, 0x68, 0x83, 0xE1, 0xCF, 0x77, 0xFF, 0xEF, 0x3F, + 0xFD, 0x47, 0xA0, 0x25, 0x00, 0x80, 0x66, 0x49, 0x92, 0x71, 0x00, 0x00, + 0x5E, 0x44, 0x24, 0x2E, 0x54, 0xCA, 0xB3, 0x3F, 0xC7, 0x08, 0x00, 0x00, + 0x44, 0xA0, 0x81, 0x2A, 0xB0, 0x41, 0x1B, 0xF4, 0xC1, 0x18, 0x2C, 0xC0, + 0x06, 0x1C, 0xC1, 0x05, 0xDC, 0xC1, 0x0B, 0xFC, 0x60, 0x36, 0x84, 0x42, + 0x24, 0xC4, 0xC2, 0x42, 0x10, 0x42, 0x0A, 0x64, 0x80, 0x1C, 0x72, 0x60, + 0x29, 0xAC, 0x82, 0x42, 0x28, 0x86, 0xCD, 0xB0, 0x1D, 0x2A, 0x60, 0x2F, + 0xD4, 0x40, 0x1D, 0x34, 0xC0, 0x51, 0x68, 0x86, 0x93, 0x70, 0x0E, 0x2E, + 0xC2, 0x55, 0xB8, 0x0E, 0x3D, 0x70, 0x0F, 0xFA, 0x61, 0x08, 0x9E, 0xC1, + 0x28, 0xBC, 0x81, 0x09, 0x04, 0x41, 0xC8, 0x08, 0x13, 0x61, 0x21, 0xDA, + 0x88, 0x01, 0x62, 0x8A, 0x58, 0x23, 0x8E, 0x08, 0x17, 0x99, 0x85, 0xF8, + 0x21, 0xC1, 0x48, 0x04, 0x12, 0x8B, 0x24, 0x20, 0xC9, 0x88, 0x14, 0x51, + 0x22, 0x4B, 0x91, 0x35, 0x48, 0x31, 0x52, 0x8A, 0x54, 0x20, 0x55, 0x48, + 0x1D, 0xF2, 0x3D, 0x72, 0x02, 0x39, 0x87, 0x5C, 0x46, 0xBA, 0x91, 0x3B, + 0xC8, 0x00, 0x32, 0x82, 0xFC, 0x86, 0xBC, 0x47, 0x31, 0x94, 0x81, 0xB2, + 0x51, 0x3D, 0xD4, 0x0C, 0xB5, 0x43, 0xB9, 0xA8, 0x37, 0x1A, 0x84, 0x46, + 0xA2, 0x0B, 0xD0, 0x64, 0x74, 0x31, 0x9A, 0x8F, 0x16, 0xA0, 0x9B, 0xD0, + 0x72, 0xB4, 0x1A, 0x3D, 0x8C, 0x36, 0xA1, 0xE7, 0xD0, 0xAB, 0x68, 0x0F, + 0xDA, 0x8F, 0x3E, 0x43, 0xC7, 0x30, 0xC0, 0xE8, 0x18, 0x07, 0x33, 0xC4, + 0x6C, 0x30, 0x2E, 0xC6, 0xC3, 0x42, 0xB1, 0x38, 0x2C, 0x09, 0x93, 0x63, + 0xCB, 0xB1, 0x22, 0xAC, 0x0C, 0xAB, 0xC6, 0x1A, 0xB0, 0x56, 0xAC, 0x03, + 0xBB, 0x89, 0xF5, 0x63, 0xCF, 0xB1, 0x77, 0x04, 0x12, 0x81, 0x45, 0xC0, + 0x09, 0x36, 0x04, 0x77, 0x42, 0x20, 0x61, 0x1E, 0x41, 0x48, 0x58, 0x4C, + 0x58, 0x4E, 0xD8, 0x48, 0xA8, 0x20, 0x1C, 0x24, 0x34, 0x11, 0xDA, 0x09, + 0x37, 0x09, 0x03, 0x84, 0x51, 0xC2, 0x27, 0x22, 0x93, 0xA8, 0x4B, 0xB4, + 0x26, 0xBA, 0x11, 0xF9, 0xC4, 0x18, 0x62, 0x32, 0x31, 0x87, 0x58, 0x48, + 0x2C, 0x23, 0xD6, 0x12, 0x8F, 0x13, 0x2F, 0x10, 0x7B, 0x88, 0x43, 0xC4, + 0x37, 0x24, 0x12, 0x89, 0x43, 0x32, 0x27, 0xB9, 0x90, 0x02, 0x49, 0xB1, + 0xA4, 0x54, 0xD2, 0x12, 0xD2, 0x46, 0xD2, 0x6E, 0x52, 0x23, 0xE9, 0x2C, + 0xA9, 0x9B, 0x34, 0x48, 0x1A, 0x23, 0x93, 0xC9, 0xDA, 0x64, 0x6B, 0xB2, + 0x07, 0x39, 0x94, 0x2C, 0x20, 0x2B, 0xC8, 0x85, 0xE4, 0x9D, 0xE4, 0xC3, + 0xE4, 0x33, 0xE4, 0x1B, 0xE4, 0x21, 0xF2, 0x5B, 0x0A, 0x9D, 0x62, 0x40, + 0x71, 0xA4, 0xF8, 0x53, 0xE2, 0x28, 0x52, 0xCA, 0x6A, 0x4A, 0x19, 0xE5, + 0x10, 0xE5, 0x34, 0xE5, 0x06, 0x65, 0x98, 0x32, 0x41, 0x55, 0xA3, 0x9A, + 0x52, 0xDD, 0xA8, 0xA1, 0x54, 0x11, 0x35, 0x8F, 0x5A, 0x42, 0xAD, 0xA1, + 0xB6, 0x52, 0xAF, 0x51, 0x87, 0xA8, 0x13, 0x34, 0x75, 0x9A, 0x39, 0xCD, + 0x83, 0x16, 0x49, 0x4B, 0xA5, 0xAD, 0xA2, 0x95, 0xD3, 0x1A, 0x68, 0x17, + 0x68, 0xF7, 0x69, 0xAF, 0xE8, 0x74, 0xBA, 0x11, 0xDD, 0x95, 0x1E, 0x4E, + 0x97, 0xD0, 0x57, 0xD2, 0xCB, 0xE9, 0x47, 0xE8, 0x97, 0xE8, 0x03, 0xF4, + 0x77, 0x0C, 0x0D, 0x86, 0x15, 0x83, 0xC7, 0x88, 0x67, 0x28, 0x19, 0x9B, + 0x18, 0x07, 0x18, 0x67, 0x19, 0x77, 0x18, 0xAF, 0x98, 0x4C, 0xA6, 0x19, + 0xD3, 0x8B, 0x19, 0xC7, 0x54, 0x30, 0x37, 0x31, 0xEB, 0x98, 0xE7, 0x99, + 0x0F, 0x99, 0x6F, 0x55, 0x58, 0x2A, 0xB6, 0x2A, 0x7C, 0x15, 0x91, 0xCA, + 0x0A, 0x95, 0x4A, 0x95, 0x26, 0x95, 0x1B, 0x2A, 0x2F, 0x54, 0xA9, 0xAA, + 0xA6, 0xAA, 0xDE, 0xAA, 0x0B, 0x55, 0xF3, 0x55, 0xCB, 0x54, 0x8F, 0xA9, + 0x5E, 0x53, 0x7D, 0xAE, 0x46, 0x55, 0x33, 0x53, 0xE3, 0xA9, 0x09, 0xD4, + 0x96, 0xAB, 0x55, 0xAA, 0x9D, 0x50, 0xEB, 0x53, 0x1B, 0x53, 0x67, 0xA9, + 0x3B, 0xA8, 0x87, 0xAA, 0x67, 0xA8, 0x6F, 0x54, 0x3F, 0xA4, 0x7E, 0x59, + 0xFD, 0x89, 0x06, 0x59, 0xC3, 0x4C, 0xC3, 0x4F, 0x43, 0xA4, 0x51, 0xA0, + 0xB1, 0x5F, 0xE3, 0xBC, 0xC6, 0x20, 0x0B, 0x63, 0x19, 0xB3, 0x78, 0x2C, + 0x21, 0x6B, 0x0D, 0xAB, 0x86, 0x75, 0x81, 0x35, 0xC4, 0x26, 0xB1, 0xCD, + 0xD9, 0x7C, 0x76, 0x2A, 0xBB, 0x98, 0xFD, 0x1D, 0xBB, 0x8B, 0x3D, 0xAA, + 0xA9, 0xA1, 0x39, 0x43, 0x33, 0x4A, 0x33, 0x57, 0xB3, 0x52, 0xF3, 0x94, + 0x66, 0x3F, 0x07, 0xE3, 0x98, 0x71, 0xF8, 0x9C, 0x74, 0x4E, 0x09, 0xE7, + 0x28, 0xA7, 0x97, 0xF3, 0x7E, 0x8A, 0xDE, 0x14, 0xEF, 0x29, 0xE2, 0x29, + 0x1B, 0xA6, 0x34, 0x4C, 0xB9, 0x31, 0x65, 0x5C, 0x6B, 0xAA, 0x96, 0x97, + 0x96, 0x58, 0xAB, 0x48, 0xAB, 0x51, 0xAB, 0x47, 0xEB, 0xBD, 0x36, 0xAE, + 0xED, 0xA7, 0x9D, 0xA6, 0xBD, 0x45, 0xBB, 0x59, 0xFB, 0x81, 0x0E, 0x41, + 0xC7, 0x4A, 0x27, 0x5C, 0x27, 0x47, 0x67, 0x8F, 0xCE, 0x05, 0x9D, 0xE7, + 0x53, 0xD9, 0x53, 0xDD, 0xA7, 0x0A, 0xA7, 0x16, 0x4D, 0x3D, 0x3A, 0xF5, + 0xAE, 0x2E, 0xAA, 0x6B, 0xA5, 0x1B, 0xA1, 0xBB, 0x44, 0x77, 0xBF, 0x6E, + 0xA7, 0xEE, 0x98, 0x9E, 0xBE, 0x5E, 0x80, 0x9E, 0x4C, 0x6F, 0xA7, 0xDE, + 0x79, 0xBD, 0xE7, 0xFA, 0x1C, 0x7D, 0x2F, 0xFD, 0x54, 0xFD, 0x6D, 0xFA, + 0xA7, 0xF5, 0x47, 0x0C, 0x58, 0x06, 0xB3, 0x0C, 0x24, 0x06, 0xDB, 0x0C, + 0xCE, 0x18, 0x3C, 0xC5, 0x35, 0x71, 0x6F, 0x3C, 0x1D, 0x2F, 0xC7, 0xDB, + 0xF1, 0x51, 0x43, 0x5D, 0xC3, 0x40, 0x43, 0xA5, 0x61, 0x95, 0x61, 0x97, + 0xE1, 0x84, 0x91, 0xB9, 0xD1, 0x3C, 0xA3, 0xD5, 0x46, 0x8D, 0x46, 0x0F, + 0x8C, 0x69, 0xC6, 0x5C, 0xE3, 0x24, 0xE3, 0x6D, 0xC6, 0x6D, 0xC6, 0xA3, + 0x26, 0x06, 0x26, 0x21, 0x26, 0x4B, 0x4D, 0xEA, 0x4D, 0xEE, 0x9A, 0x52, + 0x4D, 0xB9, 0xA6, 0x29, 0xA6, 0x3B, 0x4C, 0x3B, 0x4C, 0xC7, 0xCD, 0xCC, + 0xCD, 0xA2, 0xCD, 0xD6, 0x99, 0x35, 0x9B, 0x3D, 0x31, 0xD7, 0x32, 0xE7, + 0x9B, 0xE7, 0x9B, 0xD7, 0x9B, 0xDF, 0xB7, 0x60, 0x5A, 0x78, 0x5A, 0x2C, + 0xB6, 0xA8, 0xB6, 0xB8, 0x65, 0x49, 0xB2, 0xE4, 0x5A, 0xA6, 0x59, 0xEE, + 0xB6, 0xBC, 0x6E, 0x85, 0x5A, 0x39, 0x59, 0xA5, 0x58, 0x55, 0x5A, 0x5D, + 0xB3, 0x46, 0xAD, 0x9D, 0xAD, 0x25, 0xD6, 0xBB, 0xAD, 0xBB, 0xA7, 0x11, + 0xA7, 0xB9, 0x4E, 0x93, 0x4E, 0xAB, 0x9E, 0xD6, 0x67, 0xC3, 0xB0, 0xF1, + 0xB6, 0xC9, 0xB6, 0xA9, 0xB7, 0x19, 0xB0, 0xE5, 0xD8, 0x06, 0xDB, 0xAE, + 0xB6, 0x6D, 0xB6, 0x7D, 0x61, 0x67, 0x62, 0x17, 0x67, 0xB7, 0xC5, 0xAE, + 0xC3, 0xEE, 0x93, 0xBD, 0x93, 0x7D, 0xBA, 0x7D, 0x8D, 0xFD, 0x3D, 0x07, + 0x0D, 0x87, 0xD9, 0x0E, 0xAB, 0x1D, 0x5A, 0x1D, 0x7E, 0x73, 0xB4, 0x72, + 0x14, 0x3A, 0x56, 0x3A, 0xDE, 0x9A, 0xCE, 0x9C, 0xEE, 0x3F, 0x7D, 0xC5, + 0xF4, 0x96, 0xE9, 0x2F, 0x67, 0x58, 0xCF, 0x10, 0xCF, 0xD8, 0x33, 0xE3, + 0xB6, 0x13, 0xCB, 0x29, 0xC4, 0x69, 0x9D, 0x53, 0x9B, 0xD3, 0x47, 0x67, + 0x17, 0x67, 0xB9, 0x73, 0x83, 0xF3, 0x88, 0x8B, 0x89, 0x4B, 0x82, 0xCB, + 0x2E, 0x97, 0x3E, 0x2E, 0x9B, 0x1B, 0xC6, 0xDD, 0xC8, 0xBD, 0xE4, 0x4A, + 0x74, 0xF5, 0x71, 0x5D, 0xE1, 0x7A, 0xD2, 0xF5, 0x9D, 0x9B, 0xB3, 0x9B, + 0xC2, 0xED, 0xA8, 0xDB, 0xAF, 0xEE, 0x36, 0xEE, 0x69, 0xEE, 0x87, 0xDC, + 0x9F, 0xCC, 0x34, 0x9F, 0x29, 0x9E, 0x59, 0x33, 0x73, 0xD0, 0xC3, 0xC8, + 0x43, 0xE0, 0x51, 0xE5, 0xD1, 0x3F, 0x0B, 0x9F, 0x95, 0x30, 0x6B, 0xDF, + 0xAC, 0x7E, 0x4F, 0x43, 0x4F, 0x81, 0x67, 0xB5, 0xE7, 0x23, 0x2F, 0x63, + 0x2F, 0x91, 0x57, 0xAD, 0xD7, 0xB0, 0xB7, 0xA5, 0x77, 0xAA, 0xF7, 0x61, + 0xEF, 0x17, 0x3E, 0xF6, 0x3E, 0x72, 0x9F, 0xE3, 0x3E, 0xE3, 0x3C, 0x37, + 0xDE, 0x32, 0xDE, 0x59, 0x5F, 0xCC, 0x37, 0xC0, 0xB7, 0xC8, 0xB7, 0xCB, + 0x4F, 0xC3, 0x6F, 0x9E, 0x5F, 0x85, 0xDF, 0x43, 0x7F, 0x23, 0xFF, 0x64, + 0xFF, 0x7A, 0xFF, 0xD1, 0x00, 0xA7, 0x80, 0x25, 0x01, 0x67, 0x03, 0x89, + 0x81, 0x41, 0x81, 0x5B, 0x02, 0xFB, 0xF8, 0x7A, 0x7C, 0x21, 0xBF, 0x8E, + 0x3F, 0x3A, 0xDB, 0x65, 0xF6, 0xB2, 0xD9, 0xED, 0x41, 0x8C, 0xA0, 0xB9, + 0x41, 0x15, 0x41, 0x8F, 0x82, 0xAD, 0x82, 0xE5, 0xC1, 0xAD, 0x21, 0x68, + 0xC8, 0xEC, 0x90, 0xAD, 0x21, 0xF7, 0xE7, 0x98, 0xCE, 0x91, 0xCE, 0x69, + 0x0E, 0x85, 0x50, 0x7E, 0xE8, 0xD6, 0xD0, 0x07, 0x61, 0xE6, 0x61, 0x8B, + 0xC3, 0x7E, 0x0C, 0x27, 0x85, 0x87, 0x85, 0x57, 0x86, 0x3F, 0x8E, 0x70, + 0x88, 0x58, 0x1A, 0xD1, 0x31, 0x97, 0x35, 0x77, 0xD1, 0xDC, 0x43, 0x73, + 0xDF, 0x44, 0xFA, 0x44, 0x96, 0x44, 0xDE, 0x9B, 0x67, 0x31, 0x4F, 0x39, + 0xAF, 0x2D, 0x4A, 0x35, 0x2A, 0x3E, 0xAA, 0x2E, 0x6A, 0x3C, 0xDA, 0x37, + 0xBA, 0x34, 0xBA, 0x3F, 0xC6, 0x2E, 0x66, 0x59, 0xCC, 0xD5, 0x58, 0x9D, + 0x58, 0x49, 0x6C, 0x4B, 0x1C, 0x39, 0x2E, 0x2A, 0xAE, 0x36, 0x6E, 0x6C, + 0xBE, 0xDF, 0xFC, 0xED, 0xF3, 0x87, 0xE2, 0x9D, 0xE2, 0x0B, 0xE3, 0x7B, + 0x17, 0x98, 0x2F, 0xC8, 0x5D, 0x70, 0x79, 0xA1, 0xCE, 0xC2, 0xF4, 0x85, + 0xA7, 0x16, 0xA9, 0x2E, 0x12, 0x2C, 0x3A, 0x96, 0x40, 0x4C, 0x88, 0x4E, + 0x38, 0x94, 0xF0, 0x41, 0x10, 0x2A, 0xA8, 0x16, 0x8C, 0x25, 0xF2, 0x13, + 0x77, 0x25, 0x8E, 0x0A, 0x79, 0xC2, 0x1D, 0xC2, 0x67, 0x22, 0x2F, 0xD1, + 0x36, 0xD1, 0x88, 0xD8, 0x43, 0x5C, 0x2A, 0x1E, 0x4E, 0xF2, 0x48, 0x2A, + 0x4D, 0x7A, 0x92, 0xEC, 0x91, 0xBC, 0x35, 0x79, 0x24, 0xC5, 0x33, 0xA5, + 0x2C, 0xE5, 0xB9, 0x84, 0x27, 0xA9, 0x90, 0xBC, 0x4C, 0x0D, 0x4C, 0xDD, + 0x9B, 0x3A, 0x9E, 0x16, 0x9A, 0x76, 0x20, 0x6D, 0x32, 0x3D, 0x3A, 0xBD, + 0x31, 0x83, 0x92, 0x91, 0x90, 0x71, 0x42, 0xAA, 0x21, 0x4D, 0x93, 0xB6, + 0x67, 0xEA, 0x67, 0xE6, 0x66, 0x76, 0xCB, 0xAC, 0x65, 0x85, 0xB2, 0xFE, + 0xC5, 0x6E, 0x8B, 0xB7, 0x2F, 0x1E, 0x95, 0x07, 0xC9, 0x6B, 0xB3, 0x90, + 0xAC, 0x05, 0x59, 0x2D, 0x0A, 0xB6, 0x42, 0xA6, 0xE8, 0x54, 0x5A, 0x28, + 0xD7, 0x2A, 0x07, 0xB2, 0x67, 0x65, 0x57, 0x66, 0xBF, 0xCD, 0x89, 0xCA, + 0x39, 0x96, 0xAB, 0x9E, 0x2B, 0xCD, 0xED, 0xCC, 0xB3, 0xCA, 0xDB, 0x90, + 0x37, 0x9C, 0xEF, 0x9F, 0xFF, 0xED, 0x12, 0xC2, 0x12, 0xE1, 0x92, 0xB6, + 0xA5, 0x86, 0x4B, 0x57, 0x2D, 0x1D, 0x58, 0xE6, 0xBD, 0xAC, 0x6A, 0x39, + 0xB2, 0x3C, 0x71, 0x79, 0xDB, 0x0A, 0xE3, 0x15, 0x05, 0x2B, 0x86, 0x56, + 0x06, 0xAC, 0x3C, 0xB8, 0x8A, 0xB6, 0x2A, 0x6D, 0xD5, 0x4F, 0xAB, 0xED, + 0x57, 0x97, 0xAE, 0x7E, 0xBD, 0x26, 0x7A, 0x4D, 0x6B, 0x81, 0x5E, 0xC1, + 0xCA, 0x82, 0xC1, 0xB5, 0x01, 0x6B, 0xEB, 0x0B, 0x55, 0x0A, 0xE5, 0x85, + 0x7D, 0xEB, 0xDC, 0xD7, 0xED, 0x5D, 0x4F, 0x58, 0x2F, 0x59, 0xDF, 0xB5, + 0x61, 0xFA, 0x86, 0x9D, 0x1B, 0x3E, 0x15, 0x89, 0x8A, 0xAE, 0x14, 0xDB, + 0x17, 0x97, 0x15, 0x7F, 0xD8, 0x28, 0xDC, 0x78, 0xE5, 0x1B, 0x87, 0x6F, + 0xCA, 0xBF, 0x99, 0xDC, 0x94, 0xB4, 0xA9, 0xAB, 0xC4, 0xB9, 0x64, 0xCF, + 0x66, 0xD2, 0x66, 0xE9, 0xE6, 0xDE, 0x2D, 0x9E, 0x5B, 0x0E, 0x96, 0xAA, + 0x97, 0xE6, 0x97, 0x0E, 0x6E, 0x0D, 0xD9, 0xDA, 0xB4, 0x0D, 0xDF, 0x56, + 0xB4, 0xED, 0xF5, 0xF6, 0x45, 0xDB, 0x2F, 0x97, 0xCD, 0x28, 0xDB, 0xBB, + 0x83, 0xB6, 0x43, 0xB9, 0xA3, 0xBF, 0x3C, 0xB8, 0xBC, 0x65, 0xA7, 0xC9, + 0xCE, 0xCD, 0x3B, 0x3F, 0x54, 0xA4, 0x54, 0xF4, 0x54, 0xFA, 0x54, 0x36, + 0xEE, 0xD2, 0xDD, 0xB5, 0x61, 0xD7, 0xF8, 0x6E, 0xD1, 0xEE, 0x1B, 0x7B, + 0xBC, 0xF6, 0x34, 0xEC, 0xD5, 0xDB, 0x5B, 0xBC, 0xF7, 0xFD, 0x3E, 0xC9, + 0xBE, 0xDB, 0x55, 0x01, 0x55, 0x4D, 0xD5, 0x66, 0xD5, 0x65, 0xFB, 0x49, + 0xFB, 0xB3, 0xF7, 0x3F, 0xAE, 0x89, 0xAA, 0xE9, 0xF8, 0x96, 0xFB, 0x6D, + 0x5D, 0xAD, 0x4E, 0x6D, 0x71, 0xED, 0xC7, 0x03, 0xD2, 0x03, 0xFD, 0x07, + 0x23, 0x0E, 0xB6, 0xD7, 0xB9, 0xD4, 0xD5, 0x1D, 0xD2, 0x3D, 0x54, 0x52, + 0x8F, 0xD6, 0x2B, 0xEB, 0x47, 0x0E, 0xC7, 0x1F, 0xBE, 0xFE, 0x9D, 0xEF, + 0x77, 0x2D, 0x0D, 0x36, 0x0D, 0x55, 0x8D, 0x9C, 0xC6, 0xE2, 0x23, 0x70, + 0x44, 0x79, 0xE4, 0xE9, 0xF7, 0x09, 0xDF, 0xF7, 0x1E, 0x0D, 0x3A, 0xDA, + 0x76, 0x8C, 0x7B, 0xAC, 0xE1, 0x07, 0xD3, 0x1F, 0x76, 0x1D, 0x67, 0x1D, + 0x2F, 0x6A, 0x42, 0x9A, 0xF2, 0x9A, 0x46, 0x9B, 0x53, 0x9A, 0xFB, 0x5B, + 0x62, 0x5B, 0xBA, 0x4F, 0xCC, 0x3E, 0xD1, 0xD6, 0xEA, 0xDE, 0x7A, 0xFC, + 0x47, 0xDB, 0x1F, 0x0F, 0x9C, 0x34, 0x3C, 0x59, 0x79, 0x4A, 0xF3, 0x54, + 0xC9, 0x69, 0xDA, 0xE9, 0x82, 0xD3, 0x93, 0x67, 0xF2, 0xCF, 0x8C, 0x9D, + 0x95, 0x9D, 0x7D, 0x7E, 0x2E, 0xF9, 0xDC, 0x60, 0xDB, 0xA2, 0xB6, 0x7B, + 0xE7, 0x63, 0xCE, 0xDF, 0x6A, 0x0F, 0x6F, 0xEF, 0xBA, 0x10, 0x74, 0xE1, + 0xD2, 0x45, 0xFF, 0x8B, 0xE7, 0x3B, 0xBC, 0x3B, 0xCE, 0x5C, 0xF2, 0xB8, + 0x74, 0xF2, 0xB2, 0xDB, 0xE5, 0x13, 0x57, 0xB8, 0x57, 0x9A, 0xAF, 0x3A, + 0x5F, 0x6D, 0xEA, 0x74, 0xEA, 0x3C, 0xFE, 0x93, 0xD3, 0x4F, 0xC7, 0xBB, + 0x9C, 0xBB, 0x9A, 0xAE, 0xB9, 0x5C, 0x6B, 0xB9, 0xEE, 0x7A, 0xBD, 0xB5, + 0x7B, 0x66, 0xF7, 0xE9, 0x1B, 0x9E, 0x37, 0xCE, 0xDD, 0xF4, 0xBD, 0x79, + 0xF1, 0x16, 0xFF, 0xD6, 0xD5, 0x9E, 0x39, 0x3D, 0xDD, 0xBD, 0xF3, 0x7A, + 0x6F, 0xF7, 0xC5, 0xF7, 0xF5, 0xDF, 0x16, 0xDD, 0x7E, 0x72, 0x27, 0xFD, + 0xCE, 0xCB, 0xBB, 0xD9, 0x77, 0x27, 0xEE, 0xAD, 0xBC, 0x4F, 0xBC, 0x5F, + 0xF4, 0x40, 0xED, 0x41, 0xD9, 0x43, 0xDD, 0x87, 0xD5, 0x3F, 0x5B, 0xFE, + 0xDC, 0xD8, 0xEF, 0xDC, 0x7F, 0x6A, 0xC0, 0x77, 0xA0, 0xF3, 0xD1, 0xDC, + 0x47, 0xF7, 0x06, 0x85, 0x83, 0xCF, 0xFE, 0x91, 0xF5, 0x8F, 0x0F, 0x43, + 0x05, 0x8F, 0x99, 0x8F, 0xCB, 0x86, 0x0D, 0x86, 0xEB, 0x9E, 0x38, 0x3E, + 0x39, 0x39, 0xE2, 0x3F, 0x72, 0xFD, 0xE9, 0xFC, 0xA7, 0x43, 0xCF, 0x64, + 0xCF, 0x26, 0x9E, 0x17, 0xFE, 0xA2, 0xFE, 0xCB, 0xAE, 0x17, 0x16, 0x2F, + 0x7E, 0xF8, 0xD5, 0xEB, 0xD7, 0xCE, 0xD1, 0x98, 0xD1, 0xA1, 0x97, 0xF2, + 0x97, 0x93, 0xBF, 0x6D, 0x7C, 0xA5, 0xFD, 0xEA, 0xC0, 0xEB, 0x19, 0xAF, + 0xDB, 0xC6, 0xC2, 0xC6, 0x1E, 0xBE, 0xC9, 0x78, 0x33, 0x31, 0x5E, 0xF4, + 0x56, 0xFB, 0xED, 0xC1, 0x77, 0xDC, 0x77, 0x1D, 0xEF, 0xA3, 0xDF, 0x0F, + 0x4F, 0xE4, 0x7C, 0x20, 0x7F, 0x28, 0xFF, 0x68, 0xF9, 0xB1, 0xF5, 0x53, + 0xD0, 0xA7, 0xFB, 0x93, 0x19, 0x93, 0x93, 0xFF, 0x04, 0x03, 0x98, 0xF3, + 0xFC, 0x63, 0x33, 0x2D, 0xDB, 0x00, 0x00, 0x3A, 0xFD, 0x69, 0x54, 0x58, + 0x74, 0x58, 0x4D, 0x4C, 0x3A, 0x63, 0x6F, 0x6D, 0x2E, 0x61, 0x64, 0x6F, + 0x62, 0x65, 0x2E, 0x78, 0x6D, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, + 0x3F, 0x78, 0x70, 0x61, 0x63, 0x6B, 0x65, 0x74, 0x20, 0x62, 0x65, 0x67, + 0x69, 0x6E, 0x3D, 0x22, 0xEF, 0xBB, 0xBF, 0x22, 0x20, 0x69, 0x64, 0x3D, + 0x22, 0x57, 0x35, 0x4D, 0x30, 0x4D, 0x70, 0x43, 0x65, 0x68, 0x69, 0x48, + 0x7A, 0x72, 0x65, 0x53, 0x7A, 0x4E, 0x54, 0x63, 0x7A, 0x6B, 0x63, 0x39, + 0x64, 0x22, 0x3F, 0x3E, 0x0A, 0x3C, 0x78, 0x3A, 0x78, 0x6D, 0x70, 0x6D, + 0x65, 0x74, 0x61, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, 0x3A, 0x78, 0x3D, + 0x22, 0x61, 0x64, 0x6F, 0x62, 0x65, 0x3A, 0x6E, 0x73, 0x3A, 0x6D, 0x65, + 0x74, 0x61, 0x2F, 0x22, 0x20, 0x78, 0x3A, 0x78, 0x6D, 0x70, 0x74, 0x6B, + 0x3D, 0x22, 0x41, 0x64, 0x6F, 0x62, 0x65, 0x20, 0x58, 0x4D, 0x50, 0x20, + 0x43, 0x6F, 0x72, 0x65, 0x20, 0x35, 0x2E, 0x36, 0x2D, 0x63, 0x31, 0x33, + 0x38, 0x20, 0x37, 0x39, 0x2E, 0x31, 0x35, 0x39, 0x38, 0x32, 0x34, 0x2C, + 0x20, 0x32, 0x30, 0x31, 0x36, 0x2F, 0x30, 0x39, 0x2F, 0x31, 0x34, 0x2D, + 0x30, 0x31, 0x3A, 0x30, 0x39, 0x3A, 0x30, 0x31, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x3C, 0x72, + 0x64, 0x66, 0x3A, 0x52, 0x44, 0x46, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, + 0x3A, 0x72, 0x64, 0x66, 0x3D, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, + 0x2F, 0x77, 0x77, 0x77, 0x2E, 0x77, 0x33, 0x2E, 0x6F, 0x72, 0x67, 0x2F, + 0x31, 0x39, 0x39, 0x39, 0x2F, 0x30, 0x32, 0x2F, 0x32, 0x32, 0x2D, 0x72, + 0x64, 0x66, 0x2D, 0x73, 0x79, 0x6E, 0x74, 0x61, 0x78, 0x2D, 0x6E, 0x73, + 0x23, 0x22, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, + 0x64, 0x66, 0x3A, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6F, 0x6E, 0x20, 0x72, 0x64, 0x66, 0x3A, 0x61, 0x62, 0x6F, 0x75, 0x74, + 0x3D, 0x22, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, 0x3A, 0x78, 0x6D, + 0x70, 0x3D, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x6E, 0x73, + 0x2E, 0x61, 0x64, 0x6F, 0x62, 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x78, + 0x61, 0x70, 0x2F, 0x31, 0x2E, 0x30, 0x2F, 0x22, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, 0x6C, + 0x6E, 0x73, 0x3A, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3D, 0x22, 0x68, 0x74, + 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x6E, 0x73, 0x2E, 0x61, 0x64, 0x6F, 0x62, + 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x78, 0x61, 0x70, 0x2F, 0x31, 0x2E, + 0x30, 0x2F, 0x6D, 0x6D, 0x2F, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, + 0x3A, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3D, 0x22, 0x68, 0x74, 0x74, 0x70, + 0x3A, 0x2F, 0x2F, 0x6E, 0x73, 0x2E, 0x61, 0x64, 0x6F, 0x62, 0x65, 0x2E, + 0x63, 0x6F, 0x6D, 0x2F, 0x78, 0x61, 0x70, 0x2F, 0x31, 0x2E, 0x30, 0x2F, + 0x73, 0x54, 0x79, 0x70, 0x65, 0x2F, 0x52, 0x65, 0x73, 0x6F, 0x75, 0x72, + 0x63, 0x65, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x23, 0x22, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, + 0x6C, 0x6E, 0x73, 0x3A, 0x70, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, + 0x70, 0x3D, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x6E, 0x73, + 0x2E, 0x61, 0x64, 0x6F, 0x62, 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x70, + 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x2F, 0x31, 0x2E, 0x30, + 0x2F, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, 0x3A, 0x64, 0x63, 0x3D, + 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x70, 0x75, 0x72, 0x6C, + 0x2E, 0x6F, 0x72, 0x67, 0x2F, 0x64, 0x63, 0x2F, 0x65, 0x6C, 0x65, 0x6D, + 0x65, 0x6E, 0x74, 0x73, 0x2F, 0x31, 0x2E, 0x31, 0x2F, 0x22, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, + 0x6D, 0x6C, 0x6E, 0x73, 0x3A, 0x74, 0x69, 0x66, 0x66, 0x3D, 0x22, 0x68, + 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x6E, 0x73, 0x2E, 0x61, 0x64, 0x6F, + 0x62, 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x74, 0x69, 0x66, 0x66, 0x2F, + 0x31, 0x2E, 0x30, 0x2F, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, 0x3A, + 0x65, 0x78, 0x69, 0x66, 0x3D, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, + 0x2F, 0x6E, 0x73, 0x2E, 0x61, 0x64, 0x6F, 0x62, 0x65, 0x2E, 0x63, 0x6F, + 0x6D, 0x2F, 0x65, 0x78, 0x69, 0x66, 0x2F, 0x31, 0x2E, 0x30, 0x2F, 0x22, + 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, + 0x78, 0x6D, 0x70, 0x3A, 0x43, 0x72, 0x65, 0x61, 0x74, 0x6F, 0x72, 0x54, + 0x6F, 0x6F, 0x6C, 0x3E, 0x41, 0x64, 0x6F, 0x62, 0x65, 0x20, 0x50, 0x68, + 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x20, 0x43, 0x43, 0x20, 0x32, + 0x30, 0x31, 0x37, 0x20, 0x28, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, + 0x29, 0x3C, 0x2F, 0x78, 0x6D, 0x70, 0x3A, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x6F, 0x72, 0x54, 0x6F, 0x6F, 0x6C, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x3A, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x65, 0x3E, 0x32, 0x30, 0x31, + 0x38, 0x2D, 0x30, 0x34, 0x2D, 0x30, 0x31, 0x54, 0x32, 0x32, 0x3A, 0x30, + 0x30, 0x3A, 0x31, 0x33, 0x2B, 0x30, 0x38, 0x3A, 0x30, 0x30, 0x3C, 0x2F, + 0x78, 0x6D, 0x70, 0x3A, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, + 0x74, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x3A, 0x4D, 0x65, 0x74, 0x61, 0x64, 0x61, + 0x74, 0x61, 0x44, 0x61, 0x74, 0x65, 0x3E, 0x32, 0x30, 0x31, 0x38, 0x2D, + 0x30, 0x34, 0x2D, 0x30, 0x31, 0x54, 0x32, 0x32, 0x3A, 0x30, 0x30, 0x3A, + 0x31, 0x33, 0x2B, 0x30, 0x38, 0x3A, 0x30, 0x30, 0x3C, 0x2F, 0x78, 0x6D, + 0x70, 0x3A, 0x4D, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x44, 0x61, + 0x74, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x3A, 0x4D, 0x6F, 0x64, 0x69, 0x66, 0x79, + 0x44, 0x61, 0x74, 0x65, 0x3E, 0x32, 0x30, 0x31, 0x38, 0x2D, 0x30, 0x34, + 0x2D, 0x30, 0x31, 0x54, 0x32, 0x32, 0x3A, 0x30, 0x30, 0x3A, 0x31, 0x33, + 0x2B, 0x30, 0x38, 0x3A, 0x30, 0x30, 0x3C, 0x2F, 0x78, 0x6D, 0x70, 0x3A, + 0x4D, 0x6F, 0x64, 0x69, 0x66, 0x79, 0x44, 0x61, 0x74, 0x65, 0x3E, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x78, 0x6D, + 0x70, 0x4D, 0x4D, 0x3A, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, + 0x49, 0x44, 0x3E, 0x78, 0x6D, 0x70, 0x2E, 0x69, 0x69, 0x64, 0x3A, 0x61, + 0x36, 0x61, 0x62, 0x64, 0x39, 0x62, 0x36, 0x2D, 0x34, 0x65, 0x35, 0x37, + 0x2D, 0x33, 0x63, 0x34, 0x63, 0x2D, 0x61, 0x37, 0x38, 0x30, 0x2D, 0x63, + 0x62, 0x30, 0x63, 0x32, 0x33, 0x65, 0x39, 0x30, 0x61, 0x31, 0x64, 0x3C, + 0x2F, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x49, 0x6E, 0x73, 0x74, 0x61, + 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x44, + 0x6F, 0x63, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x49, 0x44, 0x3E, 0x61, 0x64, + 0x6F, 0x62, 0x65, 0x3A, 0x64, 0x6F, 0x63, 0x69, 0x64, 0x3A, 0x70, 0x68, + 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x3A, 0x66, 0x66, 0x37, 0x34, + 0x35, 0x33, 0x62, 0x38, 0x2D, 0x33, 0x35, 0x62, 0x34, 0x2D, 0x31, 0x31, + 0x65, 0x38, 0x2D, 0x39, 0x31, 0x61, 0x34, 0x2D, 0x38, 0x38, 0x34, 0x37, + 0x30, 0x37, 0x30, 0x65, 0x31, 0x35, 0x34, 0x62, 0x3C, 0x2F, 0x78, 0x6D, + 0x70, 0x4D, 0x4D, 0x3A, 0x44, 0x6F, 0x63, 0x75, 0x6D, 0x65, 0x6E, 0x74, + 0x49, 0x44, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x4F, 0x72, 0x69, 0x67, + 0x69, 0x6E, 0x61, 0x6C, 0x44, 0x6F, 0x63, 0x75, 0x6D, 0x65, 0x6E, 0x74, + 0x49, 0x44, 0x3E, 0x78, 0x6D, 0x70, 0x2E, 0x64, 0x69, 0x64, 0x3A, 0x34, + 0x34, 0x35, 0x36, 0x39, 0x37, 0x37, 0x61, 0x2D, 0x38, 0x38, 0x64, 0x63, + 0x2D, 0x37, 0x37, 0x34, 0x33, 0x2D, 0x61, 0x35, 0x37, 0x63, 0x2D, 0x63, + 0x65, 0x38, 0x65, 0x34, 0x36, 0x31, 0x36, 0x62, 0x63, 0x63, 0x37, 0x3C, + 0x2F, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x4F, 0x72, 0x69, 0x67, 0x69, + 0x6E, 0x61, 0x6C, 0x44, 0x6F, 0x63, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x49, + 0x44, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x3C, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x48, 0x69, 0x73, 0x74, 0x6F, + 0x72, 0x79, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x64, 0x66, 0x3A, 0x53, 0x65, 0x71, + 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x64, 0x66, 0x3A, 0x6C, 0x69, + 0x20, 0x72, 0x64, 0x66, 0x3A, 0x70, 0x61, 0x72, 0x73, 0x65, 0x54, 0x79, + 0x70, 0x65, 0x3D, 0x22, 0x52, 0x65, 0x73, 0x6F, 0x75, 0x72, 0x63, 0x65, + 0x22, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, + 0x45, 0x76, 0x74, 0x3A, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x63, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, + 0x74, 0x3A, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x69, + 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3E, 0x78, 0x6D, + 0x70, 0x2E, 0x69, 0x69, 0x64, 0x3A, 0x34, 0x34, 0x35, 0x36, 0x39, 0x37, + 0x37, 0x61, 0x2D, 0x38, 0x38, 0x64, 0x63, 0x2D, 0x37, 0x37, 0x34, 0x33, + 0x2D, 0x61, 0x35, 0x37, 0x63, 0x2D, 0x63, 0x65, 0x38, 0x65, 0x34, 0x36, + 0x31, 0x36, 0x62, 0x63, 0x63, 0x37, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, + 0x74, 0x3A, 0x69, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, + 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x45, + 0x76, 0x74, 0x3A, 0x77, 0x68, 0x65, 0x6E, 0x3E, 0x32, 0x30, 0x31, 0x38, + 0x2D, 0x30, 0x34, 0x2D, 0x30, 0x31, 0x54, 0x32, 0x32, 0x3A, 0x30, 0x30, + 0x3A, 0x31, 0x33, 0x2B, 0x30, 0x38, 0x3A, 0x30, 0x30, 0x3C, 0x2F, 0x73, + 0x74, 0x45, 0x76, 0x74, 0x3A, 0x77, 0x68, 0x65, 0x6E, 0x3E, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, + 0x73, 0x6F, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x41, 0x67, 0x65, 0x6E, + 0x74, 0x3E, 0x41, 0x64, 0x6F, 0x62, 0x65, 0x20, 0x50, 0x68, 0x6F, 0x74, + 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x20, 0x43, 0x43, 0x20, 0x32, 0x30, 0x31, + 0x37, 0x20, 0x28, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x29, 0x3C, + 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x73, 0x6F, 0x66, 0x74, 0x77, + 0x61, 0x72, 0x65, 0x41, 0x67, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x3C, 0x2F, 0x72, 0x64, 0x66, 0x3A, 0x6C, 0x69, 0x3E, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x3C, 0x72, 0x64, 0x66, 0x3A, 0x6C, 0x69, 0x20, 0x72, 0x64, + 0x66, 0x3A, 0x70, 0x61, 0x72, 0x73, 0x65, 0x54, 0x79, 0x70, 0x65, 0x3D, + 0x22, 0x52, 0x65, 0x73, 0x6F, 0x75, 0x72, 0x63, 0x65, 0x22, 0x3E, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, + 0x3A, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x73, 0x61, 0x76, 0x65, + 0x64, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x61, 0x63, 0x74, + 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, + 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x69, 0x6E, 0x73, 0x74, 0x61, 0x6E, + 0x63, 0x65, 0x49, 0x44, 0x3E, 0x78, 0x6D, 0x70, 0x2E, 0x69, 0x69, 0x64, + 0x3A, 0x61, 0x36, 0x61, 0x62, 0x64, 0x39, 0x62, 0x36, 0x2D, 0x34, 0x65, + 0x35, 0x37, 0x2D, 0x33, 0x63, 0x34, 0x63, 0x2D, 0x61, 0x37, 0x38, 0x30, + 0x2D, 0x63, 0x62, 0x30, 0x63, 0x32, 0x33, 0x65, 0x39, 0x30, 0x61, 0x31, + 0x64, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x69, 0x6E, 0x73, + 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3E, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x77, 0x68, + 0x65, 0x6E, 0x3E, 0x32, 0x30, 0x31, 0x38, 0x2D, 0x30, 0x34, 0x2D, 0x30, + 0x31, 0x54, 0x32, 0x32, 0x3A, 0x30, 0x30, 0x3A, 0x31, 0x33, 0x2B, 0x30, + 0x38, 0x3A, 0x30, 0x30, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, + 0x77, 0x68, 0x65, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x73, 0x6F, 0x66, 0x74, 0x77, + 0x61, 0x72, 0x65, 0x41, 0x67, 0x65, 0x6E, 0x74, 0x3E, 0x41, 0x64, 0x6F, + 0x62, 0x65, 0x20, 0x50, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, + 0x20, 0x43, 0x43, 0x20, 0x32, 0x30, 0x31, 0x37, 0x20, 0x28, 0x57, 0x69, + 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x29, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, + 0x74, 0x3A, 0x73, 0x6F, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x41, 0x67, + 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, + 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x63, 0x68, 0x61, 0x6E, 0x67, 0x65, + 0x64, 0x3E, 0x2F, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x63, + 0x68, 0x61, 0x6E, 0x67, 0x65, 0x64, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, + 0x2F, 0x72, 0x64, 0x66, 0x3A, 0x6C, 0x69, 0x3E, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x72, + 0x64, 0x66, 0x3A, 0x53, 0x65, 0x71, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x78, 0x6D, 0x70, 0x4D, 0x4D, + 0x3A, 0x48, 0x69, 0x73, 0x74, 0x6F, 0x72, 0x79, 0x3E, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x70, 0x68, 0x6F, 0x74, + 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x3A, 0x44, 0x6F, 0x63, 0x75, 0x6D, 0x65, + 0x6E, 0x74, 0x41, 0x6E, 0x63, 0x65, 0x73, 0x74, 0x6F, 0x72, 0x73, 0x3E, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x3C, 0x72, 0x64, 0x66, 0x3A, 0x42, 0x61, 0x67, 0x3E, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x3C, 0x72, 0x64, 0x66, 0x3A, 0x6C, 0x69, 0x3E, 0x78, 0x6D, + 0x70, 0x2E, 0x64, 0x69, 0x64, 0x3A, 0x39, 0x30, 0x39, 0x62, 0x39, 0x65, + 0x35, 0x32, 0x2D, 0x39, 0x37, 0x62, 0x64, 0x2D, 0x34, 0x32, 0x39, 0x33, + 0x2D, 0x38, 0x30, 0x64, 0x32, 0x2D, 0x31, 0x31, 0x64, 0x65, 0x62, 0x64, + 0x36, 0x61, 0x33, 0x33, 0x65, 0x62, 0x3C, 0x2F, 0x72, 0x64, 0x66, 0x3A, + 0x6C, 0x69, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x72, 0x64, 0x66, 0x3A, 0x42, 0x61, + 0x67, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x3C, 0x2F, 0x70, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x3A, + 0x44, 0x6F, 0x63, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x41, 0x6E, 0x63, 0x65, + 0x73, 0x74, 0x6F, 0x72, 0x73, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3C, 0x70, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, + 0x6F, 0x70, 0x3A, 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x4D, 0x6F, 0x64, 0x65, + 0x3E, 0x33, 0x3C, 0x2F, 0x70, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, + 0x70, 0x3A, 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x4D, 0x6F, 0x64, 0x65, 0x3E, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x70, + 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x3A, 0x49, 0x43, 0x43, + 0x50, 0x72, 0x6F, 0x66, 0x69, 0x6C, 0x65, 0x3E, 0x73, 0x52, 0x47, 0x42, + 0x20, 0x49, 0x45, 0x43, 0x36, 0x31, 0x39, 0x36, 0x36, 0x2D, 0x32, 0x2E, + 0x31, 0x3C, 0x2F, 0x70, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, + 0x3A, 0x49, 0x43, 0x43, 0x50, 0x72, 0x6F, 0x66, 0x69, 0x6C, 0x65, 0x3E, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, + 0x63, 0x3A, 0x66, 0x6F, 0x72, 0x6D, 0x61, 0x74, 0x3E, 0x69, 0x6D, 0x61, + 0x67, 0x65, 0x2F, 0x70, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x63, 0x3A, 0x66, + 0x6F, 0x72, 0x6D, 0x61, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3C, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x4F, 0x72, + 0x69, 0x65, 0x6E, 0x74, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x31, 0x3C, + 0x2F, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x4F, 0x72, 0x69, 0x65, 0x6E, 0x74, + 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3C, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x58, 0x52, + 0x65, 0x73, 0x6F, 0x6C, 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x33, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x2F, 0x31, 0x30, 0x30, 0x30, 0x30, 0x3C, + 0x2F, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x58, 0x52, 0x65, 0x73, 0x6F, 0x6C, + 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3C, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x59, 0x52, + 0x65, 0x73, 0x6F, 0x6C, 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x33, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x2F, 0x31, 0x30, 0x30, 0x30, 0x30, 0x3C, + 0x2F, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x59, 0x52, 0x65, 0x73, 0x6F, 0x6C, + 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3C, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x52, 0x65, + 0x73, 0x6F, 0x6C, 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x55, 0x6E, 0x69, 0x74, + 0x3E, 0x32, 0x3C, 0x2F, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x52, 0x65, 0x73, + 0x6F, 0x6C, 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x55, 0x6E, 0x69, 0x74, 0x3E, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x65, + 0x78, 0x69, 0x66, 0x3A, 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x53, 0x70, 0x61, + 0x63, 0x65, 0x3E, 0x31, 0x3C, 0x2F, 0x65, 0x78, 0x69, 0x66, 0x3A, 0x43, + 0x6F, 0x6C, 0x6F, 0x72, 0x53, 0x70, 0x61, 0x63, 0x65, 0x3E, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x65, 0x78, 0x69, + 0x66, 0x3A, 0x50, 0x69, 0x78, 0x65, 0x6C, 0x58, 0x44, 0x69, 0x6D, 0x65, + 0x6E, 0x73, 0x69, 0x6F, 0x6E, 0x3E, 0x31, 0x32, 0x30, 0x3C, 0x2F, 0x65, + 0x78, 0x69, 0x66, 0x3A, 0x50, 0x69, 0x78, 0x65, 0x6C, 0x58, 0x44, 0x69, + 0x6D, 0x65, 0x6E, 0x73, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x65, 0x78, 0x69, 0x66, 0x3A, + 0x50, 0x69, 0x78, 0x65, 0x6C, 0x59, 0x44, 0x69, 0x6D, 0x65, 0x6E, 0x73, + 0x69, 0x6F, 0x6E, 0x3E, 0x31, 0x32, 0x30, 0x3C, 0x2F, 0x65, 0x78, 0x69, + 0x66, 0x3A, 0x50, 0x69, 0x78, 0x65, 0x6C, 0x59, 0x44, 0x69, 0x6D, 0x65, + 0x6E, 0x73, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x3C, 0x2F, 0x72, 0x64, 0x66, 0x3A, 0x44, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x3C, + 0x2F, 0x72, 0x64, 0x66, 0x3A, 0x52, 0x44, 0x46, 0x3E, 0x0A, 0x3C, 0x2F, + 0x78, 0x3A, 0x78, 0x6D, 0x70, 0x6D, 0x65, 0x74, 0x61, 0x3E, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x3C, + 0x3F, 0x78, 0x70, 0x61, 0x63, 0x6B, 0x65, 0x74, 0x20, 0x65, 0x6E, 0x64, + 0x3D, 0x22, 0x77, 0x22, 0x3F, 0x3E, 0xCB, 0xA4, 0xEC, 0x39, 0x00, 0x00, + 0x00, 0x20, 0x63, 0x48, 0x52, 0x4D, 0x00, 0x00, 0x7A, 0x25, 0x00, 0x00, + 0x80, 0x83, 0x00, 0x00, 0xF9, 0xFF, 0x00, 0x00, 0x80, 0xE9, 0x00, 0x00, + 0x75, 0x30, 0x00, 0x00, 0xEA, 0x60, 0x00, 0x00, 0x3A, 0x98, 0x00, 0x00, + 0x17, 0x6F, 0x92, 0x5F, 0xC5, 0x46, 0x00, 0x00, 0x0A, 0x48, 0x49, 0x44, + 0x41, 0x54, 0x78, 0xDA, 0xEC, 0x9D, 0x6B, 0x8C, 0x5D, 0x55, 0x15, 0xC7, + 0x7F, 0xF7, 0xDE, 0x79, 0xF7, 0xE1, 0xB4, 0xB4, 0xA5, 0x6F, 0x3A, 0xA5, + 0x28, 0x32, 0xA5, 0x9D, 0x92, 0x52, 0x04, 0x15, 0x94, 0x8A, 0x90, 0x5A, + 0x2D, 0x11, 0xA2, 0x35, 0x4A, 0x04, 0xF1, 0x91, 0xF8, 0xC2, 0x10, 0xEB, + 0x2B, 0xD1, 0xF8, 0x41, 0xE1, 0x83, 0xD1, 0x84, 0x48, 0x22, 0x31, 0x8A, + 0x04, 0x11, 0xD4, 0x08, 0x0D, 0x6D, 0xAC, 0x96, 0x48, 0x85, 0xAA, 0xA1, + 0x45, 0x91, 0x42, 0x5B, 0xEB, 0x4C, 0x87, 0x16, 0x28, 0xED, 0x40, 0xA7, + 0xD3, 0x4E, 0x3B, 0x73, 0x67, 0xDA, 0x79, 0xDC, 0xED, 0x87, 0xB5, 0x4E, + 0xE8, 0x87, 0xCA, 0xD9, 0x67, 0xEE, 0xB9, 0xF7, 0xEC, 0x73, 0xCF, 0xFE, + 0x27, 0x27, 0x43, 0xE1, 0xD0, 0x39, 0xF7, 0xFE, 0xCE, 0xDE, 0x7B, 0xAD, + 0xFF, 0x5E, 0x7B, 0xEF, 0x9C, 0x31, 0x06, 0xAF, 0xDA, 0x55, 0xDE, 0x7F, + 0x05, 0x1E, 0xB0, 0x97, 0x07, 0xEC, 0xE5, 0x01, 0x7B, 0x79, 0xC0, 0x5E, + 0xF1, 0xAB, 0xCE, 0xC1, 0x67, 0xCA, 0x01, 0x05, 0x7D, 0xF9, 0xEA, 0x80, + 0x7A, 0xFD, 0x73, 0xCE, 0x91, 0xE7, 0x2B, 0x01, 0x63, 0x7A, 0x8D, 0x9F, + 0x75, 0x79, 0xC0, 0x21, 0x6A, 0x01, 0x26, 0x01, 0x8B, 0x81, 0x99, 0xFA, + 0xCF, 0xD3, 0x80, 0xA9, 0xFA, 0xDF, 0x1A, 0x1C, 0xE8, 0x71, 0x4A, 0xC0, + 0x19, 0xA0, 0x08, 0x9C, 0x04, 0x4E, 0xE9, 0xCF, 0xFD, 0xC0, 0x09, 0xE0, + 0x34, 0x30, 0xE4, 0x01, 0xBF, 0xA9, 0x06, 0x60, 0x06, 0xB0, 0x10, 0xB8, + 0x4C, 0x7F, 0xAE, 0x02, 0xCE, 0x07, 0x9A, 0x80, 0x29, 0x0A, 0xBA, 0xC1, + 0xA1, 0x97, 0x71, 0x54, 0x41, 0x16, 0x15, 0x66, 0x11, 0xF8, 0x2F, 0xD0, + 0x09, 0xBC, 0x06, 0xFC, 0x13, 0x38, 0x02, 0xF4, 0xE9, 0xBD, 0xC9, 0x76, + 0x87, 0x09, 0x19, 0x1D, 0x8D, 0xC0, 0x3C, 0xE0, 0x72, 0xE0, 0x6A, 0xA0, + 0x1D, 0xB8, 0x44, 0x5B, 0x6E, 0x5A, 0x35, 0x0E, 0x1C, 0x05, 0xF6, 0x02, + 0xBB, 0x81, 0xED, 0xC0, 0xBF, 0x81, 0xD7, 0x81, 0x91, 0xAC, 0x00, 0xAE, + 0xD7, 0xD6, 0x79, 0x35, 0x70, 0x3D, 0x70, 0x15, 0xB0, 0xA4, 0x46, 0xE3, + 0x9B, 0x7D, 0xC0, 0x53, 0xC0, 0x36, 0xE0, 0xEF, 0xC0, 0x31, 0x1D, 0xB7, + 0x6B, 0x16, 0x70, 0x8B, 0x82, 0x5D, 0x03, 0xAC, 0x05, 0xDA, 0x32, 0x12, + 0xC8, 0x76, 0x02, 0x9B, 0x80, 0xAD, 0xC0, 0x3F, 0xB4, 0x7B, 0xAF, 0x39, + 0xC0, 0x0B, 0x80, 0x1B, 0x80, 0xDB, 0x75, 0x8C, 0xCD, 0x91, 0x2D, 0x8D, + 0x6A, 0x97, 0xFD, 0x00, 0xB0, 0x59, 0x03, 0xB3, 0x9A, 0x08, 0xB2, 0x72, + 0xC0, 0x3B, 0x81, 0xCF, 0x00, 0xEB, 0x75, 0xDC, 0xCD, 0xA2, 0xEA, 0x81, + 0xD5, 0xC0, 0x05, 0xC0, 0x6C, 0xE0, 0x31, 0xE0, 0x40, 0xDA, 0x5B, 0x70, + 0x0E, 0xE8, 0x00, 0xEE, 0x04, 0x6E, 0x02, 0x9A, 0xBD, 0xED, 0x00, 0x9A, + 0x4E, 0xFD, 0x06, 0xF8, 0x29, 0xD0, 0x95, 0x66, 0xC0, 0xCB, 0x81, 0xEF, + 0x2A, 0xDC, 0x38, 0x64, 0x34, 0x0F, 0x4D, 0xCA, 0x54, 0x28, 0xE8, 0x65, + 0x62, 0x18, 0x62, 0x86, 0x81, 0x07, 0x81, 0x9F, 0x54, 0x1A, 0x72, 0x5D, + 0x85, 0x5A, 0xEE, 0xDB, 0x81, 0x0D, 0x65, 0xC0, 0x1D, 0x51, 0x13, 0xE1, + 0x18, 0x30, 0x70, 0x56, 0x9A, 0x31, 0x08, 0xF4, 0x27, 0x60, 0x78, 0x94, + 0x80, 0x56, 0x60, 0xB2, 0xFE, 0xB9, 0x59, 0x73, 0xF4, 0xF3, 0xF4, 0xDF, + 0x35, 0x44, 0xFC, 0xFB, 0x9A, 0x81, 0x4F, 0xEB, 0xD8, 0xFC, 0x63, 0xE0, + 0xE5, 0x34, 0x01, 0x6E, 0x03, 0xEE, 0xD0, 0x31, 0x37, 0x6A, 0x0B, 0xED, + 0x07, 0x5E, 0xD2, 0xB7, 0xFA, 0x45, 0xFD, 0xD9, 0x8F, 0xB8, 0x47, 0x39, + 0x35, 0x15, 0x8A, 0x09, 0xB5, 0xE0, 0x49, 0x9A, 0x09, 0xE4, 0xD4, 0x84, + 0x99, 0x0E, 0xBC, 0x03, 0x58, 0x06, 0x2C, 0xD5, 0xF8, 0x62, 0x6A, 0x84, + 0xBF, 0xAF, 0x09, 0xB8, 0x4D, 0x3F, 0xCF, 0x5D, 0xFA, 0x42, 0x3B, 0x0F, + 0xB8, 0x19, 0xB8, 0x05, 0xB8, 0x55, 0xBB, 0x33, 0x5B, 0x0D, 0x02, 0xCF, + 0x01, 0x4F, 0x03, 0x7F, 0x05, 0x5E, 0x01, 0x5E, 0xC5, 0x61, 0x8F, 0x57, + 0xD5, 0x00, 0x2C, 0xD2, 0x58, 0x63, 0x25, 0xF0, 0x7E, 0x35, 0x6C, 0x5A, + 0x22, 0xBC, 0x34, 0x9F, 0x47, 0x9C, 0xB0, 0x87, 0x2A, 0x91, 0x27, 0xC7, + 0x39, 0x06, 0xE7, 0x81, 0x0F, 0x03, 0xF7, 0x02, 0xF3, 0x2D, 0xFF, 0x9F, + 0x31, 0x85, 0xF9, 0x47, 0xE0, 0x11, 0xC4, 0x01, 0x2A, 0x92, 0x4E, 0xB5, + 0x2A, 0xE8, 0xF5, 0x9A, 0xEB, 0xCF, 0x8F, 0x30, 0x56, 0xEF, 0x56, 0xD0, + 0x3B, 0x5C, 0x6E, 0xC1, 0x41, 0xD7, 0x6C, 0x0B, 0x77, 0x58, 0x73, 0xC3, + 0x5F, 0x03, 0x4F, 0x00, 0xBD, 0x29, 0x8F, 0x8E, 0xFB, 0x11, 0xE7, 0xAA, + 0x0B, 0x78, 0x5E, 0xC7, 0xD8, 0x95, 0x9A, 0x22, 0x85, 0xE9, 0x52, 0xE0, + 0x73, 0x3A, 0x3C, 0xC5, 0xFB, 0x3D, 0x18, 0x63, 0xE2, 0xB8, 0xEA, 0x8C, + 0x31, 0x5F, 0x37, 0xC6, 0x8C, 0x19, 0x3B, 0x0D, 0x18, 0x63, 0x1E, 0x36, + 0xC6, 0xAC, 0x8A, 0xE9, 0xF7, 0xBB, 0x78, 0xAD, 0x36, 0xC6, 0x6C, 0x31, + 0xC6, 0x8C, 0x58, 0x7E, 0x27, 0xC7, 0x8D, 0x31, 0xB7, 0x1A, 0x63, 0x0A, + 0x71, 0x3E, 0x47, 0x5C, 0x2D, 0xF8, 0x22, 0xE0, 0x13, 0x96, 0xE3, 0xEE, + 0x88, 0x5A, 0x77, 0x77, 0x03, 0x7B, 0x6A, 0x38, 0xDF, 0x7D, 0x52, 0x87, + 0x9B, 0x3C, 0x70, 0x9D, 0x45, 0xE4, 0x3F, 0x0D, 0xF8, 0x24, 0xF0, 0x37, + 0x6D, 0xC9, 0xB1, 0x8D, 0x9B, 0x71, 0x04, 0x56, 0x6B, 0x35, 0xEF, 0xB5, + 0xD1, 0x36, 0xE0, 0x47, 0x35, 0x0E, 0x37, 0xD0, 0x0E, 0x8D, 0x90, 0x9F, + 0xB7, 0xBC, 0xFF, 0x5D, 0xC0, 0x35, 0xC4, 0x68, 0xE5, 0xC6, 0x01, 0xF8, + 0x02, 0xE0, 0x66, 0xCB, 0xD6, 0xDB, 0xA5, 0x2D, 0x77, 0x57, 0x86, 0x9C, + 0xAB, 0xED, 0xC0, 0x3D, 0xC0, 0x1B, 0x16, 0xF7, 0x4E, 0x46, 0x3C, 0xFB, + 0x69, 0xAE, 0x00, 0xCE, 0x6B, 0x80, 0xD0, 0x61, 0x71, 0xEF, 0x10, 0xF0, + 0x0B, 0xFD, 0xC0, 0x59, 0xD3, 0x63, 0x9A, 0x06, 0xD9, 0xA4, 0x7D, 0xD7, + 0x68, 0x7E, 0xED, 0x04, 0xE0, 0xC9, 0x9A, 0xFB, 0xD9, 0x38, 0x39, 0x3B, + 0xF5, 0x43, 0x66, 0x51, 0x45, 0xE0, 0x3E, 0x64, 0x8E, 0x38, 0x4C, 0xB3, + 0x90, 0x79, 0xF2, 0x7A, 0x17, 0x00, 0xB7, 0x02, 0xD7, 0x5A, 0x06, 0x56, + 0xBF, 0x05, 0x7A, 0xC8, 0xAE, 0xBA, 0x35, 0xD7, 0xB7, 0xD1, 0x07, 0x22, + 0xBA, 0x62, 0x15, 0x03, 0x3C, 0x0B, 0xBB, 0x29, 0xC0, 0xBD, 0xC8, 0x84, + 0x77, 0xD6, 0xB5, 0x11, 0xA9, 0xD7, 0x0A, 0xD3, 0xF2, 0xB8, 0xC6, 0xE1, + 0x72, 0x01, 0x2F, 0x43, 0xEA, 0xAB, 0xC2, 0xF4, 0x27, 0xA4, 0x20, 0x2D, + 0x97, 0x61, 0xB8, 0x39, 0xA4, 0xFA, 0xF2, 0x2F, 0x16, 0xF7, 0x4E, 0x05, + 0xE6, 0xBA, 0x00, 0xF8, 0x0A, 0x8B, 0xB1, 0x62, 0x14, 0x78, 0x46, 0x03, + 0x8C, 0x2C, 0x2F, 0x65, 0x34, 0x88, 0x35, 0xFB, 0xB4, 0xC5, 0xBD, 0x4D, + 0xC0, 0x8A, 0xA4, 0x01, 0xD7, 0x21, 0xD5, 0x09, 0x61, 0x3A, 0x40, 0x05, + 0xA7, 0xC3, 0x52, 0xA8, 0x43, 0x84, 0xFB, 0xED, 0x05, 0xED, 0x1D, 0x13, + 0x05, 0xDC, 0x64, 0x19, 0xE9, 0xED, 0xB5, 0x1C, 0x77, 0xDE, 0xAA, 0x6B, + 0x73, 0xB1, 0xBB, 0x2D, 0x07, 0xB0, 0x4D, 0xB9, 0xCE, 0x14, 0xA2, 0xCD, + 0xC8, 0xFD, 0xDF, 0x56, 0x38, 0x51, 0xD5, 0x63, 0x57, 0x86, 0xD3, 0x8B, + 0xCC, 0xE7, 0x46, 0x4D, 0xBF, 0xDA, 0x78, 0xB3, 0x00, 0xBE, 0xE4, 0x18, + 0xE0, 0xBC, 0xE6, 0xF5, 0x3D, 0xC0, 0x41, 0xA2, 0x55, 0x4A, 0x1E, 0x45, + 0xA6, 0x42, 0x2F, 0xB5, 0xB8, 0xB7, 0x40, 0x99, 0x53, 0xA6, 0xE5, 0x00, + 0x2E, 0x58, 0xE6, 0xBF, 0x51, 0xAB, 0xFB, 0xE7, 0x00, 0x1F, 0xD3, 0x54, + 0x61, 0x81, 0x02, 0x36, 0x0E, 0xB6, 0xE0, 0x21, 0x6D, 0x89, 0x9B, 0x80, + 0x47, 0xB1, 0x9F, 0xE6, 0x34, 0xC8, 0x4C, 0x9A, 0x0D, 0x9B, 0x7C, 0x92, + 0x2D, 0x38, 0x6F, 0xF9, 0x00, 0x51, 0x82, 0xAB, 0xA0, 0x94, 0xE5, 0x6B, + 0xDA, 0x7A, 0x5D, 0xD7, 0x0A, 0xC4, 0xC5, 0x1B, 0x57, 0xC8, 0xA7, 0x2D, + 0x5F, 0x8E, 0xAA, 0x0D, 0x4D, 0xF9, 0x18, 0xDE, 0xE4, 0x38, 0x75, 0x31, + 0x32, 0xF1, 0x9D, 0x06, 0xB8, 0x81, 0x2E, 0x04, 0xBE, 0x8A, 0x78, 0xF2, + 0x71, 0x47, 0xDD, 0x89, 0x03, 0x8E, 0x5B, 0x1D, 0x48, 0x09, 0x4C, 0xDA, + 0xB4, 0x14, 0xFB, 0x25, 0x38, 0xB9, 0x6A, 0x06, 0x8E, 0xAE, 0x01, 0x6E, + 0x75, 0x30, 0xA0, 0xB2, 0xD1, 0x98, 0x46, 0xBD, 0xCE, 0xC9, 0x35, 0xC0, + 0xBD, 0xB8, 0x5F, 0x68, 0x77, 0x2E, 0x8D, 0x00, 0xC7, 0x3D, 0xE0, 0x70, + 0xED, 0x43, 0x4C, 0xF9, 0xB4, 0x69, 0x0F, 0x55, 0x58, 0xA5, 0x50, 0x0B, + 0x80, 0x5F, 0x42, 0x16, 0x68, 0x1D, 0x4A, 0x49, 0x4B, 0x1E, 0xD3, 0x3C, + 0xF8, 0x7E, 0xC4, 0x6B, 0x77, 0x4E, 0xAE, 0xED, 0xD1, 0xD1, 0x0F, 0xFC, + 0x0A, 0x31, 0x46, 0xDE, 0x8B, 0xAC, 0xFA, 0xAF, 0x77, 0xF0, 0x7B, 0xCB, + 0x21, 0xAB, 0x2E, 0xFE, 0x83, 0xD4, 0x50, 0x6D, 0x24, 0x81, 0xB5, 0xBF, + 0x69, 0x04, 0x8C, 0x7E, 0x71, 0x3F, 0x07, 0xB6, 0x00, 0x57, 0x22, 0xC5, + 0xE1, 0x2E, 0x02, 0xEE, 0xD2, 0x1E, 0xA7, 0x87, 0xE8, 0x4E, 0x5D, 0xA6, + 0x01, 0xA3, 0x86, 0x41, 0xB7, 0x5E, 0x05, 0x47, 0x9F, 0x31, 0x15, 0xC1, + 0x60, 0x5D, 0x0A, 0x9E, 0x31, 0x8D, 0x51, 0xB5, 0x0F, 0xB2, 0xBC, 0x3C, + 0x60, 0x2F, 0x0F, 0xD8, 0xCB, 0x03, 0xF6, 0x80, 0xBD, 0x3C, 0x60, 0x2F, + 0x0F, 0xD8, 0xCB, 0x03, 0xF6, 0x4A, 0x40, 0x69, 0x30, 0x3A, 0x5C, 0xAD, + 0xAA, 0x2C, 0x79, 0xC0, 0x13, 0xD7, 0x64, 0x64, 0x51, 0xF9, 0x6C, 0xC4, + 0x8B, 0xCE, 0xE1, 0x4E, 0xE1, 0x5D, 0x00, 0xF7, 0x14, 0xB2, 0x93, 0xEC, + 0x7E, 0xAA, 0xBC, 0xFF, 0x64, 0xDA, 0x01, 0xCF, 0x45, 0xAA, 0x2A, 0x3F, + 0x88, 0x54, 0x55, 0x36, 0x3B, 0x0A, 0x78, 0x10, 0x29, 0x7F, 0xDD, 0x08, + 0xFC, 0x1E, 0xC7, 0x36, 0x02, 0x77, 0x15, 0x70, 0x13, 0x52, 0x55, 0x79, + 0x07, 0xE9, 0x28, 0xBC, 0xEB, 0x40, 0xEA, 0x9B, 0x47, 0x81, 0x3F, 0xE0, + 0xE0, 0xAC, 0x92, 0x6B, 0x41, 0x56, 0xB0, 0x71, 0x69, 0x9A, 0xAA, 0x2A, + 0xDB, 0x80, 0x2F, 0xE1, 0x68, 0xB1, 0xA0, 0x8B, 0x55, 0x95, 0x69, 0xDC, + 0x47, 0xBA, 0x1D, 0x29, 0x9F, 0xF5, 0x80, 0x43, 0xD4, 0x9A, 0xE2, 0x8C, + 0xC4, 0x57, 0x55, 0x5A, 0xA8, 0x17, 0x47, 0x4B, 0x5F, 0x42, 0x34, 0x82, + 0x6C, 0x13, 0xEC, 0x01, 0x87, 0x68, 0x2F, 0xB2, 0x6F, 0x63, 0xDA, 0xB4, + 0x0B, 0xBB, 0xFD, 0x37, 0x32, 0x0F, 0xB8, 0x1B, 0x29, 0xBA, 0x7B, 0x85, + 0x74, 0x54, 0x72, 0x8C, 0x6A, 0x1E, 0x7C, 0x3F, 0x70, 0xD8, 0xA7, 0x49, + 0xE1, 0x1A, 0x40, 0xF6, 0xAE, 0x3C, 0x83, 0xEC, 0xDE, 0x73, 0x19, 0xD1, + 0xF7, 0x62, 0xAE, 0x96, 0x86, 0x91, 0x9D, 0x83, 0x9E, 0x42, 0x56, 0x18, + 0x96, 0x3C, 0x60, 0x3B, 0x1D, 0x47, 0x6A, 0xA3, 0x9F, 0x44, 0x36, 0xF3, + 0x6C, 0x71, 0x14, 0xF0, 0x00, 0x72, 0x08, 0xD6, 0x61, 0x12, 0x3C, 0x17, + 0x29, 0x8D, 0x80, 0x41, 0xAC, 0xBF, 0xFD, 0x7A, 0xF9, 0xAA, 0xCA, 0x1A, + 0x04, 0x9C, 0xBA, 0x2F, 0xD2, 0x55, 0xF9, 0xE9, 0x42, 0x0F, 0xD8, 0xCB, + 0x03, 0xF6, 0xF2, 0x80, 0xBD, 0x3C, 0x60, 0x2F, 0x0F, 0xD8, 0xCB, 0x03, + 0xF6, 0xF2, 0x80, 0xB3, 0xA4, 0x34, 0x18, 0x1D, 0x2E, 0x3A, 0x59, 0xC1, + 0x41, 0x99, 0x1E, 0xF0, 0x04, 0x35, 0x05, 0x39, 0xB7, 0x60, 0x0E, 0x6E, + 0xAE, 0xF0, 0x37, 0x88, 0x17, 0xDD, 0x83, 0x4C, 0x6F, 0x0E, 0x7B, 0xC0, + 0xF6, 0x9A, 0x07, 0x7C, 0x1C, 0xB8, 0x5E, 0x01, 0x37, 0x39, 0xFA, 0xDD, + 0x0D, 0x22, 0xBB, 0xE8, 0x3E, 0x8E, 0x9C, 0x07, 0xEC, 0xAB, 0x2A, 0x2D, + 0xD4, 0x88, 0x1C, 0x6C, 0xF9, 0x65, 0xEC, 0xF6, 0xA2, 0x4E, 0x5A, 0x2B, + 0x90, 0x7A, 0xAC, 0x21, 0xEC, 0xF7, 0xAA, 0xCC, 0x74, 0x90, 0x75, 0x09, + 0x52, 0x36, 0x9B, 0x06, 0xB8, 0x81, 0x16, 0xE1, 0xAB, 0x2A, 0xAD, 0xD5, + 0x81, 0xA3, 0xD5, 0x89, 0x21, 0x6A, 0x07, 0x16, 0x7B, 0xC0, 0xE1, 0x6A, + 0x25, 0x9D, 0x07, 0x77, 0xE4, 0x88, 0xE9, 0x18, 0x9C, 0x5A, 0x07, 0xDC, + 0x8B, 0xC3, 0xD5, 0x11, 0x6F, 0xA1, 0x33, 0xF8, 0xBD, 0x2A, 0xAD, 0xB4, + 0x0F, 0xE8, 0x4C, 0x21, 0xE0, 0x5D, 0xD4, 0x68, 0x55, 0x65, 0xDC, 0x0B, + 0xC2, 0xBA, 0x90, 0x0A, 0xC5, 0x83, 0x29, 0x31, 0x12, 0xC6, 0x34, 0x0F, + 0x8E, 0x5A, 0x55, 0x59, 0xB5, 0x85, 0x74, 0xE5, 0xA4, 0x49, 0x25, 0xEC, + 0x8A, 0xD4, 0xA3, 0xBC, 0x44, 0x41, 0x55, 0xE5, 0x10, 0xB0, 0x1A, 0x29, + 0xBA, 0x73, 0xB9, 0x6E, 0xEC, 0x59, 0xE4, 0xA0, 0xAB, 0xCD, 0x11, 0x5E, + 0x48, 0xDB, 0x23, 0x0E, 0x4C, 0xD2, 0x80, 0xC7, 0xB1, 0x3B, 0x70, 0x23, + 0xAA, 0x51, 0x71, 0x5C, 0x21, 0x6F, 0xD7, 0xA8, 0xBA, 0x11, 0x37, 0x0F, + 0xE5, 0x28, 0x22, 0xE7, 0x02, 0x1F, 0x26, 0xDA, 0xAA, 0xC2, 0x46, 0xEC, + 0xDC, 0xB9, 0x52, 0x1C, 0x9F, 0xBB, 0x1C, 0xC0, 0xA3, 0xD8, 0xB9, 0x37, + 0xE7, 0x23, 0xD6, 0xE3, 0x50, 0xC4, 0xD6, 0xD1, 0xA9, 0x5D, 0x76, 0xDE, + 0x51, 0xC0, 0x13, 0x2D, 0x06, 0x9C, 0x83, 0xDD, 0x02, 0x3B, 0x43, 0x0C, + 0xCB, 0x78, 0xCA, 0x01, 0x7C, 0xDA, 0xF2, 0xCD, 0x6D, 0x07, 0x16, 0x62, + 0x77, 0x40, 0xF2, 0xB9, 0x3E, 0x64, 0xAD, 0x55, 0x55, 0xCE, 0xB3, 0xCC, + 0x99, 0x8F, 0xC5, 0xF1, 0xD9, 0xCB, 0x09, 0xB2, 0xC6, 0xB1, 0x5B, 0x70, + 0xB5, 0x48, 0x01, 0x7B, 0x89, 0x16, 0x10, 0x7E, 0xA0, 0x67, 0x89, 0x98, + 0x4E, 0x49, 0x2F, 0x07, 0xB0, 0x01, 0x9E, 0xB3, 0xE8, 0x46, 0x0A, 0xD8, + 0x9D, 0x10, 0x9E, 0x05, 0x35, 0x03, 0xEF, 0xB1, 0xB8, 0x6F, 0x18, 0x39, + 0x26, 0x20, 0xF1, 0x34, 0x69, 0x27, 0x32, 0xAB, 0x12, 0xA6, 0xB5, 0xA4, + 0x6B, 0xD5, 0x7E, 0xA5, 0xB4, 0x54, 0xB3, 0x83, 0x30, 0xF5, 0x11, 0xD3, + 0x61, 0xDA, 0xE5, 0x02, 0x3E, 0x8C, 0xAC, 0x04, 0x0C, 0xD3, 0x32, 0xE0, + 0x43, 0x19, 0x87, 0x9B, 0x07, 0x6E, 0xC2, 0x6E, 0x22, 0xE5, 0x05, 0x85, + 0x9C, 0x38, 0xE0, 0x53, 0xC8, 0xEA, 0x3A, 0x9B, 0xDF, 0x73, 0x1B, 0x30, + 0x3D, 0xC3, 0x80, 0x57, 0x00, 0xEB, 0x2C, 0xEF, 0x7D, 0xC2, 0xB2, 0x67, + 0xAC, 0x38, 0xE0, 0xD3, 0xFA, 0x30, 0x36, 0x15, 0x0D, 0x57, 0x20, 0x73, + 0xBD, 0x0D, 0x19, 0x84, 0xDB, 0x02, 0xDC, 0x8E, 0xEC, 0xFD, 0x15, 0xA6, + 0x5E, 0xE4, 0xA0, 0x8F, 0x92, 0x0B, 0x80, 0x8D, 0x76, 0x27, 0xCF, 0x58, + 0xDC, 0x5B, 0x8F, 0x4C, 0xE4, 0xAF, 0xC9, 0x18, 0xDC, 0x7A, 0x64, 0xDF, + 0xAF, 0x9B, 0xB1, 0xAB, 0x2F, 0xDB, 0x42, 0x8C, 0x67, 0x47, 0xC5, 0x31, + 0xD9, 0xF0, 0x3A, 0xF0, 0x3B, 0x4B, 0x33, 0xA2, 0x0D, 0xF8, 0x06, 0x70, + 0x79, 0x46, 0xE0, 0x16, 0x90, 0xD2, 0xA3, 0x3B, 0x81, 0x99, 0x96, 0x43, + 0xDE, 0xE3, 0xD8, 0x1F, 0x55, 0x5B, 0x15, 0xC0, 0xE3, 0xC0, 0x9F, 0x91, + 0xC5, 0xD0, 0x36, 0xBA, 0x12, 0xF8, 0x26, 0xB2, 0x27, 0x56, 0xAD, 0xC3, + 0xBD, 0x0E, 0xD8, 0x80, 0xDD, 0x61, 0xD0, 0x00, 0xDB, 0x80, 0x1D, 0x71, + 0x47, 0x76, 0x71, 0xE8, 0x55, 0xE4, 0xAC, 0x23, 0x5B, 0x4F, 0x76, 0x1D, + 0xF0, 0x43, 0xE0, 0x06, 0xDC, 0x3C, 0xF8, 0x2A, 0x8E, 0x31, 0xF7, 0x46, + 0xE0, 0xDB, 0xC8, 0x01, 0x5F, 0x36, 0x3A, 0x01, 0x3C, 0x18, 0x57, 0x7A, + 0x14, 0x28, 0xCE, 0x99, 0x9A, 0x4D, 0xFA, 0xA1, 0xD6, 0x5A, 0xFE, 0xDE, + 0x1B, 0x35, 0x37, 0x9E, 0x05, 0x6C, 0x65, 0x62, 0x56, 0xA6, 0x8B, 0x9A, + 0xAF, 0x2F, 0xF0, 0x67, 0x89, 0x66, 0xF0, 0x3C, 0xAA, 0x2D, 0x18, 0x57, + 0x01, 0xF7, 0x02, 0xF7, 0x21, 0x1B, 0xA7, 0xCC, 0xB5, 0xB8, 0x3F, 0x07, + 0x5C, 0x05, 0xCC, 0xD0, 0x3C, 0x79, 0x0B, 0xF0, 0x22, 0xE2, 0xC1, 0xA6, + 0x51, 0xB3, 0x81, 0xE5, 0xFA, 0xE2, 0xAE, 0x21, 0x9A, 0x3D, 0xBB, 0x0B, + 0xF8, 0x19, 0x70, 0x32, 0xEE, 0x87, 0xCA, 0x19, 0x13, 0xEB, 0x44, 0xCD, + 0x24, 0xE0, 0x2B, 0xC0, 0x77, 0x88, 0xB6, 0xF3, 0xDB, 0x00, 0xB0, 0x1B, + 0x99, 0x22, 0xDC, 0x89, 0xD8, 0x74, 0x47, 0x90, 0xF2, 0x1D, 0x57, 0x37, + 0x46, 0xAB, 0x43, 0xAC, 0xC7, 0x79, 0x3A, 0xC6, 0xBE, 0x1B, 0xB1, 0x21, + 0xDB, 0x89, 0x36, 0x45, 0xFA, 0x06, 0xF0, 0x2D, 0x64, 0xE3, 0x19, 0x5C, + 0x07, 0x0C, 0x70, 0x1E, 0xF0, 0x3D, 0xE0, 0x8B, 0x13, 0xE8, 0x21, 0x4E, + 0xEA, 0x78, 0xBE, 0x07, 0xF1, 0xB9, 0x4F, 0x00, 0x47, 0x75, 0x5C, 0x72, + 0xA1, 0x56, 0x2B, 0xAF, 0x31, 0xC3, 0x5C, 0x1D, 0x5A, 0x66, 0x6A, 0x8F, + 0xB5, 0x14, 0x99, 0x44, 0x88, 0xBA, 0x0A, 0x63, 0x10, 0xB8, 0x1B, 0xB8, + 0x57, 0x23, 0xE8, 0x54, 0x00, 0x06, 0x39, 0xCF, 0xFE, 0x2E, 0x60, 0xFD, + 0x04, 0x03, 0xB9, 0x31, 0x85, 0x3B, 0x84, 0x9C, 0x48, 0x1A, 0x00, 0x36, + 0x0E, 0x01, 0x6E, 0xD5, 0x60, 0x6A, 0xFA, 0x04, 0x3F, 0xE3, 0x19, 0x1D, + 0xD2, 0x7E, 0x50, 0xC9, 0x61, 0xA9, 0x52, 0x80, 0x01, 0x2E, 0x06, 0xBE, + 0x0F, 0x7C, 0x34, 0xA6, 0x48, 0xD9, 0xA5, 0x0D, 0xC1, 0xCB, 0x55, 0x11, + 0x78, 0x48, 0x33, 0x89, 0x43, 0x15, 0x7D, 0xD8, 0x0A, 0x02, 0x06, 0x59, + 0xA9, 0xB0, 0x01, 0x31, 0xD9, 0x9D, 0xDC, 0x8D, 0x35, 0x01, 0x1D, 0x05, + 0x1E, 0x06, 0xEE, 0x01, 0x5E, 0xAE, 0xF8, 0xDB, 0x58, 0x61, 0xC0, 0x00, + 0x4B, 0x80, 0x2F, 0x20, 0x0B, 0xCA, 0x16, 0x64, 0x1C, 0x6E, 0x37, 0xF0, + 0x4B, 0xCD, 0x77, 0x8F, 0x54, 0xA5, 0xBB, 0xA9, 0x02, 0xE0, 0x20, 0x85, + 0x58, 0x07, 0xDC, 0x82, 0xD8, 0x94, 0x59, 0x9B, 0x70, 0x28, 0x22, 0x13, + 0x08, 0x8F, 0xA8, 0x5F, 0xD0, 0x5F, 0xB5, 0xF1, 0xA4, 0x4A, 0x80, 0x03, + 0x77, 0x67, 0x25, 0xF0, 0x29, 0xE0, 0x7D, 0xC8, 0x1A, 0xA4, 0x5A, 0xDF, + 0x61, 0x60, 0x54, 0x5B, 0xED, 0x56, 0x85, 0xFB, 0x02, 0x55, 0x3E, 0xD7, + 0xA1, 0x9A, 0x80, 0x03, 0x2D, 0x56, 0xD0, 0x1F, 0xD1, 0xD6, 0x1C, 0x9C, + 0xAC, 0x52, 0x6B, 0x2D, 0xF6, 0x00, 0xE2, 0xCF, 0x6F, 0x06, 0xFE, 0x05, + 0xBC, 0x96, 0x48, 0x44, 0x98, 0x00, 0x60, 0x10, 0x23, 0xFE, 0x42, 0xCD, + 0x21, 0x57, 0x29, 0xE8, 0x85, 0x88, 0x75, 0xD9, 0x98, 0x52, 0xA8, 0x43, + 0x1A, 0x40, 0x05, 0x60, 0x9F, 0x45, 0x1C, 0xAA, 0x83, 0x49, 0x66, 0x00, + 0x49, 0x01, 0x0E, 0x54, 0xA7, 0x79, 0xE4, 0x45, 0x7A, 0xAD, 0x54, 0xF0, + 0x6F, 0x53, 0xC3, 0x64, 0x0A, 0x30, 0xCD, 0x51, 0xA0, 0x7D, 0x88, 0x03, + 0xD7, 0xA7, 0x39, 0x7B, 0x27, 0x52, 0x08, 0xDF, 0xAD, 0xD7, 0x49, 0x1C, + 0x70, 0xE1, 0x92, 0x06, 0x7C, 0xB6, 0x1A, 0x10, 0x77, 0x68, 0x86, 0x9A, + 0x08, 0x33, 0x35, 0x38, 0x5B, 0x82, 0x7B, 0x4B, 0x4A, 0x8D, 0x02, 0xED, + 0x51, 0x93, 0x22, 0x38, 0x05, 0xAD, 0x0F, 0xC7, 0xAC, 0x55, 0x97, 0x00, + 0x9F, 0xAB, 0x1B, 0x6F, 0xD2, 0xD6, 0xEC, 0xE2, 0xCA, 0x86, 0x7E, 0xA4, + 0x64, 0xC9, 0xE9, 0x45, 0x72, 0x2E, 0x03, 0xF6, 0x8A, 0x41, 0x7E, 0x23, + 0x34, 0x0F, 0xD8, 0xCB, 0x03, 0xF6, 0xF2, 0x80, 0xBD, 0x92, 0xD1, 0xFF, + 0x06, 0x00, 0x3D, 0x67, 0xD1, 0x66, 0xCA, 0xCF, 0x19, 0x9B, 0x00, 0x00, + 0x00, 0x00, 0x49, 0x45, 0x4E, 0x44, 0xAE, 0x42, 0x60, 0x82 +}; +} +static unsigned char* misc_icon = raw::misc; +} \ No newline at end of file diff --git a/cheat/gmod/icons/rage.hpp b/cheat/gmod/icons/rage.hpp new file mode 100644 index 0000000..00e0764 --- /dev/null +++ b/cheat/gmod/icons/rage.hpp @@ -0,0 +1,1630 @@ +/* E:\Users\admin\Desktop\stuff\icons\rage.png (4/1/2018 9:59:32 PM) + StartOffset: 00000000, EndOffset: 00004BD9, Length: 00004BDA */ + +namespace icons { +constexpr static size_t rage_size = 19418; +namespace raw { +static unsigned char rage[19418] = { + 0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A, 0x00, 0x00, 0x00, 0x0D, + 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x78, + 0x08, 0x06, 0x00, 0x00, 0x00, 0x39, 0x64, 0x36, 0xD2, 0x00, 0x00, 0x00, + 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x2E, 0x23, 0x00, 0x00, 0x2E, + 0x23, 0x01, 0x78, 0xA5, 0x3F, 0x76, 0x00, 0x00, 0x0A, 0x4F, 0x69, 0x43, + 0x43, 0x50, 0x50, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x20, + 0x49, 0x43, 0x43, 0x20, 0x70, 0x72, 0x6F, 0x66, 0x69, 0x6C, 0x65, 0x00, + 0x00, 0x78, 0xDA, 0x9D, 0x53, 0x67, 0x54, 0x53, 0xE9, 0x16, 0x3D, 0xF7, + 0xDE, 0xF4, 0x42, 0x4B, 0x88, 0x80, 0x94, 0x4B, 0x6F, 0x52, 0x15, 0x08, + 0x20, 0x52, 0x42, 0x8B, 0x80, 0x14, 0x91, 0x26, 0x2A, 0x21, 0x09, 0x10, + 0x4A, 0x88, 0x21, 0xA1, 0xD9, 0x15, 0x51, 0xC1, 0x11, 0x45, 0x45, 0x04, + 0x1B, 0xC8, 0xA0, 0x88, 0x03, 0x8E, 0x8E, 0x80, 0x8C, 0x15, 0x51, 0x2C, + 0x0C, 0x8A, 0x0A, 0xD8, 0x07, 0xE4, 0x21, 0xA2, 0x8E, 0x83, 0xA3, 0x88, + 0x8A, 0xCA, 0xFB, 0xE1, 0x7B, 0xA3, 0x6B, 0xD6, 0xBC, 0xF7, 0xE6, 0xCD, + 0xFE, 0xB5, 0xD7, 0x3E, 0xE7, 0xAC, 0xF3, 0x9D, 0xB3, 0xCF, 0x07, 0xC0, + 0x08, 0x0C, 0x96, 0x48, 0x33, 0x51, 0x35, 0x80, 0x0C, 0xA9, 0x42, 0x1E, + 0x11, 0xE0, 0x83, 0xC7, 0xC4, 0xC6, 0xE1, 0xE4, 0x2E, 0x40, 0x81, 0x0A, + 0x24, 0x70, 0x00, 0x10, 0x08, 0xB3, 0x64, 0x21, 0x73, 0xFD, 0x23, 0x01, + 0x00, 0xF8, 0x7E, 0x3C, 0x3C, 0x2B, 0x22, 0xC0, 0x07, 0xBE, 0x00, 0x01, + 0x78, 0xD3, 0x0B, 0x08, 0x00, 0xC0, 0x4D, 0x9B, 0xC0, 0x30, 0x1C, 0x87, + 0xFF, 0x0F, 0xEA, 0x42, 0x99, 0x5C, 0x01, 0x80, 0x84, 0x01, 0xC0, 0x74, + 0x91, 0x38, 0x4B, 0x08, 0x80, 0x14, 0x00, 0x40, 0x7A, 0x8E, 0x42, 0xA6, + 0x00, 0x40, 0x46, 0x01, 0x80, 0x9D, 0x98, 0x26, 0x53, 0x00, 0xA0, 0x04, + 0x00, 0x60, 0xCB, 0x63, 0x62, 0xE3, 0x00, 0x50, 0x2D, 0x00, 0x60, 0x27, + 0x7F, 0xE6, 0xD3, 0x00, 0x80, 0x9D, 0xF8, 0x99, 0x7B, 0x01, 0x00, 0x5B, + 0x94, 0x21, 0x15, 0x01, 0xA0, 0x91, 0x00, 0x20, 0x13, 0x65, 0x88, 0x44, + 0x00, 0x68, 0x3B, 0x00, 0xAC, 0xCF, 0x56, 0x8A, 0x45, 0x00, 0x58, 0x30, + 0x00, 0x14, 0x66, 0x4B, 0xC4, 0x39, 0x00, 0xD8, 0x2D, 0x00, 0x30, 0x49, + 0x57, 0x66, 0x48, 0x00, 0xB0, 0xB7, 0x00, 0xC0, 0xCE, 0x10, 0x0B, 0xB2, + 0x00, 0x08, 0x0C, 0x00, 0x30, 0x51, 0x88, 0x85, 0x29, 0x00, 0x04, 0x7B, + 0x00, 0x60, 0xC8, 0x23, 0x23, 0x78, 0x00, 0x84, 0x99, 0x00, 0x14, 0x46, + 0xF2, 0x57, 0x3C, 0xF1, 0x2B, 0xAE, 0x10, 0xE7, 0x2A, 0x00, 0x00, 0x78, + 0x99, 0xB2, 0x3C, 0xB9, 0x24, 0x39, 0x45, 0x81, 0x5B, 0x08, 0x2D, 0x71, + 0x07, 0x57, 0x57, 0x2E, 0x1E, 0x28, 0xCE, 0x49, 0x17, 0x2B, 0x14, 0x36, + 0x61, 0x02, 0x61, 0x9A, 0x40, 0x2E, 0xC2, 0x79, 0x99, 0x19, 0x32, 0x81, + 0x34, 0x0F, 0xE0, 0xF3, 0xCC, 0x00, 0x00, 0xA0, 0x91, 0x15, 0x11, 0xE0, + 0x83, 0xF3, 0xFD, 0x78, 0xCE, 0x0E, 0xAE, 0xCE, 0xCE, 0x36, 0x8E, 0xB6, + 0x0E, 0x5F, 0x2D, 0xEA, 0xBF, 0x06, 0xFF, 0x22, 0x62, 0x62, 0xE3, 0xFE, + 0xE5, 0xCF, 0xAB, 0x70, 0x40, 0x00, 0x00, 0xE1, 0x74, 0x7E, 0xD1, 0xFE, + 0x2C, 0x2F, 0xB3, 0x1A, 0x80, 0x3B, 0x06, 0x80, 0x6D, 0xFE, 0xA2, 0x25, + 0xEE, 0x04, 0x68, 0x5E, 0x0B, 0xA0, 0x75, 0xF7, 0x8B, 0x66, 0xB2, 0x0F, + 0x40, 0xB5, 0x00, 0xA0, 0xE9, 0xDA, 0x57, 0xF3, 0x70, 0xF8, 0x7E, 0x3C, + 0x3C, 0x45, 0xA1, 0x90, 0xB9, 0xD9, 0xD9, 0xE5, 0xE4, 0xE4, 0xD8, 0x4A, + 0xC4, 0x42, 0x5B, 0x61, 0xCA, 0x57, 0x7D, 0xFE, 0x67, 0xC2, 0x5F, 0xC0, + 0x57, 0xFD, 0x6C, 0xF9, 0x7E, 0x3C, 0xFC, 0xF7, 0xF5, 0xE0, 0xBE, 0xE2, + 0x24, 0x81, 0x32, 0x5D, 0x81, 0x47, 0x04, 0xF8, 0xE0, 0xC2, 0xCC, 0xF4, + 0x4C, 0xA5, 0x1C, 0xCF, 0x92, 0x09, 0x84, 0x62, 0xDC, 0xE6, 0x8F, 0x47, + 0xFC, 0xB7, 0x0B, 0xFF, 0xFC, 0x1D, 0xD3, 0x22, 0xC4, 0x49, 0x62, 0xB9, + 0x58, 0x2A, 0x14, 0xE3, 0x51, 0x12, 0x71, 0x8E, 0x44, 0x9A, 0x8C, 0xF3, + 0x32, 0xA5, 0x22, 0x89, 0x42, 0x92, 0x29, 0xC5, 0x25, 0xD2, 0xFF, 0x64, + 0xE2, 0xDF, 0x2C, 0xFB, 0x03, 0x3E, 0xDF, 0x35, 0x00, 0xB0, 0x6A, 0x3E, + 0x01, 0x7B, 0x91, 0x2D, 0xA8, 0x5D, 0x63, 0x03, 0xF6, 0x4B, 0x27, 0x10, + 0x58, 0x74, 0xC0, 0xE2, 0xF7, 0x00, 0x00, 0xF2, 0xBB, 0x6F, 0xC1, 0xD4, + 0x28, 0x08, 0x03, 0x80, 0x68, 0x83, 0xE1, 0xCF, 0x77, 0xFF, 0xEF, 0x3F, + 0xFD, 0x47, 0xA0, 0x25, 0x00, 0x80, 0x66, 0x49, 0x92, 0x71, 0x00, 0x00, + 0x5E, 0x44, 0x24, 0x2E, 0x54, 0xCA, 0xB3, 0x3F, 0xC7, 0x08, 0x00, 0x00, + 0x44, 0xA0, 0x81, 0x2A, 0xB0, 0x41, 0x1B, 0xF4, 0xC1, 0x18, 0x2C, 0xC0, + 0x06, 0x1C, 0xC1, 0x05, 0xDC, 0xC1, 0x0B, 0xFC, 0x60, 0x36, 0x84, 0x42, + 0x24, 0xC4, 0xC2, 0x42, 0x10, 0x42, 0x0A, 0x64, 0x80, 0x1C, 0x72, 0x60, + 0x29, 0xAC, 0x82, 0x42, 0x28, 0x86, 0xCD, 0xB0, 0x1D, 0x2A, 0x60, 0x2F, + 0xD4, 0x40, 0x1D, 0x34, 0xC0, 0x51, 0x68, 0x86, 0x93, 0x70, 0x0E, 0x2E, + 0xC2, 0x55, 0xB8, 0x0E, 0x3D, 0x70, 0x0F, 0xFA, 0x61, 0x08, 0x9E, 0xC1, + 0x28, 0xBC, 0x81, 0x09, 0x04, 0x41, 0xC8, 0x08, 0x13, 0x61, 0x21, 0xDA, + 0x88, 0x01, 0x62, 0x8A, 0x58, 0x23, 0x8E, 0x08, 0x17, 0x99, 0x85, 0xF8, + 0x21, 0xC1, 0x48, 0x04, 0x12, 0x8B, 0x24, 0x20, 0xC9, 0x88, 0x14, 0x51, + 0x22, 0x4B, 0x91, 0x35, 0x48, 0x31, 0x52, 0x8A, 0x54, 0x20, 0x55, 0x48, + 0x1D, 0xF2, 0x3D, 0x72, 0x02, 0x39, 0x87, 0x5C, 0x46, 0xBA, 0x91, 0x3B, + 0xC8, 0x00, 0x32, 0x82, 0xFC, 0x86, 0xBC, 0x47, 0x31, 0x94, 0x81, 0xB2, + 0x51, 0x3D, 0xD4, 0x0C, 0xB5, 0x43, 0xB9, 0xA8, 0x37, 0x1A, 0x84, 0x46, + 0xA2, 0x0B, 0xD0, 0x64, 0x74, 0x31, 0x9A, 0x8F, 0x16, 0xA0, 0x9B, 0xD0, + 0x72, 0xB4, 0x1A, 0x3D, 0x8C, 0x36, 0xA1, 0xE7, 0xD0, 0xAB, 0x68, 0x0F, + 0xDA, 0x8F, 0x3E, 0x43, 0xC7, 0x30, 0xC0, 0xE8, 0x18, 0x07, 0x33, 0xC4, + 0x6C, 0x30, 0x2E, 0xC6, 0xC3, 0x42, 0xB1, 0x38, 0x2C, 0x09, 0x93, 0x63, + 0xCB, 0xB1, 0x22, 0xAC, 0x0C, 0xAB, 0xC6, 0x1A, 0xB0, 0x56, 0xAC, 0x03, + 0xBB, 0x89, 0xF5, 0x63, 0xCF, 0xB1, 0x77, 0x04, 0x12, 0x81, 0x45, 0xC0, + 0x09, 0x36, 0x04, 0x77, 0x42, 0x20, 0x61, 0x1E, 0x41, 0x48, 0x58, 0x4C, + 0x58, 0x4E, 0xD8, 0x48, 0xA8, 0x20, 0x1C, 0x24, 0x34, 0x11, 0xDA, 0x09, + 0x37, 0x09, 0x03, 0x84, 0x51, 0xC2, 0x27, 0x22, 0x93, 0xA8, 0x4B, 0xB4, + 0x26, 0xBA, 0x11, 0xF9, 0xC4, 0x18, 0x62, 0x32, 0x31, 0x87, 0x58, 0x48, + 0x2C, 0x23, 0xD6, 0x12, 0x8F, 0x13, 0x2F, 0x10, 0x7B, 0x88, 0x43, 0xC4, + 0x37, 0x24, 0x12, 0x89, 0x43, 0x32, 0x27, 0xB9, 0x90, 0x02, 0x49, 0xB1, + 0xA4, 0x54, 0xD2, 0x12, 0xD2, 0x46, 0xD2, 0x6E, 0x52, 0x23, 0xE9, 0x2C, + 0xA9, 0x9B, 0x34, 0x48, 0x1A, 0x23, 0x93, 0xC9, 0xDA, 0x64, 0x6B, 0xB2, + 0x07, 0x39, 0x94, 0x2C, 0x20, 0x2B, 0xC8, 0x85, 0xE4, 0x9D, 0xE4, 0xC3, + 0xE4, 0x33, 0xE4, 0x1B, 0xE4, 0x21, 0xF2, 0x5B, 0x0A, 0x9D, 0x62, 0x40, + 0x71, 0xA4, 0xF8, 0x53, 0xE2, 0x28, 0x52, 0xCA, 0x6A, 0x4A, 0x19, 0xE5, + 0x10, 0xE5, 0x34, 0xE5, 0x06, 0x65, 0x98, 0x32, 0x41, 0x55, 0xA3, 0x9A, + 0x52, 0xDD, 0xA8, 0xA1, 0x54, 0x11, 0x35, 0x8F, 0x5A, 0x42, 0xAD, 0xA1, + 0xB6, 0x52, 0xAF, 0x51, 0x87, 0xA8, 0x13, 0x34, 0x75, 0x9A, 0x39, 0xCD, + 0x83, 0x16, 0x49, 0x4B, 0xA5, 0xAD, 0xA2, 0x95, 0xD3, 0x1A, 0x68, 0x17, + 0x68, 0xF7, 0x69, 0xAF, 0xE8, 0x74, 0xBA, 0x11, 0xDD, 0x95, 0x1E, 0x4E, + 0x97, 0xD0, 0x57, 0xD2, 0xCB, 0xE9, 0x47, 0xE8, 0x97, 0xE8, 0x03, 0xF4, + 0x77, 0x0C, 0x0D, 0x86, 0x15, 0x83, 0xC7, 0x88, 0x67, 0x28, 0x19, 0x9B, + 0x18, 0x07, 0x18, 0x67, 0x19, 0x77, 0x18, 0xAF, 0x98, 0x4C, 0xA6, 0x19, + 0xD3, 0x8B, 0x19, 0xC7, 0x54, 0x30, 0x37, 0x31, 0xEB, 0x98, 0xE7, 0x99, + 0x0F, 0x99, 0x6F, 0x55, 0x58, 0x2A, 0xB6, 0x2A, 0x7C, 0x15, 0x91, 0xCA, + 0x0A, 0x95, 0x4A, 0x95, 0x26, 0x95, 0x1B, 0x2A, 0x2F, 0x54, 0xA9, 0xAA, + 0xA6, 0xAA, 0xDE, 0xAA, 0x0B, 0x55, 0xF3, 0x55, 0xCB, 0x54, 0x8F, 0xA9, + 0x5E, 0x53, 0x7D, 0xAE, 0x46, 0x55, 0x33, 0x53, 0xE3, 0xA9, 0x09, 0xD4, + 0x96, 0xAB, 0x55, 0xAA, 0x9D, 0x50, 0xEB, 0x53, 0x1B, 0x53, 0x67, 0xA9, + 0x3B, 0xA8, 0x87, 0xAA, 0x67, 0xA8, 0x6F, 0x54, 0x3F, 0xA4, 0x7E, 0x59, + 0xFD, 0x89, 0x06, 0x59, 0xC3, 0x4C, 0xC3, 0x4F, 0x43, 0xA4, 0x51, 0xA0, + 0xB1, 0x5F, 0xE3, 0xBC, 0xC6, 0x20, 0x0B, 0x63, 0x19, 0xB3, 0x78, 0x2C, + 0x21, 0x6B, 0x0D, 0xAB, 0x86, 0x75, 0x81, 0x35, 0xC4, 0x26, 0xB1, 0xCD, + 0xD9, 0x7C, 0x76, 0x2A, 0xBB, 0x98, 0xFD, 0x1D, 0xBB, 0x8B, 0x3D, 0xAA, + 0xA9, 0xA1, 0x39, 0x43, 0x33, 0x4A, 0x33, 0x57, 0xB3, 0x52, 0xF3, 0x94, + 0x66, 0x3F, 0x07, 0xE3, 0x98, 0x71, 0xF8, 0x9C, 0x74, 0x4E, 0x09, 0xE7, + 0x28, 0xA7, 0x97, 0xF3, 0x7E, 0x8A, 0xDE, 0x14, 0xEF, 0x29, 0xE2, 0x29, + 0x1B, 0xA6, 0x34, 0x4C, 0xB9, 0x31, 0x65, 0x5C, 0x6B, 0xAA, 0x96, 0x97, + 0x96, 0x58, 0xAB, 0x48, 0xAB, 0x51, 0xAB, 0x47, 0xEB, 0xBD, 0x36, 0xAE, + 0xED, 0xA7, 0x9D, 0xA6, 0xBD, 0x45, 0xBB, 0x59, 0xFB, 0x81, 0x0E, 0x41, + 0xC7, 0x4A, 0x27, 0x5C, 0x27, 0x47, 0x67, 0x8F, 0xCE, 0x05, 0x9D, 0xE7, + 0x53, 0xD9, 0x53, 0xDD, 0xA7, 0x0A, 0xA7, 0x16, 0x4D, 0x3D, 0x3A, 0xF5, + 0xAE, 0x2E, 0xAA, 0x6B, 0xA5, 0x1B, 0xA1, 0xBB, 0x44, 0x77, 0xBF, 0x6E, + 0xA7, 0xEE, 0x98, 0x9E, 0xBE, 0x5E, 0x80, 0x9E, 0x4C, 0x6F, 0xA7, 0xDE, + 0x79, 0xBD, 0xE7, 0xFA, 0x1C, 0x7D, 0x2F, 0xFD, 0x54, 0xFD, 0x6D, 0xFA, + 0xA7, 0xF5, 0x47, 0x0C, 0x58, 0x06, 0xB3, 0x0C, 0x24, 0x06, 0xDB, 0x0C, + 0xCE, 0x18, 0x3C, 0xC5, 0x35, 0x71, 0x6F, 0x3C, 0x1D, 0x2F, 0xC7, 0xDB, + 0xF1, 0x51, 0x43, 0x5D, 0xC3, 0x40, 0x43, 0xA5, 0x61, 0x95, 0x61, 0x97, + 0xE1, 0x84, 0x91, 0xB9, 0xD1, 0x3C, 0xA3, 0xD5, 0x46, 0x8D, 0x46, 0x0F, + 0x8C, 0x69, 0xC6, 0x5C, 0xE3, 0x24, 0xE3, 0x6D, 0xC6, 0x6D, 0xC6, 0xA3, + 0x26, 0x06, 0x26, 0x21, 0x26, 0x4B, 0x4D, 0xEA, 0x4D, 0xEE, 0x9A, 0x52, + 0x4D, 0xB9, 0xA6, 0x29, 0xA6, 0x3B, 0x4C, 0x3B, 0x4C, 0xC7, 0xCD, 0xCC, + 0xCD, 0xA2, 0xCD, 0xD6, 0x99, 0x35, 0x9B, 0x3D, 0x31, 0xD7, 0x32, 0xE7, + 0x9B, 0xE7, 0x9B, 0xD7, 0x9B, 0xDF, 0xB7, 0x60, 0x5A, 0x78, 0x5A, 0x2C, + 0xB6, 0xA8, 0xB6, 0xB8, 0x65, 0x49, 0xB2, 0xE4, 0x5A, 0xA6, 0x59, 0xEE, + 0xB6, 0xBC, 0x6E, 0x85, 0x5A, 0x39, 0x59, 0xA5, 0x58, 0x55, 0x5A, 0x5D, + 0xB3, 0x46, 0xAD, 0x9D, 0xAD, 0x25, 0xD6, 0xBB, 0xAD, 0xBB, 0xA7, 0x11, + 0xA7, 0xB9, 0x4E, 0x93, 0x4E, 0xAB, 0x9E, 0xD6, 0x67, 0xC3, 0xB0, 0xF1, + 0xB6, 0xC9, 0xB6, 0xA9, 0xB7, 0x19, 0xB0, 0xE5, 0xD8, 0x06, 0xDB, 0xAE, + 0xB6, 0x6D, 0xB6, 0x7D, 0x61, 0x67, 0x62, 0x17, 0x67, 0xB7, 0xC5, 0xAE, + 0xC3, 0xEE, 0x93, 0xBD, 0x93, 0x7D, 0xBA, 0x7D, 0x8D, 0xFD, 0x3D, 0x07, + 0x0D, 0x87, 0xD9, 0x0E, 0xAB, 0x1D, 0x5A, 0x1D, 0x7E, 0x73, 0xB4, 0x72, + 0x14, 0x3A, 0x56, 0x3A, 0xDE, 0x9A, 0xCE, 0x9C, 0xEE, 0x3F, 0x7D, 0xC5, + 0xF4, 0x96, 0xE9, 0x2F, 0x67, 0x58, 0xCF, 0x10, 0xCF, 0xD8, 0x33, 0xE3, + 0xB6, 0x13, 0xCB, 0x29, 0xC4, 0x69, 0x9D, 0x53, 0x9B, 0xD3, 0x47, 0x67, + 0x17, 0x67, 0xB9, 0x73, 0x83, 0xF3, 0x88, 0x8B, 0x89, 0x4B, 0x82, 0xCB, + 0x2E, 0x97, 0x3E, 0x2E, 0x9B, 0x1B, 0xC6, 0xDD, 0xC8, 0xBD, 0xE4, 0x4A, + 0x74, 0xF5, 0x71, 0x5D, 0xE1, 0x7A, 0xD2, 0xF5, 0x9D, 0x9B, 0xB3, 0x9B, + 0xC2, 0xED, 0xA8, 0xDB, 0xAF, 0xEE, 0x36, 0xEE, 0x69, 0xEE, 0x87, 0xDC, + 0x9F, 0xCC, 0x34, 0x9F, 0x29, 0x9E, 0x59, 0x33, 0x73, 0xD0, 0xC3, 0xC8, + 0x43, 0xE0, 0x51, 0xE5, 0xD1, 0x3F, 0x0B, 0x9F, 0x95, 0x30, 0x6B, 0xDF, + 0xAC, 0x7E, 0x4F, 0x43, 0x4F, 0x81, 0x67, 0xB5, 0xE7, 0x23, 0x2F, 0x63, + 0x2F, 0x91, 0x57, 0xAD, 0xD7, 0xB0, 0xB7, 0xA5, 0x77, 0xAA, 0xF7, 0x61, + 0xEF, 0x17, 0x3E, 0xF6, 0x3E, 0x72, 0x9F, 0xE3, 0x3E, 0xE3, 0x3C, 0x37, + 0xDE, 0x32, 0xDE, 0x59, 0x5F, 0xCC, 0x37, 0xC0, 0xB7, 0xC8, 0xB7, 0xCB, + 0x4F, 0xC3, 0x6F, 0x9E, 0x5F, 0x85, 0xDF, 0x43, 0x7F, 0x23, 0xFF, 0x64, + 0xFF, 0x7A, 0xFF, 0xD1, 0x00, 0xA7, 0x80, 0x25, 0x01, 0x67, 0x03, 0x89, + 0x81, 0x41, 0x81, 0x5B, 0x02, 0xFB, 0xF8, 0x7A, 0x7C, 0x21, 0xBF, 0x8E, + 0x3F, 0x3A, 0xDB, 0x65, 0xF6, 0xB2, 0xD9, 0xED, 0x41, 0x8C, 0xA0, 0xB9, + 0x41, 0x15, 0x41, 0x8F, 0x82, 0xAD, 0x82, 0xE5, 0xC1, 0xAD, 0x21, 0x68, + 0xC8, 0xEC, 0x90, 0xAD, 0x21, 0xF7, 0xE7, 0x98, 0xCE, 0x91, 0xCE, 0x69, + 0x0E, 0x85, 0x50, 0x7E, 0xE8, 0xD6, 0xD0, 0x07, 0x61, 0xE6, 0x61, 0x8B, + 0xC3, 0x7E, 0x0C, 0x27, 0x85, 0x87, 0x85, 0x57, 0x86, 0x3F, 0x8E, 0x70, + 0x88, 0x58, 0x1A, 0xD1, 0x31, 0x97, 0x35, 0x77, 0xD1, 0xDC, 0x43, 0x73, + 0xDF, 0x44, 0xFA, 0x44, 0x96, 0x44, 0xDE, 0x9B, 0x67, 0x31, 0x4F, 0x39, + 0xAF, 0x2D, 0x4A, 0x35, 0x2A, 0x3E, 0xAA, 0x2E, 0x6A, 0x3C, 0xDA, 0x37, + 0xBA, 0x34, 0xBA, 0x3F, 0xC6, 0x2E, 0x66, 0x59, 0xCC, 0xD5, 0x58, 0x9D, + 0x58, 0x49, 0x6C, 0x4B, 0x1C, 0x39, 0x2E, 0x2A, 0xAE, 0x36, 0x6E, 0x6C, + 0xBE, 0xDF, 0xFC, 0xED, 0xF3, 0x87, 0xE2, 0x9D, 0xE2, 0x0B, 0xE3, 0x7B, + 0x17, 0x98, 0x2F, 0xC8, 0x5D, 0x70, 0x79, 0xA1, 0xCE, 0xC2, 0xF4, 0x85, + 0xA7, 0x16, 0xA9, 0x2E, 0x12, 0x2C, 0x3A, 0x96, 0x40, 0x4C, 0x88, 0x4E, + 0x38, 0x94, 0xF0, 0x41, 0x10, 0x2A, 0xA8, 0x16, 0x8C, 0x25, 0xF2, 0x13, + 0x77, 0x25, 0x8E, 0x0A, 0x79, 0xC2, 0x1D, 0xC2, 0x67, 0x22, 0x2F, 0xD1, + 0x36, 0xD1, 0x88, 0xD8, 0x43, 0x5C, 0x2A, 0x1E, 0x4E, 0xF2, 0x48, 0x2A, + 0x4D, 0x7A, 0x92, 0xEC, 0x91, 0xBC, 0x35, 0x79, 0x24, 0xC5, 0x33, 0xA5, + 0x2C, 0xE5, 0xB9, 0x84, 0x27, 0xA9, 0x90, 0xBC, 0x4C, 0x0D, 0x4C, 0xDD, + 0x9B, 0x3A, 0x9E, 0x16, 0x9A, 0x76, 0x20, 0x6D, 0x32, 0x3D, 0x3A, 0xBD, + 0x31, 0x83, 0x92, 0x91, 0x90, 0x71, 0x42, 0xAA, 0x21, 0x4D, 0x93, 0xB6, + 0x67, 0xEA, 0x67, 0xE6, 0x66, 0x76, 0xCB, 0xAC, 0x65, 0x85, 0xB2, 0xFE, + 0xC5, 0x6E, 0x8B, 0xB7, 0x2F, 0x1E, 0x95, 0x07, 0xC9, 0x6B, 0xB3, 0x90, + 0xAC, 0x05, 0x59, 0x2D, 0x0A, 0xB6, 0x42, 0xA6, 0xE8, 0x54, 0x5A, 0x28, + 0xD7, 0x2A, 0x07, 0xB2, 0x67, 0x65, 0x57, 0x66, 0xBF, 0xCD, 0x89, 0xCA, + 0x39, 0x96, 0xAB, 0x9E, 0x2B, 0xCD, 0xED, 0xCC, 0xB3, 0xCA, 0xDB, 0x90, + 0x37, 0x9C, 0xEF, 0x9F, 0xFF, 0xED, 0x12, 0xC2, 0x12, 0xE1, 0x92, 0xB6, + 0xA5, 0x86, 0x4B, 0x57, 0x2D, 0x1D, 0x58, 0xE6, 0xBD, 0xAC, 0x6A, 0x39, + 0xB2, 0x3C, 0x71, 0x79, 0xDB, 0x0A, 0xE3, 0x15, 0x05, 0x2B, 0x86, 0x56, + 0x06, 0xAC, 0x3C, 0xB8, 0x8A, 0xB6, 0x2A, 0x6D, 0xD5, 0x4F, 0xAB, 0xED, + 0x57, 0x97, 0xAE, 0x7E, 0xBD, 0x26, 0x7A, 0x4D, 0x6B, 0x81, 0x5E, 0xC1, + 0xCA, 0x82, 0xC1, 0xB5, 0x01, 0x6B, 0xEB, 0x0B, 0x55, 0x0A, 0xE5, 0x85, + 0x7D, 0xEB, 0xDC, 0xD7, 0xED, 0x5D, 0x4F, 0x58, 0x2F, 0x59, 0xDF, 0xB5, + 0x61, 0xFA, 0x86, 0x9D, 0x1B, 0x3E, 0x15, 0x89, 0x8A, 0xAE, 0x14, 0xDB, + 0x17, 0x97, 0x15, 0x7F, 0xD8, 0x28, 0xDC, 0x78, 0xE5, 0x1B, 0x87, 0x6F, + 0xCA, 0xBF, 0x99, 0xDC, 0x94, 0xB4, 0xA9, 0xAB, 0xC4, 0xB9, 0x64, 0xCF, + 0x66, 0xD2, 0x66, 0xE9, 0xE6, 0xDE, 0x2D, 0x9E, 0x5B, 0x0E, 0x96, 0xAA, + 0x97, 0xE6, 0x97, 0x0E, 0x6E, 0x0D, 0xD9, 0xDA, 0xB4, 0x0D, 0xDF, 0x56, + 0xB4, 0xED, 0xF5, 0xF6, 0x45, 0xDB, 0x2F, 0x97, 0xCD, 0x28, 0xDB, 0xBB, + 0x83, 0xB6, 0x43, 0xB9, 0xA3, 0xBF, 0x3C, 0xB8, 0xBC, 0x65, 0xA7, 0xC9, + 0xCE, 0xCD, 0x3B, 0x3F, 0x54, 0xA4, 0x54, 0xF4, 0x54, 0xFA, 0x54, 0x36, + 0xEE, 0xD2, 0xDD, 0xB5, 0x61, 0xD7, 0xF8, 0x6E, 0xD1, 0xEE, 0x1B, 0x7B, + 0xBC, 0xF6, 0x34, 0xEC, 0xD5, 0xDB, 0x5B, 0xBC, 0xF7, 0xFD, 0x3E, 0xC9, + 0xBE, 0xDB, 0x55, 0x01, 0x55, 0x4D, 0xD5, 0x66, 0xD5, 0x65, 0xFB, 0x49, + 0xFB, 0xB3, 0xF7, 0x3F, 0xAE, 0x89, 0xAA, 0xE9, 0xF8, 0x96, 0xFB, 0x6D, + 0x5D, 0xAD, 0x4E, 0x6D, 0x71, 0xED, 0xC7, 0x03, 0xD2, 0x03, 0xFD, 0x07, + 0x23, 0x0E, 0xB6, 0xD7, 0xB9, 0xD4, 0xD5, 0x1D, 0xD2, 0x3D, 0x54, 0x52, + 0x8F, 0xD6, 0x2B, 0xEB, 0x47, 0x0E, 0xC7, 0x1F, 0xBE, 0xFE, 0x9D, 0xEF, + 0x77, 0x2D, 0x0D, 0x36, 0x0D, 0x55, 0x8D, 0x9C, 0xC6, 0xE2, 0x23, 0x70, + 0x44, 0x79, 0xE4, 0xE9, 0xF7, 0x09, 0xDF, 0xF7, 0x1E, 0x0D, 0x3A, 0xDA, + 0x76, 0x8C, 0x7B, 0xAC, 0xE1, 0x07, 0xD3, 0x1F, 0x76, 0x1D, 0x67, 0x1D, + 0x2F, 0x6A, 0x42, 0x9A, 0xF2, 0x9A, 0x46, 0x9B, 0x53, 0x9A, 0xFB, 0x5B, + 0x62, 0x5B, 0xBA, 0x4F, 0xCC, 0x3E, 0xD1, 0xD6, 0xEA, 0xDE, 0x7A, 0xFC, + 0x47, 0xDB, 0x1F, 0x0F, 0x9C, 0x34, 0x3C, 0x59, 0x79, 0x4A, 0xF3, 0x54, + 0xC9, 0x69, 0xDA, 0xE9, 0x82, 0xD3, 0x93, 0x67, 0xF2, 0xCF, 0x8C, 0x9D, + 0x95, 0x9D, 0x7D, 0x7E, 0x2E, 0xF9, 0xDC, 0x60, 0xDB, 0xA2, 0xB6, 0x7B, + 0xE7, 0x63, 0xCE, 0xDF, 0x6A, 0x0F, 0x6F, 0xEF, 0xBA, 0x10, 0x74, 0xE1, + 0xD2, 0x45, 0xFF, 0x8B, 0xE7, 0x3B, 0xBC, 0x3B, 0xCE, 0x5C, 0xF2, 0xB8, + 0x74, 0xF2, 0xB2, 0xDB, 0xE5, 0x13, 0x57, 0xB8, 0x57, 0x9A, 0xAF, 0x3A, + 0x5F, 0x6D, 0xEA, 0x74, 0xEA, 0x3C, 0xFE, 0x93, 0xD3, 0x4F, 0xC7, 0xBB, + 0x9C, 0xBB, 0x9A, 0xAE, 0xB9, 0x5C, 0x6B, 0xB9, 0xEE, 0x7A, 0xBD, 0xB5, + 0x7B, 0x66, 0xF7, 0xE9, 0x1B, 0x9E, 0x37, 0xCE, 0xDD, 0xF4, 0xBD, 0x79, + 0xF1, 0x16, 0xFF, 0xD6, 0xD5, 0x9E, 0x39, 0x3D, 0xDD, 0xBD, 0xF3, 0x7A, + 0x6F, 0xF7, 0xC5, 0xF7, 0xF5, 0xDF, 0x16, 0xDD, 0x7E, 0x72, 0x27, 0xFD, + 0xCE, 0xCB, 0xBB, 0xD9, 0x77, 0x27, 0xEE, 0xAD, 0xBC, 0x4F, 0xBC, 0x5F, + 0xF4, 0x40, 0xED, 0x41, 0xD9, 0x43, 0xDD, 0x87, 0xD5, 0x3F, 0x5B, 0xFE, + 0xDC, 0xD8, 0xEF, 0xDC, 0x7F, 0x6A, 0xC0, 0x77, 0xA0, 0xF3, 0xD1, 0xDC, + 0x47, 0xF7, 0x06, 0x85, 0x83, 0xCF, 0xFE, 0x91, 0xF5, 0x8F, 0x0F, 0x43, + 0x05, 0x8F, 0x99, 0x8F, 0xCB, 0x86, 0x0D, 0x86, 0xEB, 0x9E, 0x38, 0x3E, + 0x39, 0x39, 0xE2, 0x3F, 0x72, 0xFD, 0xE9, 0xFC, 0xA7, 0x43, 0xCF, 0x64, + 0xCF, 0x26, 0x9E, 0x17, 0xFE, 0xA2, 0xFE, 0xCB, 0xAE, 0x17, 0x16, 0x2F, + 0x7E, 0xF8, 0xD5, 0xEB, 0xD7, 0xCE, 0xD1, 0x98, 0xD1, 0xA1, 0x97, 0xF2, + 0x97, 0x93, 0xBF, 0x6D, 0x7C, 0xA5, 0xFD, 0xEA, 0xC0, 0xEB, 0x19, 0xAF, + 0xDB, 0xC6, 0xC2, 0xC6, 0x1E, 0xBE, 0xC9, 0x78, 0x33, 0x31, 0x5E, 0xF4, + 0x56, 0xFB, 0xED, 0xC1, 0x77, 0xDC, 0x77, 0x1D, 0xEF, 0xA3, 0xDF, 0x0F, + 0x4F, 0xE4, 0x7C, 0x20, 0x7F, 0x28, 0xFF, 0x68, 0xF9, 0xB1, 0xF5, 0x53, + 0xD0, 0xA7, 0xFB, 0x93, 0x19, 0x93, 0x93, 0xFF, 0x04, 0x03, 0x98, 0xF3, + 0xFC, 0x63, 0x33, 0x2D, 0xDB, 0x00, 0x00, 0x3A, 0xFD, 0x69, 0x54, 0x58, + 0x74, 0x58, 0x4D, 0x4C, 0x3A, 0x63, 0x6F, 0x6D, 0x2E, 0x61, 0x64, 0x6F, + 0x62, 0x65, 0x2E, 0x78, 0x6D, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, + 0x3F, 0x78, 0x70, 0x61, 0x63, 0x6B, 0x65, 0x74, 0x20, 0x62, 0x65, 0x67, + 0x69, 0x6E, 0x3D, 0x22, 0xEF, 0xBB, 0xBF, 0x22, 0x20, 0x69, 0x64, 0x3D, + 0x22, 0x57, 0x35, 0x4D, 0x30, 0x4D, 0x70, 0x43, 0x65, 0x68, 0x69, 0x48, + 0x7A, 0x72, 0x65, 0x53, 0x7A, 0x4E, 0x54, 0x63, 0x7A, 0x6B, 0x63, 0x39, + 0x64, 0x22, 0x3F, 0x3E, 0x0A, 0x3C, 0x78, 0x3A, 0x78, 0x6D, 0x70, 0x6D, + 0x65, 0x74, 0x61, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, 0x3A, 0x78, 0x3D, + 0x22, 0x61, 0x64, 0x6F, 0x62, 0x65, 0x3A, 0x6E, 0x73, 0x3A, 0x6D, 0x65, + 0x74, 0x61, 0x2F, 0x22, 0x20, 0x78, 0x3A, 0x78, 0x6D, 0x70, 0x74, 0x6B, + 0x3D, 0x22, 0x41, 0x64, 0x6F, 0x62, 0x65, 0x20, 0x58, 0x4D, 0x50, 0x20, + 0x43, 0x6F, 0x72, 0x65, 0x20, 0x35, 0x2E, 0x36, 0x2D, 0x63, 0x31, 0x33, + 0x38, 0x20, 0x37, 0x39, 0x2E, 0x31, 0x35, 0x39, 0x38, 0x32, 0x34, 0x2C, + 0x20, 0x32, 0x30, 0x31, 0x36, 0x2F, 0x30, 0x39, 0x2F, 0x31, 0x34, 0x2D, + 0x30, 0x31, 0x3A, 0x30, 0x39, 0x3A, 0x30, 0x31, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x3C, 0x72, + 0x64, 0x66, 0x3A, 0x52, 0x44, 0x46, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, + 0x3A, 0x72, 0x64, 0x66, 0x3D, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, + 0x2F, 0x77, 0x77, 0x77, 0x2E, 0x77, 0x33, 0x2E, 0x6F, 0x72, 0x67, 0x2F, + 0x31, 0x39, 0x39, 0x39, 0x2F, 0x30, 0x32, 0x2F, 0x32, 0x32, 0x2D, 0x72, + 0x64, 0x66, 0x2D, 0x73, 0x79, 0x6E, 0x74, 0x61, 0x78, 0x2D, 0x6E, 0x73, + 0x23, 0x22, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, + 0x64, 0x66, 0x3A, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6F, 0x6E, 0x20, 0x72, 0x64, 0x66, 0x3A, 0x61, 0x62, 0x6F, 0x75, 0x74, + 0x3D, 0x22, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, 0x3A, 0x78, 0x6D, + 0x70, 0x3D, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x6E, 0x73, + 0x2E, 0x61, 0x64, 0x6F, 0x62, 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x78, + 0x61, 0x70, 0x2F, 0x31, 0x2E, 0x30, 0x2F, 0x22, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, 0x6C, + 0x6E, 0x73, 0x3A, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3D, 0x22, 0x68, 0x74, + 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x6E, 0x73, 0x2E, 0x61, 0x64, 0x6F, 0x62, + 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x78, 0x61, 0x70, 0x2F, 0x31, 0x2E, + 0x30, 0x2F, 0x6D, 0x6D, 0x2F, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, + 0x3A, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3D, 0x22, 0x68, 0x74, 0x74, 0x70, + 0x3A, 0x2F, 0x2F, 0x6E, 0x73, 0x2E, 0x61, 0x64, 0x6F, 0x62, 0x65, 0x2E, + 0x63, 0x6F, 0x6D, 0x2F, 0x78, 0x61, 0x70, 0x2F, 0x31, 0x2E, 0x30, 0x2F, + 0x73, 0x54, 0x79, 0x70, 0x65, 0x2F, 0x52, 0x65, 0x73, 0x6F, 0x75, 0x72, + 0x63, 0x65, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x23, 0x22, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, + 0x6C, 0x6E, 0x73, 0x3A, 0x70, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, + 0x70, 0x3D, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x6E, 0x73, + 0x2E, 0x61, 0x64, 0x6F, 0x62, 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x70, + 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x2F, 0x31, 0x2E, 0x30, + 0x2F, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, 0x3A, 0x64, 0x63, 0x3D, + 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x70, 0x75, 0x72, 0x6C, + 0x2E, 0x6F, 0x72, 0x67, 0x2F, 0x64, 0x63, 0x2F, 0x65, 0x6C, 0x65, 0x6D, + 0x65, 0x6E, 0x74, 0x73, 0x2F, 0x31, 0x2E, 0x31, 0x2F, 0x22, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, + 0x6D, 0x6C, 0x6E, 0x73, 0x3A, 0x74, 0x69, 0x66, 0x66, 0x3D, 0x22, 0x68, + 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x6E, 0x73, 0x2E, 0x61, 0x64, 0x6F, + 0x62, 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x74, 0x69, 0x66, 0x66, 0x2F, + 0x31, 0x2E, 0x30, 0x2F, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, 0x3A, + 0x65, 0x78, 0x69, 0x66, 0x3D, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, + 0x2F, 0x6E, 0x73, 0x2E, 0x61, 0x64, 0x6F, 0x62, 0x65, 0x2E, 0x63, 0x6F, + 0x6D, 0x2F, 0x65, 0x78, 0x69, 0x66, 0x2F, 0x31, 0x2E, 0x30, 0x2F, 0x22, + 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, + 0x78, 0x6D, 0x70, 0x3A, 0x43, 0x72, 0x65, 0x61, 0x74, 0x6F, 0x72, 0x54, + 0x6F, 0x6F, 0x6C, 0x3E, 0x41, 0x64, 0x6F, 0x62, 0x65, 0x20, 0x50, 0x68, + 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x20, 0x43, 0x43, 0x20, 0x32, + 0x30, 0x31, 0x37, 0x20, 0x28, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, + 0x29, 0x3C, 0x2F, 0x78, 0x6D, 0x70, 0x3A, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x6F, 0x72, 0x54, 0x6F, 0x6F, 0x6C, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x3A, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x65, 0x3E, 0x32, 0x30, 0x31, + 0x38, 0x2D, 0x30, 0x34, 0x2D, 0x30, 0x31, 0x54, 0x32, 0x31, 0x3A, 0x35, + 0x39, 0x3A, 0x33, 0x30, 0x2B, 0x30, 0x38, 0x3A, 0x30, 0x30, 0x3C, 0x2F, + 0x78, 0x6D, 0x70, 0x3A, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, + 0x74, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x3A, 0x4D, 0x65, 0x74, 0x61, 0x64, 0x61, + 0x74, 0x61, 0x44, 0x61, 0x74, 0x65, 0x3E, 0x32, 0x30, 0x31, 0x38, 0x2D, + 0x30, 0x34, 0x2D, 0x30, 0x31, 0x54, 0x32, 0x31, 0x3A, 0x35, 0x39, 0x3A, + 0x33, 0x30, 0x2B, 0x30, 0x38, 0x3A, 0x30, 0x30, 0x3C, 0x2F, 0x78, 0x6D, + 0x70, 0x3A, 0x4D, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x44, 0x61, + 0x74, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x3A, 0x4D, 0x6F, 0x64, 0x69, 0x66, 0x79, + 0x44, 0x61, 0x74, 0x65, 0x3E, 0x32, 0x30, 0x31, 0x38, 0x2D, 0x30, 0x34, + 0x2D, 0x30, 0x31, 0x54, 0x32, 0x31, 0x3A, 0x35, 0x39, 0x3A, 0x33, 0x30, + 0x2B, 0x30, 0x38, 0x3A, 0x30, 0x30, 0x3C, 0x2F, 0x78, 0x6D, 0x70, 0x3A, + 0x4D, 0x6F, 0x64, 0x69, 0x66, 0x79, 0x44, 0x61, 0x74, 0x65, 0x3E, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x78, 0x6D, + 0x70, 0x4D, 0x4D, 0x3A, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, + 0x49, 0x44, 0x3E, 0x78, 0x6D, 0x70, 0x2E, 0x69, 0x69, 0x64, 0x3A, 0x65, + 0x66, 0x63, 0x62, 0x65, 0x35, 0x33, 0x30, 0x2D, 0x35, 0x65, 0x61, 0x36, + 0x2D, 0x61, 0x32, 0x34, 0x35, 0x2D, 0x38, 0x32, 0x38, 0x35, 0x2D, 0x63, + 0x35, 0x62, 0x63, 0x64, 0x36, 0x33, 0x61, 0x62, 0x39, 0x66, 0x39, 0x3C, + 0x2F, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x49, 0x6E, 0x73, 0x74, 0x61, + 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x44, + 0x6F, 0x63, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x49, 0x44, 0x3E, 0x61, 0x64, + 0x6F, 0x62, 0x65, 0x3A, 0x64, 0x6F, 0x63, 0x69, 0x64, 0x3A, 0x70, 0x68, + 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x3A, 0x65, 0x31, 0x37, 0x35, + 0x35, 0x65, 0x39, 0x63, 0x2D, 0x33, 0x35, 0x62, 0x34, 0x2D, 0x31, 0x31, + 0x65, 0x38, 0x2D, 0x39, 0x31, 0x61, 0x34, 0x2D, 0x38, 0x38, 0x34, 0x37, + 0x30, 0x37, 0x30, 0x65, 0x31, 0x35, 0x34, 0x62, 0x3C, 0x2F, 0x78, 0x6D, + 0x70, 0x4D, 0x4D, 0x3A, 0x44, 0x6F, 0x63, 0x75, 0x6D, 0x65, 0x6E, 0x74, + 0x49, 0x44, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x4F, 0x72, 0x69, 0x67, + 0x69, 0x6E, 0x61, 0x6C, 0x44, 0x6F, 0x63, 0x75, 0x6D, 0x65, 0x6E, 0x74, + 0x49, 0x44, 0x3E, 0x78, 0x6D, 0x70, 0x2E, 0x64, 0x69, 0x64, 0x3A, 0x34, + 0x31, 0x36, 0x37, 0x34, 0x65, 0x31, 0x31, 0x2D, 0x62, 0x37, 0x39, 0x38, + 0x2D, 0x63, 0x39, 0x34, 0x38, 0x2D, 0x39, 0x30, 0x31, 0x39, 0x2D, 0x62, + 0x66, 0x31, 0x35, 0x61, 0x38, 0x31, 0x65, 0x38, 0x31, 0x61, 0x36, 0x3C, + 0x2F, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x4F, 0x72, 0x69, 0x67, 0x69, + 0x6E, 0x61, 0x6C, 0x44, 0x6F, 0x63, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x49, + 0x44, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x3C, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x48, 0x69, 0x73, 0x74, 0x6F, + 0x72, 0x79, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x64, 0x66, 0x3A, 0x53, 0x65, 0x71, + 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x64, 0x66, 0x3A, 0x6C, 0x69, + 0x20, 0x72, 0x64, 0x66, 0x3A, 0x70, 0x61, 0x72, 0x73, 0x65, 0x54, 0x79, + 0x70, 0x65, 0x3D, 0x22, 0x52, 0x65, 0x73, 0x6F, 0x75, 0x72, 0x63, 0x65, + 0x22, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, + 0x45, 0x76, 0x74, 0x3A, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x63, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, + 0x74, 0x3A, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x69, + 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3E, 0x78, 0x6D, + 0x70, 0x2E, 0x69, 0x69, 0x64, 0x3A, 0x34, 0x31, 0x36, 0x37, 0x34, 0x65, + 0x31, 0x31, 0x2D, 0x62, 0x37, 0x39, 0x38, 0x2D, 0x63, 0x39, 0x34, 0x38, + 0x2D, 0x39, 0x30, 0x31, 0x39, 0x2D, 0x62, 0x66, 0x31, 0x35, 0x61, 0x38, + 0x31, 0x65, 0x38, 0x31, 0x61, 0x36, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, + 0x74, 0x3A, 0x69, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, + 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x45, + 0x76, 0x74, 0x3A, 0x77, 0x68, 0x65, 0x6E, 0x3E, 0x32, 0x30, 0x31, 0x38, + 0x2D, 0x30, 0x34, 0x2D, 0x30, 0x31, 0x54, 0x32, 0x31, 0x3A, 0x35, 0x39, + 0x3A, 0x33, 0x30, 0x2B, 0x30, 0x38, 0x3A, 0x30, 0x30, 0x3C, 0x2F, 0x73, + 0x74, 0x45, 0x76, 0x74, 0x3A, 0x77, 0x68, 0x65, 0x6E, 0x3E, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, + 0x73, 0x6F, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x41, 0x67, 0x65, 0x6E, + 0x74, 0x3E, 0x41, 0x64, 0x6F, 0x62, 0x65, 0x20, 0x50, 0x68, 0x6F, 0x74, + 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x20, 0x43, 0x43, 0x20, 0x32, 0x30, 0x31, + 0x37, 0x20, 0x28, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x29, 0x3C, + 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x73, 0x6F, 0x66, 0x74, 0x77, + 0x61, 0x72, 0x65, 0x41, 0x67, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x3C, 0x2F, 0x72, 0x64, 0x66, 0x3A, 0x6C, 0x69, 0x3E, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x3C, 0x72, 0x64, 0x66, 0x3A, 0x6C, 0x69, 0x20, 0x72, 0x64, + 0x66, 0x3A, 0x70, 0x61, 0x72, 0x73, 0x65, 0x54, 0x79, 0x70, 0x65, 0x3D, + 0x22, 0x52, 0x65, 0x73, 0x6F, 0x75, 0x72, 0x63, 0x65, 0x22, 0x3E, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, + 0x3A, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x73, 0x61, 0x76, 0x65, + 0x64, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x61, 0x63, 0x74, + 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, + 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x69, 0x6E, 0x73, 0x74, 0x61, 0x6E, + 0x63, 0x65, 0x49, 0x44, 0x3E, 0x78, 0x6D, 0x70, 0x2E, 0x69, 0x69, 0x64, + 0x3A, 0x65, 0x66, 0x63, 0x62, 0x65, 0x35, 0x33, 0x30, 0x2D, 0x35, 0x65, + 0x61, 0x36, 0x2D, 0x61, 0x32, 0x34, 0x35, 0x2D, 0x38, 0x32, 0x38, 0x35, + 0x2D, 0x63, 0x35, 0x62, 0x63, 0x64, 0x36, 0x33, 0x61, 0x62, 0x39, 0x66, + 0x39, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x69, 0x6E, 0x73, + 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3E, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x77, 0x68, + 0x65, 0x6E, 0x3E, 0x32, 0x30, 0x31, 0x38, 0x2D, 0x30, 0x34, 0x2D, 0x30, + 0x31, 0x54, 0x32, 0x31, 0x3A, 0x35, 0x39, 0x3A, 0x33, 0x30, 0x2B, 0x30, + 0x38, 0x3A, 0x30, 0x30, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, + 0x77, 0x68, 0x65, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x73, 0x6F, 0x66, 0x74, 0x77, + 0x61, 0x72, 0x65, 0x41, 0x67, 0x65, 0x6E, 0x74, 0x3E, 0x41, 0x64, 0x6F, + 0x62, 0x65, 0x20, 0x50, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, + 0x20, 0x43, 0x43, 0x20, 0x32, 0x30, 0x31, 0x37, 0x20, 0x28, 0x57, 0x69, + 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x29, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, + 0x74, 0x3A, 0x73, 0x6F, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x41, 0x67, + 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, + 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x63, 0x68, 0x61, 0x6E, 0x67, 0x65, + 0x64, 0x3E, 0x2F, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x63, + 0x68, 0x61, 0x6E, 0x67, 0x65, 0x64, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, + 0x2F, 0x72, 0x64, 0x66, 0x3A, 0x6C, 0x69, 0x3E, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x72, + 0x64, 0x66, 0x3A, 0x53, 0x65, 0x71, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x78, 0x6D, 0x70, 0x4D, 0x4D, + 0x3A, 0x48, 0x69, 0x73, 0x74, 0x6F, 0x72, 0x79, 0x3E, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x70, 0x68, 0x6F, 0x74, + 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x3A, 0x44, 0x6F, 0x63, 0x75, 0x6D, 0x65, + 0x6E, 0x74, 0x41, 0x6E, 0x63, 0x65, 0x73, 0x74, 0x6F, 0x72, 0x73, 0x3E, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x3C, 0x72, 0x64, 0x66, 0x3A, 0x42, 0x61, 0x67, 0x3E, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x3C, 0x72, 0x64, 0x66, 0x3A, 0x6C, 0x69, 0x3E, 0x78, 0x6D, + 0x70, 0x2E, 0x64, 0x69, 0x64, 0x3A, 0x39, 0x30, 0x39, 0x62, 0x39, 0x65, + 0x35, 0x32, 0x2D, 0x39, 0x37, 0x62, 0x64, 0x2D, 0x34, 0x32, 0x39, 0x33, + 0x2D, 0x38, 0x30, 0x64, 0x32, 0x2D, 0x31, 0x31, 0x64, 0x65, 0x62, 0x64, + 0x36, 0x61, 0x33, 0x33, 0x65, 0x62, 0x3C, 0x2F, 0x72, 0x64, 0x66, 0x3A, + 0x6C, 0x69, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x72, 0x64, 0x66, 0x3A, 0x42, 0x61, + 0x67, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x3C, 0x2F, 0x70, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x3A, + 0x44, 0x6F, 0x63, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x41, 0x6E, 0x63, 0x65, + 0x73, 0x74, 0x6F, 0x72, 0x73, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3C, 0x70, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, + 0x6F, 0x70, 0x3A, 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x4D, 0x6F, 0x64, 0x65, + 0x3E, 0x33, 0x3C, 0x2F, 0x70, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, + 0x70, 0x3A, 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x4D, 0x6F, 0x64, 0x65, 0x3E, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x70, + 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x3A, 0x49, 0x43, 0x43, + 0x50, 0x72, 0x6F, 0x66, 0x69, 0x6C, 0x65, 0x3E, 0x73, 0x52, 0x47, 0x42, + 0x20, 0x49, 0x45, 0x43, 0x36, 0x31, 0x39, 0x36, 0x36, 0x2D, 0x32, 0x2E, + 0x31, 0x3C, 0x2F, 0x70, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, + 0x3A, 0x49, 0x43, 0x43, 0x50, 0x72, 0x6F, 0x66, 0x69, 0x6C, 0x65, 0x3E, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, + 0x63, 0x3A, 0x66, 0x6F, 0x72, 0x6D, 0x61, 0x74, 0x3E, 0x69, 0x6D, 0x61, + 0x67, 0x65, 0x2F, 0x70, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x63, 0x3A, 0x66, + 0x6F, 0x72, 0x6D, 0x61, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3C, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x4F, 0x72, + 0x69, 0x65, 0x6E, 0x74, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x31, 0x3C, + 0x2F, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x4F, 0x72, 0x69, 0x65, 0x6E, 0x74, + 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3C, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x58, 0x52, + 0x65, 0x73, 0x6F, 0x6C, 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x33, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x2F, 0x31, 0x30, 0x30, 0x30, 0x30, 0x3C, + 0x2F, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x58, 0x52, 0x65, 0x73, 0x6F, 0x6C, + 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3C, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x59, 0x52, + 0x65, 0x73, 0x6F, 0x6C, 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x33, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x2F, 0x31, 0x30, 0x30, 0x30, 0x30, 0x3C, + 0x2F, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x59, 0x52, 0x65, 0x73, 0x6F, 0x6C, + 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3C, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x52, 0x65, + 0x73, 0x6F, 0x6C, 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x55, 0x6E, 0x69, 0x74, + 0x3E, 0x32, 0x3C, 0x2F, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x52, 0x65, 0x73, + 0x6F, 0x6C, 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x55, 0x6E, 0x69, 0x74, 0x3E, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x65, + 0x78, 0x69, 0x66, 0x3A, 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x53, 0x70, 0x61, + 0x63, 0x65, 0x3E, 0x31, 0x3C, 0x2F, 0x65, 0x78, 0x69, 0x66, 0x3A, 0x43, + 0x6F, 0x6C, 0x6F, 0x72, 0x53, 0x70, 0x61, 0x63, 0x65, 0x3E, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x65, 0x78, 0x69, + 0x66, 0x3A, 0x50, 0x69, 0x78, 0x65, 0x6C, 0x58, 0x44, 0x69, 0x6D, 0x65, + 0x6E, 0x73, 0x69, 0x6F, 0x6E, 0x3E, 0x31, 0x32, 0x30, 0x3C, 0x2F, 0x65, + 0x78, 0x69, 0x66, 0x3A, 0x50, 0x69, 0x78, 0x65, 0x6C, 0x58, 0x44, 0x69, + 0x6D, 0x65, 0x6E, 0x73, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x65, 0x78, 0x69, 0x66, 0x3A, + 0x50, 0x69, 0x78, 0x65, 0x6C, 0x59, 0x44, 0x69, 0x6D, 0x65, 0x6E, 0x73, + 0x69, 0x6F, 0x6E, 0x3E, 0x31, 0x32, 0x30, 0x3C, 0x2F, 0x65, 0x78, 0x69, + 0x66, 0x3A, 0x50, 0x69, 0x78, 0x65, 0x6C, 0x59, 0x44, 0x69, 0x6D, 0x65, + 0x6E, 0x73, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x3C, 0x2F, 0x72, 0x64, 0x66, 0x3A, 0x44, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x3C, + 0x2F, 0x72, 0x64, 0x66, 0x3A, 0x52, 0x44, 0x46, 0x3E, 0x0A, 0x3C, 0x2F, + 0x78, 0x3A, 0x78, 0x6D, 0x70, 0x6D, 0x65, 0x74, 0x61, 0x3E, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x3C, + 0x3F, 0x78, 0x70, 0x61, 0x63, 0x6B, 0x65, 0x74, 0x20, 0x65, 0x6E, 0x64, + 0x3D, 0x22, 0x77, 0x22, 0x3F, 0x3E, 0xB3, 0x93, 0x52, 0x50, 0x00, 0x00, + 0x00, 0x20, 0x63, 0x48, 0x52, 0x4D, 0x00, 0x00, 0x7A, 0x25, 0x00, 0x00, + 0x80, 0x83, 0x00, 0x00, 0xF9, 0xFF, 0x00, 0x00, 0x80, 0xE9, 0x00, 0x00, + 0x75, 0x30, 0x00, 0x00, 0xEA, 0x60, 0x00, 0x00, 0x3A, 0x98, 0x00, 0x00, + 0x17, 0x6F, 0x92, 0x5F, 0xC5, 0x46, 0x00, 0x00, 0x05, 0xFC, 0x49, 0x44, + 0x41, 0x54, 0x78, 0xDA, 0xEC, 0x9D, 0x6B, 0x88, 0x94, 0x55, 0x18, 0xC7, + 0x7F, 0xB3, 0xAB, 0x6B, 0xA9, 0xD9, 0x62, 0xBA, 0x56, 0xBB, 0x62, 0x94, + 0x90, 0xD9, 0x05, 0xB5, 0x48, 0x4B, 0x14, 0xBB, 0x80, 0x5D, 0xB4, 0xD8, + 0xAF, 0xF5, 0xA1, 0x02, 0x23, 0xB0, 0x08, 0xA2, 0x0F, 0x51, 0x51, 0x1F, + 0xBA, 0x10, 0xA5, 0x11, 0x14, 0x51, 0x54, 0xC2, 0x16, 0x11, 0x44, 0xD1, + 0xE5, 0x43, 0x45, 0x37, 0x37, 0x8C, 0xCC, 0xB2, 0x02, 0xD3, 0xC8, 0x56, + 0xB0, 0xA2, 0xD6, 0x75, 0x6D, 0xD5, 0x35, 0x37, 0xDB, 0xD5, 0xD9, 0x99, + 0x3E, 0x3C, 0xCF, 0xA0, 0x81, 0xF3, 0x9E, 0x33, 0x7B, 0x19, 0xDF, 0x77, + 0xF6, 0xFF, 0x83, 0x61, 0x84, 0x79, 0x77, 0xDE, 0x71, 0x7E, 0xEF, 0x39, + 0xE7, 0x39, 0xCF, 0x7B, 0xCE, 0x33, 0xB9, 0x62, 0xB1, 0x88, 0xA8, 0x5D, + 0xEA, 0xF4, 0x15, 0x48, 0xB0, 0x90, 0x60, 0x21, 0xC1, 0x42, 0x82, 0x85, + 0x04, 0x0B, 0x09, 0x16, 0x12, 0x2C, 0xC1, 0x42, 0x82, 0x85, 0x04, 0x0B, + 0x09, 0x16, 0x12, 0x2C, 0x24, 0x58, 0x48, 0xB0, 0x04, 0x0B, 0x09, 0x16, + 0x12, 0x2C, 0x24, 0x58, 0x48, 0xB0, 0x90, 0x60, 0x21, 0xC1, 0x42, 0x82, + 0x25, 0x58, 0x48, 0xB0, 0x90, 0x60, 0x21, 0xC1, 0x42, 0x82, 0x85, 0x04, + 0x0B, 0x09, 0x96, 0x60, 0x51, 0x4B, 0x8C, 0xAB, 0xF0, 0xF8, 0x1C, 0x30, + 0x03, 0xC8, 0x03, 0x3D, 0xC3, 0x38, 0xEF, 0x49, 0xC0, 0xE9, 0xC0, 0x78, + 0xA0, 0x50, 0xE3, 0xDF, 0xF1, 0x61, 0xE0, 0x90, 0x3F, 0xFA, 0x81, 0x62, + 0x5A, 0x05, 0xCF, 0x05, 0x2E, 0x02, 0x16, 0xFA, 0x07, 0xDD, 0x08, 0x7C, + 0x07, 0x74, 0x55, 0x78, 0xCE, 0x8B, 0x81, 0x45, 0xC0, 0x7C, 0xA0, 0xA1, + 0x86, 0x05, 0xE7, 0x5C, 0xE6, 0xBF, 0xC0, 0x3E, 0xA0, 0x13, 0xD8, 0x0D, + 0xF4, 0xF9, 0xF3, 0x4E, 0x97, 0x3E, 0xAA, 0xFF, 0xFF, 0x5C, 0xE4, 0x0E, + 0xFF, 0xF9, 0xC0, 0x83, 0xC0, 0x02, 0x6F, 0x79, 0x83, 0xC0, 0x1F, 0xC0, + 0x27, 0xC0, 0x5A, 0xE0, 0xCF, 0xC8, 0xF3, 0x2D, 0x01, 0x1E, 0x00, 0xE6, + 0x01, 0xD3, 0xFC, 0x4B, 0xA8, 0x75, 0x06, 0x81, 0x01, 0xE0, 0x1F, 0xE0, + 0x6F, 0x17, 0xFE, 0x3B, 0xB0, 0xC9, 0x25, 0xFF, 0xEC, 0xCF, 0x7D, 0x27, + 0x4A, 0x70, 0x33, 0xF0, 0x1C, 0xD0, 0x7A, 0x9C, 0xD7, 0xFA, 0x81, 0x67, + 0x81, 0xFB, 0x22, 0xCE, 0x35, 0x0B, 0x68, 0x03, 0x96, 0x69, 0x64, 0x04, + 0x97, 0xBD, 0x17, 0xF8, 0xD1, 0x65, 0x6F, 0x06, 0xBE, 0x07, 0x7A, 0xAB, + 0x2D, 0xB8, 0x15, 0x78, 0x0B, 0xA8, 0x2F, 0xF3, 0xFA, 0x5E, 0xE0, 0x72, + 0xA0, 0x23, 0xF0, 0x3E, 0xB7, 0x03, 0x2F, 0xC9, 0xEB, 0x71, 0xE9, 0x05, + 0xB6, 0x03, 0x1F, 0x03, 0x9F, 0xBB, 0xE8, 0x43, 0xD5, 0x8A, 0xA2, 0xCF, + 0x4D, 0x90, 0x0B, 0x70, 0x1A, 0xB0, 0x32, 0xE2, 0x3C, 0x0B, 0xE5, 0xB1, + 0x2C, 0x8D, 0x1E, 0x97, 0xDC, 0x03, 0x3C, 0x06, 0xAC, 0x02, 0x66, 0x56, + 0x2B, 0xC8, 0x9A, 0x18, 0x78, 0xBD, 0xE8, 0x01, 0x58, 0x48, 0xF0, 0x14, + 0x3F, 0x36, 0x27, 0x9F, 0x65, 0x99, 0x02, 0x2C, 0x05, 0xE6, 0xF8, 0x77, + 0xBA, 0xCE, 0x5B, 0x73, 0x61, 0x34, 0x5B, 0xF0, 0x60, 0xE0, 0xF5, 0x82, + 0x4F, 0x05, 0x42, 0x1C, 0x91, 0xBF, 0x68, 0x9A, 0x80, 0xDB, 0x80, 0x47, + 0x81, 0x1B, 0x80, 0x09, 0xA3, 0xD5, 0x82, 0x73, 0x91, 0x57, 0xCF, 0x40, + 0xC4, 0x31, 0x05, 0x79, 0xAB, 0x88, 0x06, 0x60, 0xB9, 0x07, 0xB9, 0x53, + 0x81, 0x37, 0x3C, 0xA8, 0x1D, 0xD5, 0x44, 0x47, 0xD2, 0x85, 0x10, 0xEA, + 0xC6, 0x89, 0xE8, 0xA2, 0x4B, 0x53, 0x89, 0x5A, 0xE8, 0xC6, 0x8B, 0x1E, + 0xBB, 0x34, 0x78, 0x4F, 0x39, 0x61, 0x88, 0x2D, 0xF1, 0x02, 0xE0, 0x61, + 0x6F, 0x20, 0xAF, 0x63, 0x49, 0xA6, 0xAA, 0x0B, 0x1E, 0x29, 0x36, 0x00, + 0x1F, 0xF8, 0xE7, 0xCA, 0xD5, 0x80, 0xE0, 0x06, 0xE0, 0x14, 0x7F, 0x6E, + 0x04, 0xCE, 0x07, 0xCE, 0xF4, 0x5C, 0xC2, 0xC4, 0x0A, 0xDE, 0x6B, 0x96, + 0xE7, 0x21, 0x7A, 0x81, 0xF7, 0xB2, 0x2C, 0x78, 0x23, 0xF0, 0x8A, 0x5F, + 0xF9, 0xB5, 0x20, 0xB8, 0x0E, 0x4B, 0xC7, 0xD6, 0x7B, 0xEB, 0x3D, 0x07, + 0x38, 0x1B, 0x4B, 0xF4, 0x2C, 0x72, 0xE1, 0x93, 0x23, 0xDF, 0x6F, 0x36, + 0xF0, 0x10, 0x96, 0x11, 0xDB, 0x9C, 0x55, 0xC1, 0xF9, 0xC8, 0xF1, 0x3C, + 0xAB, 0x74, 0xFA, 0x45, 0xFC, 0xA1, 0xCB, 0xBD, 0x16, 0xB8, 0xCE, 0x23, + 0xE6, 0x98, 0x0B, 0x7A, 0x01, 0x96, 0x09, 0x5C, 0x4D, 0x64, 0x8A, 0x38, + 0x6D, 0x82, 0x27, 0x8D, 0x81, 0xE0, 0x29, 0x0F, 0xEC, 0xF1, 0xC7, 0x56, + 0x2C, 0x8B, 0x75, 0x93, 0x8B, 0x3E, 0x39, 0xE2, 0xEF, 0x57, 0x60, 0xF7, + 0x00, 0x9E, 0x8C, 0x19, 0x8F, 0x75, 0xBB, 0xF0, 0xC4, 0xD2, 0x03, 0xBC, + 0xE3, 0xE3, 0x6B, 0x1B, 0x71, 0xF9, 0xE8, 0x71, 0xC0, 0x1D, 0xC0, 0xA5, + 0x23, 0x35, 0x0F, 0xAE, 0xF6, 0xB8, 0x35, 0x16, 0xF9, 0x05, 0xCB, 0x60, + 0xBD, 0x10, 0x29, 0x79, 0x26, 0x70, 0x67, 0x4C, 0xA0, 0xA6, 0x16, 0x9C, + 0x1E, 0x76, 0x01, 0x6B, 0x3C, 0xC8, 0x8C, 0x49, 0x0A, 0xDD, 0x88, 0xDD, + 0x03, 0x90, 0xE0, 0x0C, 0xF1, 0x17, 0xF0, 0x94, 0x4F, 0x15, 0x63, 0xE2, + 0x95, 0x5B, 0x7D, 0x0A, 0x26, 0xC1, 0x19, 0xA2, 0x0B, 0x78, 0x02, 0xF8, + 0x2D, 0xE2, 0xD8, 0x95, 0xC0, 0x79, 0x12, 0x9C, 0x3D, 0xBE, 0xF5, 0xAE, + 0x3A, 0x14, 0x93, 0x4C, 0x01, 0xAE, 0x4F, 0x9A, 0x0D, 0x49, 0x70, 0x7A, + 0x69, 0x03, 0x76, 0x44, 0x1C, 0xB7, 0x3C, 0x69, 0x7A, 0x25, 0xC1, 0xE9, + 0xA5, 0x13, 0x78, 0x33, 0x62, 0xAE, 0x3B, 0x17, 0x4B, 0x65, 0x4A, 0x70, + 0x06, 0x79, 0x9B, 0xF0, 0x12, 0x9E, 0xA9, 0x58, 0x86, 0x2B, 0x27, 0xC1, + 0xD9, 0x63, 0x07, 0xB6, 0x94, 0x27, 0x14, 0x47, 0xCD, 0xA6, 0xCC, 0xAA, + 0x1B, 0x09, 0x4E, 0x37, 0x87, 0xB1, 0x3B, 0x6C, 0x21, 0x9A, 0xCA, 0xB9, + 0x94, 0xE0, 0x74, 0x53, 0x00, 0xBE, 0x21, 0xBC, 0x58, 0xA2, 0x89, 0x32, + 0xF7, 0x9A, 0x25, 0x38, 0xDD, 0x14, 0x81, 0x6E, 0xC2, 0x99, 0xAD, 0xE9, + 0x94, 0x49, 0x5B, 0x4A, 0x70, 0x36, 0x5A, 0x71, 0x28, 0x92, 0x9E, 0x84, + 0xDD, 0x77, 0x96, 0xE0, 0x0C, 0x52, 0xDA, 0x02, 0x93, 0x44, 0xBD, 0xC6, + 0xE0, 0xEC, 0x92, 0x27, 0x79, 0x5D, 0x3A, 0xDE, 0x85, 0x17, 0x24, 0x38, + 0x9B, 0x4C, 0x20, 0xBC, 0x30, 0x63, 0x3F, 0x65, 0x76, 0x42, 0x48, 0x70, + 0xBA, 0xA9, 0xC3, 0x32, 0x55, 0x21, 0xC1, 0xDD, 0xD8, 0xA6, 0x36, 0x09, + 0xCE, 0x20, 0x57, 0x11, 0x5E, 0xAF, 0xB5, 0xAF, 0x5C, 0x20, 0x26, 0xC1, + 0xE9, 0xA6, 0x11, 0xB8, 0x24, 0xE2, 0xB8, 0x4E, 0x8D, 0xC1, 0xD9, 0x64, + 0x29, 0xB6, 0xB3, 0x21, 0x89, 0x7E, 0x60, 0x8B, 0x04, 0x67, 0x8F, 0x71, + 0xD8, 0x6A, 0xCB, 0xD0, 0xBA, 0xAB, 0x2E, 0x60, 0x5B, 0xB9, 0xA9, 0x94, + 0x04, 0xA7, 0x97, 0x25, 0xC0, 0x95, 0x11, 0xC7, 0x7D, 0x4D, 0x42, 0xBD, + 0x14, 0x09, 0x4E, 0xEF, 0xD8, 0x7B, 0x37, 0xB6, 0xF7, 0x3A, 0xC4, 0xBB, + 0x24, 0x6C, 0x16, 0x90, 0xE0, 0x74, 0x72, 0x0B, 0x70, 0x4D, 0xC4, 0x71, + 0x5B, 0x81, 0xAF, 0x48, 0xC8, 0x74, 0x49, 0x70, 0xFA, 0xB8, 0x1A, 0xB8, + 0x0B, 0x2B, 0x35, 0x15, 0xE2, 0x35, 0x9F, 0x03, 0x23, 0xC1, 0xD9, 0x60, + 0x19, 0xF0, 0x08, 0x76, 0x03, 0x3F, 0xC4, 0x4F, 0xDE, 0x3D, 0x17, 0x42, + 0x91, 0x9A, 0x38, 0xF1, 0x34, 0x78, 0xCB, 0xBD, 0x1F, 0xB8, 0x2C, 0xE2, + 0xF8, 0x22, 0xF0, 0x22, 0xF0, 0x6B, 0x4C, 0x28, 0x9E, 0x26, 0xEA, 0xC7, + 0xA0, 0xDC, 0x66, 0x6C, 0x43, 0xD9, 0x2A, 0xE2, 0x92, 0x1A, 0x00, 0xEB, + 0xB1, 0xCA, 0x47, 0x85, 0xAC, 0x09, 0x1E, 0x4B, 0x75, 0x3C, 0xA6, 0xBB, + 0xD0, 0x56, 0x6C, 0x1B, 0x69, 0x4B, 0xE4, 0xDF, 0x75, 0x62, 0xBB, 0x1F, + 0xBA, 0x63, 0x27, 0xD3, 0x69, 0x62, 0x7F, 0x8D, 0x4B, 0x9D, 0xEA, 0x53, + 0xA0, 0x79, 0xC0, 0x62, 0xE0, 0x0A, 0xEC, 0x66, 0x42, 0x6C, 0x69, 0x87, + 0x3E, 0xE0, 0x69, 0xA0, 0x3D, 0xF6, 0x84, 0x69, 0x13, 0xDC, 0x02, 0x5C, + 0xE8, 0xFF, 0xAE, 0x95, 0x72, 0x4B, 0x75, 0x1E, 0x11, 0xB7, 0xB8, 0xD8, + 0xB3, 0xFC, 0x79, 0x16, 0xF1, 0xBB, 0xFB, 0xC1, 0xAA, 0x1D, 0xAD, 0xF3, + 0xC7, 0x91, 0xAC, 0x0A, 0x5E, 0x41, 0x60, 0xAF, 0x4D, 0x06, 0xA9, 0x77, + 0xC1, 0x33, 0xB0, 0xFA, 0x1C, 0x13, 0x29, 0xB3, 0xBC, 0x26, 0x81, 0x02, + 0xB6, 0x08, 0x7E, 0x2D, 0x56, 0xA4, 0x86, 0xAC, 0x0A, 0x9E, 0xE3, 0x0F, + 0x71, 0x94, 0x7E, 0x6C, 0x01, 0xFC, 0xE3, 0xC4, 0x17, 0x7D, 0x8D, 0x16, + 0x3C, 0x52, 0xDD, 0x64, 0xEE, 0x98, 0x87, 0x88, 0xA7, 0x07, 0xAB, 0x8F, + 0xF5, 0x3C, 0xE1, 0x5A, 0xA0, 0x43, 0x6E, 0xC1, 0xA1, 0xEE, 0xA4, 0x9E, + 0xB8, 0xDA, 0x1A, 0xE3, 0xE5, 0xAB, 0x22, 0x3A, 0x80, 0x97, 0x5D, 0xF0, + 0xAE, 0xA1, 0xBE, 0x49, 0x48, 0x70, 0x91, 0xF0, 0x92, 0xCD, 0x41, 0xC2, + 0x65, 0x07, 0x0A, 0x84, 0x4B, 0x22, 0x8A, 0xA3, 0x33, 0x89, 0x0D, 0xC0, + 0xAB, 0xC0, 0xA7, 0x0C, 0xB3, 0x8E, 0x74, 0x8C, 0xE0, 0xDD, 0x11, 0x82, + 0x3F, 0x8B, 0x10, 0xBC, 0x53, 0x5D, 0x74, 0x70, 0x0A, 0xB4, 0x15, 0x78, + 0x1F, 0xF8, 0x08, 0xBB, 0xC7, 0x3B, 0xEC, 0xF2, 0x8F, 0x31, 0x5D, 0xF4, + 0x36, 0xEC, 0xA6, 0xF2, 0x19, 0x09, 0xAF, 0x7F, 0x11, 0xF1, 0x3E, 0xED, + 0x58, 0x12, 0xFD, 0x54, 0xB9, 0xFC, 0xDF, 0x85, 0xBF, 0x07, 0xDB, 0x60, + 0xB6, 0xDE, 0x5B, 0xEE, 0x0F, 0xC0, 0xC1, 0x91, 0x3A, 0x41, 0xAC, 0xE0, + 0x67, 0x80, 0x7B, 0xB1, 0x32, 0xFC, 0xA5, 0x74, 0xE2, 0x11, 0xAC, 0x34, + 0xFD, 0x9A, 0xC8, 0x6E, 0x64, 0x13, 0x56, 0x39, 0x7E, 0xB5, 0x4F, 0xF8, + 0xC7, 0x22, 0xA5, 0xF2, 0xFE, 0x3D, 0x3E, 0xAE, 0x6E, 0x07, 0xBE, 0xC4, + 0xAA, 0xBE, 0x77, 0x54, 0x3A, 0x05, 0x8A, 0x8A, 0x6E, 0x23, 0x7F, 0xB3, + 0xA1, 0x11, 0xB8, 0x19, 0xFB, 0xED, 0x86, 0x19, 0xC7, 0x7C, 0xC8, 0x76, + 0xAC, 0x76, 0x62, 0x6C, 0x75, 0xBA, 0x69, 0x58, 0xE1, 0x90, 0xC5, 0x3E, + 0xE1, 0xAF, 0xE5, 0x1F, 0xE5, 0x28, 0x71, 0x18, 0x38, 0x80, 0x55, 0xC6, + 0x3F, 0xE0, 0x63, 0xEC, 0x16, 0x1F, 0xB2, 0xBA, 0xB0, 0xDF, 0xBE, 0xC8, + 0x8F, 0xD6, 0xC9, 0x63, 0x05, 0x83, 0x95, 0x09, 0x68, 0xC2, 0xEA, 0x42, + 0x94, 0x02, 0xAB, 0xCE, 0x21, 0x04, 0x4F, 0x93, 0xB1, 0x2C, 0x4E, 0xF3, + 0x18, 0x11, 0x3C, 0xE0, 0x5D, 0xEE, 0x41, 0x6C, 0x71, 0x7A, 0xE9, 0x57, + 0x58, 0xF2, 0xD5, 0x38, 0x79, 0x25, 0x82, 0x45, 0x06, 0xD1, 0x0D, 0x7F, + 0x09, 0x16, 0x12, 0x2C, 0x24, 0x58, 0x48, 0xB0, 0x90, 0x60, 0x21, 0xC1, + 0x42, 0x82, 0x25, 0x58, 0x48, 0xB0, 0x90, 0x60, 0x21, 0xC1, 0x42, 0x82, + 0x85, 0x04, 0x0B, 0x09, 0x96, 0x60, 0x21, 0xC1, 0x42, 0x82, 0x85, 0x04, + 0x0B, 0x09, 0x16, 0x12, 0x2C, 0x24, 0x58, 0x48, 0xB0, 0x04, 0x0B, 0x09, + 0x16, 0x12, 0x2C, 0x24, 0x58, 0x48, 0xB0, 0x90, 0x60, 0x21, 0xC1, 0x12, + 0x2C, 0x6A, 0x8A, 0xFF, 0x06, 0x00, 0x0E, 0x16, 0x36, 0x06, 0x65, 0x03, + 0x35, 0x24, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4E, 0x44, 0xAE, 0x42, + 0x60, 0x82 +}; +} +static unsigned char* rage_icon = raw::rage; +} \ No newline at end of file diff --git a/cheat/gmod/icons/visuals.hpp b/cheat/gmod/icons/visuals.hpp new file mode 100644 index 0000000..8ee4589 --- /dev/null +++ b/cheat/gmod/icons/visuals.hpp @@ -0,0 +1,1837 @@ +/* E:\Users\admin\Desktop\stuff\icons\visuals.png (4/1/2018 10:00:00 PM) + StartOffset: 00000000, EndOffset: 00005593, Length: 00005594 */ + +namespace icons { +constexpr static size_t visuals_size = 21908; +namespace raw { +static unsigned char visuals[21908] = { + 0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A, 0x00, 0x00, 0x00, 0x0D, + 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x78, + 0x08, 0x06, 0x00, 0x00, 0x00, 0x39, 0x64, 0x36, 0xD2, 0x00, 0x00, 0x00, + 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x2E, 0x23, 0x00, 0x00, 0x2E, + 0x23, 0x01, 0x78, 0xA5, 0x3F, 0x76, 0x00, 0x00, 0x0A, 0x4F, 0x69, 0x43, + 0x43, 0x50, 0x50, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x20, + 0x49, 0x43, 0x43, 0x20, 0x70, 0x72, 0x6F, 0x66, 0x69, 0x6C, 0x65, 0x00, + 0x00, 0x78, 0xDA, 0x9D, 0x53, 0x67, 0x54, 0x53, 0xE9, 0x16, 0x3D, 0xF7, + 0xDE, 0xF4, 0x42, 0x4B, 0x88, 0x80, 0x94, 0x4B, 0x6F, 0x52, 0x15, 0x08, + 0x20, 0x52, 0x42, 0x8B, 0x80, 0x14, 0x91, 0x26, 0x2A, 0x21, 0x09, 0x10, + 0x4A, 0x88, 0x21, 0xA1, 0xD9, 0x15, 0x51, 0xC1, 0x11, 0x45, 0x45, 0x04, + 0x1B, 0xC8, 0xA0, 0x88, 0x03, 0x8E, 0x8E, 0x80, 0x8C, 0x15, 0x51, 0x2C, + 0x0C, 0x8A, 0x0A, 0xD8, 0x07, 0xE4, 0x21, 0xA2, 0x8E, 0x83, 0xA3, 0x88, + 0x8A, 0xCA, 0xFB, 0xE1, 0x7B, 0xA3, 0x6B, 0xD6, 0xBC, 0xF7, 0xE6, 0xCD, + 0xFE, 0xB5, 0xD7, 0x3E, 0xE7, 0xAC, 0xF3, 0x9D, 0xB3, 0xCF, 0x07, 0xC0, + 0x08, 0x0C, 0x96, 0x48, 0x33, 0x51, 0x35, 0x80, 0x0C, 0xA9, 0x42, 0x1E, + 0x11, 0xE0, 0x83, 0xC7, 0xC4, 0xC6, 0xE1, 0xE4, 0x2E, 0x40, 0x81, 0x0A, + 0x24, 0x70, 0x00, 0x10, 0x08, 0xB3, 0x64, 0x21, 0x73, 0xFD, 0x23, 0x01, + 0x00, 0xF8, 0x7E, 0x3C, 0x3C, 0x2B, 0x22, 0xC0, 0x07, 0xBE, 0x00, 0x01, + 0x78, 0xD3, 0x0B, 0x08, 0x00, 0xC0, 0x4D, 0x9B, 0xC0, 0x30, 0x1C, 0x87, + 0xFF, 0x0F, 0xEA, 0x42, 0x99, 0x5C, 0x01, 0x80, 0x84, 0x01, 0xC0, 0x74, + 0x91, 0x38, 0x4B, 0x08, 0x80, 0x14, 0x00, 0x40, 0x7A, 0x8E, 0x42, 0xA6, + 0x00, 0x40, 0x46, 0x01, 0x80, 0x9D, 0x98, 0x26, 0x53, 0x00, 0xA0, 0x04, + 0x00, 0x60, 0xCB, 0x63, 0x62, 0xE3, 0x00, 0x50, 0x2D, 0x00, 0x60, 0x27, + 0x7F, 0xE6, 0xD3, 0x00, 0x80, 0x9D, 0xF8, 0x99, 0x7B, 0x01, 0x00, 0x5B, + 0x94, 0x21, 0x15, 0x01, 0xA0, 0x91, 0x00, 0x20, 0x13, 0x65, 0x88, 0x44, + 0x00, 0x68, 0x3B, 0x00, 0xAC, 0xCF, 0x56, 0x8A, 0x45, 0x00, 0x58, 0x30, + 0x00, 0x14, 0x66, 0x4B, 0xC4, 0x39, 0x00, 0xD8, 0x2D, 0x00, 0x30, 0x49, + 0x57, 0x66, 0x48, 0x00, 0xB0, 0xB7, 0x00, 0xC0, 0xCE, 0x10, 0x0B, 0xB2, + 0x00, 0x08, 0x0C, 0x00, 0x30, 0x51, 0x88, 0x85, 0x29, 0x00, 0x04, 0x7B, + 0x00, 0x60, 0xC8, 0x23, 0x23, 0x78, 0x00, 0x84, 0x99, 0x00, 0x14, 0x46, + 0xF2, 0x57, 0x3C, 0xF1, 0x2B, 0xAE, 0x10, 0xE7, 0x2A, 0x00, 0x00, 0x78, + 0x99, 0xB2, 0x3C, 0xB9, 0x24, 0x39, 0x45, 0x81, 0x5B, 0x08, 0x2D, 0x71, + 0x07, 0x57, 0x57, 0x2E, 0x1E, 0x28, 0xCE, 0x49, 0x17, 0x2B, 0x14, 0x36, + 0x61, 0x02, 0x61, 0x9A, 0x40, 0x2E, 0xC2, 0x79, 0x99, 0x19, 0x32, 0x81, + 0x34, 0x0F, 0xE0, 0xF3, 0xCC, 0x00, 0x00, 0xA0, 0x91, 0x15, 0x11, 0xE0, + 0x83, 0xF3, 0xFD, 0x78, 0xCE, 0x0E, 0xAE, 0xCE, 0xCE, 0x36, 0x8E, 0xB6, + 0x0E, 0x5F, 0x2D, 0xEA, 0xBF, 0x06, 0xFF, 0x22, 0x62, 0x62, 0xE3, 0xFE, + 0xE5, 0xCF, 0xAB, 0x70, 0x40, 0x00, 0x00, 0xE1, 0x74, 0x7E, 0xD1, 0xFE, + 0x2C, 0x2F, 0xB3, 0x1A, 0x80, 0x3B, 0x06, 0x80, 0x6D, 0xFE, 0xA2, 0x25, + 0xEE, 0x04, 0x68, 0x5E, 0x0B, 0xA0, 0x75, 0xF7, 0x8B, 0x66, 0xB2, 0x0F, + 0x40, 0xB5, 0x00, 0xA0, 0xE9, 0xDA, 0x57, 0xF3, 0x70, 0xF8, 0x7E, 0x3C, + 0x3C, 0x45, 0xA1, 0x90, 0xB9, 0xD9, 0xD9, 0xE5, 0xE4, 0xE4, 0xD8, 0x4A, + 0xC4, 0x42, 0x5B, 0x61, 0xCA, 0x57, 0x7D, 0xFE, 0x67, 0xC2, 0x5F, 0xC0, + 0x57, 0xFD, 0x6C, 0xF9, 0x7E, 0x3C, 0xFC, 0xF7, 0xF5, 0xE0, 0xBE, 0xE2, + 0x24, 0x81, 0x32, 0x5D, 0x81, 0x47, 0x04, 0xF8, 0xE0, 0xC2, 0xCC, 0xF4, + 0x4C, 0xA5, 0x1C, 0xCF, 0x92, 0x09, 0x84, 0x62, 0xDC, 0xE6, 0x8F, 0x47, + 0xFC, 0xB7, 0x0B, 0xFF, 0xFC, 0x1D, 0xD3, 0x22, 0xC4, 0x49, 0x62, 0xB9, + 0x58, 0x2A, 0x14, 0xE3, 0x51, 0x12, 0x71, 0x8E, 0x44, 0x9A, 0x8C, 0xF3, + 0x32, 0xA5, 0x22, 0x89, 0x42, 0x92, 0x29, 0xC5, 0x25, 0xD2, 0xFF, 0x64, + 0xE2, 0xDF, 0x2C, 0xFB, 0x03, 0x3E, 0xDF, 0x35, 0x00, 0xB0, 0x6A, 0x3E, + 0x01, 0x7B, 0x91, 0x2D, 0xA8, 0x5D, 0x63, 0x03, 0xF6, 0x4B, 0x27, 0x10, + 0x58, 0x74, 0xC0, 0xE2, 0xF7, 0x00, 0x00, 0xF2, 0xBB, 0x6F, 0xC1, 0xD4, + 0x28, 0x08, 0x03, 0x80, 0x68, 0x83, 0xE1, 0xCF, 0x77, 0xFF, 0xEF, 0x3F, + 0xFD, 0x47, 0xA0, 0x25, 0x00, 0x80, 0x66, 0x49, 0x92, 0x71, 0x00, 0x00, + 0x5E, 0x44, 0x24, 0x2E, 0x54, 0xCA, 0xB3, 0x3F, 0xC7, 0x08, 0x00, 0x00, + 0x44, 0xA0, 0x81, 0x2A, 0xB0, 0x41, 0x1B, 0xF4, 0xC1, 0x18, 0x2C, 0xC0, + 0x06, 0x1C, 0xC1, 0x05, 0xDC, 0xC1, 0x0B, 0xFC, 0x60, 0x36, 0x84, 0x42, + 0x24, 0xC4, 0xC2, 0x42, 0x10, 0x42, 0x0A, 0x64, 0x80, 0x1C, 0x72, 0x60, + 0x29, 0xAC, 0x82, 0x42, 0x28, 0x86, 0xCD, 0xB0, 0x1D, 0x2A, 0x60, 0x2F, + 0xD4, 0x40, 0x1D, 0x34, 0xC0, 0x51, 0x68, 0x86, 0x93, 0x70, 0x0E, 0x2E, + 0xC2, 0x55, 0xB8, 0x0E, 0x3D, 0x70, 0x0F, 0xFA, 0x61, 0x08, 0x9E, 0xC1, + 0x28, 0xBC, 0x81, 0x09, 0x04, 0x41, 0xC8, 0x08, 0x13, 0x61, 0x21, 0xDA, + 0x88, 0x01, 0x62, 0x8A, 0x58, 0x23, 0x8E, 0x08, 0x17, 0x99, 0x85, 0xF8, + 0x21, 0xC1, 0x48, 0x04, 0x12, 0x8B, 0x24, 0x20, 0xC9, 0x88, 0x14, 0x51, + 0x22, 0x4B, 0x91, 0x35, 0x48, 0x31, 0x52, 0x8A, 0x54, 0x20, 0x55, 0x48, + 0x1D, 0xF2, 0x3D, 0x72, 0x02, 0x39, 0x87, 0x5C, 0x46, 0xBA, 0x91, 0x3B, + 0xC8, 0x00, 0x32, 0x82, 0xFC, 0x86, 0xBC, 0x47, 0x31, 0x94, 0x81, 0xB2, + 0x51, 0x3D, 0xD4, 0x0C, 0xB5, 0x43, 0xB9, 0xA8, 0x37, 0x1A, 0x84, 0x46, + 0xA2, 0x0B, 0xD0, 0x64, 0x74, 0x31, 0x9A, 0x8F, 0x16, 0xA0, 0x9B, 0xD0, + 0x72, 0xB4, 0x1A, 0x3D, 0x8C, 0x36, 0xA1, 0xE7, 0xD0, 0xAB, 0x68, 0x0F, + 0xDA, 0x8F, 0x3E, 0x43, 0xC7, 0x30, 0xC0, 0xE8, 0x18, 0x07, 0x33, 0xC4, + 0x6C, 0x30, 0x2E, 0xC6, 0xC3, 0x42, 0xB1, 0x38, 0x2C, 0x09, 0x93, 0x63, + 0xCB, 0xB1, 0x22, 0xAC, 0x0C, 0xAB, 0xC6, 0x1A, 0xB0, 0x56, 0xAC, 0x03, + 0xBB, 0x89, 0xF5, 0x63, 0xCF, 0xB1, 0x77, 0x04, 0x12, 0x81, 0x45, 0xC0, + 0x09, 0x36, 0x04, 0x77, 0x42, 0x20, 0x61, 0x1E, 0x41, 0x48, 0x58, 0x4C, + 0x58, 0x4E, 0xD8, 0x48, 0xA8, 0x20, 0x1C, 0x24, 0x34, 0x11, 0xDA, 0x09, + 0x37, 0x09, 0x03, 0x84, 0x51, 0xC2, 0x27, 0x22, 0x93, 0xA8, 0x4B, 0xB4, + 0x26, 0xBA, 0x11, 0xF9, 0xC4, 0x18, 0x62, 0x32, 0x31, 0x87, 0x58, 0x48, + 0x2C, 0x23, 0xD6, 0x12, 0x8F, 0x13, 0x2F, 0x10, 0x7B, 0x88, 0x43, 0xC4, + 0x37, 0x24, 0x12, 0x89, 0x43, 0x32, 0x27, 0xB9, 0x90, 0x02, 0x49, 0xB1, + 0xA4, 0x54, 0xD2, 0x12, 0xD2, 0x46, 0xD2, 0x6E, 0x52, 0x23, 0xE9, 0x2C, + 0xA9, 0x9B, 0x34, 0x48, 0x1A, 0x23, 0x93, 0xC9, 0xDA, 0x64, 0x6B, 0xB2, + 0x07, 0x39, 0x94, 0x2C, 0x20, 0x2B, 0xC8, 0x85, 0xE4, 0x9D, 0xE4, 0xC3, + 0xE4, 0x33, 0xE4, 0x1B, 0xE4, 0x21, 0xF2, 0x5B, 0x0A, 0x9D, 0x62, 0x40, + 0x71, 0xA4, 0xF8, 0x53, 0xE2, 0x28, 0x52, 0xCA, 0x6A, 0x4A, 0x19, 0xE5, + 0x10, 0xE5, 0x34, 0xE5, 0x06, 0x65, 0x98, 0x32, 0x41, 0x55, 0xA3, 0x9A, + 0x52, 0xDD, 0xA8, 0xA1, 0x54, 0x11, 0x35, 0x8F, 0x5A, 0x42, 0xAD, 0xA1, + 0xB6, 0x52, 0xAF, 0x51, 0x87, 0xA8, 0x13, 0x34, 0x75, 0x9A, 0x39, 0xCD, + 0x83, 0x16, 0x49, 0x4B, 0xA5, 0xAD, 0xA2, 0x95, 0xD3, 0x1A, 0x68, 0x17, + 0x68, 0xF7, 0x69, 0xAF, 0xE8, 0x74, 0xBA, 0x11, 0xDD, 0x95, 0x1E, 0x4E, + 0x97, 0xD0, 0x57, 0xD2, 0xCB, 0xE9, 0x47, 0xE8, 0x97, 0xE8, 0x03, 0xF4, + 0x77, 0x0C, 0x0D, 0x86, 0x15, 0x83, 0xC7, 0x88, 0x67, 0x28, 0x19, 0x9B, + 0x18, 0x07, 0x18, 0x67, 0x19, 0x77, 0x18, 0xAF, 0x98, 0x4C, 0xA6, 0x19, + 0xD3, 0x8B, 0x19, 0xC7, 0x54, 0x30, 0x37, 0x31, 0xEB, 0x98, 0xE7, 0x99, + 0x0F, 0x99, 0x6F, 0x55, 0x58, 0x2A, 0xB6, 0x2A, 0x7C, 0x15, 0x91, 0xCA, + 0x0A, 0x95, 0x4A, 0x95, 0x26, 0x95, 0x1B, 0x2A, 0x2F, 0x54, 0xA9, 0xAA, + 0xA6, 0xAA, 0xDE, 0xAA, 0x0B, 0x55, 0xF3, 0x55, 0xCB, 0x54, 0x8F, 0xA9, + 0x5E, 0x53, 0x7D, 0xAE, 0x46, 0x55, 0x33, 0x53, 0xE3, 0xA9, 0x09, 0xD4, + 0x96, 0xAB, 0x55, 0xAA, 0x9D, 0x50, 0xEB, 0x53, 0x1B, 0x53, 0x67, 0xA9, + 0x3B, 0xA8, 0x87, 0xAA, 0x67, 0xA8, 0x6F, 0x54, 0x3F, 0xA4, 0x7E, 0x59, + 0xFD, 0x89, 0x06, 0x59, 0xC3, 0x4C, 0xC3, 0x4F, 0x43, 0xA4, 0x51, 0xA0, + 0xB1, 0x5F, 0xE3, 0xBC, 0xC6, 0x20, 0x0B, 0x63, 0x19, 0xB3, 0x78, 0x2C, + 0x21, 0x6B, 0x0D, 0xAB, 0x86, 0x75, 0x81, 0x35, 0xC4, 0x26, 0xB1, 0xCD, + 0xD9, 0x7C, 0x76, 0x2A, 0xBB, 0x98, 0xFD, 0x1D, 0xBB, 0x8B, 0x3D, 0xAA, + 0xA9, 0xA1, 0x39, 0x43, 0x33, 0x4A, 0x33, 0x57, 0xB3, 0x52, 0xF3, 0x94, + 0x66, 0x3F, 0x07, 0xE3, 0x98, 0x71, 0xF8, 0x9C, 0x74, 0x4E, 0x09, 0xE7, + 0x28, 0xA7, 0x97, 0xF3, 0x7E, 0x8A, 0xDE, 0x14, 0xEF, 0x29, 0xE2, 0x29, + 0x1B, 0xA6, 0x34, 0x4C, 0xB9, 0x31, 0x65, 0x5C, 0x6B, 0xAA, 0x96, 0x97, + 0x96, 0x58, 0xAB, 0x48, 0xAB, 0x51, 0xAB, 0x47, 0xEB, 0xBD, 0x36, 0xAE, + 0xED, 0xA7, 0x9D, 0xA6, 0xBD, 0x45, 0xBB, 0x59, 0xFB, 0x81, 0x0E, 0x41, + 0xC7, 0x4A, 0x27, 0x5C, 0x27, 0x47, 0x67, 0x8F, 0xCE, 0x05, 0x9D, 0xE7, + 0x53, 0xD9, 0x53, 0xDD, 0xA7, 0x0A, 0xA7, 0x16, 0x4D, 0x3D, 0x3A, 0xF5, + 0xAE, 0x2E, 0xAA, 0x6B, 0xA5, 0x1B, 0xA1, 0xBB, 0x44, 0x77, 0xBF, 0x6E, + 0xA7, 0xEE, 0x98, 0x9E, 0xBE, 0x5E, 0x80, 0x9E, 0x4C, 0x6F, 0xA7, 0xDE, + 0x79, 0xBD, 0xE7, 0xFA, 0x1C, 0x7D, 0x2F, 0xFD, 0x54, 0xFD, 0x6D, 0xFA, + 0xA7, 0xF5, 0x47, 0x0C, 0x58, 0x06, 0xB3, 0x0C, 0x24, 0x06, 0xDB, 0x0C, + 0xCE, 0x18, 0x3C, 0xC5, 0x35, 0x71, 0x6F, 0x3C, 0x1D, 0x2F, 0xC7, 0xDB, + 0xF1, 0x51, 0x43, 0x5D, 0xC3, 0x40, 0x43, 0xA5, 0x61, 0x95, 0x61, 0x97, + 0xE1, 0x84, 0x91, 0xB9, 0xD1, 0x3C, 0xA3, 0xD5, 0x46, 0x8D, 0x46, 0x0F, + 0x8C, 0x69, 0xC6, 0x5C, 0xE3, 0x24, 0xE3, 0x6D, 0xC6, 0x6D, 0xC6, 0xA3, + 0x26, 0x06, 0x26, 0x21, 0x26, 0x4B, 0x4D, 0xEA, 0x4D, 0xEE, 0x9A, 0x52, + 0x4D, 0xB9, 0xA6, 0x29, 0xA6, 0x3B, 0x4C, 0x3B, 0x4C, 0xC7, 0xCD, 0xCC, + 0xCD, 0xA2, 0xCD, 0xD6, 0x99, 0x35, 0x9B, 0x3D, 0x31, 0xD7, 0x32, 0xE7, + 0x9B, 0xE7, 0x9B, 0xD7, 0x9B, 0xDF, 0xB7, 0x60, 0x5A, 0x78, 0x5A, 0x2C, + 0xB6, 0xA8, 0xB6, 0xB8, 0x65, 0x49, 0xB2, 0xE4, 0x5A, 0xA6, 0x59, 0xEE, + 0xB6, 0xBC, 0x6E, 0x85, 0x5A, 0x39, 0x59, 0xA5, 0x58, 0x55, 0x5A, 0x5D, + 0xB3, 0x46, 0xAD, 0x9D, 0xAD, 0x25, 0xD6, 0xBB, 0xAD, 0xBB, 0xA7, 0x11, + 0xA7, 0xB9, 0x4E, 0x93, 0x4E, 0xAB, 0x9E, 0xD6, 0x67, 0xC3, 0xB0, 0xF1, + 0xB6, 0xC9, 0xB6, 0xA9, 0xB7, 0x19, 0xB0, 0xE5, 0xD8, 0x06, 0xDB, 0xAE, + 0xB6, 0x6D, 0xB6, 0x7D, 0x61, 0x67, 0x62, 0x17, 0x67, 0xB7, 0xC5, 0xAE, + 0xC3, 0xEE, 0x93, 0xBD, 0x93, 0x7D, 0xBA, 0x7D, 0x8D, 0xFD, 0x3D, 0x07, + 0x0D, 0x87, 0xD9, 0x0E, 0xAB, 0x1D, 0x5A, 0x1D, 0x7E, 0x73, 0xB4, 0x72, + 0x14, 0x3A, 0x56, 0x3A, 0xDE, 0x9A, 0xCE, 0x9C, 0xEE, 0x3F, 0x7D, 0xC5, + 0xF4, 0x96, 0xE9, 0x2F, 0x67, 0x58, 0xCF, 0x10, 0xCF, 0xD8, 0x33, 0xE3, + 0xB6, 0x13, 0xCB, 0x29, 0xC4, 0x69, 0x9D, 0x53, 0x9B, 0xD3, 0x47, 0x67, + 0x17, 0x67, 0xB9, 0x73, 0x83, 0xF3, 0x88, 0x8B, 0x89, 0x4B, 0x82, 0xCB, + 0x2E, 0x97, 0x3E, 0x2E, 0x9B, 0x1B, 0xC6, 0xDD, 0xC8, 0xBD, 0xE4, 0x4A, + 0x74, 0xF5, 0x71, 0x5D, 0xE1, 0x7A, 0xD2, 0xF5, 0x9D, 0x9B, 0xB3, 0x9B, + 0xC2, 0xED, 0xA8, 0xDB, 0xAF, 0xEE, 0x36, 0xEE, 0x69, 0xEE, 0x87, 0xDC, + 0x9F, 0xCC, 0x34, 0x9F, 0x29, 0x9E, 0x59, 0x33, 0x73, 0xD0, 0xC3, 0xC8, + 0x43, 0xE0, 0x51, 0xE5, 0xD1, 0x3F, 0x0B, 0x9F, 0x95, 0x30, 0x6B, 0xDF, + 0xAC, 0x7E, 0x4F, 0x43, 0x4F, 0x81, 0x67, 0xB5, 0xE7, 0x23, 0x2F, 0x63, + 0x2F, 0x91, 0x57, 0xAD, 0xD7, 0xB0, 0xB7, 0xA5, 0x77, 0xAA, 0xF7, 0x61, + 0xEF, 0x17, 0x3E, 0xF6, 0x3E, 0x72, 0x9F, 0xE3, 0x3E, 0xE3, 0x3C, 0x37, + 0xDE, 0x32, 0xDE, 0x59, 0x5F, 0xCC, 0x37, 0xC0, 0xB7, 0xC8, 0xB7, 0xCB, + 0x4F, 0xC3, 0x6F, 0x9E, 0x5F, 0x85, 0xDF, 0x43, 0x7F, 0x23, 0xFF, 0x64, + 0xFF, 0x7A, 0xFF, 0xD1, 0x00, 0xA7, 0x80, 0x25, 0x01, 0x67, 0x03, 0x89, + 0x81, 0x41, 0x81, 0x5B, 0x02, 0xFB, 0xF8, 0x7A, 0x7C, 0x21, 0xBF, 0x8E, + 0x3F, 0x3A, 0xDB, 0x65, 0xF6, 0xB2, 0xD9, 0xED, 0x41, 0x8C, 0xA0, 0xB9, + 0x41, 0x15, 0x41, 0x8F, 0x82, 0xAD, 0x82, 0xE5, 0xC1, 0xAD, 0x21, 0x68, + 0xC8, 0xEC, 0x90, 0xAD, 0x21, 0xF7, 0xE7, 0x98, 0xCE, 0x91, 0xCE, 0x69, + 0x0E, 0x85, 0x50, 0x7E, 0xE8, 0xD6, 0xD0, 0x07, 0x61, 0xE6, 0x61, 0x8B, + 0xC3, 0x7E, 0x0C, 0x27, 0x85, 0x87, 0x85, 0x57, 0x86, 0x3F, 0x8E, 0x70, + 0x88, 0x58, 0x1A, 0xD1, 0x31, 0x97, 0x35, 0x77, 0xD1, 0xDC, 0x43, 0x73, + 0xDF, 0x44, 0xFA, 0x44, 0x96, 0x44, 0xDE, 0x9B, 0x67, 0x31, 0x4F, 0x39, + 0xAF, 0x2D, 0x4A, 0x35, 0x2A, 0x3E, 0xAA, 0x2E, 0x6A, 0x3C, 0xDA, 0x37, + 0xBA, 0x34, 0xBA, 0x3F, 0xC6, 0x2E, 0x66, 0x59, 0xCC, 0xD5, 0x58, 0x9D, + 0x58, 0x49, 0x6C, 0x4B, 0x1C, 0x39, 0x2E, 0x2A, 0xAE, 0x36, 0x6E, 0x6C, + 0xBE, 0xDF, 0xFC, 0xED, 0xF3, 0x87, 0xE2, 0x9D, 0xE2, 0x0B, 0xE3, 0x7B, + 0x17, 0x98, 0x2F, 0xC8, 0x5D, 0x70, 0x79, 0xA1, 0xCE, 0xC2, 0xF4, 0x85, + 0xA7, 0x16, 0xA9, 0x2E, 0x12, 0x2C, 0x3A, 0x96, 0x40, 0x4C, 0x88, 0x4E, + 0x38, 0x94, 0xF0, 0x41, 0x10, 0x2A, 0xA8, 0x16, 0x8C, 0x25, 0xF2, 0x13, + 0x77, 0x25, 0x8E, 0x0A, 0x79, 0xC2, 0x1D, 0xC2, 0x67, 0x22, 0x2F, 0xD1, + 0x36, 0xD1, 0x88, 0xD8, 0x43, 0x5C, 0x2A, 0x1E, 0x4E, 0xF2, 0x48, 0x2A, + 0x4D, 0x7A, 0x92, 0xEC, 0x91, 0xBC, 0x35, 0x79, 0x24, 0xC5, 0x33, 0xA5, + 0x2C, 0xE5, 0xB9, 0x84, 0x27, 0xA9, 0x90, 0xBC, 0x4C, 0x0D, 0x4C, 0xDD, + 0x9B, 0x3A, 0x9E, 0x16, 0x9A, 0x76, 0x20, 0x6D, 0x32, 0x3D, 0x3A, 0xBD, + 0x31, 0x83, 0x92, 0x91, 0x90, 0x71, 0x42, 0xAA, 0x21, 0x4D, 0x93, 0xB6, + 0x67, 0xEA, 0x67, 0xE6, 0x66, 0x76, 0xCB, 0xAC, 0x65, 0x85, 0xB2, 0xFE, + 0xC5, 0x6E, 0x8B, 0xB7, 0x2F, 0x1E, 0x95, 0x07, 0xC9, 0x6B, 0xB3, 0x90, + 0xAC, 0x05, 0x59, 0x2D, 0x0A, 0xB6, 0x42, 0xA6, 0xE8, 0x54, 0x5A, 0x28, + 0xD7, 0x2A, 0x07, 0xB2, 0x67, 0x65, 0x57, 0x66, 0xBF, 0xCD, 0x89, 0xCA, + 0x39, 0x96, 0xAB, 0x9E, 0x2B, 0xCD, 0xED, 0xCC, 0xB3, 0xCA, 0xDB, 0x90, + 0x37, 0x9C, 0xEF, 0x9F, 0xFF, 0xED, 0x12, 0xC2, 0x12, 0xE1, 0x92, 0xB6, + 0xA5, 0x86, 0x4B, 0x57, 0x2D, 0x1D, 0x58, 0xE6, 0xBD, 0xAC, 0x6A, 0x39, + 0xB2, 0x3C, 0x71, 0x79, 0xDB, 0x0A, 0xE3, 0x15, 0x05, 0x2B, 0x86, 0x56, + 0x06, 0xAC, 0x3C, 0xB8, 0x8A, 0xB6, 0x2A, 0x6D, 0xD5, 0x4F, 0xAB, 0xED, + 0x57, 0x97, 0xAE, 0x7E, 0xBD, 0x26, 0x7A, 0x4D, 0x6B, 0x81, 0x5E, 0xC1, + 0xCA, 0x82, 0xC1, 0xB5, 0x01, 0x6B, 0xEB, 0x0B, 0x55, 0x0A, 0xE5, 0x85, + 0x7D, 0xEB, 0xDC, 0xD7, 0xED, 0x5D, 0x4F, 0x58, 0x2F, 0x59, 0xDF, 0xB5, + 0x61, 0xFA, 0x86, 0x9D, 0x1B, 0x3E, 0x15, 0x89, 0x8A, 0xAE, 0x14, 0xDB, + 0x17, 0x97, 0x15, 0x7F, 0xD8, 0x28, 0xDC, 0x78, 0xE5, 0x1B, 0x87, 0x6F, + 0xCA, 0xBF, 0x99, 0xDC, 0x94, 0xB4, 0xA9, 0xAB, 0xC4, 0xB9, 0x64, 0xCF, + 0x66, 0xD2, 0x66, 0xE9, 0xE6, 0xDE, 0x2D, 0x9E, 0x5B, 0x0E, 0x96, 0xAA, + 0x97, 0xE6, 0x97, 0x0E, 0x6E, 0x0D, 0xD9, 0xDA, 0xB4, 0x0D, 0xDF, 0x56, + 0xB4, 0xED, 0xF5, 0xF6, 0x45, 0xDB, 0x2F, 0x97, 0xCD, 0x28, 0xDB, 0xBB, + 0x83, 0xB6, 0x43, 0xB9, 0xA3, 0xBF, 0x3C, 0xB8, 0xBC, 0x65, 0xA7, 0xC9, + 0xCE, 0xCD, 0x3B, 0x3F, 0x54, 0xA4, 0x54, 0xF4, 0x54, 0xFA, 0x54, 0x36, + 0xEE, 0xD2, 0xDD, 0xB5, 0x61, 0xD7, 0xF8, 0x6E, 0xD1, 0xEE, 0x1B, 0x7B, + 0xBC, 0xF6, 0x34, 0xEC, 0xD5, 0xDB, 0x5B, 0xBC, 0xF7, 0xFD, 0x3E, 0xC9, + 0xBE, 0xDB, 0x55, 0x01, 0x55, 0x4D, 0xD5, 0x66, 0xD5, 0x65, 0xFB, 0x49, + 0xFB, 0xB3, 0xF7, 0x3F, 0xAE, 0x89, 0xAA, 0xE9, 0xF8, 0x96, 0xFB, 0x6D, + 0x5D, 0xAD, 0x4E, 0x6D, 0x71, 0xED, 0xC7, 0x03, 0xD2, 0x03, 0xFD, 0x07, + 0x23, 0x0E, 0xB6, 0xD7, 0xB9, 0xD4, 0xD5, 0x1D, 0xD2, 0x3D, 0x54, 0x52, + 0x8F, 0xD6, 0x2B, 0xEB, 0x47, 0x0E, 0xC7, 0x1F, 0xBE, 0xFE, 0x9D, 0xEF, + 0x77, 0x2D, 0x0D, 0x36, 0x0D, 0x55, 0x8D, 0x9C, 0xC6, 0xE2, 0x23, 0x70, + 0x44, 0x79, 0xE4, 0xE9, 0xF7, 0x09, 0xDF, 0xF7, 0x1E, 0x0D, 0x3A, 0xDA, + 0x76, 0x8C, 0x7B, 0xAC, 0xE1, 0x07, 0xD3, 0x1F, 0x76, 0x1D, 0x67, 0x1D, + 0x2F, 0x6A, 0x42, 0x9A, 0xF2, 0x9A, 0x46, 0x9B, 0x53, 0x9A, 0xFB, 0x5B, + 0x62, 0x5B, 0xBA, 0x4F, 0xCC, 0x3E, 0xD1, 0xD6, 0xEA, 0xDE, 0x7A, 0xFC, + 0x47, 0xDB, 0x1F, 0x0F, 0x9C, 0x34, 0x3C, 0x59, 0x79, 0x4A, 0xF3, 0x54, + 0xC9, 0x69, 0xDA, 0xE9, 0x82, 0xD3, 0x93, 0x67, 0xF2, 0xCF, 0x8C, 0x9D, + 0x95, 0x9D, 0x7D, 0x7E, 0x2E, 0xF9, 0xDC, 0x60, 0xDB, 0xA2, 0xB6, 0x7B, + 0xE7, 0x63, 0xCE, 0xDF, 0x6A, 0x0F, 0x6F, 0xEF, 0xBA, 0x10, 0x74, 0xE1, + 0xD2, 0x45, 0xFF, 0x8B, 0xE7, 0x3B, 0xBC, 0x3B, 0xCE, 0x5C, 0xF2, 0xB8, + 0x74, 0xF2, 0xB2, 0xDB, 0xE5, 0x13, 0x57, 0xB8, 0x57, 0x9A, 0xAF, 0x3A, + 0x5F, 0x6D, 0xEA, 0x74, 0xEA, 0x3C, 0xFE, 0x93, 0xD3, 0x4F, 0xC7, 0xBB, + 0x9C, 0xBB, 0x9A, 0xAE, 0xB9, 0x5C, 0x6B, 0xB9, 0xEE, 0x7A, 0xBD, 0xB5, + 0x7B, 0x66, 0xF7, 0xE9, 0x1B, 0x9E, 0x37, 0xCE, 0xDD, 0xF4, 0xBD, 0x79, + 0xF1, 0x16, 0xFF, 0xD6, 0xD5, 0x9E, 0x39, 0x3D, 0xDD, 0xBD, 0xF3, 0x7A, + 0x6F, 0xF7, 0xC5, 0xF7, 0xF5, 0xDF, 0x16, 0xDD, 0x7E, 0x72, 0x27, 0xFD, + 0xCE, 0xCB, 0xBB, 0xD9, 0x77, 0x27, 0xEE, 0xAD, 0xBC, 0x4F, 0xBC, 0x5F, + 0xF4, 0x40, 0xED, 0x41, 0xD9, 0x43, 0xDD, 0x87, 0xD5, 0x3F, 0x5B, 0xFE, + 0xDC, 0xD8, 0xEF, 0xDC, 0x7F, 0x6A, 0xC0, 0x77, 0xA0, 0xF3, 0xD1, 0xDC, + 0x47, 0xF7, 0x06, 0x85, 0x83, 0xCF, 0xFE, 0x91, 0xF5, 0x8F, 0x0F, 0x43, + 0x05, 0x8F, 0x99, 0x8F, 0xCB, 0x86, 0x0D, 0x86, 0xEB, 0x9E, 0x38, 0x3E, + 0x39, 0x39, 0xE2, 0x3F, 0x72, 0xFD, 0xE9, 0xFC, 0xA7, 0x43, 0xCF, 0x64, + 0xCF, 0x26, 0x9E, 0x17, 0xFE, 0xA2, 0xFE, 0xCB, 0xAE, 0x17, 0x16, 0x2F, + 0x7E, 0xF8, 0xD5, 0xEB, 0xD7, 0xCE, 0xD1, 0x98, 0xD1, 0xA1, 0x97, 0xF2, + 0x97, 0x93, 0xBF, 0x6D, 0x7C, 0xA5, 0xFD, 0xEA, 0xC0, 0xEB, 0x19, 0xAF, + 0xDB, 0xC6, 0xC2, 0xC6, 0x1E, 0xBE, 0xC9, 0x78, 0x33, 0x31, 0x5E, 0xF4, + 0x56, 0xFB, 0xED, 0xC1, 0x77, 0xDC, 0x77, 0x1D, 0xEF, 0xA3, 0xDF, 0x0F, + 0x4F, 0xE4, 0x7C, 0x20, 0x7F, 0x28, 0xFF, 0x68, 0xF9, 0xB1, 0xF5, 0x53, + 0xD0, 0xA7, 0xFB, 0x93, 0x19, 0x93, 0x93, 0xFF, 0x04, 0x03, 0x98, 0xF3, + 0xFC, 0x63, 0x33, 0x2D, 0xDB, 0x00, 0x00, 0x3A, 0xFD, 0x69, 0x54, 0x58, + 0x74, 0x58, 0x4D, 0x4C, 0x3A, 0x63, 0x6F, 0x6D, 0x2E, 0x61, 0x64, 0x6F, + 0x62, 0x65, 0x2E, 0x78, 0x6D, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, + 0x3F, 0x78, 0x70, 0x61, 0x63, 0x6B, 0x65, 0x74, 0x20, 0x62, 0x65, 0x67, + 0x69, 0x6E, 0x3D, 0x22, 0xEF, 0xBB, 0xBF, 0x22, 0x20, 0x69, 0x64, 0x3D, + 0x22, 0x57, 0x35, 0x4D, 0x30, 0x4D, 0x70, 0x43, 0x65, 0x68, 0x69, 0x48, + 0x7A, 0x72, 0x65, 0x53, 0x7A, 0x4E, 0x54, 0x63, 0x7A, 0x6B, 0x63, 0x39, + 0x64, 0x22, 0x3F, 0x3E, 0x0A, 0x3C, 0x78, 0x3A, 0x78, 0x6D, 0x70, 0x6D, + 0x65, 0x74, 0x61, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, 0x3A, 0x78, 0x3D, + 0x22, 0x61, 0x64, 0x6F, 0x62, 0x65, 0x3A, 0x6E, 0x73, 0x3A, 0x6D, 0x65, + 0x74, 0x61, 0x2F, 0x22, 0x20, 0x78, 0x3A, 0x78, 0x6D, 0x70, 0x74, 0x6B, + 0x3D, 0x22, 0x41, 0x64, 0x6F, 0x62, 0x65, 0x20, 0x58, 0x4D, 0x50, 0x20, + 0x43, 0x6F, 0x72, 0x65, 0x20, 0x35, 0x2E, 0x36, 0x2D, 0x63, 0x31, 0x33, + 0x38, 0x20, 0x37, 0x39, 0x2E, 0x31, 0x35, 0x39, 0x38, 0x32, 0x34, 0x2C, + 0x20, 0x32, 0x30, 0x31, 0x36, 0x2F, 0x30, 0x39, 0x2F, 0x31, 0x34, 0x2D, + 0x30, 0x31, 0x3A, 0x30, 0x39, 0x3A, 0x30, 0x31, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x3C, 0x72, + 0x64, 0x66, 0x3A, 0x52, 0x44, 0x46, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, + 0x3A, 0x72, 0x64, 0x66, 0x3D, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, + 0x2F, 0x77, 0x77, 0x77, 0x2E, 0x77, 0x33, 0x2E, 0x6F, 0x72, 0x67, 0x2F, + 0x31, 0x39, 0x39, 0x39, 0x2F, 0x30, 0x32, 0x2F, 0x32, 0x32, 0x2D, 0x72, + 0x64, 0x66, 0x2D, 0x73, 0x79, 0x6E, 0x74, 0x61, 0x78, 0x2D, 0x6E, 0x73, + 0x23, 0x22, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, + 0x64, 0x66, 0x3A, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6F, 0x6E, 0x20, 0x72, 0x64, 0x66, 0x3A, 0x61, 0x62, 0x6F, 0x75, 0x74, + 0x3D, 0x22, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, 0x3A, 0x78, 0x6D, + 0x70, 0x3D, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x6E, 0x73, + 0x2E, 0x61, 0x64, 0x6F, 0x62, 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x78, + 0x61, 0x70, 0x2F, 0x31, 0x2E, 0x30, 0x2F, 0x22, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, 0x6C, + 0x6E, 0x73, 0x3A, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3D, 0x22, 0x68, 0x74, + 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x6E, 0x73, 0x2E, 0x61, 0x64, 0x6F, 0x62, + 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x78, 0x61, 0x70, 0x2F, 0x31, 0x2E, + 0x30, 0x2F, 0x6D, 0x6D, 0x2F, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, + 0x3A, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3D, 0x22, 0x68, 0x74, 0x74, 0x70, + 0x3A, 0x2F, 0x2F, 0x6E, 0x73, 0x2E, 0x61, 0x64, 0x6F, 0x62, 0x65, 0x2E, + 0x63, 0x6F, 0x6D, 0x2F, 0x78, 0x61, 0x70, 0x2F, 0x31, 0x2E, 0x30, 0x2F, + 0x73, 0x54, 0x79, 0x70, 0x65, 0x2F, 0x52, 0x65, 0x73, 0x6F, 0x75, 0x72, + 0x63, 0x65, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x23, 0x22, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, + 0x6C, 0x6E, 0x73, 0x3A, 0x70, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, + 0x70, 0x3D, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x6E, 0x73, + 0x2E, 0x61, 0x64, 0x6F, 0x62, 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x70, + 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x2F, 0x31, 0x2E, 0x30, + 0x2F, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, 0x3A, 0x64, 0x63, 0x3D, + 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x70, 0x75, 0x72, 0x6C, + 0x2E, 0x6F, 0x72, 0x67, 0x2F, 0x64, 0x63, 0x2F, 0x65, 0x6C, 0x65, 0x6D, + 0x65, 0x6E, 0x74, 0x73, 0x2F, 0x31, 0x2E, 0x31, 0x2F, 0x22, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, + 0x6D, 0x6C, 0x6E, 0x73, 0x3A, 0x74, 0x69, 0x66, 0x66, 0x3D, 0x22, 0x68, + 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x6E, 0x73, 0x2E, 0x61, 0x64, 0x6F, + 0x62, 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x74, 0x69, 0x66, 0x66, 0x2F, + 0x31, 0x2E, 0x30, 0x2F, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, 0x3A, + 0x65, 0x78, 0x69, 0x66, 0x3D, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, + 0x2F, 0x6E, 0x73, 0x2E, 0x61, 0x64, 0x6F, 0x62, 0x65, 0x2E, 0x63, 0x6F, + 0x6D, 0x2F, 0x65, 0x78, 0x69, 0x66, 0x2F, 0x31, 0x2E, 0x30, 0x2F, 0x22, + 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, + 0x78, 0x6D, 0x70, 0x3A, 0x43, 0x72, 0x65, 0x61, 0x74, 0x6F, 0x72, 0x54, + 0x6F, 0x6F, 0x6C, 0x3E, 0x41, 0x64, 0x6F, 0x62, 0x65, 0x20, 0x50, 0x68, + 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x20, 0x43, 0x43, 0x20, 0x32, + 0x30, 0x31, 0x37, 0x20, 0x28, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, + 0x29, 0x3C, 0x2F, 0x78, 0x6D, 0x70, 0x3A, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x6F, 0x72, 0x54, 0x6F, 0x6F, 0x6C, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x3A, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x65, 0x3E, 0x32, 0x30, 0x31, + 0x38, 0x2D, 0x30, 0x34, 0x2D, 0x30, 0x31, 0x54, 0x32, 0x31, 0x3A, 0x35, + 0x39, 0x3A, 0x35, 0x38, 0x2B, 0x30, 0x38, 0x3A, 0x30, 0x30, 0x3C, 0x2F, + 0x78, 0x6D, 0x70, 0x3A, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, + 0x74, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x3A, 0x4D, 0x65, 0x74, 0x61, 0x64, 0x61, + 0x74, 0x61, 0x44, 0x61, 0x74, 0x65, 0x3E, 0x32, 0x30, 0x31, 0x38, 0x2D, + 0x30, 0x34, 0x2D, 0x30, 0x31, 0x54, 0x32, 0x31, 0x3A, 0x35, 0x39, 0x3A, + 0x35, 0x38, 0x2B, 0x30, 0x38, 0x3A, 0x30, 0x30, 0x3C, 0x2F, 0x78, 0x6D, + 0x70, 0x3A, 0x4D, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x44, 0x61, + 0x74, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x3A, 0x4D, 0x6F, 0x64, 0x69, 0x66, 0x79, + 0x44, 0x61, 0x74, 0x65, 0x3E, 0x32, 0x30, 0x31, 0x38, 0x2D, 0x30, 0x34, + 0x2D, 0x30, 0x31, 0x54, 0x32, 0x31, 0x3A, 0x35, 0x39, 0x3A, 0x35, 0x38, + 0x2B, 0x30, 0x38, 0x3A, 0x30, 0x30, 0x3C, 0x2F, 0x78, 0x6D, 0x70, 0x3A, + 0x4D, 0x6F, 0x64, 0x69, 0x66, 0x79, 0x44, 0x61, 0x74, 0x65, 0x3E, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x78, 0x6D, + 0x70, 0x4D, 0x4D, 0x3A, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, + 0x49, 0x44, 0x3E, 0x78, 0x6D, 0x70, 0x2E, 0x69, 0x69, 0x64, 0x3A, 0x30, + 0x33, 0x33, 0x35, 0x64, 0x33, 0x38, 0x61, 0x2D, 0x64, 0x62, 0x31, 0x61, + 0x2D, 0x37, 0x38, 0x34, 0x31, 0x2D, 0x38, 0x38, 0x33, 0x34, 0x2D, 0x39, + 0x65, 0x36, 0x61, 0x61, 0x63, 0x37, 0x39, 0x30, 0x65, 0x64, 0x34, 0x3C, + 0x2F, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x49, 0x6E, 0x73, 0x74, 0x61, + 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x44, + 0x6F, 0x63, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x49, 0x44, 0x3E, 0x61, 0x64, + 0x6F, 0x62, 0x65, 0x3A, 0x64, 0x6F, 0x63, 0x69, 0x64, 0x3A, 0x70, 0x68, + 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x3A, 0x66, 0x36, 0x38, 0x37, + 0x35, 0x30, 0x30, 0x66, 0x2D, 0x33, 0x35, 0x62, 0x34, 0x2D, 0x31, 0x31, + 0x65, 0x38, 0x2D, 0x39, 0x31, 0x61, 0x34, 0x2D, 0x38, 0x38, 0x34, 0x37, + 0x30, 0x37, 0x30, 0x65, 0x31, 0x35, 0x34, 0x62, 0x3C, 0x2F, 0x78, 0x6D, + 0x70, 0x4D, 0x4D, 0x3A, 0x44, 0x6F, 0x63, 0x75, 0x6D, 0x65, 0x6E, 0x74, + 0x49, 0x44, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x4F, 0x72, 0x69, 0x67, + 0x69, 0x6E, 0x61, 0x6C, 0x44, 0x6F, 0x63, 0x75, 0x6D, 0x65, 0x6E, 0x74, + 0x49, 0x44, 0x3E, 0x78, 0x6D, 0x70, 0x2E, 0x64, 0x69, 0x64, 0x3A, 0x30, + 0x33, 0x31, 0x65, 0x39, 0x31, 0x33, 0x65, 0x2D, 0x31, 0x30, 0x65, 0x34, + 0x2D, 0x30, 0x65, 0x34, 0x61, 0x2D, 0x38, 0x39, 0x64, 0x61, 0x2D, 0x34, + 0x32, 0x31, 0x36, 0x34, 0x33, 0x36, 0x33, 0x36, 0x63, 0x32, 0x35, 0x3C, + 0x2F, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x4F, 0x72, 0x69, 0x67, 0x69, + 0x6E, 0x61, 0x6C, 0x44, 0x6F, 0x63, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x49, + 0x44, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x3C, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x48, 0x69, 0x73, 0x74, 0x6F, + 0x72, 0x79, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x64, 0x66, 0x3A, 0x53, 0x65, 0x71, + 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x64, 0x66, 0x3A, 0x6C, 0x69, + 0x20, 0x72, 0x64, 0x66, 0x3A, 0x70, 0x61, 0x72, 0x73, 0x65, 0x54, 0x79, + 0x70, 0x65, 0x3D, 0x22, 0x52, 0x65, 0x73, 0x6F, 0x75, 0x72, 0x63, 0x65, + 0x22, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, + 0x45, 0x76, 0x74, 0x3A, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x63, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, + 0x74, 0x3A, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x69, + 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3E, 0x78, 0x6D, + 0x70, 0x2E, 0x69, 0x69, 0x64, 0x3A, 0x30, 0x33, 0x31, 0x65, 0x39, 0x31, + 0x33, 0x65, 0x2D, 0x31, 0x30, 0x65, 0x34, 0x2D, 0x30, 0x65, 0x34, 0x61, + 0x2D, 0x38, 0x39, 0x64, 0x61, 0x2D, 0x34, 0x32, 0x31, 0x36, 0x34, 0x33, + 0x36, 0x33, 0x36, 0x63, 0x32, 0x35, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, + 0x74, 0x3A, 0x69, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, + 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x45, + 0x76, 0x74, 0x3A, 0x77, 0x68, 0x65, 0x6E, 0x3E, 0x32, 0x30, 0x31, 0x38, + 0x2D, 0x30, 0x34, 0x2D, 0x30, 0x31, 0x54, 0x32, 0x31, 0x3A, 0x35, 0x39, + 0x3A, 0x35, 0x38, 0x2B, 0x30, 0x38, 0x3A, 0x30, 0x30, 0x3C, 0x2F, 0x73, + 0x74, 0x45, 0x76, 0x74, 0x3A, 0x77, 0x68, 0x65, 0x6E, 0x3E, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, + 0x73, 0x6F, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x41, 0x67, 0x65, 0x6E, + 0x74, 0x3E, 0x41, 0x64, 0x6F, 0x62, 0x65, 0x20, 0x50, 0x68, 0x6F, 0x74, + 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x20, 0x43, 0x43, 0x20, 0x32, 0x30, 0x31, + 0x37, 0x20, 0x28, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x29, 0x3C, + 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x73, 0x6F, 0x66, 0x74, 0x77, + 0x61, 0x72, 0x65, 0x41, 0x67, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x3C, 0x2F, 0x72, 0x64, 0x66, 0x3A, 0x6C, 0x69, 0x3E, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x3C, 0x72, 0x64, 0x66, 0x3A, 0x6C, 0x69, 0x20, 0x72, 0x64, + 0x66, 0x3A, 0x70, 0x61, 0x72, 0x73, 0x65, 0x54, 0x79, 0x70, 0x65, 0x3D, + 0x22, 0x52, 0x65, 0x73, 0x6F, 0x75, 0x72, 0x63, 0x65, 0x22, 0x3E, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, + 0x3A, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x73, 0x61, 0x76, 0x65, + 0x64, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x61, 0x63, 0x74, + 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, + 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x69, 0x6E, 0x73, 0x74, 0x61, 0x6E, + 0x63, 0x65, 0x49, 0x44, 0x3E, 0x78, 0x6D, 0x70, 0x2E, 0x69, 0x69, 0x64, + 0x3A, 0x30, 0x33, 0x33, 0x35, 0x64, 0x33, 0x38, 0x61, 0x2D, 0x64, 0x62, + 0x31, 0x61, 0x2D, 0x37, 0x38, 0x34, 0x31, 0x2D, 0x38, 0x38, 0x33, 0x34, + 0x2D, 0x39, 0x65, 0x36, 0x61, 0x61, 0x63, 0x37, 0x39, 0x30, 0x65, 0x64, + 0x34, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x69, 0x6E, 0x73, + 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3E, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x77, 0x68, + 0x65, 0x6E, 0x3E, 0x32, 0x30, 0x31, 0x38, 0x2D, 0x30, 0x34, 0x2D, 0x30, + 0x31, 0x54, 0x32, 0x31, 0x3A, 0x35, 0x39, 0x3A, 0x35, 0x38, 0x2B, 0x30, + 0x38, 0x3A, 0x30, 0x30, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, + 0x77, 0x68, 0x65, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x73, 0x6F, 0x66, 0x74, 0x77, + 0x61, 0x72, 0x65, 0x41, 0x67, 0x65, 0x6E, 0x74, 0x3E, 0x41, 0x64, 0x6F, + 0x62, 0x65, 0x20, 0x50, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, + 0x20, 0x43, 0x43, 0x20, 0x32, 0x30, 0x31, 0x37, 0x20, 0x28, 0x57, 0x69, + 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x29, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, + 0x74, 0x3A, 0x73, 0x6F, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x41, 0x67, + 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, + 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x63, 0x68, 0x61, 0x6E, 0x67, 0x65, + 0x64, 0x3E, 0x2F, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x63, + 0x68, 0x61, 0x6E, 0x67, 0x65, 0x64, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, + 0x2F, 0x72, 0x64, 0x66, 0x3A, 0x6C, 0x69, 0x3E, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x72, + 0x64, 0x66, 0x3A, 0x53, 0x65, 0x71, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x78, 0x6D, 0x70, 0x4D, 0x4D, + 0x3A, 0x48, 0x69, 0x73, 0x74, 0x6F, 0x72, 0x79, 0x3E, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x70, 0x68, 0x6F, 0x74, + 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x3A, 0x44, 0x6F, 0x63, 0x75, 0x6D, 0x65, + 0x6E, 0x74, 0x41, 0x6E, 0x63, 0x65, 0x73, 0x74, 0x6F, 0x72, 0x73, 0x3E, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x3C, 0x72, 0x64, 0x66, 0x3A, 0x42, 0x61, 0x67, 0x3E, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x3C, 0x72, 0x64, 0x66, 0x3A, 0x6C, 0x69, 0x3E, 0x78, 0x6D, + 0x70, 0x2E, 0x64, 0x69, 0x64, 0x3A, 0x39, 0x30, 0x39, 0x62, 0x39, 0x65, + 0x35, 0x32, 0x2D, 0x39, 0x37, 0x62, 0x64, 0x2D, 0x34, 0x32, 0x39, 0x33, + 0x2D, 0x38, 0x30, 0x64, 0x32, 0x2D, 0x31, 0x31, 0x64, 0x65, 0x62, 0x64, + 0x36, 0x61, 0x33, 0x33, 0x65, 0x62, 0x3C, 0x2F, 0x72, 0x64, 0x66, 0x3A, + 0x6C, 0x69, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x72, 0x64, 0x66, 0x3A, 0x42, 0x61, + 0x67, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x3C, 0x2F, 0x70, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x3A, + 0x44, 0x6F, 0x63, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x41, 0x6E, 0x63, 0x65, + 0x73, 0x74, 0x6F, 0x72, 0x73, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3C, 0x70, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, + 0x6F, 0x70, 0x3A, 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x4D, 0x6F, 0x64, 0x65, + 0x3E, 0x33, 0x3C, 0x2F, 0x70, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, + 0x70, 0x3A, 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x4D, 0x6F, 0x64, 0x65, 0x3E, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x70, + 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x3A, 0x49, 0x43, 0x43, + 0x50, 0x72, 0x6F, 0x66, 0x69, 0x6C, 0x65, 0x3E, 0x73, 0x52, 0x47, 0x42, + 0x20, 0x49, 0x45, 0x43, 0x36, 0x31, 0x39, 0x36, 0x36, 0x2D, 0x32, 0x2E, + 0x31, 0x3C, 0x2F, 0x70, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, + 0x3A, 0x49, 0x43, 0x43, 0x50, 0x72, 0x6F, 0x66, 0x69, 0x6C, 0x65, 0x3E, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, + 0x63, 0x3A, 0x66, 0x6F, 0x72, 0x6D, 0x61, 0x74, 0x3E, 0x69, 0x6D, 0x61, + 0x67, 0x65, 0x2F, 0x70, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x63, 0x3A, 0x66, + 0x6F, 0x72, 0x6D, 0x61, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3C, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x4F, 0x72, + 0x69, 0x65, 0x6E, 0x74, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x31, 0x3C, + 0x2F, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x4F, 0x72, 0x69, 0x65, 0x6E, 0x74, + 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3C, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x58, 0x52, + 0x65, 0x73, 0x6F, 0x6C, 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x33, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x2F, 0x31, 0x30, 0x30, 0x30, 0x30, 0x3C, + 0x2F, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x58, 0x52, 0x65, 0x73, 0x6F, 0x6C, + 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3C, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x59, 0x52, + 0x65, 0x73, 0x6F, 0x6C, 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x33, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x2F, 0x31, 0x30, 0x30, 0x30, 0x30, 0x3C, + 0x2F, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x59, 0x52, 0x65, 0x73, 0x6F, 0x6C, + 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3C, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x52, 0x65, + 0x73, 0x6F, 0x6C, 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x55, 0x6E, 0x69, 0x74, + 0x3E, 0x32, 0x3C, 0x2F, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x52, 0x65, 0x73, + 0x6F, 0x6C, 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x55, 0x6E, 0x69, 0x74, 0x3E, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x65, + 0x78, 0x69, 0x66, 0x3A, 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x53, 0x70, 0x61, + 0x63, 0x65, 0x3E, 0x31, 0x3C, 0x2F, 0x65, 0x78, 0x69, 0x66, 0x3A, 0x43, + 0x6F, 0x6C, 0x6F, 0x72, 0x53, 0x70, 0x61, 0x63, 0x65, 0x3E, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x65, 0x78, 0x69, + 0x66, 0x3A, 0x50, 0x69, 0x78, 0x65, 0x6C, 0x58, 0x44, 0x69, 0x6D, 0x65, + 0x6E, 0x73, 0x69, 0x6F, 0x6E, 0x3E, 0x31, 0x32, 0x30, 0x3C, 0x2F, 0x65, + 0x78, 0x69, 0x66, 0x3A, 0x50, 0x69, 0x78, 0x65, 0x6C, 0x58, 0x44, 0x69, + 0x6D, 0x65, 0x6E, 0x73, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x65, 0x78, 0x69, 0x66, 0x3A, + 0x50, 0x69, 0x78, 0x65, 0x6C, 0x59, 0x44, 0x69, 0x6D, 0x65, 0x6E, 0x73, + 0x69, 0x6F, 0x6E, 0x3E, 0x31, 0x32, 0x30, 0x3C, 0x2F, 0x65, 0x78, 0x69, + 0x66, 0x3A, 0x50, 0x69, 0x78, 0x65, 0x6C, 0x59, 0x44, 0x69, 0x6D, 0x65, + 0x6E, 0x73, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x3C, 0x2F, 0x72, 0x64, 0x66, 0x3A, 0x44, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x3C, + 0x2F, 0x72, 0x64, 0x66, 0x3A, 0x52, 0x44, 0x46, 0x3E, 0x0A, 0x3C, 0x2F, + 0x78, 0x3A, 0x78, 0x6D, 0x70, 0x6D, 0x65, 0x74, 0x61, 0x3E, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x3C, + 0x3F, 0x78, 0x70, 0x61, 0x63, 0x6B, 0x65, 0x74, 0x20, 0x65, 0x6E, 0x64, + 0x3D, 0x22, 0x77, 0x22, 0x3F, 0x3E, 0x52, 0x1E, 0x40, 0x1C, 0x00, 0x00, + 0x00, 0x20, 0x63, 0x48, 0x52, 0x4D, 0x00, 0x00, 0x7A, 0x25, 0x00, 0x00, + 0x80, 0x83, 0x00, 0x00, 0xF9, 0xFF, 0x00, 0x00, 0x80, 0xE9, 0x00, 0x00, + 0x75, 0x30, 0x00, 0x00, 0xEA, 0x60, 0x00, 0x00, 0x3A, 0x98, 0x00, 0x00, + 0x17, 0x6F, 0x92, 0x5F, 0xC5, 0x46, 0x00, 0x00, 0x0F, 0xB6, 0x49, 0x44, + 0x41, 0x54, 0x78, 0xDA, 0xEC, 0x9D, 0x79, 0x94, 0x1C, 0x55, 0x15, 0xC6, + 0x7F, 0x3D, 0x7B, 0xB6, 0x21, 0x99, 0x6C, 0x10, 0x82, 0xC3, 0x12, 0x96, + 0x84, 0x18, 0x59, 0x13, 0x20, 0x91, 0x7D, 0x09, 0x04, 0x10, 0x34, 0x78, + 0x3C, 0x08, 0x02, 0xC1, 0x13, 0x8E, 0xE2, 0x71, 0x41, 0x51, 0x96, 0x28, + 0x22, 0xCA, 0x2E, 0x02, 0x46, 0x59, 0xC4, 0x05, 0x3D, 0x0A, 0x82, 0xEC, + 0x08, 0x42, 0x02, 0xB2, 0xC8, 0x2E, 0xA0, 0x01, 0x02, 0x21, 0x81, 0x24, + 0x98, 0x90, 0x90, 0x6D, 0x92, 0xC9, 0x4C, 0x66, 0xA6, 0x33, 0x33, 0xD7, + 0x3F, 0xEE, 0xED, 0x33, 0xCD, 0xD0, 0x5D, 0xFD, 0xAA, 0xA7, 0xAA, 0xBA, + 0x66, 0xA6, 0xEE, 0x39, 0x75, 0xD2, 0x67, 0x52, 0x5D, 0xFD, 0xDE, 0xFB, + 0xEA, 0xDD, 0x77, 0xEF, 0x7D, 0xDF, 0xBD, 0x2F, 0x25, 0x22, 0x24, 0xD2, + 0x77, 0xA5, 0x2C, 0x19, 0x82, 0x04, 0xE0, 0x44, 0x12, 0x80, 0x13, 0x89, + 0xAB, 0x54, 0xF4, 0x93, 0x7E, 0x6E, 0x03, 0x0C, 0x06, 0x52, 0x40, 0x03, + 0xD0, 0x9C, 0x00, 0xDC, 0x37, 0x64, 0x30, 0x30, 0x1D, 0x38, 0x1A, 0xA8, + 0x05, 0x04, 0xD8, 0x08, 0x3C, 0x08, 0x3C, 0xD3, 0x1F, 0x80, 0x4E, 0xF5, + 0x61, 0x2B, 0xBA, 0x12, 0xF8, 0x16, 0x70, 0x26, 0x50, 0x0F, 0x94, 0xDB, + 0xDF, 0xDB, 0x81, 0x45, 0xC0, 0x6D, 0x76, 0x75, 0x24, 0x00, 0xF7, 0x4E, + 0xDB, 0xE2, 0x18, 0x60, 0x2E, 0xB0, 0x93, 0xA9, 0xE6, 0x6C, 0xE9, 0x04, + 0xDE, 0x04, 0xCE, 0x05, 0x9E, 0xB3, 0x99, 0x9D, 0x18, 0x59, 0xBD, 0x48, + 0xAA, 0x80, 0x19, 0x79, 0xC0, 0xCD, 0xF4, 0x7B, 0x82, 0xA9, 0xEF, 0x3E, + 0xBD, 0x4C, 0xF5, 0x55, 0x80, 0x2B, 0x81, 0x1D, 0xF3, 0x80, 0x9B, 0x6D, + 0x7F, 0x8C, 0x49, 0x00, 0xEE, 0xBD, 0xFD, 0x72, 0x01, 0xAE, 0x3C, 0xF1, + 0x83, 0x13, 0x49, 0x00, 0x4E, 0x24, 0x01, 0x38, 0x91, 0x04, 0xE0, 0x44, + 0x12, 0x80, 0x13, 0x49, 0x00, 0x4E, 0x24, 0x01, 0x38, 0x01, 0xB8, 0x8F, + 0x48, 0x2A, 0x81, 0x37, 0xBC, 0x28, 0xCE, 0xA7, 0xD0, 0x30, 0x21, 0xC0, + 0x1B, 0xC0, 0x86, 0x64, 0xA8, 0x3F, 0x26, 0x93, 0x80, 0xA1, 0xF6, 0x79, + 0x31, 0xB0, 0xAA, 0xB7, 0x00, 0x3C, 0x08, 0xDD, 0xBD, 0x39, 0x06, 0xD8, + 0xD6, 0xFE, 0xB6, 0x04, 0x78, 0x1A, 0x78, 0x18, 0x58, 0x19, 0xD1, 0x00, + 0x0A, 0xBA, 0x6B, 0x54, 0x48, 0xCA, 0x89, 0x76, 0xA3, 0xA1, 0x1E, 0x98, + 0x89, 0x6E, 0x5F, 0x0E, 0xB3, 0xBF, 0x7D, 0x60, 0x63, 0x73, 0x27, 0xD0, + 0x1A, 0x67, 0x80, 0x6B, 0x81, 0x0B, 0x81, 0xD3, 0x81, 0x91, 0x59, 0xCF, + 0x9E, 0x08, 0x4C, 0xB5, 0xCE, 0xDD, 0x6C, 0x1D, 0x0A, 0x5B, 0xD2, 0xC0, + 0x6A, 0x87, 0xFB, 0x3E, 0x8C, 0x10, 0xE0, 0x5D, 0xD1, 0xED, 0xCB, 0x93, + 0x81, 0x11, 0x59, 0xE3, 0x33, 0x09, 0xD8, 0x1B, 0xD8, 0x0E, 0xB8, 0x0E, + 0x68, 0x0B, 0xF6, 0x55, 0x17, 0x09, 0xE2, 0xAA, 0x12, 0x91, 0xD9, 0x22, + 0xB2, 0x46, 0x72, 0x4B, 0xA7, 0x88, 0xAC, 0x12, 0x91, 0xAB, 0x45, 0xA4, + 0x3E, 0xA0, 0xDF, 0xF4, 0xBA, 0xCA, 0x45, 0x64, 0xBA, 0xFD, 0x66, 0x3E, + 0x59, 0x24, 0x22, 0x53, 0x45, 0xA4, 0x2C, 0x82, 0xF6, 0xEC, 0x26, 0x22, + 0xB7, 0x88, 0xC8, 0x3A, 0x8F, 0xF1, 0x59, 0x6A, 0xED, 0x09, 0xF4, 0xB7, + 0x83, 0x32, 0xB2, 0x06, 0x02, 0x87, 0xD8, 0xCC, 0xCD, 0x67, 0xF0, 0x8C, + 0xB6, 0xD9, 0x7D, 0x2E, 0xB0, 0x43, 0xC8, 0xB3, 0xA5, 0x03, 0x78, 0x01, + 0xB8, 0x01, 0x58, 0x9E, 0xE3, 0xFF, 0x17, 0x01, 0xBF, 0x32, 0xFB, 0xA0, + 0x33, 0xE4, 0xB6, 0xEC, 0x02, 0x7C, 0xD7, 0x54, 0xF3, 0x70, 0x8F, 0xF1, + 0xA9, 0xB7, 0xD9, 0x3D, 0x20, 0x8E, 0x2A, 0xBA, 0x3C, 0x6B, 0x4D, 0xA1, + 0x00, 0xC8, 0x67, 0xDA, 0xE7, 0x1B, 0x80, 0x15, 0x21, 0x0E, 0x6C, 0x23, + 0xF0, 0x5B, 0x60, 0x21, 0x70, 0x7C, 0xD6, 0xE0, 0x7E, 0x68, 0x6B, 0xDE, + 0xAB, 0xC0, 0xE6, 0x90, 0xC1, 0xDD, 0x19, 0xF8, 0x01, 0xF0, 0x05, 0xA0, + 0xCE, 0x61, 0x7C, 0x76, 0x01, 0x6A, 0x80, 0x96, 0xB8, 0x01, 0xDC, 0xE9, + 0x38, 0x13, 0x52, 0x36, 0xCB, 0xBF, 0x62, 0x9F, 0xAF, 0x0F, 0x11, 0x64, + 0x01, 0xD6, 0x02, 0xF3, 0x80, 0xFF, 0x02, 0xD5, 0xF6, 0xF7, 0x16, 0xE0, + 0x23, 0x5B, 0xA7, 0xC3, 0x06, 0xF7, 0x42, 0x03, 0x77, 0x98, 0xE3, 0x77, + 0x36, 0x38, 0x1A, 0x87, 0x91, 0x03, 0xBC, 0x05, 0x78, 0x05, 0x65, 0x51, + 0xB8, 0xC8, 0xA8, 0x2C, 0x90, 0xAF, 0x0B, 0xD9, 0xBA, 0x6E, 0xC9, 0x61, + 0xD8, 0x49, 0x44, 0xE0, 0xCE, 0xCC, 0x72, 0x87, 0x5C, 0xE4, 0x31, 0x1B, + 0xCB, 0xD8, 0x05, 0x3A, 0xDA, 0x80, 0xBF, 0x02, 0x2F, 0xFA, 0xF8, 0x4E, + 0x66, 0x26, 0x9F, 0x1F, 0xC1, 0x9A, 0x2C, 0xDD, 0xAE, 0xB0, 0xD7, 0xDC, + 0x39, 0xC0, 0x29, 0x3E, 0xC1, 0x7D, 0xC8, 0xEC, 0x86, 0x8E, 0x38, 0x02, + 0x9C, 0xF1, 0x77, 0x7F, 0x02, 0xBC, 0xEE, 0xE3, 0x3B, 0x23, 0x80, 0x2F, + 0x03, 0xDF, 0xF6, 0x30, 0xD0, 0x7A, 0x93, 0x8C, 0x06, 0x2E, 0x02, 0x3E, + 0x8F, 0x72, 0xB1, 0x5D, 0x65, 0x3E, 0x70, 0xB5, 0xA3, 0x6B, 0x57, 0x32, + 0x80, 0xDB, 0x81, 0xA7, 0xEC, 0xED, 0x7D, 0xCD, 0x27, 0xC8, 0xA7, 0x03, + 0x27, 0xA1, 0x64, 0xB9, 0xDE, 0x2A, 0xD5, 0xC0, 0x19, 0x45, 0x80, 0x3B, + 0x0F, 0xB8, 0xCC, 0x96, 0xB8, 0xAD, 0x71, 0x8F, 0x64, 0xB5, 0x00, 0x4F, + 0x9A, 0x9A, 0xF9, 0x29, 0xB0, 0x9F, 0x0F, 0x75, 0x7D, 0x22, 0xF0, 0x68, + 0xC0, 0x46, 0xD7, 0x00, 0xB3, 0x4A, 0xB7, 0xCD, 0x8A, 0xAC, 0xAD, 0xB6, + 0xD0, 0xE0, 0x96, 0x80, 0x0D, 0xAD, 0xED, 0x81, 0x13, 0x8A, 0x58, 0x73, + 0x33, 0xE0, 0x86, 0x62, 0xF4, 0x85, 0x11, 0x8B, 0x6E, 0x45, 0x43, 0x93, + 0x73, 0x80, 0x9F, 0x01, 0xFB, 0xFA, 0x50, 0x6F, 0x83, 0x7A, 0xF0, 0xBB, + 0xDB, 0x00, 0x7B, 0x02, 0x7B, 0xD9, 0x20, 0x6F, 0x6B, 0xCF, 0xAC, 0xB2, + 0xFF, 0xAB, 0xCD, 0x72, 0x9F, 0x36, 0xA1, 0x59, 0x0D, 0x6B, 0xCD, 0x6D, + 0x6A, 0x34, 0xAD, 0xB3, 0x90, 0xE2, 0xB3, 0x1D, 0x86, 0xD9, 0xEF, 0xB9, + 0xCA, 0xE3, 0x36, 0x09, 0x42, 0x03, 0x37, 0x2C, 0x80, 0xB3, 0x41, 0xBE, + 0xD8, 0xDE, 0xD0, 0xFD, 0x43, 0x6A, 0x4B, 0x2D, 0x30, 0x05, 0x38, 0x0A, + 0xDD, 0xDC, 0xA8, 0x37, 0x60, 0xAB, 0xED, 0xAA, 0xB2, 0x65, 0xA8, 0x2C, + 0x6B, 0x39, 0xEA, 0xCC, 0xBA, 0xDA, 0xAC, 0xAD, 0x6D, 0x36, 0xAB, 0x97, + 0x01, 0x0B, 0x6C, 0xF0, 0x17, 0x01, 0x4D, 0x3E, 0x0D, 0x39, 0xD7, 0x1D, + 0xAC, 0x47, 0x81, 0xCB, 0x81, 0x97, 0xC3, 0x76, 0xD7, 0xC2, 0xCE, 0x6C, + 0xA8, 0x01, 0xA6, 0x01, 0x97, 0xD8, 0xBF, 0x5E, 0x72, 0x37, 0x1A, 0xE5, + 0x5A, 0xEB, 0xF0, 0xDC, 0x09, 0xC0, 0x64, 0xE0, 0x38, 0xFB, 0x3C, 0xC6, + 0xD4, 0x71, 0xA5, 0x01, 0xE9, 0x77, 0xAB, 0x50, 0x0C, 0xF0, 0xB4, 0x05, + 0x3F, 0x56, 0x00, 0x6F, 0x03, 0xF7, 0x03, 0xFF, 0x04, 0xD6, 0x3B, 0x3C, + 0x63, 0x2C, 0xF0, 0x47, 0xE0, 0xB0, 0x02, 0xF7, 0xDD, 0x6F, 0x06, 0xD5, + 0xAB, 0x11, 0xF8, 0xE2, 0x10, 0x41, 0x1C, 0xB6, 0x5A, 0x44, 0x0E, 0x17, + 0x91, 0xE7, 0x3C, 0xE2, 0xC2, 0x2B, 0x44, 0xE4, 0x04, 0x8B, 0x21, 0x7B, + 0x3D, 0xAB, 0x4E, 0x44, 0x4E, 0x15, 0x91, 0x47, 0x45, 0x64, 0xB9, 0x88, + 0x34, 0x5B, 0x1C, 0x37, 0x68, 0x69, 0x17, 0x91, 0x26, 0x11, 0x79, 0x4F, + 0x44, 0xEE, 0x11, 0x91, 0x13, 0x45, 0xA4, 0xB6, 0x40, 0xDB, 0x2A, 0x45, + 0xE4, 0x0C, 0x11, 0xD9, 0xE0, 0xF1, 0xDC, 0x07, 0x44, 0x64, 0x8A, 0xC5, + 0xEE, 0xA3, 0x18, 0xFB, 0x48, 0x00, 0xCE, 0x80, 0x7C, 0xA4, 0x0D, 0x56, + 0x73, 0xB7, 0x81, 0x7C, 0x43, 0x44, 0xCE, 0x15, 0x91, 0x11, 0x1E, 0xDF, + 0x1F, 0x28, 0x22, 0x07, 0x8B, 0xC8, 0x1D, 0x16, 0x94, 0x6F, 0x09, 0x09, + 0xD8, 0x5C, 0x9B, 0x00, 0x2D, 0x22, 0xB2, 0xD8, 0x36, 0x0B, 0xF6, 0x2E, + 0xD0, 0xCF, 0x51, 0x22, 0x72, 0x81, 0x88, 0xBC, 0xDF, 0xED, 0x39, 0x8D, + 0x22, 0xF2, 0x7B, 0x11, 0x99, 0x16, 0x25, 0xB8, 0x22, 0x12, 0x69, 0xF2, + 0x59, 0x0D, 0xBA, 0x25, 0x36, 0xDD, 0x54, 0x6A, 0x95, 0xA9, 0xBE, 0x97, + 0x2C, 0x94, 0xD8, 0x98, 0x27, 0xDC, 0x39, 0x1A, 0x98, 0x05, 0x9C, 0x86, + 0xA6, 0xA3, 0x0C, 0x20, 0x7A, 0xB6, 0x86, 0xD8, 0x7A, 0xFC, 0x0E, 0xF0, + 0x6B, 0xE0, 0x01, 0x34, 0xCF, 0x38, 0x57, 0x28, 0xB6, 0xCE, 0x0C, 0xCB, + 0xC9, 0x66, 0x23, 0xB4, 0x00, 0x4B, 0xCD, 0xD7, 0x5D, 0x13, 0x89, 0x5A, + 0x8E, 0x70, 0x0D, 0xCE, 0x35, 0x00, 0x43, 0xCC, 0x00, 0x4A, 0x99, 0xDF, + 0xD7, 0xEC, 0xD1, 0xE9, 0x4F, 0x99, 0x35, 0xFE, 0x39, 0x73, 0xA5, 0x4A, + 0x4D, 0xC3, 0xE9, 0x30, 0x63, 0xEC, 0x2F, 0x16, 0x62, 0xFD, 0x28, 0xCF, + 0x7D, 0x55, 0xD6, 0xCF, 0x72, 0x7B, 0x69, 0x5B, 0xAD, 0x9F, 0x91, 0x67, + 0x31, 0xC6, 0x35, 0x7D, 0x34, 0x05, 0x7C, 0xC6, 0xC0, 0x3D, 0xD2, 0x67, + 0xE0, 0x20, 0x8A, 0xD9, 0xDC, 0x60, 0xB3, 0xF8, 0x12, 0xE0, 0x7F, 0x71, + 0x8E, 0xBE, 0xC4, 0x15, 0xE0, 0xC3, 0xCD, 0xC5, 0x3A, 0x90, 0x80, 0xF7, + 0x47, 0x03, 0x94, 0xCD, 0xC0, 0xDF, 0x81, 0xEF, 0xC7, 0x19, 0xE4, 0x38, + 0x02, 0x3C, 0x05, 0xB8, 0x02, 0xA5, 0xF9, 0x14, 0x1B, 0xBA, 0x6C, 0x44, + 0x37, 0xF3, 0xD7, 0x98, 0x8F, 0xBB, 0xD2, 0xAE, 0x32, 0x8B, 0x38, 0x8D, + 0x31, 0x9B, 0x60, 0x14, 0xB0, 0x0F, 0x5D, 0x5B, 0x89, 0x7E, 0x65, 0x8B, + 0xCD, 0xE4, 0xF3, 0xC2, 0x88, 0x23, 0xC7, 0x39, 0xD0, 0x51, 0xAC, 0x8C, + 0x02, 0xBE, 0x07, 0x1C, 0x54, 0x04, 0xB8, 0x9D, 0x16, 0x38, 0xF8, 0x17, + 0xBA, 0xF1, 0xF1, 0x1A, 0x5D, 0xFB, 0xAB, 0x2D, 0x74, 0x71, 0x9D, 0xAA, + 0xB3, 0x7C, 0xE6, 0xE1, 0x16, 0x84, 0xD9, 0x15, 0x38, 0x14, 0xE5, 0x47, + 0xF9, 0x91, 0x81, 0x16, 0x9E, 0xDC, 0x00, 0x5C, 0xE0, 0x33, 0x30, 0xD2, + 0xEF, 0x66, 0xF0, 0x60, 0xE0, 0xC7, 0xC0, 0x39, 0xF6, 0xD9, 0x8F, 0xE1, + 0xF3, 0x92, 0x05, 0x4A, 0x5E, 0x04, 0xDE, 0x33, 0xA3, 0xAD, 0x29, 0xCB, + 0x2A, 0x97, 0x1C, 0x6B, 0x3C, 0x66, 0x04, 0x0D, 0xB2, 0xD9, 0xBC, 0x87, + 0xBD, 0x58, 0x33, 0x6D, 0x56, 0xFB, 0x91, 0x8D, 0x16, 0x76, 0xFC, 0x79, + 0x02, 0x70, 0x7E, 0x99, 0x6D, 0xAA, 0xB9, 0xCE, 0xC7, 0x77, 0x96, 0xA1, + 0x4C, 0xCD, 0x79, 0x06, 0x6C, 0x33, 0xC5, 0x33, 0x22, 0xAA, 0x6C, 0x66, + 0xEF, 0x81, 0x12, 0x17, 0xCE, 0x31, 0x8D, 0xE2, 0x2A, 0xCB, 0x81, 0xAF, + 0x03, 0x8F, 0xC4, 0x0A, 0xE1, 0x28, 0x9D, 0x6E, 0x8F, 0x6B, 0x3F, 0x11, + 0x79, 0xC5, 0x67, 0x10, 0xE2, 0x31, 0x11, 0x99, 0x21, 0x22, 0x43, 0x1D, + 0x22, 0x60, 0x7E, 0xAE, 0x0A, 0x0B, 0xBA, 0x9C, 0x2E, 0x22, 0xAF, 0xFA, + 0x68, 0x4F, 0x87, 0xB5, 0x69, 0xE7, 0x98, 0x8C, 0x69, 0xA0, 0xAC, 0xCA, + 0x9E, 0x48, 0x1D, 0xF0, 0x55, 0x73, 0x8B, 0x5C, 0xE5, 0xCF, 0x28, 0xC7, + 0xF8, 0x09, 0x53, 0x8F, 0x41, 0xB2, 0x20, 0xDA, 0x81, 0x75, 0xC0, 0x7D, + 0xC0, 0x0F, 0xED, 0x37, 0x5C, 0xA4, 0xCC, 0xE2, 0xED, 0x27, 0x13, 0xA3, + 0xB4, 0x99, 0x38, 0x00, 0x7C, 0x98, 0xA9, 0xC4, 0x4A, 0xC7, 0xFB, 0x7F, + 0x63, 0x06, 0xCD, 0xBB, 0x84, 0x90, 0x09, 0x90, 0x25, 0x4D, 0xE8, 0x46, + 0xC3, 0x37, 0xD1, 0x0D, 0x02, 0x57, 0xA3, 0x6B, 0x16, 0x4A, 0x64, 0x4F, + 0x00, 0x36, 0x77, 0xE5, 0x44, 0x34, 0x84, 0xE9, 0x22, 0x77, 0x02, 0x97, + 0x9A, 0xCB, 0xD3, 0x19, 0x41, 0xFB, 0x5A, 0xD0, 0xF0, 0xE4, 0xB5, 0xC0, + 0xB3, 0x8E, 0xDF, 0xD9, 0x0D, 0x65, 0x52, 0x56, 0x25, 0x00, 0x6B, 0x20, + 0xE3, 0x68, 0xDC, 0xAA, 0xDD, 0xBC, 0x82, 0x6E, 0xB3, 0x45, 0x99, 0x6E, + 0x92, 0x71, 0xBF, 0xFE, 0x0D, 0x5C, 0x69, 0x86, 0x9C, 0x8B, 0xEB, 0x79, + 0x02, 0x9A, 0xB2, 0xD3, 0xAF, 0x01, 0x1E, 0x08, 0x1C, 0xE0, 0x68, 0xA9, + 0xAE, 0x32, 0x0B, 0x7B, 0x21, 0xA5, 0xA9, 0x4A, 0xD7, 0x86, 0x52, 0x91, + 0xAE, 0xC2, 0x8D, 0x2C, 0xBF, 0x87, 0x45, 0xE3, 0xCA, 0xFB, 0x33, 0xC0, + 0xE3, 0xD0, 0x0D, 0xFB, 0x42, 0x6D, 0x68, 0xB7, 0x35, 0xF0, 0x31, 0x82, + 0x4E, 0xCC, 0xF2, 0x27, 0xAD, 0xB6, 0x44, 0xCC, 0x77, 0xB8, 0xB7, 0xD2, + 0x6C, 0x8B, 0xD1, 0xFD, 0x19, 0xE0, 0x09, 0xB6, 0x5E, 0xB9, 0xF8, 0x97, + 0x7F, 0x20, 0x60, 0x42, 0x78, 0x91, 0xB2, 0x19, 0xB8, 0x05, 0xB7, 0x7C, + 0xE7, 0x43, 0x2D, 0x42, 0xD6, 0x2F, 0x01, 0xAE, 0x03, 0x8E, 0xC0, 0x2D, + 0x54, 0xFA, 0x28, 0xFE, 0xB8, 0xD6, 0x61, 0xCB, 0x53, 0x68, 0x29, 0x62, + 0x97, 0x25, 0x68, 0x9F, 0x52, 0x1B, 0x5B, 0xA5, 0x02, 0xB8, 0x16, 0xB7, + 0x70, 0x60, 0x0B, 0x70, 0x2F, 0x01, 0xE7, 0xEB, 0x04, 0xB0, 0x1E, 0xDF, + 0xE1, 0xE8, 0x7B, 0x1F, 0x89, 0xBF, 0xC8, 0x5C, 0x9F, 0x01, 0x78, 0x88, + 0x63, 0xC7, 0x5F, 0x44, 0xC9, 0x69, 0x71, 0xDB, 0xF2, 0x7A, 0x0D, 0xB7, + 0x44, 0xF6, 0x1D, 0xE9, 0x19, 0x15, 0xB8, 0xC7, 0x92, 0x4F, 0x45, 0x0E, + 0x46, 0xB7, 0xEB, 0x46, 0xE3, 0x56, 0xE6, 0x20, 0x65, 0xEE, 0x44, 0x33, + 0x4A, 0xBF, 0x59, 0x5C, 0xE0, 0xFE, 0x51, 0x74, 0x11, 0xD1, 0xBD, 0x64, + 0x3E, 0xBA, 0xF5, 0x17, 0x37, 0xF9, 0xD0, 0x82, 0x20, 0x3B, 0x39, 0xBC, + 0xC8, 0x43, 0x1D, 0xED, 0x91, 0x89, 0xB8, 0xD1, 0x91, 0x52, 0x74, 0xB1, + 0x40, 0x57, 0xA0, 0xF9, 0x4C, 0x2D, 0x7E, 0x00, 0x1E, 0x0F, 0x7C, 0xCD, + 0xFC, 0xD3, 0x81, 0x3E, 0x67, 0x79, 0x1A, 0xA5, 0x9B, 0x5E, 0xE5, 0xB1, + 0x4E, 0x55, 0xA0, 0x04, 0xF5, 0x1A, 0x87, 0xE7, 0x2D, 0x23, 0x9E, 0xB2, + 0x05, 0xDD, 0x9A, 0x9C, 0x55, 0xE0, 0xBE, 0x11, 0x78, 0xA7, 0x8E, 0xD6, + 0xA2, 0x74, 0xA4, 0x59, 0x36, 0xDB, 0x2B, 0x7D, 0xB4, 0xA1, 0x13, 0xE5, + 0xB4, 0x3D, 0x62, 0x46, 0xE8, 0x62, 0x17, 0x80, 0xEB, 0xD0, 0x6C, 0xBF, + 0x99, 0xA6, 0x5A, 0x8A, 0xE1, 0x17, 0x8F, 0x41, 0xF9, 0x53, 0xDF, 0xB0, + 0x41, 0xC8, 0xF5, 0x9B, 0xE3, 0x1D, 0x9E, 0xD5, 0x88, 0x46, 0x91, 0xE2, + 0x2A, 0x9B, 0x1C, 0xEE, 0x19, 0x60, 0xDA, 0x2A, 0x95, 0x43, 0x0B, 0x96, + 0xA3, 0xC5, 0x6A, 0x2E, 0x41, 0xB9, 0x67, 0xE5, 0x45, 0x8C, 0xF7, 0x18, + 0x94, 0xEC, 0x5F, 0x85, 0x6E, 0x57, 0x6E, 0x2A, 0xB4, 0x06, 0xCF, 0x30, + 0x70, 0x87, 0xD0, 0x45, 0x20, 0xF7, 0x73, 0x95, 0xA1, 0x1B, 0xEA, 0x7B, + 0xA3, 0x89, 0x58, 0x43, 0xF2, 0x34, 0xCC, 0x85, 0x41, 0xB1, 0x94, 0xDC, + 0xE5, 0x17, 0xE2, 0x22, 0x6B, 0x71, 0x4B, 0x73, 0xC9, 0x37, 0x51, 0x76, + 0x04, 0xCE, 0x32, 0x35, 0x5F, 0x59, 0xE4, 0x78, 0x67, 0x2A, 0x2B, 0x9C, + 0x46, 0x1E, 0xC2, 0x7D, 0x77, 0x80, 0x27, 0x7B, 0x80, 0xE2, 0x77, 0x6D, + 0x3F, 0xCC, 0x82, 0x19, 0xB9, 0xD6, 0x10, 0x17, 0xF7, 0x68, 0x23, 0xD1, + 0xC4, 0x9B, 0x8B, 0x95, 0x77, 0x71, 0xCB, 0x78, 0xC8, 0xB7, 0xAE, 0x8E, + 0x45, 0xF3, 0xA8, 0x82, 0x30, 0x74, 0x47, 0x03, 0x9F, 0x76, 0x01, 0x78, + 0x48, 0x80, 0x03, 0x30, 0xCC, 0xC3, 0x82, 0x74, 0x51, 0x45, 0x5B, 0x63, + 0x0E, 0x70, 0x13, 0x6E, 0x1C, 0xE7, 0x7C, 0x06, 0x6A, 0x15, 0xC1, 0x51, + 0xA6, 0x52, 0xE4, 0x21, 0x27, 0x76, 0x07, 0x38, 0xC8, 0x8A, 0x74, 0xAB, + 0xC8, 0x4D, 0x0E, 0x17, 0x47, 0x1F, 0x32, 0xEE, 0xE5, 0xF6, 0x47, 0x3A, + 0xBA, 0x40, 0xE2, 0xE1, 0x4F, 0x07, 0x49, 0x82, 0x6F, 0x71, 0x01, 0x78, + 0x81, 0xA9, 0xC6, 0x20, 0xE4, 0x31, 0x53, 0x63, 0x7E, 0x3A, 0xDD, 0xDD, + 0x02, 0x8D, 0x73, 0x42, 0xF8, 0xEE, 0xE4, 0x2F, 0x8B, 0xD4, 0x5D, 0x13, + 0xE5, 0xEA, 0xEF, 0x62, 0xE0, 0xF9, 0x80, 0xDA, 0xB2, 0x0C, 0x8D, 0xB0, + 0x15, 0x04, 0xF8, 0x49, 0xB4, 0xF4, 0x50, 0x4F, 0xCB, 0xF8, 0x3C, 0x87, + 0xD6, 0x9C, 0xD8, 0x9A, 0xC7, 0xBC, 0x77, 0x61, 0x1F, 0xEE, 0x82, 0x5B, + 0xAC, 0xBA, 0x54, 0x52, 0xED, 0xF0, 0x02, 0x8A, 0x79, 0x03, 0xB9, 0x00, + 0x5E, 0x03, 0xDC, 0x6A, 0x71, 0x83, 0x9E, 0xC8, 0x06, 0x94, 0x04, 0xF1, + 0xB2, 0x8B, 0x9B, 0xB4, 0x12, 0x2D, 0x10, 0xD6, 0x66, 0x7E, 0xF0, 0x10, + 0xC7, 0x59, 0x24, 0x59, 0xC0, 0xBD, 0x02, 0xFC, 0x0E, 0x3D, 0x78, 0x2A, + 0x97, 0x7B, 0xB0, 0x15, 0xF8, 0x8F, 0xC3, 0x33, 0x07, 0x9A, 0xFB, 0xF0, + 0x7C, 0x0C, 0x23, 0x59, 0x65, 0xB8, 0xD5, 0x14, 0x69, 0x36, 0x43, 0x2C, + 0x57, 0xFB, 0x33, 0xC5, 0xDA, 0xBE, 0x63, 0x7E, 0xF0, 0x5E, 0x16, 0x1B, + 0x70, 0x5D, 0x9A, 0xDA, 0x50, 0x2E, 0xF6, 0x9D, 0x28, 0x37, 0x3B, 0xED, + 0x02, 0x70, 0x87, 0xB9, 0x26, 0xD7, 0xA2, 0x34, 0xD4, 0xC1, 0x8E, 0xCE, + 0x77, 0xCA, 0xBE, 0xDB, 0x6C, 0xEE, 0xCD, 0x46, 0x8F, 0x75, 0x56, 0x4C, + 0x3D, 0x35, 0x51, 0x98, 0x1E, 0xBB, 0xBB, 0x0D, 0x66, 0xDC, 0x8E, 0x9F, + 0xDB, 0x06, 0xAD, 0xEC, 0xE7, 0xE2, 0x09, 0xAC, 0x2D, 0xF0, 0x02, 0x3C, + 0x63, 0xC1, 0xA1, 0x7A, 0xFC, 0x25, 0xD6, 0xA5, 0xED, 0xD9, 0xCB, 0xBC, + 0xD6, 0xF2, 0x8A, 0x3C, 0x2A, 0xB4, 0x81, 0xE2, 0x43, 0x84, 0x2E, 0x60, + 0x34, 0x98, 0x6A, 0x29, 0x04, 0xF0, 0x74, 0xE0, 0x97, 0x76, 0x6F, 0x9C, + 0x66, 0xF1, 0x48, 0x0A, 0x27, 0xB4, 0x67, 0x82, 0x21, 0x8D, 0x0E, 0xE3, + 0xB5, 0x1A, 0xB7, 0xC4, 0x77, 0xDF, 0xE3, 0x5D, 0x56, 0xE0, 0x8B, 0xC5, + 0x5C, 0x2E, 0xD2, 0xE8, 0xD8, 0xA1, 0x3D, 0xD1, 0x54, 0x96, 0xB8, 0xA9, + 0xE8, 0xA9, 0xB8, 0x31, 0x51, 0xDE, 0x72, 0x8C, 0x78, 0x85, 0x36, 0xDE, + 0xA5, 0xDA, 0x4D, 0x5A, 0x8F, 0x06, 0xEB, 0x5D, 0xA2, 0x40, 0xA7, 0x50, + 0xE2, 0x1D, 0x99, 0x6E, 0x52, 0x0B, 0x7C, 0xC9, 0x71, 0xE9, 0x9A, 0x4F, + 0x89, 0x8B, 0xA1, 0x97, 0x0A, 0xE0, 0x26, 0x33, 0x30, 0x5C, 0x76, 0xA9, + 0x0E, 0x45, 0xC9, 0x79, 0x71, 0x91, 0x63, 0xD1, 0x88, 0x9F, 0x8B, 0x96, + 0x5A, 0x5A, 0xEA, 0x60, 0x4D, 0x29, 0x29, 0x3B, 0x0B, 0x51, 0xB6, 0x62, + 0x21, 0x19, 0x0B, 0x9C, 0x6A, 0x56, 0x75, 0xA9, 0x65, 0x04, 0x1A, 0x63, + 0x1F, 0xEA, 0x70, 0xEF, 0xB3, 0xC4, 0x60, 0x37, 0xAC, 0x94, 0x00, 0xBF, + 0x6F, 0xC1, 0x90, 0x42, 0x52, 0x81, 0x72, 0xA7, 0xCF, 0xC2, 0xDF, 0x76, + 0x5A, 0xD0, 0x52, 0x85, 0x56, 0x01, 0x3A, 0xD8, 0xF1, 0xFE, 0x7F, 0x58, + 0x1F, 0xFB, 0x2D, 0xC0, 0x69, 0xBA, 0x52, 0x3D, 0x0B, 0xC9, 0x70, 0x34, + 0xB1, 0xAB, 0x94, 0xAA, 0xFA, 0x38, 0x7B, 0xC9, 0x5C, 0xEC, 0x81, 0x97, + 0x6C, 0xFD, 0xED, 0xEC, 0xCF, 0x00, 0x63, 0xD1, 0x97, 0x27, 0x1C, 0xAD, + 0xE4, 0xF1, 0x68, 0xA1, 0xCF, 0x09, 0x25, 0x68, 0xE7, 0x01, 0x68, 0x39, + 0x89, 0x7A, 0xC7, 0xFB, 0x9F, 0x26, 0x9A, 0xB3, 0x29, 0x62, 0x0F, 0x70, + 0x03, 0x70, 0x8F, 0xE3, 0x60, 0xA4, 0x50, 0x12, 0xDB, 0x15, 0x44, 0x97, + 0x35, 0x90, 0x32, 0x37, 0xED, 0x7A, 0xDC, 0x4B, 0x32, 0xBE, 0x00, 0xDC, + 0x45, 0x3C, 0x68, 0xBE, 0xB1, 0x48, 0x3E, 0x7B, 0x0E, 0xF8, 0x1B, 0xEE, + 0xC7, 0xE0, 0xCC, 0x40, 0x13, 0xAD, 0xA7, 0x52, 0x7C, 0xE9, 0x05, 0x17, + 0xA9, 0xB6, 0x40, 0xCB, 0x5C, 0x03, 0xD9, 0x45, 0x5A, 0x81, 0x3F, 0xA1, + 0x44, 0xC1, 0x58, 0x48, 0x5C, 0x12, 0xC0, 0x77, 0x45, 0x03, 0xE6, 0x87, + 0x38, 0xDE, 0xDF, 0x81, 0x86, 0xF7, 0x6E, 0x45, 0x29, 0xAC, 0xEB, 0x02, + 0x6E, 0xCF, 0x76, 0x68, 0xB1, 0xF2, 0xD9, 0x68, 0xF5, 0x76, 0x57, 0xB9, + 0x0F, 0x4D, 0x1C, 0x5F, 0x9B, 0x00, 0xFC, 0x49, 0x39, 0x19, 0x0D, 0x4B, + 0x6E, 0xEF, 0xE3, 0x3B, 0x1B, 0xD1, 0x60, 0xFB, 0xFD, 0xB6, 0x9E, 0x37, + 0x04, 0xE0, 0x06, 0x4D, 0x45, 0xB3, 0x03, 0x67, 0xE2, 0xAF, 0xC2, 0xCF, + 0x22, 0x94, 0x87, 0x36, 0x9F, 0x18, 0x49, 0x9C, 0x00, 0xAE, 0x46, 0x09, + 0x7F, 0x17, 0xE1, 0xBF, 0x74, 0xD2, 0x5B, 0x68, 0x64, 0xEC, 0x61, 0xFB, + 0xBC, 0x12, 0xF7, 0xF0, 0x66, 0x39, 0xBA, 0x6B, 0x35, 0xC9, 0xD4, 0xFF, + 0x11, 0x3E, 0x67, 0x6D, 0xE6, 0x45, 0x3B, 0xCF, 0xD4, 0x73, 0x7B, 0x02, + 0x70, 0x7E, 0x19, 0x83, 0xB2, 0x03, 0x4F, 0x2B, 0xC2, 0xE7, 0x15, 0x94, + 0x60, 0xF0, 0x8E, 0x59, 0xE6, 0xEF, 0xA2, 0x61, 0xC2, 0x15, 0xE8, 0xFE, + 0x76, 0x47, 0x96, 0xDD, 0xB1, 0x3D, 0xBA, 0x23, 0x34, 0xD4, 0x0C, 0xB6, + 0x23, 0xD1, 0xBD, 0xE7, 0x1D, 0x8B, 0x68, 0x73, 0x0B, 0x9A, 0x5A, 0x7A, + 0x15, 0xA5, 0x4D, 0x8E, 0xEB, 0x15, 0x00, 0x63, 0x6E, 0xD0, 0x1C, 0x34, + 0xDE, 0x5B, 0x6C, 0x29, 0x84, 0xCC, 0x2E, 0x4E, 0x93, 0x01, 0x9D, 0x39, + 0x46, 0x27, 0x65, 0x9A, 0x62, 0x77, 0x5B, 0x67, 0xAB, 0x51, 0xEE, 0xD8, + 0xE0, 0x1E, 0xB4, 0xF7, 0x66, 0xB4, 0x18, 0xDA, 0x66, 0x62, 0x28, 0x71, + 0xAD, 0x74, 0x37, 0xC9, 0x54, 0xF5, 0xC9, 0x04, 0x43, 0xDB, 0xC9, 0x14, + 0x00, 0xCF, 0x50, 0x7B, 0x83, 0xA8, 0xA1, 0x91, 0x06, 0x6E, 0x37, 0x8B, + 0x7E, 0x11, 0x31, 0x95, 0x38, 0xD7, 0xAA, 0x9C, 0x48, 0xD7, 0x91, 0x70, + 0x83, 0x62, 0xD6, 0xBE, 0xF5, 0xC0, 0x4D, 0xE8, 0xE9, 0x6D, 0x0D, 0xC4, + 0x8F, 0x90, 0x50, 0x52, 0x80, 0x33, 0x2C, 0x91, 0x32, 0x9B, 0x05, 0x69, + 0x8F, 0xB5, 0x6B, 0x9C, 0xA9, 0xEA, 0xD9, 0x84, 0x7F, 0xB6, 0x92, 0xAB, + 0x7B, 0xB6, 0xC4, 0xD4, 0xF2, 0x4D, 0x1E, 0xED, 0xAE, 0x44, 0x37, 0x47, + 0xAA, 0x50, 0x8A, 0x52, 0x3B, 0x25, 0xAA, 0x82, 0x17, 0x25, 0xC0, 0x83, + 0xD0, 0xD2, 0x06, 0xA7, 0xD2, 0xC5, 0xE6, 0x6F, 0x40, 0xCF, 0x47, 0x98, + 0x67, 0xBE, 0x63, 0xAE, 0xD8, 0x6D, 0x15, 0xBA, 0x27, 0x3C, 0xCB, 0xFC, + 0xE4, 0x52, 0xD1, 0x69, 0x5B, 0xAC, 0x9D, 0xB7, 0x03, 0x0F, 0xE6, 0xB1, + 0x96, 0x53, 0x68, 0x52, 0xDD, 0xF1, 0x28, 0xF1, 0xBF, 0xD6, 0x5E, 0xE0, + 0x85, 0x28, 0x05, 0x6A, 0x09, 0xC5, 0x1F, 0xFA, 0x51, 0x9C, 0x44, 0x58, + 0xF1, 0xFD, 0x14, 0x2B, 0xEB, 0x9F, 0xEE, 0x56, 0x40, 0xEC, 0x03, 0x11, + 0xB9, 0x52, 0x44, 0xB6, 0xF3, 0xF8, 0x7E, 0x99, 0x88, 0x8C, 0x17, 0x91, + 0xEB, 0xAD, 0xE2, 0x7B, 0x5A, 0xA2, 0x93, 0x56, 0x11, 0x59, 0x28, 0x22, + 0x97, 0x89, 0xC8, 0x4E, 0x05, 0x8E, 0xA3, 0x1D, 0x2B, 0x22, 0x73, 0x45, + 0x64, 0x7D, 0xB7, 0x67, 0x6C, 0x16, 0x91, 0xF9, 0x56, 0xB8, 0xAD, 0x3A, + 0xCA, 0x42, 0x68, 0x51, 0x82, 0xFB, 0xBA, 0xC7, 0x20, 0xAE, 0x11, 0x91, + 0xB3, 0x1D, 0xCE, 0xF2, 0x1D, 0x64, 0xE7, 0x27, 0xDC, 0x6A, 0xE7, 0x29, + 0xB4, 0xDA, 0xB1, 0x00, 0x61, 0x9C, 0xD9, 0xD0, 0x2C, 0x22, 0x6F, 0x8B, + 0xC8, 0x8D, 0x22, 0x72, 0x8C, 0x1D, 0x2B, 0x40, 0x81, 0x97, 0xF0, 0xFC, + 0x6E, 0x47, 0x16, 0x74, 0x97, 0x67, 0x44, 0xE4, 0x58, 0x11, 0xA9, 0x89, + 0x0A, 0xE0, 0xB0, 0xAB, 0xCD, 0x0E, 0xB0, 0xA8, 0xD0, 0x45, 0x78, 0x67, + 0x14, 0x8E, 0x34, 0x35, 0xFC, 0x38, 0xDE, 0xB5, 0x97, 0x9B, 0x4D, 0x3D, + 0x3E, 0x85, 0x16, 0x0E, 0x3D, 0xCC, 0xFE, 0xDD, 0xDD, 0x96, 0x80, 0xEA, + 0x22, 0x55, 0x78, 0x86, 0xF6, 0xDB, 0x6A, 0x6B, 0xE5, 0x02, 0x8B, 0x8C, + 0x3D, 0x89, 0xD2, 0x80, 0x5D, 0x5C, 0xA0, 0x9D, 0xAD, 0xAF, 0x5E, 0xC4, + 0x84, 0xCF, 0x5A, 0x1B, 0x2B, 0x89, 0xA8, 0xA8, 0x4C, 0x98, 0x00, 0xD7, + 0x58, 0x87, 0xE7, 0x18, 0x00, 0x85, 0xA4, 0x0E, 0x77, 0xD6, 0x46, 0x23, + 0xBA, 0xA1, 0xFE, 0x84, 0xAD, 0xEB, 0x93, 0x51, 0x82, 0xDE, 0x34, 0x0B, + 0x37, 0xD6, 0xD0, 0x55, 0x45, 0xB6, 0xDC, 0xC3, 0x60, 0xDA, 0x62, 0x57, + 0xE6, 0xC8, 0xD9, 0x67, 0x2D, 0x12, 0xF6, 0x32, 0x5A, 0x13, 0xCB, 0x4F, + 0x54, 0x2A, 0x13, 0x38, 0x29, 0x24, 0x93, 0xD1, 0x12, 0x89, 0x62, 0x20, + 0xA7, 0x7B, 0x23, 0xC0, 0x35, 0xE8, 0x19, 0x7E, 0x17, 0x3B, 0x82, 0x4B, + 0x91, 0xBE, 0xE9, 0x56, 0xB4, 0xF0, 0xF7, 0x1B, 0x66, 0x8C, 0x4D, 0xB0, + 0x41, 0x1E, 0x63, 0xE1, 0xC7, 0xDD, 0xD0, 0xCC, 0xBB, 0x4E, 0xBA, 0x76, + 0xCE, 0x3A, 0xEC, 0xF3, 0x6A, 0xF3, 0x5F, 0x97, 0xD3, 0x75, 0xFA, 0xD9, + 0xC2, 0x1E, 0x86, 0x1A, 0x5D, 0xFB, 0xB0, 0x5F, 0x37, 0x90, 0xB7, 0xF6, + 0x26, 0x80, 0x33, 0x6A, 0xF9, 0x47, 0xB8, 0x97, 0x11, 0x12, 0x94, 0xA0, + 0xD6, 0x13, 0x06, 0x62, 0x9A, 0x4F, 0x66, 0x4C, 0xD4, 0x9A, 0x5B, 0xD6, + 0x91, 0x35, 0x93, 0x33, 0x00, 0x6F, 0x0E, 0xD8, 0x75, 0x59, 0x83, 0x72, + 0xB0, 0x5C, 0xD3, 0x6D, 0xF6, 0x47, 0xEB, 0x63, 0x57, 0xA1, 0x59, 0xFA, + 0xAD, 0xBD, 0x01, 0xE0, 0x01, 0xC0, 0x17, 0x4D, 0x2D, 0x8F, 0xF3, 0xF1, + 0xBD, 0x95, 0xE8, 0x49, 0x26, 0xEB, 0x03, 0x6E, 0x4F, 0x23, 0xD1, 0xD5, + 0xF8, 0x58, 0x81, 0xEE, 0x6C, 0x4D, 0xC1, 0xFD, 0x10, 0x91, 0x7D, 0x6D, + 0xAC, 0x52, 0xE8, 0xF9, 0x0F, 0x81, 0x83, 0x5C, 0x16, 0xF0, 0xCB, 0x32, + 0xB3, 0x08, 0x70, 0x3F, 0x42, 0xF3, 0xA1, 0xE6, 0x11, 0xEF, 0x7C, 0x60, + 0x17, 0x2D, 0x74, 0x2F, 0x70, 0x1B, 0xFE, 0xD8, 0x1C, 0x7B, 0x9B, 0x11, + 0x3A, 0x9D, 0x30, 0x98, 0xA3, 0x01, 0x9A, 0xE4, 0x07, 0x99, 0xBF, 0xE8, + 0xE7, 0x54, 0xB1, 0x95, 0x76, 0x52, 0x58, 0x6D, 0x9C, 0x8A, 0x68, 0xF7, + 0xF0, 0xAA, 0x13, 0x91, 0x6B, 0xEC, 0xB4, 0x33, 0x3F, 0xF2, 0xBC, 0x88, + 0x8C, 0x8B, 0x6B, 0x41, 0xF0, 0xC1, 0xE6, 0xE6, 0x8C, 0xF7, 0xF1, 0xB6, + 0x7F, 0x08, 0xDC, 0x68, 0xB3, 0x37, 0x0A, 0x35, 0x5A, 0x1E, 0x51, 0x14, + 0x6C, 0x03, 0x7A, 0xB2, 0xE8, 0x2D, 0xF8, 0xDB, 0x61, 0x3A, 0x10, 0xDD, + 0x8B, 0x2E, 0x8B, 0xA3, 0x8A, 0xAE, 0xF2, 0x61, 0x2D, 0x67, 0x83, 0x7B, + 0x33, 0xE1, 0x6E, 0xB3, 0x95, 0x9B, 0x45, 0x3F, 0x1A, 0xAD, 0xAC, 0xB7, + 0x17, 0x4A, 0xC1, 0x0D, 0x3B, 0xB1, 0xBC, 0x01, 0xDD, 0x23, 0xBE, 0xD9, + 0xA7, 0x21, 0x37, 0x8D, 0x80, 0x37, 0x56, 0x82, 0xAC, 0x11, 0xE1, 0xE2, + 0x5E, 0x74, 0x1A, 0xB8, 0x37, 0xD8, 0x5A, 0xB5, 0x29, 0xC4, 0x41, 0xAE, + 0xB0, 0x98, 0xF7, 0xA1, 0x68, 0xAE, 0xF3, 0x78, 0x7B, 0xB9, 0x16, 0xA0, + 0xDC, 0xA9, 0xC7, 0x43, 0xD6, 0x1C, 0xEB, 0x51, 0x06, 0x68, 0x07, 0x5A, + 0x77, 0xCC, 0xC5, 0xF0, 0xAA, 0x0E, 0xDA, 0xF0, 0x0D, 0xEA, 0x61, 0x69, + 0xEB, 0x50, 0xA7, 0x87, 0x56, 0xC8, 0x54, 0x66, 0x9B, 0x6B, 0xE0, 0x6E, + 0x0C, 0x79, 0x16, 0x0D, 0x43, 0xCB, 0xF1, 0x9F, 0xCD, 0xC7, 0x29, 0x40, + 0x13, 0xD1, 0xFC, 0xA2, 0x4B, 0xAD, 0x1D, 0xCD, 0x21, 0xCF, 0xE4, 0x6B, + 0xEC, 0xC5, 0x9A, 0x8D, 0x77, 0xC9, 0x87, 0x0E, 0x34, 0xDB, 0x3F, 0xD8, + 0xF6, 0x04, 0xB4, 0x98, 0x97, 0x89, 0xC8, 0x49, 0x76, 0x0E, 0x70, 0x67, + 0x9E, 0x13, 0x49, 0x96, 0x8A, 0xC8, 0x79, 0x22, 0xB2, 0x4D, 0x04, 0x86, + 0x4E, 0xCA, 0xCE, 0xF2, 0xF5, 0x32, 0x74, 0x96, 0x59, 0x9B, 0x53, 0x11, + 0x19, 0x5E, 0x97, 0x8B, 0xC8, 0x3A, 0x8F, 0xF1, 0x79, 0x53, 0x44, 0x26, + 0xC5, 0xD5, 0xC8, 0xEA, 0xB4, 0xF8, 0xF0, 0x6D, 0x36, 0x4B, 0x5B, 0x2D, + 0x3A, 0xB3, 0xD5, 0x3E, 0x2F, 0x41, 0xC9, 0xE3, 0x61, 0xAB, 0xE5, 0x6C, + 0x7F, 0xFC, 0x28, 0xBC, 0xCB, 0x42, 0xD5, 0xA3, 0x5C, 0xAC, 0x28, 0xF2, + 0x9D, 0x36, 0xD8, 0x4C, 0x9E, 0x8B, 0xC6, 0xDA, 0xBB, 0x8F, 0xCF, 0xFB, + 0x28, 0x17, 0x6D, 0x41, 0x9C, 0x03, 0x1D, 0x9B, 0x50, 0xDA, 0xEB, 0x5B, + 0x68, 0xB2, 0xD8, 0xF0, 0x2C, 0x3F, 0xF7, 0x2E, 0x34, 0x0F, 0x29, 0x2A, + 0xDE, 0x52, 0x05, 0x6E, 0xD5, 0x6C, 0x6B, 0x89, 0x8E, 0xFC, 0xDF, 0x80, + 0x1E, 0x49, 0xBB, 0xC0, 0xE2, 0x05, 0x43, 0xCD, 0x76, 0x59, 0x8D, 0x72, + 0xBB, 0x1F, 0x8F, 0x7B, 0x24, 0x4B, 0x6C, 0x1D, 0xBE, 0xDB, 0x82, 0x16, + 0x99, 0x7A, 0x13, 0x4D, 0x44, 0x5F, 0x31, 0x36, 0xE5, 0xA3, 0x6F, 0x51, + 0x9E, 0x71, 0xD4, 0x68, 0xC1, 0x90, 0x27, 0x2D, 0xA8, 0x21, 0x16, 0x14, + 0xD9, 0x14, 0xE6, 0x9B, 0x1E, 0x86, 0x6C, 0x8C, 0xC0, 0x88, 0x72, 0x79, + 0xE1, 0xE2, 0x2A, 0x91, 0x8D, 0x4F, 0x19, 0x7D, 0x57, 0xA4, 0x97, 0xBF, + 0x04, 0x09, 0xC0, 0x89, 0x24, 0x00, 0x27, 0x00, 0x27, 0x43, 0x90, 0x00, + 0x9C, 0x48, 0x02, 0x70, 0x22, 0x09, 0xC0, 0x89, 0x24, 0x00, 0x07, 0x2C, + 0xA9, 0x80, 0xEE, 0x49, 0x00, 0x8E, 0xA1, 0x74, 0xE2, 0x56, 0xF3, 0x3A, + 0x9D, 0x00, 0xDC, 0x3B, 0x25, 0x8D, 0xD2, 0x61, 0xBD, 0xF6, 0xA8, 0xDB, + 0xF0, 0xCF, 0x7D, 0x4E, 0x00, 0x8E, 0x89, 0xB4, 0xA3, 0xB5, 0x32, 0xDE, + 0xCE, 0x03, 0x60, 0x1A, 0xCD, 0x58, 0xB8, 0xAF, 0xAF, 0x03, 0x5C, 0xD1, + 0x47, 0xFB, 0xD5, 0x81, 0x12, 0xCA, 0x87, 0xA1, 0xB5, 0x33, 0x76, 0xA0, + 0x8B, 0x8F, 0x95, 0x21, 0xCB, 0xFF, 0x02, 0x25, 0xBE, 0xF7, 0xE9, 0x70, + 0x65, 0x5C, 0x13, 0xC0, 0x83, 0xD4, 0x50, 0x87, 0xA3, 0x95, 0xEA, 0x86, + 0xD3, 0xC5, 0x07, 0x7B, 0x88, 0x18, 0x67, 0xE5, 0x27, 0x00, 0xF7, 0xCC, + 0xAA, 0xEE, 0x37, 0x1D, 0xEE, 0xCB, 0x2A, 0x3A, 0x97, 0xF4, 0x2B, 0x60, + 0xFB, 0x83, 0x1F, 0x9C, 0x48, 0x02, 0x70, 0xDF, 0x97, 0xFF, 0x0F, 0x00, + 0xAE, 0x7B, 0xCD, 0x15, 0x78, 0xF2, 0x40, 0xF8, 0x00, 0x00, 0x00, 0x00, + 0x49, 0x45, 0x4E, 0x44, 0xAE, 0x42, 0x60, 0x82 +}; +} +static unsigned char* visuals_icon = raw::visuals; +} \ No newline at end of file diff --git a/cheat/gmod/identity.cpp b/cheat/gmod/identity.cpp new file mode 100644 index 0000000..de047cf --- /dev/null +++ b/cheat/gmod/identity.cpp @@ -0,0 +1,98 @@ +#include "identity.hpp" +#include "settings.hpp" +#include "interface.hpp" +#include "pattern.hpp" + +namespace features +{ + void c_identity::clantag_changer( ) { + static auto fn_offset = pattern::first_code_match( g_csgo.m_engine.dll( ), xors( "53 56 57 8B DA 8B F9 FF 15" ) ); + static auto fn = reinterpret_cast< void( __fastcall* )( const char*, const char* ) >( fn_offset ); + static bool was_enabled = false; + + if ( !g_settings.misc.clantag_changer( ) ) { + if ( was_enabled ) { + fn( "", " " ); + static cvar_t* cl_clanid = g_csgo.m_cvar( )->FindVar( xors( "cl_clanid" ) ); + auto backup_val = cl_clanid->get_int( ); + cl_clanid->set_value( 0 ); + cl_clanid->set_value( backup_val ); + was_enabled = false; + } + + return; + } + + was_enabled = true; + + //fn( xors( "#freeshkreli $" ), xors( "#freeshkreli $" ) ); + + //basically make it completely fade out + static const std::string moneybot_string = xors( "moneybot " ); + static std::string clantag_str = moneybot_string; + + static auto next_settime = g_csgo.m_globals->m_realtime; + auto curtime = g_csgo.m_globals->m_realtime; + + if ( curtime > next_settime ) { + const int length = clantag_str.length( ); + clantag_str.insert( 0, 1, clantag_str[ length - 2 ] ); + clantag_str.erase( length - 1, 1 ); + + std::string set = clantag_str; + set.resize( 15 ); + set[ 14 ] = '$'; + + auto is_full = set.find( xors( "moneybot" ) ) != std::string::npos; + + next_settime = curtime + ( is_full ? 0.85f : 0.4f ); + fn( set.c_str( ), set.c_str( ) ); + } + } + + void c_identity::name_changer( ) { + static auto cvar = g_csgo.m_cvar( )->FindVar( xors( "name" ) ); + auto set_name = [ ]( const char* name ) { + *( int* )( uintptr_t( &cvar->m_change_callback ) + 0xc ) = 0; + cvar->set_value( name ); + }; + + static bool activated = false; + static char original_name[ 100 ]{ }; + + if( !g_settings.misc.name_changer ) { + if( activated ) { + set_name( original_name ); + } + + activated = false; + return; + } + + if( !activated ) { + strcpy( original_name, cvar->get_string( ) ); + if( g_settings.misc.name_changer == 1 ) { + char new_name[ 128 ]; + memset( new_name, '$', sizeof( new_name ) ); + set_name( new_name ); + } + if( g_settings.misc.name_changer == 2 ) { + set_name( xors( "moneybot.cc" ) ); + } + if( g_settings.misc.name_changer == 101 ) { + set_name( "­­­\n\xAD\xAD\xAD" ); + } + } + else if( g_settings.misc.name_changer == 101 ) { + char new_name[ 15 ]; + for( size_t i{ }; i < 15; ++i ) { + auto is_upper = !( math::random_number( 0, 256 ) & 1 ); + new_name[ i ] = is_upper ? math::random_number( 65, 90 ) : math::random_number( 97, 122 ); + } + + set_name( new_name ); + } + + activated = true; + } +} \ No newline at end of file diff --git a/cheat/gmod/identity.hpp b/cheat/gmod/identity.hpp new file mode 100644 index 0000000..0d6e778 --- /dev/null +++ b/cheat/gmod/identity.hpp @@ -0,0 +1,16 @@ +#pragma once +#include "sdk.hpp" + +namespace features +{ + class c_identity { + private: + void clantag_changer( ); + void name_changer( ); + public: + void operator()( ) { + clantag_changer( ); + name_changer( ); + } + }; +} \ No newline at end of file diff --git a/cheat/gmod/iface_dllmain_impl.hpp b/cheat/gmod/iface_dllmain_impl.hpp new file mode 100644 index 0000000..761c215 --- /dev/null +++ b/cheat/gmod/iface_dllmain_impl.hpp @@ -0,0 +1,84 @@ +#pragma once + +namespace factory +{ + namespace interfaces + { + class c_interface_manager + { + struct reg + { + char m_key; + uintptr_t m_ptr; + uintptr_t m_module; + char m_module_name[ 64 ]; + char m_name[ 64 ]; + }; + + size_t m_count; + reg* m_regs; + + void decrypt_str( char* buf, size_t size, char key ) { + for( size_t i{ }; i < size; ++i ) { + buf[ i ] ^= key; + } + } + + public: + void init( uintptr_t iface_addr ) { + m_count = *( size_t* )( iface_addr ); + m_regs = ( reg* )( iface_addr + 4 ); + } + + template < typename t = void* > + t find_interface( const std::string& module_, std::string name ) { + if( !::isdigit( name[ name.length( ) - 1 ] ) ) + name += '0'; + + char name_buf[ 64 ]; + char module_buf[ 64 ]; + + for( size_t i{ }; i < m_count; ++i ) { + auto& reg = m_regs[ i ]; + + memcpy( name_buf, reg.m_name, 64 ); + memcpy( module_buf, reg.m_module_name, 64 ); + + decrypt_str( name_buf, 64, reg.m_key ); + decrypt_str( module_buf, 64, reg.m_key ); + + if( !module_.compare( module_buf ) && strstr( name_buf, name.c_str( ) ) ) { + return ( t )( reg.m_ptr ); + } + } + + return t{ }; + } + + template < typename t = void* > + t find_interface( std::string name ) { + if( !::isdigit( name[ name.length( ) - 1 ] ) ) + name += '0'; + + char name_buf[ 64 ]; + char module_buf[ 64 ]; + + for( size_t i{ }; i < m_count; ++i ) { + auto& reg = m_regs[ i ]; + + memcpy( name_buf, reg.m_name, 64 ); + memcpy( module_buf, reg.m_module_name, 64 ); + + decrypt_str( name_buf, 64, reg.m_key ); + decrypt_str( module_buf, 64, reg.m_key ); + + if( strstr( name_buf, name.c_str( ) ) ) { + return ( t )( reg.m_ptr ); + } + } + + return t{ }; + } + }; + } +} \ No newline at end of file diff --git a/cheat/gmod/in_prediction.cpp b/cheat/gmod/in_prediction.cpp new file mode 100644 index 0000000..cb5a7bf --- /dev/null +++ b/cheat/gmod/in_prediction.cpp @@ -0,0 +1,32 @@ +#include "mem.hpp" +#include "hooks.hpp" +#include "context.hpp" + +#undef max + +bool __fastcall hooks::in_prediction( void* ecx_, void* edx_ ) { + static auto in_prediction_o = g_csgo.m_prediction->get_old_function< decltype( &hooks::in_prediction ) >( 14 ); + static auto ret_address = pattern::first_code_match( g_csgo.m_chl.dll( ), + xors( "84 C0 75 08 57 8B CE E8 ? ? ? ? 8B 06" ) ); + + if( g_ctx.m_local && ret_address && g_settings.rage.enabled && g_settings.rage.resolver ) { + stack_t stack( get_baseptr( ) ); + int local_team = g_ctx.m_local->m_iTeamNum( ); + + if( stack.return_address( ) == ret_address ) { + for( size_t i{ }; i < 65; ++i ) { + auto ent = g_csgo.m_entlist( )->GetClientEntity< >( i ); + + if( !ent || !ent->is_valid( ) || ent == g_ctx.m_local ) + continue; + + if( ent->m_iTeamNum( ) != local_team || g_settings.rage.friendlies ) { + ent->m_flLastBoneSetupTime( ) = std::numeric_limits< float >::quiet_NaN( ); + ent->m_iMostRecentModelBoneCounter( ) -= 1; + } + } + } + } + + return in_prediction_o( ecx_, 0 ); +} \ No newline at end of file diff --git a/cheat/gmod/input_system.cpp b/cheat/gmod/input_system.cpp new file mode 100644 index 0000000..881fa02 --- /dev/null +++ b/cheat/gmod/input_system.cpp @@ -0,0 +1,527 @@ +#include + +#include "input_system.hpp" +#include "util.hpp" + +util::c_input_manager g_input; + +NAMESPACE_REGION( util ) + +const char* const key_names_short[] = { + "unk", + "m1", + "m2", + "can", + "m3", + "m4", + "m5", + "unk", + "back", + "tab", + "unk", + "unk", + "clr", + "ret", + "unk", + "unk", + "shift", + "ctrl", + "alt", + "pause", + "caps", + "kana", + "unk", + "junja", + "final", + "kanji", + "unk", + "esc", + "convert", + "nonconvert", + "accept", + "modechange", + " ", + "prior", + "next", + "end", + "home", + "left", + "up", + "right", + "down", + "slct", + "prnt", + "execute", + "snapshot", + "ins", + "del", + "help", + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "8", + "9", + "unk", + "unk", + "unk", + "unk", + "unk", + "unk", + "unk", + "a", + "b", + "c", + "d", + "e", + "f", + "g", + "h", + "i", + "j", + "k", + "l", + "m", + "n", + "o", + "p", + "q", + "r", + "s", + "t", + "u", + "v", + "w", + "x", + "y", + "z", + "lwin", + "rwin", + "apps", + "unk", + "unk", + "num0", + "num1", + "num2", + "num3", + "num4", + "num5", + "num6", + "num7", + "num8", + "num9", + "*", + "+", + "sep", + "-", + ",", + "/", + "f1", + "f2", + "f3", + "f4", + "f5", + "f6", + "f7", + "f8", + "f9", + "f10", + "f11", + "f12", + "f13", + "f14", + "f15", + "f16", + "f17", + "f18", + "f19", + "f20", + "f21", + "f22", + "f23", + "f24", + "unk", + "unk", + "unk", + "unk", + "unk", + "unk", + "unk", + "unk", + "numlock", + "scroll", + "oem_nec_equal", + "oem_fj_masshou", + "oem_fj_touroku", + "oem_fj_loya", + "oem_fj_roya", + "unk", + "unk", + "unk", + "unk", + "unk", + "unk", + "unk", + "unk", + "unk", + "lshift", + "rshift", + "lctrl", + "rctrl", + "lalt", + "ralt", +}; + +const char* const key_names[] = { + "unknown", + "mouse_1", + "mouse_2", + "cancel", + "mouse_3", + "mouse_4", + "mouse_5", + "unknown", + "back", + "tab", + "unknown", + "unknown", + "clear", + "return", + "unknown", + "unknown", + "shift", + "control", + "alt", + "pause", + "capital", + "kana", + "unknown", + "junja", + "final", + "kanji", + "unknown", + "escape", + "convert", + "nonconvert", + "accept", + "modechange", + "space", + "prior", + "next", + "end", + "home", + "left", + "up", + "right", + "down", + "select", + "print", + "execute", + "snapshot", + "insert", + "delete", + "help", + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "8", + "9", + "unknown", + "unknown", + "unknown", + "unknown", + "unknown", + "unknown", + "unknown", + "a", + "b", + "c", + "d", + "e", + "f", + "g", + "h", + "i", + "j", + "k", + "l", + "m", + "n", + "o", + "p", + "q", + "r", + "s", + "t", + "u", + "v", + "w", + "x", + "y", + "z", + "lwin", + "rwin", + "apps", + "unknown", + "unknown", + "numpad0", + "numpad1", + "numpad2", + "numpad3", + "numpad4", + "numpad5", + "numpad6", + "numpad7", + "numpad8", + "numpad9", + "multiply", + "add", + "separator", + "subtract", + "decimal", + "divide", + "f1", + "f2", + "f3", + "f4", + "f5", + "f6", + "f7", + "f8", + "f9", + "f10", + "f11", + "f12", + "f13", + "f14", + "f15", + "f16", + "f17", + "f18", + "f19", + "f20", + "f21", + "f22", + "f23", + "f24", + "unknown", + "unknown", + "unknown", + "unknown", + "unknown", + "unknown", + "unknown", + "unknown", + "numlock", + "scroll", + "oem_nec_equal", + "oem_fj_masshou", + "oem_fj_touroku", + "oem_fj_loya", + "oem_fj_roya", + "unknown", + "unknown", + "unknown", + "unknown", + "unknown", + "unknown", + "unknown", + "unknown", + "unknown", + "lshift", + "rshift", + "lcontrol", + "rcontrol", + "lmenu", + "rmenu", +}; + +void c_input_manager::capture_mouse_move( ulong_t lparam ) { + m_mouse_pos[ 0 ] = LOWORD( lparam ); + m_mouse_pos[ 1 ] = HIWORD( lparam ); +} + +void c_input_manager::clear_keys( ) { + memset( m_pressed_keys, 0, sizeof( m_pressed_keys ) ); +} + +bool c_input_manager::register_key_press( int key_event, int key ) +{ + switch ( key_event ) { + case KEYDOWN: { + if ( is_valid_key( key ) ) + m_pressed_keys[ key ] = true; + return true; + } + case KEYUP: { + if ( is_valid_key( key ) ) + m_pressed_keys[ key ] = false; + return true; + } + case SYSKEYDOWN: { //WTF IS THIS STUPID SHIT, WHY IS ALT LITERALLY THE ONLY FUCKING KEY UNDER SYSKEYDOWN OUT OF ALL THE MODIFIER KEYS? + if ( key == KEYS_ALT ) + m_pressed_keys[ key ] = true; + break; + } + case SYSKEYUP: { + if ( key == KEYS_ALT ) + m_pressed_keys[ key ] = false; + break; + } + case LBUTTONDOWN: + m_pressed_keys[ KEYS_MOUSE1 ] = true; + return true; + case LBUTTONUP: + m_pressed_keys[ KEYS_MOUSE1 ] = false; + return true; + case RBUTTONDOWN: + m_pressed_keys[ KEYS_MOUSE2 ] = true; + return true; + case RBUTTONUP: + m_pressed_keys[ KEYS_MOUSE2 ] = false; + return true; + case MBUTTONDOWN: + m_pressed_keys[ KEYS_MOUSE3 ] = true; + return true; + case MBUTTONUP: + m_pressed_keys[ KEYS_MOUSE3 ] = false; + return true; + case XBUTTONDOWN: { + bool pressed_xbutton = static_cast( HIWORD( key ) - 1 ); //should result in mouse4 as false, and mouse5 as true + m_pressed_keys[ pressed_xbutton ? KEYS_MOUSE5 : KEYS_MOUSE4 ] = true; + return true; + } + case XBUTTONUP: { + bool pressed_xbutton = static_cast( HIWORD( key ) - 1 ); //should result in mouse4 as false, and mouse5 as true + m_pressed_keys[ pressed_xbutton ? KEYS_MOUSE5 : KEYS_MOUSE4 ] = false; + return true; + } + case MOUSEWHEEL: { + short scroll_input = ( short )HIWORD( key ); + m_scroll_wheel_state = scroll_input > 0 ? 1 : -1; + return true; + } + } + + return key_event == 0x200 || key_event == 0x203 || key_event == 0x206 || key_event == 0x209; //gotta block WM_MOUSEFIST | WM_LBUTTONDBLCLK | WM_RBUTTONDBLCLK | WM_MBUTTONDBLCLK +} + +bool c_input_manager::is_key_pressed( int key ) { + auto k = key; + return is_valid_key( k ) && m_pressed_keys[ k ]; +} + +const char* c_input_manager::get_key_name( int key ) { + if ( !is_valid_key( key ) || key > KEYS_MAX ) + return key_names[ KEYS_NONE ]; + + return key_names[ key ]; +} + +const char* c_input_manager::get_short_name( int key ) { + return key_names_short[ is_valid_key( key ) ? key : KEYS_NONE ]; +} + +VirtualKeys_t c_input_manager::is_any_key_pressed( ) { + for ( size_t i{ }; i < KEYS_MAX; ++i ) { + if ( m_pressed_keys[ i ] ) { + return VirtualKeys_t( i ); + } + } + + return KEYS_NONE; +} + +int c_input_manager::get_scroll_state( ) { + int current_state = m_scroll_wheel_state; + m_scroll_wheel_state = 0; + return current_state; +} + +char c_input_manager::get_pressed_char( int* out ) { + size_t pressed_character{ }; + for ( size_t i{ }; i < KEYS_MAX; ++i ) { + if ( is_key_pressed( VirtualKeys_t( i ) ) ) { + if ( ( i >= KEYS_A && i <= KEYS_Z ) + || ( i >= KEYS_N0 && i <= KEYS_N9 ) ) { + pressed_character = i; + } + } + } + + if ( pressed_character ) { + if ( out ) { + *out = int( pressed_character ); + } + + if ( is_key_pressed( KEYS_SHIFT ) ) { + if ( pressed_character >= KEYS_A + && pressed_character <= KEYS_Z ) + return char( pressed_character ); + + //gay way to shift it to symbols + if ( pressed_character >= KEYS_N0 + && pressed_character <= KEYS_N9 ) { + switch ( pressed_character ) { + case KEYS_N0: + return ')'; + case KEYS_N1: + return '!'; + case KEYS_N2: + return '@'; + case KEYS_N3: + return '#'; + case KEYS_N4: + return '$'; + case KEYS_N5: + return '%'; + case KEYS_N6: + return '^'; + case KEYS_N7: + return '&'; + case KEYS_N8: + return '*'; + case KEYS_N9: + return '('; + } + } + } + else { + if ( pressed_character >= KEYS_A + && pressed_character <= KEYS_Z ) + return char( ::tolower( pressed_character ) ); + + if ( pressed_character >= KEYS_N0 + && pressed_character <= KEYS_N9 ) + return char( pressed_character ); + } + } + else if ( is_key_pressed( KEYS_SPACE ) ) { + if ( out ) + *out = KEYS_SPACE; + + return ' '; + } + else if ( is_key_pressed( KEYS_BACK ) ) { + if ( out ) + *out = KEYS_BACK; + + return 0; + } + + if ( out ) + *out = KEYS_NONE; + + return 0; +} + +END_REGION \ No newline at end of file diff --git a/cheat/gmod/input_system.hpp b/cheat/gmod/input_system.hpp new file mode 100644 index 0000000..a237667 --- /dev/null +++ b/cheat/gmod/input_system.hpp @@ -0,0 +1,186 @@ +#pragma once +#include "util.hpp" + +enum VirtualKeyEvents_t { + KEYDOWN = 0x0100, + KEYUP = 0x0101, + SYSKEYDOWN = 0x104, + SYSKEYUP = 0x105, + LBUTTONDOWN = 0x0201, + LBUTTONUP = 0x0202, + RBUTTONDOWN = 0x0204, + RBUTTONUP = 0x0205, + MBUTTONDOWN = 0x0207, + MBUTTONUP = 0x0208, + MOUSEWHEEL = 0x020A, + XBUTTONDOWN = 0x020B, + XBUTTONUP = 0x020C, +}; + +enum VirtualKeys_t { + KEYS_NONE = 0, + KEYS_MOUSE1 = 0X01, + KEYS_MOUSE2 = 0X02, + KEYS_CANCEL = 0X03, + KEYS_MOUSE3 = 0X04, + KEYS_MOUSE4 = 0X05, + KEYS_MOUSE5 = 0X06, + KEYS_BACK = 0X08, + KEYS_TAB = 0X09, + KEYS_CLEAR = 0X0C, + KEYS_RETURN = 0X0D, + KEYS_SHIFT = 0X10, + KEYS_CONTROL = 0X11, + KEYS_ALT = 0X12, + KEYS_PAUSE = 0X13, + KEYS_CAPSLOCK = 0X14, + KEYS_ESCAPE = 0X1B, + KEYS_CONVERT = 0X1C, + KEYS_NONCONVERT = 0X1D, + KEYS_ACCEPT = 0X1E, + KEYS_MODECHANGE = 0X1F, + KEYS_SPACE = 0X20, + KEYS_PRIOR = 0X21, + KEYS_NEXT = 0X22, + KEYS_END = 0X23, + KEYS_HOME = 0X24, + KEYS_LEFT = 0X25, + KEYS_UP = 0X26, + KEYS_RIGHT = 0X27, + KEYS_DOWN = 0X28, + KEYS_SELECT = 0X29, + KEYS_PRINT = 0X2A, + KEYS_EXECUTE = 0X2B, + KEYS_SNAPSHOT = 0X2C, + KEYS_INSERT = 0X2D, + KEYS_DELETE = 0X2E, + KEYS_HELP = 0X2F, + KEYS_N0 = 0X30, + KEYS_N1 = 0X31, + KEYS_N2 = 0X32, + KEYS_N3 = 0X33, + KEYS_N4 = 0X34, + KEYS_N5 = 0X35, + KEYS_N6 = 0X36, + KEYS_N7 = 0X37, + KEYS_N8 = 0X38, + KEYS_N9 = 0X39, + KEYS_A = 0X41, + KEYS_B = 0X42, + KEYS_C = 0X43, + KEYS_D = 0X44, + KEYS_E = 0X45, + KEYS_F = 0X46, + KEYS_G = 0X47, + KEYS_H = 0X48, + KEYS_I = 0X49, + KEYS_J = 0X4A, + KEYS_K = 0X4B, + KEYS_L = 0X4C, + KEYS_M = 0X4D, + KEYS_N = 0X4E, + KEYS_O = 0X4F, + KEYS_P = 0X50, + KEYS_Q = 0X51, + KEYS_R = 0X52, + KEYS_S = 0X53, + KEYS_T = 0X54, + KEYS_U = 0X55, + KEYS_V = 0X56, + KEYS_W = 0X57, + KEYS_X = 0X58, + KEYS_Y = 0X59, + KEYS_Z = 0X5A, + KEYS_LEFTWINDOWS = 0X5B, + KEYS_RIGHTWINDOWS = 0X5C, + KEYS_APPLICATION = 0X5D, + KEYS_NUMPAD0 = 0X60, + KEYS_NUMPAD1 = 0X61, + KEYS_NUMPAD2 = 0X62, + KEYS_NUMPAD3 = 0X63, + KEYS_NUMPAD4 = 0X64, + KEYS_NUMPAD5 = 0X65, + KEYS_NUMPAD6 = 0X66, + KEYS_NUMPAD7 = 0X67, + KEYS_NUMPAD8 = 0X68, + KEYS_NUMPAD9 = 0X69, + KEYS_MULTIPLY = 0X6A, + KEYS_ADD = 0X6B, + KEYS_SEPARATOR = 0X6C, + KEYS_SUBTRACT = 0X6D, + KEYS_DECIMAL = 0X6E, + KEYS_DIVIDE = 0X6F, + KEYS_F1 = 0X70, + KEYS_F2 = 0X71, + KEYS_F3 = 0X72, + KEYS_F4 = 0X73, + KEYS_F5 = 0X74, + KEYS_F6 = 0X75, + KEYS_F7 = 0X76, + KEYS_F8 = 0X77, + KEYS_F9 = 0X78, + KEYS_F10 = 0X79, + KEYS_F11 = 0X7A, + KEYS_F12 = 0X7B, + KEYS_NUMLOCK = 0X90, + KEYS_SCROLLLOCK = 0X91, + KEYS_LEFTSHIFT = 0XA0, + KEYS_RIGHTSHIFT = 0XA1, + KEYS_LEFTCONTROL = 0XA2, + KEYS_RIGHTCONTROL = 0XA3, + KEYS_LEFTMENU = 0XA4, + KEYS_RIGHTMENU = 0XA5, + KEYS_PERIOD = 0xBE, + KEYS_MAX = 0XA6, + KEYS_LAST = 0xfe +}; + +namespace util +{ + class c_input_manager { + public: + bool m_pressed_keys[ KEYS_LAST ]{ }; + int m_mouse_pos[ 2 ]{ }; + int m_scroll_wheel_state{ }; + + + c_input_manager( ) { + memset( m_pressed_keys, 0, KEYS_LAST ); + } + + void capture_mouse_move( ulong_t lparam ); + + //resets all keys so unpressed + void clear_keys( ); + + //registers a key press from wndproc + bool register_key_press( int key_event, int key ); + + //checks if the key is pressed + bool is_key_pressed( int key ); + + //returns the first found key pressed, or KEY_NONE if none are + VirtualKeys_t is_any_key_pressed( ); + + //returns the last scroll state and resets it to 0 + int get_scroll_state( ); + + //returns the key's name + const char* get_key_name( int key ); + const char* get_short_name( int key ); + + //returns the first found currently pressed key + char get_pressed_char( int* pressed_key = nullptr ); + + //check if a key is valid + inline bool is_valid_key( int key ) { return key > KEYS_NONE && key < KEYS_LAST; } + + //get cursor pos + inline void get_cursor_pos( int& x, int& y ) { + x = m_mouse_pos[ 0 ]; + y = m_mouse_pos[ 1 ]; + } + }; +} + +extern util::c_input_manager g_input; \ No newline at end of file diff --git a/cheat/gmod/interface.cpp b/cheat/gmod/interface.cpp new file mode 100644 index 0000000..0d1cfac --- /dev/null +++ b/cheat/gmod/interface.cpp @@ -0,0 +1,217 @@ +#include + +#include "interface.hpp" +#include "console.hpp" +#include "hooks.hpp" +#include "renderer.hpp" +#include "pattern.hpp" +#include "hooks.hpp" +#include "base_cheat.hpp" +#include "settings.hpp" + +using namespace factory; + +interfaces::c_interface_manager g_factory; +factory::c_gmod g_gmod; + +bool factory::create_interfaces( c_gmod* instance ) { + + auto d3d_device = pattern::first_code_match( GetModuleHandleA( + xors( "shaderapidx9.dll" ) ), + xors( "FF 90 ?? ?? ?? ?? A1 ?? ?? ?? ?? 6A 00" ), 0x7 + ); + + auto engine_render = pattern::first_code_match( GetModuleHandleA( + xors( "engine.dll" ) ), + xors( "8B 0D ? ? ? ? FF 75 0C FF 75 08 8B 01 FF 50 0C" ), 2 + ); + + auto view_render = pattern::first_code_match( GetModuleHandleA( + xors( "client.dll" ) ), + xors( "8B 0D ? ? ? ? 56 57 8B 01 FF 50 30" ), 2 + ); + + instance->create( &instance->m_d3d, **reinterpret_cast< uintptr_t** >( d3d_device ) ); + instance->create( &instance->m_engine_render, **reinterpret_cast< uintptr_t** >( engine_render ) ); + instance->create( &instance->m_view_render, **reinterpret_cast< uintptr_t** >( view_render ) ); + instance->create( &instance->m_chl, xors( "VClient" ) ); + instance->create( &instance->m_surface, xors( "VGUI_Surface" ) ); + instance->create( &instance->m_panel, xors( "VGUI_Panel" ) ); + instance->create( &instance->m_engine, xors( "VEngineClient" ) ); + instance->create( &instance->m_entlist, xors( "VClientEntityList" ) ); + instance->create( &instance->m_prediction, xors( "VClientPrediction" ) ); + instance->create( &instance->m_cvar, xors( "VEngineCvar" ) ); + instance->create( &instance->m_game_movement, xors( "GameMovement" ) ); + instance->create( &instance->m_model_info, xors( "VModelInfoClient" ) ); + instance->create( &instance->m_trace, xors( "EngineTraceClient" ) ); + instance->create( &instance->m_model_render, xors( "VEngineModel" ) ); + instance->create( &instance->m_mat_system, xors( "VMaterialSystem" ) ); + instance->create( &instance->m_render_view, xors( "VEngineRenderView" ) ); + instance->create( &instance->m_phys_props, xors( "VPhysicsSurfaceProps" ) ); + instance->create( &instance->m_engine_sound, xors( "IEngineSoundClient" ) ); + instance->create( &instance->m_event_mgr, xors( "GAMEEVENTSMANAGER002" ) ); + instance->create( &instance->m_engine_vgui, xors( "VEngineVGui" ) ); + instance->create( &instance->m_lua_shared, xors( "LUASHARED" ) ); + + //auto kv_fn = ( void*( __cdecl* )( ) )( GetProcAddress( + // GetModuleHandleA( xors( "vstdlib.dll" ) ), + // xors( "KeyValuesSystem" ) ) ); + // + //instance->m_keyvalues = ( IKeyValuesSystem* )kv_fn( ); + // + //instance->m_alloc = *( IMemAlloc** )GetProcAddress( + // GetModuleHandleA( xors( "tier0.dll" ) ), + // xors( "g_pMemAlloc" ) ); + // + uintptr_t* globals = **reinterpret_cast< uintptr_t*** >( + instance->m_chl->get_old_function( 0 ) + 0x53 ); + instance->m_globals = reinterpret_cast< global_vars_t* >( globals ); + + uintptr_t* client_mode = **reinterpret_cast< uintptr_t*** >( + instance->m_chl->get_old_function( 10 ) + 0x5 ); + instance->create( &instance->m_clientmode, uintptr_t( client_mode ) ); + + uintptr_t* input = **reinterpret_cast< uintptr_t*** >( + instance->m_chl->get_old_function( 15 ) + 0x2 ); + instance->m_input = reinterpret_cast< CInput* >( input ); + + //uintptr_t** global_state = pattern::first_code_match< uintptr_t** >( instance->m_engine.dll( ), + // xors( "B9 ? ? ? ? 56 FF 50 14 8B 34 85" ), 0x1 ); + //instance->m_global_state = reinterpret_cast< CGlobalState* >( *global_state ); + // + //auto clientstate = instance->m_global_state->get_client_state( ); + //if( clientstate && clientstate->netchannel ) + // instance->create( &instance->m_net_channel, ( uintptr_t )clientstate->netchannel ); + // + //uintptr_t var_ptr = ( uintptr_t )instance->m_cvar( )->FindVar( xors( "weapon_debug_spread_show" ) ); + //instance->create( &instance->m_debug_show_spread, var_ptr ); + + //instance->listeners.bullet_impact.init( ); + //instance->listeners.player_hurt.init( ); + //instance->listeners.round_start.init( ); + + return true; +} + + +con_fn clear_fn{ fnv( "clear" ), [ ]( const char*, const char* ) { g_con->m_logs.clear( ); }, "" }; +con_fn enable_logs_fn{ fnv( "log_enable" ), + [ ]( const char* a, const char* ) { + g_settings.menu.logs_enable ^= 1; + g_con->log( g_settings.menu.logs_enable ? xors( "logs enabled" ) : xors( "logs disabled" ) ); + }, + "" +}; + +con_fn fnv_fn{ fnv( "fnv" ), + [ ]( const char* a, const char* ) { + auto print = hash::fnv1a( a ); + g_con->log( "%08x", print ); + }, + "%S" +}; + +con_fn sum_fn{ fnv( "sum" ), + [ ]( const char* a, const char* syntax ) { + auto arg_1 = con_fn::get_arg< int >( a, 0, syntax ); + auto arg_2 = con_fn::get_arg< int >( a, 1, syntax ); + g_con->log( "%d + %d = %d", arg_1, arg_2, arg_1 + arg_2 ); + }, + "%D %D" +}; + +con_fn dump_cfg{ fnv( "dump_cfg" ), + [ ]( const char* , const char* ) { + for( auto& it : data::holder_.get_nodes( ) ) { + auto setting = static_cast< ISetting* >( it ); + g_con->log( "%08x: %s", setting->get_hash( ), setting->get_string( ).c_str( ) ); + } + }, + "" +}; + +con_fn retard_fn{ fnv( "retard" ), + [ ]( const char*, const char* ) { + g_con->log( "snuze" ); + }, + "" +}; + +con_fn unload_fn{ fnv( "unload" ), + [ ]( const char*, const char* ) { + g_gmod.m_panic = true; + }, + "" +}; + +/*con_fn alias_fn{ fnv( "alias" ), + [ ]( const char* a, const char* b ) { + auto var_type = std::string( b ); + if( var_type.length( ) > 1 ) { + g_con->log( xors( "unknown var type: %s" ), var_type.c_str( ) ); + return; + } + + switch( b[ 0 ] ) { + case TYPE_STRING: { + std::shared_ptr< con_alias< const char* > >( fnv( ) ) + } + } + }, + "%S %S" +};*/ + +void factory::c_gmod::initialize( ) { + m_panic = true; + g_con->create( ); + auto now = std::chrono::high_resolution_clock::now( ); + g_con->print( xors( "hello\n" ) ); + + factory::create_interfaces( &g_gmod ); + + //g_fonts.initialize( ); + // + g_netvars.init( ); + //g_settings.load( ); + g_con->register_fn( &clear_fn ); + g_con->register_fn( &enable_logs_fn ); + g_con->register_fn( &fnv_fn ); + g_con->register_fn( &sum_fn ); + g_con->register_fn( &dump_cfg ); + g_con->register_fn( &retard_fn ); + g_con->register_fn( &unload_fn ); + // + hooks::commit( &g_gmod ); + + + ////g_cheat.m_chams.m_materials.initialize_materials( ); + // + //auto offset = g_netvars.get_netvar( fnv( "DT_WeaponCSBaseGun" ), fnv( "m_fLastShotTime" ) ); + //g_con->log( "lastshottime: %08x", offset ); + //g_con->log( "prop: %08x", g_netvars.get_prop( fnv( "DT_WeaponCSBaseGun" ), fnv( "m_fLastShotTime" ) ) ); + // + auto after = std::chrono::high_resolution_clock::now( ); + std::this_thread::sleep_for( std::chrono::milliseconds( 100 ) ); + + std::chrono::duration< float > delta = after - now; + g_con->print( xors( "cheat initialized\n" ) ); + g_con->print( xors( "time taken: %f\n" ), delta.count( ) ); + m_panic = false; +} + +void factory::c_gmod::uninitialize( ) { + m_panic = true; + g_con->destroy( ); + //Sleep( 100 ); + + //restore wndproc + if ( hooks::window_procedure_o ) { + SetWindowLongA( m_hwnd, GWLP_WNDPROC, ( long )hooks::window_procedure_o ); + } + + //restore all interfaces + restore( ); + + //free the library + FreeLibraryAndExitThread( g_dll, 0 ); +} \ No newline at end of file diff --git a/cheat/gmod/interface.hpp b/cheat/gmod/interface.hpp new file mode 100644 index 0000000..49fa015 --- /dev/null +++ b/cheat/gmod/interface.hpp @@ -0,0 +1,165 @@ +#pragma once +#include "factory.hpp" +#include "sdk.hpp" +#include "listener.hpp" + +NAMESPACE_REGION( factory ) + +struct IDirect3DDevice9; + +//interface holder +template < typename t > +class c_interface_base { + friend class c_gmod; +public: + t* operator( )( ) { + return m_interface; + } + + //calls a virtual + template< size_t index, typename ret = void, + class... Args > + ret call( Args... args ) { + return util::get_vfunc< ret( __thiscall* )( void*, Args... ) > + ( m_interface, index )( m_interface, args... ); + } + + //also calls a virtual but you supply the typedef instead of return type + template< typename def, size_t index, class... Args > + auto call( Args... args ) { + return util::get_vfunc< def > + ( m_interface, index )( m_interface, args... ); + } + + //allows you to cast the interface + template< typename t0 = t* > + t0 get( ) { + return ( t0 )m_interface; + } + + void operator( )( t* ptr ) { + m_interface = ptr; + m_hook.reset( ); + m_hook = std::make_shared< hooks::c_vmt >( static_cast< void* >( ptr ) ); + + /*find the module the interface is located in + i know i could just pass the pointer but traps are gay*/ + MEMORY_BASIC_INFORMATION info; + VirtualQuery( ptr, &info, sizeof( MEMORY_BASIC_INFORMATION ) ); + + m_dll = static_cast< HMODULE >( info.AllocationBase ); + } + + void operator( )( void* ptr ) { + operator( )( static_cast< t* >( ptr ) ); + } + + decltype( auto ) operator->( ) { + return m_hook; + } + + template< typename t2 = decltype( m_dll ) > + t2 dll( ) { + return ( t2 )m_dll; + } + +protected: + t* m_interface; + HMODULE m_dll; + std::shared_ptr< hooks::c_vmt > m_hook; +}; + +//declare your interfaces here +class c_gmod { +public: + c_interface_base< IBaseClientDLL > m_chl; + c_interface_base< ISurface > m_surface; + c_interface_base< IPanel > m_panel; + c_interface_base< IClientMode > m_clientmode; + c_interface_base< IVEngineClient > m_engine; + c_interface_base< IClientEntityList > m_entlist; + c_interface_base< IDirect3DDevice9 > m_d3d; + c_interface_base< IPrediction > m_prediction; + c_interface_base< ICSGameMovement > m_game_movement; + c_interface_base< IMoveHelper > m_move_helper; + c_interface_base< IVModelInfoClient > m_model_info; + c_interface_base< IVModelRender > m_model_render; + c_interface_base< IMaterialSystem > m_mat_system; + c_interface_base< IEngineTrace > m_trace; + c_interface_base< IPhysicsSurfaceProps > m_phys_props; + c_interface_base< IVRenderView > m_render_view; + c_interface_base< ICVar > m_cvar; + c_interface_base< IGameEventManager2 > m_event_mgr; + c_interface_base< CHudChat > m_hud_chat; + c_interface_base< uintptr_t > m_engine_sound; + c_interface_base< INetChannel > m_net_channel; + c_interface_base< cvar_t > m_debug_show_spread; + c_interface_base< CLuaShared > m_lua_shared; + c_interface_base< uintptr_t > m_engine_render; + c_interface_base< uintptr_t > m_engine_vgui; + c_interface_base< uintptr_t > m_view_render; + IKeyValuesSystem* m_keyvalues; + global_vars_t* m_globals; + CGlobalState* m_global_state; + CInput* m_input; + IMemAlloc* m_alloc; + float m_frametime; + + HWND m_hwnd{ }; + bool m_panic{ }; + + // struct { + // generic_listener_t bullet_impact{ xors( "bullet_impact" ), &listeners::bullet_impact }; + // generic_listener_t player_hurt{ xors( "player_hurt" ), &listeners::player_hurt }; + // generic_listener_t round_start{ xors( "round_start" ), &listeners::round_start }; + // } listeners; +public: + //find the interface inside of the module + void create( void* iface, const std::string& name, const std::string& mod ) { + auto* interface_ = static_cast< c_interface_base< uintptr_t >* >( iface ); + auto ptr = g_factory.find_interface( mod, name ); + if( !ptr ) + return; + + ( *interface_ )( ptr ); + m_container.push_back( interface_ ); + } + + void create( void* iface, uintptr_t pointer ) { + auto interface_ = static_cast< c_interface_base< uintptr_t >* >( iface ); + + //msvc is retarded + ( *interface_ )( ( void* )pointer ); + m_container.push_back( interface_ ); + } + + void create( void* iface, const std::string& name ) { + auto* interface_ = static_cast< c_interface_base< uintptr_t >* >( iface ); + auto ptr = g_factory.find_interface( name ); + if( !ptr ) + return; + + ( *interface_ )( ptr ); + m_container.push_back( interface_ ); + } + + void __cdecl initialize( ); + void __cdecl uninitialize( ); + +private: + //restore the vmts to their original + void restore( ) { + for ( const auto& it : m_container ) { + it->m_hook->restore( ); + } + } + +private: + std::vector< c_interface_base< uintptr_t >* > m_container; +}; + +bool create_interfaces( c_gmod* instance ); + +END_REGION + +extern factory::c_gmod g_gmod; \ No newline at end of file diff --git a/cheat/gmod/is_connected.cpp b/cheat/gmod/is_connected.cpp new file mode 100644 index 0000000..7b1055a --- /dev/null +++ b/cheat/gmod/is_connected.cpp @@ -0,0 +1,14 @@ +#include "mem.hpp" +#include "hooks.hpp" + +bool __fastcall hooks::is_connected( void* ecx_, void* edx_ ) { + static auto inventory = pattern::first_code_match( g_csgo.m_chl.dll( ), xors( "84 C0 75 04 B0 01 5F" ) ); + static auto is_connected_o = g_csgo.m_engine->get_old_function< decltype( &is_connected ) >( 27 ); + stack_t stack( get_baseptr( ) ); + + if( stack.return_address( ) == inventory && g_settings.misc.unlock_inventory( ) ) + return false; + + + return is_connected_o( ecx_, 0 ); +} \ No newline at end of file diff --git a/cheat/gmod/is_hltv.cpp b/cheat/gmod/is_hltv.cpp new file mode 100644 index 0000000..a611d2e --- /dev/null +++ b/cheat/gmod/is_hltv.cpp @@ -0,0 +1,31 @@ +#include "hooks.hpp" +#include "pattern.hpp" +#include "mem.hpp" + +bool __fastcall hooks::is_hltv( void* ecx, uintptr_t pvs_ent ) { + static auto is_hltv_o = g_csgo.m_engine->get_old_function< decltype( &hooks::is_hltv ) >( 93 ); + static auto pvs_retaddr = pattern::first_code_match( g_csgo.m_chl.dll( ), xors( "84 C0 0F 85 ? ? ? ? A1 ? ? ? ? 8B B7" ) ); + + if ( !g_csgo.m_panic && pvs_retaddr ) { + stack_t stack( get_baseptr( ) ); + auto return_address = stack.return_address( ); + + if ( return_address == pvs_retaddr ) { + if ( pvs_ent && reinterpret_cast< c_base_player* >( pvs_ent )->is_valid( ) ) { + *( int* )( pvs_ent + 0xa24 ) = -1; + *( int* )( pvs_ent + 0xa2c ) = *( int* )( pvs_ent + 0xa28 ); + *( int* )( pvs_ent + 0xa28 ) = 0; + return true; + } + } + } + + return is_hltv_o( ecx, pvs_ent ); +} + +bool __declspec( naked ) __fastcall hooks::is_hltv_proxy( void*, void* ) { + __asm { + mov edx, edi; + jmp is_hltv; + } +} \ No newline at end of file diff --git a/cheat/gmod/is_paused.cpp b/cheat/gmod/is_paused.cpp new file mode 100644 index 0000000..48916a4 --- /dev/null +++ b/cheat/gmod/is_paused.cpp @@ -0,0 +1,19 @@ +#include "mem.hpp" +#include "hooks.hpp" + +bool __fastcall hooks::is_paused( void* ecx_, void* edx_ ) { + static auto return_addr = pattern::first_code_match( g_csgo.m_chl.dll( ), xors( "FF D0 A1 ? ? ? ? B9 ? ? ? ? D9 1D ? ? ? ? FF 50 34 85 C0 74 22 8B 0D" ), 0x29 ); + static auto is_paused_o = g_csgo.m_engine->get_old_function< decltype( &is_paused ) >( 91 ); + + stack_t stack( get_baseptr( ) ); + uintptr_t return_address = stack.return_address( ); + + //printf( "return address: %08x sig: %08x deref: %08x delta: %08x delta: %08x\n", return_address, return_addr, *( uintptr_t* )return_addr, return_address - return_addr, return_addr - return_address ); + + if( return_address == return_addr ) { + printf( "extrapolate\n" ); + return true; + } + + return is_paused_o( ecx_, 0 ); +} \ No newline at end of file diff --git a/cheat/gmod/lag_mgr.cpp b/cheat/gmod/lag_mgr.cpp new file mode 100644 index 0000000..4f9d04b --- /dev/null +++ b/cheat/gmod/lag_mgr.cpp @@ -0,0 +1,79 @@ +#include "lag_mgr.hpp" +#include "c_base_player.hpp" +#include "context.hpp" +#include "interface.hpp" +#include "base_cheat.hpp" + +namespace features +{ + void c_lagmgr::on_antiaim( ) { + static bool lag_flip{ }; //fuck you and ur cmdnr + *m_sendpacket = lag_flip; + lag_flip ^= 1; + + if( m_sent_ticks ) { + *m_sendpacket = false; + } + } + + + void c_lagmgr::fakelag( ) { + //2017 sucked + //i hope 2018 goes better + + if( !g_settings.rage.fakelag.mode( ) || + !g_settings.rage.fakelag.ticks( ) ) { + m_breaking_lc = false; + return; + } + + auto& settings = g_settings.rage.fakelag; + + if( g_ctx.m_local->m_vecVelocity( ).length( ) < 0.1f ) { + return; + } + + vec3_t delta = g_ctx.m_last_origin - g_ctx.m_local->m_vecOrigin( ); + int max_ticks = math::min( g_ctx.m_local->m_fFlags( ) & FL_ONGROUND ? 10 : 16, g_settings.rage.fakelag.ticks( ) ); + bool force_send = m_held_ticks > max_ticks; + if( settings.mode == 1 ) { + if( delta.length2dsqr( ) > 4096.f ) { + force_send = get_choked( ) > 3; + } + } + + if( settings.mode == 2 ) { + auto fluc = math::random_number( -settings.fluctuate( ), settings.fluctuate( ) ) * 0.01f; + force_send = m_held_ticks > math::min( max_ticks + ( int )fluc, 15 ); + } + + bool send = false; + static bool was_onground{ }; + + if( !settings.in_move ) { + send = true; + } + + if( settings.in_air && !( g_ctx.m_local->m_fFlags( ) & FL_ONGROUND ) ) { + send = false; + } + + if( settings.avoid_ground ) { + if( !was_onground && g_ctx.m_local->m_fFlags( ) & FL_ONGROUND ) { + send = false; + } + } + + was_onground = g_ctx.m_local->m_fFlags( ) & FL_ONGROUND; + + if( ( m_cmd->m_buttons & IN_ATTACK ) && + !settings.in_attack ) { + send = true; + } + + *m_sendpacket = ( send || force_send ) && !get_sent( ); + if( *m_sendpacket ) { + m_breaking_lc = delta.length2dsqr( ) > 4096.f; + } + } +} \ No newline at end of file diff --git a/cheat/gmod/lag_mgr.hpp b/cheat/gmod/lag_mgr.hpp new file mode 100644 index 0000000..ae5fb6c --- /dev/null +++ b/cheat/gmod/lag_mgr.hpp @@ -0,0 +1,70 @@ +#pragma once +#include "sdk.hpp" +#include "settings.hpp" +#include "console.hpp" + +namespace features +{ + class c_lagmgr { + public: + void operator()( user_cmd_t* cmd, byte* sendpacket ) { + if( !sendpacket ) return; + if( !cmd ) return; + + m_cmd = cmd; + m_sendpacket = sendpacket; + + if( g_settings.rage.anti_aim( ) ) { + on_antiaim( ); + } + + //let fakelag override whatever happened in antiaim + //this also means we will call stuff like fakewalk etc + //after this + fakelag( ); + } + + void on_cmove_end( ) { + if( !m_sendpacket ) return; + + if( *m_sendpacket ) { + ++m_sent_ticks; + m_held_ticks = 0; + } + else { + ++m_held_ticks; + m_sent_ticks = 0; + } + } + + void set_state( bool state ) { + *m_sendpacket = state; + } + + int get_choked( ) const { + return m_held_ticks; + } + + int get_sent( ) const { + return m_sent_ticks; + } + + bool get_state( ) const { + return m_sendpacket ? !!*m_sendpacket : true; + } + + bool is_breaking_lc( ) const { + return m_breaking_lc; + } + + private: + void on_antiaim( ); + void fakelag( ); + + user_cmd_t* m_cmd{ }; + byte* m_sendpacket{ }; + int m_sent_ticks{ }; + int m_held_ticks{ }; + bool m_breaking_lc{ }; + }; +} \ No newline at end of file diff --git a/cheat/gmod/legitbot.cpp b/cheat/gmod/legitbot.cpp new file mode 100644 index 0000000..fe819cf --- /dev/null +++ b/cheat/gmod/legitbot.cpp @@ -0,0 +1,309 @@ +#include "interface.hpp" +#include "input_system.hpp" +#include "context.hpp" +#include "legitbot.hpp" +#include "settings.hpp" +#include "math.hpp" + +namespace features +{ + int c_legitbot::get_aim_target( float fov ) { + float best_fov = fov ? fov : g_settings.legit.active->m_fov; + int target{ -1 }; + vec3_t aim_angle{ }; + vec3_t cur_angle{ }; + vec3_t local_pos{ }; + vec3_t aim_pos{ }; + + g_csgo.m_engine( )->GetViewAngles( cur_angle ); + local_pos = g_ctx.m_local->get_eye_pos( ); + + for ( int i{ 1 }; i <= g_csgo.m_globals->m_maxclients; ++i ) { + auto entity = g_csgo.m_entlist( )->GetClientEntity< >( i ); + + if ( !entity ) continue; + if ( entity == g_ctx.m_local ) continue; + if ( !entity->is_valid( ) ) continue; + int team = entity->m_iTeamNum( ); + if ( team == g_ctx.m_local->m_iTeamNum( ) + && !g_settings.legit.friendlies( ) ) { + continue; + } + + bool visible = entity->is_visible( 0 ); + if( !visible && g_settings.legit.backtracking_target( ) ) { + auto record = m_lagcomp.find_best_record( i ); + if( record ) { + visible = util::trace_ray( local_pos, record->m_position, + g_ctx.m_local->ce( ), entity->ce( ) ); + } + } + + if ( !visible ) { + continue; + } + + aim_angle = math::vector_angles( local_pos, entity->get_hitbox_pos( 0 ) ); + aim_angle.clamp( ); + + float fov = ( cur_angle - aim_angle ).clamp( ).length2d( ); + if ( fov < best_fov ) { + best_fov = fov; + target = i; + } + } + + return target; + } + + void c_legitbot::assist( c_base_player* target, float* x, float* y ) { + vec3_t aim_ang; + vec3_t move_ang; + vec3_t view_ang; + vec3_t enemy_pos; + vec3_t local_pos; + vec3_t view_delta; + vec3_t delta; + vec2_t pixels; + + local_pos = g_ctx.m_local->get_eye_pos( ); + enemy_pos = target->get_hitbox_pos( 0 ); + + aim_ang = math::vector_angles( local_pos, enemy_pos ); + aim_ang -= g_ctx.m_local->m_aimPunchAngle( ) * 2.f * g_settings.legit.active->m_rcs; + + move_ang = pixels_to_angle( vec2_t( *x, *y ) ); + g_csgo.m_engine( )->GetViewAngles( view_ang ); + + view_delta = ( aim_ang - view_ang ).clamp( ); + + move_ang *= g_settings.legit.active->m_assist_strength; + float delta_y = std::abs( move_ang.y ); + float delta_x = std::abs( move_ang.x ); + + delta.x = std::clamp( view_delta.x, -delta_x, delta_x ); + delta.y = std::clamp( view_delta.y, -delta_y, delta_y ); + + pixels = angle_to_pixels( delta ); + *x += pixels.x; *y += pixels.y; + } + + void c_legitbot::triggerbot( user_cmd_t* cmd ) { + if( !g_settings.legit.triggerbot( ) ) + return; + + if( !g_input.is_key_pressed( ( VirtualKeys_t )g_settings.legit.trigger_key( ) ) ) + return; + + vec3_t viewangles{ }; + vec3_t forward{ }; + g_csgo.m_engine( )->GetViewAngles( viewangles ); + + auto wep = g_ctx.m_local->get_weapon( ); + if( !wep ) return; + if( wep->is_knife( ) ) return; + + auto wpn_info = wep->get_wpn_info( ); + if( !wpn_info ) return; + + float length = wpn_info->range; + + if( length > 1.0f ) { + viewangles += g_ctx.m_local->m_aimPunchAngle( ) * 2.f; + + forward = math::angle_vectors( viewangles ); + forward *= length; + + vec3_t src = g_ctx.m_local->get_eye_pos( ); + vec3_t dst = src + forward; + + CTraceFilter filter{ }; + CGameTrace tr{ }; + Ray_t ray{ }; + + filter.pSkip = g_ctx.m_local; + ray.Init( src, dst ); + + g_csgo.m_trace( )->TraceRay( ray, MASK_SHOT, &filter, &tr ); + + if( tr.m_pEnt ) { + auto ent = tr.m_pEnt->as< c_base_player >( ); + if( ent->is_valid( ) ) { + if( ent->m_iTeamNum( ) != g_ctx.m_local->m_iTeamNum( ) || g_settings.legit.friendlies ) + cmd->m_buttons |= IN_ATTACK; + } + } + } + } + + void c_legitbot::sample_angle_data( const vec3_t& cur_angles ) { + auto time = g_csgo.m_globals->m_curtime; + + if ( !m_aiming ) { + m_angle_samples.push_front( { cur_angles, time } ); + } + + while ( m_angle_samples.size( ) > g_settings.legit.sample_size( ) ) { + m_angle_samples.pop_back( ); + } + } + + float c_legitbot::get_avg_delta( ) { + if ( m_angle_samples.empty( ) ) + return 0.f; + + float avg_delta{ }; + + for ( auto& it : m_angle_samples ) { + static vec3_t last_angle = it.m_viewangles; + + //doing this implements nonsticky aswell + //once you already are at the target + //after lets say a flick + //it will reduce the aim speed + //making it not "stick" to the bone + //as we dont store records when aiming + float time_delta = g_csgo.m_globals->m_curtime - it.m_time; + float delta_diff = m_deltatime / ( time_delta * 2.f ); + + vec3_t angle_delta = ( last_angle - it.m_viewangles ).clamp( ); + float delta_length = angle_delta.length( ) * delta_diff; + + avg_delta += delta_length; + last_angle = it.m_viewangles; + } + + //scale the delta down + return avg_delta / float( g_settings.legit.sample_size( ) ); + } + + vec2_t c_legitbot::angle_to_pixels( const vec3_t& angle ) { + static auto m_yaw = g_csgo.m_cvar( )->FindVar( xors( "m_yaw" ) ); + static auto m_pitch = g_csgo.m_cvar( )->FindVar( xors( "m_pitch" ) ); + + float x = angle.x / m_pitch->get_float( ); + float y = angle.y / m_yaw->get_float( ); + + return vec2_t( -y, x ); + } + + vec3_t c_legitbot::pixels_to_angle( const vec2_t& pixel ) { + static auto m_yaw = g_csgo.m_cvar( )->FindVar( xors( "m_yaw" ) ); + static auto m_pitch = g_csgo.m_cvar( )->FindVar( xors( "m_pitch" ) ); + + float x = pixel.x * m_pitch->get_float( ); + float y = pixel.y * m_yaw->get_float( ); + + return vec3_t( -y, x, 0.f ).clamp( ); + } + + bool c_legitbot::update_settings( ) { + if ( !g_ctx.run_frame( ) ) return false; + + auto weapon = g_ctx.m_local->get_weapon( ); + if ( !weapon ) return false; + + if ( weapon->is_grenade( ) || weapon->is_knife( ) ) { + return false; + } + + if ( weapon->is_rifle( ) ) { + g_settings.legit.active = &g_settings.legit.rifles; + } + else if ( weapon->is_sniper( ) ) { + g_settings.legit.active = &g_settings.legit.snipers; + } + else if ( weapon->is_pistol( ) ) { + g_settings.legit.active = &g_settings.legit.pistols; + } + else { + g_settings.legit.active = &g_settings.legit.general; + } + + return true; + } + + void c_legitbot::aim_at_target( c_base_player* target, float* x, float* y ) { + vec3_t aim_ang; + vec3_t cur_ang; + vec3_t delta; + vec2_t pixels; + vec2_t mouse; + + g_csgo.m_engine( )->GetViewAngles( cur_ang ); + + if ( g_settings.legit.backtracking( ) && m_lagcomp.find_best_record( target->ce( )->GetIndex( ) ) ) { + aim_ang = math::vector_angles( g_ctx.m_local->get_eye_pos( ), + m_lagcomp.get_backtracked_position( target->ce( )->GetIndex( ) ) ).clamp( ); + } + else { + aim_ang = math::vector_angles( g_ctx.m_local->get_eye_pos( ), + target->get_hitbox_pos( 0 ) ).clamp( ); + } + + aim_ang -= g_ctx.m_local->m_aimPunchAngle( ) * 2.f * ( g_settings.legit.active->m_rcs / 100.f ); + + delta = ( aim_ang - cur_ang ).clamp( ); + float delta_length = delta.length( ); + + if ( delta_length ) { + float final_time = delta_length / ( g_settings.legit.active->m_speed( ) / 100.f ); + m_curtime += m_deltatime; + + if ( m_curtime > final_time ) { + m_curtime = final_time; + } + + float aim_progress = m_curtime / final_time; + delta *= aim_progress; + aim_ang = delta; + + pixels = angle_to_pixels( delta ); + *x += pixels.x; + *y += pixels.y; + } + } + + void c_legitbot::aimbot( float* x, float* y ) { + if ( !g_settings.legit.enabled( ) ) return; + if ( !update_settings( ) ) return; + + m_aiming = false; + static float old_time = g_csgo.m_globals->m_curtime; + float time = g_csgo.m_globals->m_curtime; + + m_deltatime = time - old_time; + if ( g_settings.legit.dynamic_smoothing( ) ) { + float avg_delta = get_avg_delta( ) * g_settings.legit.smooth_factor( ); + if ( avg_delta > m_deltatime ) { + m_deltatime = avg_delta; + } + } + + old_time = time; + + bool in_attack = false; + if ( g_settings.legit.activation_type == 0 ) + in_attack = true; + if ( g_settings.legit.activation_type == 1 + && g_input.is_key_pressed( ( VirtualKeys_t )g_settings.legit.key( ) ) ) { + in_attack = true; + } + + int target_index = get_aim_target( ); + auto target = g_csgo.m_entlist( )->GetClientEntity< >( target_index ); + + if ( target_index != -1 ) { + if( in_attack ) { + m_aiming = true; + aim_at_target( target, x, y ); + } + if( g_settings.legit.assist ) { + assist( target, x, y ); + } + } + else { + m_curtime = 0; + } + } +} \ No newline at end of file diff --git a/cheat/gmod/legitbot.hpp b/cheat/gmod/legitbot.hpp new file mode 100644 index 0000000..f5d4243 --- /dev/null +++ b/cheat/gmod/legitbot.hpp @@ -0,0 +1,75 @@ +#pragma once +#include +#include + +#include "sdk.hpp" + +namespace features +{ + class c_legitbot { + public: + void operator()( float* x, float* y ) { + aimbot( x, y ); + } + + //call once per tick + void sample_angle_data( const vec3_t& angle ); + void triggerbot( user_cmd_t* cmd ); + private: + struct aim_record_t { + vec3_t m_viewangles; + float m_time; + }; + + struct lag_record_t { + int m_tickcount{ }; + vec3_t m_position{ }; + matrix3x4 m_matrix[ 128 ]{ }; + + bool is_valid( ); + }; + + class c_lagcomp { + public: + friend class c_legitbot; + using lag_deque_t = std::deque< lag_record_t >; + + lag_record_t* find_best_record( int ent_index ); + vec3_t get_backtracked_position( int ent_index ); + auto& get_records( int ent_index ) { + return m_data[ ent_index ]; + } + + void store( ); + void operator()( user_cmd_t* cmd ); + + private: + bool backtrack_entity( int ent_index ); + bool can_backtrack_entity( int ent_index ); + void store_player( int ent_index ); + + lag_deque_t m_data[ 65 ]; + user_cmd_t* m_cmd; + }; + + vec2_t angle_to_pixels( const vec3_t& angle ); + vec3_t pixels_to_angle( const vec2_t& pixel ); + void aimbot( float* x, float* y ); + void assist( c_base_player* player, float* x, float* y ); + void aim_at_target( c_base_player*, float*, float* ); + + bool update_settings( ); + float get_avg_delta( ); + int get_aim_target( float fov = 0.f ); + + private: + float m_deltatime{ }; + float m_curtime{ }; + bool m_aiming{ }; + + std::deque< aim_record_t > m_angle_samples; + + public: + c_lagcomp m_lagcomp; + }; +} \ No newline at end of file diff --git a/cheat/gmod/legitbot_lagcomp.cpp b/cheat/gmod/legitbot_lagcomp.cpp new file mode 100644 index 0000000..b2ab3c0 --- /dev/null +++ b/cheat/gmod/legitbot_lagcomp.cpp @@ -0,0 +1,155 @@ +#include "legitbot.hpp" +#include "interface.hpp" +#include "context.hpp" +#include "settings.hpp" +#include "math.hpp" +#include "base_cheat.hpp" +#include "input_system.hpp" +#include "d3d.hpp" + +namespace features +{ + bool c_legitbot::lag_record_t::is_valid( ) { + return util::is_tick_valid( m_tickcount ); + } + + void c_legitbot::c_lagcomp::store_player( int ent_index ) { + auto ent = g_csgo.m_entlist( )->GetClientEntity< >( ent_index ); + vec3_t pos = ent->get_hitbox_pos( 0 ); + int tickcount = TIME_TO_TICKS( ent->m_flSimulationTime( ) ); + + lag_record_t new_record; + if ( ent->ce( )->SetupBones( new_record.m_matrix, 128, 0x100, 0.f ) ) { + new_record.m_position = pos; + new_record.m_tickcount = tickcount; + + m_data[ ent_index ].push_front( new_record ); + } + + while ( !m_data[ ent_index ].empty( ) && + ( m_data[ ent_index ].size( ) > TIME_TO_TICKS( 1.0f ) ) ) { + m_data[ ent_index ].pop_back( ); + } + } + + bool c_legitbot::c_lagcomp::can_backtrack_entity( int ent_index ) { + if ( m_data[ ent_index ].empty( ) ) { + return false; + } + + for( auto& it : m_data[ ent_index ] ) { + if( it.is_valid( ) ) return true; + } + + return false; + } + + c_legitbot::lag_record_t* c_legitbot::c_lagcomp::find_best_record( int ent_index ) { + c_legitbot::lag_record_t* best_record = nullptr; + float best_fov{ g_settings.legit.backtracking_fov( ) }; + vec3_t cur_angle; + vec3_t aim_angle; + vec3_t aim_pos; + vec3_t cur_pos; + int cur_tick; + + if( m_data[ ent_index ].empty( ) ) { + return nullptr; + } + + if( g_settings.misc.net_fakelag( ) && g_settings.misc.net_fakeping_active ) { + best_fov = 360.f; + } + + g_csgo.m_engine( )->GetViewAngles( cur_angle ); + cur_pos = g_ctx.m_local->get_eye_pos( ); + cur_tick = g_csgo.m_globals->m_tickcount; + + for( auto& it : m_data[ ent_index ] ) { + int delta = std::abs( cur_tick - it.m_tickcount ); + + if( !( g_settings.misc.net_fakelag( ) && g_settings.misc.net_fakeping_active ) ) { + auto nci = g_csgo.m_engine( )->GetNetChannelInfo( ); + if( nci ) { + float max_latency = g_settings.legit.backtracking_time + nci->GetLatency( 0 ); + if( delta > TIME_TO_TICKS( max_latency ) ) + continue; + } + } + + if( !it.is_valid( ) ) + continue; + + aim_pos = it.m_position; + aim_angle = math::vector_angles( cur_pos, aim_pos ).clamp( ); + + float fov = ( cur_angle - aim_angle ).clamp( ).length2d( ); + if ( fov < best_fov ) { + best_fov = fov; + best_record = ⁢ + } + } + + return best_record; + } + + vec3_t c_legitbot::c_lagcomp::get_backtracked_position( int ent_index ) { + if( !m_data[ ent_index ].size( ) ) return vec3_t( ); + auto lag_record = find_best_record( ent_index ); + + vec3_t last_position{ }; + for( auto& it : util::reverse_iterator( m_data[ ent_index ] ) ) { + if( it.is_valid( ) ) last_position = it.m_position; break; + } + + return lag_record ? lag_record->m_position : last_position; + } + + void c_legitbot::c_lagcomp::store( ) { + for ( int i = 1; i < 65; ++i ) { + auto ent = g_csgo.m_entlist( )->GetClientEntity< >( i ); + + if ( ent && ent->is_valid( ) && ent != g_ctx.m_local ) { + store_player( i ); + } + else { + m_data[ i ].clear( ); + } + } + } + + bool c_legitbot::c_lagcomp::backtrack_entity( int ent_index ) { + if ( !m_cmd ) return false; + + if ( !can_backtrack_entity( ent_index ) ) return false; + + auto best_record = find_best_record( ent_index ); + + if ( best_record ) { + m_cmd->m_tick_count = best_record->m_tickcount; + return true; + } + + return false; + } + + void c_legitbot::c_lagcomp::operator()( user_cmd_t* cmd ) { + if ( !g_settings.legit.enabled( ) || !g_settings.legit.backtracking( ) ) + return; + + m_cmd = cmd; + store( ); + + auto target = g_cheat.m_legitbot.get_aim_target( g_settings.legit.backtracking_fov( ) ); + bool active = false; + + if ( g_settings.legit.activation_type( ) == 0 ) + active = true; + if ( g_input.is_key_pressed( ( VirtualKeys_t )g_settings.legit.key( ) ) ) + active = true; + + if ( active && target != -1 ) { + backtrack_entity( target ); + } + } +} \ No newline at end of file diff --git a/cheat/gmod/listener.cpp b/cheat/gmod/listener.cpp new file mode 100644 index 0000000..a1939aa --- /dev/null +++ b/cheat/gmod/listener.cpp @@ -0,0 +1,217 @@ +#include "listener.hpp" +#include "interface.hpp" +#include "base_cheat.hpp" +#include "context.hpp" + +#undef PlaySound + +generic_listener_t::generic_listener_t( const char* name, void( *function )( IGameEvent* ) ) : + m_function( function ), m_name( name ) { } + +generic_listener_t::~generic_listener_t( ) { + if( m_registered ) + g_csgo.m_event_mgr( )->RemoveListener( this ); + +} + +void generic_listener_t::init( ) { + g_csgo.m_event_mgr( )->AddListener( this, m_name, false ); + m_registered = true; +} + +namespace listeners +{ + bool dbg_spread( ) { + static con_var< bool > var{ &data::holder_, fnv( "dbg_spread" ), 0 }; + return var( ); + } + + void bullet_impact( IGameEvent* e ) { + if( !g_csgo.m_panic && e ) { + static float last_time = g_csgo.m_globals->m_curtime; + float x = e->GetFloat( xors( "x" ) ); + float y = e->GetFloat( xors( "y" ) ); + float z = e->GetFloat( xors( "z" ) ); + int user_id = e->GetInt( xors( "userid" ) ); + int player_id = g_csgo.m_engine( )->GetPlayerForUserID( user_id ); + + vec3_t impact{ x, y, z }; + if( std::abs( last_time - g_csgo.m_globals->m_curtime ) > ( 1.f / 64.f ) && + player_id == g_csgo.m_engine( )->GetLocalPlayer( ) ) { + + + g_ctx.m_last_shot_ack++; + g_ctx.m_last_shot_ack %= 128; + + if( std::abs( last_time - g_csgo.m_globals->m_curtime ) > 1.0f ) { + if( std::abs( g_ctx.m_last_shot - g_ctx.m_last_shot_ack ) ) { + //if( dbg_spread( ) ) + //g_con->log( "shot queue desynced: delta too high ( %d %d )", g_ctx.m_last_shot_ack, g_ctx.m_last_shot ); + g_ctx.reset_shot_queue( ); + } + } + + if( g_ctx.m_last_shot_ack > g_ctx.m_last_shot ) { + //if( dbg_spread( ) ) + //g_con->log( "shot queue desynced: ack > last" ); + g_ctx.reset_shot_queue( ); + } + + auto& shot = g_ctx.m_shot_data[ g_ctx.m_last_shot_ack ]; + //if( dbg_spread( ) ) + //g_con->log( "shot: %d ack shot: %d", g_ctx.m_last_shot, g_ctx.m_last_shot_ack ); + + if( shot.m_enemy_index ) { + auto ang = math::vector_angles( shot.m_local_pos, shot.m_enemy_pos ); + auto shot_ang = math::vector_angles( shot.m_local_pos, impact ); + + auto dist = shot.m_local_pos.dist_to( shot.m_enemy_pos ); + auto ang_delta = ( ang - shot_ang ).clamp( ); + + float pitch_delta = sin( DEG2RAD( std::abs( ang_delta.x ) ) ) * dist; + float yaw_delta = sin( DEG2RAD( std::abs( ang_delta.y ) ) ) * dist; + + float delta = sqrtf( pitch_delta * pitch_delta + yaw_delta * yaw_delta ); + //scale it up a bit, hitboxes arent *really* boxes anymore + float max = shot.m_hitbox_radius; + + if( delta > max ) { + if( dbg_spread( ) ) + g_con->log( xors( "missed shot due to spread: %f > %f" ), delta, max ); + if( g_settings.misc.log_hits ) { + g_csgo.m_clientmode( )->m_pChatElement->ChatPrintf( 0, 0, xors( "[\3moneybot\1] missed shot due to spread" ) ); + } + + if( shot.m_resolver_state ) { + g_cheat.m_ragebot.m_resolver->on_missed_spread( shot.m_enemy_index, shot.m_resolver_shots ); + } + } + else { + shot.m_missed = false; + } + } + + last_time = g_csgo.m_globals->m_curtime; + } + + if( g_settings.visuals.bullet_tracers( ) ) { + g_cheat.m_visuals.store_tracer( player_id, vec3_t( x, y, z ) ); + } + } + } + + void player_hurt( IGameEvent* e ) { + if( !g_csgo.m_panic && e ) { + int user_id = e->GetInt( xors( "userid" ) ); + int attacker = e->GetInt( xors( "attacker" ) ); + int hitgroup = e->GetInt( xors( "hitgroup" ) ); + int dmg = e->GetInt( xors( "dmg_health" ) ); + int hp = e->GetInt( xors( "health" ) ); + int attacker_id = g_csgo.m_engine( )->GetPlayerForUserID( attacker ); + int player_id = g_csgo.m_engine( )->GetPlayerForUserID( user_id ); + + + if( attacker_id == g_csgo.m_engine( )->GetLocalPlayer( ) && user_id != attacker_id ) { + g_cheat.m_visuals.store_hit( ); + + auto& shot = g_ctx.m_shot_data[ g_ctx.m_last_shot_ack % 128 ]; + if( hitgroup == shot.m_hitgroup && shot.m_resolver_state && !shot.m_missed ) { + g_cheat.m_ragebot.m_resolver->listener( player_id, shot.m_resolver_shots ); + } + + if( !shot.m_missed || !shot.m_resolver_state ) { + //if( dbg_spread( ) ) + //g_con->log( xors( "hit enemy in %s" ), util::hitgroup_to_string( hitgroup ).c_str( ) ); + + if( g_settings.misc.log_hits ) { + char hit_str[ 100 ]; + if( hitgroup == HITGROUP_HEAD && hp <= 0 ) { + strenc::w_sprintf_s( hit_str, 100, xors( "[\3moneybot\1] pHit" ) ); + } + else { + strenc::w_sprintf_s( hit_str, 100, xors( "[\3moneybot\1] hit player in %s for %d" ), util::hitgroup_to_string( hitgroup ).c_str( ), dmg ); + } + g_csgo.m_clientmode( )->m_pChatElement->ChatPrintf( 0, 0, hit_str ); + } + } + } + } + } + + void round_start( IGameEvent * e ) { + if( g_ctx.run_frame( ) ) { + switch( g_settings.misc.autobuy.main_weapon ) { + case 1: + g_csgo.m_engine( )->ClientCmd_Unrestricted( xors( "buy g3sg1" ) ); + g_csgo.m_engine( )->ClientCmd_Unrestricted( xors( "buy scar20" ) ); + break; + case 2: + g_csgo.m_engine( )->ClientCmd_Unrestricted( xors( "buy ssg08" ) ); + break; + case 3: + g_csgo.m_engine( )->ClientCmd_Unrestricted( xors( "buy awp" ) ); + break; + case 4: + g_csgo.m_engine( )->ClientCmd_Unrestricted( xors( "buy ak47" ) ); + g_csgo.m_engine( )->ClientCmd_Unrestricted( xors( "buy m4a1" ) ); + break; + case 5: + g_csgo.m_engine( )->ClientCmd_Unrestricted( xors( "buy ssg556" ) ); + g_csgo.m_engine( )->ClientCmd_Unrestricted( xors( "buy aug" ) ); + break; + case 6: + g_csgo.m_engine( )->ClientCmd_Unrestricted( xors( "buy mac10" ) ); + g_csgo.m_engine( )->ClientCmd_Unrestricted( xors( "buy mp9" ) ); + break; + } + + switch( g_settings.misc.autobuy.secondary_weapon ) { + case 1: + g_csgo.m_engine( )->ClientCmd_Unrestricted( xors( "buy deagle" ) ); + break; + case 2: + g_csgo.m_engine( )->ClientCmd_Unrestricted( xors( "buy elite" ) ); + break; + } + + if( g_ctx.m_local->m_iAccount( ) > 1000 ) { + if( g_settings.misc.autobuy.armor( ) ) { + g_csgo.m_engine( )->ClientCmd_Unrestricted( xors( "buy vest" ) ); + g_csgo.m_engine( )->ClientCmd_Unrestricted( xors( "buy vesthelm" ) ); + } + + if( g_settings.misc.autobuy.zeus( ) ) + g_csgo.m_engine( )->ClientCmd_Unrestricted( xors( "buy taser 34" ) ); + + + if( g_settings.misc.autobuy.defuser( ) ) + g_csgo.m_engine( )->ClientCmd_Unrestricted( xors( "buy defuser" ) ); + + + if( g_settings.misc.autobuy.molly( ) ) { + g_csgo.m_engine( )->ClientCmd_Unrestricted( xors( "buy molotov" ) ); + g_csgo.m_engine( )->ClientCmd_Unrestricted( xors( "buy incgrenade" ) ); + } + + if( g_settings.misc.autobuy.smoke( ) ) + g_csgo.m_engine( )->ClientCmd_Unrestricted( xors( "buy smokegrenade" ) ); + + + if( g_settings.misc.autobuy.grenade( ) ) + g_csgo.m_engine( )->ClientCmd_Unrestricted( xors( "buy hegrenade" ) ); + + + if( g_settings.misc.autobuy.flash( ) ) + g_csgo.m_engine( )->ClientCmd_Unrestricted( xors( "buy flashbang" ) ); + + + if( g_settings.misc.autobuy.decoy( ) ) + g_csgo.m_engine( )->ClientCmd_Unrestricted( xors( "buy decoy" ) ); + + + if( g_settings.misc.autobuy.flash( ) ) + g_csgo.m_engine( )->ClientCmd_Unrestricted( xors( "buy flashbang" ) ); + } + } + } +} \ No newline at end of file diff --git a/cheat/gmod/listener.hpp b/cheat/gmod/listener.hpp new file mode 100644 index 0000000..182a615 --- /dev/null +++ b/cheat/gmod/listener.hpp @@ -0,0 +1,26 @@ +#pragma once +#include "sdk.hpp" + +struct generic_listener_t : public IGameEventListener2 { + generic_listener_t( const char* event_name, + void( *function )( IGameEvent* ) ); + + generic_listener_t( ) = default; + + ~generic_listener_t( ); + + void init( ); + + void FireGameEvent( IGameEvent* event ) override { m_function( event ); } + int GetEventDebugID( ) override { return 0x2a; } +private: + void( *m_function )( IGameEvent* ); + const char* m_name{ }; + bool m_registered{ }; +}; + +namespace listeners { + extern void bullet_impact( IGameEvent* e ); + extern void player_hurt( IGameEvent* e ); + extern void round_start( IGameEvent* e ); +} \ No newline at end of file diff --git a/cheat/gmod/lock_cursor.cpp b/cheat/gmod/lock_cursor.cpp new file mode 100644 index 0000000..477847d --- /dev/null +++ b/cheat/gmod/lock_cursor.cpp @@ -0,0 +1,13 @@ +#include "hooks.hpp" + +void __fastcall hooks::lock_cursor( void* ecx, void* edx ) { + static auto lock_cursor_o = g_gmod.m_surface->get_old_function< decltype( &hooks::lock_cursor ) >( 62 ); + if( g_gmod.m_panic ) return lock_cursor_o( ecx, edx ); + + if( g_settings.menu.open ) { + g_gmod.m_surface( )->UnlockCursor( ); + } + else { + lock_cursor_o( ecx, edx ); + } +} \ No newline at end of file diff --git a/cheat/gmod/math.cpp b/cheat/gmod/math.cpp new file mode 100644 index 0000000..5326fdd --- /dev/null +++ b/cheat/gmod/math.cpp @@ -0,0 +1,16 @@ +#include "math.hpp" +#include "interface.hpp" + +namespace math +{ + uint32_t md5_pseudorandom( uint32_t seed ) { + using fn = uint32_t( __thiscall * )( uint32_t seed ); + + static auto func = pattern::first_code_match< uint32_t( __cdecl* )( uint32_t ) >( g_gmod.m_chl.dll( ), xors( "55 8B EC 83 EC 68 6A 58 8D 45 98 6A 00 50 E8 ? ? ? ? 6A" ) ); + if( !func ) { + return 0; + } + + return func( seed ); + } +} \ No newline at end of file diff --git a/cheat/gmod/math.hpp b/cheat/gmod/math.hpp new file mode 100644 index 0000000..4d5003e --- /dev/null +++ b/cheat/gmod/math.hpp @@ -0,0 +1,137 @@ +#pragma once +#include +#include "util.hpp" +#include "pattern.hpp" +#include "sdk.hpp" + +static constexpr long double M_PI = 3.14159265358979323846f; +static constexpr long double M_RADPI = 57.295779513082f; +static constexpr long double M_PIRAD = 0.01745329251f; +static constexpr float M_PI_F = ( ( float )( M_PI ) ); +__forceinline float RAD2DEG( float x ) { return( ( float )( x ) * ( float )( 180.f / M_PI_F ) ); } +__forceinline float DEG2RAD( float x ) { return( ( float )( x ) * ( float )( M_PI_F / 180.f ) ); } + +namespace { + //make a random generator and seed it with a p random number + static std::random_device rd; + static std::mt19937 gen( rd( ) ); +} + +NAMESPACE_REGION( math ) + +#undef min +#undef max + +template < typename t > +t min( const t& t1, const t& t2 ) { + return t1 < t2 ? t1 : t2; +} + +template < typename t, typename... ts_ > +t min( const t& t1, const t& t2, ts_&&... ts ) { + return t1 < t2 ? + min( t1, std::forward< ts_ >( ts )... ) : + min( t2, std::forward< ts_ >( ts )... ); +} + +template < typename t > +t max( const t& t1, const t& t2 ) { + return t1 > t2 ? t1 : t2; +} + +template < typename t, typename... ts_ > +t max( const t& t1, const t& t2, ts_&&... ts ) { + return t1 > t2 ? + max( t1, std::forward< ts_ >( ts )... ) : + max( t2, std::forward< ts_ >( ts )... ); +} + +// todo - dex; make 2 random generator funcs here, this one only works for floats normally + +template < typename t > +__forceinline t random_number( t min, t max ) { + if constexpr( !std::is_integral_v< t > ) { + std::uniform_real_distribution< t > dist( min, max ); + return dist( gen ); + } + else { + std::uniform_int_distribution< t > dist( min, max ); + return dist( gen ); + } +} + +__forceinline vec3_t get_rotated_pos( vec3_t start, float rotation, float distance ) { + float rad = DEG2RAD( rotation ); + start.x += cos( rad ) * distance; + start.y += sin( rad ) * distance; + + return start; +} + +__forceinline vec3_t vector_angles( const vec3_t& start, const vec3_t& end ) { + vec3_t delta = end - start; + + float magnitude = sqrtf( delta.x * delta.x + delta.y * delta.y ); + float pitch = atan2f( -delta.z, magnitude ) * M_RADPI; + float yaw = atan2f( delta.y, delta.x ) * M_RADPI; + + vec3_t angle( pitch, yaw, 0.0f ); + return angle.clamp( ); +} + +__forceinline vec3_t angle_vectors( const vec3_t& angles ) { + float sp, sy, cp, cy; + sp = sinf( angles.x * M_PIRAD ); + cp = cosf( angles.x * M_PIRAD ); + sy = sinf( angles.y * M_PIRAD ); + cy = cosf( angles.y * M_PIRAD ); + + return vec3_t{ cp * cy, cp * sy, -sp }; +} + +__forceinline void angle_vectors( const vec3_t& angles, vec3_t* forward, vec3_t* right, vec3_t* up ) { + float sr, sp, sy, cr, cp, cy; + + sp = sinf( angles.x * M_PIRAD ); + cp = cosf( angles.x * M_PIRAD ); + sy = sinf( angles.y * M_PIRAD ); + cy = cosf( angles.y * M_PIRAD ); + sr = sinf( angles.z * M_PIRAD ); + cr = cosf( angles.z * M_PIRAD ); + + if ( forward ) { + forward->x = cp * cy; + forward->y = cp * sy; + forward->z = -sp; + } + + if ( right ) { + right->x = -1 * sr * sp * cy + -1 * cr * -sy; + right->y = -1 * sr * sp * sy + -1 * cr * cy; + right->z = -1 * sr * cp; + } + + if ( up ) { + up->x = cr * sp * cy + -sr * -sy; + up->y = cr * sp * sy + -sr * cy; + up->z = cr * cp; + } +} + +__forceinline float find_closest_step( float angle, float step ) { + int steps = ( int )( angle / step + 0.5f ); + + return steps * step; +} + +__forceinline vec3_t vector_transform( const vec3_t& in, const matrix3x4& matrix ) { + vec3_t out; + for ( int i{ }; i < 3; i++ ) + out[ i ] = in.dot( ( const vec3_t& )matrix[ i ] ) + matrix[ i ][ 3 ]; + + return out; +} + +extern uint32_t md5_pseudorandom( uint32_t seed ); + +END_REGION \ No newline at end of file diff --git a/cheat/gmod/mem.hpp b/cheat/gmod/mem.hpp new file mode 100644 index 0000000..f5c8ec4 --- /dev/null +++ b/cheat/gmod/mem.hpp @@ -0,0 +1,66 @@ +#pragma once +#include +#include "util.hpp" + +#define get_baseptr( ) ( ( uintptr_t )( _AddressOfReturnAddress( ) ) - sizeof( uintptr_t ) ) + +class stack_t { + uintptr_t m_ptr; + +public: + __forceinline stack_t( ) : m_ptr( get_baseptr( ) ) { } + + __forceinline stack_t( uintptr_t ptr ) : m_ptr( ptr ) { } + + template < typename t = uintptr_t > + __forceinline t get( ) { + return ( t )m_ptr; + } + + template < typename t = uintptr_t > + __forceinline t return_address( ) { + return *( t* )( m_ptr + sizeof( void* ) ); + } + + template < typename t = uintptr_t > + __forceinline t address_of_return_address( ) { + return ( t )( m_ptr + sizeof( uintptr_t ) ); + } + + __forceinline stack_t& next( ) { + return *( stack_t* )( m_ptr ); + } + + template < typename t = uintptr_t > + __forceinline t local( size_t at ) { + return ( t )( m_ptr - at ); + } + + template < typename t = uintptr_t > + __forceinline t arg( size_t at ) { + return ( t )( m_ptr + at ); + } +}; + +namespace util { + template < typename t = uint8_t > + __forceinline t* memcpy( t* dst, t* src, size_t size = sizeof( t ) ) { + __movsb( + ( uint8_t* )dst, + ( uint8_t* )src, + size + ); + + return dst; + } + + __forceinline void* memset( uint8_t* dst, uint8_t val, size_t size ) { + __stosb( + dst, + val, + size + ); + + return dst; + } +} \ No newline at end of file diff --git a/cheat/gmod/movement.cpp b/cheat/gmod/movement.cpp new file mode 100644 index 0000000..2815767 --- /dev/null +++ b/cheat/gmod/movement.cpp @@ -0,0 +1,269 @@ +#include "movement.hpp" +#include "interface.hpp" +#include "settings.hpp" +#include "context.hpp" + +#include +#include "base_cheat.hpp" +#include "input_system.hpp" + +NAMESPACE_REGION( features ) + +void c_movement::bhop( ) { + if ( !g_settings.misc.bunny_hop ) + return; + + if ( g_ctx.m_local->m_nMoveType( ) == MOVETYPE_LADDER || + g_ctx.m_local->m_nMoveType( ) == MOVETYPE_NOCLIP ) + return; + + //jump like you nohat + if ( m_ucmd->m_buttons & IN_JUMP && !( g_ctx.m_local->m_fFlags( ) & FL_ONGROUND ) ) { + m_ucmd->m_buttons &= ~IN_JUMP; + } +} + +void c_movement::auto_strafer( ) { + if ( !g_settings.misc.auto_strafe ) + return; + + float speed = g_ctx.m_local->m_vecVelocity( ).length2d( ); + + if ( m_ucmd->m_buttons & IN_JUMP && speed > 1.0f ) { + if ( !m_ucmd->m_forwardmove && !m_ucmd->m_sidemove ) { + if ( !m_ucmd->m_mousedx ) { + m_ucmd->m_forwardmove = std::min< float >( 450.f, 5850.f / speed ); + m_ucmd->m_sidemove = ( m_ucmd->m_cmd_nr % 2 ) == 0 ? -450.f : 450.f; + } + else { + m_ucmd->m_sidemove = m_ucmd->m_mousedx < 0.f ? -450.f : 450.f; + } + } + } +} + +void c_movement::edge_jump( ) { + if ( !g_settings.misc.edge_jump ) + return; + + if ( !g_input.is_key_pressed( ( VirtualKeys_t )g_settings.misc.edge_jump_key( ) ) ) + return; + + //needs key check here so its not always on + //what?? + bool pre_onground = g_ctx.m_local->m_fFlags( ) & FL_ONGROUND; + bool post_onground = g_cheat.m_prediction.get_predicted_flags( ) & FL_ONGROUND; + + if ( pre_onground && !post_onground ) { + m_ucmd->m_buttons |= IN_JUMP; + } +} + +void c_movement::auto_jumpbug( ) { + if ( !g_settings.misc.auto_jumpbug( ) ) + return; + + if ( !g_input.is_key_pressed( ( VirtualKeys_t )g_settings.misc.auto_jumpbug_key( ) ) ) + return; + + static bool jumped = false; + static bool jump_next = false; + + m_ucmd->m_buttons |= IN_DUCK; + + bool pre_onground = g_ctx.m_local->m_fFlags( ) & FL_ONGROUND; + bool post_onground = g_cheat.m_prediction.get_predicted_flags( ) & FL_ONGROUND; + + if ( jump_next ) { + m_ucmd->m_buttons &= ~IN_DUCK; + jump_next = false; + } + else if ( !pre_onground && post_onground && !jumped ) { + jump_next = true; + jumped = true; + } + else if ( !pre_onground && !post_onground ) { + jumped = false; + } +} + +//fuck hardcode +const vec3_t mins( -17.f, -17.f, 0 ); +const vec3_t maxs( 17.f, 17.f, 42.f ); + +void rotate_movement( user_cmd_t* cmd, float rotation ) { + rotation = rotation * M_PIRAD; + + float cos_rot = cos( rotation ); + float sin_rot = sin( rotation ); + + float new_forwardmove = ( cos_rot * cmd->m_forwardmove ) - ( sin_rot * cmd->m_sidemove ); + float new_sidemove = ( sin_rot * cmd->m_forwardmove ) + ( cos_rot * cmd->m_sidemove ); + + cmd->m_forwardmove = new_forwardmove; + cmd->m_sidemove = new_sidemove; +} + +float get_ideal_strafe_step( float speed ) { + static auto* sv_airaccelerate = g_gmod.m_cvar( )->FindVar( xors( "sv_airaccelerate" ) ); + float airaccel = std::min< float >( sv_airaccelerate->get_float( ), 30.f ); + + float step = std::atan2( airaccel, speed ) * M_RADPI; + + //tickcount correction + float tickcount = 1.0f / g_gmod.m_globals->m_interval_per_tick; + step *= ( 64.f / tickcount ); + + return step; +} + +float trace_ideal_step( bool direction, vec3_t direction_vec, float ideal_step, float multiplier, float max_correction ) { + Ray_t ray; + CTraceFilterWorldOnly filter; + filter.pSkip = g_ctx.m_local; + vec3_t start = g_ctx.m_local->m_vecOrigin( ); + start.z += 5.0f; + + CGameTrace trace; + + float step = ideal_step; + float correction = 0.5f; + + if( direction ) { + step = -step; + correction = -correction; + max_correction = -max_correction; + } + + while( true ) { + vec3_t new_dir = direction_vec; + new_dir.y += step; + + vec3_t forward = math::angle_vectors( new_dir ); + forward *= multiplier; + + vec3_t end = start + forward; + ray.Init( start, end, mins, maxs ); + + g_gmod.m_trace( )->TraceRay( ray, MASK_SOLID, &filter, &trace ); + + if( !trace.DidHit( ) ) { + break; + } + else { + new_dir.x -= 20.f; + vec3_t forward_up = math::angle_vectors( new_dir ); + forward_up *= multiplier; + + vec3_t endUp = start + forward_up; + ray.Init( start, endUp, mins, maxs ); + + CGameTrace trace_up; + g_gmod.m_trace( )->TraceRay( ray, MASK_SOLID, &filter, &trace_up ); + if( !trace_up.DidHit( ) ) { + break; + } + } + + step += correction; + + if( direction && step <= max_correction ) { + break; + } + if( !direction && step >= max_correction ) { + break; + } + } + + return step; +} + +float get_trace_length_multiplier( float speed ) { + float multiplier = speed * 0.2f; + if( multiplier < 32.f ) multiplier = 32.f; + if( multiplier > 256.f ) multiplier = 256.f; + + return multiplier; +} + +bool c_movement::get_best_direction( float ideal_step, float left, float right, float weight ) { + float left_delta = std::fabs( ideal_step - left ); + float right_delta = std::fabs( -ideal_step - right ); + + if( m_direction ) right_delta -= weight; + else left_delta -= weight; + + return ( left_delta > right_delta ); +} + +float c_movement::get_best_strafe_step( float speed, vec3_t direction ) { + float multiplier = get_trace_length_multiplier( speed ); + float ideal_step = get_ideal_strafe_step( speed ); + + float left_step = trace_ideal_step( false, direction, ideal_step, multiplier, 90.f ); + float right_step = trace_ideal_step( true, direction, ideal_step, multiplier, 90.f ); + + m_direction = get_best_direction( ideal_step, left_step, right_step, 25.f ); + + if( m_direction ) { + float max_clamped_correction = -ideal_step - 5.0f; + if( right_step < max_clamped_correction ) right_step = max_clamped_correction; + return right_step; + } + else { + float max_clamped_correction = ideal_step + 5.0f; + if( left_step > max_clamped_correction ) left_step = max_clamped_correction; + return left_step; + } +} + +float c_movement::get_best_strafe_angle( ) { + vec3_t velocity = g_ctx.m_local->m_vecVelocity( ); + velocity.z = 0.0f; + float speed = velocity.length2d( ); + + vec3_t direction = math::vector_angles( vec3_t( 0.0f, 0.0f, 0.0f ), velocity ); + float step = get_best_strafe_step( speed, direction ); + + return direction.y + step; +} + +void c_movement::circle_strafe( ) { + if( g_settings.misc.circle_strafe ) { + if( g_ctx.m_local->m_nMoveType( ) == MOVETYPE_LADDER || g_ctx.m_local->m_nMoveType( ) == MOVETYPE_NOCLIP ) + return; + + static bool can_finish = true; + auto cmd = g_ctx.get_last_cmd( ); + if( g_input.is_key_pressed( g_settings.misc.circle_strafe_key ) || !can_finish ) { + m_ucmd->m_buttons |= IN_JUMP; + cmd->m_forwardmove = 450.f; + + float speed = g_ctx.m_local->m_vecVelocity( ).length2d( ); + if( speed > 1.f ) { + can_finish = false; + float angle = get_best_strafe_angle( ); + + float delta = std::remainderf( m_ucmd->m_viewangles.y - angle, 360.f ); + + cmd->m_forwardmove = 5850.f / speed; + cmd->m_sidemove = m_direction ? 450.f : -450.f; + rotate_movement( cmd, delta ); + + vec3_t current_view; + g_gmod.m_engine( )->GetViewAngles( current_view ); + float view_delta = std::remainderf( current_view.y - angle, 360.f ); + + if( std::fabs( view_delta ) < 10.0f || speed < 250.f ) { + can_finish = true; + } + } + else { + can_finish = true; + } + } + } +} + + +END_REGION \ No newline at end of file diff --git a/cheat/gmod/movement.hpp b/cheat/gmod/movement.hpp new file mode 100644 index 0000000..f9e3ced --- /dev/null +++ b/cheat/gmod/movement.hpp @@ -0,0 +1,36 @@ +#pragma once +#include "util.hpp" + +//forward declarations +class user_cmd_t; + +NAMESPACE_REGION( features ) + +class c_movement { + user_cmd_t* m_ucmd{ }; + bool m_direction{ }; + + void bhop( ); + void auto_strafer( ); + void edge_jump( ); + void auto_jumpbug( ); + void jump_stats( ); + + bool get_best_direction( float ideal_step, float left, float right, float weight ); + float get_best_strafe_step( float speed, vec3_t direction ); + float get_best_strafe_angle( ); + void circle_strafe( ); + +public: + void operator()( user_cmd_t* ucmd ) { + m_ucmd = ucmd; + auto_strafer( ); + //circle_strafe( ); + bhop( ); + edge_jump( ); + //auto_jumpbug( ); + //jump_stats( ); + } +}; + +END_REGION \ No newline at end of file diff --git a/cheat/gmod/movement_recorder.cpp b/cheat/gmod/movement_recorder.cpp new file mode 100644 index 0000000..60f082e --- /dev/null +++ b/cheat/gmod/movement_recorder.cpp @@ -0,0 +1,79 @@ +#include "movement_recorder.hpp" +#include "input_system.hpp" +#include "settings.hpp" +#include "interface.hpp" + +namespace features +{ + void c_move_recorder::operator()( user_cmd_t* cmd ) { + if( !g_settings.misc.recorder_enable ) + return; + + if( g_input.is_key_pressed( g_settings.misc.recording_start_key( ) ) ) + start_recording( ); + + if( g_input.is_key_pressed( g_settings.misc.recording_stop_key( ) ) ) + stop_recording( ); + + if( m_recording ) { + record_cmd( cmd ); + } + + if( m_playing ) { + if( m_move_data.empty( ) ) { + m_playing = false; + } + else if( ++m_record_index >= m_move_data.size( ) ) { + m_playing = false; + } + else { + auto& old_cmd = m_move_data.at( m_record_index ); + + if( g_settings.misc.recording_show_angles == 1 && ( old_cmd.m_buttons & IN_ATTACK ) || + g_settings.misc.recording_show_angles == 2 ) { + g_csgo.m_engine( )->SetViewAngles( old_cmd.m_viewangles ); + } + + cmd->m_buttons = old_cmd.m_buttons; + cmd->m_aimdirection = old_cmd.m_aimdirection; + cmd->m_forwardmove = old_cmd.m_forwardmove; + cmd->m_impulse = old_cmd.m_impulse; + cmd->m_mousedx = old_cmd.m_mousedx; + cmd->m_mousedy = old_cmd.m_mousedy; + cmd->m_sidemove = old_cmd.m_sidemove; + cmd->m_upmove = old_cmd.m_upmove; + cmd->m_viewangles = old_cmd.m_viewangles; + cmd->m_weaponselect = old_cmd.m_weaponselect; + cmd->m_weaponsubtype = old_cmd.m_weaponsubtype; + } + } + else { + m_record_index = 0; + } + } + + void c_move_recorder::record_cmd( user_cmd_t* cmd ) { + m_move_data.push_back( *cmd ); + } + + void c_move_recorder::start_recording( ) { + m_recording = true; + } + + void c_move_recorder::stop_recording( ) { + m_recording = false; + } + + void c_move_recorder::play_back( ) { + m_recording = false; + m_playing = true; + } + + void c_move_recorder::stop_playback( ) { + m_playing = false; + } + + void c_move_recorder::clear_recording( ) { + m_move_data.clear( ); + } +} \ No newline at end of file diff --git a/cheat/gmod/movement_recorder.hpp b/cheat/gmod/movement_recorder.hpp new file mode 100644 index 0000000..dcfe511 --- /dev/null +++ b/cheat/gmod/movement_recorder.hpp @@ -0,0 +1,29 @@ +#pragma once +#include "sdk.hpp" +#include "vector.hpp" + +namespace features +{ + class c_move_recorder { + public: + void play_back( ); + void stop_playback( ); + void clear_recording( ); + + bool is_recording( ) const { return m_recording; } + bool is_playing( ) const { return m_playing; } + int get_record_count( ) const { return m_move_data.size( ); } + auto get_current_record( ) const { return m_record_index; } + + void operator()( user_cmd_t* ); + private: + void record_cmd( user_cmd_t* cmd ); + void start_recording( ); + void stop_recording( ); + + bool m_recording = false; + bool m_playing = false; + size_t m_record_index = 0; + std::vector< user_cmd_t > m_move_data; + }; +} \ No newline at end of file diff --git a/cheat/gmod/netvar_proxy.hpp b/cheat/gmod/netvar_proxy.hpp new file mode 100644 index 0000000..cb329c3 --- /dev/null +++ b/cheat/gmod/netvar_proxy.hpp @@ -0,0 +1,37 @@ +#pragma once +#include "Valve/dt_recv.h" + +//dont leave things out of namespaces +namespace hooks +{ + class c_netvar_proxy { + public: + c_netvar_proxy( RecvProp* target_property, RecvVarProxyFn new_proxy ) { + m_target = target_property; + m_original = target_property->m_ProxyFn; + m_target->m_ProxyFn = new_proxy; + } + + c_netvar_proxy( ) = default; + + void init( RecvProp* target, RecvVarProxyFn new_proxy ) { + m_target = target; + m_original = target->m_ProxyFn; + m_target->m_ProxyFn = new_proxy; + } + + ~c_netvar_proxy( ) { + if( !m_target ) return; + m_target->m_ProxyFn = m_original; + } + + RecvVarProxyFn get_old_function( ) const { + return m_original; + } + + private: + //overcomplicated... + RecvProp* m_target; + RecvVarProxyFn m_original; + }; +} \ No newline at end of file diff --git a/cheat/gmod/netvars.cpp b/cheat/gmod/netvars.cpp new file mode 100644 index 0000000..19ab6d1 --- /dev/null +++ b/cheat/gmod/netvars.cpp @@ -0,0 +1,93 @@ +#include "netvars.hpp" +#include "interface.hpp" + +factory::c_netvars g_netvars; + +NAMESPACE_REGION( factory ) + +void c_netvars::init( ) { + for ( auto client_class = g_gmod.m_chl( )->GetAllClasses( ); + !!client_class; + client_class = client_class->m_next + ) { + auto table = client_class->m_rt_table; + m_tables.push_back( table ); + } +} + +RecvTable* c_netvars::get_table( hash_t hash ) const { + if ( m_tables.empty( ) ) return nullptr; + + for ( auto& table : m_tables ) { + if ( !table ) continue; + + if ( hash == hash::fnv1a( table->m_pNetTableName ) ) { + return table; + } + } + + return nullptr; +} + +//iterating this too much results in a stack overflow, so thats cool +RecvProp* c_netvars::get_prop( hash_t data, hash_t name ) const { + RecvProp* prop{ }; + RecvTable* child{ }; + + auto table = get_table( data ); + if( !table ) return nullptr; + + for( int i{ }; i < table->m_nProps; ++i ) { + prop = &table->m_pProps[ i ]; + child = prop->GetDataTable( ); + + if( child && child->m_nProps ) { + auto tmp = get_prop( hash::fnv1a( child->m_pNetTableName ), name ); + if( tmp ) return tmp; + } + + if( name != hash::fnv1a( prop->m_pVarName ) ) + continue; + + return prop; + } + + return nullptr; +} + +std::ptrdiff_t c_netvars::get_entry( hash_t name, RecvTable* table ) const { + std::ptrdiff_t ret{ }; + RecvProp* prop; + RecvTable* child; + + for ( int i{ }; i < table->m_nProps; ++i ) { + prop = &table->m_pProps[ i ]; + child = prop->GetDataTable( ); + + if ( child && child->m_nProps ) { + auto tmp = get_entry( name, child ); + if ( tmp ) ret += prop->GetOffset( ) + tmp; + } + + if ( name != hash::fnv1a( prop->m_pVarName ) ) + continue; + + return prop->GetOffset( ) + ret; + } + + return ret; +} + +std::ptrdiff_t c_netvars::get_netvar( hash_t data, hash_t name ) const { + std::ptrdiff_t ret{ }; + auto table = get_table( data ); + if ( !table ) return 0; + + ret = get_entry( name, table ); +#ifdef DEBUG + printf( "%s:\t\t 0x%05x\n", name.c_str( ), ret ); +#endif + return ret; +} + +END_REGION \ No newline at end of file diff --git a/cheat/gmod/netvars.hpp b/cheat/gmod/netvars.hpp new file mode 100644 index 0000000..9924b43 --- /dev/null +++ b/cheat/gmod/netvars.hpp @@ -0,0 +1,44 @@ +#pragma once +#include + +#include "Valve\dt_recv.h" +#include "util.hpp" +#include "fnv.hpp" + +class RecvTable; + +#define NETVAR( funcname, name, table, extra, type ) \ +__forceinline auto& funcname( ) { \ + static std::ptrdiff_t offset = g_netvars.get_netvar( fnv( table ), fnv( name ) ); \ + return get< type >( offset + extra ); \ +} + +#define PNETVAR( funcname, name, table, extra, type ) \ +__forceinline type* funcname( ) { \ + static std::ptrdiff_t offset = g_netvars.get_netvar( fnv( table ), fnv( name ) ); \ + return reinterpret_cast< type* >( uintptr_t( this ) + offset + extra ); \ +} + +#define OFFSET( funcname, offset, type ) \ +__forceinline auto& funcname( ) { \ + return get< type >( offset ); \ +} + +NAMESPACE_REGION( factory ) + +class c_netvars { +public: + void init( ); + //search through the netvar list + std::ptrdiff_t get_netvar( hash_t table, hash_t hash ) const; + RecvProp* get_prop( hash_t table, hash_t name ) const; +public: + std::ptrdiff_t get_entry( hash_t hash, RecvTable* table ) const; + RecvTable* get_table( hash_t hash ) const; +private: + std::vector< RecvTable* > m_tables; +}; + +END_REGION + +extern factory::c_netvars g_netvars; \ No newline at end of file diff --git a/cheat/gmod/on_screen_size_changed.cpp b/cheat/gmod/on_screen_size_changed.cpp new file mode 100644 index 0000000..7b33762 --- /dev/null +++ b/cheat/gmod/on_screen_size_changed.cpp @@ -0,0 +1,9 @@ +#include "hooks.hpp" + +void __fastcall hooks::on_screen_size_changed( void* ecx_, void* edx_, int old_w, int old_h ) { + static auto old_fn = g_csgo.m_surface->get_old_function< decltype( &on_screen_size_changed ) >( 116 ); + + old_fn( ecx_, nullptr, old_w, old_h ); + + g_fonts.initialize( ); +} \ No newline at end of file diff --git a/cheat/gmod/override_mouse_input.cpp b/cheat/gmod/override_mouse_input.cpp new file mode 100644 index 0000000..792c5d2 --- /dev/null +++ b/cheat/gmod/override_mouse_input.cpp @@ -0,0 +1,14 @@ +#include "hooks.hpp" +#include "base_cheat.hpp" +#include "context.hpp" + +void __fastcall hooks::override_mouse_input( void* ecx_, void* edx_, float* x, float* y ) { + static auto omi_o = g_csgo.m_clientmode->get_old_function< decltype( &hooks::override_mouse_input ) >( 23 ); + omi_o( ecx_, edx_, x, y ); + + if( g_csgo.m_panic ) return; + + if( g_ctx.run_frame( ) && g_ctx.m_local->is_alive( ) ) { + g_cheat.m_legitbot( x, y ); + } +} \ No newline at end of file diff --git a/cheat/gmod/override_view.cpp b/cheat/gmod/override_view.cpp new file mode 100644 index 0000000..92b559d --- /dev/null +++ b/cheat/gmod/override_view.cpp @@ -0,0 +1,22 @@ +#include "base_cheat.hpp" +#include "context.hpp" +#include "hooks.hpp" +#include "settings.hpp" + +void __fastcall hooks::override_view( void* ecx_, void* edx_, CViewSetup* setup ) { + static auto override_view_o = g_gmod.m_clientmode->get_old_function< decltype( &hooks::override_view ) >( 16 ); + if( g_gmod.m_panic ) { + return override_view_o( ecx_, edx_, setup ); + } + + //g_ctx.m_fov = setup->m_flFov; + //if ( g_ctx.run_frame( ) && g_ctx.m_local->is_valid( )) { + // setup->m_flFov = g_settings.misc.fov_changer( ); + //} + //g_cheat.m_extra.third_person( ); + override_view_o( ecx_, edx_, setup ); + + if( g_ctx.run_frame( ) && g_ctx.m_local->is_valid( ) && g_settings.misc.no_recoil ) { + setup->angles -= g_ctx.m_local->m_vecPunchAngle( ); + } +} \ No newline at end of file diff --git a/cheat/gmod/paint.cpp b/cheat/gmod/paint.cpp new file mode 100644 index 0000000..d744d9d --- /dev/null +++ b/cheat/gmod/paint.cpp @@ -0,0 +1,21 @@ +#include + +#include "hooks.hpp" +#include "interface.hpp" +#include "context.hpp" +#include "math.hpp" + +#include "base_cheat.hpp" + +void __fastcall hooks::paint( void* ecx, void* edx, int mode ) { + static auto paint_o = g_gmod.m_engine_vgui->get_old_function< decltype( &hooks::paint ) >( 13 ); + if( g_gmod.m_panic ) return paint_o( ecx, edx, mode ); + + paint_o( ecx, edx, mode ); + + if( mode & 2 ) { + if( g_ctx.run_frame( ) ) { + g_cheat.m_visuals.store_data( ); + } + } +} \ No newline at end of file diff --git a/cheat/gmod/paint_traverse.cpp b/cheat/gmod/paint_traverse.cpp new file mode 100644 index 0000000..c3dd47e --- /dev/null +++ b/cheat/gmod/paint_traverse.cpp @@ -0,0 +1,28 @@ +#include "hooks.hpp" +#include "renderer.hpp" +#include "context.hpp" +#include "console.hpp" +#include "base_cheat.hpp" +#include "math.hpp" +#include "settings.hpp" + +void __fastcall hooks::paint_traverse( void* ecx_, void* edx_, unsigned int panel, bool force_repaint, bool allowforce ) { + static auto paint_traverse_o = g_gmod.m_panel->get_old_function< decltype( &hooks::paint_traverse ) >( 41 ); + if( g_gmod.m_panic ) return paint_traverse_o( ecx_, 0, panel, force_repaint, allowforce ); + + + static uint32_t mat_system_top_panel{ }; + if( !mat_system_top_panel ) { + auto panel_name = g_gmod.m_panel( )->GetName( panel ); + auto panel_hash = hash::fnv1a( panel_name ); + if( fnv( "MatSystemTopPanel" ) == panel_hash ) { + mat_system_top_panel = panel; + } + } + + if( panel && panel == mat_system_top_panel ) { + g_gmod.m_panel( )->SetMouseInputEnabled( panel, g_settings.menu.open ); + } + + return paint_traverse_o( ecx_, 0, panel, force_repaint, allowforce ); +} \ No newline at end of file diff --git a/cheat/gmod/pattern.hpp b/cheat/gmod/pattern.hpp new file mode 100644 index 0000000..0bc4b1b --- /dev/null +++ b/cheat/gmod/pattern.hpp @@ -0,0 +1,68 @@ +#pragma once + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#pragma warning ( disable : 4018 ) + +namespace pattern +{ + inline bool bin_match( uint8_t* code, uint8_t* pattern, size_t size ) { + for( size_t j = 0; j < size; j++ ) { + if( pattern[ j ] && code[ j ] != pattern[ j ] ) { + return false; + } + } + return true; + } + + template< typename t = uintptr_t > static t first_match( uintptr_t start, std::string sig, size_t len, std::ptrdiff_t offset = 0 ) { + std::istringstream iss( sig ); + std::vector< std::string > tokens{ std::istream_iterator< std::string >{ iss }, std::istream_iterator< std::string >{} }; + std::vector< uint8_t > sig_bytes; + + for( const auto& hex_byte : tokens ) { + sig_bytes.push_back( static_cast< uint8_t >( std::strtoul( hex_byte.c_str( ), nullptr, 16 ) ) ); + } + + if( sig_bytes.empty( ) || sig_bytes.size( ) < 2 ) { + return t{ }; + } + + auto sig_data = sig_bytes.data( ); + auto sig_size = sig_bytes.size( ); + + for( size_t i{ }; i < len; i++ ) { + uint8_t* code_ptr = reinterpret_cast< uint8_t* >( start + i ); + + if( bin_match( code_ptr, sig_data, sig_size ) ) { + return( ( t )( start + i + offset ) ); + } + } + + return t{ }; + } + + //ultimately the function you want to call to sigscan ( ida style ) + template< typename t = uintptr_t > static t first_code_match( HMODULE start, std::string sig, std::ptrdiff_t offset = 0 ) { + auto dos_hdr = reinterpret_cast< PIMAGE_DOS_HEADER >( start ); + + if( !dos_hdr ) return t{ }; + + //DOS header, verifies if module is valid + if( dos_hdr->e_magic != 0x5a4d ) { + return t{ }; + } + + auto nt_hdrs = reinterpret_cast< PIMAGE_NT_HEADERS >( reinterpret_cast< uintptr_t >( dos_hdr ) + dos_hdr->e_lfanew ); + + return first_match< t >( reinterpret_cast< uintptr_t >( dos_hdr ) + nt_hdrs->OptionalHeader.BaseOfCode, sig, nt_hdrs->OptionalHeader.SizeOfCode, offset ); + } +}; \ No newline at end of file diff --git a/cheat/gmod/play_sound.cpp b/cheat/gmod/play_sound.cpp new file mode 100644 index 0000000..7a701ad --- /dev/null +++ b/cheat/gmod/play_sound.cpp @@ -0,0 +1,25 @@ +#include "hooks.hpp" + +void __fastcall hooks::play_sound( void* ecx_, void*, const char* file ) { + static auto play_sound_o = g_csgo.m_surface->get_old_function< decltype( &play_sound ) >( 82 ); + static auto is_ready = pattern::first_code_match( g_csgo.m_chl.dll( ), xors( "55 8B EC 83 E4 F8 83 EC 08 56 8B 35 00 00 00 00 57 83 BE" ), 0 ); + static bool was_played = false; + static float played_tick = 0.f; + + play_sound_o( ecx_, 0, file ); + + if( !g_settings.misc.auto_accept || g_csgo.m_engine( )->IsInGame( ) ) { + was_played = false; + return; + } + + if( strstr( file, xors( "competitive_accept_beep.wav" ) ) && !was_played ) { + was_played = true; + played_tick = GetTickCount( ) * 0.001f + g_settings.misc.auto_accept_delay; + } + + if( was_played && GetTickCount( ) * 0.001f > played_tick ) { + reinterpret_cast< void( __cdecl* )( ) >( is_ready )( ); + was_played = false; + } +} \ No newline at end of file diff --git a/cheat/gmod/player_manager.cpp b/cheat/gmod/player_manager.cpp new file mode 100644 index 0000000..a531965 --- /dev/null +++ b/cheat/gmod/player_manager.cpp @@ -0,0 +1,38 @@ +#include "player_manager.hpp" +#include "base_cheat.hpp" +#include "context.hpp" + +namespace features +{ + void c_player_record::update( int ent_index ) { + auto ent = g_csgo.m_entlist( )->GetClientEntity< >( ent_index ); + if( !ent ) { clear( ); return; } + + if( ent != m_ent || ent->m_flSimulationTime( ) > g_csgo.m_globals->m_curtime + 1.f ) + clear( ); + + m_ent = ent; + if( !ent->is_valid( ) ) + return; + + update_simtime( ); + update_antiaim( ); + + update_cheater( ); + } + + bool c_player_manager::is_cheater( int ent_index ) { + return m_players[ ent_index ].is_cheater( ); + } + + void c_player_manager::frame_stage_notify( ) { + if( !g_ctx.m_local ) return; + + for( int i{ 1 }; i < 65; ++i ) { + if( i == g_csgo.m_engine( )->GetLocalPlayer( ) ) + continue; + + m_players[ i ].update( i ); + } + } +} \ No newline at end of file diff --git a/cheat/gmod/player_manager.hpp b/cheat/gmod/player_manager.hpp new file mode 100644 index 0000000..6a89b36 --- /dev/null +++ b/cheat/gmod/player_manager.hpp @@ -0,0 +1,67 @@ +#pragma once +#include "sdk.hpp" + +namespace features +{ + constexpr int CHEATER_SIMTIME_THRESHOLD = 10; + constexpr int CHEATER_AA_THRESHOLD = 50; + constexpr int CHEATER_MAX_DETECTIONS = 200; + + class c_player_record { + float m_last_simtime; + int m_simtime_detections; + int m_aa_detections; + bool m_is_cheater; + + c_base_player* m_ent; + + void clear( ) { + m_last_simtime = { }; + m_simtime_detections = { }; + m_aa_detections = { }; + m_is_cheater = { }; + m_ent = { }; + } + + void update_simtime( ) { + if( !m_ent ) return; + + if( m_ent->m_flSimulationTime( ) == m_last_simtime ) { + m_simtime_detections += 2; + } + else if( m_simtime_detections > 0 ) { + m_simtime_detections--; + } + m_last_simtime = m_ent->m_flSimulationTime( ); + } + + void update_antiaim( ) { + if( !m_ent ) return; + + auto pitch = m_ent->m_angEyeAngles( ).x; + if( pitch > 75.f && m_aa_detections < CHEATER_MAX_DETECTIONS ) { + m_aa_detections++; + } + else if( m_aa_detections > 0 ) { + m_aa_detections--; + } + } + + void update_cheater( ) { + m_is_cheater = m_simtime_detections > CHEATER_SIMTIME_THRESHOLD + || m_aa_detections > CHEATER_AA_THRESHOLD; + } + + public: + c_player_record( ) { clear( ); } + bool is_cheater( ) const { return m_is_cheater; } + void update( int ent_index ); + }; + + class c_player_manager { + std::array< c_player_record, 65 > m_players; + public: + void frame_stage_notify( ); + bool is_cheater( int ent_index ); + }; +} \ No newline at end of file diff --git a/cheat/gmod/playerlist.cpp b/cheat/gmod/playerlist.cpp new file mode 100644 index 0000000..10f7d82 --- /dev/null +++ b/cheat/gmod/playerlist.cpp @@ -0,0 +1,114 @@ +#include "playerlist.hpp" + +/* something in here caused the file size to increase alot lol */ + +namespace features +{ + + bool c_player_list::is_friend( const std::string& guid ) { + return m_friends[ guid ]; // if a guid is not there, then it is automatically set to false + } + + // handles players and drawing. + void c_player_list::operator()( ) { + if( g_gmod.m_engine( )->IsInGame( ) ) { + g_gmod.m_engine( )->GetScreenSize( m_scrw, m_scrh ); + + m_x = 50; + m_y = 50; + m_w = m_scrw - 100; + m_h = m_scrh - 100; + + m_tabwidth = m_w / 3; + + m_tab = 0; + m_items.clear( ); + + player_info_t info; + + for( int i{ 1 }; i <= g_gmod.m_globals->m_maxclients; ++i ) { + if( i == g_gmod.m_engine( )->GetLocalPlayer( ) ) + continue; + + auto player = g_gmod.m_entlist( )->GetClientEntity< >( i ); + if( !player ) + continue; + + if( !g_gmod.m_engine( )->GetPlayerInfo( i, &info ) ) + continue; + + m_items.push_back( playeritem_t( info.name, &m_friends[ info.m_steamid ] ) ); + } + + // sort first character alphabetically. + std::sort( m_items.begin( ), m_items.end( ), []( const auto& lhs, const auto& rhs ) { + return lhs.m_name[ 0 ] < rhs.m_name[ 0 ]; + } ); + + + if( m_open ) { + int i = 0; + int j = 0; + + // get d3d font info. + TEXTMETRICA metric{ }; + d3d::fonts.f_esp_small->GetTextMetricsA( &metric ); + + // construct size of list and how much to draw. + const int font_size = metric.tmHeight; + const int list_height = m_items.size( ) * font_size; + const int tabs_to_draw = std::min< int >( ( int )std::ceil( ( float )list_height / ( float )m_h ), 3 ); // template arg to stop the min define taking action + + // pixel padding. + const int m_pad_y = 2; + const int m_pad_x = 5; + + // draw blue background. + g_d3d.draw_filled_rect( ui::ui_get_bg_col( ), m_x, m_y, m_tabwidth * tabs_to_draw, m_h ); + + // for each player add to list. + for( const auto& item : m_items ) { + int str_pos_x{ }; + int str_pos_y = m_y + font_size * i + m_pad_y; + + if( str_pos_y > m_y + m_h ) { + i = 0; + m_tab++; + + str_pos_y = m_y + font_size * i + m_pad_y; + } + + str_pos_x = m_x + m_tabwidth * m_tab + m_pad_x; + + m_tab = std::min< int >( m_tab, tabs_to_draw ); + + // draw rectangle per element. + g_d3d.draw_rect( clr_t( 0, 0, 0 ), m_x + m_tabwidth * m_tab + 1, m_y + font_size * i, m_tabwidth - 2, font_size ); + + // if selected index is this current index, do special stuff. + if( m_index == j ) { + g_d3d.draw_filled_rect( clr_t( 200, 200, 200 ), m_x + m_tabwidth * m_tab + 1, m_y + font_size * i + 1, m_tabwidth - 1, font_size - 1 ); + + g_d3d.draw_text< ALIGN_LEFT >( d3d::fonts.f_esp_small, clr_t( 255, 255, 255 ), str_pos_x + 10, str_pos_y - 2 , D3DFONTFLAG_DROPSHADOW, item.m_name ); + g_d3d.draw_text< ALIGN_RIGHT >( d3d::fonts.f_esp_small, clr_t( 255, 255, 255 ), m_x + m_tabwidth * ( m_tab + 1 ) - 5, str_pos_y - 2, D3DFONTFLAG_DROPSHADOW, *item.m_friend ? "true" : "false" ); + + } + else { + g_d3d.draw_text< ALIGN_LEFT >( d3d::fonts.f_esp_small, clr_t( 255, 255, 255 ), str_pos_x, str_pos_y - 2, D3DFONTFLAG_DROPSHADOW, item.m_name ); + g_d3d.draw_text< ALIGN_RIGHT >( d3d::fonts.f_esp_small, clr_t( 255, 255, 255 ), m_x + m_tabwidth * ( m_tab + 1 ) - 5, str_pos_y - 2, D3DFONTFLAG_DROPSHADOW, *item.m_friend ? "true" : "false" ); + } + + i++; + j++; + } + + + // draw pink outlines per tab. + for( uint8_t k = 0; k < ( uint8_t )tabs_to_draw; k++ ) { + g_d3d.draw_rect( ui::ui_get_accent_col( ), m_x + m_tabwidth * k, m_y, m_tabwidth, m_h ); + } + + } + } + } +} \ No newline at end of file diff --git a/cheat/gmod/playerlist.hpp b/cheat/gmod/playerlist.hpp new file mode 100644 index 0000000..56eac50 --- /dev/null +++ b/cheat/gmod/playerlist.hpp @@ -0,0 +1,54 @@ +#pragma once + +#include "context.hpp" +#include "d3d.hpp" +#include "interface.hpp" +#include "ui_draw.h" + +#include +#include + +NAMESPACE_REGION( features ) + +class c_player_list +{ + struct playeritem_t + { + playeritem_t( ) = default; + playeritem_t( char* name, bool* friends ) { + strcpy( m_name, name ); + m_friend = friends; + } + + char m_name[ 32 ]{ }; + bool* m_friend{ }; + }; + + bool m_open; + int m_x, m_y, m_w, m_h; + int m_tabwidth; + int m_tab; + int m_scrw, m_scrh; + int m_index; + + std::vector< playeritem_t > m_items; + std::map< std::string, bool > m_friends; +public: + inline bool& is_open( ) { + return m_open; + } + + inline int& get_index( ) { + return m_index; + } + + inline auto get_list( ) { + return m_items; + } + + bool is_friend( const std::string& guid ); + + void operator()( ); +}; + +END_REGION \ No newline at end of file diff --git a/cheat/gmod/prediction.cpp b/cheat/gmod/prediction.cpp new file mode 100644 index 0000000..ebfea5b --- /dev/null +++ b/cheat/gmod/prediction.cpp @@ -0,0 +1,111 @@ +#include "prediction.hpp" +#include "hooks.hpp" +#include "context.hpp" + +NAMESPACE_REGION( features ) + +void c_prediction::predict_player( c_base_player* player ) { + static uintptr_t run_command_address = g_gmod.m_prediction->get_old_function< uintptr_t >( 17 ); + static uintptr_t set_prediction_random_seed_address = ( run_command_address + 0x21 + 4 + *( uintptr_t* )( run_command_address + 0x21 ) ); + + + CMoveData move_data{ }; + auto ce = player->ce( ); + + float old_curtime = g_gmod.m_globals->m_curtime; + float old_frametime = g_gmod.m_globals->m_frametime; + + int backup_tickbase = player->m_nTickBase( ); + int backup_simtime = player->m_flSimulationTime( ); + + + //random seed is already being calculated and set in createmove + **( uintptr_t** )( set_prediction_random_seed_address + 0xC ) = g_ctx.get_last_cmd( )->m_random_seed; //prediction seed + **( uintptr_t** )( run_command_address + 0x2F ) = uintptr_t( g_ctx.m_local ); //prediction player + + //start prediction + g_gmod.m_game_movement( )->StartTrackPredictionErrors( ce ); + + //run prediction + g_gmod.m_prediction( )->SetupMove( ce, *player->get< user_cmd_t** >( 0x24B0 ), g_gmod.m_move_helper( ), &move_data ); + g_gmod.m_game_movement( )->ProcessMovement( ce, &move_data ); + g_gmod.m_prediction( )->FinishMove( ce, *player->get< user_cmd_t** >( 0x24B0 ), &move_data ); + + //finish prediction + g_gmod.m_game_movement( )->FinishTrackPredictionErrors( ce ); + + **( uintptr_t** )( set_prediction_random_seed_address + 0xC ) = 0xffffffff; + **( uintptr_t*** )( run_command_address + 0x2F ) = nullptr; + + player->m_nTickBase( ) = backup_tickbase; + player->m_flSimulationTime( ) = backup_simtime; + + g_gmod.m_globals->m_curtime = old_curtime; + g_gmod.m_globals->m_frametime = old_frametime; +} + +void c_prediction::run( user_cmd_t* ucmd ) { + if ( !ucmd || !g_ctx.m_local || !g_ctx.m_local->is_alive( ) ) + return; + + static uintptr_t run_command_address = g_gmod.m_prediction->get_old_function< uintptr_t >( 17 ); + static uintptr_t relative_call_addr = run_command_address + 0x21; + static uintptr_t set_prediction_random_seed_address = ( relative_call_addr + 4 + *( uintptr_t* )( relative_call_addr ) ); + + static auto sv_footsteps = g_gmod.m_cvar( )->FindVar( "sv_footsteps" ); + + CMoveData move_data{ }; + IClientEntity* local_ent = g_ctx.m_local->ce( ); + + //backup data + int old_buttons = ucmd->m_buttons; + float old_curtime = g_gmod.m_globals->m_curtime; + float old_frame_time = g_gmod.m_globals->m_frametime; + int old_tickbase = g_ctx.m_local->m_nTickBase( ); + int old_flags = g_ctx.m_local->m_fFlags( ); + MoveType_t old_move_type = g_ctx.m_local->m_nMoveType( ); + vec3_t old_velocity = g_ctx.m_local->m_vecVelocity( ); + int old_sv_flags = sv_footsteps->m_flags; + + sv_footsteps->m_flags = 0; + sv_footsteps->m_nvalue = 0; + + //set globals + g_gmod.m_globals->m_curtime = g_gmod.m_globals->m_interval_per_tick * old_tickbase; + g_gmod.m_globals->m_frametime = g_gmod.m_globals->m_interval_per_tick; + + //random seed is already being calculated and set in createmove + **( uintptr_t** )( set_prediction_random_seed_address + 0xC ) = ucmd->m_random_seed; //prediction seed + **( uintptr_t** )( run_command_address + 0x2F ) = uintptr_t( g_ctx.m_local ); //prediction player + + //start prediction + g_gmod.m_game_movement( )->StartTrackPredictionErrors( local_ent ); + + //run prediction + g_gmod.m_prediction( )->SetupMove( local_ent, ucmd, nullptr, &move_data ); + g_gmod.m_game_movement( )->ProcessMovement( local_ent, &move_data ); + g_gmod.m_prediction( )->FinishMove( local_ent, ucmd, &move_data ); + + //finish prediction + g_gmod.m_game_movement( )->FinishTrackPredictionErrors( local_ent ); + + **( uintptr_t** )( set_prediction_random_seed_address + 0xC ) = 0xffffffff; + **( uintptr_t*** )( run_command_address + 0x2F ) = nullptr; + + //good to have, can be used for edge jump and such + m_predicted_flags = g_ctx.m_local->m_fFlags( ); + + //restore + ucmd->m_buttons = old_buttons; + g_gmod.m_globals->m_curtime = old_curtime; + g_gmod.m_globals->m_frametime = old_frame_time; + g_ctx.m_local->m_nTickBase( ) = old_tickbase; + g_ctx.m_local->m_fFlags( ) = old_flags; + g_ctx.m_local->m_nMoveType( ) = old_move_type; + g_ctx.m_local->m_vecVelocity( ) = old_velocity; + + sv_footsteps->m_nvalue = 1; + sv_footsteps->m_flags = old_sv_flags; +} + +END_REGION \ No newline at end of file diff --git a/cheat/gmod/prediction.hpp b/cheat/gmod/prediction.hpp new file mode 100644 index 0000000..ca0fb93 --- /dev/null +++ b/cheat/gmod/prediction.hpp @@ -0,0 +1,27 @@ +#pragma once +#include "util.hpp" + +class user_cmd_t; +class c_base_player; + +NAMESPACE_REGION( features ) + +class c_prediction { + user_cmd_t* m_ucmd{ }; + int m_predicted_flags{ }; + + void run( user_cmd_t* ucmd ); +public: + void operator()( user_cmd_t* ucmd ) { + m_ucmd = ucmd; + run( m_ucmd ); + } + + int get_predicted_flags( ) const { + return m_predicted_flags; + } + + void predict_player( c_base_player* player ); +}; + +END_REGION \ No newline at end of file diff --git a/cheat/gmod/proxies.cpp b/cheat/gmod/proxies.cpp new file mode 100644 index 0000000..200a370 --- /dev/null +++ b/cheat/gmod/proxies.cpp @@ -0,0 +1,43 @@ +#include "hooks.hpp" +#include "context.hpp" +#include "base_cheat.hpp" + +void __cdecl hooks::lby_proxy_fn( const CRecvProxyData* proxy_data_const, void* entity, void* output ) { + lby_proxy.get_old_function( )( proxy_data_const, entity, output ); + + if( !g_csgo.m_panic ) { + auto player = ( c_base_player* )( entity ); + if( player && player == g_ctx.m_local ) { + g_cheat.m_ragebot.m_antiaim->on_lby_proxy( ); + } + } +} + +void __cdecl hooks::last_shot_proxy_fn( const CRecvProxyData* proxy_data_const, void* entity, void* output ) { + last_shot_proxy.get_old_function( )( proxy_data_const, entity, output ); + + if( !g_csgo.m_panic && proxy_data_const ) { + auto wep = ( c_base_weapon* )( entity ); + if( wep ) { + auto owner = g_csgo.m_entlist( )->GetClientEntityFromHandle( wep->m_hOwner( ) ); + if( owner && owner->is_valid( ) ) { + + auto records = g_cheat.m_ragebot.m_lagcomp->get_records( owner->ce( )->GetIndex( ), RECORD_NORMAL ); + if( records && records->size( ) ) { + for( auto& it : *records ) { + float sim = it.m_flSimulationTime; + if( sim == wep->get< float >( 0x3314 ) ) { + it.m_tickcount -= it.m_choked; + auto ang = math::vector_angles( owner->get_hitbox_pos( 0 ), g_ctx.m_local->get_eye_pos( ) ); + //g_con->log( "found shot record for %d: %f angles: %f %f", owner->ce( )->GetIndex( ), sim, it.m_vecAngles.x, it.m_vecAngles.y ); + + it.m_vecAngles = it.m_vecRenderAngles = ang; + it.m_vecAbsAngles.y = ang.y; + break; + } + } + } + } + } + } +} \ No newline at end of file diff --git a/cheat/gmod/ragebot_antiaim.cpp b/cheat/gmod/ragebot_antiaim.cpp new file mode 100644 index 0000000..1cb9af9 --- /dev/null +++ b/cheat/gmod/ragebot_antiaim.cpp @@ -0,0 +1,750 @@ +#include "ragebot.hpp" +#include "base_cheat.hpp" +#include "context.hpp" +#include "math.hpp" +#include "input_system.hpp" + +namespace features +{ + void c_ragebot::c_lby_breaker::update_animstate( ) { + static bool valid = false; + static float last_spawn = 0.f; + static float last_update = 0.f; + if( !g_ctx.run_frame( ) || !g_ctx.m_local->is_valid( ) ) { + if( m_animstate ) { + g_csgo.m_alloc->Free( m_animstate ); + m_animstate = nullptr; + } + valid = false; + return; + } + + if( m_animstate && ( m_animstate->pBaseEntity != g_ctx.m_local || g_ctx.m_local->m_flSpawnTime( ) != last_spawn ) ) { + last_spawn = g_ctx.m_local->m_flSpawnTime( ); + g_csgo.m_alloc->Free( m_animstate ); + m_animstate = nullptr; + valid = false; + } + + if( !m_animstate ) { + m_animstate = ( CCSGOPlayerAnimState* )g_csgo.m_alloc->Alloc( sizeof( CCSGOPlayerAnimState ) ); + } + + if( !valid && m_animstate ) { + g_ctx.m_local->create_animstate( m_animstate ); + valid = true; + } + else if( valid && m_animstate && !g_cheat.m_lagmgr.get_choked( ) ) { + static float time_delta = g_csgo.m_globals->m_curtime - last_update; + if( std::abs( time_delta ) > g_csgo.m_globals->m_interval_per_tick ) { + vec3_t angles = g_ctx.m_last_realangle; + + C_AnimationLayer anim_backup[ 13 ]; + float param_backup[ 24 ]; + + memcpy( anim_backup, g_ctx.m_local->m_AnimOverlay( ).GetElements( ), sizeof( anim_backup ) ); + memcpy( param_backup, g_ctx.m_local->m_flPoseParameter( ), sizeof( param_backup ) ); + + m_animstate->update( angles.y, angles.x ); + m_animstate->m_flFeetSpeedForwardsOrSideWays = std::clamp( m_animstate->m_flFeetSpeedForwardsOrSideWays, 0.f, 2.f ); + m_animstate->m_flFeetSpeedUnknownForwardOrSideways = std::clamp( m_animstate->m_flFeetSpeedUnknownForwardOrSideways, 0.f, 3.f ); + + memcpy( g_ctx.m_local->m_AnimOverlay( ).GetElements( ), anim_backup, sizeof( anim_backup ) ); + memcpy( g_ctx.m_local->m_flPoseParameter( ), param_backup, sizeof( param_backup ) ); + + last_update = g_csgo.m_globals->m_curtime; + } + } + + bool moving = m_animstate->m_velocity > 0.1f && g_ctx.m_local->m_fFlags( ) & FL_ONGROUND; + if( g_cheat.m_ragebot.m_antiaim->is_fakewalking( ) ) moving = false; + + static bool was_moving = moving; + float time = g_ctx.pred_time( ); + + float lby = g_ctx.m_local->m_flLowerBodyYawTarget( ); + float real = g_ctx.m_last_realangle.y; + + if( moving ) { + m_next_update = time + 0.22f; + m_state = BS_MOVING; + } + else if( time >= m_next_update ) { + //idk + float latency = g_csgo.m_globals->m_interval_per_tick; + + m_next_update = time + ( was_moving ? 0.22f : 1.1f ) + latency; + + m_state = was_moving ? BS_WAS_MOVING : BS_BREAKING; + } + + was_moving = moving; + + if( g_ctx.m_tickbase > 0 ) { + auto& cur_update = m_lby_updates[ g_ctx.m_tickbase % 64 ]; + cur_update.m_tickbase = g_ctx.m_tickbase; + cur_update.m_state = m_state; + } + } + + void c_ragebot::c_lby_breaker::on_lby_proxy( ) { + float oldsimtime_1tickfuture = g_ctx.m_local->m_flOldSimulationTime( ) + TICK_INTERVAL( ); + int oldsimtime_ticks = TIME_TO_TICKS( oldsimtime_1tickfuture ); + + float latency = g_csgo.m_engine( )->GetNetChannelInfo( )->GetLatency( 0 ) + g_csgo.m_globals->m_interval_per_tick; + for( auto& it : m_lby_updates ) { + if( it.m_tickbase == oldsimtime_ticks ) + if( it.m_state == BS_WAS_MOVING ) { + //m_next_update = oldsimtime_1tickfuture + 0.22f - latency; + + if( it.m_state == BS_BREAKING ) + m_next_update = oldsimtime_1tickfuture + 1.1f - latency; + + break; + } + } + } + + int c_ragebot::c_lby_breaker::get_next_update( ) const { + auto current_tick = TIME_TO_TICKS( g_ctx.pred_time( ) ); + auto update_tick = TIME_TO_TICKS( m_next_update ); + + return update_tick - current_tick; + } + + void c_ragebot::c_lby_breaker::override_angles( float* angles, float original, float offset ) { + const float angle = original; + int update_ticks = get_next_update( ); + + if( g_cheat.m_lagmgr.get_state( ) ) + return; + + //yep + if( !( g_ctx.m_local->m_fFlags( ) & FL_ONGROUND ) ) + return; + + float break_angle = angle - offset; + + float lby = g_ctx.m_local->m_flLowerBodyYawTarget( ); + float real = angle; + float delta = std::remainderf( lby - real, 360.f ); + + if( std::abs( delta ) < 37.f && get_state( ) == BS_BREAKING ) { + if( update_ticks < -TIME_TO_TICKS( 1.f ) ) { + *angles = break_angle; + return; + } + } + + if( update_ticks < -1 ) + return; + + if( ( get_state( ) == BS_WAS_MOVING || g_cheat.m_ragebot.m_antiaim->is_fakewalking( ) ) + && update_ticks >= 1 && offset < 140.f ) { + *angles = angle + 140.f - offset; + } + + if( /*get_state( ) > BS_MOVING &&*/ update_ticks < 1 || + get_state( ) == BS_WAS_MOVING && update_ticks < 3 ) { + *angles = break_angle; + } + + g_ctx.m_thirdperson_angle.y = *angles; + } + + void c_ragebot::c_antiaim::fix_movement( ) { + auto last_cmd = g_ctx.get_last_cmd( ); + auto old_yaw = last_cmd->m_viewangles.y; + auto cur_yaw = m_cmd->m_viewangles.y; + + float yaw_delta = cur_yaw - old_yaw; + + float f1 = old_yaw < 0.f ? old_yaw + 360.f : old_yaw; + float f2 = cur_yaw < 0.f ? cur_yaw + 360.f : cur_yaw; + + if( f2 < f1 ) + yaw_delta = abs( f2 - f1 ); + else + yaw_delta = 360.f - abs( f1 - f2 ); + yaw_delta = 360.f - yaw_delta; + + m_cmd->m_forwardmove = cos( yaw_delta * M_PIRAD ) * last_cmd->m_forwardmove + cos( ( yaw_delta + 90.f ) * M_PIRAD ) * last_cmd->m_sidemove; + m_cmd->m_sidemove = sin( yaw_delta * M_PIRAD ) * last_cmd->m_forwardmove + sin( ( yaw_delta + 90.f ) * M_PIRAD ) * last_cmd->m_sidemove; + + if( g_ctx.m_local->m_nMoveType( ) != MOVETYPE_LADDER ) { + if( m_cmd->m_forwardmove ) { + m_cmd->m_buttons &= ~( m_cmd->m_forwardmove < 0 ? IN_FORWARD : IN_BACK ); + m_cmd->m_buttons |= ( m_cmd->m_forwardmove > 0 ? IN_FORWARD : IN_BACK ); + } + if( m_cmd->m_sidemove ) { + m_cmd->m_buttons &= ~( m_cmd->m_sidemove < 0 ? IN_MOVERIGHT : IN_MOVELEFT ); + m_cmd->m_buttons |= ( m_cmd->m_sidemove > 0 ? IN_MOVERIGHT : IN_MOVELEFT ); + } + } + } + + float get_damage( const vec3_t& start, const vec3_t& end, c_base_player* a, c_base_player* b ) { + static weapon_info_t wpn_data{ }; + wpn_data.damage = 200; + wpn_data.range_modifier = 1.0f; + wpn_data.penetration = 3.0f; + wpn_data.armor_ratio = 0.5f; + wpn_data.range = 8192.f; + + fire_bullet_data_t data{ }; + data.src = start; + data.filter.pSkip = a; + data.length_to_end = ( end - start ).length( ); + + vec3_t angle = math::vector_angles( start, end ); + data.direction = math::angle_vectors( angle ); + + data.direction.normalize_vector( ); + + if( g_cheat.m_autowall.fire_bullet( a, b, &wpn_data, data, false, false ) ) { + return data.current_damage; + } + + return -1.f; + } + + bool is_visible( const vec3_t& start, const vec3_t& end, void* skip ) { + CTraceFilter filter; + CGameTrace tr; + Ray_t ray; + + filter.pSkip = skip; + ray.Init( start, end ); + + g_csgo.m_trace( )->TraceRay( ray, MASK_SHOT, &filter, &tr ); + + return tr.fraction >= 0.98f; + } + + bool c_ragebot::c_antiaim::run_edge_dtc( ) { + if( !g_settings.rage.edge_dtc_normal ) + return false; + + if( !( g_ctx.m_local->m_fFlags( ) & FL_ONGROUND ) ) + return false; + + if( g_settings.rage.edge_dtc_normal == 1 ) { + float speed = g_ctx.m_local->m_vecVelocity( ).length2d( ); + if( speed < 30.f ) return false; + } + + bool peeking = g_ctx.m_local->m_vecVelocity( ).length( ) > 30.f; + if( is_fakewalking( ) ) peeking = false; + CTraceFilterWorldAndPropsOnly filter; + + float max_dist = peeking ? g_settings.rage.edge_dtc_moving : g_settings.rage.edge_dtc_standing; + float min_dist = 64.f; + float edge_yaw = 0.f; + float final_yaw = 0.f; + bool detected = false; + + const float step = 45.f; + vec3_t eye_pos = g_ctx.m_local->get_eye_pos( ); + + for( float rot = -180.f; rot < 180.f; rot += step ) { + float rot_left = rot - 90.f; + float rot_right = rot + 90.f; + + vec3_t pos_left = math::get_rotated_pos( eye_pos, rot_left, 30.f ); + vec3_t pos_right = math::get_rotated_pos( eye_pos, rot_right, 30.f ); + + vec3_t forward = math::angle_vectors( vec3_t( 0.f, rot, 0.f ) ); + forward *= 4000.f; + + CGameTrace trace_left, trace_right; + Ray_t ray_left, ray_right; + + ray_left.Init( pos_left, pos_left + forward ); + ray_right.Init( pos_right, pos_right + forward ); + + g_csgo.m_trace( )->TraceRay( ray_left, MASK_SHOT_HULL, &filter, &trace_left ); + g_csgo.m_trace( )->TraceRay( ray_right, MASK_SHOT_HULL, &filter, &trace_right ); + + float dist_left = ( pos_left - trace_left.endpos ).length( ); + float dist_right = ( pos_right - trace_right.endpos ).length( ); + + if( dist_right > dist_left ) { + if( dist_right > max_dist && dist_left < min_dist ) { + max_dist = dist_right; + edge_yaw = rot_left; + detected = true; + } + } + else { + if( dist_left > max_dist && dist_right < min_dist ) { + max_dist = dist_left; + edge_yaw = rot_right; + detected = true; + } + } + } + + if( !detected ) + return false; + + final_yaw = edge_yaw; + if( g_cheat.m_lagmgr.get_state( ) ) { + final_yaw = edge_yaw + 180.f; + } + + int state = m_breaker.get_state( ); + int ticks = m_breaker.get_next_update( ); + switch( g_settings.rage.edge_dtc_type( ) ) { + case 0: { + break; + } + case 1: { + m_breaker.override_angles( &final_yaw, edge_yaw, 110.f ); + m_cmd->m_viewangles.y = final_yaw; + return true; + } + case 2: { + m_breaker.override_angles( &final_yaw, edge_yaw, 180.f ); + m_cmd->m_viewangles.y = final_yaw; + return true; + } + default: + break; + } + + m_cmd->m_viewangles.y = final_yaw; + return true; + } + + bool c_ragebot::c_antiaim::run_freestanding( ) { + if( !g_settings.rage.edge_detection ) + return false; + + bool is_fake = g_cheat.m_lagmgr.get_state( ); + vec3_t enemy_pos; + vec3_t local_pos; + + vec3_t aim_angle; + vec3_t final_angle; + vec3_t final_enemy_pos; + vec3_t final_local_pos; + + float cur_damage{ 30.f }; + bool direction{ false }; + int enemy_index; + + enemy_index = util::get_closest_player( ); + + if( enemy_index == -1 ) + return false; + + auto ent = g_csgo.m_entlist( )->GetClientEntity< >( enemy_index ); + + enemy_pos = ent->m_vecOrigin( ); + enemy_pos.z = ent->get_hitbox_pos( 0 ).z; + + local_pos = g_ctx.m_local->get_eye_pos( ); + + aim_angle = math::vector_angles( enemy_pos, local_pos ); + + for( int step_local = 1; step_local <= 4; ++step_local ) { + float offset = step_local * 20.f; + + vec3_t local_left = math::get_rotated_pos( local_pos, aim_angle.y + 90.f, -offset ); + vec3_t local_right = math::get_rotated_pos( local_pos, aim_angle.y + 90.f, offset ); + + bool visible_left = is_visible( local_pos, local_left, g_ctx.m_local ); + bool visible_right = is_visible( local_pos, local_right, g_ctx.m_local ); + + if( !visible_left && !visible_right ) break; + + const float enemy_offset = 60.f; + + vec3_t enemy_left = math::get_rotated_pos( enemy_pos, aim_angle.y + 90.f, enemy_offset ); + vec3_t enemy_right = math::get_rotated_pos( enemy_pos, aim_angle.y + 90.f, -enemy_offset ); + + CTraceFilter filter; + CGameTrace tr_right; + CGameTrace tr_left; + Ray_t ray; + + filter.pSkip = ent; + ray.Init( enemy_pos, enemy_left ); + g_csgo.m_trace( )->TraceRay( ray, MASK_SHOT, &filter, &tr_left ); + ray.Init( enemy_pos, enemy_right ); + g_csgo.m_trace( )->TraceRay( ray, MASK_SHOT, &filter, &tr_right ); + + enemy_left = tr_left.endpos; + enemy_right = tr_right.endpos; + + auto update_damage = [ & ]( const vec3_t& position, bool dir, bool center ) { + if( is_visible( enemy_pos, position, ent ) || center ) { + float dmg_left{ }; + float dmg_right{ }; + + if( visible_left ) { + dmg_left = get_damage( position, local_left, ent, g_ctx.m_local ); + } + + if( visible_right ) { + dmg_right = get_damage( position, local_right, ent, g_ctx.m_local ); + } + + if( step_local == 1 ) { + float delta = std::abs( dmg_left - dmg_right ); + if( delta < 35.f && dmg_left > 30.f && dmg_right > 30.f ) { + return false; + } + } + + float max_dmg = std::max< float >( dmg_left, dmg_right ); + vec3_t end_pos = dmg_left > dmg_right ? local_left : local_right; + bool new_dir = dmg_left > dmg_right; + + + //add a bit of tolerance + if( max_dmg > cur_damage + 10.f ) { + final_enemy_pos = position; + final_local_pos = end_pos; + cur_damage = max_dmg; + direction = new_dir; + } + } + + return true; + }; + + if( !update_damage( enemy_pos, true, true ) ) + return false; + + update_damage( enemy_left, true, false ); + update_damage( enemy_right, false, false ); + } + + + if( cur_damage > 50.f ) { + auto angle = math::vector_angles( final_local_pos, final_enemy_pos ); + + m_direction = direction; + angle.y += direction ? -90.f : 90.f; + angle.y = math::find_closest_step( angle.y, 30.f ); + + if( g_settings.rage.pitch == 3 && g_settings.rage.edge_detection > 1 && m_breaker.get_next_update( ) < 2 ) { + vec3_t eye_pos = g_ctx.m_local->get_eye_pos( ); + vec3_t rotated_pos = math::get_rotated_pos( eye_pos, angle.y - 180.f, 25.f ); + + vec3_t velocity = g_ctx.m_local->m_vecVelocity( ); + + vec3_t middle_pos = eye_pos + velocity * TICK_INTERVAL( ) * 2.f; + middle_pos.z += 10.f; + + int dmg_rot = get_damage( final_enemy_pos, rotated_pos, ent, g_ctx.m_local ); + int dmg_mid = get_damage( final_enemy_pos, middle_pos, ent, g_ctx.m_local ); + + if( dmg_mid < dmg_rot && ( dmg_mid < 100 || velocity.length2d( ) < 0.1f ) ) { + m_cmd->m_viewangles.x = 0.f; + } + } + + if( is_fake ) { + int jitter = g_settings.rage.edge_dtc_jitter; + if( jitter ) { + angle.y += math::random_number< float >( -jitter, jitter ); + } + angle.y -= 180.f; + } + else { + switch( g_settings.rage.edge_detection( ) ) { + case 2: + m_breaker.override_angles( &angle.y, angle.y, 110.f ); + break; + case 3: + m_breaker.override_angles( &angle.y, angle.y, 180.f ); + break; + } + } + + m_cmd->m_viewangles.y = angle.clamp( ).y; + return true; + } + + return false; + } + + void c_ragebot::c_antiaim::run_fakewalk( ) { + m_is_fakewalking = false; + bool in_move = !( m_cmd->m_buttons & IN_FORWARD ) && !( m_cmd->m_buttons & IN_BACK ) && !( m_cmd->m_buttons & IN_LEFT ) && !( m_cmd->m_buttons & IN_RIGHT ); + + if( !m_cmd->m_sidemove && !m_cmd->m_forwardmove && !g_ctx.m_local->m_vecVelocity( ) && !in_move ) + return; + + if( !( g_ctx.m_local->m_fFlags( ) & FL_ONGROUND ) ) + return; + + if( m_cmd->m_buttons & IN_WALK ) { + m_cmd->m_buttons &= ~IN_WALK; + } + + m_is_fakewalking = true; + + auto velocity = g_ctx.m_local->m_vecVelocity( ); + + static auto predict_velocity = [ ]( vec3_t* velocity ) { + static auto sv_friction = g_csgo.m_cvar( )->FindVar( xors( "sv_friction" ) ); + static auto sv_stopspeed = g_csgo.m_cvar( )->FindVar( xors( "sv_stopspeed" ) ); + + float speed = velocity->length( ); + if( speed >= 0.1f ) { + float friction = sv_friction->get_float( ); + float stop_speed = std::max< float >( speed, sv_stopspeed->get_float( ) ); + float time = std::max< float >( g_csgo.m_globals->m_interval_per_tick, g_csgo.m_globals->m_frametime ); + *velocity *= std::max< float >( 0.f, speed - friction * stop_speed * time / speed ); + } + }; + + static auto quick_stop = [ & ]( ) { + vec3_t vel = g_ctx.m_local->m_vecVelocity( ); + float speed = vel.length2d( ); + if( speed > 13.f ) { + vec3_t direction = math::vector_angles( { 0.f, 0.f, 0.f }, vel ); + direction.y = g_ctx.get_last_cmd( )->m_viewangles.y - direction.y; + + vec3_t new_move = math::angle_vectors( direction ); + new_move *= -450.f; + + g_ctx.get_last_cmd( )->m_forwardmove = new_move.x; + g_ctx.get_last_cmd( )->m_sidemove = new_move.y; + } + else { + g_ctx.get_last_cmd( )->m_forwardmove = 0.f; + g_ctx.get_last_cmd( )->m_sidemove = 0.f; + } + }; + + //check how many ticks before LBY update comes in + int ticks_to_update = m_breaker.get_next_update( ) - 1; + + int ticks_to_stop; + for( ticks_to_stop = 0; ticks_to_stop < 15; ++ticks_to_stop ) { + if( velocity.length2d( ) < 0.1f ) + break; + + predict_velocity( &velocity ); + } + + const int max_ticks = std::min< int >( g_settings.rage.fakewalk_ticks, ticks_to_update ); + const int choked = g_cheat.m_lagmgr.get_choked( ); + int ticks_left = max_ticks - choked; + + if( choked < max_ticks || ticks_to_stop ) { + g_cheat.m_lagmgr.set_state( false ); + } + + if( !ticks_to_stop && !g_ctx.m_local->m_vecVelocity( ).length2d( ) && !g_cheat.m_lagmgr.get_sent( ) + && choked > max_ticks ) { + g_cheat.m_lagmgr.set_state( true ); + } + + if( ticks_to_stop > ticks_left || !choked || g_cheat.m_lagmgr.get_state( ) ) { + quick_stop( ); + } + } + + float c_ragebot::c_antiaim::get_pitch( ) { + switch( g_settings.rage.pitch( ) ) { + case 1: //custom + return float( g_settings.rage.pitch_offset( ) ); + case 2: //flip + return g_cheat.m_lagmgr.get_state( ) ? 75.f : 89.f; + case 3: + return 89.f; + case 4: //random + return math::random_number( -89.f, 89.f ); + } + + return 0.f; + } + + float c_ragebot::c_antiaim::get_yaw( bool fake, float original, bool no_jitter ) { + constexpr static double rate = 360.0 / 1.618033988749895; + constexpr static int switch_rate = 10; + static float last_onground = 0.f; + static int ticks = 0; + static bool side_switch = false; + bool on_ground = false; + + int setting = fake ? g_settings.rage.fake_yaw : g_settings.rage.real_yaw; + int jitter = fake ? g_settings.rage.fake_yaw_jitter : g_settings.rage.real_yaw_jitter; + int add = fake ? g_settings.rage.fake_yaw_add : g_settings.rage.real_yaw_add; + if( g_ctx.m_local->m_vecVelocity( ).length( ) > 0.1f && !is_fakewalking( ) ) { + if( fake && g_settings.rage.fake_yaw_moving( ) ) { + setting = g_settings.rage.fake_yaw_moving( ); + jitter = g_settings.rage.fake_moving_jitter( ); + add = g_settings.rage.fake_yaw_moving_add( ); + } + else if( g_settings.rage.real_yaw_moving( ) ) { + setting = g_settings.rage.real_yaw_moving( ); + jitter = g_settings.rage.real_moving_jitter( ); + add = g_settings.rage.real_yaw_moving_add( ); + } + } + + if( g_ctx.m_local->m_fFlags( ) & FL_ONGROUND ) { + last_onground = g_ctx.pred_time( ); + on_ground = true; + } + + ticks++; + if( ticks > switch_rate ) { + side_switch ^= 1; + ticks = 0; + } + + float rand = 0.f; + if( setting && jitter && !no_jitter ) { + rand = math::random_number( -float( jitter ), float( jitter ) ); + } + + if( setting && add ) { + original += add; + } + + switch( setting ) { + case 1: //back + return original - 180.f + rand; + case 2: {//back spin + float time = on_ground ? g_csgo.m_globals->m_curtime * 0.5f : ( g_csgo.m_globals->m_curtime - last_onground ); + float range = on_ground ? jitter : jitter * 2.f; + return original - 180.f - range * 0.5f + ( no_jitter ? range : std::fmod( time * rate, range + 1.f ) ); + } + case 3: //sideways + //to be updated with the last saved yaw from freestanding/breaker + return rand + fake ? ( side_switch ? original - 90.f : original + 90.f ) : + ( side_switch ? original + 90.f : original - 90.f ); + case 4: //slowpin lol + return rand + std::fmod( g_csgo.m_globals->m_curtime * rate, 360.f ); + case 5: //random + return math::random_number( -180.f, 180.f ); + case 6: + return rand + fake ? ( m_direction ? original - 90.f : original + 90.f ) : + ( m_direction ? original + 90.f : original - 90.f ); + } + + return original; + } + + float c_ragebot::c_antiaim::get_yaw( bool no_jitter ) { + const auto is_fake = g_cheat.m_lagmgr.get_state( ); + auto original = g_ctx.get_last_cmd( )->m_viewangles.y; + + if( g_settings.rage.at_players ) { + auto closest_ent = util::get_closest_player( ); + if( closest_ent != -1 ) { + auto ent = g_csgo.m_entlist( )->GetClientEntity< >( closest_ent ); + vec3_t ang = math::vector_angles( g_ctx.m_local->m_vecOrigin( ), + ent->m_vecOrigin( ) ); + + original = ang.y; + } + } + + if( is_fake && !g_settings.rage.fake_yaw( ) ) + return original; + if( !is_fake && !g_settings.rage.real_yaw( ) ) + return original; + + if( g_settings.rage.angle_step( ) && g_settings.rage.angle_step_degrees( ) ) { + float step = float( g_settings.rage.angle_step_degrees( ) ); + original = math::find_closest_step( original, step ); + } + return get_yaw( is_fake, original, no_jitter ); + } + + void c_ragebot::c_antiaim::run( ) { + m_is_edging = false; + if( !g_settings.rage.anti_aim( ) || !g_settings.rage.enabled( ) ) + return; + + auto is_everyone_dormant = [ ]( ) { + for( int i{ 1 }; i < g_csgo.m_globals->m_maxclients; ++i ) { + auto ent = g_csgo.m_entlist( )->GetClientEntity< >( i ); + if( ent && ent->is_valid( ) && + ( ent->m_iTeamNum( ) != g_ctx.m_local->m_iTeamNum( ) + || g_settings.rage.friendlies ) ) { + return false; + } + } + + return true; + }; + + if( ( m_cmd->m_forwardmove || m_cmd->m_sidemove ) && + ( g_ctx.m_local->m_nMoveType( ) == MOVETYPE_LADDER || + g_ctx.m_local->m_nMoveType( ) == MOVETYPE_NOCLIP ) ) + return; + + if( g_ctx.m_local->m_fFlags( ) & FL_FROZEN ) + return; + + if( is_everyone_dormant( ) && g_settings.rage.dormant_check ) + return; + + if( g_settings.rage.fakewalk( ) && g_input.is_key_pressed( g_settings.rage.fakewalk_key( ) ) ) { + run_fakewalk( ); + } + else { + m_is_fakewalking = false; + } + + if( ( m_cmd->m_buttons & IN_ATTACK ) && g_ctx.m_local->can_attack( ) ) + return; + + auto weapon = g_ctx.m_local->get_weapon( ); + if( weapon && weapon->is_grenade( ) ) { + if( weapon->m_fThrowTime( ) > g_csgo.m_globals->m_interval_per_tick ) { + return; + } + } + + if( m_cmd->m_buttons & IN_USE ) + return; + + if( g_settings.rage.real_yaw( ) || + g_settings.rage.fake_yaw( ) ) { + m_cmd->m_viewangles.y = get_yaw( ); + if( g_settings.rage.break_lby( ) ) { + m_breaker.override_angles( &m_cmd->m_viewangles.y, + get_yaw( true ), + float( g_settings.rage.lby_delta ) ); + } + } + + bool edge_detected = false; + bool freestanding = false; + + if( g_settings.rage.pitch( ) ) { + m_cmd->m_viewangles.x = get_pitch( ); + } + + if( !g_settings.rage.edge_dtc_priority ) { + freestanding = run_freestanding( ); + if( !freestanding ) + edge_detected = run_edge_dtc( ); + } + else { + edge_detected = run_edge_dtc( ); + if( !edge_detected ) + freestanding = run_freestanding( ); + } + + m_is_edging = freestanding || edge_detected; + + if( edge_detected && g_cheat.m_lagmgr.get_choked( ) && m_breaker.get_next_update( ) > 1 ) { + vec3_t vang{ }; + g_csgo.m_engine( )->GetViewAngles( vang ); + + float delta = std::remainderf( vang.y - m_cmd->m_viewangles.y, 360.f ); + m_direction = delta < 0; + } + } +} \ No newline at end of file diff --git a/cheat/gmod/ragebot_lagcomp.cpp b/cheat/gmod/ragebot_lagcomp.cpp new file mode 100644 index 0000000..0fe3a0b --- /dev/null +++ b/cheat/gmod/ragebot_lagcomp.cpp @@ -0,0 +1,595 @@ +#include "ragebot.hpp" +#include "interface.hpp" +#include "settings.hpp" +#include "context.hpp" +#include "base_cheat.hpp" +#include "mem.hpp" + +namespace features +{ + c_ragebot::lag_record_t::lag_record_t( c_base_player* ent ) : m_ent( ent ) { + if( !m_ent || !m_ent->is_valid( ) ) return; + m_valid = true; + + m_flSimulationTime = m_ent->m_flSimulationTime( ); + m_tickcount = TIME_TO_TICKS( m_flSimulationTime + util::get_lerptime( ) ); + m_choked = m_ent->get_choked_ticks( ); + + m_flLowerBodyYaw = m_ent->m_flLowerBodyYawTarget( ); + m_vecVelocity = m_ent->m_vecVelocity( ); + m_fFlags = m_ent->m_fFlags( ); + m_flCycle = m_ent->m_flCycle( ); + m_nSequence = m_ent->m_nSequence( ); + + m_vecAngles = m_ent->m_angEyeAngles( ); + m_vecOrigin = m_ent->m_vecOrigin( ); + + m_vecRenderAngles = m_ent->ce( )->GetRenderAngles( ); + m_vecAbsAngles = *( vec3_t* )( uintptr_t( m_ent ) + 0xc4 ); + + m_vecAbsOrigin = *( vec3_t* )( uintptr_t( m_ent ) + 0xa0 ); + m_vecRenderOrigin = m_ent->ce( )->GetRenderOrigin( ); + + m_vecHeadPos = ent->get_hitbox_pos( 0 ); + m_vecPelvisPos = ent->get_hitbox_pos( HITBOX_PELVIS ); + m_can_render = ent->ce( )->SetupBones( m_matrix, 128, 0x100, 0.f ); + + m_vecMins = *( vec3_t* )( uintptr_t( m_ent ) + 0x318 + 0x8 ); + m_vecMaxs = *( vec3_t* )( uintptr_t( m_ent ) + 0x318 + 0x14 ); + + float* pose_params = m_ent->m_flPoseParameter( ); + memcpy( m_PoseParameters, + pose_params, + sizeof( float ) * 24 ); + + size_t count = std::min< size_t >( m_ent->m_AnimOverlay( ).GetSize( ), 13 ); + memcpy( m_AnimLayers, + m_ent->m_AnimOverlay( ).GetElements( ), + sizeof( C_AnimationLayer ) * count ); + + memcpy( &m_state, + m_ent->get_animstate( ), + sizeof( CCSGOPlayerAnimState ) ); + } + + //this shit doesnt work and im going to lose my fucking mind + bool c_ragebot::lag_record_t::restore( bool recalculate ) { + if( !m_ent || !m_ent->is_valid( ) ) return false; + + m_ent->m_flLowerBodyYawTarget( ) = m_flLowerBodyYaw; + + m_ent->m_vecVelocity( ) = m_vecVelocity; + m_ent->m_flCycle( ) = m_flCycle; + m_ent->m_nSequence( ) = m_nSequence; + + m_ent->m_angEyeAngles( ) = m_vecAngles; + m_ent->m_vecOrigin( ) = m_vecOrigin; + m_ent->m_fFlags( ) = m_fFlags; + + m_ent->ce( )->GetRenderAngles( ) = m_vecRenderAngles; + m_ent->ce( )->GetRenderOrigin( ) = m_vecRenderOrigin; + + m_ent->set_abs_angles( m_vecAbsAngles ); + m_ent->set_abs_origin( m_vecAbsOrigin ); + + *( vec3_t* )( uintptr_t( m_ent ) + 0x318 + 0x8 ) = m_vecMins; + *( vec3_t* )( uintptr_t( m_ent ) + 0x318 + 0x14 ) = m_vecMaxs; + + memcpy( m_ent->m_flPoseParameter( ), + m_PoseParameters, + sizeof( float ) * 24 ); + + size_t count = std::min< int >( m_ent->m_AnimOverlay( ).GetSize( ), 13 ); + memcpy( m_ent->m_AnimOverlay( ).GetElements( ), + m_AnimLayers, + sizeof( C_AnimationLayer ) * count ); + + if( recalculate ) { + m_ent->fix_animations( nullptr ); + //m_ent->invalidate_bone_cache( ); + return m_ent->ce( )->SetupBones( nullptr, -1, 0x100, 0.f ); + } + else { + m_ent->invalidate_bone_cache( ); + return true; + } + + return false; + } + + bool c_ragebot::lag_record_t::is_valid( ) { + if( !m_valid ) return false; + if( m_balanceadjust && m_shot ) return false; + + return util::is_tick_valid( m_tickcount ); + } + + void c_ragebot::c_lagcomp::restore_animations( ) { + if( g_csgo.m_engine( )->IsInGame( ) ) { + if( g_ctx.m_local && g_ctx.m_local->is_valid( ) ) { + for( int i{ 1 }; i < 65; ++i ) { + auto ent = g_csgo.m_entlist( )->GetClientEntity< >( i ); + + if( ent && ent->is_player( ) && ent != g_ctx.m_local ) { + ent->m_flLastBoneSetupTime( ) = g_csgo.m_globals->m_curtime; + ent->m_iMostRecentModelBoneCounter( ) = g_csgo.m_globals->m_framecount; + ent->m_bClientSideAnimation( ) = true; + } + } + } + } + } + + void c_ragebot::c_lagcomp::store_visuals( ) { + if( g_csgo.m_engine( )->IsInGame( ) && g_settings.rage.resolver( ) ) { + static float last_simtime[ 65 ]{ }; + + if( g_ctx.m_local && g_ctx.m_local->is_valid( ) ) { + for( int i{ }; i < 65; ++i ) { + auto ent = g_csgo.m_entlist( )->GetClientEntity< >( i ); + auto& data = m_data_render[ i ]; + + if( ent && ent->is_valid( ) && !ent->m_bGunGameImmunity( ) && + !!std::abs( last_simtime[ i ] - ent->m_flSimulationTime( ) ) ) { + render_record_t new_record; + new_record.m_simtime = ent->m_flSimulationTime( ) + util::get_lerptime( ); + new_record.m_origin = ent->m_vecOrigin( ); + if( ent->ce( )->SetupBones( new_record.m_matrix, 128, 0x100, 0.f ) ) { + data.push_front( new_record ); + } + + last_simtime[ i ] = ent->m_flSimulationTime( ); + } + + while( !data.empty( ) && + data.size( ) > TIME_TO_TICKS( 1.f ) ) { + data.pop_back( ); + } + } + } + } + } + + c_ragebot::render_record_t* c_ragebot::c_lagcomp::get_render_record( int ent_index ) { + auto& data = m_data_render[ ent_index ]; + auto ent = g_csgo.m_entlist( )->GetClientEntity< >( ent_index ); + + for( auto& it : util::reverse_iterator( data ) ) { + if( util::is_tick_valid( TIME_TO_TICKS( it.m_simtime ) ) ) { + return it.m_origin.dist_to( ent->m_vecOrigin( ) ) > 5.f ? &it : nullptr; + } + } + + return nullptr; + } + + void c_ragebot::c_lagcomp::fsn_net_update_start( ) { + static bool restored{ }; + + if( !g_settings.rage.enabled( ) ) { + if( !restored ) { + restore_animations( ); + restored = true; + } + + return; + } + + restored = false; + if( g_csgo.m_engine( )->IsInGame( ) ) { + if( g_ctx.m_local && g_ctx.m_local->is_valid( ) ) { + static float last_simtime[ 65 ]{ }; + for( int i{ 1 }; i < 65; ++i ) { + auto ent = g_csgo.m_entlist( )->GetClientEntity< >( i ); + + if( ent && ent->is_valid( ) && ent != g_ctx.m_local ) { + ent->disable_interpolaton( ); + if( ent != g_ctx.m_local ) { + ent->m_bClientSideAnimation( ) = false; + } + + float simtime = ent->m_flSimulationTime( ); + + last_simtime[ i ] = simtime; + } + } + } + } + } + + void c_ragebot::c_lagcomp::fsn_render_start( ) { + if( !g_settings.rage.enabled( ) ) + return; + + if( !g_ctx.m_local ) + return; + + static float stored_lby[ 65 ]; + + for( int i{ 1 }; i < 65; ++i ) { + auto ent = g_csgo.m_entlist( )->GetClientEntity< >( i ); + + if( !ent || !ent->is_player( ) ) { + //invalidate_animstate( i ); + continue; + } + + if( ent == g_ctx.m_local && ent->is_alive( ) ) { + ent->m_bClientSideAnimation( ) = true; + //fuck ya + + auto breaker_animstate = g_cheat.m_ragebot.m_antiaim->get_animstate( ); + if( breaker_animstate && g_settings.rage.anti_aim( ) ) { + if( breaker_animstate->pBaseEntity == ent ) { + memcpy( g_ctx.m_local->get_animstate( ), + breaker_animstate, + sizeof( CCSGOPlayerAnimState ) ); + ent->get_animstate( )->m_flLastClientSideAnimationUpdateTime = FLT_MAX; + ent->get_animstate( )->m_iLastClientSideAnimationUpdateFramecount = INT_MAX; + } + } + + continue; + } + + //return; + + if( !ent->is_alive( ) ) { + ent->m_bClientSideAnimation( ) = true; + //invalidate_animstate( i ); + continue; + } + + if( ent->ce( )->IsDormant( ) ) { + ent->invalidate_bone_cache( ); + continue; + } + + if( ent->m_bGunGameImmunity( ) ) { + ent->fix_animations( ); + ent->enforce_animations( ); + continue; + } + + if( ent->m_iTeamNum( ) == g_ctx.m_local->m_iTeamNum( ) + && !g_settings.rage.friendlies ) { + ent->fix_animations( ); + ent->enforce_animations( ); + continue; + } + + if( m_data_lby[ i ].size( ) && + m_data_lby[ i ].front( ).m_ent != ent ) { + m_data_lby[ i ].clear( ); + } + + if( m_data_normal[ i ].size( ) && + m_data_normal[ i ].front( ).m_ent != ent ) { + m_data_normal[ i ].clear( ); + } + + auto update_anims = [ this, &ent ]( int e ) { + ent->fix_animations( ); + }; + + bool is_moving = ent->m_vecVelocity( ).length2d( ) > 0.1f && !ent->is_fakewalking( ) + && ( ent->m_fFlags( ) & FL_ONGROUND ); + + float lby = ent->m_flLowerBodyYawTarget( ); + + float last_simtime = m_last_simtime[ i ]; + float simtime = ent->m_flSimulationTime( ); + + if( !!std::abs( simtime - last_simtime ) ) { + if( is_moving && g_settings.rage.resolver ) { + ent->m_angEyeAngles( ).y = lby; + //ent->ce( )->GetRenderAngles( ).y = lby; + + //vec3_t abs_ang = ent->get< vec3_t >( 0xc4 ); + //abs_ang.y = lby; + //ent->set_abs_angles( abs_ang ); + + update_anims( i ); + lag_record_t new_record( ent ); + //new_record.m_vecAngles.y = new_record.m_vecAbsAngles.y + // = new_record.m_vecRenderAngles.y = lby; + + m_data_lby[ i ].push_front( new_record ); + } + + else if( ( lby != stored_lby[ i ] ) && g_settings.rage.resolver ) { + stored_lby[ i ] = lby; + ent->m_angEyeAngles( ).y = lby; + //ent->ce( )->GetRenderAngles( ).y = lby; + + //vec3_t abs_ang = ent->get< vec3_t >( 0xc4 ); + //abs_ang.y = lby; + //ent->set_abs_angles( abs_ang ); + + update_anims( i ); + lag_record_t new_record( ent ); + //new_record.m_vecAngles.y = new_record.m_vecAbsAngles.y + // = new_record.m_vecRenderAngles.y = lby; + + m_data_lby[ i ].push_front( new_record ); + } + + else if( g_settings.rage.resolver ) { + static C_AnimationLayer last_layer[ 65 ]{ }; + auto layer = m_anim_backup[ i ][ 3 ]; + auto ent_layer = &ent->m_AnimOverlay( ).GetElements( )[ 3 ]; + if( g_cheat.m_ragebot.m_resolver->get_breaking_state( i ) == BREAKING_ADJUST && + layer.m_flCycle == 0.f && layer.m_flWeight == 0.f && ent_layer && + last_layer[ i ].m_flCycle > layer.m_flCycle ) { + ent->m_angEyeAngles( ).y = lby; + //ent->ce( )->GetRenderAngles( ).y = lby; + + //vec3_t abs_ang = ent->get< vec3_t >( 0xc4 ); + //abs_ang.y = lby; + //ent->set_abs_angles( abs_ang ); + + update_anims( i ); + + auto anim_time = ent->m_flOldSimulationTime( ) + TICK_INTERVAL( ); + + int flick_tick = TIME_TO_TICKS( anim_time + util::get_lerptime( ) ); + lag_record_t new_record( ent ); + //new_record.m_vecAngles.y = new_record.m_vecAbsAngles.y + // = new_record.m_vecRenderAngles.y = lby; + new_record.m_flSimulationTime = anim_time; + new_record.m_tickcount = flick_tick; + + new_record.m_balanceadjust = true; + m_data_lby[ i ].push_front( new_record ); + } + else { + update_anims( i ); + m_data_normal[ i ].push_front( lag_record_t( ent ) ); + } + + last_layer[ i ] = layer; + } + else { + update_anims( i ); + m_data_normal[ i ].push_front( lag_record_t( ent ) ); + } + } + + m_last_simtime[ i ] = simtime; + ent->enforce_animations( ); + + while( !m_data_lby[ i ].empty( ) && + m_data_lby[ i ].size( ) > TIME_TO_TICKS( 1.0f ) ) { + m_data_lby[ i ].pop_back( ); + } + + while( !m_data_normal[ i ].empty( ) && + m_data_normal[ i ].size( ) > TIME_TO_TICKS( 1.0f ) ) { + m_data_normal[ i ].pop_back( ); + } + } + } + + void c_ragebot::c_lagcomp::fsn_postdataupdate_start( ) { + if( !g_settings.rage.enabled( ) || !g_settings.rage.resolver( ) ) + return; + + static float stored_lby[ 65 ]; + + for( int i{ 1 }; i < 65; ++i ) { + auto ent = g_csgo.m_entlist( )->GetClientEntity< >( i ); + + if( !ent || !ent->is_player( ) ) { + //invalidate_animstate( i ); + continue; + } + + if( ent == g_ctx.m_local ) { + continue; + } + + if( !ent->is_alive( ) ) { + continue; + } + + if( ent->ce( )->IsDormant( ) ) { + continue; + } + + memcpy( m_anim_backup.at( i ), + ent->m_AnimOverlay( ).GetElements( ), + sizeof( C_AnimationLayer ) * 13 ); + + if( ent->m_bGunGameImmunity( ) ) { + continue; + } + + if( ent->m_iTeamNum( ) == g_ctx.m_local->m_iTeamNum( ) + && !g_settings.rage.friendlies ) + continue; + + bool is_moving = ent->m_vecVelocity( ).length2d( ) > 0.1f && !ent->is_fakewalking( ) + && ( ent->m_fFlags( ) & FL_ONGROUND ); + + float lby = ent->m_flLowerBodyYawTarget( ); + + float last_simtime = m_last_simtime[ i ]; + float simtime = ent->m_flSimulationTime( ); + + if( !!std::abs( simtime - last_simtime ) ) { + memcpy( m_anim_backup.at( i ), + ent->m_AnimOverlay( ).GetElements( ), + sizeof( C_AnimationLayer ) * 13 ); + + if( is_moving && g_settings.rage.resolver ) { + ent->m_angEyeAngles( ).y = lby; + //ent->ce( )->GetRenderAngles( ).y = lby; + + m_last_simtime[ i ] = simtime; + ent->fix_animations( ); + + lag_record_t new_record( ent ); + //new_record.m_vecAngles.y = new_record.m_vecAbsAngles.y + // = new_record.m_vecRenderAngles.y = lby; + + m_data_lby[ i ].push_front( new_record ); + } + + else if( ( lby != stored_lby[ i ] ) && g_settings.rage.resolver ) { + stored_lby[ i ] = lby; + ent->m_angEyeAngles( ).y = lby; + //ent->ce( )->GetRenderAngles( ).y = lby; + + m_last_simtime[ i ] = simtime; + ent->fix_animations( ); + + auto anim_time = ent->m_flSimulationTime( ) + TICK_INTERVAL( ); + auto anim_tick = TIME_TO_TICKS( anim_time + util::get_lerptime( ) ); + + lag_record_t new_record( ent ); + new_record.m_tickcount = anim_tick; + //new_record.m_vecAngles.y = new_record.m_vecAbsAngles.y + // = new_record.m_vecRenderAngles.y = lby; + + m_data_lby[ i ].push_front( new_record ); + } + + else if( g_settings.rage.resolver ) { + static C_AnimationLayer last_layer[ 65 ]{ }; + auto layer = m_anim_backup[ i ][ 3 ]; + auto ent_layer = &ent->m_AnimOverlay( ).GetElements( )[ 3 ]; + if( g_cheat.m_ragebot.m_resolver->get_breaking_state( i ) == BREAKING_ADJUST && + layer.m_flCycle == 0.f && layer.m_flWeight == 0.f && ent_layer && + last_layer[ i ].m_flCycle > layer.m_flCycle ) { + ent->m_angEyeAngles( ).y = lby; + //ent->ce( )->GetRenderAngles( ).y = lby; + + ent->fix_animations( ); + m_last_simtime[ i ] = simtime; + float anim_time = ent->m_flOldSimulationTime( ) + TICK_INTERVAL( ); + + int flick_tick = TIME_TO_TICKS( anim_time + util::get_lerptime( ) ); + lag_record_t new_record( ent ); + new_record.m_vecAngles.y = new_record.m_vecAbsAngles.y + = new_record.m_vecRenderAngles.y = lby; + new_record.m_flSimulationTime = anim_time; + new_record.m_tickcount = flick_tick; + + new_record.m_balanceadjust = true; + m_data_lby[ i ].push_front( new_record ); + } + + last_layer[ i ] = layer; + } + } + + ent->enforce_animations( ); + } + } + + RecordType_t c_ragebot::c_lagcomp::can_backtrack_entity( int ent_index ) { + auto ent = g_csgo.m_entlist( )->GetClientEntity< >( ent_index ); + if( ent->is_breaking_lc( ) ) { + return RECORD_NONE; + } + + auto data_lby = &m_data_lby[ ent_index ]; + auto data_normal = &m_data_normal[ ent_index ]; + + if( !data_lby->empty( ) ) { + for( auto& it : *data_lby ) { + if( it.is_valid( ) ) return RECORD_LBY; + } + } + + if( !data_normal->empty( ) ) { + for( auto& it : *data_normal ) { + if( it.is_valid( ) ) return RECORD_NORMAL; + } + } + + return RECORD_NONE; + } + + int c_ragebot::c_lagcomp::backtrack_entity( int ent_index, RecordType_t type, lag_record_t** out_record ) { + if( type == RECORD_NONE ) return -1; + + auto& data = *get_records( ent_index, type ); + auto ent = g_csgo.m_entlist( )->GetClientEntity< >( ent_index ); + + auto check_record = [ &ent, &out_record ]( lag_record_t* record, bool check_pelvis ) { + if( record->m_balanceadjust && record->m_shot ) return -1; + + vec3_t head_pos = record->m_vecHeadPos; + vec3_t pelvis_pos = record->m_vecPelvisPos; + + float damage = g_cheat.m_autowall.run( g_ctx.m_local, ent, head_pos, false ) * 4.f; + float min_damage = std::min< float >( ent->m_iHealth( ), + g_settings.rage.active->m_damage ); + + //g_con->log( xors( "record: %d damage: %f" ), counter++, damage ); + + if( damage > min_damage ) { + if( !record->restore( ) ) + return -1; + + if( out_record ) { + *out_record = record; + } + return record->m_tickcount; + } + + if( check_pelvis ) { + float pelvis_damage = g_cheat.m_autowall.run( g_ctx.m_local, ent, pelvis_pos, false ); + if( pelvis_damage > min_damage ) { + if( !record->restore( ) ) + return -1; + + if( out_record ) { + *out_record = record; + } + return record->m_tickcount; + } + } + + return -1; + }; + + if( data.empty( ) ) + return -1; + + auto* back = &data.back( ); + auto* front = &data.front( ); + + for( auto& it : data ) { + if( !it.is_valid( ) ) continue; + front = ⁢ + break; + } + + for( auto& it : util::reverse_iterator( data ) ) { + if( !it.is_valid( ) ) continue; + back = ⁢ + break; + } + + int front_result = check_record( front, false ); + if( front_result != -1 ) return front_result; + + int back_result = check_record( back, true ); + if( back_result != -1 ) return back_result; + + if( g_settings.rage.bt_scan_all && !( g_settings.rage.preserve_fps && util::is_low_fps( ) ) ) { + for( auto& it : data ) { + if( &it == front ) continue; + if( &it == back ) break; + if( !it.is_valid( ) ) continue; + + auto result = check_record( &it, false ); + if( result != -1 ) return result; + } + } + + return -1; + } +} \ No newline at end of file diff --git a/cheat/gmod/ragebot_resolver.cpp b/cheat/gmod/ragebot_resolver.cpp new file mode 100644 index 0000000..0de8f13 --- /dev/null +++ b/cheat/gmod/ragebot_resolver.cpp @@ -0,0 +1,471 @@ +#include "ragebot.hpp" +#include "context.hpp" +#include "base_cheat.hpp" +#include "math.hpp" +#include "input_system.hpp" + +namespace features +{ + constexpr float FLT_ANG_LBY = 360.f; + constexpr float FLT_ANG_MOVING_LBY = -360.f; + constexpr float FLT_ANG_180 = 720.f; + constexpr float FLT_ANG_90 = -720.f; + constexpr float FLT_ANG_MINUS_90 = -480.f; + + static const std::vector< float > possible_angles_none = { + FLT_ANG_LBY, + FLT_ANG_MOVING_LBY, + FLT_ANG_180, + FLT_ANG_90, + FLT_ANG_MINUS_90, + 180.f + }; + + static const std::vector< float > possible_angles_adjust = { + FLT_ANG_MOVING_LBY, + 180.f, + FLT_ANG_180, + FLT_ANG_90, + FLT_ANG_MINUS_90, + -130.f, + 130.f, + }; + + static const std::vector< float > possible_angles_noadjust = { + FLT_ANG_MOVING_LBY, + 110.f, + FLT_ANG_180, + FLT_ANG_90, + FLT_ANG_MINUS_90, + 90.f, + -90.f + }; + + bool dbg_resolver( ) { + static con_var< bool > var{ &data::holder_, fnv( "dbg_resolver" ), false }; + return var( ); + } + + c_ragebot::c_resolver::resolve_log_t::resolve_log_t( ) { + auto register_vec = [ ]( c_ragebot::c_resolver::angle_vec_t* vec, const std::vector< float >& vec1 ) { + vec->clear( ); + + for( auto& it : vec1 ) { + vec->push_back( it ); + } + }; + + register_vec( &m_logged_angles[ 0 ], possible_angles_none ); + register_vec( &m_logged_angles[ 1 ], possible_angles_adjust ); + register_vec( &m_logged_angles[ 2 ], possible_angles_noadjust ); + } + + void c_ragebot::c_resolver::resolve_log_t::update( int ent_index ) { + static C_AnimationLayer last_layer[ 65 ]{ }; + auto ent = g_csgo.m_entlist( )->GetClientEntity< >( ent_index ); + + if( !ent || ent == g_ctx.m_local || !ent->is_player( ) || !ent->is_alive( ) || ent->ce( )->IsDormant( ) ) { + m_was_invalid = true; + return; + } + + if( !( ent->m_fFlags( ) & FL_ONGROUND ) ) { + m_breaking = BREAKING_NONE; + return; + } + + //they moved since the last time they were dormant - reset the data + if( m_was_invalid && m_last_pos.dist_to( ent->m_vecOrigin( ) ) > 4.f ) { + m_last_pos = ent->m_vecOrigin( ); + reset( ); + } + + m_was_invalid = false; + m_shots %= 100; + float lby = ent->m_flLowerBodyYawTarget( ); + if( lby != m_last_lby ) { + m_last_lby = lby; + m_last_update = ent->m_flSimulationTime( ); + m_breaking = BREAKING_NONE; + } + + //filter out the first lby update + if( ent->m_flSimulationTime( ) - m_last_update > 0.1f ) { + C_AnimationLayer* adjust_layer = &ent->m_AnimOverlay( ).GetElements( )[ 3 ]; + C_AnimationLayer* prev_layer = &last_layer[ ent_index ]; + + auto cur_seq = ent->get_seq_activity( adjust_layer->m_nSequence ); + auto old_seq = ent->get_seq_activity( prev_layer->m_nSequence ); + + if( old_seq == 979 && cur_seq == 979 && ( adjust_layer->m_flCycle != prev_layer->m_flCycle + || adjust_layer->m_flWeight == 1.f ) ) { + m_breaking = BREAKING_ADJUST; + m_last_adjust = ent->m_flSimulationTime( ); + } + else if( ent->m_flSimulationTime( ) - m_last_adjust > TICKS_TO_TIME( 14 ) ) { + m_breaking = BREAKING_NOADJUST; + } + + *prev_layer = *adjust_layer; + } + else { + m_breaking = BREAKING_NONE; + } + } + + void c_ragebot::c_resolver::resolve_log_t::reset( ) { + //assuming theyre STILL not moving this shouldnt change + //however if they are, it will be reset to none anyway + m_breaking = BREAKING_NONE; + m_last_adjust = 0.f; + m_last_update = 0.f; + m_last_lby = 0.f; + m_missed_shots = 0; + } + + void c_ragebot::c_resolver::resolve_log_t::reset_angles( ) { + std::vector< float > ang_vec; + auto& cur_vec = m_logged_angles[ m_breaking ]; + + switch( m_breaking ) { + case BREAKING_NONE: + ang_vec = possible_angles_none; + break; + case BREAKING_NOADJUST: + ang_vec = possible_angles_noadjust; + break; + case BREAKING_ADJUST: + ang_vec = possible_angles_adjust; + break; + } + + cur_vec.clear( ); + for( auto& it : ang_vec ) cur_vec.emplace_back( it ); + } + + void c_ragebot::c_resolver::resolve_log_t::blacklist_shot( int shots ) { + auto& angles = m_logged_angles[ m_breaking ]; + + if( angles.empty( ) ) { + reset_angles( ); + } + + shots %= angles.size( ); + + if( dbg_resolver( ) ) + g_con->log( "blacklisting angle: %f", angles.at( shots ).ang ); + + angles.at( shots ).missed = true; + } + + float c_ragebot::c_resolver::get_shot_yaw( int shots, int ent_index ) { + auto& data = m_data[ ent_index ]; + auto ang_vec = &data.m_logged_angles[ data.m_breaking ]; + + std::vector< float > angles; + + for( size_t i{ }; i < ang_vec->size( ); ++i ) { + if( !ang_vec->at( i ).missed ) { + angles.push_back( ang_vec->at( i ).ang ); + } + } + + if( angles.empty( ) ) { + data.reset_angles( ); + return ang_vec->at( 0 ).ang; + } + + if( angles.size( ) <= 1 ) { + return angles.at( 0 ); + } + + return angles[ shots % angles.size( ) ]; + } + + void c_ragebot::c_resolver::aimbot( int ent_index, int hitbox, vec3_t angle, vec3_t position ) { + if( !g_cheat.m_player_mgr.is_cheater( ent_index ) ) + return; + + auto& data = m_data[ ent_index ]; + + auto ent = g_csgo.m_entlist( )->GetClientEntity< >( ent_index ); + bool moving = ent->m_vecVelocity( ).length2d( ) > 0.1f && ( ent->m_fFlags( ) & FL_ONGROUND ); + + if( moving && !ent->is_fakewalking( ) ) { + return; + } + + auto model = ent->ce( )->GetModel( ); + auto hdr = g_csgo.m_model_info( )->GetStudiomodel( model ); + auto set = hdr->pHitboxSet( ent->m_nHitboxSet( ) ); + + if( hitbox == HITBOX_HEAD ) { + auto box = set->pHitbox( 0 ); + if( box ) { + auto dist = box->bbmin.dist_to( box->bbmax ); + + context::shot_data_t new_shot{ }; + new_shot.m_angle = angle; + new_shot.m_enemy_pos = position; + new_shot.m_enemy_index = ent_index; + new_shot.m_local_pos = g_ctx.m_local->get_eye_pos( ); + new_shot.m_resolver_shots = data.m_shots; + new_shot.m_resolver_state = true; + new_shot.m_hitbox_radius = dist; + new_shot.m_missed = true; + new_shot.m_hitgroup = HITGROUP_HEAD; + + g_ctx.m_last_shot++; + g_ctx.m_last_shot %= 128; + g_ctx.m_shot_data[ g_ctx.m_last_shot ] = new_shot; + + g_ctx.m_has_incremented_shots = true; + data.m_snapshot[ g_ctx.m_last_shot ] = data; + + increment_shots( ent_index ); + data.blacklist_shot( data.m_shots ); + } + } + else { + matrix3x4 bone_matrix[ 128 ]; + if( model && hdr && set && ent->ce( )->SetupBones( bone_matrix, 128, 0x100, g_csgo.m_globals->m_curtime ) ) { + auto box = set->pHitbox( hitbox ); + if( !box ) return; + + auto origin = ent->m_vecOrigin( ); + + vec3_t shot_pos = position; + vec3_t rotated_center; + + vec3_t offset = position - origin; + float radius = offset.length2d( ); + float cos_ = offset.x / radius; + + float deg = RAD2DEG( acos( cos_ ) ); + if( offset.y < 0 ) deg = -deg; + + float rot = ( deg - 180.f ) * ( M_PI / 180.f ); + rotated_center.x = origin.x + cos( rot ) * radius; + rotated_center.y = origin.y + sin( rot ) * radius; + rotated_center.z = position.z; + + Ray_t ray; + CTraceFilterOneEntity filter; + CGameTrace tr_center; + CGameTrace tr_rot; + + filter.ent = ent; + + ray.Init( g_ctx.m_local->get_eye_pos( ), position ); + g_csgo.m_trace( )->TraceRay( ray, MASK_SHOT, &filter, &tr_center ); + + ray.Init( g_ctx.m_local->get_eye_pos( ), rotated_center ); + g_csgo.m_trace( )->TraceRay( ray, MASK_SHOT, &filter, &tr_rot ); + + bool is_within = tr_center.hitbox == tr_rot.hitbox; + + if( !is_within ) { + auto dist = box->bbmin.dist_to( box->bbmax ); + + context::shot_data_t new_shot{ }; + new_shot.m_angle = angle; + new_shot.m_enemy_pos = position; + new_shot.m_enemy_index = ent_index; + new_shot.m_local_pos = g_ctx.m_local->get_eye_pos( ); + new_shot.m_resolver_shots = data.m_shots; + new_shot.m_resolver_state = true; + new_shot.m_hitbox_radius = dist; + new_shot.m_missed = true; + new_shot.m_hitgroup = util::hitbox_to_hitgroup( hitbox ); + + g_ctx.m_last_shot++; + g_ctx.m_last_shot %= 128; + g_ctx.m_shot_data[ g_ctx.m_last_shot ] = new_shot; + + g_ctx.m_has_incremented_shots = true; + data.m_snapshot[ g_ctx.m_last_shot ] = data; + + increment_shots( ent_index ); + data.blacklist_shot( data.m_shots ); + } + } + } + //printf( "resolver: logging aimbot shot %d missed: %d state: %d time: %f\n", + // data.m_shots, data.m_missed_shots[ data.m_breaking ], data.m_breaking, g_Interfaces.Globals->curtime ); + } + + void c_ragebot::c_resolver::on_missed_spread( int ent_index, int shots ) { + if( !g_cheat.m_player_mgr.is_cheater( ent_index ) ) + return; + + auto& data = m_data[ ent_index ]; + auto& snapshot = data.m_snapshot[ shots ]; + + auto& shot_vec = data.m_logged_angles[ snapshot.m_breaking ]; + + if( shot_vec.empty( ) ) { + data.reset_angles( ); + } + + if( shot_vec.size( ) <= 1 ) { + shot_vec.at( 0 ).missed = false; + } + else + shot_vec.at( snapshot.m_shots % shot_vec.size( ) ).missed = false; + + + if( dbg_resolver( ) ) + g_con->log( "shot missed due to spread: %f", shot_vec.size( ) <= 1 ? shot_vec.at( 0 ).ang : shot_vec.at( snapshot.m_shots % shot_vec.size( ) ).ang ); + + } + + void c_ragebot::c_resolver::listener( int ent_index, int shots ) { + if( !g_cheat.m_player_mgr.is_cheater( ent_index ) ) + return; + + auto& data = m_data[ ent_index ]; + auto& snapshot = data.m_snapshot[ shots ]; + + auto& shot_vec = data.m_logged_angles[ snapshot.m_breaking ]; + + if( shot_vec.empty( ) ) { + data.reset_angles( ); + } + + if( shot_vec.size( ) <= 1 ) { + shot_vec.at( 0 ).missed = false; + } + else + shot_vec.at( snapshot.m_shots % shot_vec.size( ) ).missed = false; + + data.m_shots = snapshot.m_shots; + + if( dbg_resolver( ) ) + g_con->log( "hit angle: %f", shot_vec.size( ) <= 1 ? shot_vec.at( 0 ).ang : shot_vec.at( snapshot.m_shots % shot_vec.size( ) ).ang ); + + } + + void c_ragebot::c_resolver::frame_stage_notify( ) { + if( !g_settings.rage.enabled( ) || !g_settings.rage.resolver( ) ) + return; + + for( int i{ 1 }; i < g_csgo.m_globals->m_maxclients; ++i ) { + auto ent = g_csgo.m_entlist( )->GetClientEntity< >( i ); + + if( !ent || ent == g_ctx.m_local || ent->ce( )->IsDormant( ) + || !ent->is_alive( ) || !g_cheat.m_player_mgr.is_cheater( i ) ) { + m_data[ i ].m_was_invalid = true; + continue; + } + + if( ent->m_iTeamNum( ) == g_ctx.m_local->m_iTeamNum( ) && !g_settings.rage.friendlies ) + continue; + + m_data[ i ].update( i ); + if( g_settings.rage.resolver_override( ) ) { + if( g_input.is_key_pressed( g_settings.rage.resolver_override_key( ) ) ) { + int dir = manual_override( ent ); + if( dir ) { + //to be finished + m_data[ i ].m_overriding = dir; + continue; + } + } + } + + m_data[ i ].m_overriding = 0; + brute_force( ent ); + } + } + + void c_ragebot::c_resolver::force_yaw( c_base_player* ent, float yaw ) { + //could be used to just store resolved yaw on entities + //so then this data can be used in CM + ent->m_angEyeAngles( ).y = yaw;// + 180.f; + + //ent->ce( )->GetRenderAngles( ).y = yaw; + //auto new_ang = ent->get< vec3_t >( 0xc4 ); + //new_ang.y = yaw; + + //ent->set_abs_angles( new_ang ); + } + + int c_ragebot::c_resolver::manual_override( c_base_player* ent ) { + if( ent->m_vecVelocity( ).length2d( ) > 35.f ) { //no point in overriding moving targets, it will also fuck up backtrack records otherwise + return OVERRIDE_NONE; + } + + vec3_t pos; + vec3_t angle; + vec3_t local_angle; + vec3_t local_pos; + float delta; + float dist; + + + local_pos = g_ctx.m_local->m_vecOrigin( ); + g_csgo.m_engine( )->GetViewAngles( local_angle ); + pos = ent->get_hitbox_pos( 0 ); + + angle = math::vector_angles( local_pos, pos ); + dist = pos.dist_to( local_pos ); + delta = ( angle - local_angle ).clamp( ).y; + float yaw_delta = sin( DEG2RAD( ( angle - local_angle ).clamp( ).y ) ) * dist; + + if( std::abs( yaw_delta ) < 25.f ) { + force_yaw( ent, angle.y ); + return OVERRIDE_CENTER; + } + else { + force_yaw( ent, angle.y + ( ( delta < 0.f ) ? 90.f : -90.f ) ); + return delta > 0.f ? OVERRIDE_LEFT : OVERRIDE_RIGHT; + } + } + + void c_ragebot::c_resolver::force_lby( c_base_player* ent ) { + force_yaw( ent, ent->m_flLowerBodyYawTarget( ) ); + } + + void c_ragebot::c_resolver::brute_force( c_base_player* ent ) { + if( ent->m_vecVelocity( ).length( ) > 0.1f && !ent->is_fakewalking( ) ) { + m_data[ ent->ce( )->GetIndex( ) ].m_last_moving_lby = ent->m_flLowerBodyYawTarget( ); + force_lby( ent ); + return; + } + + int i = ent->ce( )->GetIndex( ); + auto& data = m_data[ i ]; + float start = ent->m_flLowerBodyYawTarget( ); + float new_yaw{ }; + float new_ang{ }; + int shots{ }; + + shots = data.m_shots; + new_ang = get_shot_yaw( shots, i ); + float ang; + if( g_ctx.run_frame( ) ) { + auto local_pos = g_ctx.m_local->m_vecOrigin( ); + auto enemy_pos = ent->m_vecOrigin( ); + + ang = math::vector_angles( enemy_pos, local_pos ); + } + else { + ang = start; + } + + if( new_ang == FLT_ANG_LBY ) + new_yaw = ent->m_flLowerBodyYawTarget( ); + else if( new_ang == FLT_ANG_MOVING_LBY ) + new_yaw = data.m_last_moving_lby; + else if( new_ang == FLT_ANG_180 ) + new_yaw = ang - 180.f; + else if( new_ang == FLT_ANG_90 ) + new_yaw = ang + 90.f; + else if( new_ang == FLT_ANG_MINUS_90 ) + new_yaw = ang - 90.f; + else + new_yaw = std::remainderf( start + new_ang, 360.f ); + + force_yaw( ent, new_yaw ); + } +} \ No newline at end of file diff --git a/cheat/gmod/render_view.cpp b/cheat/gmod/render_view.cpp new file mode 100644 index 0000000..c68a244 --- /dev/null +++ b/cheat/gmod/render_view.cpp @@ -0,0 +1,10 @@ +#include "hooks.hpp" +#include "base_cheat.hpp" + +void __fastcall hooks::render_view( void* ecx, void* edx, CViewSetup& view, int clear_flags, int what_to_draw ) { + static auto render_view_o = g_gmod.m_view_render->get_old_function< decltype( &hooks::render_view ) >( 6 ); + if( g_gmod.m_panic ) return render_view_o( ecx, edx, view, clear_flags, what_to_draw ); + + render_view_o( ecx, edx, view, clear_flags, what_to_draw ); + g_cheat.m_visuals.store_data( ); +} \ No newline at end of file diff --git a/cheat/gmod/renderer.cpp b/cheat/gmod/renderer.cpp new file mode 100644 index 0000000..82b6432 --- /dev/null +++ b/cheat/gmod/renderer.cpp @@ -0,0 +1,94 @@ +#include "renderer.hpp" +#include "interface.hpp" + +#undef CreateFont + +/* +drawings::c_fonts g_fonts; +drawings::c_drawings g_renderer; + +NAMESPACE_REGION( drawings ) + +c_fonts::font_t::font_t( std::string name, int size, + int weight, ulong_t flags ) : + m_name( name ), m_size( size ), + m_weight( weight ), m_flags( flags ) { + g_fonts.m_container.push_back( this ); +}; + +void c_fonts::font_t::initialize( ) { + m_font = g_gmod.m_surface( )->CreateFont( ); + g_gmod.m_surface( )->SetFontGlyphSet( + m_font, m_name.c_str( ), m_size, + m_weight, 0, 0, + m_flags + ); +} + +void c_fonts::initialize( ) { + for( auto& it : m_container ) { + it->initialize( ); + } +} + +void c_drawings::draw_string( const wchar_t* text, HFont font, int x, int y, const clr_t& color ) { + g_gmod.m_surface( )->DrawSetTextPos( x, y ); + g_gmod.m_surface( )->DrawSetTextFont( font ); + g_gmod.m_surface( )->DrawSetTextColor( color ); + g_gmod.m_surface( )->DrawPrintText( text, wcslen( text ) ); +} + +void c_drawings::draw_rect( int x, int y, int w, int h, const clr_t& color ) { + g_gmod.m_surface( )->DrawSetColor( color ); + g_gmod.m_surface( )->DrawFilledRect( x, y, x + w, y + h ); +} + +void c_drawings::draw_line( int x, int y, int x1, int y1, const clr_t& clr ) { + g_gmod.m_surface( )->DrawSetColor( clr ); + g_gmod.m_surface( )->DrawLine( x, y, x1, y1 ); +} + +void c_drawings::draw_box( int x, int y, int w, int h, const clr_t& clr ) { + draw_line( x, y, x + w, y, clr ); + draw_line( x + w, y, x + w, y + h, clr ); + draw_line( x, y + h, x + w + 1, y + h, clr ); + draw_line( x, y, x, y + h, clr ); +} + +void c_drawings::draw_circle( int x, int y, int r, const clr_t& col, int res ) { + g_gmod.m_surface( )->DrawSetColor( col ); + g_gmod.m_surface( )->DrawOutlinedCircle( x, y, r, res ); +} + +void c_drawings::draw_filled_circle( int x, int y, int r, const clr_t& col, int res ) { + vertex_t* v = ( vertex_t* )( _alloca( res * sizeof( vertex_t ) ) ); + const float step = M_PI * 2.0f / res; + + for( size_t i{ }; i < res; ++i ) { + float theta = i * step; + float x_off = r * cos( theta ); + float y_off = r * sin( theta ); + v[ i ].init( x + x_off, y + y_off ); + } + + draw_polygon( res, v, col ); +} + +void c_drawings::draw_line( const vec2_t& begin, const vec2_t& end, const clr_t& clr ) { + draw_line( ( int )begin.x, ( int )begin.y, ( int )end.x, ( int )end.y, clr ); +} + +void c_drawings::draw_polygon( int count, vertex_t* vertices, const clr_t& col ) { + static int texture = g_gmod.m_surface( )->CreateNewTextureID( true ); + + clr_t buf( 255, 255, 255 ); + + g_gmod.m_surface( )->DrawSetTextureRGBA( texture, ( byte* )( &buf ), 1, 1 ); + g_gmod.m_surface( )->DrawSetColor( col ); + g_gmod.m_surface( )->DrawSetTexture( texture ); + + g_gmod.m_surface( )->DrawTexturedPolygon( count, vertices ); +} + +END_REGION +*/ \ No newline at end of file diff --git a/cheat/gmod/renderer.hpp b/cheat/gmod/renderer.hpp new file mode 100644 index 0000000..1ae0c00 --- /dev/null +++ b/cheat/gmod/renderer.hpp @@ -0,0 +1,120 @@ +#pragma once +#include +#include +#include + +#include "util.hpp" +#include "sdk.hpp" + +enum e_font_style : size_t { + +}; + +enum FontAlign_t : size_t { + ALIGN_CENTER, + ALIGN_LEFT, + ALIGN_RIGHT +}; + +NAMESPACE_REGION( drawings ) + + +class c_fonts { +protected: + struct font_t { + friend class c_fonts; + font_t( std::string name, int size, + int weight, ulong_t flags ); + + operator HFont( ) { + return m_font; + } + + private: + void initialize( ); + + HFont m_font; + std::string m_name; + int m_size; + int m_weight; + ulong_t m_flags; + }; + + std::vector< font_t* > m_container; + friend struct c_fonts::font_t; +public: + void initialize( ); + + font_t f_esp_small{ xors( "Tahoma" ), 11, 500, FONTFLAG_OUTLINE }; + font_t f_bold{ xors( "Verdana" ), 18, 900, FONTFLAG_DROPSHADOW | FONTFLAG_ANTIALIAS }; + font_t f_12{ xors( "Verdana" ), 12, 700, 128 }; + font_t f_14{ xors( "Verdana" ), 14, 700, 128 }; + font_t f_16{ xors( "Verdana" ), 16, 700, 128 }; + font_t f_18{ xors( "Verdana" ), 18, 700, 128 }; +}; + + + +//im going to fill ur triangles +class c_drawings { +private: + //dumb hacky fix for template functions + void draw_string( const wchar_t* msg, HFont font, int x, int y, const clr_t& color ); + +public: + void draw_line( const vec2_t& begin, const vec2_t& end, const clr_t& color ); + void draw_line( int x, int y, int x1, int y2, const clr_t& color ); + void draw_rect( int x, int y, int w, int h, const clr_t& color ); + void draw_box( int x, int y, int w, int h, const clr_t& color ); //thicc + void draw_polygon( int count, vertex_t* vertices, const clr_t& col ); + void draw_circle( int x, int y, int r, const clr_t& col, int res = 48 ); + void draw_filled_circle( int x, int y, int r, const clr_t& col, int res = 48 ); + + template < FontAlign_t align = ALIGN_LEFT > //fuck ur sprintf nigga varargs nigga + void draw_string( HFont font, int x, int y, const clr_t& color, const wchar_t* msg, ... ) { + wchar_t* buffer = ( wchar_t* )_alloca( 2048 ); + va_list list{ }; + int wide, tall; + + memset( buffer, 0, 2048 ); + + __crt_va_start( list, msg ); + vswprintf_s( buffer, 1024, msg, list ); + __crt_va_end( list ); + + g_gmod.m_surface( )->GetTextSize( + font, buffer, wide, tall ); + + switch( align ) { + case ALIGN_CENTER: + x -= wide / 2; + break; + case ALIGN_RIGHT: + x -= wide; + break; + default: break; + } + + draw_string( buffer, font, x, y, color ); + } + + template < FontAlign_t align = ALIGN_LEFT > //debatable whether it should be center or not + void draw_string( HFont font, int x, int y, const clr_t& color, const char* msg, ... ) { + char* buffer = ( char* )_alloca( 1024 ); + va_list list{ }; + + memset( buffer, 0, 1024 ); + + __crt_va_start( list, msg ); + vsprintf_s( buffer, 1024, msg, list ); + __crt_va_end( list ); + + auto wide_str = util::ascii_to_unicode( buffer ); + draw_string< align >( font, x, y, color, wide_str.c_str( ) ); + } +}; + +END_REGION + +extern drawings::c_fonts g_fonts; +extern drawings::c_drawings g_renderer; \ No newline at end of file diff --git a/cheat/gmod/run_command.cpp b/cheat/gmod/run_command.cpp new file mode 100644 index 0000000..fad382d --- /dev/null +++ b/cheat/gmod/run_command.cpp @@ -0,0 +1,18 @@ +#include "hooks.hpp" +#include "base_cheat.hpp" +#include "context.hpp" + +void __fastcall hooks::run_command( void* ecx_, void* edx_, IClientEntity* entity, user_cmd_t* ucmd, IMoveHelper* move_helper) { + static auto run_command_o = g_gmod.m_prediction->get_old_function< decltype( &hooks::run_command ) >( 17 ); + if( g_gmod.m_panic ) return run_command_o( ecx_, edx_, entity, ucmd, move_helper ); + + if( g_settings.misc.no_recoil ) { + vec3_t angle; + g_gmod.m_engine( )->GetViewAngles( angle ); + run_command_o( ecx_, edx_, entity, ucmd, move_helper ); // weapon events are done during prediction, any viewangle change( could be recoil could be not ) during these weapon events will be changed back to its original state. + g_gmod.m_engine( )->SetViewAngles( angle ); + } + else { + run_command_o( ecx_, 0, entity, ucmd, move_helper ); + } +} diff --git a/cheat/gmod/scene_end.cpp b/cheat/gmod/scene_end.cpp new file mode 100644 index 0000000..1e42543 --- /dev/null +++ b/cheat/gmod/scene_end.cpp @@ -0,0 +1,43 @@ +#include "hooks.hpp" +#include "settings.hpp" +#include "base_cheat.hpp" +#include "context.hpp" + +void __fastcall hooks::scene_end( void* ecx_, void* edx_ ) { + static auto scene_end_o = g_csgo.m_render_view->get_old_function< decltype( &hooks::scene_end ) >( 9 ); + scene_end_o( edx_, 0 ); + + if( !g_csgo.m_panic && g_ctx.m_local && g_settings.visuals.chams.enabled( ) && g_settings.visuals.chams.ignore_z( ) ) { + g_ctx.m_drawing_screneend = true; + for( int i = 1; i < g_csgo.m_globals->m_maxclients; ++i ) { + auto ent = g_csgo.m_entlist( )->GetClientEntity< >( i ); + + if( ent && ent->is_valid( ) && !ent->m_bGunGameImmunity( ) ) { + if( ent == g_ctx.m_local && ent->m_bIsScoped( ) ) { + continue; + } + + int team = ent->m_iTeamNum( ); + bool enemy = team != g_ctx.m_local->m_iTeamNum( ); + + if( enemy || g_settings.visuals.chams.friendlies( ) ) { + IMaterial* mat = g_settings.visuals.chams.flat ? g_cheat.m_chams.m_materials.m_chams_flat : g_cheat.m_chams.m_materials.m_chams; + fclr_t clr_vis = enemy ? g_settings.visuals.chams.color_visible_enemy( ).to_fclr( ) : g_settings.visuals.chams.color_visible_friendly( ).to_fclr( ); + fclr_t clr_hid = enemy ? g_settings.visuals.chams.color_hidden_enemy( ).to_fclr( ) : g_settings.visuals.chams.color_hidden_friendly( ).to_fclr( ); + + mat->SetMaterialVarFlag( MATERIAL_VAR_IGNOREZ, true ); + g_cheat.m_chams.m_materials.force_material( mat, clr_hid ); + ent->ce( )->DrawModel( 0x1, 255 ); + + mat->SetMaterialVarFlag( MATERIAL_VAR_IGNOREZ, false ); + g_cheat.m_chams.m_materials.force_material( mat, clr_vis ); + ent->ce( )->DrawModel( 0x1, 255 ); + + g_csgo.m_model_render( )->ForcedMaterialOverride( nullptr ); + } + } + } + + g_ctx.m_drawing_screneend = false; + } +} \ No newline at end of file diff --git a/cheat/gmod/sdk.hpp b/cheat/gmod/sdk.hpp new file mode 100644 index 0000000..fbed28a --- /dev/null +++ b/cheat/gmod/sdk.hpp @@ -0,0 +1,26 @@ +#pragma once +#include "vector.hpp" + +#include "IClientMode.hpp" +#include "CHLClient.hpp" +#include "ISurface.hpp" +#include "IPanel.hpp" +#include "IVEngineClient.hpp" +#include "IClientEntityList.hpp" +#include "GlobalVars_t.hpp" +#include "IPrediction.hpp" +#include "ICvar.hpp" +#include "IVModelInfoClient.hpp" +#include "IMaterialSystem.hpp" +#include "IEngineTrace.hpp" +#include "IVRenderView.hpp" +#include "IPhysicsSurfaceProps.hpp" +#include "CUtlVector.hpp" +#include "IMemAlloc.hpp" +#include "IGameEventManager.hpp" +#include "KeyValues.hpp" +#include "CInput.hpp" +#include "bf_write.hpp" +#include "CLuaShared.hpp" + +#include "c_base_player.hpp" \ No newline at end of file diff --git a/cheat/gmod/send_datagram.cpp b/cheat/gmod/send_datagram.cpp new file mode 100644 index 0000000..dc55887 --- /dev/null +++ b/cheat/gmod/send_datagram.cpp @@ -0,0 +1,29 @@ +#include "base_cheat.hpp" +#include "hooks.hpp" + +int __fastcall hooks::send_datagram( INetChannel* channel, void* edx_, void* datagram ) { + auto send_datagram_o = g_csgo.m_net_channel->get_old_function< decltype( &hooks::send_datagram ) >( 48 ); + if( g_csgo.m_panic || !g_settings.misc.net_fakelag || datagram ) { + return send_datagram_o( channel, 0, datagram ); + } + + int backup_state = channel->m_nInReliableState; + int backup_sequence = channel->m_nInSequenceNr; + //int backup_o_state = channel->m_nOutReliableState; + + if( g_settings.misc.net_fakelag != 4 && g_settings.misc.net_fakeping_amount ) + g_cheat.m_extra.add_latency( channel ); + + auto nci = g_csgo.m_engine( )->GetNetChannelInfo( ); + if( nci && g_settings.misc.net_fakelag == 4 && g_cheat.m_ragebot.can_fakeping( ) ) { + channel->m_nInReliableState = backup_state; + channel->m_nInSequenceNr = backup_sequence + 10; + } + + int ret = send_datagram_o( channel, 0, datagram ); + + channel->m_nInReliableState = backup_state; + channel->m_nInSequenceNr = backup_sequence; + + return ret; +} \ No newline at end of file diff --git a/cheat/gmod/settings.hpp b/cheat/gmod/settings.hpp new file mode 100644 index 0000000..0033391 --- /dev/null +++ b/cheat/gmod/settings.hpp @@ -0,0 +1,276 @@ +#pragma once +#include "simple_settings.hpp" +#include "strings.hpp" +#include "color.hpp" + +//later i will implement a way to load all config files + +namespace data +{ + extern SettingHolder holder_; + + class c_settings { + public: + void load( ) { + switch( menu.cur_setting ) { + case 0: + holder_.load( "", xors( "./garrysmod/cfg/money_legit.cfg" ) ); + break; + case 1: + holder_.load( "", xors( "./garrysmod/cfg/money_closet.cfg" ) ); + break; + case 2: + holder_.load( "", xors( "./garrysmod/cfg/money_rage1.cfg" ) ); + break; + case 3: + holder_.load( "", xors( "./garrysmod/cfg/money_rage2.cfg" ) ); + break; + } + } + + void save( ) { + switch( menu.cur_setting ) { + case 0: + holder_.save( "", xors( "./garrysmod/cfg/money_legit.cfg" ) ); + break; + case 1: + holder_.save( "", xors( "./garrysmod/cfg/money_closet.cfg" ) ); + break; + case 2: + holder_.save( "", xors( "./garrysmod/cfg/money_rage1.cfg" ) ); + break; + case 3: + holder_.save( "", xors( "./garrysmod/cfg/money_rage2.cfg" ) ); + break; + } + } + + struct { + con_var< bool > enabled{ &holder_, fnv( "rage_enabled" ), false }; + con_var< int > activation_type{ &holder_, fnv( "rage_activation_type" ), 0 }; + con_var< float > fov{ &holder_, fnv( "rage_fov" ), 0.f }; + con_var< int > hitbox{ &holder_, fnv( "rage_hitbox" ), false }; + con_var< bool > auto_fire{ &holder_, fnv( "rage_auto_fire" ), false }; + + struct { + con_var< bool > head{ &holder_, fnv( "rage_hitscan_head" ), true }; + con_var< bool > body{ &holder_, fnv( "rage_hitscan_body" ), true }; + con_var< bool > arms{ &holder_, fnv( "rage_hitscan_arms" ), false }; + con_var< bool > legs{ &holder_, fnv( "rage_hitscan_legs" ), false }; + } hitscan; + + con_var< bool > nospread{ &holder_, fnv( "rage_no_spread" ), false }; + con_var< bool > norecoil{ &holder_, fnv( "rage_no_recoil" ), false }; + con_var< bool > ignore_limbs_moving{ &holder_, fnv( "rage_ignore_limbs_moving" ), false }; + con_var< int > silent{ &holder_, fnv( "rage_silent" ), false }; + con_var< int > aimkey{ &holder_, fnv( "rage_key" ), 0 }; + con_var< bool > auto_scope{ &holder_, fnv( "rage_auto_scope" ), false }; + con_var< bool > auto_stop{ &holder_, fnv( "rage_auto_stop" ), false }; + con_var< bool > spread_limit{ &holder_, fnv( "rage_spread_limit" ), false }; + con_var< float > min_spread{ &holder_, fnv( "rage_min_spread" ), 100.f }; + con_var< bool > resolver{ &holder_, fnv( "rage_resolver" ), false }; + con_var< bool > resolver_override{ &holder_, fnv( "rage_resolver_override" ), false }; + con_var< int > resolver_override_key{ &holder_, fnv( "override_key" ), 0 }; + con_var< bool > bt_scan_all{ &holder_, fnv( "rage_scan_all_records" ), false }; + con_var< bool > bt_visualize{ &holder_, fnv( "rage_visualize_records" ), false }; + con_var< clr_t > bt_col{ &holder_, fnv( "rage_bt_color" ), clr_t( 150, 150, 150, 20 ) }; + con_var< bool > preserve_fps{ &holder_, fnv( "rage_preserve_fps" ), false }; + con_var< int > multipoint{ &holder_, fnv( "rage_multipoint" ), false }; + con_var< float > point_scale{ &holder_, fnv( "rage_point_scale" ), 1.0f }; + + con_var< int > selection_type{ &holder_, fnv( "rage_selection_type" ) }; + con_var< bool > prefer_moving{ &holder_, fnv( "rage_prefer_moving" ) }; + con_var< bool > prefer_low_hp{ &holder_, fnv( "rage_low_hp" ) }; + + con_var< bool > ignore_team{ &holder_, fnv( "rage_ignoreteam" ), false }; + con_var< bool > ignore_teamcolor{ &holder_, fnv( "rage_ignoreteamcolor" ), false }; + con_var< bool > ignore_spawnprot{ &holder_, fnv( "rage_ignorespawnprot" ), false }; + con_var< bool > ignore_noclip{ &holder_, fnv( "rage_ignorenoclip" ), false }; + + + + struct { + con_var< int > mode{ &holder_, fnv( "fakelag_mode" ), 0 }; + con_var< int > ticks{ &holder_, fnv( "fakelag_ticks" ), 0 }; + con_var< int > fluctuate{ &holder_, fnv( "fakelag_fluctuate" ), 0 }; + con_var< bool > in_air{ &holder_, fnv( "fakelag_in_air" ), false }; + con_var< bool > on_peek{ &holder_, fnv( "fakelag_on_peek" ), false }; + con_var< bool > in_move{ &holder_, fnv( "fakelag_in_move" ), false }; + con_var< bool > in_attack{ &holder_, fnv( "fakelag_in_attack" ), false }; + con_var< bool > avoid_ground{ &holder_, fnv( "fakelag_avoid_ground" ), false }; + } fakelag; + + con_var< bool > anti_aim{ &holder_, fnv( "rage_anti_aim" ), false }; + con_var< bool > dormant_check{ &holder_, fnv( "rage_dormant_check" ), false }; + con_var< bool > at_players{ &holder_, fnv( "rage_at_players" ), false }; + con_var< int > pitch{ &holder_, fnv( "rage_pitch" ), 0 }; + con_var< int > pitch_offset{ &holder_, fnv( "rage_pitch_offset" ), 0 }; + + con_var< int > real_yaw{ &holder_, fnv( "rage_real_yaw" ), 0 }; + con_var< int > real_yaw_add{ &holder_, fnv( "rage_real_yaw_add" ), 0 }; + con_var< int > real_yaw_jitter{ &holder_, fnv( "rage_real_jitter" ), 0 }; + + con_var< int > fake_yaw{ &holder_, fnv( "rage_fake_yaw" ), 0 }; + con_var< int > fake_yaw_add{ &holder_, fnv( "rage_fake_yaw_add" ), 0 }; + con_var< int > fake_yaw_jitter{ &holder_, fnv( "rage_fake_jitter" ), 0 }; + + con_var< int > real_yaw_moving{ &holder_, fnv( "rage_real_yaw_moving" ), 0 }; + con_var< int > real_yaw_moving_add{ &holder_, fnv( "rage_real_yaw_moving_add" ), 0 }; + con_var< int > real_moving_jitter{ &holder_, fnv( "rage_real_moving_jitter" ), 0 }; + + con_var< int > fake_yaw_moving{ &holder_, fnv( "rage_fake_yaw_moving" ), 0 }; + con_var< int > fake_yaw_moving_add{ &holder_, fnv( "rage_fake_yaw_moving_add" ), 0 }; + con_var< int > fake_moving_jitter{ &holder_, fnv( "rage_fake_moving_jitter" ), 0 }; + + con_var< int > edge_detection{ &holder_, fnv( "rage_edge_dtc" ), 0 }; + con_var< int > edge_dtc_jitter{ &holder_, fnv( "rage_edge_dtc_jitter" ), 0 }; + + con_var< int > edge_dtc_normal{ &holder_, fnv( "rage_edge_dtc_normal" ), 0 }; + con_var< int > edge_dtc_type{ &holder_, fnv( "rage_edge_dtc_type" ), 0 }; + con_var< int > edge_dtc_standing{ &holder_, fnv( "rage_edge_dtc_standing" ), 100 }; + con_var< int > edge_dtc_moving{ &holder_, fnv( "rage_edge_dtc_moving" ), 100 }; + con_var< int > edge_dtc_priority{ &holder_, fnv( "rage_edge_dtc_priority" ), 0 }; + + con_var< bool > break_lby{ &holder_, fnv( "rage_break_lby" ), 0 }; + con_var< int > lby_delta{ &holder_, fnv( "rage_lby_delta" ), 0 }; + + con_var< bool > fakewalk{ &holder_, fnv( "rage_fakewalk" ), 0 }; + con_var< int > fakewalk_key{ &holder_, fnv( "rage_fakewalk_key" ), 0 }; + con_var< int > fakewalk_ticks{ &holder_, fnv( "rage_fakewalk_ticks" ), 7 }; + + con_var< bool > draw_angles{ &holder_, fnv( "rage_draw_angles" ), false }; + con_var< clr_t > real_color{ &holder_, fnv( "rage_real_color" ), clr_t( 255, 255, 255, 150 ) }; + con_var< clr_t > lby_color{ &holder_, fnv( "rage_lby_color" ), clr_t( 231, 105, 105, 150 ) }; + + con_var< bool > angle_step{ &holder_, fnv( "rage_angle_step" ), false }; + con_var< int > angle_step_degrees{ &holder_, fnv( "range_angle_step_degrees" ), false }; + } rage; + + struct { + struct { + con_var< bool > enabled{ &holder_, fnv( "visuals_chams_enabled" ), 0 }; + con_var< bool > flat{ &holder_, fnv( "visuals_chams_flat" ), 0 }; + con_var< bool > ignore_z{ &holder_, fnv( "visuals_chams_ignore_z" ), 0 }; + con_var< float > reflectivity{ &holder_, fnv( "visuals_chams_reflectivity" ), 1.0f }; + con_var< float > shine{ &holder_, fnv( "visuals_chams_shine" ), 1.0f }; + con_var< bool > friendlies{ &holder_, fnv( "visuals_chams_friendlies" ), 0 }; + con_var< clr_t > color_visible_friendly{ &holder_, fnv( "visuals_chams_color_friendly" ), clr_t( 0, 255, 255 ) }; + con_var< clr_t > color_visible_enemy{ &holder_, fnv( "visuals_chams_color_enemy" ), clr_t( 255, 255, 0 ) }; + con_var< clr_t > color_hidden_friendly{ &holder_, fnv( "visuals_chams_color_h_friendly" ), clr_t( 0, 0, 255 ) }; + con_var< clr_t > color_hidden_enemy{ &holder_, fnv( "visuals_chams_color_h_enemy" ), clr_t( 255, 0, 0 ) }; + } chams; + + con_var< int > activation_type{ &holder_, fnv( "visuals_activation" ), false }; + con_var< bool > box{ &holder_, fnv( "visuals_box" ), false }; + con_var< bool > dormant{ &holder_, fnv( "visuals_dormant" ), false }; + con_var< bool > health{ &holder_, fnv( "visuals_health" ), false }; + con_var< bool > weapon{ &holder_, fnv( "visuals_weapon" ), false }; + con_var< bool > name{ &holder_, fnv( "visuals_name" ), false }; + con_var< bool > rank{ &holder_, fnv( "visuals_rank" ), false }; + con_var< bool > out_of_pov{ &holder_, fnv( "visuals_out_of_pov" ), false }; + con_var< bool > ignore_team{ &holder_, fnv( "visuals_ignoreteam" ), false }; + con_var< bool > ignore_teamcolor{ &holder_, fnv( "visuals_ignoreteamcolor" ), false }; + + con_var< bool > skeleton{ &holder_, fnv( "visuals_skeleton" ) }; + con_var< bool > glow{ &holder_, fnv( "visuals_glow" ), false }; + con_var< bool > flags{ &holder_, fnv( "visuals_flags" ), false }; + con_var< bool > resolver_indicator{ &holder_, fnv( "visuals_resolver_indicator" ), false }; + con_var< bool > ammo{ &holder_, fnv( "visuals_ammo" ), false }; + con_var< bool > money{ &holder_, fnv( "visuals_money" ) }; + con_var< bool > ping{ &holder_, fnv( "visuals_ping" ) }; + con_var< bool > floating_ragdolls{ &holder_, fnv( "visuals_floating_ragdolls" ) }; + con_var< clr_t > box_enemy{ &holder_, fnv( "visuals_clr_enemy" ), clr_t( 0, 255, 255 ) }; + con_var< clr_t > box_friendly{ &holder_, fnv( "visuals_clr_friendly" ), clr_t( 255, 0, 255 ) }; + + con_var< clr_t > glow_enemy{ &holder_, fnv( "visuals_glow_enemy" ), clr_t( 255, 0, 255, 150 ) }; + con_var< clr_t > glow_friendly{ &holder_, fnv( "visuals_glow_friendly" ), clr_t( 255, 120, 0, 150 ) }; + con_var< clr_t > skeleton_enemy{ &holder_, fnv( "visuals_skeleton_enemy" ), clr_t( 255, 255, 255 ) }; + con_var< clr_t > skeleton_friendly{ &holder_, fnv( "visuals_skeleton_friendly" ), clr_t( 255, 255, 255 ) }; + + con_var< bool > bullet_tracers{ &holder_, fnv( "visuals_bullet_tracers" ), false }; + + con_var< int > key{ &holder_, fnv( "visuals_key" ), 0 }; + con_var< bool > hitmarkers{ &holder_, fnv( "visuals_hitmarkers" ), false }; + bool active = true; + + con_var< bool > world_modulate{ &holder_, fnv( "visuals_world_modulate" ), false }; + con_var< bool > night_mode{ &holder_, fnv( "visuals_night_mode" ), false }; + con_var< bool > transparent_props{ &holder_, fnv( "visuals_transparent_props" ), false }; + + con_var< bool > recoil_crosshair{ &holder_, fnv( "misc_recoil_crosshair" ), false }; + con_var< bool > autowall_crosshair{ &holder_, fnv( "visual_recoil_crosshair" ), false }; + con_var< bool > draw_spread{ &holder_, fnv( "visual_draw_spread" ), false }; + con_var< bool > snipers_crosshair{ &holder_, fnv( "visuals_sniper_crosshair" ), false }; + con_var< bool > grenade_prediction{ &holder_, fnv( "visuals_grenade_prediction" ), false }; + + con_var< int > weapon_esp{ &holder_, fnv( "visuals_weapon_esp" ), 0 }; + con_var< int > grenade_esp{ &holder_, fnv( "visuals_weapon_esp" ), 0 }; + + con_var< clr_t > weapon_esp_clr{ &holder_, fnv( "visuals_weapon_esp_clr" ), clr_t( 255, 255, 255, 180 ) }; + con_var< clr_t > grenade_esp_clr{ &holder_, fnv( "visuals_grenade_esp_clr" ), clr_t( 255, 255, 255, 180 ) }; + + con_var< bool > spec_list{ &holder_, fnv( "visuals_spec_list" ), false }; + con_var< bool > radar{ &holder_, fnv( "visuals_radar" ), false }; + } visuals; + + struct { + con_var< bool > watermark{ &holder_, fnv( "misc_watermark" ), false }; + con_var< bool > bunny_hop{ &holder_, fnv( "misc_bhop" ), false }; + con_var< bool > auto_strafe{ &holder_, fnv( "misc_autostrafe" ), false }; + con_var< bool > circle_strafe{ &holder_, fnv( "misc_circlestrafe" ), false }; + con_var< int > circle_strafe_key{ &holder_, fnv( "misc_circle_key" ), 0 }; + con_var< bool > edge_jump{ &holder_, fnv( "misc_edgejump" ), false }; + con_var< int > edge_jump_key{ &holder_, fnv( "misc_edge_jump_key" ), false }; + con_var< bool > auto_jumpbug{ &holder_, fnv( "misc_auto_jumpbug" ), false }; + con_var< int > auto_jumpbug_key{ &holder_, fnv( "misc_auto_jumpbug_key" ), 0 }; + con_var< bool > show_jump_stats{ &holder_, fnv( "misc_show_jump_stats" ), 0 }; + con_var< int > viewmodel_fov{ &holder_, fnv( "misc_viewmodel_fov" ), 0 }; + con_var< int > fov_changer{ &holder_, fnv( "fov_changer" ), 90 }; + con_var< bool > clantag_changer{ &holder_, fnv( "misc_clantag" ), false }; + con_var< bool > log_hits{ &holder_, fnv( "misc_log_hits" ) }; + con_var< int > name_changer{ &holder_, fnv( "misc_namechanger" ), 0 }; + con_var< bool > thirdperson{ &holder_, fnv( "misc_thirdperson" ), false }; + con_var< int > thirdperson_key{ &holder_, fnv( "misc_tp_key" ), 0 }; + con_var< bool > auto_accept{ &holder_, fnv( "misc_autoaccept" ), false }; + con_var< int > auto_accept_delay{ &holder_, fnv( "misc_autoaccept_delay" ), 0 }; + con_var< int > net_fakelag{ &holder_, fnv( "misc_net_fakelag" ), false }; + con_var< int > net_fakeping_amount{ &holder_, fnv( "net_fakeping_amount" ), 0 }; + con_var< int > net_fakeping_key{ &holder_, fnv( "net_fakeping_key" ), 0 }; + bool net_fakeping_active = false; + + con_var< bool > rank_reveal{ &holder_, fnv( "misc_rank_reveal" ), 0 }; + con_var< bool > unlock_inventory{ &holder_, fnv( "misc_unlock_inventory" ), 0 }; + con_var< bool > auto_revolver{ &holder_, fnv( "misc_auto_revolver" ), 0 }; + con_var< bool > no_scope{ &holder_, fnv( "misc_no_scope" ), false }; + con_var< bool > no_recoil{ &holder_, fnv( "misc_no_recoil" ), false }; + con_var< bool > no_smoke{ &holder_, fnv( "misc_no_smoke" ), false }; + con_var< bool > no_flash{ &holder_, fnv( "misc_no_flash" ), false }; + con_var< bool > transparent_vm{ &holder_, fnv( "misc_transparent_vm" ), false }; + con_var< bool > disable_post_process{ &holder_, fnv( "misc_disable_post_process" ), false }; + con_var< int > recording_start_key{ &holder_, fnv( "recording_start_key" ), 0 }; + con_var< int > recording_stop_key{ &holder_, fnv( "recording_stop_key" ), 0 }; + con_var< int > recording_show_angles{ &holder_, fnv( "recording_show_angles" ), 0 }; + + con_var< bool > use_spam{ &holder_, fnv( "misc_use_spam" ), false }; + con_var< int > use_spam_key{ &holder_, fnv( "misc_use_spam_key" ), 0 }; + + bool recorder_enable = false; + } misc; + + struct { + con_var< uint8_t > menu_color_1r{ &holder_, fnv( "menu_color_1r" ), 231 }; + con_var< uint8_t > menu_color_1g{ &holder_, fnv( "menu_color_1g" ), 105 }; + con_var< uint8_t > menu_color_1b{ &holder_, fnv( "menu_color_1b" ), 105 }; + + con_var< uint8_t > menu_color_2r{ &holder_, fnv( "menu_color_2r" ), 0xf4 }; + con_var< uint8_t > menu_color_2g{ &holder_, fnv( "menu_color_2g" ), 0x7c }; + con_var< uint8_t > menu_color_2b{ &holder_, fnv( "menu_color_2b" ), 0xa8 }; + + bool open = false; + bool logs_enable = false; + int cur_setting = 0; + } menu; + }; +} + +extern data::c_settings g_settings; \ No newline at end of file diff --git a/cheat/gmod/simple_settings.cpp b/cheat/gmod/simple_settings.cpp new file mode 100644 index 0000000..156151a --- /dev/null +++ b/cheat/gmod/simple_settings.cpp @@ -0,0 +1,32 @@ +#include "settings.hpp" + +SettingHolder data::holder_{ "iloveyou" }; +data::c_settings g_settings; + +#pragma warning(disable: 4996) + +void simple_save( const char* path, const char* name, const void* src, size_t size, const char* filename ) { + auto buffer = reinterpret_cast< char* >( _alloca( size * 2 + 1 ) ); + auto data = reinterpret_cast< const uint8_t* >( src ); + + for ( size_t i = 0; i < size; i++ ) + sprintf( &buffer[ 2 * i ], "%02X", data[ i ] ); + + WritePrivateProfileStringA( path, name, buffer, filename ); +} + +void simple_load( const char* path, const char* name, void* dest, size_t size, const char* filename ) { + auto buffer = reinterpret_cast< char* >( _alloca( size * 2 + 1 ) ); + auto data = reinterpret_cast< uint8_t* >( dest ); + + GetPrivateProfileStringA( path, name, "", buffer, size * 2 + 1, filename ); + + if ( *buffer == 0 ) + return; + + for ( size_t i = 0; i < size; i++ ) { + unsigned temp; + sscanf( &buffer[ 2 * i ], "%02X", &temp ); + data[ i ] = temp; + } +} \ No newline at end of file diff --git a/cheat/gmod/simple_settings.hpp b/cheat/gmod/simple_settings.hpp new file mode 100644 index 0000000..e3a8655 --- /dev/null +++ b/cheat/gmod/simple_settings.hpp @@ -0,0 +1,171 @@ +#pragma once +#include +#include +#include +#include + +#include "util.hpp" +#include "fnv.hpp" + +//nama stuff +extern void simple_save( const char* path, const char* name, const void* src, size_t size, const char* filename ); +extern void simple_load( const char* path, const char* name, void* dest, size_t size, const char* filename ); + +class ISettingNode { +public: + virtual ~ISettingNode( ) = default; + + virtual void load( const char* path, const char* file ) = 0; + virtual void save( const char* path, const char* file ) const = 0; + virtual void register_( ISettingNode* node_ptr ) = 0; + virtual hash_t get_hash( ) { return 0; } +}; + +class SettingHolder : public ISettingNode { +public: + __forceinline SettingHolder( const char* name ) : name_( name ) {} + __forceinline SettingHolder( SettingHolder* holder_ptr, const char* name ) : name_( name ) { holder_ptr->register_( this ); } + + void register_( ISettingNode* node_ptr ) override { + setting_nodes_.push_back( node_ptr ); + } + + void load( const char* path, const char* file ) override { + char full_path[ 64 ]; + strcpy_s( full_path, path ); + strcat_s( full_path, "_" ); + strcat_s( full_path, name_ ); + for ( auto x : setting_nodes_ ) + x->load( full_path, file ); + } + + void save( const char* path, const char* file ) const override { + char full_path[ 64 ]; + strcpy_s( full_path, path ); + strcat_s( full_path, "_" ); + strcat_s( full_path, name_ ); + for ( auto x : setting_nodes_ ) + x->save( full_path, file ); + } + + auto& get_nodes( ) { + return setting_nodes_; + } + +private: + const char* name_; + std::vector setting_nodes_; +}; + +class ISetting : public ISettingNode { + void register_( ISettingNode* node_ptr ) override {} +public: + virtual void set( float value ) = 0; + virtual void set( int value ) = 0; + virtual void set( ulong_t value ) = 0; + virtual std::string get_string( ) = 0; + virtual hash_t get_hash( ) = 0; +}; + +template < size_t L > +class SettingString : ISetting { +public: + __forceinline SettingString( SettingHolder* holder_ptr, hash_t hash ) : + m_name( name ), m_value( "" ) { + holder_ptr->register_( this ); + }; + + void load( const char* path, const char* file ) override { + GetPrivateProfileStringA( path, std::to_string( m_name ).c_str( ), "", m_value, L, file ); + } + + void save( const char* path, const char* file ) const override { + WritePrivateProfileStringA( path, std::to_string( m_name ).c_str( ), m_value, file ); + } + + char* get( ) { + return m_value; + } + +private: + char m_value[ L ]; + hash_t m_name; +}; + +template < typename T > +class con_var : public ISetting { +public: + __forceinline con_var( SettingHolder* holder_ptr, hash_t name ) : + name_( name ), + is_float_( std::is_floating_point_v< T > ), + is_integral_( std::is_integral_v< T > ) { + holder_ptr->register_( this ); + } + __forceinline con_var( SettingHolder* holder_ptr, hash_t name , const T& rhs ) : + value_( rhs ), + name_( name ), + is_float_( std::is_floating_point_v< T > ), + is_integral_( std::is_integral_v< T > ) { + holder_ptr->register_( this ); + } + + void load( const char* path, const char* file ) override { simple_load( path, std::to_string( name_ ).c_str( ), &value_, sizeof( value_ ), file ); } + + void save( const char* path, const char* file ) const override { simple_save( path, std::to_string( name_ ).c_str( ), &value_, sizeof( value_ ), file ); } + + __forceinline operator T&( ) { return value_; } + __forceinline T* operator &( ) { return &value_; } + + __forceinline T& operator ()( ) { return value_; } + + virtual std::string get_string( ) { + if constexpr( std::is_arithmetic_v< T > ) { + return std::to_string( value_ ); + } + else { + return util::to_hex_str( *( ulong_t* )( &value_ ) ); + } + } + + virtual void set( float value ) { + if constexpr( std::is_arithmetic_v< T > ) { + value_ = ( T )( value ); + } + } + + virtual void set( int value ) { + if constexpr( std::is_arithmetic_v< T > ) { + value_ = ( T )( value ); + } + else { + value_ = *( T* )( &value ); + } + } + + virtual void set( ulong_t value ) { + if constexpr( sizeof( T ) == sizeof( ulong_t ) ) { + *( ulong_t* )( &value_ ) = value; + return; + } + + memcpy( &value_, &value, sizeof( value_ ) ); + } + + virtual hash_t get_hash( ) { + return name_; + } + + __forceinline bool is_floating_point( ) { + return is_float_; + } + + __forceinline bool is_integral( ) { + return is_integral_; + } + +private: + hash_t name_; + bool is_float_; + bool is_integral_; + T value_; +}; \ No newline at end of file diff --git a/cheat/gmod/skins.cpp b/cheat/gmod/skins.cpp new file mode 100644 index 0000000..9564abf --- /dev/null +++ b/cheat/gmod/skins.cpp @@ -0,0 +1,75 @@ +#include "skins.hpp" +#include "settings.hpp" +#include "context.hpp" +#include "interface.hpp" + +namespace features +{ + int c_skins::get_knife_index( ) { + switch( g_settings.misc.skins.knife( ) ) { + case 0: + return 0; + case 1: + return 500; + case 2: + return 505; + case 3: + return 506; + case 4: + return 507; + case 5: + return 508; + case 6: + return 509; + } + + return 0; + } + + const char* c_skins::get_model_str( ) { + switch( g_settings.misc.skins.knife( ) ) { + case 0: + return 0; + case 1: + return xors( "models/weapons/v_knife_bayonet.mdl" ); + case 2: + return xors( "models/weapons/v_knife_flip.mdl" ); + case 3: + return xors( "models/weapons/v_knife_gut.mdl" ); + case 4: + return xors( "models/weapons/v_knife_karam.mdl" ); + case 5: + return xors( "models/weapons/v_knife_m9_bay.mdl" ); + case 6: + return xors( "models/weapons/v_knife_tactical.mdl" ); + } + + return nullptr; + } + + void c_skins::override_knife( ) { + auto weapons = ( uint32_t* )( uintptr_t( g_ctx.m_local ) + 0x2DE8 ); + for( int i{ }; weapons[ i ]; ++i ) { + auto wep = g_csgo.m_entlist( )->GetClientEntityFromHandle< c_base_weapon >( weapons[ i ] ); + auto vm = g_csgo.m_entlist( )->GetClientEntityFromHandle< c_base_weapon >( g_ctx.m_local->m_hViewModel( ) ); + if( wep && wep->is_knife( ) ) { + int index = get_knife_index( ); + if( index ) { + int model = g_csgo.m_model_info( )->GetModelIndex( get_model_str( ) ); + + wep->m_iItemDefinitionIndex( ) = index; + wep->m_nModelIndex( ) = model; + if( weapons[ i ] == g_ctx.m_local->m_hActiveWeapon( ) ) { + vm->m_nModelIndex( ) = model; + } + } + } + } + } + + void c_skins::operator()( ) { + if( g_ctx.m_local && g_ctx.m_local->is_valid( ) ) { + override_knife( ); + } + } +} \ No newline at end of file diff --git a/cheat/gmod/skins.hpp b/cheat/gmod/skins.hpp new file mode 100644 index 0000000..4ce5971 --- /dev/null +++ b/cheat/gmod/skins.hpp @@ -0,0 +1,14 @@ +#pragma once + +namespace features +{ + class c_skins { + private: + int get_knife_index( ); + const char* get_model_str( ); + + void override_knife( ); + public: + void operator()( ); + }; +} \ No newline at end of file diff --git a/cheat/gmod/strings.hpp b/cheat/gmod/strings.hpp new file mode 100644 index 0000000..dfdeb8b --- /dev/null +++ b/cheat/gmod/strings.hpp @@ -0,0 +1,162 @@ +//-------------------------------------------------------------------------------- +//-- XorCompileTime.hpp +// +// Author: frk +// Date: 12.12.2015 +// +//-------------------------------------------------------------------------------- + +#pragma once +#include +#include +#include + +#define BEGIN_NAMESPACE( x ) namespace x { +#define END_NAMESPACE } + +BEGIN_NAMESPACE( strenc ) + +constexpr auto time = __TIME__; +constexpr auto seed = static_cast< int >( time[ 7 ] ) + static_cast< int >( time[ 6 ] ) * 10 + static_cast< int >( time[ 4 ] ) * 60 + static_cast< int >( time[ 3 ] ) * 600 + static_cast< int >( time[ 1 ] ) * 3600 + static_cast< int >( time[ 0 ] ) * 36000; + +// 1988, Stephen Park and Keith Miller +// "Random Number Generators: Good Ones Are Hard To Find", considered as "minimal standard" +// Park-Miller 31 bit pseudo-random number generator, implemented with G. Carta's optimisation: +// with 32-bit math and without division + +template < int N > +struct RandomGenerator { +private: + static constexpr unsigned a = 16807; // 7^5 + static constexpr unsigned m = 2147483647; // 2^31 - 1 + + static constexpr unsigned s = RandomGenerator< N - 1 >::value; + static constexpr unsigned lo = a * ( s & 0xFFFF ); // Multiply lower 16 bits by 16807 + static constexpr unsigned hi = a * ( s >> 16 ); // Multiply higher 16 bits by 16807 + static constexpr unsigned lo2 = lo + ( ( hi & 0x7FFF ) << 16 ); // Combine lower 15 bits of hi with lo's upper bits + static constexpr unsigned hi2 = hi >> 15; // Discard lower 15 bits of hi + static constexpr unsigned lo3 = lo2 + hi; + +public: + static constexpr unsigned max = m; + static constexpr unsigned value = lo3 > m ? lo3 - m : lo3; +}; + +template <> +struct RandomGenerator< 0 > { + static constexpr unsigned value = seed; +}; + +template < int N, int M > +struct RandomInt { + static constexpr auto value = RandomGenerator< N + 1 >::value % M; +}; + +template < int N > +struct RandomChar { + static const char value = static_cast< char >( 1 + RandomInt< N, 0x7F - 1 >::value ); +}; + +template < size_t N, int K > +struct XorString { +private: + const char _key; + std::array< char, N + 1 > _encrypted; + bool decrypted = false; + + constexpr char enc( char c ) const { + return c ^ _key; + } + + char dec( char c ) const { + return c ^ _key; + } + +public: + template < size_t... Is > + constexpr __forceinline XorString( const char* const str, std::index_sequence< Is... > ) : _key( RandomChar< K >::value ), _encrypted{ enc( str[ Is ] )... } { + } + + __forceinline const char* decrypt( void ) { + if( !decrypted ) { + for( size_t i = 0; i < N; ++i ) { + _encrypted[ i ] = dec( _encrypted[ i ] ); + } + _encrypted[ N ] = '\0'; + decrypted = true; + } + printf( "N: %u K: %d str: %s address: %08x\n", N, K, _encrypted.data( ), _encrypted.data( ) ); + + return _encrypted.data( ); + } +}; + +//-------------------------------------------------------------------------------- +//-- Note: XorStr will __NOT__ work directly with functions like printf. +// To work with them you need a wrapper function that takes a const char* +// as parameter and passes it to printf and alike. +// +// The Microsoft Compiler/Linker is not working correctly with variadic +// templates! +// +// Use the functions below or use std::cout (and similar)! +//-------------------------------------------------------------------------------- + +static auto w_printf = [ ]( const char* fmt, ... ) { + va_list args; + va_start( args, fmt ); + vprintf_s( fmt, args ); + va_end( args ); +}; + +static auto w_printf_s = [ ]( const char* fmt, ... ) { + va_list args; + va_start( args, fmt ); + vprintf_s( fmt, args ); + va_end( args ); +}; + +static auto w_sprintf = [ ]( char* buf, const char* fmt, ... ) { + va_list args; + va_start( args, fmt ); + vsprintf( buf, fmt, args ); + va_end( args ); +}; + +static auto w_sprintf_s = [ ]( char* buf, size_t buf_size, const char* fmt, ... ) { + va_list args; + va_start( args, fmt ); + vsprintf_s( buf, buf_size, fmt, args ); + va_end( args ); +}; + +//for compatibility with debug mode +struct debug_ret { +private: + const char* ret; + +public: + debug_ret( const char* str ) : ret( str ) { }; + + auto decrypt( ) { + return ret; + } +}; + +constexpr size_t strlen_ct( const char* const str ) { + size_t out = 1; + + for( ; str[ out ] != '\0'; ++out ); + + return out; +} + +#if 0 +#define xors_raw( s ) ( strenc::XorString< strenc::strlen_ct( s ), __COUNTER__ >( s, std::make_index_sequence< sizeof( s ) - 1>() ) ) +#define xors( s ) ( strenc::XorString< strenc::strlen_ct( s ), __COUNTER__ >( s, std::make_index_sequence< sizeof( s ) - 1>() ).decrypt() ) +#else +#define xors_raw( s ) ( [ ]{ strenc::debug_ret ret{ s }; return ret; }( ) ) +#define xors( s ) ( s ) +#endif + +END_NAMESPACE \ No newline at end of file diff --git a/cheat/gmod/ui.h b/cheat/gmod/ui.h new file mode 100644 index 0000000..b25a98d --- /dev/null +++ b/cheat/gmod/ui.h @@ -0,0 +1,457 @@ +#pragma once +#include "ui_base_item.h" +#include "ui_menu.h" +#include "ui_form.h" +#include "ui_render.h" +#include "ui_checkbox.h" +#include "ui_tab_manager.h" +#include "ui_slider.h" +#include "ui_dropdown.h" +#include "ui_key_picker.h" +#include "ui_button.h" +#include "ui_color_picker.h" +#include "ui_label.h" + +#include "settings.hpp" +#include "base_cheat.hpp" + +namespace ui +{ + static std::string date_str = __DATE__; + auto menu = std::make_shared< ui::c_menu >( 10, 10, 580, 470, xors( "quebot" ), + __DATE__ ); + + static void render( ) { + static bool was_setup = false; + if ( !was_setup ) { + std::transform( date_str.begin( ), date_str.end( ), date_str.begin( ), + [ ]( char c ) { return ::tolower( c ); } + ); + + menu.reset( ); + menu = std::make_shared< ui::c_menu >( 10, 10, 580, 470, xors( "moneybot" ), + date_str.c_str( ) ); + auto tab_sheet = std::make_shared< ui::c_tab_manager >( ); + + //todo: replace with icons? + + auto tab_rage = std::make_shared< ui::c_tab_sheet >( xors( "rage" ), &icons::sprite_rage ); { + auto subtab_sheet = std::make_shared< ui::c_subtab_manager >( ); + + auto subtab_aimbot = std::make_shared< ui::c_tab_sheet >( xors( "aimbot" ) ); { + auto left_column = std::make_shared< ui::base_item >( 0, 0, 0, 0 ); + auto right_column = std::make_shared< ui::base_item >( 220, -5, 0, 0 ); + + auto main_form = std::make_shared< ui::c_form >( 0, 0, 215, 0, xors( "main" ), 0 ); { + main_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "enabled" ), &g_settings.rage.enabled ) ); + main_form->add_item( std::make_shared< ui::c_slider< float > >( 0, 0, 120, 0.f, 180.f, xors( "max fov" ), &g_settings.rage.fov ) ); + + + main_form->add_item( std::make_shared< ui::c_dropdown< int > >( + 0, 0, 120, xors( "activation type" ), + &g_settings.rage.activation_type, + &dropdowns::activation_types_aimbot ) )->add_item( + std::make_shared< ui::c_key_picker_small >( 195, 0, &g_settings.rage.aimkey ) )->set_cond( + [ ]( ) { return g_settings.rage.activation_type == 1; } ); + + main_form->add_item( std::make_shared< ui::c_dropdown< > >( 0, 0, 120, xors( "silent" ), + &g_settings.rage.silent, &dropdowns::silent_aimbot_types ) ); + + + main_form->add_item( std::make_shared< ui::c_dropdown< int > >( 0, 0, 120, xors( "hitbox" ), + &g_settings.rage.hitbox, &dropdowns::hitboxes ) ); + + main_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "autofire" ), &g_settings.rage.auto_fire ) ); + } + + auto accuracy_form = std::make_shared< ui::c_form >( 0, 0, 215, 0, xors( "accuracy" ) ); { + accuracy_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "no spread" ), &g_settings.rage.nospread ) ); + accuracy_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "no recoil" ), &g_settings.rage.norecoil ) ); + } + + auto selection_form = std::make_shared< ui::c_form >( 0, 0, 215, 0, xors( "selection" ) ); { + selection_form->add_item( std::make_shared< ui::c_dropdown< > >( 0, 0, 120, xors( "type" ), &g_settings.rage.selection_type, &dropdowns::selection_type ) ); + } + + auto filter_form = std::make_shared< ui::c_form >( 0, 0, 215, 0, xors( "filters" ) ); { + filter_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "ignore team" ), &g_settings.rage.ignore_team ) ); + filter_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "ignore team color" ), &g_settings.rage.ignore_teamcolor ) ); + filter_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "ignore spawn protection" ), &g_settings.rage.ignore_spawnprot ) ); + } + + left_column->add_item( main_form ); + right_column->add_item( accuracy_form ); + right_column->add_item( selection_form ); + right_column->add_item( filter_form ); + + subtab_aimbot->add_item( left_column ); + subtab_aimbot->add_item( right_column ); + } + + //auto subtab_antiaim = std::make_shared< ui::c_tab_sheet >( xors( "antiaim" ) ); { + // auto left_column = std::make_shared< ui::base_item >( 0, 0, 0, 0 ); + // auto right_column = std::make_shared< ui::base_item >( 220, -5, 0, 0 ); + // + // auto main_form = std::make_shared< ui::c_form >( 0, 0, 215, 0, xors( "main" ) ); { + // main_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "enabled" ), &g_settings.rage.anti_aim ) ); + // main_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "at players" ), &g_settings.rage.at_players ) ); + // main_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "dormant check" ), &g_settings.rage.dormant_check ) ); + // main_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "angle step" ), &g_settings.rage.angle_step ) ); + // main_form->add_item( std::make_shared< ui::c_slider< int > >( 0, 0, 140, 0, 45, &g_settings.rage.angle_step_degrees ) )->set_cond( + // [ ]( ) { return g_settings.rage.angle_step( ); } ); + // } + // + // auto pitch_form = std::make_shared< ui::c_form >( 0, 0, 215, 0, xors( "pitch" ) ); { + // pitch_form->add_item( std::make_shared< ui::c_dropdown< > >( 0, 0, 140, xors( "pitch" ), &g_settings.rage.pitch, &dropdowns::antiaim_pitch ) ); + // pitch_form->add_item( std::make_shared< ui::c_slider< int > >( 0, 0, 140, -89, 89, &g_settings.rage.pitch_offset ) )->set_cond( + // [ ]( ) { return g_settings.rage.pitch == 1; } ); + // } + // + // auto yaw_form = std::make_shared< ui::c_form >( 0, 0, 215, 0, xors( "yaw" ), 200 ); { + // yaw_form->add_item( std::make_shared< ui::c_dropdown< > >( 0, 0, 140, xors( "real yaw" ), &g_settings.rage.real_yaw, &dropdowns::antiaim_yaw ) ); + // yaw_form->add_item( std::make_shared< ui::c_slider< int > >( 0, 0, 140, -100, 100, &g_settings.rage.real_yaw_add( ) ) )->set_cond( + // [ ]( ) { return !!g_settings.rage.real_yaw( ); } ); + // yaw_form->add_item( std::make_shared< ui::c_slider< int > >( 0, 0, 140, 0, 90, xors( "real yaw jitter" ), &g_settings.rage.real_yaw_jitter ) )->set_cond( + // [ ]( ) { return !!g_settings.rage.real_yaw( ); } ); + // yaw_form->add_item( std::make_shared< ui::c_dropdown< > >( 0, 0, 140, xors( "real yaw moving" ), &g_settings.rage.real_yaw_moving, &dropdowns::antiaim_yaw ) )->set_cond( + // [ ]( ) { return !!g_settings.rage.real_yaw( ); } ); + // yaw_form->add_item( std::make_shared< ui::c_slider< int > >( 0, 0, 140, -100, 100, &g_settings.rage.real_yaw_moving_add( ) ) )->set_cond( + // [ ]( ) { return !!g_settings.rage.real_yaw_moving( ) && !!g_settings.rage.real_yaw( ); } ); + // yaw_form->add_item( std::make_shared< ui::c_slider< int > >( 0, 0, 140, 0, 90, xors( "real yaw moving jitter" ), &g_settings.rage.real_moving_jitter ) )->set_cond( + // [ ]( ) { return !!g_settings.rage.real_yaw_moving( ) && !!g_settings.rage.real_yaw( ); } ); + // + // yaw_form->add_item( std::make_shared< ui::c_dropdown< > >( 0, 0, 140, xors( "fake yaw" ), &g_settings.rage.fake_yaw, &dropdowns::antiaim_yaw ) ); + // yaw_form->add_item( std::make_shared< ui::c_slider< int > >( 0, 0, 140, -100, 100, &g_settings.rage.fake_yaw_add( ) ) )->set_cond( + // [ ]( ) { return !!g_settings.rage.fake_yaw( ); } ); + // yaw_form->add_item( std::make_shared< ui::c_slider< int > >( 0, 0, 140, 0, 90, xors( "fake yaw jitter" ), &g_settings.rage.fake_yaw_jitter ) )->set_cond( + // [ ]( ) { return !!g_settings.rage.fake_yaw( ); } ); + // yaw_form->add_item( std::make_shared< ui::c_dropdown< > >( 0, 0, 140, xors( "fake yaw moving" ), &g_settings.rage.fake_yaw_moving, &dropdowns::antiaim_yaw ) )->set_cond( + // [ ]( ) { return !!g_settings.rage.fake_yaw( ); } ); + // yaw_form->add_item( std::make_shared< ui::c_slider< int > >( 0, 0, 140, -100, 100, &g_settings.rage.fake_yaw_moving_add( ) ) )->set_cond( + // [ ]( ) { return !!g_settings.rage.fake_yaw_moving( ) && !!g_settings.rage.fake_yaw( ); } ); + // yaw_form->add_item( std::make_shared< ui::c_slider< int > >( 0, 0, 140, 0, 90, xors( "fake yaw moving jitter" ), &g_settings.rage.fake_moving_jitter ) )->set_cond( + // [ ]( ) { return !!g_settings.rage.fake_yaw_moving( ) && !!g_settings.rage.fake_yaw( ); } ); + // } + // + // auto edge_form = std::make_shared< ui::c_form >( 0, 0, 215, 0, xors( "edge detection" ), 110 ); { + // edge_form->add_item( std::make_shared< ui::c_dropdown< > >( 0, 0, 140, xors( "edge" ), &g_settings.rage.edge_dtc_normal, + // &dropdowns::antiaim_edge ) ); + // + // edge_form->add_item( std::make_shared< ui::c_slider< int > >( 0, 0, 140, 70, 300, &g_settings.rage.edge_dtc_standing ) )->set_cond( + // [ ]( ) { return g_settings.rage.edge_dtc_normal( ) == 2; } ); + // + // edge_form->add_item( std::make_shared< ui::c_slider< int > >( 0, 0, 140, 70, 300, &g_settings.rage.edge_dtc_moving ) )->set_cond( + // [ ]( ) { return !!g_settings.rage.edge_dtc_normal( ); } ); + // + // edge_form->add_item( std::make_shared< ui::c_dropdown< > >( 0, 0, 140, xors( "edge type" ), &g_settings.rage.edge_dtc_type, + // &dropdowns::antiaim_edge_type ) )->set_cond( [ ]( ) { return g_settings.rage.edge_dtc_normal( ) == 2; } ); + // + // edge_form->add_item( std::make_shared< ui::c_dropdown< > >( 0, 0, 140, xors( "freestanding" ), + // &g_settings.rage.edge_detection, &dropdowns::antiaim_freestanding ) ); + // + // edge_form->add_item( std::make_shared< ui::c_dropdown< > >( 0, 0, 140, xors( "priority" ), + // &g_settings.rage.edge_dtc_priority, &dropdowns::edge_priority ) + // )->set_cond( [ ]( ) { return g_settings.rage.edge_dtc_normal( ) && g_settings.rage.edge_detection( ); } ); + // + // edge_form->add_item( std::make_shared< ui::c_slider< int > >( 0, 0, 140, 0, 45, xors( "fake jitter" ), &g_settings.rage.edge_dtc_jitter ) ); + // } + // + // auto lby_form = std::make_shared< ui::c_form >( 0, 0, 215, 0, xors( "lby breaker" ) ); { + // lby_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "break lby" ), &g_settings.rage.break_lby ) ); + // lby_form->add_item( std::make_shared< ui::c_slider< int > >( 0, 0, 140, 105, 195, &g_settings.rage.lby_delta ) )->set_cond( + // [ ]( ) { return g_settings.rage.break_lby( ); } ); + // + // auto angles_box = lby_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "draw angles" ), &g_settings.rage.draw_angles ) ); + // angles_box->set_cond( [ ]( ) { return g_settings.rage.break_lby( ); } ); + // angles_box->add_item( std::make_shared< ui::c_color_picker >( 160, 4, 15, &g_settings.rage.lby_color ) ); + // angles_box->add_item( std::make_shared< ui::c_color_picker >( 180, -9, 15, &g_settings.rage.real_color ) ); + // + // lby_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "fakewalk" ), &g_settings.rage.fakewalk ) )->add_item( + // std::make_shared< ui::c_key_picker_small >( 195, 0, &g_settings.rage.fakewalk_key ) + // ); + // lby_form->add_item( std::make_shared< ui::c_slider< int > >( 0, 0, 140, 7, 13, &g_settings.rage.fakewalk_ticks ) )->set_cond( + // [ ]( ) { return g_settings.rage.fakewalk; } ); + // } + // + // auto fakelag_form = std::make_shared< ui::c_form >( 0, 0, 215, 0, xors( "fakelag" ), 165 ); { + // fakelag_form->add_item( std::make_shared< ui::c_dropdown< > >( 0, 0, 140, xors( "mode" ), &g_settings.rage.fakelag.mode, &dropdowns::fakelag_types ) ); + // fakelag_form->add_item( std::make_shared< ui::c_slider< int > >( 0, 0, 140, 0, 15, xors( "max ticks" ), &g_settings.rage.fakelag.ticks ) ); + // fakelag_form->add_item( std::make_shared< ui::c_slider< int > >( 0, 0, 140, 0, 50, xors( "fluctuate" ), &g_settings.rage.fakelag.fluctuate ) )->set_cond( + // [ ]( ) { return g_settings.rage.fakelag.mode == 2; } + // ); + // + // auto flags_form = fakelag_form->add_item( std::make_shared< ui::c_form >( 0, 5, 139, 0, xors( "flags" ), 0, true ) ); + // + // flags_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "in air" ), &g_settings.rage.fakelag.in_air ) ); + // flags_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "on move" ), &g_settings.rage.fakelag.in_move ) ); + // flags_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "on peek" ), &g_settings.rage.fakelag.on_peek ) ); + // flags_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "while shooting" ), &g_settings.rage.fakelag.in_attack ) ); + // flags_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "avoid ground" ), &g_settings.rage.fakelag.avoid_ground ) ); + // } + // + // left_column->add_item( main_form ); + // left_column->add_item( pitch_form ); + // left_column->add_item( yaw_form ); + // + // right_column->add_item( edge_form ); + // right_column->add_item( lby_form ); + // right_column->add_item( fakelag_form ); + // + // subtab_antiaim->add_item( left_column ); + // subtab_antiaim->add_item( right_column ); + //} + + //subtab_sheet->add_item( subtab_antiaim ); + subtab_sheet->add_item( subtab_aimbot ); + + tab_rage->add_item( subtab_sheet ); + } + + + auto tab_visuals = std::make_shared< ui::c_tab_sheet >( xors( "visuals" ), &icons::sprite_visuals ); { + auto subtab_sheet = std::make_shared< ui::c_subtab_manager >( ); + + auto subtab_players = std::make_shared< ui::c_tab_sheet >( xors( "players" ) ); { + auto left_column = std::make_shared< ui::base_item >( 0, 0, 0, 0 ); + auto right_column = std::make_shared< ui::base_item >( 220, -5, 0, 0 ); + + auto main_form = std::make_shared< ui::c_form >( 0, 0, 215, 0, xors( "main" ) ); { + main_form->add_item( std::make_shared< ui::c_dropdown< > >( 0, 0, 120, xors( "activation type" ), &g_settings.visuals.activation_type, &dropdowns::activation_type_visuals ) )->add_item( + std::make_shared< ui::c_key_picker_small >( 195, 0, &g_settings.visuals.key ) )->set_cond( [ ]( ) { return g_settings.visuals.activation_type > 1; } ); + main_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "ignore team" ), &g_settings.visuals.ignore_team ) ); + main_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "ignore team color" ), &g_settings.visuals.ignore_teamcolor ) ); + + } + + auto player_form = std::make_shared< ui::c_form >( 0, 0, 215, 0, xors( "players" ) ); { + auto box_checkbox = player_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "box" ), &g_settings.visuals.box ) ); + box_checkbox->add_item( std::make_shared< ui::c_color_picker >( 160, 4, 15, &g_settings.visuals.box_enemy( ) ) ); + + auto skeleton_checkbox = player_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "skeleton" ), &g_settings.visuals.skeleton ) ); + skeleton_checkbox->add_item( std::make_shared< ui::c_color_picker >( 160, 2, 15, &g_settings.visuals.skeleton_enemy ) ); + + player_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "health" ), &g_settings.visuals.health ) ); + player_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "name" ), &g_settings.visuals.name ) ); + player_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "weapon" ), &g_settings.visuals.weapon ) ); + player_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "rank" ), &g_settings.visuals.rank ) ); + } + + auto hud_form = std::make_shared< ui::c_form >( 0, 0, 215, 0, xors( "hud" ) ); { + // hud_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "hitmarkers" ), &g_settings.visuals.hitmarkers ) ); will probably add soon. + hud_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "spectator list" ), &g_settings.visuals.spec_list ) ); + } + + //auto chams_form = std::make_shared< ui::c_form >( 0, 0, 215, 0, xors( "chams" ) ); { soon + // chams_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "enabled" ), &g_settings.visuals.chams.enabled( ) ) ); + // chams_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "through walls" ), &g_settings.visuals.chams.ignore_z( ) ) ); + // chams_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "friendlies" ), &g_settings.visuals.chams.friendlies( ) ) ); + // chams_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "flat" ), &g_settings.visuals.chams.flat( ) ) ); + // chams_form->add_item( std::make_shared< ui::c_slider< float > >( 0, 0, 120, 0.f, 1.f, xors( "reflectivity" ), &g_settings.visuals.chams.reflectivity ) + // )->set_cond( [ ]( ) { return !g_settings.visuals.chams.flat; } ); + // + // chams_form->add_item( std::make_shared< ui::c_slider< float > >( 0, 0, 120, 0.f, 1.f, xors( "shine" ), &g_settings.visuals.chams.shine ) + // )->set_cond( [ ]( ) { return !g_settings.visuals.chams.flat; } ); + // + // chams_form->add_item( std::make_shared< ui::c_color_picker >( 0, 0, 120, xors( "friendlies visible" ), &g_settings.visuals.chams.color_visible_friendly( ) ) )->set_cond( + // [ ]( ) { return g_settings.visuals.chams.friendlies( ); } ); + // chams_form->add_item( std::make_shared< ui::c_color_picker >( 0, 0, 120, xors( "friendlies hidden" ), &g_settings.visuals.chams.color_hidden_friendly( ) ) )->set_cond( + // [ ]( ) { return g_settings.visuals.chams.friendlies( ) && g_settings.visuals.chams.ignore_z( ); } ); + // chams_form->add_item( std::make_shared< ui::c_color_picker >( 0, 0, 120, xors( "enemies visible" ), &g_settings.visuals.chams.color_visible_enemy( ) ) ); + // chams_form->add_item( std::make_shared< ui::c_color_picker >( 0, 0, 120, xors( "enemies hidden" ), &g_settings.visuals.chams.color_hidden_enemy( ) ) )->set_cond( + // [ ]( ) { return g_settings.visuals.chams.ignore_z( ); } ); + //} + + left_column->add_item( main_form ); + left_column->add_item( player_form ); + + right_column->add_item( hud_form ); + //right_column->add_item( chams_form ); + + subtab_players->add_item( left_column ); + subtab_players->add_item( right_column ); + } + + auto subtab_other = std::make_shared< ui::c_tab_sheet >( xors( "other" ) ); { + auto left_column = std::make_shared< ui::base_item >( 0, 0, 0, 0 ); + auto right_column = std::make_shared< ui::base_item >( 220, -5, 0, 0 ); + + //auto world_form = std::make_shared< ui::c_form >( 0, 0, 215, 0, xors( "world" ) ); { + // world_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "world modulate" ), &g_settings.visuals.world_modulate ) ); + // world_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "night mode" ), &g_settings.visuals.night_mode ) + // )->set_cond( [ ]( ) { return g_settings.visuals.world_modulate; } ); + // world_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "transparent props" ), &g_settings.visuals.transparent_props ) + // )->set_cond( [ ]( ) { return g_settings.visuals.world_modulate; } ); + // + // world_form->add_item( std::make_shared< ui::c_dropdown< > >( 0, 0, 120, xors( "dropped weapons" ), &g_settings.visuals.weapon_esp, &dropdowns::world_esp_type ) + // )->add_item( std::make_shared< ui::c_color_picker >( 180, 4, 15, &g_settings.visuals.weapon_esp_clr( ) ) ); + // + // world_form->add_item( std::make_shared< ui::c_dropdown< > >( 0, 0, 120, xors( "grenades" ), &g_settings.visuals.grenade_esp, &dropdowns::world_esp_type ) + // )->add_item( std::make_shared< ui::c_color_picker >( 180, 4, 15, &g_settings.visuals.grenade_esp_clr( ) ) ); + //} + + + auto view_form = std::make_shared< ui::c_form >( 0, 0, 215, 0, xors( "view" ) ); { + view_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "watermark" ), &g_settings.misc.watermark ) ); + // will add soon + //view_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "thirdperson" ), &g_settings.misc.thirdperson( ) ) )->add_item( + // std::make_shared< ui::c_key_picker_small >( 195, 0, &g_settings.misc.thirdperson_key ) + //); + //view_form->add_item( std::make_shared< ui::c_slider< int > >( 0, 0, 120, 0, 40, xors( "viewmodel fov" ), &g_settings.misc.viewmodel_fov( ) ) ); + //view_form->add_item( std::make_shared< ui::c_slider< int > >( 0, 0, 120, 90, 130, xors( "view fov" ), &g_settings.misc.fov_changer( ) ) ); + } + + auto removals_form = std::make_shared< ui::c_form >( 0, 0, 215, 0, xors( "removals" ) ); { + removals_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "no recoil" ), &g_settings.misc.no_recoil ) ); + } + + left_column->add_item( view_form ); + left_column->add_item( removals_form ); + + //right_column->add_item( view_form ); + //right_column->add_item( removals_form ); + + subtab_other->add_item( left_column ); + //subtab_other->add_item( right_column ); + } + + subtab_sheet->add_item( subtab_other ); + subtab_sheet->add_item( subtab_players ); + + tab_visuals->add_item( subtab_sheet ); + } + + + auto tab_misc = std::make_shared< ui::c_tab_sheet >( xors( "miscellaneous" ), &icons::sprite_misc ); { + auto subtab_sheet = std::make_shared< ui::c_subtab_manager >( ); + + auto subtab_general = std::make_shared< ui::c_tab_sheet >( xors( "general" ) ); { + auto column_left = subtab_general->add_item( std::make_shared< ui::base_item >( 0, 0, 0, 0 ) ); + auto column_right = subtab_general->add_item( std::make_shared< ui::base_item >( 220, -5, 0, 0 ) ); + + auto movement_form = std::make_shared< ui::c_form >( 0, 0, 215, 0, xors( "movement" ) ); { + movement_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "auto strafe" ), &g_settings.misc.auto_strafe ) ); + movement_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "bhop" ), &g_settings.misc.bunny_hop( ) ) ); + //auto circle_box = movement_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "circle strafe" ), &g_settings.misc.circle_strafe ) ); + //circle_box->add_item( std::make_shared< ui::c_key_picker_small >( 195, 1, &g_settings.misc.circle_strafe_key ) ); + //circle_box->set_cond( [ ]( ) { return g_settings.misc.bunny_hop && g_settings.misc.auto_strafe; } ); + + movement_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "edge jump" ), &g_settings.misc.edge_jump( ) ) )->add_item( + std::make_shared< ui::c_key_picker_small >( 195, 1, &g_settings.misc.edge_jump_key( ) ) + ); + //movement_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "auto jumpbug" ), &g_settings.misc.auto_jumpbug( ) ) )->add_item( + // std::make_shared< ui::c_key_picker_small >( 195, 1, &g_settings.misc.auto_jumpbug_key( ) ) + //); + //movement_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "show jump stats" ), &g_settings.misc.show_jump_stats ) ); + } + + //auto identity_form = std::make_shared< ui::c_form >( 0, 1, 215, 0, xors( "identity" ) ); { + // // need to add + // identity_form->add_item( std::make_shared< ui::c_dropdown< > >( 0, 0, 120, xors( "name changer" ), &g_settings.misc.name_changer, + // &dropdowns::name_changers ) ); + //} + + + auto helpers_form = std::make_shared< ui::c_form >( 0, 0, 215, 0, xors( "helpers" ) ); { + // e spammer + helpers_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "use spammer" ), &g_settings.misc.use_spam ) )->add_item( + std::make_shared< ui::c_key_picker_small >( 195, 1, &g_settings.misc.use_spam_key ) ); + + } + + + + column_left->add_item( movement_form ); + //column_left->add_item( identity_form ); + + column_right->add_item( helpers_form ); + } + + + //auto subtab_movement_recorder = std::make_shared< ui::c_tab_sheet >( xors( "movement recorder" ) ); { + // auto main_form = std::make_shared< ui::c_form >( 0, 0, 215, 0, xors( "main" ) ); { + // main_form->add_item( std::make_shared< ui::c_label >( 0, 0, xors( "idle" ) ) ); + // main_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "enabled" ), &g_settings.misc.recorder_enable ) ); + // main_form->add_item( std::make_shared< ui::c_dropdown< > >( 0, 0, 120, xors( "show angles" ), &g_settings.misc.recording_show_angles, &dropdowns::recorder_angles ) ); + // main_form->add_item( std::make_shared< ui::c_label >( 0, 0, xors( "recording start key" ) ) )->add_item( + // std::make_shared< ui::c_key_picker_small >( 195, 0, &g_settings.misc.recording_start_key ) + // ); + // main_form->add_item( std::make_shared< ui::c_label >( 0, 0, xors( "recording stop key" ) ) )->add_item( + // std::make_shared< ui::c_key_picker_small >( 195, 0, &g_settings.misc.recording_stop_key ) + // ); + // + // main_form->add_item( std::make_shared< ui::c_button >( 0, 0, 120, 20, xors( "play" ), [ ]( ) { g_cheat.m_move_rec.play_back( ); } ) ); + // main_form->add_item( std::make_shared< ui::c_button >( 0, 0, 120, 20, xors( "stop playing" ), [ ]( ) { g_cheat.m_move_rec.stop_playback( ); } ) ); + // main_form->add_item( std::make_shared< ui::c_button >( 0, 0, 120, 20, xors( "clear recording" ), [ ]( ) { g_cheat.m_move_rec.clear_recording( ); } ) ); + // } + // + // subtab_movement_recorder->add_item( main_form ); + //} + // + //subtab_sheet->add_item( subtab_movement_recorder ); + subtab_sheet->add_item( subtab_general ); + + tab_misc->add_item( subtab_sheet ); + } + + + auto tab_config = std::make_shared< ui::c_tab_sheet >( xors( "config" ), &icons::sprite_config ); { + auto cfg_form = std::make_shared< ui::c_form >( 0, 10, 200, 75, xors( "config" ) ); + cfg_form->add_item( std::make_shared< ui::c_dropdown< > >( 0, 0, 180, xors( "setting" ), &g_settings.menu.cur_setting, &dropdowns::configs ) ); + cfg_form->add_item( std::make_shared< ui::c_button >( 0, 0, 85, 20, xors( "save" ), []( ) { g_settings.save( ); } ) ); + cfg_form->add_item( std::make_shared< ui::c_button >( 95, -25, 85, 20, xors( "load" ), []( ) { g_settings.load( ); } ) ); + + tab_config->add_item( cfg_form ); + } + + tab_sheet->add_item( tab_config ); + tab_sheet->add_item( tab_misc ); + tab_sheet->add_item( tab_visuals ); + tab_sheet->add_item( tab_rage ); + //tab_sheet->add_item( tab_legit ); + + menu->add_item( tab_sheet ); + + was_setup = true; + } + else { + //static auto movement_state = menu->find_item( + // xors( "movement recorder" ) )->find_item( + // xors( "main" ) )->find_item( + // xors( "idle" ) + // ); + // + //if( !g_settings.misc.recorder_enable ) + // movement_state->set_text( xors( "idle" ) ); + //else if( g_cheat.m_move_rec.is_playing( ) ) { + // movement_state->set_text( xors( "playing" ) ); + //} + //else if( g_cheat.m_move_rec.is_recording( ) ) { + // movement_state->set_text( xors( "recording" ) ); + //} + //else { + // movement_state->set_text( xors( "idle" ) ); + //} + + //static auto jitter_real = menu->find_item( xors( "real yaw jitter" ) ); + //jitter_real->set_text( g_settings.rage.real_yaw == 2 ? xors( "spin range" ) : xors( "real yaw jitter" ) ); + // + //static auto jitter_real_moving = menu->find_item( xors( "real yaw moving jitter" ) ); + //jitter_real_moving->set_text( g_settings.rage.real_yaw_moving == 2 ? xors( "spin range" ) : xors( "real yaw moving jitter" ) ); + // + //static auto jitter_fake = menu->find_item( xors( "fake yaw jitter" ) ); + //jitter_fake->set_text( g_settings.rage.fake_yaw == 2 ? xors( "spin range" ) : xors( "fake yaw jitter" ) ); + // + //static auto jitter_fake_moving = menu->find_item( xors( "fake yaw moving jitter" ) ); + //jitter_fake_moving->set_text( g_settings.rage.fake_yaw_moving == 2 ? xors( "spin range" ) : xors( "fake yaw moving jitter" ) ); + + render_item( menu.get( ) ); + + //reset the menu if home is pressed for debugging purposes + if ( g_input.is_key_pressed( KEYS_HOME ) ) { + menu.reset( ); + menu = std::make_shared< c_menu >( 10, 10, 580, 470, xors( "golden cheat" ) ); + was_setup = false; + } + } + } +} \ No newline at end of file diff --git a/cheat/gmod/ui_base_item.h b/cheat/gmod/ui_base_item.h new file mode 100644 index 0000000..68c2198 --- /dev/null +++ b/cheat/gmod/ui_base_item.h @@ -0,0 +1,164 @@ +#pragma once +#include +#include +#include + +#include "ui_draw.h" + +namespace ui +{ + //the offset between each item + constexpr int ITEM_OFFSET = 5; + + class base_item : public std::enable_shared_from_this< base_item > { + public: + base_item( ) { } + base_item( int x, int y, int w, int h, const char* name = nullptr ) : + m_x( x ), m_y( y ), m_width( w ), m_height( h ) { + if( name ) { + strcpy( m_text, name ); + } + } + + virtual void render( ) { }; + virtual bool is_hovered( ) { return false; } + virtual bool is_form( ) const { return false; } + + virtual void reset( ) { + m_y_offset = 0; + } + + virtual int get_total_height( ) const { + return m_height; + } + + void set_y_offset( int offset ) { + m_y_offset = offset; + } + + int get_y_offset( ) const { + return m_y_offset; + } + + auto add_item( std::shared_ptr< base_item > item ) { + item.get( )->m_parent = shared_from_this( ); + m_items.emplace( m_items.begin( ), item ); + + return item; + } + + auto& get_items( ) { return m_items; } + auto get_parent( ) { return m_parent; } + + virtual int x( ) const { return m_x; } + virtual int y( ) const { return m_y; } + virtual int w( ) const { return m_width; } + virtual int h( ) const { return m_height; } + + void set_x( int x ) { m_x = x; } + void set_y( int y ) { m_y = y; } + + void set_width( int w ) { m_width = w; } + void set_height( int h ) { m_height = h; } + + bool get_visible( ) const { + if( m_cond && !m_cond( ) ) { + return false; + } + + return m_visible; + } + + void set_cond( std::function< bool( ) > func ) { + m_cond = func; + } + + void set_visible( bool vis ) { m_visible = vis; } + void set_text( const char* text ) { + strcpy( m_text, text ); + } + auto get_text( ) const { + return m_text; + } + + std::shared_ptr< base_item > find_item( const char* name ) { + if( !m_items.empty( ) ) { + for( auto& it : m_items ) { + if( it->get_text( ) && !strcmp( it->get_text( ), name ) ) { + return it; + } + + auto it_find = it->find_item( name ); + if( it_find != it ) return it_find; + } + } + + return shared_from_this( ); + } + + auto get_top_parent( ) { + for( auto parent = m_parent; ; + parent = parent->get_parent( ) ) { + if( !parent->get_parent( ) ) { + return parent; + } + } + + return shared_from_this( ); + } + + int get_relative_x( ) { + int x = m_x; + for( auto parent = get_parent( ); !!parent; + parent = parent->get_parent( ) ) { + x += parent->x( ); + } + + return x; + } + + int get_relative_y( ) { + int y = m_y + get_y_offset( ); + for( auto parent = get_parent( ); !!parent; + parent = parent->get_parent( ) ) { + y += parent->y( ) + parent->get_y_offset( ); + } + + return y; + } + + void set_disabled( bool disabled ) { + m_disabled = disabled; + + for( auto& it : m_items ) { + it->set_disabled( disabled ); + } + } + + void set_disabled_callbacks( bool disabled ) { + auto top = get_top_parent( ); + + top->set_disabled( disabled ); + + m_disabled = false; + } + + protected: + int m_x{ }; + int m_y{ }; + + int m_width{ }; + int m_height{ }; + + //current y position for rendering + int m_y_offset{ }; + + bool m_visible = true; + bool m_disabled = false; + char m_text[ 256 ]{ }; + + std::shared_ptr< base_item > m_parent; + std::vector< std::shared_ptr< base_item > > m_items; + std::function< bool( ) > m_cond; + }; +} \ No newline at end of file diff --git a/cheat/gmod/ui_button.h b/cheat/gmod/ui_button.h new file mode 100644 index 0000000..022fc67 --- /dev/null +++ b/cheat/gmod/ui_button.h @@ -0,0 +1,56 @@ +#pragma once + +#include + +#include "ui_base_item.h" + +namespace ui +{ + class c_button : public base_item { + public: + c_button( int x, int y, int w, int h, const char* name, std::function< void( ) > fn ) : + base_item( x, y, w, h, name ), m_fn( fn ) { } + + virtual bool is_hovered( ) override { + if ( m_disabled ) return false; + + int x = get_relative_x( ); + int y = get_relative_y( ); + int h = m_height; + + int mouse_x, mouse_y; + ui_get_cursor_pos( mouse_x, mouse_y ); + + + return mouse_x >= x && mouse_x <= x + m_width + && mouse_y >= y && mouse_y <= y + h; + } + + + virtual void render( ) override { + int x = get_relative_x( ); + int y = get_relative_y( ); + + ui_draw_rect( x, y, m_width, m_height, ui_get_disabled_col( ) ); + ui_draw_outlined_rect( x - 1, y - 1, m_width + 1, m_height + 1, + is_hovered( ) ? ui_get_text_col( ) : ui_get_accent_col( ) ); + + if ( is_hovered( ) && g_input.is_key_pressed( KEYS_MOUSE1 ) ) { + ui_draw_rect( x, y, m_width, m_height, ui_get_bg_col( ) ); + if ( !m_mouse_held ) { + m_fn( ); + } + m_mouse_held = true; + } + else { + m_mouse_held = false; + } + + ui_draw_string( x + m_width / 2, y + 2, true, ui_get_text_col( ), m_text ); + } + + protected: + std::function< void( ) > m_fn; + bool m_mouse_held{ }; + }; +} \ No newline at end of file diff --git a/cheat/gmod/ui_checkbox.h b/cheat/gmod/ui_checkbox.h new file mode 100644 index 0000000..50cad1c --- /dev/null +++ b/cheat/gmod/ui_checkbox.h @@ -0,0 +1,68 @@ +#pragma once +#include "ui_base_item.h" + +namespace ui +{ + class c_checkbox : public base_item { + public: + c_checkbox( int x, int y, const char* txt, bool* setting ) : + base_item( x, y, 16, 16, txt ), m_setting( setting ) { } + + virtual bool is_hovered( ) override { + if ( m_disabled ) return false; + + int mouse_x, mouse_y; + ui_get_cursor_pos( mouse_x, mouse_y ); + + int rel_x = get_relative_x( ); + int rel_y = get_relative_y( ); + + return mouse_x >= rel_x && mouse_x <= rel_x + m_width + && mouse_y >= rel_y && mouse_y <= rel_y + m_height; + } + + inline void render_checkbox( const int& x, const int& y ) { + clr_t col = ui_get_bg_col( ); + if ( is_hovered( ) ) { + col = *m_setting ? ui_get_accent_col( ) * 0.8f : ui_get_bg_col( ) * 1.3f; + } + else if ( *m_setting ) { + col = ui_get_accent_col( ); + } + + ui_draw_rect( x, y, m_width, m_height, ui_get_disabled_col( ) ); + ui_draw_rect( x + 1, y + 1, m_width - 2, m_height - 2, col ); + + //ui_draw_outlined_rect( x, y, m_width, m_height, ui_get_accent_col( ) ); + } + + inline void input( ) { + bool mouse_presesed = g_input.is_key_pressed( KEYS_MOUSE1 ); + + if ( is_hovered( ) && mouse_presesed ) { + if ( !m_mouse_held ) { + *m_setting = !*m_setting; + } + m_mouse_held = true; + } + else { + m_mouse_held = false; + } + } + + virtual void render( ) override { + int x = get_relative_x( ); + int y = get_relative_y( ); + + render_checkbox( x, y ); + input( ); + + + ui_draw_string( x + m_width + 6, y + 2, false, ui_get_text_col( ), m_text ); + } + + protected: + bool* m_setting; + bool m_mouse_held{ }; + }; +} \ No newline at end of file diff --git a/cheat/gmod/ui_color_picker.h b/cheat/gmod/ui_color_picker.h new file mode 100644 index 0000000..2711d29 --- /dev/null +++ b/cheat/gmod/ui_color_picker.h @@ -0,0 +1,201 @@ +#pragma once + +#include "ui_base_item.h" +#include "d3d.hpp" + +namespace ui +{ + class c_color_picker : public base_item { + static constexpr int BOX_WIDTH = 106; + static constexpr int BOX_HEIGHT = 125; + public: + c_color_picker( int x, int y, int w, const char* name, clr_t* setting ) : + base_item( x, y, w, 4, name ), m_setting( setting ), + m_has_text( true ) { } + + c_color_picker( int x, int y, int w, clr_t* setting ) : + base_item( x, y, w, 8, xors( "COLOR_PICKER" ) ), m_setting( setting ), + m_has_text( false ) { } + + virtual bool is_hovered( ) override { + if ( m_disabled ) return false; + + int x = get_relative_x( ); + int y = get_relative_y( ); + + int cursor_x, cursor_y; + ui_get_cursor_pos( cursor_x, cursor_y ); + + if ( m_has_text ) y += 12; + + if ( !m_active ) { + return cursor_x >= x && cursor_x <= x + m_width + && cursor_y >= y && cursor_y <= y + m_height; + } + + return cursor_x >= x && cursor_x <= x + BOX_WIDTH + 23 + && cursor_y >= y && cursor_y <= y + BOX_HEIGHT + 2; + } + + virtual int get_total_height( ) const override { + return m_has_text ? ( m_height + 12 ) : m_height; + } + + void input( ) { + bool active_backup = m_active; + bool active_changed = false; + + if ( is_hovered( ) && g_input.is_key_pressed( KEYS_MOUSE1 ) ) { + if ( !m_active ) { + m_mouse_held = true; + } + + m_active = true; + } + else if ( m_active && !is_hovered( ) && g_input.is_key_pressed( KEYS_MOUSE1 ) ) { + m_active = false; + } + else { + m_mouse_held = false; + } + + active_changed = active_backup != m_active; + if ( active_changed ) { + set_disabled_callbacks( m_active ); + } + + m_hue = m_setting->hue( ); + if ( m_hue > 1.0f ) { + m_hue -= 359.f; + } + + m_saturation = m_setting->saturation( ); + m_brightness = m_setting->brightness( ) / 255.f; + m_alpha = m_setting->a( ); + } + + void output( ) { + *m_setting = clr_t::from_hsb( m_hue, m_saturation, m_brightness ); + m_setting->a( ) = m_alpha; + } + + virtual void render( ) override { + int x = get_relative_x( ); + int y = get_relative_y( ); + + if ( m_has_text ) { + ui_draw_string( x + 2, y, false, ui_get_text_col( ), m_text ); + y += 12; + } + + input( ); + + if ( m_active ) { + RECT old_rect; + g_d3d.get_device( )->GetScissorRect( &old_rect ); + + RECT new_rect{ + x - 1, y - 1, + x + BOX_WIDTH + 22, + y + BOX_HEIGHT + 2 + }; + + g_d3d.get_device( )->SetScissorRect( &new_rect ); + + int mouse_x, mouse_y; + ui_get_cursor_pos( mouse_x, mouse_y ); + + clr_t bg_col( 0, 0, 0, 90 ); + ui_draw_rect( x, y, BOX_WIDTH + 20, BOX_HEIGHT, bg_col ); + ui_draw_outlined_rect( x - 1, y - 1, BOX_WIDTH + 22, BOX_HEIGHT + 2, ui_get_accent_col( ) ); + + for ( int i{ }; i < 100; i += 3 ) { + for ( int i2{ }; i2 < 100; i2 += 3 ) { + ui_draw_rect( x + i + 1, y + i2 + 1, 3, 3, + clr_t::from_hsb( m_hue, float( i2 ) * 0.01f, float( i ) * 0.01f ) ); + } + } + + if ( g_input.is_key_pressed( KEYS_MOUSE1 ) && !m_mouse_held + && mouse_x > x && mouse_x <= x + 100 + && mouse_y > y && mouse_y <= y + 100 ) { + + int mouse_x_c = std::clamp( mouse_x, x, x + 100 ); + int mouse_y_c = std::clamp( mouse_y, y, y + 100 ); + + int delta_y = std::clamp( mouse_y_c - y, 0, 100 ); + int delta_x = std::clamp( mouse_x_c - x, 0, 100 ); + + m_saturation = float( delta_y ) * 0.01f; + m_brightness = float( delta_x ) * 0.01f; + } + + auto is_hue_slider_hovered = [&]( ) -> bool { + return mouse_x > x + 110 && mouse_x < x + 122 + && mouse_y > y && mouse_y < y + 100; + }; + + auto draw_slider_hue = [&]( ) { + for ( int i{ }; i < 100; ++i ) { + auto cur_col = clr_t::from_hsb( float( i ) * 0.01f, m_saturation, m_brightness ); + + ui_draw_rect( x + 110, y + i + 1, 12, 2, cur_col ); + } + + ui_draw_outlined_rect( x + 109, y + int( m_hue * 100.f ) + 1, 14, 3, + is_hue_slider_hovered( ) ? ui_get_text_col( ) : ui_get_disabled_col( ) ); + }; + + auto is_alpha_slider_hovered = [&]( ) -> bool { + return mouse_x > x + 1 && mouse_x < x + 122 + && mouse_y > y + 110 && mouse_y < y + 124; + }; + + auto draw_slider_alpha = [&]( ) { + for ( int i{ 121 }; i >= 0; --i ) { + auto col = *m_setting; + col.a( ) = ( int )( float( i ) * 255.f / 121.f ); + + ui_draw_rect( x + i + 1, y + 110, 1, 12, col ); + } + + int a_pos = ( int )( float( m_alpha ) * 121.f / 255.f ); + ui_draw_outlined_rect( x + 1 + a_pos, y + 109, 3, 14, + is_alpha_slider_hovered( ) ? ui_get_text_col( ) : ui_get_disabled_col( ) ); + }; + + draw_slider_hue( ); + if ( is_hue_slider_hovered( ) && g_input.is_key_pressed( KEYS_MOUSE1 ) ) { + int delta = std::clamp( mouse_y - y, 0, 100 ); + m_hue = float( delta ) * 0.01f; + } + + draw_slider_alpha( ); + if ( is_alpha_slider_hovered( ) && g_input.is_key_pressed( KEYS_MOUSE1 ) ) { + int delta = std::clamp( mouse_x - x, 0, 121 ); + m_alpha = ( int )( float( delta ) * 255.f / 121.f ); + } + + output( ); + + g_d3d.get_device( )->SetScissorRect( &old_rect ); + } + else { + if ( is_hovered( ) ) { + ui_draw_rect( x - 1, y - 1, m_width + 2, m_height + 2, ui_get_text_col( ) ); + } + ui_draw_rect( x, y, m_width, m_height, *m_setting ); + } + } + + protected: + clr_t* m_setting = nullptr; + bool m_active = false; + bool m_mouse_held = false; + float m_saturation = 1.0f; + float m_brightness = 1.0f; + float m_hue = 0.f; + uint8_t m_alpha = 255; + bool m_has_text = false; + }; +} \ No newline at end of file diff --git a/cheat/gmod/ui_draw.h b/cheat/gmod/ui_draw.h new file mode 100644 index 0000000..336c4fa --- /dev/null +++ b/cheat/gmod/ui_draw.h @@ -0,0 +1,163 @@ +#pragma once +#include "color.hpp" +#include "d3d.hpp" +#include "icons.hpp" +#include "d3d_sprite.hpp" +#include "input_system.hpp" + +namespace ui +{ + /*__forceinline auto ui_get_background_texture( ) { + static auto buffer = std::make_shared< byte[ 512 ] >( ); + static auto color = D3DCOLOR_RGBA( 27, 27, 27, 233 ); + static auto color_bright = D3DCOLOR_RGBA( 31, 31, 31, 255 ); + static IDirect3DTexture9* texture; + + if ( !texture ) { + for ( int i = 0; i < 512; i += 4 ) { + *( ulong_t* )( uintptr_t( buffer.get( ) ) + i ) = !( i % 12 ) ? color : color_bright; + } + + D3DXCreateTextureFromFileInMemory( g_d3d.get_device( ), buffer.get( ), 512, &texture ); + } + + return texture; + }*/ + + static float anim_time{ }; + + __forceinline void set_animtime( float animtime ) { + anim_time = animtime; + } + + __forceinline void setup_sprites( IDirect3DDevice9* device ) { + //fuck msvc + icons::sprite_legit.init( device, icons::legit_icon, icons::legit_size, 66, 66 ); + icons::sprite_visuals_.init( device, icons::legit_icon, icons::legit_size, 66, 66 ); + icons::sprite_rage.init( device, icons::rage_icon, icons::rage_size, 66, 66 ); + icons::sprite_visuals.init( device, icons::raw::visuals, icons::visuals_size, 66, 66 ); + icons::sprite_misc.init( device, icons::misc_icon, icons::misc_size, 66, 66 ); + icons::sprite_config.init( device, icons::config_icon, icons::config_size, 66, 66 ); + } + + __forceinline clr_t ui_get_accent_col( ) { + clr_t col_start = { + g_settings.menu.menu_color_1r, + g_settings.menu.menu_color_1g, + g_settings.menu.menu_color_1b + }; + + clr_t col_end = { + g_settings.menu.menu_color_2r, + g_settings.menu.menu_color_2g, + g_settings.menu.menu_color_2b + }; + + clr_t col = clr_t::blend( col_start, col_end, anim_time ); + + return col; + } + + __forceinline clr_t& ui_get_disabled_col( ) { + static clr_t col = clr_t( 61, 61, 61, 255 ); + return col; + } + + __forceinline clr_t& ui_get_bg_col( ) { + static clr_t col = clr_t( 24, 25, 27, 255 ); + return col; + } + + __forceinline clr_t& ui_get_text_col( ) { + static clr_t col = clr_t( 221, 221, 221, 255 ); + return col; + } + + __forceinline void ui_draw_gradient( int x, int y, int w, int h, clr_t start, + clr_t end, GradientType_t type = GRADIENT_HORIZONTAL ) { + + g_d3d.draw_gradient( start, end, x, y, w, h, type ); + } + + __forceinline void ui_draw_line( int x, int y, int x1, int y1, clr_t color ) { + g_d3d.draw_line( color, x, y, x1, y1 ); + } + + __forceinline void ui_draw_rect( int x, int y, int w, int h, clr_t color ) { + g_d3d.draw_filled_rect( color, x, y, w, h ); + } + + __forceinline void ui_draw_outlined_rect( int x, int y, int w, int h, clr_t color ) { + g_d3d.draw_rect( color, x, y, w, h ); + } + + __forceinline void ui_draw_circle( int x, int y, int r, clr_t color, int res = 48 ) { + g_d3d.draw_circle( color, x, y, r, res ); + } + + __forceinline void ui_draw_filled_circle( int x, int y, int r, clr_t color, int res = 48 ) { + g_d3d.draw_filled_circle( color, x, y, r, res ); + } + + __forceinline void ui_draw_string( int x, int y, bool center, clr_t color, const char* str, ... ) { + char buf[ 2048 ]{ }; + va_list list{ }; + + __crt_va_start( list, str ); + vsprintf_s( buf, 2048, str, list ); + __crt_va_end( list ); + + g_d3d.draw_text( d3d::fonts.f_menu, color, x, y, + center ? ALIGN_CENTER : ALIGN_LEFT, D3DFONTFLAG_DROPSHADOW, buf ); + } + + __forceinline void ui_get_text_size( int& w, int& h, const char* text, ... ) { + char* buf = ( char* )_alloca( 2048 ); + va_list list{ }; + + __crt_va_start( list, text ); + vsprintf_s( buf, 2048, text, list ); + __crt_va_end( list ); + + w = g_d3d.get_text_width( d3d::fonts.f_menu, 0, buf ); + h = g_d3d.get_text_height( d3d::fonts.f_menu, 0, buf ); + } + + __forceinline void ui_get_cursor_pos( int& x, int& y ) { + g_input.get_cursor_pos( x, y ); + } + + __forceinline float ui_get_frametime( ) { + return g_gmod.m_frametime; + } + + __forceinline void ui_draw_cursor( ) { + const clr_t black( 0, 0, 0, 255 ), accent( ui_get_accent_col( ) ); + int x, y; + ui_get_cursor_pos( x, y ); + + + for ( int i{ }; i <= 9; ++i ) { + ui_draw_line( x, y, x + i, y + 11, accent ); + } + + for ( int i{ }; i <= 7; ++i ) { + ui_draw_line( x, y + 9 + i, x + i, y + 9, accent ); + } + + for ( int i{ }; i <= 3; ++i ) { + ui_draw_line( x + 6 + i, y + 11, x, y + i, accent ); + } + + ui_draw_line( x + 5, y + 11, x + 8, y + 18, accent ); + ui_draw_line( x + 4, y + 11, x + 7, y + 18, accent ); + + ui_draw_line( x, y, x, y + 17, black ); + ui_draw_line( x, y + 17, x + 3, y + 14, black ); + ui_draw_line( x + 4, y + 14, x + 7, y + 19, black ); + ui_draw_line( x + 7, y + 18, x + 9, y + 18, black ); + ui_draw_line( x + 10, y + 18, x + 7, y + 12, black ); + ui_draw_line( x + 7, y + 12, x + 11, y + 12, black ); + ui_draw_line( x + 11, y + 12, x, y, black ); + } +} \ No newline at end of file diff --git a/cheat/gmod/ui_dropdown.h b/cheat/gmod/ui_dropdown.h new file mode 100644 index 0000000..0c4e990 --- /dev/null +++ b/cheat/gmod/ui_dropdown.h @@ -0,0 +1,217 @@ +#pragma once +#include "ui_dropdown_item.h" + +namespace ui +{ + template < typename t = int > + class c_dropdown : public base_item { + public: + c_dropdown( int x, int y, int w, const char* name, t* setting, + std::vector< dropdowns::dropdown_item_t< t > >* items, size_t max_items = 8 ) : + base_item( x, y, w, 16, name ), m_dropdown_items( items ), m_setting( setting ), + m_max_items( max_items ) { } + + virtual bool is_hovered( ) override { + if ( m_disabled ) return false; + + int x = get_relative_x( ); + int y = get_relative_y( ) + 12; + int h = m_height; + + int mouse_x, mouse_y; + ui_get_cursor_pos( mouse_x, mouse_y ); + + + return mouse_x >= x && mouse_x <= x + m_width + && mouse_y >= y && mouse_y <= y + h; + } + + inline bool is_any_item_hovered( ) { + if ( m_disabled || !m_active ) return false; + + int x = get_relative_x( ); + int y = get_relative_y( ) + m_height + 12; + int h = m_height * ( std::min< size_t >( + m_dropdown_items->size( ), m_max_items ) ); + + int mouse_x, mouse_y; + ui_get_cursor_pos( mouse_x, mouse_y ); + + + return mouse_x >= x && mouse_x <= x + m_width + && mouse_y >= y && mouse_y <= y + h; + } + + virtual int get_total_height( ) const override { + return m_height + 13; + } + + void draw_box( const int& x, const int& y, const char* str, bool hovered = false ) { + ui_draw_rect( x, y, m_width, m_height, hovered ? ui_get_disabled_col( ) : ui_get_bg_col( ) ); + ui_draw_line( x, y + m_height, x + m_width, y + m_height, ui_get_accent_col( ) ); + + ui_draw_string( x + m_width / 2, y + 2, true, ui_get_text_col( ), str ); + } + + void update_value( ) { + for ( auto& it : *m_dropdown_items ) { + if ( it.m_value == *m_setting ) { + m_selected_item = ⁢ + } + } + } + + void draw_items( const int& x, const int& y ) { + auto& items = *m_dropdown_items; + auto it = &items.front( ); + int offset = m_height + 1; + int hovered = 0; + int mouse_x, mouse_y; + ui_get_cursor_pos( mouse_x, mouse_y ); + + auto is_hovered = [ & ] ( int y_offset ) { + return mouse_x >= x && mouse_x <= x + m_width + && mouse_y >= y + y_offset && mouse_y <= y + y_offset + m_height; + }; + + + for ( size_t i = items.size( ) > m_max_items ? m_curr_scroll : 0; + i < std::min< size_t >( m_dropdown_items->size( ), m_max_items + m_curr_scroll ); + ++i, offset += m_height + 1 + ) { + it = &items.at( i ); + + draw_box( x, y + offset, it->m_name ); + + if ( is_hovered( offset ) ) { + hovered = offset; + if ( g_input.is_key_pressed( KEYS_MOUSE1 ) ) { + m_selected_item = it; + *m_setting = it->m_value; + m_active = false; + m_enable_time = GetTickCount( ) * 0.001f + 0.220f; + m_enable_next_frame = true; + } + } + } + + if ( hovered ) { + ui_draw_outlined_rect( x - 1, y - 1 + hovered, + m_width + 1, m_height + 1, ui_get_text_col( ) ); + } + } + + void input( ) { + bool active_backup = m_active; + bool active_changed = false; + + if ( is_hovered( ) && g_input.is_key_pressed( KEYS_MOUSE1 ) ) { + if ( !m_mouse_held ) { + m_active = !m_active; + } + m_mouse_held = true; + } + else if ( !is_any_item_hovered( ) ) { + m_mouse_held = false; + } + + if ( !is_hovered( ) && g_input.is_key_pressed( KEYS_MOUSE1 ) && !is_any_item_hovered( ) ) { + m_active = false; + } + + if ( GetTickCount( ) * 0.001f > m_enable_time && m_enable_next_frame ) { + set_disabled_callbacks( false ); + m_enable_next_frame = false; + } + + + active_changed = m_active != active_backup; + //disable input on all items + if ( active_changed ) { + if ( !m_active ) { + m_enable_time = GetTickCount( ) * 0.001f + 0.220f; + m_enable_next_frame = true; + } + else { + set_disabled_callbacks( true ); + } + } + + if ( m_selected_item ) { + *m_setting = m_selected_item->m_value; + } + + if ( m_active && m_dropdown_items->size( ) > m_max_items ) { + int scroll_input = g_input.get_scroll_state( ); + + if ( m_curr_scroll > 0 || scroll_input < 0 ) //we dont want scroll to loop around from 0 to max + m_curr_scroll -= scroll_input; //because positive is scroll up, we gotta flip it + + if ( m_curr_scroll > m_dropdown_items->size( ) - m_max_items ) + m_curr_scroll = m_dropdown_items->size( ) - m_max_items; + } + } + + virtual void render( ) override { + int x = get_relative_x( ); + int y = get_relative_y( ); + + bool restore = false; + RECT prev_rect{ }; + + if ( m_active ) { + restore = true; + g_d3d.get_device( )->GetScissorRect( &prev_rect ); + + RECT new_rect{ + prev_rect.left, + prev_rect.top, + g_d3d.m_width, + g_d3d.m_height, + }; + + g_d3d.get_device( )->SetScissorRect( &new_rect ); + + draw_items( x, y + 11 ); + + + //draw scrollbar + size_t total_items = m_dropdown_items->size( ); + if ( total_items > m_max_items ) { + const size_t height = ( m_height + 1 ) * m_max_items; + const float slider_step = ( float )( height ) / float( total_items - m_max_items + 1 ); + + size_t slider_pos = static_cast< size_t >( slider_step * m_curr_scroll ); + ui_draw_rect( x + m_width - 1, y + slider_pos + m_height + 13, 2, ( int )slider_step, ui_get_accent_col( ) ); + } + } + + update_value( ); + input( ); + + ui_draw_string( x + 2, y, false, ui_get_text_col( ), m_text ); + ui_draw_rect( x, y + 13, m_width, m_height, ui_get_disabled_col( ) ); + ui_draw_outlined_rect( x - 1, y + 12, m_width + 1, m_height + 1, + is_hovered( ) || m_active ? ui_get_text_col( ) : ui_get_accent_col( ) ); + + if ( m_selected_item ) { + ui_draw_string( x + m_width / 2, y + 14, true, ui_get_text_col( ), m_selected_item->m_name ); + } + + if( restore ) { + g_d3d.get_device( )->SetScissorRect( &prev_rect ); + } + } + + protected: + std::vector< dropdowns::dropdown_item_t< t > >* m_dropdown_items{ }; + dropdowns::dropdown_item_t< t >* m_selected_item{ }; + bool m_active = false; + bool m_mouse_held = false; + t* m_setting{ }; + size_t m_max_items{ }; + size_t m_curr_scroll{ }; + float m_enable_time{ }; + int m_enable_next_frame{ }; + }; +} \ No newline at end of file diff --git a/cheat/gmod/ui_dropdown_item.h b/cheat/gmod/ui_dropdown_item.h new file mode 100644 index 0000000..4723af8 --- /dev/null +++ b/cheat/gmod/ui_dropdown_item.h @@ -0,0 +1,183 @@ +#pragma once + +#include "ui_base_item.h" + +namespace ui +{ + namespace dropdowns + { + template < typename t = int > + struct dropdown_item_t { + const char* m_name; + t m_value; + }; + + std::vector< dropdown_item_t< > > activation_types_aimbot = { + { xors( "always" ), 0 }, + { xors( "on key" ), 1 }, + }; + + std::vector< dropdown_item_t< > > silent_aimbot_types = { + { xors( "none" ), 0 }, + { xors( "client-side" ), 1 }, + { xors( "server-side" ), 2 }, + }; + + std::vector< dropdown_item_t< > > hitboxes = { + { xors( "hitscan" ), -1 }, + { xors( "head" ), 0 }, + { xors( "neck" ), 1 }, + { xors( "pelvis" ), 2 }, + { xors( "chest" ), 3 }, + }; + + std::vector< dropdown_item_t< > > antiaim_yaw = { + { xors( "normal" ), 0 }, + { xors( "backwards" ), 1 }, + { xors( "backwards spin" ), 2 }, + { xors( "direction" ), 6 }, + { xors( "sideways" ), 3 }, + { xors( "golden spin" ), 4 }, + { xors( "random" ), 5 }, + }; + + std::vector< dropdown_item_t< > > delay_type = { + { xors( "none" ), 0 }, + { xors( "fake lag" ), 1 }, + { xors( "time" ), 2 }, + { xors( "velocity" ), 3 }, + }; + + std::vector< dropdown_item_t< > > antiaim_pitch = { + { xors( "normal" ), 0 }, + { xors( "custom" ), 1 }, + { xors( "flip" ), 2 }, + { xors( "minimal" ), 3 }, + { xors( "random" ), 4 } + }; + + std::vector< dropdown_item_t< > > antiaim_freestanding = { + { xors( "disabled" ), 0 }, + { xors( "static" ), 1 }, + { xors( "narrow angle" ), 2 }, + { xors( "wide angle" ), 3 }, + }; + + std::vector< dropdown_item_t< > > antiaim_edge = { + { xors( "off" ), 0 }, + { xors( "peek" ), 1 }, + { xors( "full" ), 2 }, + }; + + std::vector< dropdown_item_t< > > antiaim_edge_type = { + { xors( "static" ), 0 }, + { xors( "narrow angle" ), 1 }, + { xors( "wide angle" ), 2 }, + }; + + std::vector< dropdown_item_t< > > fakelag_types = { + { xors( "disabled" ), 0 }, + { xors( "adaptive" ), 1 }, + { xors( "fluctuate" ), 2 }, + { xors( "static" ), 3 }, + }; + + std::vector< dropdown_item_t< > > activation_type_visuals = { + { xors( "never" ), 0 }, + { xors( "always" ), 1 }, + { xors( "on hold" ), 2 }, + { xors( "toggle" ), 3 }, + }; + + std::vector< dropdown_item_t< > > configs = { + { xors( "legit" ), 0 }, + { xors( "closet" ), 1 }, + { xors( "rage 1" ), 2 }, + { xors( "rage 2" ), 3 }, + }; + + std::vector< dropdown_item_t< > > recorder_angles = { + { xors( "none" ), 0 }, + { xors( "shot" ), 1 }, + { xors( "all" ), 2 } + }; + + std::vector< dropdown_item_t< > > baim_types = { + { xors( "off" ), 0 }, + { xors( "basic" ), 1 }, + { xors( "smart" ), 2 }, + { xors( "aggressive" ), 3 }, + { xors( "force" ), 4 }, + }; + + std::vector< dropdown_item_t< > > name_changers = { + { xors( "off" ), 0 }, + { xors( "dollar" ), 1 }, + { xors( "moneybot.cc" ), 2 }, + }; + + std::vector< dropdown_item_t< > > weapon_esp_types = { + { xors( "none" ), 0 }, + { xors( "icon" ), 1 }, + { xors( "name" ), 2 }, + }; + + std::vector< dropdown_item_t< > > fake_ping_activation = { + { xors( "off" ), 0 }, + { xors( "on hold" ), 1 }, + { xors( "toggle" ), 2 }, + { xors( "always" ), 3 }, + { xors( "auto" ), 4 } + }; + + std::vector< dropdown_item_t< > > world_esp_type = { + { xors( "off" ), 0 }, + { xors( "name" ), 1 }, + { xors( "glow" ), 2 }, + { xors( "both" ), 3 } + }; + + std::vector< dropdown_item_t< > > multipoint_types = { + { xors( "off" ), 0 }, + { xors( "minimal" ), 1 }, + { xors( "vitals" ), 2 }, + { xors( "full" ), 3 } + }; + + std::vector< dropdown_item_t< > > edge_priority = { + { xors( "freestanding" ), 0 }, + { xors( "edge" ), 1 } + }; + + std::vector< dropdown_item_t< > > selection_type = { + { xors( "fov" ), 0 }, + { xors( "distance" ), 1 } + }; + + std::vector< dropdown_item_t< > > autobuy_main_wep = { + { xors( "none" ), 0 }, + { xors( "autosniper" ), 1 }, + { xors( "scout" ), 2 }, + { xors( "sniper" ), 3 }, + { xors( "ak/m4" ), 4 }, + { xors( "aug/sg" ), 5 }, + { xors( "mac10/mp9" ), 6 }, + }; + + std::vector< dropdown_item_t< > > autobuy_second_wep = { + { xors( "none" ), 0 }, + { xors( "deagle/r8" ), 1 }, + { xors( "dualies" ), 2 }, + }; + + std::vector< dropdown_item_t< > > skin_knives = { + { xors( "none" ), 0 }, + { xors( "bayonet" ), 1 }, + { xors( "flip knife" ), 2 }, + { xors( "gut knife" ), 3 }, + { xors( "karambit" ), 4 }, + { xors( "m9 bayonet" ), 5 }, + { xors( "huntsman" ), 6 }, + }; + } +} \ No newline at end of file diff --git a/cheat/gmod/ui_form.h b/cheat/gmod/ui_form.h new file mode 100644 index 0000000..0791528 --- /dev/null +++ b/cheat/gmod/ui_form.h @@ -0,0 +1,187 @@ +#pragma once +#include "ui_base_item.h" + +namespace ui +{ + class c_form : public base_item { + public: + c_form( int x, int y, int w, int h, const char* name, int max_h = 0, bool collapse = false ) : + base_item( x, y, w, h, name ), m_dynamic( !h ), m_max_height( max_h ), m_collapse( collapse ) { }; + + virtual int x( ) const override { + return m_x + 10; + } + + virtual int y( ) const override { + return m_y + m_scroll_offset + 9; + } + + virtual bool is_form( ) const override { + return true; + } + + virtual bool is_hovered( ) override { + int mouse_x, mouse_y; + ui_get_cursor_pos( mouse_x, mouse_y ); + + int x = get_relative_x( ); + int y = get_relative_y( ); + + return mouse_x > x && mouse_x < x + w( ) + && mouse_y > y && mouse_y < y + h( ); + } + + bool is_collapse_hovered( ) { + if( !m_collapse ) return false; + + int mouse_x, mouse_y; + ui_get_cursor_pos( mouse_x, mouse_y ); + + int x = get_relative_x( ) + m_width - 8; + int y = get_relative_y( ) + 2; + + return mouse_x >= x && mouse_x <= x + 5 + && mouse_y >= y && mouse_y <= y + 7; + } + + bool is_collapsed( ) { + return ( m_collapse && !m_open ); + } + + inline void update_size( ) { + if ( !m_dynamic ) return; + + int total_height{ ITEM_OFFSET * 2 }; + for ( auto& it : m_items ) { + if ( it->get_visible( ) ) { + auto item_height = it->get_total_height( ) + ITEM_OFFSET; + if( m_max_height && total_height + item_height > m_max_height ) { + total_height = m_max_height; + break; + } + total_height += it->get_total_height( ) + ITEM_OFFSET; + } + } + + m_height = total_height; + } + + virtual int get_total_height( ) const override { + if( !m_open && m_collapse ) return 18; + return m_height + 5; + } + + int get_total_item_height( ) { + int total_height{ ITEM_OFFSET * 2 }; + for( auto& it : m_items ) { + if( it->get_visible( ) ) { + auto item_height = it->get_total_height( ) + ITEM_OFFSET; + total_height += it->get_total_height( ) + ITEM_OFFSET; + } + } + + return total_height; + } + + void input( ) { + if( m_collapse ) { + bool hovered = is_collapse_hovered( ); + bool clicked = g_input.is_key_pressed( KEYS_MOUSE1 ); + if( hovered && clicked ) { + if( !m_was_pressed ) { + m_open ^= 1; + } + m_was_pressed = true; + } + else { + m_was_pressed = false; + } + } + + if( m_max_height && get_total_item_height( ) > m_max_height ) { + if( !m_disabled && is_hovered( ) ) { + auto scroll_state = g_input.get_scroll_state( ); + if( !!scroll_state && m_was_hovered ) { + scroll_state > 0 ? m_scroll_offset += 13 : m_scroll_offset -= 13; + } + m_scroll_offset = std::clamp( m_scroll_offset, -( get_total_item_height( ) - m_height + 3 ), 0 ); + } + } + else { + m_scroll_offset = 0; + } + } + + virtual void render( ) override { + update_size( ); + input( ); + int x = get_relative_x( ); + int y = get_relative_y( ); + + int text_w, text_h; + ui_get_text_size( text_w, text_h, m_text ); + + if( m_collapse ) { + if( !m_open && m_collapse ) { + ui_draw_outlined_rect( x, y, m_width, 14, ui_get_accent_col( ) ); + ui_draw_line( x + 3, y, x + text_w + 1, y, ui_get_bg_col( ) ); + ui_draw_string( x + 3, y - 7, false, ui_get_text_col( ), m_text ); + + int button_x = x + m_width - 6; + int button_y = y + 2; + + ui_draw_string( button_x, button_y, true, + is_collapse_hovered( ) ? ui_get_accent_col( ) : ui_get_text_col( ), "+" ); + return; + } + } + + for( int i{ }; i < 8; ++i ) { + clr_t col = ui_get_bg_col( ) * ( 0.72f + i * 0.04f ); + ui_draw_rect( x, y + i, m_width, m_height - i * 2, col ); + } + + ui_draw_outlined_rect( x, y, m_width, m_height, ui_get_accent_col( ) ); + + if( m_max_height && get_total_item_height( ) > m_height ) { + const size_t height = get_total_height( ) - 20; + const float delta = ( float )( get_total_item_height( ) - height + 1 ); + const float slider_step = ( ( float )( height ) / delta ); + const float slider_height = slider_step * 13.f; + + size_t slider_pos = static_cast< size_t >( slider_step * m_scroll_offset ); + ui_draw_rect( x + m_width - 7, y + 8, 4, height, ui_get_disabled_col( ) ); + ui_draw_rect( x + m_width - 7, y - slider_pos + 8, 4, ( int )slider_height + 1, ui_get_accent_col( ) ); + } + + if( is_hovered( ) != m_was_hovered ) { + bool backup = m_disabled; + if( !backup ) { + set_disabled( !is_hovered( ) ); + } + m_disabled = backup; + } + + ui_draw_line( x + 3, y, x + text_w + 1, y, ui_get_bg_col( ) ); + ui_draw_string( x + 3, y - 7, false, ui_get_text_col( ), m_text ); + if( m_collapse ) { + int button_x = x + m_width - 6; + int button_y = y + 2; + + ui_draw_string( button_x, button_y, true, + is_collapse_hovered( ) ? ui_get_accent_col( ) : ui_get_text_col( ), "-" ); + } + + m_was_hovered = is_hovered( ); + } + + protected: + bool m_dynamic{ }; + bool m_was_hovered{ }; + int m_max_height{ }; + int m_scroll_offset{ }; + bool m_was_pressed{ }; + bool m_collapse{ }; + bool m_open{ true }; + }; +} \ No newline at end of file diff --git a/cheat/gmod/ui_key_picker.h b/cheat/gmod/ui_key_picker.h new file mode 100644 index 0000000..03aed84 --- /dev/null +++ b/cheat/gmod/ui_key_picker.h @@ -0,0 +1,164 @@ +#pragma once +#include "ui_base_item.h" + +namespace ui +{ + class c_key_picker : public base_item { + public: + c_key_picker( int x, int y, int w, const char* name, int* setting ) : + base_item( x, y, w, 16, name ), m_setting( setting ) { } + + virtual bool is_hovered( ) override { + if ( m_disabled ) return false; + + int x = get_relative_x( ); + int y = get_relative_y( ) + 12; + int h = m_height; + + int mouse_x, mouse_y; + ui_get_cursor_pos( mouse_x, mouse_y ); + + + return mouse_x >= x && mouse_x <= x + m_width + && mouse_y >= y && mouse_y <= y + h; + } + + virtual int get_total_height( ) const override { + return m_height + 12; + } + + void input( ) { + bool active_backup = m_active; + bool active_changed = false; + + if ( is_hovered( ) && g_input.is_key_pressed( KEYS_MOUSE1 ) ) { + if ( !m_mouse_held ) { + m_active = true; + } + m_mouse_held = true; + } + + if ( g_input.is_key_pressed( KEYS_ESCAPE ) ) { + m_active = false; + *m_setting = KEYS_NONE; + } + + if ( m_active && !m_mouse_held ) { + int key = g_input.is_any_key_pressed( ); + if ( key != KEYS_NONE ) { + *m_setting = key; + m_active = false; + } + } + + active_changed = active_backup != m_active; + if ( active_changed ) { + set_disabled_callbacks( m_active ); + } + } + + virtual void render( ) override { + int x = get_relative_x( ); + int y = get_relative_y( ); + + input( ); + + ui_draw_string( x + 2, y, false, ui_get_text_col( ), m_text ); + ui_draw_rect( x, y + 13, m_width, m_height, ui_get_disabled_col( ) ); + ui_draw_outlined_rect( x - 1, y + 12, m_width + 1, m_height + 1, + is_hovered( ) || m_active ? ui_get_text_col( ) : ui_get_accent_col( ) ); + + ui_draw_string( x + m_width / 2, y + 14, true, ui_get_text_col( ), + g_input.get_key_name( ( VirtualKeys_t )*m_setting ) ); + } + + protected: + int* m_setting{ }; + bool m_active{ }; + bool m_mouse_held{ }; + }; + + //skEeT PiCkErS + class c_key_picker_small : public base_item { + public: + c_key_picker_small( int x, int y, int* setting ) : + base_item( x, y, 0, 0, xors( "KEY_PICKER" ) ), m_setting( setting ) { } + + virtual int get_total_height( ) const override { + const char* name = g_input.get_short_name( ( VirtualKeys_t )*m_setting ); + int w, h; + ui_get_text_size( w, h, name ); + + return h; + } + + virtual bool is_hovered( ) override { + if ( m_disabled ) return false; + + const char* name = g_input.get_short_name( ( VirtualKeys_t )*m_setting ); + int x = get_relative_x( ); + int y = get_relative_y( ); + int mouse_x, mouse_y; + int w, h; + + ui_get_text_size( w, h, "[%s]", name ); + ui_get_cursor_pos( mouse_x, mouse_y ); + + return mouse_x >= x - w && mouse_x <= x + && mouse_y >= y && mouse_y <= y + h; + } + + void input( ) { + + bool active_backup = m_active; + bool active_changed = false; + + if ( g_input.is_key_pressed( KEYS_ESCAPE ) ) { + m_active = false; + *m_setting = KEYS_NONE; + } + + if ( m_active && !m_mouse_held ) { + int key = g_input.is_any_key_pressed( ); + if ( key != KEYS_NONE ) { + *m_setting = key; + m_active = false; + } + } + + if ( is_hovered( ) && g_input.is_key_pressed( KEYS_MOUSE1 ) ) { + if ( !m_mouse_held ) { + m_active = true; + } + m_mouse_held = true; + } + else { + m_mouse_held = false; + } + + active_changed = active_backup != m_active; + if ( active_changed ) { + set_disabled_callbacks( m_active ); + } + } + + virtual void render( ) override { + const char* name = g_input.get_short_name( ( VirtualKeys_t )*m_setting ); + int x = get_relative_x( ); + int y = get_relative_y( ); + + int w, h; + ui_get_text_size( w, h, "[%s]", name ); + + input( ); + + ui_draw_string( x - w, y, false, is_hovered( ) || m_active ? + ui_get_accent_col( ) : ui_get_text_col( ), "[%s]", name ); + } + + protected: + int* m_setting; + bool m_active{ }; + bool m_mouse_held{ }; + }; +} \ No newline at end of file diff --git a/cheat/gmod/ui_label.h b/cheat/gmod/ui_label.h new file mode 100644 index 0000000..9df46b5 --- /dev/null +++ b/cheat/gmod/ui_label.h @@ -0,0 +1,18 @@ +#pragma once +#include "ui_base_item.h" + +namespace ui +{ + class c_label : public base_item { + public: + c_label( int x, int y, const char* text ) : + base_item( x, y, 0, 16, text ) { } + + virtual void render( ) override { + int x = get_relative_x( ); + int y = get_relative_y( ); + + ui_draw_string( x + 2, y + 2, false, ui_get_text_col( ), m_text ); + } + }; +} \ No newline at end of file diff --git a/cheat/gmod/ui_menu.h b/cheat/gmod/ui_menu.h new file mode 100644 index 0000000..53a17a0 --- /dev/null +++ b/cheat/gmod/ui_menu.h @@ -0,0 +1,89 @@ +#pragma once +#include "ui_base_item.h" + +namespace ui +{ + class c_menu : public base_item { + public: + c_menu( int start_x, int start_y, int width, + int height, const char* name, const char* right_text = nullptr ) : + base_item( start_x, start_y, width, height, name ), + m_right_text( right_text ) { } + + virtual bool is_hovered( ) override { + if ( m_disabled ) return false; + + int mouse_x, mouse_y; + ui_get_cursor_pos( mouse_x, mouse_y ); + + return mouse_x >= m_x && mouse_x <= m_x + w( ) + && mouse_y >= m_y && mouse_y <= m_y + 19; + } + + virtual int y( ) const override { + return m_y + 19; + } + + inline void input( ) { + int mouse_x, mouse_y; + ui_get_cursor_pos( mouse_x, mouse_y ); + bool mouse_clicked = g_input.is_key_pressed( KEYS_MOUSE1 ); + + if ( is_hovered( ) ) { + m_mouse_held = true; + } + + if ( !mouse_clicked ) { + m_mouse_held = is_hovered( ); + } + + if ( m_mouse_held && !mouse_clicked ) { + m_drag_offset_y = mouse_y - m_y; + m_drag_offset_x = mouse_x - m_x; + } + + if ( m_mouse_held && mouse_clicked ) { + m_x = mouse_x - m_drag_offset_x; + m_y = mouse_y - m_drag_offset_y; + } + } + + virtual void render( ) override { + constexpr auto top_height = 19; + + input( ); + + //draw a c00l shadow + ui_draw_outlined_rect( m_x, m_y + 1, m_width + 1, m_height, clr_t( 0, 0, 0, 166 ) ); + + ui_draw_rect( m_x + 1, m_y + 1, m_width - 1, top_height - 2, ui_get_bg_col( ) * 1.2f ); + if( is_hovered( ) ) { + ui_draw_rect( m_x + 1, m_y + 1, m_width - 1, top_height - 2, clr_t( 61, 61, 61 ) ); + } + + for( int i{ }; i < 8; ++i ) { + clr_t col = ui_get_bg_col( ) * ( 0.72f + i * 0.04f ); + ui_draw_rect( m_x, m_y + i + top_height - 1, m_width, m_height - i * 2 - top_height + 1, col ); + } + ui_draw_outlined_rect( m_x, m_y, m_width, m_height, ui_get_accent_col( ) ); + + if( m_right_text ) { + ui_draw_string( m_x + 5, m_y + 4, false, ui_get_text_col( ), m_text ); + + int width, height; + ui_get_text_size( width, height, m_right_text ); + + ui_draw_string( m_x + m_width - 5 - width, m_y + 4, false, ui_get_text_col( ), m_right_text ); + } + else { + ui_draw_string( m_x + m_width / 2, m_y + 4, true, ui_get_text_col( ), m_text ); + } + } + + protected: + int m_drag_offset_x{ }; + int m_drag_offset_y{ }; + bool m_mouse_held{ }; + const char* m_right_text{ }; + }; +} \ No newline at end of file diff --git a/cheat/gmod/ui_render.h b/cheat/gmod/ui_render.h new file mode 100644 index 0000000..f67f16b --- /dev/null +++ b/cheat/gmod/ui_render.h @@ -0,0 +1,63 @@ +#pragma once + +#include "ui_base_item.h" + +namespace ui +{ + //recursively render all items + static void render_item( base_item* item, int offset = 0, bool allow_rect = true ) { + if( !item->get_visible( ) ) return; + + item->reset( ); + item->render( ); + bool reset = false; + RECT original; + + if( allow_rect && item->is_form( ) ) { + auto device = g_d3d.get_device( ); + device->GetScissorRect( &original ); + + auto x = item->get_relative_x( ); + auto y = item->get_relative_y( ); + + RECT new_rect{ + x, + y + 4, + x + item->w( ), + y + item->get_total_height( ) - 7 + }; + + device->SetScissorRect( &new_rect ); + reset = true; + } + + bool draw = true; + if( item->is_form( ) ) { + auto form_cast = static_cast< c_form* >( item ); + draw = !form_cast->is_collapsed( ); + } + + if( item->get_items( ).size( ) && draw ) { + //madr0fl + int* height_offset = ( int* )_alloca( sizeof( int ) * item->get_items( ).size( ) ); + int cur_offset = 0; + for( int i = ( int )item->get_items( ).size( ) - 1; i >= 0; --i ) { + auto& cur_item = item->get_items( )[ i ]; + height_offset[ i ] = cur_offset; + cur_offset += cur_item->get_visible( ) ? cur_item->get_total_height( ) + ITEM_OFFSET : 0; + } + + int i{ }; + for( auto& it : item->get_items( ) ) { + item->set_y_offset( height_offset[ i ] ); + render_item( it.get( ), height_offset[ i ], !reset && allow_rect ); + ++i; + } + } + + if( reset ) { + auto device = g_d3d.get_device( ); + device->SetScissorRect( &original ); + } + } +} \ No newline at end of file diff --git a/cheat/gmod/ui_slider.h b/cheat/gmod/ui_slider.h new file mode 100644 index 0000000..0e55a73 --- /dev/null +++ b/cheat/gmod/ui_slider.h @@ -0,0 +1,165 @@ +#pragma once + +#include "ui_base_item.h" + +namespace ui +{ + template < typename t > + class c_slider : public base_item { + public: + c_slider( int x, int y, int w, t min, t max, const char* text, t* setting, t full, const char* suffix = 0 ) : + base_item( x, y, w, 5, text ), m_setting( setting ), m_suffix( suffix ), + m_min( float( min ) ), m_max( float( max ) ), m_full( full ), m_has_text( true ) { }; + + c_slider( int x, int y, int w, t min, t max, const char* text, t* setting, const char* suffix = 0 ) : + base_item( x, y, w, 5, text ), m_setting( setting ), m_suffix( suffix ), + m_min( float( min ) ), m_max( float( max ) ), m_full( max ), m_has_text( true ) { }; + + c_slider( int x, int y, int w, t min, t max, t* setting, const char* suffix = 0 ) : + base_item( x, y, w, 5, nullptr ), m_setting( setting ), m_suffix( suffix ), + m_min( float( min ) ), m_max( float( max ) ), m_full( max ), m_has_text( false ) { } + + virtual bool is_hovered( ) override { + if ( m_disabled ) return false; + + int x = get_relative_x( ); + int y = get_relative_y( ) + ( m_has_text ? 11 : 2 ); + + int mouse_x, mouse_y; + ui_get_cursor_pos( mouse_x, mouse_y ); + + if( !m_has_text ) { + x += 4; + return mouse_x >= x && mouse_x <= x + m_width - 8 + && mouse_y >= y && mouse_y <= y + m_height + 2; + } + + return mouse_x >= x - 1 && mouse_x <= x + m_width + 1 + && mouse_y >= y && mouse_y <= y + m_height + 2; + } + + void input( ) { + bool mouse_clicked = g_input.is_key_pressed( KEYS_MOUSE1 ); + bool hovered = is_hovered( ); + float progress = 0.f; + int x = get_relative_x( ); + int y = get_relative_y( ) + 2; + int mouse_x, mouse_y; + + *m_setting = ( t )( std::clamp< float >( *m_setting, m_min, m_max ) ); + ui_get_cursor_pos( mouse_x, mouse_y ); + + if ( hovered && mouse_clicked ) { + + float progress{ }; + + if( m_has_text ) { + progress = std::clamp< float >( float( mouse_x - x ) / ( m_width - 3 ), 0.f, 1.0f ); + } + else { + progress = std::clamp< float >( float( mouse_x - x - 4 ) / ( m_width - 10 ), 0.f, 1.0f ); + } + + *m_setting = progress == 1.0f ? m_full : ( t )( ( ( m_max - m_min ) * progress ) + m_min ); + } + + if( !m_has_text ) { + bool y_hover = mouse_y >= y && mouse_y <= y + m_height + 1; + + bool minus_hovered = mouse_x >= x - 1 && mouse_x <= x + 3 && y_hover; + bool plus_hovered = mouse_x >= x + m_width - 2 && mouse_x <= x + m_width + 2 && y_hover; + + if( mouse_clicked ) { + if( !m_mouse_held ) { + if( !std::is_floating_point< t >::value ) { + if( minus_hovered ) *m_setting -= ( t )1; + if( plus_hovered ) *m_setting += ( t )1; + } + else if( m_max - m_min <= 2.0f ) { + if( minus_hovered ) *m_setting -= ( t )0.1f; + if( plus_hovered ) *m_setting += ( t )0.1f; + } + } + + m_mouse_held = true; + } + else { + m_mouse_held = false; + } + } + }; + + void draw_slider( int x, int y ) { + float val = float( *m_setting ); + float progress = ( val - m_min ) / ( m_max - m_min ); + + ui_draw_rect( x, y, m_width, m_height, ui_get_disabled_col( ) ); + + ui_draw_rect( x, y, ( int )( ( m_width - 3 ) * progress ), m_height, ui_get_accent_col( ) ); + ui_draw_rect( x + ( int )( ( m_width - 3 ) * progress ), y, 3, m_height, + is_hovered( ) ? ui_get_text_col( ) : ui_get_accent_col( ) * 0.7f ); + } + + void draw_slider_small( int x, int y ) { + float val = float( *m_setting ); + float progress = ( val - m_min ) / ( m_max - m_min ); + x -= 1; //i couldnt be fucked + + ui_draw_rect( x + 5, y, m_width - 8, m_height, ui_get_disabled_col( ) ); + + ui_draw_rect( x + 5, y, ( int )( ( m_width - 10 ) * progress ), m_height, ui_get_accent_col( ) ); + ui_draw_rect( x + ( int )( ( m_width - 10 ) * progress ) + 3, y, 3, m_height, + is_hovered( ) ? ui_get_text_col( ) : ui_get_accent_col( ) * 0.7f ); + + ui_draw_string( x, y - 3, false, ui_get_text_col( ), "-" ); + ui_draw_string( x + m_width - 2, y - 3, false, ui_get_text_col( ), "+" ); + + char val_str[ 12 ]; + if( m_suffix ) + sprintf_s( val_str, 12, t( 0.1f ) == t( 0 ) ? "%d %s" : "%0.2f %s", *m_setting, m_suffix ); + else + sprintf_s( val_str, 12, t( 0.1f ) == t( 0 ) ? "%d" : "%0.2f", *m_setting ); + + ui_draw_string( x + ( int )( ( m_width - 8 ) * progress ) + 3, y + 2, true, ui_get_text_col( ), val_str ); + } + + virtual int get_total_height( ) const override { + return m_height + ( m_has_text ? 12 : 6 ); + } + + virtual void render( ) override { + int x = get_relative_x( ); + int y = get_relative_y( ); + int text_w, text_h; + char val[ 12 ]; + + input( ); + + //weird hacky fix for floating point vars + if ( m_suffix ) + sprintf_s( val, 12, t( 0.1f ) == t( 0 ) ? "%d %s" : "%0.2f %s", *m_setting, m_suffix ); + else + sprintf_s( val, 12, t( 0.1f ) == t( 0 ) ? "%d" : "%0.2f", *m_setting ); + + if( m_has_text ) { + ui_draw_string( x + 2, y, false, ui_get_text_col( ), m_text ); + ui_get_text_size( text_w, text_h, val ); + ui_draw_string( x + m_width - text_w - 1, y, false, ui_get_text_col( ), val ); + draw_slider( x, y + 12 ); + } + else { + draw_slider_small( x, y + 2 ); + } + } + + + protected: + t* m_setting; + t m_full; + float m_min; + float m_max; + bool m_has_text = true; + const char* m_suffix; + bool m_mouse_held = false; + }; +} \ No newline at end of file diff --git a/cheat/gmod/ui_tab_manager.h b/cheat/gmod/ui_tab_manager.h new file mode 100644 index 0000000..b771470 --- /dev/null +++ b/cheat/gmod/ui_tab_manager.h @@ -0,0 +1,228 @@ +#pragma once +#include "ui_base_item.h" + + + +namespace ui +{ + namespace { + constexpr int BUTTON_WIDTH = 120; + constexpr int BUTTON_HEIGHT = 100; + + constexpr int SUBTAB_HEIGHT = 25; + } + + class c_tab_sheet : public base_item { + public: + c_tab_sheet( const char* tab_name ) : + base_item( 0, 0, 0, 0, tab_name ), + m_fade_progress( 0 ) { }; + + c_tab_sheet( const char* tab_name, d3d::c_sprite* sprite ) : + base_item( 0, 0, 0, 0, tab_name ), m_sprite( sprite ), + m_fade_progress( 0.f ) { + }; + + virtual void render( ) override { }; + virtual bool is_hovered( ) override { + return false; + }; + + public: + float m_fade_progress{ }; + d3d::c_sprite* m_sprite{ }; + }; + + + class c_tab_manager : public base_item { + public: + c_tab_manager( ) : base_item( BUTTON_WIDTH + 11, 0, 0, 0, + xors( "TAB_MANAGER" ) ) { }; + + virtual bool is_hovered( ) override { + return false; + } + + inline void scale_button_fade( c_tab_sheet* item, bool hovered ) { + if ( hovered ) { + constexpr float frequency = 1.f / 0.3f; + const float step = ui_get_frametime( ) * frequency; + + item->m_fade_progress = std::clamp( item->m_fade_progress + step, 0.f, 0.8f ); + } + else { + item->m_fade_progress = 0.f; + } + } + + auto get_selected_tab( ) { + return m_selected_tab; + } + + void draw_tab_button( decltype( m_parent )& button, int start, bool hovered ) { + auto item = ( c_tab_sheet* )button.get( ); + auto text = item->get_text( ); + auto parent_x = m_parent->x( ) + 5; + auto parent_y = m_parent->y( ) + 5; + int item_height = BUTTON_HEIGHT; + + scale_button_fade( item, hovered ); + + ui_draw_rect( parent_x, parent_y + start, BUTTON_WIDTH + 1, + item_height + 1, ui_get_bg_col( ) ); + + ui_draw_line( parent_x + BUTTON_WIDTH - 8, parent_y + start - 1, + parent_x + BUTTON_WIDTH - 8, parent_y + start + BUTTON_HEIGHT + 2, + ui_get_disabled_col( ) ); + + if( hovered ) { + ui_draw_line( parent_x + BUTTON_WIDTH - 8, parent_y + start - 1, + parent_x + BUTTON_WIDTH - 8, parent_y + start + BUTTON_HEIGHT + 2, + ui_get_accent_col( ) * ( item->m_fade_progress + 0.2f ) * 0.8f ); + } + + if( item->m_sprite ) { + auto sprite_color = hovered ? ui_get_text_col( ) * ( ( item->m_fade_progress + 0.3f ) * 0.7f ) : ui_get_disabled_col( ); + item->m_sprite->draw( parent_x + ( BUTTON_WIDTH - 8 ) / 2 - 2, + parent_y + BUTTON_HEIGHT / 2 + start, sprite_color ); + } + else { + g_con->log( "sprite is null" ); + } + } + + inline bool is_button_hovered( int start ) { + auto item_x = m_parent->x( ) + 5; + auto item_y = m_parent->y( ) + 5 + start; + int item_height = BUTTON_HEIGHT; + int mouse_x, mouse_y; + + ui_get_cursor_pos( mouse_x, mouse_y ); + + return mouse_x >= item_x && mouse_x <= item_x + BUTTON_WIDTH - 8 + && mouse_y >= item_y && mouse_y <= item_y + item_height; + } + + virtual void render( ) override { + if ( !m_items.empty( ) ) { + int cur_y{ 10 }; + for ( auto& it : m_items ) { + it->set_visible( false ); + bool hovered = is_button_hovered( cur_y ); + if ( g_input.is_key_pressed( KEYS_MOUSE1 ) && hovered ) { + //fix items that disable input mess it up when changing tabs + set_disabled_callbacks( false ); + m_selected_tab = it; + } + + draw_tab_button( it, cur_y, hovered || it == m_selected_tab ); + cur_y += BUTTON_HEIGHT + 4; + } + } + + if ( !m_selected_tab ) { + m_selected_tab = m_items.front( ); + } + + m_selected_tab->set_visible( true ); + } + + protected: + decltype( m_parent ) m_selected_tab{ }; + }; + + + class c_subtab_manager : public base_item { + public: + c_subtab_manager( ) : base_item( 0, 35, 0, 5, + xors( "SUBTAB_MANAGER" ) ) { } + + virtual bool is_hovered( ) override { return false; } + + int get_button_width( ) { + int width = get_top_parent( )->w( ) - BUTTON_WIDTH - 26; + + if ( !m_items.empty( ) ) + return ( int )std::ceilf( float( width ) / float( m_items.size( ) ) ); + + return width; + } + + inline void scale_button_fade( c_tab_sheet* item, bool hovered ) { + if ( hovered ) { + constexpr float frequency = 1.f / 0.3f; + const float step = ui_get_frametime( ) * frequency; + + item->m_fade_progress = std::clamp( item->m_fade_progress + step, 0.f, 0.8f ); + } + else { + item->m_fade_progress = 0.f; + } + } + + auto get_selected_tab( ) { + return m_selected_tab; + } + + void render_button( decltype( m_parent )& button, int start, bool hovered ) { + auto item = ( c_tab_sheet* )button.get( ); + auto item_x = get_relative_x( ) + start - 2; + auto item_y = get_relative_y( ) + 3 - m_y; + auto width = get_button_width( ); + + scale_button_fade( item, hovered ); + clr_t tab_clr = ui_get_disabled_col( ); + + //ui_draw_rect( item_x, item_y, get_button_width( ), SUBTAB_HEIGHT, ui_get_bg_col( ) ); + ui_draw_rect( item_x + 1, item_y + SUBTAB_HEIGHT - 2, width, 2, tab_clr ); + if ( hovered ) { + clr_t col = ui_get_accent_col( ); + col.a( ) *= item->m_fade_progress; + ui_draw_rect( item_x + 1, item_y + SUBTAB_HEIGHT - 2, width, 2, col ); + } + + ui_draw_string( item_x + width / 2, item_y + 4, true, ui_get_text_col( ), item->get_text( ) ); + } + + bool is_button_hovered( decltype( m_parent )& button, int start ) { + int item_x = get_relative_x( ) + start - 2; + int item_y = get_relative_y( ) + 3 - m_y - 3; + int item_w = get_button_width( ); + int mouse_x, mouse_y; + + ui_get_cursor_pos( mouse_x, mouse_y ); + + return mouse_x >= item_x && mouse_x <= item_x + item_w && + mouse_y >= item_y && mouse_y <= item_y + SUBTAB_HEIGHT; + } + + virtual void render( ) override { + if ( !m_items.empty( ) ) { + int start = 2; + int width = get_button_width( ); + + for ( auto& it : m_items ) { + it->set_visible( false ); + bool hovered = is_button_hovered( it, start ); + if ( g_input.is_key_pressed( KEYS_MOUSE1 ) && hovered ) { + //fix items that disable input mess it up when changing tabs + set_disabled_callbacks( false ); + m_selected_tab = it; + } + + render_button( it, start, hovered || it == m_selected_tab ); + start += width; + } + + if ( !m_selected_tab ) { + m_selected_tab = m_items.front( ); + } + + m_selected_tab->set_visible( true ); + } + } + + protected: + decltype( m_parent ) m_selected_tab; + }; +} \ No newline at end of file diff --git a/cheat/gmod/ui_text_input.h b/cheat/gmod/ui_text_input.h new file mode 100644 index 0000000..f486106 --- /dev/null +++ b/cheat/gmod/ui_text_input.h @@ -0,0 +1,47 @@ +#pragma once +#include "ui_base_item.h" + +namespace ui +{ + class c_text_input : public base_item { + c_text_input( int x, int y, int w, const char* name, size_t max_chars, char* str ) : + base_item( x, y, w, 16, name ), m_length( max_chars ), m_str( str ) { } + + virtual bool is_hovered( ) override { + + } + + void input( ) { + static float last_press[ KEYS_MAX ]{ }; + + int key = g_input.is_any_key_pressed( ); + if ( key == KEYS_BACK ) { + if ( strlen( m_str ) ) { + m_str[ strlen( m_str ) - 1 ] = 0; + } + } + if ( key != KEYS_NONE ) { + float cur_time = GetTickCount( ) * 0.001f; + if ( std::abs( cur_time - last_press[ key ] ) > 0.1f ) { + + auto scan_code = MapVirtualKeyA( key, MAPVK_VK_TO_VSC ); + uword_t ascii; + ToAscii( key, scan_code, 0, &ascii, 0 ); + char str[ 2 ] = { ( char )ascii, 0 }; + strcat_s( m_str, m_length, str ); + + last_press[ key ] = cur_time; + } + } + } + + virtual void render( ) override { + + } + + protected: + size_t m_length{ }; + char* m_str{ }; + + }; +} \ No newline at end of file diff --git a/cheat/gmod/util.cpp b/cheat/gmod/util.cpp new file mode 100644 index 0000000..a038871 --- /dev/null +++ b/cheat/gmod/util.cpp @@ -0,0 +1,265 @@ +#include "util.hpp" + +#include "interface.hpp" +#include "c_base_player.hpp" +#include "pattern.hpp" +#include "context.hpp" +#include "settings.hpp" +#include "math.hpp" +#include "base_cheat.hpp" + +float TICK_INTERVAL( ) { + return g_gmod.m_globals->m_interval_per_tick; +} + +int TIME_TO_TICKS( float dt ) { + return static_cast< int >( 0.5f + dt / TICK_INTERVAL( ) ); +} + +float TICKS_TO_TIME( int tick ) { + return tick * TICK_INTERVAL( ); +} + +bool util::is_low_fps( ) { + return g_gmod.m_globals->m_frametime > g_gmod.m_globals->m_interval_per_tick; +} + +/* +int util::get_closest_player( ) { + float cur_fov{ 360.f }; + int ret{ -1 }; + vec3_t viewangles{ }; + vec3_t local_pos{ }; + + bool friendlies = g_settings.rage.active ? + g_settings.rage.friendlies : g_settings.legit.friendlies; + + local_pos = g_ctx.m_local->get_eye_pos( ); + g_gmod.m_engine( )->GetViewAngles( viewangles ); + + for( int i{ 1 }; i < g_gmod.m_globals->m_maxclients; ++i ) { + auto ent = g_gmod.m_entlist( )->GetClientEntity< >( i ); + + if( !ent ) continue; + if( ent == g_ctx.m_local ) continue; + if( !ent->is_valid( ) ) continue; + int team = ent->m_iTeamNum( ); + if( team == g_ctx.m_local->m_iTeamNum( ) && !friendlies ) { + continue; + } + + auto ang = math::vector_angles( local_pos, ent->get_hitbox_pos( 0 ) ); + ang.clamp( ); + + float fov = ( viewangles - ang ).clamp( ).length2d( ); + if( fov < cur_fov ) { + ret = i; + cur_fov = fov; + } + } + + return ret; +} +*/ + +void util::clip_trace_to_player( IClientEntity* player, const vec3_t& src, const vec3_t& end, + unsigned mask, CTraceFilter* filter, CGameTrace* tr ) { + CGameTrace player_trace; + Ray_t ray; + float smallest_fraction = tr->fraction; + + ray.Init( src, end ); + + if ( !filter->ShouldHitEntity( player, mask ) ) { + return; + } + + g_gmod.m_trace( )->ClipRayToEntity( ray, mask | CONTENTS_HITBOX, player, &player_trace ); + + if ( player_trace.fraction < smallest_fraction ) { + *tr = player_trace; + smallest_fraction = player_trace.fraction; + } +} + +std::string util::hitgroup_to_string( int hitgroup ) { + switch( hitgroup ) { + case HITGROUP_CHEST: + return xors( "chest" ); + case HITGROUP_HEAD: + return xors( "head" ); + case HITGROUP_LEFTARM: + return xors( "left arm" ); + case HITGROUP_LEFTLEG: + return xors( "left leg" ); + case HITGROUP_RIGHTARM: + return xors( "right arm" ); + case HITGROUP_RIGHTLEG: + return xors( "right leg" ); + case HITGROUP_STOMACH: + return xors( "stomach" ); + default: + return xors( "generic" ); + } +} + +bool util::trace_ray( const vec3_t& start, const vec3_t& end, IClientEntity* a, IClientEntity* b ) { + CGameTrace tr; + Ray_t ray; + CTraceFilter filter; + + filter.pSkip = a; + + ray.Init( start, end ); + + g_gmod.m_trace( )->TraceRay( ray, 0x46004003 | CONTENTS_HITBOX, &filter, &tr ); + clip_trace_to_player( b, start, end, ( unsigned )0x46004003, &filter, &tr ); + + return tr.m_pEnt == b || tr.fraction > 0.98f; +} + +void util::set_random_seed( int seed ) { + using fn = int( __cdecl* )( int ); + static fn fn_ptr = ( fn )( GetProcAddress( + GetModuleHandleA( xors( "vstdlib.dll" ) ), + xors( "RandomSeed" ) ) ); + + fn_ptr( seed ); +} + +float util::get_random_float( float min, float max ) { + using fn = float( *)( float, float ); + static fn fn_ptr = ( fn )( GetProcAddress( + GetModuleHandleA( xors( "vstdlib.dll" ) ), + xors( "RandomFloat" ) ) ); + + return fn_ptr( min, max ); +} + +vec3_t util::get_spread_dir( float inaccuracy, float spread, vec3_t angles, int seed ) { + set_random_seed( ( seed & 0xff ) + 1 ); + + float rand_a = get_random_float( 0.0f, 1.0f ); + float pi_rand_a = get_random_float( 0.f, 2.f * M_PI ); + float rand_b = get_random_float( 0.f, 1.0f ); + float pi_rand_b = get_random_float( 0.f, 2.f * M_PI ); + + float spread_x = cos( pi_rand_a ) * ( rand_a * inaccuracy ) + cos( pi_rand_b ) * ( rand_b * spread ); + float spread_y = sin( pi_rand_a ) * ( rand_a * inaccuracy ) + sin( pi_rand_b ) * ( rand_b * spread ); + + vec3_t forward, right, up; + math::angle_vectors( angles, &forward, &right, &up ); + + vec3_t spread_dir = forward + ( right * spread_x ) + ( up * spread_y ); + spread_dir.normalize_vector( ); + + return spread_dir; +} + +float util::get_total_latency( ) { + auto nci = g_gmod.m_engine( )->GetNetChannelInfo( ); + + if ( nci ) { + float latency = nci->GetLatency( 0 ) + nci->GetLatency( 1 ); + return latency; + } + + return 0.f; +} + +float util::get_lerptime( ) { + static cvar_t* cl_interpolate = g_gmod.m_cvar( )->FindVar( xors( "cl_interpolate" ) ); + static cvar_t* cl_interp = g_gmod.m_cvar( )->FindVar( xors( "cl_interp" ) ); + static cvar_t* cl_updaterate = g_gmod.m_cvar( )->FindVar( xors( "cl_updaterate" ) ); + static cvar_t* cl_interp_ratio = g_gmod.m_cvar( )->FindVar( xors( "cl_interp_ratio" ) ); + + if( cl_interp && cl_interpolate && cl_updaterate && cl_interp_ratio ) { + bool interpolate = cl_interpolate->get_int( ); + if( interpolate ) { + float interp = cl_interp->get_float( ); + float interp_ratio = cl_interp_ratio->get_float( ); + float updaterate = cl_updaterate->get_float( ); + + return std::max< float >( interp, interp_ratio / updaterate ); + } + } + + return 0.f; +} + +/* +bool util::is_tick_valid( int tickcount ) { + float latency = get_total_latency( ); + float correct = std::clamp( latency + get_lerptime( ), 0.f, 1.f ); + float delta = correct - ( g_ctx.pred_time( ) - TICKS_TO_TIME( tickcount ) + TICK_INTERVAL( ) * 2.f ); + + return std::abs( delta ) < 0.2f; +} + +bool util::is_tick_valid( int tickcount, float in_latency ) { + float latency = in_latency; + auto nci = g_gmod.m_engine( )->GetNetChannelInfo( ); + if( nci ) { + latency += nci->GetLatency( 0 ); + } + + float correct = std::clamp( latency + get_lerptime( ), 0.f, 1.f ); + float delta = correct - ( g_ctx.pred_time( ) - TICKS_TO_TIME( tickcount ) + TICK_INTERVAL( ) ); + + return std::abs( delta ) < 0.2f; +} +*/ +void util::disable_pvs( ) { + for( int i{ 1 }; i < 65; ++i ) { + auto ent = g_gmod.m_entlist( )->GetClientEntity< >( i ); + + if( !ent || !ent->is_valid( ) ) + continue; + + if( ent == g_ctx.m_local ) + continue; + + *( int* )( uintptr_t( ent ) + 0xa30 ) = g_gmod.m_globals->m_framecount; + *( int* )( uintptr_t( ent ) + 0xa28 ) = 0; + } +} + +vec2_t util::screen_transform( vec3_t world ) { + vec2_t screen; + auto w2s = [ &world, &screen ]( ) -> bool { + + //matrix3x4& matrix2 = *( matrix3x4* )( 0x18C * 2 + *( uintptr_t * )( ( uintptr_t )g_gmod.m_engine_render( ) + 0xDC ) - 0x44 ); + VMatrix& matrix = g_cheat.m_visuals.get_matrix( ); + + screen.x = matrix[ 0 ][ 0 ] * world[ 0 ] + matrix[ 0 ][ 1 ] * world[ 1 ] + matrix[ 0 ][ 2 ] * world[ 2 ] + matrix[ 0 ][ 3 ]; + screen.y = matrix[ 1 ][ 0 ] * world[ 0 ] + matrix[ 1 ][ 1 ] * world[ 1 ] + matrix[ 1 ][ 2 ] * world[ 2 ] + matrix[ 1 ][ 3 ]; + + float w = matrix[ 3 ][ 0 ] * world[ 0 ] + matrix[ 3 ][ 1 ] * world[ 1 ] + matrix[ 3 ][ 2 ] * world[ 2 ] + matrix[ 3 ][ 3 ]; + + if( w < 0.001f ) { + //screen.x *= 100000.f; + //screen.y *= 100000.f; + return true; + } + + float invw = 1.0f / w; + screen.x *= invw; + screen.y *= invw; + + return false; + }; + + w2s( ); + //if ( !w2s( ) ) { + int w, h; + g_gmod.m_engine( )->GetScreenSize( w, h ); + + screen.x = ( w * .5f ) + ( screen.x * w ) * .5f; + screen.y = ( h * .5f ) - ( screen.y * h ) * .5f; + + return screen; + //} + + return vec2_t{ }; +} + diff --git a/cheat/gmod/util.hpp b/cheat/gmod/util.hpp new file mode 100644 index 0000000..0013611 --- /dev/null +++ b/cheat/gmod/util.hpp @@ -0,0 +1,102 @@ +#pragma once +#include +#include + +#include "strings.hpp" + +#define NAMESPACE_REGION( x ) namespace x { +#define END_REGION } + +extern int TIME_TO_TICKS( float dt ); +extern float TICKS_TO_TIME( int tick ); +extern float TICK_INTERVAL( ); + +//WEE WOO WEE WOO ITS THE DWORD POLICE +using ulong_t = unsigned long; +using uword_t = unsigned short; + +class IClientEntity; +class CTraceFilter; +class CGameTrace; +class vec3_t; +class vec2_t; + +NAMESPACE_REGION( util ) + +template < typename t > +struct reverse_iterable { + reverse_iterable( t&& it ) : + iterable( it ) { } + + t& iterable; + inline auto begin( ) { + return std::rbegin( iterable ); + } + + inline auto end( ) { + return std::rend( iterable ); + } +}; + +template< typename t > +reverse_iterable< t > +reverse_iterator( t&& iter ) { + return reverse_iterable< t >{ iter }; +} + +template < typename fn > __forceinline fn get_vfunc( void* classbase, int index ) { + if ( !classbase ) return fn{ }; + return ( fn )( *( uintptr_t** )classbase )[ index ]; +} + +template < size_t index, typename ret, class ... args_ > +__forceinline ret get_vfunc( void* thisptr, args_... args ) { + using fn = ret( __thiscall* )( void*, args_... ); + + auto fn_ptr = ( fn )( *( uintptr_t** )thisptr )[ index ]; + return fn_ptr( thisptr, args... ); +} + +__forceinline std::string unicode_to_ascii( const std::wstring& unicode ) { + std::string ascii_str( unicode.begin( ), unicode.end( ) ); + return ascii_str; +} + +__forceinline std::wstring ascii_to_unicode( const std::string& ascii ) { + std::wstring unicode_str( ascii.begin( ), ascii.end( ) ); + return unicode_str; +} + +template < typename integer > +__forceinline auto to_hex_str( const integer& w, + size_t hex_len = sizeof( integer ) << 1 ) { + constexpr const char* hex_digits = xors( "0123456789abcdef" ); + std::string rc( hex_len, 0 ); + + for( size_t i{ }, j{ ( hex_len - 1 ) * 4 } ; i < hex_len; ++i, j -= 4 ) + rc[ i ] = hex_digits[ ( w >> j ) & 0x0f ]; + + return rc; +} + +extern void clip_trace_to_player( IClientEntity* player, const vec3_t& src, const vec3_t& end, + unsigned mask, CTraceFilter* filter, CGameTrace* trace ); + +extern bool trace_ray( const vec3_t& start, const vec3_t& end, IClientEntity* a, IClientEntity* b ); +extern bool is_low_fps( ); +extern bool is_tick_valid( int tickcount ); +extern bool is_tick_valid( int tickcount, float in_latency ); +extern void set_random_seed( int seed ); +extern vec3_t get_spread_dir( float inaccuracy, float spread, vec3_t angles, int seed ); +extern float get_random_float( float min, float max ); +extern bool hitchance( int target, const vec3_t& angles, int percentage ); +extern float get_total_latency( ); +extern float get_lerptime( ); +extern int get_closest_player( ); +extern vec2_t screen_transform( vec3_t world ); +extern const char* definition_index_to_name( int index ); +extern void disable_pvs( ); +extern int hitbox_to_hitgroup( int hitbox ); +extern std::string hitgroup_to_string( int hitgroup ); + +END_REGION \ No newline at end of file diff --git a/cheat/gmod/vector.hpp b/cheat/gmod/vector.hpp new file mode 100644 index 0000000..a917bb8 --- /dev/null +++ b/cheat/gmod/vector.hpp @@ -0,0 +1,329 @@ +#pragma once +#include +#include + +class vec2_t { +public: + vec2_t( ) { + x = y = 0.0f; + } + + vec2_t( float X, float Y ) { + x = X; y = Y; + } + + vec2_t( float* v ) { + x = v[ 0 ]; y = v[ 1 ]; + } + + vec2_t( const float* v ) { + x = v[ 0 ]; y = v[ 1 ]; + } + + vec2_t( const vec2_t& v ) { + x = v.x; y = v.y; + } + + vec2_t& operator=( const vec2_t& v ) { + x = v.x; y = v.y; return *this; + } + + float& operator[]( int i ) { + return ( ( float* )this )[ i ]; + } + + float operator[]( int i ) const { + return ( ( float* )this )[ i ]; + } + + vec2_t& operator+=( const vec2_t& v ) { + x += v.x; y += v.y; return *this; + } + + vec2_t& operator-=( const vec2_t& v ) { + x -= v.x; y -= v.y; return *this; + } + + vec2_t& operator*=( const vec2_t& v ) { + x *= v.x; y *= v.y; return *this; + } + + vec2_t& operator/=( const vec2_t& v ) { + x /= v.x; y /= v.y; return *this; + } + + vec2_t& operator+=( float v ) { + x += v; y += v; return *this; + } + + vec2_t& operator-=( float v ) { + x -= v; y -= v; return *this; + } + + vec2_t& operator*=( float v ) { + x *= v; y *= v; return *this; + } + + vec2_t& operator/=( float v ) { + x /= v; y /= v; return *this; + } + + vec2_t operator+( const vec2_t& v ) const { + return vec2_t( x + v.x, y + v.y ); + } + + vec2_t operator-( const vec2_t& v ) const { + return vec2_t( x - v.x, y - v.y ); + } + + vec2_t operator*( const vec2_t& v ) const { + return vec2_t( x * v.x, y * v.y ); + } + + vec2_t operator/( const vec2_t& v ) const { + return vec2_t( x / v.x, y / v.y ); + } + + vec2_t operator+( float v ) const { + return vec2_t( x + v, y + v ); + } + + vec2_t operator-( float v ) const { + return vec2_t( x - v, y - v ); + } + + vec2_t operator*( float v ) const { + return vec2_t( x * v, y * v ); + } + + vec2_t operator/( float v ) const { + return vec2_t( x / v, y / v ); + } + + void set( float X = 0.0f, float Y = 0.0f ) { + x = X; y = Y; + } + + float length( void ) const { + return sqrtf( x * x + y * y ); + } + + float lengthsqr( void ) const { + return ( x * x + y * y ); + } + + float dist_to( const vec2_t& v ) const { + return ( *this - v ).length( ); + } + + float dist_to_sqr( const vec2_t& v ) const { + return ( *this - v ).lengthsqr( ); + } + + float dot( const vec2_t& v ) const { + return ( x * v.x + y * v.y ); + } + + bool is_zero( void ) const { + return ( x > -FLT_EPSILON && x < FLT_EPSILON && + y > -FLT_EPSILON && y < FLT_EPSILON ); + } + + operator bool( ) const noexcept { + return !is_zero( ); + } + +public: + float x, y; +}; + +class vec3_t { +public: + vec3_t( ) { + x = y = z = 0.0f; + } + + vec3_t( float X, float Y, float Z ) { + x = X; y = Y; z = Z; + } + + vec3_t( float* v ) { + x = v[ 0 ]; y = v[ 1 ]; z = v[ 2 ]; + } + + vec3_t( const float* v ) { + x = v[ 0 ]; y = v[ 1 ]; z = v[ 2 ]; + } + + vec3_t( const vec3_t& v ) { + x = v.x; y = v.y; z = v.z; + } + + vec3_t( const vec2_t& v ) { + x = v.x; y = v.y; z = 0.0f; + } + + __forceinline vec3_t& operator=( const vec3_t& v ) { + x = v.x; y = v.y; z = v.z; return *this; + } + + __forceinline vec3_t& operator=( const vec2_t& v ) { + x = v.x; y = v.y; z = 0.0f; return *this; + } + + float& operator[]( int i ) { + return ( ( float* )this )[ i ]; + } + + __forceinline float operator[]( int i ) const { + return ( ( float* )this )[ i ]; + } + + vec3_t& operator+=( const vec3_t& v ) { + x += v.x; y += v.y; z += v.z; return *this; + } + + vec3_t& operator-=( const vec3_t& v ) { + x -= v.x; y -= v.y; z -= v.z; return *this; + } + + vec3_t& operator*=( const vec3_t& v ) { + x *= v.x; y *= v.y; z *= v.z; return *this; + } + + vec3_t& operator/=( const vec3_t& v ) { + x /= v.x; y /= v.y; z /= v.z; return *this; + } + + vec3_t& operator+=( float v ) { + x += v; y += v; z += v; return *this; + } + + vec3_t& operator-=( float v ) { + x -= v; y -= v; z -= v; return *this; + } + + vec3_t& operator*=( float v ) { + x *= v; y *= v; z *= v; return *this; + } + + vec3_t& operator/=( float v ) { + x /= v; y /= v; z /= v; return *this; + } + + __forceinline vec3_t operator+( const vec3_t& v ) const { + return vec3_t( x + v.x, y + v.y, z + v.z ); + } + + __forceinline vec3_t operator-( const vec3_t& v ) const { + return vec3_t( x - v.x, y - v.y, z - v.z ); + } + + __forceinline vec3_t operator*( const vec3_t& v ) const { + return vec3_t( x * v.x, y * v.y, z * v.z ); + } + + __forceinline vec3_t operator/( const vec3_t& v ) const { + return vec3_t( x / v.x, y / v.y, z / v.z ); + } + + __forceinline vec3_t operator+( float v ) const { + return vec3_t( x + v, y + v, z + v ); + } + + __forceinline vec3_t operator-( float v ) const { + return vec3_t( x - v, y - v, z - v ); + } + + __forceinline vec3_t operator*( float v ) const { + return vec3_t( x * v, y * v, z * v ); + } + + __forceinline vec3_t operator/( float v ) const { + return vec3_t( x / v, y / v, z / v ); + } + + __forceinline float length( ) const { + return sqrtf( x * x + y * y + z * z ); + } + + __forceinline float lengthsqr( ) const { + return ( x * x + y * y + z * z ); + } + + __forceinline float length2d( ) const { + return sqrtf( x * x + y * y ); + } + + __forceinline float length2dsqr( ) const { + return ( x * x + y * y ); + } + + __forceinline float dist_to( const vec3_t& v ) const { + return ( *this - v ).length( ); + } + + __forceinline float dist_to_sqr( const vec3_t& v ) const { + return ( *this - v ).lengthsqr( ); + } + + __forceinline float dot( const vec3_t& v ) const { + return ( x * v.x + y * v.y + z * v.z ); + } + + __forceinline float fov_to( const vec3_t& to ) const { + const float from_length = length( ); + const float to_length = to.length( ); + + if( from_length && to_length ) { + return acos( dot( to ) / from_length * to_length ); + } + + return 0.f; + } + + vec3_t cross( const vec3_t& v ) const { + return vec3_t( y * v.z - z * v.y, z * v.x - x * v.z, x * v.y - y * v.x ); + } + + bool is_zero( ) const { + return ( x > -FLT_EPSILON && x < FLT_EPSILON && + y > -FLT_EPSILON && y < FLT_EPSILON && + z > -FLT_EPSILON && z < FLT_EPSILON ); + } + + operator bool( ) const { + return !is_zero( ); + } + + inline void normalize_vector( ) { + vec3_t& v = *this; + + float iradius = 1.f / ( this->length( ) + FLT_EPSILON ); //FLT_EPSILON + + v.x *= iradius; + v.y *= iradius; + v.z *= iradius; + } + + vec3_t clamp( ) { + for ( size_t axis{ }; axis < 2; axis++ ) { + auto &cur_axis = operator[]( axis ); + if ( !std::isfinite( cur_axis ) ) { + cur_axis = 0.f; + } + } + + x = std::clamp( x, -89.f, 89.f ); + y = std::clamp( std::remainder( y, 360.f ), -180.f, 180.f ); + z = 0.f; + return *this; + } + +public: + float x, y, z; +}; + +__forceinline vec3_t operator*( float f, const vec3_t& v ) { + return v * f; +} diff --git a/cheat/gmod/visual.hpp b/cheat/gmod/visual.hpp new file mode 100644 index 0000000..748497f --- /dev/null +++ b/cheat/gmod/visual.hpp @@ -0,0 +1,51 @@ +#pragma once +#include +#include "interface.hpp" +#include "vector.hpp" +#include "color.hpp" +#include "d3d.hpp" +#include +#include "strings.hpp" +#include "IVRenderView.hpp" + +class c_base_player; + +namespace features +{ + class c_visuals + { + void draw_line( const vec2_t& a, const vec2_t& b, const clr_t& clr ); + void draw_line( int x, int y, int x1, int y1, const clr_t& clr ); + void draw_rect( int x, int y, int w, int h, const clr_t& clr ); + void draw_filled_rect( int x, int y, int w, int h, const clr_t& clr ); + void draw_circle( int x, int y, int r, const clr_t& clr, int res = 48 ); + + void draw_really_big_string( int x, int y, const clr_t& clr, const char* msg, ... ); + void draw_string( int x, int y, int align, bool big, const clr_t& clr, const char* msg, ... ); + + struct stored_player_data_t + { + std::string m_rank{ }; + clr_t m_team_color{ }; + matrix3x4 m_matrix[ 128 ]{ }; + vec3_t m_pos{ }; + matrix3x4 m_coordinate_frame{ }; + }; + + struct stored_data_t + { + std::array< stored_player_data_t, 256 > m_player{ }; + VMatrix m_matrix{ }; + }; + + stored_data_t m_data{ }; + + void spectator_list( ); + void draw_players( ); + + public: + void operator( )( ); + void store_data( ); + VMatrix& get_matrix( ); + }; +} \ No newline at end of file diff --git a/cheat/gmod/visual_draw.cpp b/cheat/gmod/visual_draw.cpp new file mode 100644 index 0000000..db282a7 --- /dev/null +++ b/cheat/gmod/visual_draw.cpp @@ -0,0 +1,64 @@ +#include "d3d.hpp" +#include "interface.hpp" +#include "renderer.hpp" +#include "visual.hpp" +#include "settings.hpp" + +namespace features +{ + void c_visuals::draw_line( const vec2_t& a, const vec2_t& b, const clr_t& clr ) { + g_d3d.draw_line( clr, a.x, a.y, b.x, b.y ); + } + + void c_visuals::draw_line( int x, int y, int x1, int y1, const clr_t& clr ) { + g_d3d.draw_line( clr, x, y, x1, y1 ); + } + + void c_visuals::draw_rect( int x, int y, int w, int h, const clr_t& clr ) { + g_d3d.draw_rect( clr, x, y, w, h ); + } + + void c_visuals::draw_filled_rect( int x, int y, int w, int h, const clr_t& col ) { + g_d3d.draw_filled_rect( col, x, y, w, h ); + } + + void c_visuals::draw_circle( int x, int y, int r, const clr_t& col, int res ) { + g_d3d.draw_circle( col, x, y, r, res ); + } + + void c_visuals::draw_string( int x, int y, int align, bool big, const clr_t& col, const char* msg, ... ) { + char* buffer = ( char* )_alloca( 1024 ); + va_list list{ }; + + memset( buffer, 0, 1024 ); + + __crt_va_start( list, msg ); + vsprintf_s( buffer, 1024, msg, list ); + __crt_va_end( list ); + + switch( align ) { + case ALIGN_CENTER: + g_d3d.draw_text< ALIGN_CENTER >( big ? ::d3d::fonts.f_12 : ::d3d::fonts.f_esp_small, col, x, y, big ? D3DFONTFLAG_DROPSHADOW : D3DFONTFLAG_OUTLINE, buffer ); + break; + case ALIGN_LEFT: + g_d3d.draw_text< ALIGN_LEFT >( big ? ::d3d::fonts.f_12 : ::d3d::fonts.f_esp_small, col, x, y, big ? D3DFONTFLAG_DROPSHADOW : D3DFONTFLAG_OUTLINE, buffer ); + break; + case ALIGN_RIGHT: + g_d3d.draw_text< ALIGN_RIGHT >( big ? ::d3d::fonts.f_12 : ::d3d::fonts.f_esp_small, col, x, y, big ? D3DFONTFLAG_DROPSHADOW : D3DFONTFLAG_OUTLINE, buffer ); + break; + } + } + + void c_visuals::draw_really_big_string( int x, int y, const clr_t& col, const char* msg, ... ) { + char* buffer = ( char* )_alloca( 1024 ); + va_list list{ }; + + memset( buffer, 0, 1024 ); + + __crt_va_start( list, msg ); + vsprintf_s( buffer, 1024, msg, list ); + __crt_va_end( list ); + + g_d3d.draw_text< ALIGN_LEFT >( ::d3d::fonts.f_18, col, x, y, D3DFONTFLAG_OUTLINE, buffer ); + } +} \ No newline at end of file diff --git a/cheat/gmod/visual_local.cpp b/cheat/gmod/visual_local.cpp new file mode 100644 index 0000000..94de96b --- /dev/null +++ b/cheat/gmod/visual_local.cpp @@ -0,0 +1,503 @@ +#include + +#include "visual.hpp" +#include "context.hpp" +#include "base_cheat.hpp" +#include "renderer.hpp" +#include "input_system.hpp" +#include "math.hpp" + +namespace features +{ + void c_visuals::draw_local( ) { + int screen_w, screen_h; + g_csgo.m_engine( )->GetScreenSize( screen_w, screen_h ); + + int cur_pos{ }; + + if( g_ctx.m_local->is_valid( ) ) { + static float incoming_latency; + if( g_settings.misc.net_fakelag ) { + float desired_latency = incoming_latency + g_settings.misc.net_fakeping_amount * 0.001f; + if( g_settings.misc.net_fakelag == 4 ) + desired_latency = 1.0f; + + auto nci = g_csgo.m_engine( )->GetNetChannelInfo( ); + if( nci ) { + float cur_latency = nci->GetLatency( 1 ); + float percentage = cur_latency / desired_latency; + percentage = std::clamp( percentage + 0.1f, 0.f, 1.f ); + + clr_t col = clr_t::blend( esp_red( ), esp_green( ), percentage ); + + bool visible = g_settings.misc.net_fakeping_active; + if( g_settings.misc.net_fakelag == 4 ) + visible = true; + + if( percentage > 0.35f || visible ) { + g_renderer.draw_string( g_fonts.f_bold, 10, cur_pos += 15, col, xors( "PING" ) ); + } + } + } + else { + auto nci = g_csgo.m_engine( )->GetNetChannelInfo( ); + if( nci ) { + incoming_latency = nci->GetLatency( 1 ); + } + } + + if( g_settings.rage.enabled( ) && + g_settings.rage.anti_aim( ) && + g_settings.rage.break_lby( ) ) { + static float last_lby = 0.f; + static float last_update = 0.f; + float lby = g_ctx.m_local->m_flLowerBodyYawTarget( ); + if( lby != last_lby ) { + last_update = g_csgo.m_globals->m_curtime; + last_lby = lby; + } + + float lby_delta = std::abs( std::remainderf( lby - g_ctx.m_last_realangle.y, 360.f ) ); + float time_delta = g_csgo.m_globals->m_curtime - last_update; + + bool breaking = lby_delta > 35.f && time_delta > 0.2f; + + if( g_cheat.m_ragebot.m_antiaim->is_edging( ) ) { + g_renderer.draw_string( g_fonts.f_bold, 10, cur_pos += 15, esp_green( ), xors( "EDGE" ) ); + } + + g_renderer.draw_string( g_fonts.f_bold, 10, cur_pos += 15, breaking ? esp_green( ) : esp_red( ), xors( "LBY" ) ); + + if( g_settings.rage.preserve_fps && g_settings.rage.enabled && util::is_low_fps( ) ) { + g_renderer.draw_string( g_fonts.f_bold, 10, cur_pos += 15, esp_red( ), xors( "FPS" ) ); + } + + if( g_settings.rage.draw_angles ) { + auto get_rotated_point = [ ]( vec2_t point, float rotation, float distance ) { + float rad = DEG2RAD( rotation ); + + point.x += sin( rad ) * distance; + point.y += cos( rad ) * distance; + + return point; + }; + + auto draw_rotated_triangle = [ &get_rotated_point ]( vec2_t point, float rotation, clr_t col ) { + vec2_t rotated_pos_1 = get_rotated_point( point, rotation + 205.f, 30.f ); + vec2_t rotated_pos_2 = get_rotated_point( point, rotation + 155.f, 30.f ); + + vertex_t v[ ] = { + { point }, + { rotated_pos_1 }, + { rotated_pos_2 } + }; + + g_renderer.draw_polygon( 3, v, col ); + }; + + vec2_t rotated_lby{ screen_w * 0.5f, screen_h * 0.5f }; + vec2_t rotated_real{ screen_w * 0.5f, screen_h * 0.5f }; + + vec3_t angles{ }; + g_csgo.m_engine( )->GetViewAngles( angles ); + + float rotation_lby = std::remainderf( g_ctx.m_local->m_flLowerBodyYawTarget( ) - angles.y, 360.f ) - 180.f; + float rotation_real = std::remainderf( g_ctx.m_last_realangle.y - angles.y, 360.f ) - 180.f; + + rotated_lby = get_rotated_point( rotated_lby, rotation_lby, 120.f ); + rotated_real = get_rotated_point( rotated_real, rotation_real, 120.f ); + + draw_rotated_triangle( rotated_lby, rotation_lby, g_settings.rage.lby_color ); + draw_rotated_triangle( rotated_real, rotation_real, g_settings.rage.real_color ); + } + } + + if( g_settings.rage.fakelag.mode( ) && + g_settings.rage.fakelag.ticks( ) && + g_settings.rage.fakelag.in_air( ) ) { + int min_dist = 64; + int max_ticks = g_settings.rage.fakelag.ticks; + if( g_settings.rage.fakelag.mode == 2 ) { + max_ticks += g_settings.rage.fakelag.fluctuate * 0.01f; + max_ticks = math::min( max_ticks, 15 ); + } + + float speed = g_ctx.m_local->m_vecVelocity( ).length2d( ); + if( speed > 255 && speed * g_csgo.m_globals->m_interval_per_tick * max_ticks > 50 ) { + bool breaking = g_cheat.m_lagmgr.is_breaking_lc( ); + g_renderer.draw_string( g_fonts.f_bold, 10, cur_pos += 15, breaking ? esp_green( ) : esp_red( ), xors( "LC" ) ); + } + } + } + + if( g_settings.misc.no_scope( ) && + g_ctx.m_local->m_bIsScoped( ) ) { + int w, h; + g_csgo.m_engine( )->GetScreenSize( w, h ); + + g_renderer.draw_line( 0, h / 2, w, h / 2, clr_t( 0, 0, 0 ) ); + g_renderer.draw_line( w / 2, 0, w / 2, h, clr_t( 0, 0, 0 ) ); + } + + draw_spread( ); + draw_autowall( ); + spectator_list( ); + grenade_prediction( ); + } + + void c_visuals::spectator_list( ) { + if( !g_settings.visuals.spec_list ) + return; + + std::vector< std::string > spec_list; + + for( size_t i{ }; i < 65; ++i ) { + auto ent = g_csgo.m_entlist( )->GetClientEntity< >( i ); + if( ent && ent->is_player( ) && !ent->ce( )->IsDormant( ) ) { + auto spec_handle = ent->m_hObserverTarget( ); + auto spec_ent = g_csgo.m_entlist( )->GetClientEntityFromHandle< >( spec_handle ); + + if( spec_ent == g_ctx.m_local ) { + char player_name[ 32 ]; + ent->get_name_safe( player_name ); + spec_list.push_back( player_name ); + } + } + } + + int screen_w, screen_h; + g_csgo.m_engine( )->GetScreenSize( screen_w, screen_h ); + + int cur_pos{ }; + + if( g_settings.misc.watermark ) { + cur_pos = 20; + } + + for( auto& it : spec_list ) { + g_renderer.draw_string< ALIGN_RIGHT >( g_fonts.f_12, screen_w - 3, cur_pos, clr_t( 255, 255, 255 ), it.c_str( ) ); + cur_pos += 10; + } + } + + void c_visuals::grenade_prediction( ) { + static auto molotov_detonate_time = g_csgo.m_cvar( )->FindVar( xors( "molotov_throw_detonate_time" ) ); + static auto molotov_detonate_slope = g_csgo.m_cvar( )->FindVar( xors( "weapon_molotov_maxdetonateslope" ) ); + static auto sv_gravity = g_csgo.m_cvar( )->FindVar( xors( "sv_gravity" ) ); + + if( !g_settings.visuals.grenade_prediction ) + return; + + auto is_grenade = [ ]( int defindex ) { + switch( defindex ) { + case WEAPON_FLASHBANG: + case WEAPON_HEGRENADE: + case WEAPON_SMOKEGRENADE: + case WEAPON_MOLOTOV: + case WEAPON_INCGRENADE: + case WEAPON_DECOY: + return true; + default: return false; + } + }; + + auto get_detonate_time = [ ]( int defindex ) { + switch( defindex ) { + case WEAPON_FLASHBANG: + case WEAPON_HEGRENADE: + return 1.5f; + case WEAPON_INCGRENADE: + case WEAPON_MOLOTOV: + return molotov_detonate_time->get_float( ); + case WEAPON_DECOY: + return 5.f; + default: return 3.f; + } + }; + + auto draw_3d_line = [ ]( const vec3_t& start, const vec3_t& end, clr_t col, bool circle = false ) { + vec2_t start_w2s = util::screen_transform( start ); + vec2_t end_w2s = util::screen_transform( end ); + + g_renderer.draw_line( start_w2s, end_w2s, col ); + if( circle ) + g_renderer.draw_filled_circle( end_w2s.x, end_w2s.y, 2, clr_t( 230, 230, 230 ), 24 ); + }; + + auto clip_velocity = [ ]( const vec3_t& in, const vec3_t& normal, vec3_t& out, float overbounce ) { + int blocked = 0; + float angle = normal[ 2 ]; + + if( angle > 0.f ) + blocked |= 1; + + if( !angle ) + blocked |= 2; + + float backoff = in.dot( normal ) * overbounce; + + for( int i{ }; i < 3; ++i ) { + out[ i ] = in[ i ] - ( normal[ i ] * backoff ); + + if( out[ i ] > -0.1f && out[ i ] < 0.1f ) { + out[ i ] = 0.f; + } + } + + return blocked; + }; + + auto weapon = g_ctx.m_local->get_weapon( ); + if( !weapon ) return; + + int def_index = weapon->m_iItemDefinitionIndex( ); + if( !is_grenade( def_index ) || !weapon->m_bPinPulled( ) ) + return; + + auto wpn_info = weapon->get_wpn_info( ); + + vec3_t throw_ang, forward; + g_csgo.m_engine( )->GetViewAngles( throw_ang ); + throw_ang.x -= ( 90.f - abs( throw_ang.x ) ) * 0.11111111f; + throw_ang.x = std::remainderf( throw_ang.x, 360.f ); + + forward = math::angle_vectors( throw_ang ); + + float throw_strength = weapon->m_flThrowStrength( ); + float throw_velocity = std::min( std::max( wpn_info->throw_velocity * 0.9f, 15.f ), 750.f ); + + float throw_height = ( throw_strength * 12.f ) - 12.f; + float v68 = throw_velocity * ( ( 0.7f * throw_strength ) + 0.3f ); + + vec3_t start_pos = g_ctx.m_local->get_eye_pos( ) + vec3_t( 0, 0, throw_height ); + vec3_t end_pos = start_pos + ( forward * 22.f ); + + CTraceFilter filter; + filter.pSkip = g_ctx.m_local; + + CGameTrace trace; + Ray_t ray; + ray.Init( start_pos, end_pos, vec3_t( -2.f, -2.f, -2.f ), vec3_t( 2.f, 2.f, 2.f ) ); + + g_csgo.m_trace( )->TraceRay( ray, MASK_SOLID | CONTENTS_CURRENT_90, &filter, &trace ); + end_pos = trace.endpos - forward * 6.f; + vec3_t throw_pos = g_ctx.m_local->m_vecVelocity( ) * 1.25f + forward * v68; + + //draw_3d_line( start_pos, end_pos, clr_t( 66, 143, 244 ) ); + float gravity = sv_gravity->get_float( ) * 0.4f; + + player_info_t info{ }; + + for( int ticks = TIME_TO_TICKS( get_detonate_time( def_index ) ); ticks >= 0; --ticks ) { + auto throw_dir = vec3_t( throw_pos.x, throw_pos.y, throw_pos.z + ( throw_pos.z - ( gravity * TICK_INTERVAL( ) ) ) * 0.5f ); + auto temp = throw_dir * TICK_INTERVAL( ); + throw_pos.z -= gravity * TICK_INTERVAL( ); + + vec3_t src = end_pos, end = end_pos + temp; + Ray_t ray; + ray.Init( src, end, vec3_t( -2.f, -2.f, -2.f ), vec3_t( 2.f, 2.f, 2.f ) ); + + g_csgo.m_trace( )->TraceRay( ray, MASK_SOLID | CONTENTS_CURRENT_90, &filter, &trace ); + if( trace.allsolid ) + throw_pos = vec3_t( ); + + end_pos = trace.endpos; + draw_3d_line( src, end_pos, clr_t( 66, 143, 244 ) ); + + if( trace.fraction != 1.f ) { + float surf_elasticity = 1.f; + vec3_t throw_pos2{ }; + clip_velocity( throw_pos, trace.plane.normal, throw_pos2, 2.f ); + + if( trace.m_pEnt && g_csgo.m_engine( )->GetPlayerInfo( trace.m_pEnt->GetIndex( ), &info ) ) { + surf_elasticity = 0.3f; + } + + throw_pos2 *= std::clamp( surf_elasticity * 0.45f, 0.f, 0.9f ); + end = end_pos + throw_pos2 * ( ( 1.f - trace.fraction ) * TICK_INTERVAL( ) ); + + if( def_index == WEAPON_MOLOTOV || def_index == WEAPON_INCGRENADE ) { + if( trace.plane.normal.z >= cos( DEG2RAD( molotov_detonate_slope->get_float( ) ) ) ) { + return; + } + } + + ray.Init( end_pos, end, vec3_t( -2.f, -2.f, -2.f ), vec3_t( 2.f, 2.f, 2.f ) ); + g_csgo.m_trace( )->TraceRay( ray, MASK_SOLID | CONTENTS_CURRENT_90, &filter, &trace ); + + draw_3d_line( end_pos, end, clr_t( 66, 143, 244 ), true ); + end_pos = trace.endpos; + throw_pos = throw_pos2; + } + } + } + + void c_visuals::draw_autowall( ) { + if( !g_settings.visuals.autowall_crosshair ) + return; + + auto weapon = g_ctx.m_local->get_weapon( ); + if( !weapon || weapon->is_knife( ) || weapon->is_grenade( ) ) + return; + + int screen_w, screen_h; + g_csgo.m_engine( )->GetScreenSize( screen_w, screen_h ); + + auto wpn_data = weapon->get_wpn_info( ); + + vec3_t angles{ }; + g_csgo.m_engine( )->GetViewAngles( angles ); + + fire_bullet_data_t data{ }; + data.src = g_ctx.m_local->get_eye_pos( ); + vec3_t end = data.src; + end += math::angle_vectors( angles ) * wpn_data->range; + + data.filter.pSkip = g_ctx.m_local; + data.current_damage = wpn_data->damage; + data.penetrate_count = 1; + data.trace_length = 0.f; + + //data.length_to_end = ( end - data.src ).length( ); + data.trace_length_remaining = wpn_data->range - data.trace_length; + data.direction = math::angle_vectors( angles ); + + data.direction.normalize_vector( ); + + CTraceFilter filter; + Ray_t ray; + + filter.pSkip = g_ctx.m_local; + ray.Init( data.src, end ); + g_csgo.m_trace( )->TraceRay( ray, MASK_SHOT | CONTENTS_GRATE, &filter, &data.enter_trace ); + + bool can_penetrate = g_cheat.m_autowall.handle_bullet_penetration( wpn_data, data ); + + g_renderer.draw_box( screen_w / 2 - 1, screen_h / 2, 1, 1, + can_penetrate ? clr_t( 0, 220, 0 ) : clr_t( 220, 0, 0 ) ); + } + + void c_visuals::draw_spread( ) { + if( !g_settings.visuals.draw_spread ) + return; + + auto weapon = g_ctx.m_local->get_weapon( ); + if( weapon ) { + int screen_w, screen_h; + g_csgo.m_engine( )->GetScreenSize( screen_w, screen_h ); + int cross_x = screen_w / 2, cross_y = screen_h / 2; + + float recoil_step = screen_h / g_ctx.m_fov; + + cross_x -= ( int )( g_ctx.m_local->m_aimPunchAngle( ).y * recoil_step ); + cross_y += ( int )( g_ctx.m_local->m_aimPunchAngle( ).x * recoil_step ); + + weapon->update_accuracy_penalty( ); + float inaccuracy = weapon->get_inaccuracy( ); + float spread = weapon->get_spread( ); + + float cone = inaccuracy * spread; + cone *= screen_h * 0.7f; + cone *= 90.f / g_ctx.m_fov; + + for( int seed{ }; seed < 256; ++seed ) { + util::set_random_seed( math::random_number( 0, 255 ) + 1 ); + float rand_a = util::get_random_float( 0.f, 1.0f ); + float pi_rand_a = util::get_random_float( 0.f, 2.0f * M_PI ); + float rand_b = util::get_random_float( 0.0f, 1.0f ); + float pi_rand_b = util::get_random_float( 0.f, 2.f * M_PI ); + + float spread_x = cos( pi_rand_a ) * ( rand_a * inaccuracy ) + cos( pi_rand_b ) * ( rand_b * spread ); + float spread_y = sin( pi_rand_a ) * ( rand_a * inaccuracy ) + sin( pi_rand_b ) * ( rand_b * spread ); + + float max_x = cos( pi_rand_a ) * cone + cos( pi_rand_b ) * cone; + float max_y = sin( pi_rand_a ) * cone + sin( pi_rand_b ) * cone; + + float step = screen_h / g_ctx.m_fov * 90.f; + int screen_spread_x = ( int )( spread_x * step * 0.7f ); + int screen_spread_y = ( int )( spread_y * step * 0.7f ); + + float percentage = ( rand_a * inaccuracy + rand_b * spread ) / ( inaccuracy + spread ); + + g_renderer.draw_rect( cross_x + screen_spread_x, cross_y + screen_spread_y, 1, 1, + clr_t( 255, 255, 255, 255 * ( 0.4f + percentage * 0.6f ) ) * ( 0.1f + percentage * 0.9f ) ); + } + } + } + + void c_visuals::store_tracer( int index, vec3_t pos ) { + static float last_time[ 65 ]{ }; + tracer_t new_tracer; + + auto ent = g_csgo.m_entlist( )->GetClientEntity< >( index ); + if( ent && ent->is_valid( ) ) { + bool valid = ent == g_ctx.m_local; + float time = g_csgo.m_globals->m_curtime; + auto ent_pos = ent->get_hitbox_pos( 0 ); + + if( ent != g_ctx.m_local && g_ctx.m_local->is_valid( ) && + ( ent->m_iTeamNum( ) != g_ctx.m_local->m_iTeamNum( ) || g_settings.visuals.friendlies( ) ) ) { + vec3_t ang = math::vector_angles( ent_pos, pos ); + vec3_t local_pos = g_ctx.m_local->get_hitbox_pos( 0 ); + float dist = local_pos.dist_to( ent_pos ); + + vec3_t local_ang = math::vector_angles( ent_pos, local_pos ); + + constexpr float max_delta_sqr = 30.f * 30.f; + + float pitch_delta = sin( DEG2RAD( std::abs( ( ang - local_ang ).clamp( ).x ) ) ) * dist; + float yaw_delta = sin( DEG2RAD( std::abs( ( ang - local_ang ).clamp( ).y ) ) ) * dist; + float delta_sqr = ( yaw_delta * yaw_delta + pitch_delta * pitch_delta ); + + + if( delta_sqr > max_delta_sqr ) return; + + vec3_t vec = math::angle_vectors( ang ); + vec *= dist; + vec += ent_pos; + + pos = vec; + + valid = true; + } + + if( valid ) { + float delta = std::abs( g_csgo.m_globals->m_curtime - last_time[ index ] ); + if( delta > g_csgo.m_globals->m_interval_per_tick ) { + new_tracer.m_time = time; + new_tracer.m_start = ent_pos; + new_tracer.m_end = pos; + new_tracer.m_local = ent == g_ctx.m_local; + m_tracers.emplace_back( new_tracer ); + + last_time[ index ] = g_csgo.m_globals->m_curtime; + } + } + } + } + + void c_visuals::draw_tracers( ) { + if( !g_settings.visuals.bullet_tracers ) return; + float time = g_csgo.m_globals->m_curtime; + + for( size_t i{ }; i < m_tracers.size( ) && !m_tracers.empty( ); ++i ) { + auto& tr = m_tracers[ i ]; + + float delta = time - tr.m_time; + if( delta > 1.0f ) m_tracers.erase( m_tracers.begin( ) + i ); + } + + if( !m_tracers.empty( ) ) { + for( auto& it : m_tracers ) { + float delta = time - it.m_time; + auto w2s_begin = util::screen_transform( it.m_start ); + auto w2s_end = util::screen_transform( it.m_end ); + + clr_t col = it.m_local ? clr_t::from_hsb( delta, 1.0f, 1.0f ) : clr_t( 255, 15, 46 ); + col.a( ) = 1.0f - delta * 255; + + g_renderer.draw_line( w2s_begin, w2s_end, col ); + } + } + } +} \ No newline at end of file diff --git a/cheat/gmod/visual_player.cpp b/cheat/gmod/visual_player.cpp new file mode 100644 index 0000000..fb65458 --- /dev/null +++ b/cheat/gmod/visual_player.cpp @@ -0,0 +1,308 @@ +#include + +#include "visual.hpp" +#include "context.hpp" +#include "base_cheat.hpp" +#include "renderer.hpp" +#include "input_system.hpp" +#include "math.hpp" + +/* + Change hook where grabbing lua related from RenderView to CEngineVGui::Paint to see if that works. + I do all my drawing in Paint and should not crash( I never crash ). +*/ + +namespace features +{ + + struct box_t + { + int x, y, w, h; + }; + + box_t get_box( c_base_player* ent, matrix3x4& frame ) { + const matrix3x4& matrix = frame; + + vec3_t min = ent->m_vecMins( ); + vec3_t max = ent->m_vecMaxs( ); + + std::array< vec3_t, 8 > point_list = { + vec3_t{ min.x, min.y, min.z }, + vec3_t{ min.x, max.y, min.z }, + vec3_t{ max.x, max.y, min.z }, + vec3_t{ max.x, min.y, min.z }, + vec3_t{ max.x, max.y, max.z }, + vec3_t{ min.x, max.y, max.z }, + vec3_t{ min.x, min.y, max.z }, + vec3_t{ max.x, min.y, max.z } + }; + + std::array< float, 8 > x_points; + std::array< float, 8 > y_points; + + for( auto& it : point_list ) { + vec3_t backup = it; + for( int i{ }; i < 3; ++i ) { + it[ i ] = backup.dot( ( const vec3_t& )( matrix[ i ] ) ) + matrix[ i ][ 3 ]; + } + } + + for( size_t i{ }; i < 8; ++i ) { + vec2_t w2s = util::screen_transform( point_list[ i ] ); + x_points[ i ] = w2s.x; + y_points[ i ] = w2s.y; + } + + std::sort( x_points.begin( ), x_points.end( ) ); + std::sort( y_points.begin( ), y_points.end( ) ); + + int x = ( int )x_points.front( ); + int w = ( int )x_points.back( ) - x; + + int y = ( int )y_points.front( ); + int h = ( int )y_points.back( ) - y; + + return { x, y, w, h }; + } + + void c_visuals::store_data( ) { + g_ctx.m_lua = g_gmod.m_lua_shared( )->GetLuaInterface( LUA_CLIENT ); + if( !g_ctx.m_lua ) + return; + + m_data.m_matrix = *( VMatrix* )( 0x18C * 2 + *( uintptr_t* )( ( uintptr_t )g_gmod.m_engine_render( ) + 0xDC ) - 0x44 ); + + const auto local_id = g_gmod.m_engine( )->GetLocalPlayer( ); + + for( int i{ 1 }; i <= g_gmod.m_globals->m_maxclients; ++i ) { + auto ent = g_gmod.m_entlist( )->GetClientEntity< >( i ); + if( !ent || !ent->is_valid( ) ) + continue; + + auto& data = m_data.m_player.at( i ); + + if( g_settings.visuals.ignore_teamcolor ) { + data.m_team_color = ent->get_team_color( ); + } + + if( i == local_id ) + continue; + + data.m_coordinate_frame = ent->m_CoordinateFrame( ); + + if( g_settings.visuals.skeleton ) { + ent->ce( )->SetupBones( data.m_matrix, 128, 0x100, g_gmod.m_globals->m_curtime ); // yep, 256 is the max bone count in gmod, but i doubt it's used for anything. + } + + if( g_settings.visuals.rank || g_settings.visuals.spec_list ) { + data.m_rank = ent->get_rank( ); + } + } + } + + void c_visuals::spectator_list( ) { + if( !g_settings.visuals.spec_list ) + return; + + int cur_pos{ }; + player_info_t info{ }; + char buffer[ 128 ]{ }; + std::vector< const char* > list_of_names{ }; + + const int local_id = g_gmod.m_engine( )->GetLocalPlayer( ); + + for( int i{ 1 }; i <= g_gmod.m_globals->m_maxclients; ++i ) { + if( i == local_id ) + continue; + + auto ent = g_gmod.m_entlist( )->GetClientEntity< >( i ); + if( !ent ) + continue; + + if( !g_gmod.m_engine( )->GetPlayerInfo( i, &info ) ) + continue; + + auto target = ent->get_observer_target( ); + if( !target ) + continue; + + if( target->ce( )->GetIndex( ) != local_id ) + continue; + + sprintf_s( buffer, "%s - (%s)", info.name, m_data.m_player.at( i ).m_rank.c_str( ) ); + + list_of_names.push_back( buffer ); + } + + int screen_w, screen_h; + g_gmod.m_engine( )->GetScreenSize( screen_w, screen_h ); + + if( g_settings.misc.watermark ) { + cur_pos = 20; + } + + for( const auto& it : list_of_names ) { + draw_string( screen_w - 3, cur_pos, ALIGN_RIGHT, true, clr_t( 255, 255, 255 ), it ); + cur_pos += 10; + } + } + + + void c_visuals::draw_players( ) { + const auto local_id = g_gmod.m_engine( )->GetLocalPlayer( ); + const auto local_team_color = m_data.m_player.at( local_id ).m_team_color; + + for( int i{ 1 }; i <= g_gmod.m_globals->m_maxclients; ++i ) { + if( i == local_id ) + continue; + + auto ent = g_gmod.m_entlist( )->GetClientEntity< >( i ); + if( !ent || !ent->is_valid( ) ) + continue; + + auto& data = m_data.m_player.at( i ); + + if( g_settings.visuals.ignore_team && + g_ctx.m_local->m_iTeamNum( ) == ent->m_iTeamNum( ) ) + continue; + + if( g_settings.visuals.ignore_teamcolor && + local_team_color == data.m_team_color ) + continue; + + //clr_t col = ent->m_iTeamNum( ) == g_ctx.m_local->m_iTeamNum( ) ? + // g_settings.visuals.box_friendly : g_settings.visuals.box_enemy; + + clr_t col = g_settings.visuals.box_enemy; + + auto box = get_box( ent, data.m_coordinate_frame ); + int health = ent->m_iHealth( ); + int bottom_pos = 0; + + if( g_settings.visuals.skeleton( ) ) { + //clr_t col = ent->m_iTeamNum( ) == g_ctx.m_local->m_iTeamNum( ) ? g_settings.visuals.skeleton_friendly : g_settings.visuals.skeleton_enemy; + clr_t col = g_settings.visuals.skeleton_enemy; + + auto hdr = g_gmod.m_model_info( )->GetStudiomodel( ent->ce( )->GetModel( ) ); + if( hdr ) { + for( size_t bone{ }; bone < hdr->numbones; ++bone ) { + auto b = hdr->get_bone( bone ); + if( b && b->flags & 0x100 && b->parent != -1 ) { + vec3_t child = vec3_t{ data.m_matrix[ bone ][ 0 ][ 3 ], data.m_matrix[ bone ][ 1 ][ 3 ], data.m_matrix[ bone ][ 2 ][ 3 ] }; + vec3_t parent = vec3_t{ data.m_matrix[ b->parent ][ 0 ][ 3 ], data.m_matrix[ b->parent ][ 1 ][ 3 ], data.m_matrix[ b->parent ][ 2 ][ 3 ] }; + + auto child_screen = util::screen_transform( child ); + auto parent_screen = util::screen_transform( parent ); + + draw_line( child_screen, parent_screen, col ); + } + } + } + } + + if( g_settings.visuals.box( ) ) { + draw_rect( box.x + 1, box.y + 1, box.w - 2, box.h - 2, clr_t( 0, 0, 0, 180 ) ); + draw_rect( box.x, box.y, box.w, box.h, col ); + } + + if( g_settings.visuals.health( ) ) { + auto fill = box.h - 1; + fill *= std::clamp( health, 0, 100 ) * 0.01f; + + auto hp_col = clr_t( + std::min< int >( 510 * ( 100 - health ) / 100, 255 ), + std::min< int >( 510 * health / 100, 255 ), + 0, + 255 ); + + draw_filled_rect( box.x - 4, box.y, 3, box.h + 1, clr_t( 0, 0, 0, 170 ) ); + draw_filled_rect( box.x - 3, box.y + box.h - fill, 1, fill, hp_col ); + + if( health != 100 ) + draw_string( box.x - 2, box.y + 1 + box.h - fill - 3, ALIGN_CENTER, false, clr_t( 255, 255, 255, 255 ), "%d", health ); + } + + if( g_settings.visuals.name( ) ) { + draw_string( box.x + box.w / 2, box.y - 12, ALIGN_CENTER, true, + clr_t( 255, 255, 255, 255 ), ent->get_info( ).name ); + } + + if( g_settings.visuals.weapon( ) ) { + auto weapon = ent->get_weapon( ); + if( weapon ) { + std::string wep_str = weapon->get_print_name( ); + if( !wep_str.empty( ) ) { + std::transform( wep_str.begin( ), wep_str.end( ), wep_str.begin( ), ::tolower ); // lowercase gang + + draw_string( box.x + box.w / 2, box.y + box.h + 3 + bottom_pos, ALIGN_CENTER, true, + clr_t( 255, 255, 255, 255 ), wep_str.c_str( ) ); // font is a little ugly + + bottom_pos += 11; + } + } + } + + if( g_settings.visuals.rank( ) ) { + auto rank = data.m_rank; + if( !rank.empty( ) ) { + draw_string( box.x + box.w / 2, box.y + box.h + 3 + bottom_pos, ALIGN_CENTER, true, + clr_t( 255, 255, 255, 255 ), rank.c_str( ) ); + + bottom_pos += 11; + } + } + + //if( g_settings.visuals.ammo ) { m_iClip1 just returns the max clip??? doesn't work. + // if( auto weapon = ent->get_weapon( ) ) { // hacker codes 8) + // draw_string( box.x + box.w / 2, box.y + box.h + 3 + bottom_pos, ALIGN_CENTER, true, + // clr_t( 255, 255, 255, 255 ), "%d / %d", weapon->m_iClip1( ), m_stored_data.at( i ).m_max_clip1 ); + // } + //} + } + } + + void c_visuals::operator()( ) { + g_ctx.m_lua = g_gmod.m_lua_shared( )->GetLuaInterface( LUA_CLIENT ); + if( !g_ctx.m_lua ) + return; + + switch( g_settings.visuals.activation_type( ) ) { + case 0: + g_settings.visuals.active = false; + break; + case 1: + g_settings.visuals.active = true; + break; + case 2: + g_settings.visuals.active = g_input.is_key_pressed( g_settings.visuals.key ); + break; + case 3: + { + static bool held = false; + bool pressed = g_input.is_key_pressed( g_settings.visuals.key ); + if( pressed ) { + if( !held ) + g_settings.visuals.active ^= 1; + held = true; + } + else held = false; + } + break; + default: + g_settings.visuals.active = false; + break; + } + + if( g_ctx.run_frame( ) ) { + spectator_list( ); + g_cheat.m_playerlist( ); + if( g_settings.visuals.active ) { + draw_players( ); + } + } + } + + VMatrix& c_visuals::get_matrix( ) { + return m_data.m_matrix; + } +} \ No newline at end of file diff --git a/cheat/gmod/visual_world.cpp b/cheat/gmod/visual_world.cpp new file mode 100644 index 0000000..1f504bd --- /dev/null +++ b/cheat/gmod/visual_world.cpp @@ -0,0 +1,207 @@ +#include + +#include "context.hpp" +#include "visual.hpp" +#include "interface.hpp" +#include "renderer.hpp" + +namespace features +{ + void fix_static_props( ) { + static auto cvar = g_csgo.m_cvar( )->FindVar( xors( "r_drawspecificstaticprop" ) ); + static bool fixed{ }; + if( !fixed ) { + cvar->m_flags |= 0; + cvar->set_value( 1 ); + + fixed = true; + } + } + + void c_visuals::draw_world( ) { + if( !g_settings.visuals.active ) + return; + + static const auto m_bShouldGlow = g_netvars.get_netvar( fnv( "DT_DynamicProp" ), fnv( "m_bShouldGlow" ) ); + + for( int i{ 64 }; i < g_csgo.m_entlist( )->GetHighestEntityIndex( ); ++i ) { + auto ent = g_csgo.m_entlist( )->GetClientEntity< IClientEntity >( i ); + if( !ent ) continue; + + auto client_class = ent->GetClientClass( ); + if( !client_class ) continue; + + int class_id = client_class->m_class_id; + + if( class_id != CBaseWeaponWorldModel && ( strstr( client_class->m_name, xors( "Weapon" ) ) + || class_id == CDEagle || class_id == CAK47 ) ) { + auto owner = ( int )ent->as< c_base_weapon >( )->m_hOwner( ) & 0xfff; + if( owner <= 0 || owner > 64 ) { + auto origin = ent->GetRenderOrigin( ); + if( origin ) { + bool draw = g_settings.visuals.weapon_esp( ) == 1; + bool glow = g_settings.visuals.weapon_esp( ) == 2; + + if( draw || g_settings.visuals.weapon_esp == 3 ) { + if( !glow ) { + *( bool* )( uintptr_t( ent ) + m_bShouldGlow ) = false; + } + + auto w2s = util::screen_transform( origin ); + auto def_index = ent->as< c_base_weapon >( )->m_iItemDefinitionIndex( ); + auto name = util::definition_index_to_name( def_index ); + + g_renderer.draw_string< ALIGN_CENTER >( g_fonts.f_esp_small, w2s.x, w2s.y, + g_settings.visuals.weapon_esp_clr( ), name ); + } + if( glow || g_settings.visuals.weapon_esp == 3 ) { + *( bool* )( uintptr_t( ent ) + m_bShouldGlow ) = true; + } + } + } + } + else { + if( g_settings.visuals.grenade_esp && strstr( client_class->m_name, xors( "Projectile" ) ) ) { + auto model = ent->GetModel( ); + if( !model ) continue; + + auto hdr = g_csgo.m_model_info( )->GetStudiomodel( model ); + if( !strstr( hdr->name, xors( "thrown" ) ) && !strstr( hdr->name, xors( "dropped" ) ) ) + continue; + + std::string name = xors( "nade" ); + if( strstr( hdr->name, xors( "flash" ) ) ) { + name = xors( "flash" ); + } + else if( strstr( hdr->name, xors( "smoke" ) ) ) { + name = xors( "smoke" ); + } + else if( strstr( hdr->name, xors( "decoy" ) ) ) { + name = xors( "decoy" ); + } + else if( strstr( hdr->name, xors( "incendiary" ) ) || strstr( hdr->name, xors( "molotov" ) ) ) { + name = xors( "molotov" ); + } + + if( g_settings.visuals.grenade_esp == 2 || g_settings.visuals.grenade_esp == 3 ) { + *( bool* )( uintptr_t( ent ) + m_bShouldGlow ) = true; + } + + if( g_settings.visuals.grenade_esp == 1 || g_settings.visuals.grenade_esp == 3 ) { + auto pos = ent->GetRenderOrigin( ); + auto w2s = util::screen_transform( pos ); + + g_renderer.draw_string< ALIGN_CENTER >( g_fonts.f_esp_small, w2s.x, w2s.y, + g_settings.visuals.grenade_esp_clr, name.c_str( ) ); + } + } + } + + } + } + + void c_visuals::world_modulate( ) { + static std::unordered_map< MaterialHandle_t, fclr_t > world_materials; + static std::unordered_map< MaterialHandle_t, fclr_t > world_materials2; + static c_base_player* local_player = nullptr; + static auto night_mode = false; + static bool modulated = false; + static bool alpha = false; + + if( !g_settings.visuals.world_modulate || !g_csgo.m_engine( )->IsInGame( ) ) { + modulated = false; + if( !world_materials2.empty( ) ) { + for( auto& it : world_materials2 ) { + auto mat = g_csgo.m_mat_system( )->GetMaterial( it.first ); + if( !mat ) continue; + + auto original_col = it.second; + mat->ColorModulate( original_col.r( ), original_col.g( ), original_col.b( ) ); + mat->AlphaModulate( original_col.a( ) ); + } + + world_materials.clear( ); + world_materials2.clear( ); + } + + return; + } + + if( g_ctx.m_stage == FRAME_NET_UPDATE_POSTDATAUPDATE_END ) { + fix_static_props( ); + + if( local_player == g_ctx.m_local && + night_mode == g_settings.visuals.night_mode( ) && + alpha == g_settings.visuals.transparent_props( ) && + modulated == g_settings.visuals.world_modulate( ) ) + return; + + + for( auto i = g_csgo.m_mat_system( )->FirstMaterial( ); + i != g_csgo.m_mat_system( )->InvalidMaterial( ); + i = g_csgo.m_mat_system( )->NextMaterial( i ) ) { + + auto mat = g_csgo.m_mat_system( )->GetMaterial( i ); + if( !mat ) continue; + + const char* group = mat->GetTextureGroupName( ); + bool is_world = strstr( group, xors( "World" ) ); + bool is_sky = strstr( group, xors( "Sky" ) ); + bool is_prop = strstr( group, xors( "StaticProp" ) ); + + if( is_world || is_sky || is_prop ) { + const char* name = mat->GetName( ); + if( world_materials.find( i ) == world_materials.end( ) ) { + fclr_t clr; + + mat->GetColorModulate( &clr.r( ), &clr.g( ), &clr.b( ) ); + clr.a( ) = mat->GetAlphaModulation( ); + + world_materials.emplace( i, clr ); + world_materials2.emplace( i, clr ); + } + + fclr_t new_color; + + new_color = world_materials2.find( i )->second; + bool apply = g_settings.visuals.night_mode && g_settings.visuals.world_modulate; + + if( is_world ) { + if( apply ) { + new_color.r( ) *= 0.15f; + new_color.g( ) *= 0.15f; + new_color.b( ) *= 0.15f; + } + } + else if( is_prop ) { + if( apply ) { + new_color.r( ) *= 0.3f; + new_color.g( ) *= 0.3f; + new_color.b( ) *= 0.3f; + } + if( g_settings.visuals.world_modulate && g_settings.visuals.transparent_props ) { + new_color.a( ) *= 0.6f; + } + } + else if( is_sky ) { + if( apply ) { + new_color = fclr_t( 0.f, 0.f, 0.f ); + } + } + + if( !( world_materials.at( i ) == new_color ) ) { + mat->ColorModulate( new_color.r( ), new_color.g( ), new_color.b( ) ); + mat->AlphaModulate( new_color.a( ) ); + + world_materials.at( i ) = new_color; + } + } + } + + modulated = g_settings.visuals.world_modulate; + night_mode = g_settings.visuals.night_mode; + alpha = g_settings.visuals.transparent_props; + local_player = g_ctx.m_local; + } + } +} \ No newline at end of file diff --git a/cheat/gmod/vmt.hpp b/cheat/gmod/vmt.hpp new file mode 100644 index 0000000..0665e17 --- /dev/null +++ b/cheat/gmod/vmt.hpp @@ -0,0 +1,94 @@ +#pragma once +#include +#include "util.hpp" + +// todo - dex; rewrite this, VirtualQuery (except for custom codeptr / readptr) and VirtualProtect shouldnt be used +// and we need to copy rtti over too or stuff will break later on + +// correct me if im wrong, but the vtable isnt replaced, instead the original is edited during hooking, rtti should be intact and accessable by game +// class could definetly do with a rewrite tho! + +// ^ you're corrct, but changing page rights and replacing ptrs direclty in rdata (or usually the heap, since thats where vmts go) is not a safe solution +// copying table + aligning it to compensate for rtti is safer +// vac loves scanning memory regions but it doesnt really do much outside of game servers (only loads some shit for checking DEP and stuff) + +// trash + +//llama is a fucking nigger +//true + +namespace hooks +{ + class c_vmt { + uintptr_t* m_table; + uintptr_t* m_original; + std::vector< uintptr_t > m_new; + public: + int count( ) { + int vfunc_count{ }; + + while ( m_original[ vfunc_count ] ) { + vfunc_count++; + }; + + return vfunc_count; + } + + c_vmt( void* table ) { + if ( !table ) { + return; + } + + this->m_table = reinterpret_cast< uintptr_t* >( table ); + this->m_original = *reinterpret_cast< uintptr_t** >( this->m_table ); + + for ( int i = -1; i < this->count( ); ++i ) { + this->m_new.push_back( this->m_original[ i ] ); + } + + auto data = this->m_new.data( ); + *this->m_table = uintptr_t( &data[ 1 ] ); + } + + ~c_vmt( ) { } + + template< typename T = uintptr_t > T get_function( int index ) { + return( ( T )( this->m_new.at( index + 1 ) ) ); + } + + template< typename T = uintptr_t > T get_old_function( int index ) { + return( ( T )( this->m_original[ index ] ) ); + } + + void hook( int index, uintptr_t new_func ) { + this->m_new.at( index + 1 ) = new_func; + } + + void unhook( int index ) { + this->m_new.at( index + 1 ) = this->m_original[ index ]; + } + + void hook( int index, void* new_func ) { + hook( index, reinterpret_cast< uintptr_t >( new_func ) ); + } + + void restore( ) const { + *this->m_table = uintptr_t( m_original ); + } + + static void* hook_method( void* instance, int index, void* function ) { + // edits the vtable itself + // i cannot be bothered re-hooking stuff on every instance creation + // so this should fix this problem, (should be fine on gmod cuz no AC) + void** vfunc = *( void*** )instance + index; + void* oldvf = *vfunc; + + unsigned long prot; + ::VirtualProtect( vfunc, 4, 0x40, &prot ); + *vfunc = function; + ::VirtualProtect( vfunc, 4, prot, &prot ); + + return oldvf; + } + }; +} \ No newline at end of file diff --git a/cheat/gmod/window_procedure.cpp b/cheat/gmod/window_procedure.cpp new file mode 100644 index 0000000..f47027b --- /dev/null +++ b/cheat/gmod/window_procedure.cpp @@ -0,0 +1,98 @@ +#include "base_cheat.hpp" +#include "hooks.hpp" +#include "input_system.hpp" +#include "settings.hpp" + +decltype( &hooks::window_procedure ) hooks::window_procedure_o; +long __stdcall hooks::window_procedure( HWND hwnd, uint32_t msg, uint32_t wparam, long lparam ) { + if ( g_gmod.m_panic ) { + return CallWindowProcA( ( WNDPROC )window_procedure_o, hwnd, msg, wparam, lparam ); + } + + if ( msg == WM_ACTIVATE && wparam == WA_INACTIVE ) { + g_input.clear_keys( ); + } + + if ( msg == WM_MOUSEMOVE ) { + g_input.capture_mouse_move( lparam ); + g_con->get_input( )->capture_mouse_move( lparam ); + } + + auto enable_screen_clicker = []( bool enable ) -> void { + + }; + + //static auto cvar = g_gmod.m_cvar( )->FindVar( xors( "cl_mouseenable" ) ); + static auto con_pressed = false; + if( g_con->get_input( )->is_key_pressed( KEYS_HOME ) ) { + if( !con_pressed ) { + if( !g_con->m_open ) { + g_con->m_consuming_input = true; + } + + g_con->m_open ^= 1; + } + + //cvar->set_value( !g_con->m_open ); + con_pressed = true; + } + else con_pressed = false; + + static auto list_pressed = false; + if( g_con->get_input( )->is_key_pressed( KEYS_DELETE ) ) { + if( !list_pressed ) { + g_cheat.m_playerlist.is_open( ) ^= 1; + list_pressed = true; + } + } + else list_pressed = false; + + if( g_cheat.m_playerlist.is_open( ) ) { + if( g_con->get_input( )->is_key_pressed( KEYS_DOWN ) ) { + g_cheat.m_playerlist.get_index( )++; + } + else if( g_con->get_input( )->is_key_pressed( KEYS_UP ) ) { + g_cheat.m_playerlist.get_index( )--; + } + + if( g_cheat.m_playerlist.get_index( ) < 0 ) + g_cheat.m_playerlist.get_index( ) = g_cheat.m_playerlist.get_list( ).size( ) - 1; + else if( g_cheat.m_playerlist.get_index( ) >= ( signed )g_cheat.m_playerlist.get_list( ).size( ) ) + g_cheat.m_playerlist.get_index( ) = 0; + + static bool was_pressed = false; + if( g_con->get_input( )->is_key_pressed( KEYS_LEFT ) || g_con->get_input( )->is_key_pressed( KEYS_RIGHT ) ) { + if( !was_pressed ) { + *g_cheat.m_playerlist.get_list( )[ g_cheat.m_playerlist.get_index( ) ].m_friend ^= 1; + was_pressed = true; + } + } + else was_pressed = false; + } + + if( g_con->get_input( )->register_key_press( VirtualKeyEvents_t( msg ), VirtualKeys_t( wparam ) ) ) { + if( g_con->m_open ) return false; + } + + if( !g_con->m_open ) { + static bool was_pressed = false; + if( g_input.is_key_pressed( KEYS_INSERT ) ) { + if( !was_pressed ) { + g_settings.menu.open ^= 1; + //cvar->set_value( !g_settings.menu.open ); + //g_gmod.m_surface( )->SetCursorVisible( g_settings.menu.open ); + was_pressed = true; + } + } + else { + was_pressed = false; + } + + if( g_input.register_key_press( VirtualKeyEvents_t( msg ), VirtualKeys_t( wparam ) ) + && g_settings.menu.open ) { + return false; + } + } + + return CallWindowProcA( ( WNDPROC )window_procedure_o, hwnd, msg, wparam, lparam ); +} \ No newline at end of file diff --git a/cheat/gmod/x86.hpp b/cheat/gmod/x86.hpp new file mode 100644 index 0000000..e96c469 --- /dev/null +++ b/cheat/gmod/x86.hpp @@ -0,0 +1,47 @@ +#pragma once +#include + +namespace x86 +{ + enum class reg : size_t { + eax = 0, + ecx, + edx, + ebx, + esp, + ebp, + esi, + edi, + + /* + x64: + r8, + r9, + r10, + r11, + r12, + r13, + r14, + r15,*/ + }; + + enum instruction : uint8_t { + retn_imm16 = 0xc2, + retn = 0xc3, + fs = 0x64, + //its big nigga season + call = 0xff + }; + + __forceinline static uint32_t encode_mov_imm32( x86::reg dreg ) { + return ( 0xb8 + ( size_t( dreg ) ) ); + } + + __forceinline static uint32_t encode_push_reg( x86::reg dreg ) { + return ( 0x50 | ( ( size_t( dreg ) ) & 7 ) ); + } + + __forceinline static uint32_t encode_pop_reg( x86::reg dreg ) { + return ( 0x58 | ( ( size_t( dreg ) ) & 7 ) ); + } +}; \ No newline at end of file -- cgit v1.2.3