diff --git a/SAFix/SAFix.vcxproj b/SAFix/SAFix.vcxproj index 8184504..72829fb 100644 --- a/SAFix/SAFix.vcxproj +++ b/SAFix/SAFix.vcxproj @@ -93,6 +93,7 @@ + Create Create @@ -118,6 +119,7 @@ + diff --git a/SAFix/SAFix.vcxproj.filters b/SAFix/SAFix.vcxproj.filters index 1300fd1..bb3426c 100644 --- a/SAFix/SAFix.vcxproj.filters +++ b/SAFix/SAFix.vcxproj.filters @@ -13,6 +13,9 @@ {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + {729e19b1-4747-44c3-b99e-1ecc383d1cad} + @@ -33,6 +36,9 @@ Source Files + + Source Files + @@ -64,8 +70,13 @@ Header Files + + Header Files + - + + Shaders + \ No newline at end of file diff --git a/SilentPatch/PNGFile.cpp b/SilentPatch/PNGFile.cpp new file mode 100644 index 0000000..9d568ec --- /dev/null +++ b/SilentPatch/PNGFile.cpp @@ -0,0 +1,54 @@ +#include "StdAfx.h" +#include "PNGFile.h" + +RwTexture* CPNGFile::ReadFromFile(const char* pFileName) +{ + RwTexture* pTexture = nullptr; + + if ( RwImage* pImage = RtPNGImageRead(pFileName) ) + { + RwInt32 dwWidth, dwHeight, dwDepth, dwFlags; + RwImageFindRasterFormat(pImage, rwRASTERTYPETEXTURE, &dwWidth, &dwHeight, &dwDepth, &dwFlags); + if ( RwRaster* pRaster = RwRasterCreate(dwWidth, dwHeight, dwDepth, dwFlags) ) + { + RwRasterSetFromImage(pRaster, pImage); + + pTexture = RwTextureCreate(pRaster); + //if ( pTexture ) + // RwTextureSetName(pTexture, pFileName); + } + RwImageDestroy(pImage); + } + return pTexture; +} + +RwTexture* CPNGFile::ReadFromMemory(const void* pMemory, unsigned int nLen) +{ + RwTexture* pTexture = nullptr; + + // TOOO: EXEs + MemoryVP::Patch(0x7CF9CA, rwSTREAMMEMORY); + + RwMemory PNGMemory; + PNGMemory.start = const_cast(static_cast(pMemory)); + PNGMemory.length = nLen; + + if ( RwImage* pImage = RtPNGImageRead(reinterpret_cast(&PNGMemory)) ) + { + RwInt32 dwWidth, dwHeight, dwDepth, dwFlags; + RwImageFindRasterFormat(pImage, rwRASTERTYPETEXTURE, &dwWidth, &dwHeight, &dwDepth, &dwFlags); + if ( RwRaster* pRaster = RwRasterCreate(dwWidth, dwHeight, dwDepth, dwFlags) ) + { + RwRasterSetFromImage(pRaster, pImage); + + pTexture = RwTextureCreate(pRaster); + //if ( pTexture ) + // RwTextureSetName(pTexture, pFileName); + } + RwImageDestroy(pImage); + } + + MemoryVP::Patch(0x7CF9CA, rwSTREAMFILENAME); + + return pTexture; +} \ No newline at end of file diff --git a/SilentPatch/PNGFile.h b/SilentPatch/PNGFile.h new file mode 100644 index 0000000..e7979a1 --- /dev/null +++ b/SilentPatch/PNGFile.h @@ -0,0 +1,11 @@ +#ifndef __PNGFILE +#define __PNGFILE + +class CPNGFile +{ +public: + static RwTexture* ReadFromFile(const char* pFileName); + static RwTexture* ReadFromMemory(const void* pMemory, unsigned int nLen); +}; + +#endif \ No newline at end of file diff --git a/SilentPatch/StdAfx.h b/SilentPatch/StdAfx.h index b99b4f2..c954a6d 100644 --- a/SilentPatch/StdAfx.h +++ b/SilentPatch/StdAfx.h @@ -20,6 +20,7 @@ #include #include +#include #include "MemoryMgr.h" #include "Maths.h" diff --git a/SilentPatch/dllmain.cpp b/SilentPatch/dllmain.cpp index af3267b..0e8fd04 100644 --- a/SilentPatch/dllmain.cpp +++ b/SilentPatch/dllmain.cpp @@ -36,6 +36,14 @@ WRAPPER RwFrame* RwFrameForAllObjects(RwFrame* frame, RwObjectCallBack callBack, WRAPPER RpClump* RpClumpForAllAtomics(RpClump* clump, RpAtomicCallBack callback, void* pData) { WRAPARG(clump); WRAPARG(callback); WRAPARG(pData); EAXJMP(0x749B70); } WRAPPER RpGeometry* RpGeometryForAllMaterials(RpGeometry* geometry, RpMaterialCallBack fpCallBack, void* pData) { WRAPARG(geometry); WRAPARG(fpCallBack); WRAPARG(pData); EAXJMP(0x74C790); } WRAPPER RpAtomic* AtomicDefaultRenderCallBack(RpAtomic* atomic) { WRAPARG(atomic); EAXJMP(0x7491C0); } +WRAPPER RwImage* RtPNGImageRead(const RwChar* imageName) { WRAPARG(imageName); EAXJMP(0x7CF9B0); } +WRAPPER RwTexture* RwTextureCreate(RwRaster* raster) { WRAPARG(raster); EAXJMP(0x7F37C0); } +WRAPPER RwRaster* RwRasterCreate(RwInt32 width, RwInt32 height, RwInt32 depth, RwInt32 flags) { WRAPARG(width); WRAPARG(height); WRAPARG(depth); WRAPARG(flags); EAXJMP(0x7FB230); } +WRAPPER RwRaster* RwRasterSetFromImage(RwRaster* raster, RwImage* image) { WRAPARG(raster); WRAPARG(image); EAXJMP(0x804290); } +WRAPPER RwBool RwImageDestroy(RwImage* image) { WRAPARG(image); EAXJMP(0x802740); } +WRAPPER RwImage* RwImageFindRasterFormat(RwImage* ipImage, RwInt32 nRasterType, RwInt32* npWidth, RwInt32* npHeight, RwInt32* npDepth, RwInt32* npFormat) { WRAPARG(ipImage); WRAPARG(nRasterType); WRAPARG(npWidth); WRAPARG(npHeight); WRAPARG(npDepth); WRAPARG(npFormat); EAXJMP(0x8042C0); } + + #ifndef SA_STEAM_TEST @@ -959,6 +967,41 @@ void RenderVehicleHiDetailAlphaCB_HunterDoor(RpAtomic* pAtomic) } #include +#include "PNGFile.h" + +// lunar.png +static const BYTE gMoonMaskPNG[] = { + 0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A, 0x00, 0x00, 0x00, 0x0D, 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, + 0x00, 0x20, 0x00, 0x00, 0x00, 0x20, 0x08, 0x06, 0x00, 0x00, 0x00, 0x73, 0x7A, 0x7A, 0xF4, 0x00, 0x00, 0x00, + 0x01, 0x73, 0x52, 0x47, 0x42, 0x00, 0xAE, 0xCE, 0x1C, 0xE9, 0x00, 0x00, 0x00, 0x06, 0x62, 0x4B, 0x47, 0x44, + 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0xA0, 0xBD, 0xA7, 0x93, 0x00, 0x00, 0x00, 0x09, 0x70, 0x48, 0x59, 0x73, + 0x00, 0x00, 0x0B, 0x13, 0x00, 0x00, 0x0B, 0x13, 0x01, 0x00, 0x9A, 0x9C, 0x18, 0x00, 0x00, 0x00, 0x07, 0x74, + 0x49, 0x4D, 0x45, 0x07, 0xDE, 0x05, 0x1D, 0x12, 0x19, 0x1B, 0x80, 0xB4, 0xC0, 0x27, 0x00, 0x00, 0x01, 0x9D, + 0x49, 0x44, 0x41, 0x54, 0x58, 0xC3, 0xED, 0x97, 0x3F, 0x4B, 0x82, 0x51, 0x14, 0x87, 0x9F, 0x12, 0xB2, 0x96, + 0x17, 0x84, 0x0A, 0x87, 0x77, 0x8A, 0x10, 0x5A, 0x9B, 0x1C, 0x44, 0x9A, 0x1D, 0xFC, 0x20, 0x7E, 0x16, 0xC7, + 0x3E, 0x42, 0xF8, 0x01, 0x84, 0xA2, 0x39, 0x1C, 0x9A, 0x9A, 0xE2, 0x0D, 0x42, 0x9C, 0x84, 0xA4, 0xC1, 0xC0, + 0x21, 0x54, 0x0C, 0x5B, 0x7E, 0x57, 0x6E, 0xF6, 0xA6, 0xEF, 0xDF, 0xEB, 0xD2, 0x81, 0x33, 0x79, 0xF5, 0x3C, + 0xE7, 0x5C, 0xCF, 0xB9, 0xBF, 0x03, 0x3B, 0xB6, 0xBD, 0x98, 0xE7, 0x3D, 0xF9, 0x29, 0xE0, 0xAF, 0x7D, 0x36, + 0x04, 0xDE, 0x81, 0x89, 0x3C, 0x33, 0x80, 0x43, 0xE0, 0x18, 0xB8, 0x04, 0xEA, 0x40, 0x05, 0xA8, 0x85, 0x9C, + 0x1B, 0x01, 0x7D, 0xE0, 0x15, 0x78, 0x00, 0x9E, 0x04, 0x95, 0xCA, 0x7C, 0xA0, 0x05, 0x74, 0x81, 0x31, 0xB0, + 0x8C, 0xE0, 0x0B, 0x20, 0xD0, 0x77, 0x9A, 0xAA, 0x58, 0x22, 0xBB, 0x04, 0xDA, 0x31, 0x02, 0x87, 0x79, 0xA0, + 0xDF, 0xF0, 0x93, 0x04, 0xEF, 0x2A, 0x9B, 0x65, 0x4A, 0x1F, 0xC7, 0x85, 0xC8, 0x32, 0x78, 0x6C, 0x88, 0x3C, + 0x82, 0x47, 0x86, 0xF0, 0x74, 0x60, 0x9A, 0x43, 0x70, 0x1B, 0xA2, 0xA5, 0xCE, 0xFA, 0x65, 0x4D, 0xFD, 0x69, + 0x96, 0x39, 0x7B, 0x57, 0x95, 0x06, 0x60, 0xDF, 0xCA, 0xDE, 0xF4, 0x78, 0xDE, 0x56, 0x03, 0xAA, 0x61, 0x77, + 0xEF, 0x22, 0x7B, 0xBB, 0x0A, 0xBE, 0x5D, 0x01, 0x1F, 0x28, 0x3B, 0x7C, 0x02, 0xCE, 0x35, 0xCE, 0x57, 0x00, + 0xF5, 0x34, 0x13, 0x2B, 0x81, 0x95, 0xCD, 0x35, 0x18, 0x80, 0x0A, 0x50, 0x70, 0x08, 0x50, 0x02, 0xCE, 0x6C, + 0x80, 0x9D, 0xD9, 0x3F, 0xC0, 0xAE, 0x00, 0xBE, 0xD6, 0x01, 0xEE, 0x81, 0x99, 0x43, 0x80, 0x89, 0x44, 0xCB, + 0x0A, 0x60, 0x08, 0x7C, 0x3A, 0x04, 0x18, 0x19, 0xB5, 0x64, 0x03, 0xF4, 0x1C, 0x02, 0xDC, 0x49, 0x3F, 0xAE, + 0x00, 0x9E, 0x1D, 0x5E, 0xC3, 0x87, 0xCA, 0xFF, 0xA3, 0x02, 0x73, 0xE0, 0x11, 0x18, 0x38, 0x00, 0xE8, 0x49, + 0xB0, 0x86, 0xAA, 0xDF, 0x56, 0x4A, 0x0D, 0x18, 0x45, 0x23, 0x36, 0xED, 0xA0, 0xF6, 0xF8, 0x5D, 0x00, 0x6F, + 0x40, 0x11, 0xB8, 0x00, 0x8E, 0x32, 0xCE, 0xFC, 0x05, 0xB8, 0xD6, 0x4B, 0x38, 0xDB, 0x26, 0xC5, 0xDB, 0x19, + 0x57, 0x22, 0x50, 0x75, 0x23, 0x3F, 0x78, 0x59, 0x42, 0x6C, 0x0C, 0x5E, 0xD8, 0x30, 0x28, 0x02, 0x5D, 0x47, + 0x09, 0x38, 0x49, 0x38, 0xED, 0x6E, 0x81, 0x0E, 0x70, 0xF3, 0xD7, 0xBA, 0xB6, 0x6D, 0x35, 0xF3, 0x80, 0x2B, + 0xE9, 0x85, 0x86, 0x9E, 0xD0, 0x62, 0x84, 0x36, 0xEB, 0x69, 0x45, 0xEB, 0xA8, 0xC5, 0xE7, 0x69, 0x97, 0x53, + 0x4F, 0x2A, 0xA6, 0x2A, 0x88, 0x46, 0xC8, 0x19, 0xB3, 0x17, 0x0E, 0xD4, 0xD2, 0xFD, 0x28, 0x4B, 0x6A, 0xDC, + 0xED, 0xF8, 0x40, 0xED, 0x6A, 0x36, 0x64, 0xDB, 0xCC, 0x66, 0x3C, 0xDD, 0x94, 0xF1, 0xBA, 0x7D, 0x03, 0x9B, + 0xCB, 0x2A, 0x13, 0x6A, 0x96, 0x59, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4E, 0x44, 0xAE, 0x42, 0x60, + 0x82 }; // TODO: EXEs #ifndef SA_STEAM_TEST @@ -969,7 +1012,7 @@ static RwTexture** const gpCoronaTexture = *(RwTexture***)0x6FAA8C; static int& MoonSize = **(int**)0x713B0C; // TODO: Load it from an embedded PNG -static RwTexture*& gpMoonMask = *(RwTexture**)0xC6AA74; +static RwTexture* gpMoonMask = nullptr; #else @@ -986,6 +1029,8 @@ static RwTexture*& gpMoonMask = *(RwTexture**)0xCC9874; // By NTAuthority void DrawMoonWithPhases(int moonColor, float* screenPos, float sizeX, float sizeY) { + if ( !gpMoonMask ) + gpMoonMask = CPNGFile::ReadFromMemory(gMoonMaskPNG, sizeof(gMoonMaskPNG)); //D3DPERF_BeginEvent(D3DCOLOR_ARGB(0,0,0,0), L"render moon"); float currentDayFraction = nGameClockDays / 31.0f; @@ -1570,28 +1615,26 @@ void ShaderDetach() ((void(*)())0x53BB80)(); } -void SetShader(void* shader) +void SetShader(RxD3D9InstanceData* pInstData) { if ( bRenderNVC ) { // TODO: Daynight balance var D3DMATRIX outMat; - float fDayNightBalance = *(float*)0x8D12C0; + float fEnvVars[2] = { *(float*)0x8D12C0, RpMaterialGetColor(pInstData->material)->alpha * (1.0f/255.0f) }; RwRGBAReal* AmbientLight = RpLightGetColor(*(RpLight**)0xC886E8); - assert(!shader); - RwD3D9SetVertexShader(pNVCShader); _rwD3D9VSSetActiveWorldMatrix(RwFrameGetLTM(RpAtomicGetFrame(pRenderedAtomic))); _rwD3D9VSGetComposedTransformMatrix(&outMat); RwD3D9SetVertexShaderConstant(0, &outMat, 4); - RwD3D9SetVertexShaderConstant(4, &fDayNightBalance, 1); + RwD3D9SetVertexShaderConstant(4, fEnvVars, 1); RwD3D9SetVertexShaderConstant(5, AmbientLight, 1); } else - RwD3D9SetVertexShader(shader); + RwD3D9SetVertexShader(pInstData->vertexShader); } void __declspec(naked) SetShader2() @@ -1731,6 +1774,7 @@ __forceinline void Patch_SA_10() Patch(0x5D67D7, 0x6890); Patch(0x5D67BD, 0x5D5FE0); Patch(0x5D67D9, 0x5D5FE0); + Patch(0x5DA73F, 0x90909056); Patch(0x5D60D9, D3DDECLTYPE_D3DCOLOR); Patch(0x5D60E2, D3DDECLUSAGE_COLOR); diff --git a/SilentPatch/nvc.fx b/SilentPatch/nvc.fx index d0e8cc3..c6435e5 100644 --- a/SilentPatch/nvc.fx +++ b/SilentPatch/nvc.fx @@ -14,7 +14,7 @@ struct VS_OUTPUT }; float4x4 viewProjMatrix : register(c0); -float fDayNightBalance : register(c4); +float2 fEnvVars : register(c4); float4 AmbientLight : register(c5); VS_OUTPUT NVC_vertex_shader( in VS_INPUT In ) @@ -24,8 +24,8 @@ VS_OUTPUT NVC_vertex_shader( in VS_INPUT In ) Out.Position = mul(In.Position, viewProjMatrix); Out.Texture = In.Texture; - Out.Color = (In.DayColor * (1.0-fDayNightBalance) + In.NightColor * fDayNightBalance); - Out.Color.rgb += AmbientLight.rgb * AmbientLight.a; + Out.Color.rgb = (In.DayColor.rgb * (1.0-fEnvVars[0]) + In.NightColor.rgb * fEnvVars[0]) + (AmbientLight.rgb * AmbientLight.a); + Out.Color.a = fEnvVars[1]; Out.Color = saturate(Out.Color); return Out; diff --git a/SilentPatch/nvc.h b/SilentPatch/nvc.h index 44beebd..86226a4 100644 --- a/SilentPatch/nvc.h +++ b/SilentPatch/nvc.h @@ -9,17 +9,17 @@ // Parameters: // // float4 AmbientLight; -// float fDayNightBalance; +// float2 fEnvVars; // float4x4 viewProjMatrix; // // // Registers: // -// Name Reg Size -// ---------------- ----- ---- -// viewProjMatrix c0 4 -// fDayNightBalance c4 1 -// AmbientLight c5 1 +// Name Reg Size +// -------------- ----- ---- +// viewProjMatrix c0 4 +// fEnvVars c4 1 +// AmbientLight c5 1 // vs_2_0 @@ -32,106 +32,108 @@ dp4 oPos.y, v0, c1 dp4 oPos.z, v0, c2 dp4 oPos.w, v0, c3 - mov r0.x, c6.x + mov r0.xy, c6 add r0.x, r0.x, -c4.x - mul r1, v2, c4.x - mad r0, v3, r0.x, r1 - mad r0.xyz, c5, c5.w, r0 - max r0, r0, c6.y - min oD0, r0, c6.x + mul r1.xyz, v2, c4.x + mad r0.xzw, v3.xyyz, r0.x, r1.xyyz + mad r0.xzw, c5.xyyz, c5.w, r0 + max r1.xyz, r0.xzww, c6.y + max r1.w, r0.y, c4.y + min oD0, r1, c6.x mov oT0.xy, v1 -// approximately 12 instruction slots used +// approximately 13 instruction slots used #endif const BYTE g_vs20_NVC_vertex_shader[] = { 0, 2, 254, 255, 254, 255, - 62, 0, 67, 84, 65, 66, - 28, 0, 0, 0, 195, 0, + 60, 0, 67, 84, 65, 66, + 28, 0, 0, 0, 187, 0, 0, 0, 0, 2, 254, 255, 3, 0, 0, 0, 28, 0, 0, 0, 0, 1, 0, 0, - 188, 0, 0, 0, 88, 0, + 180, 0, 0, 0, 88, 0, 0, 0, 2, 0, 5, 0, 1, 0, 22, 0, 104, 0, 0, 0, 0, 0, 0, 0, 120, 0, 0, 0, 2, 0, 4, 0, 1, 0, 18, 0, - 140, 0, 0, 0, 0, 0, - 0, 0, 156, 0, 0, 0, + 132, 0, 0, 0, 0, 0, + 0, 0, 148, 0, 0, 0, 2, 0, 0, 0, 4, 0, - 2, 0, 172, 0, 0, 0, + 2, 0, 164, 0, 0, 0, 0, 0, 0, 0, 65, 109, 98, 105, 101, 110, 116, 76, 105, 103, 104, 116, 0, 171, 171, 171, 1, 0, 3, 0, 1, 0, 4, 0, 1, 0, 0, 0, 0, 0, 0, 0, - 102, 68, 97, 121, 78, 105, - 103, 104, 116, 66, 97, 108, - 97, 110, 99, 101, 0, 171, - 171, 171, 0, 0, 3, 0, - 1, 0, 1, 0, 1, 0, + 102, 69, 110, 118, 86, 97, + 114, 115, 0, 171, 171, 171, + 1, 0, 3, 0, 1, 0, + 2, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 118, 105, + 101, 119, 80, 114, 111, 106, + 77, 97, 116, 114, 105, 120, + 0, 171, 3, 0, 3, 0, + 4, 0, 4, 0, 1, 0, 0, 0, 0, 0, 0, 0, - 118, 105, 101, 119, 80, 114, - 111, 106, 77, 97, 116, 114, - 105, 120, 0, 171, 3, 0, - 3, 0, 4, 0, 4, 0, - 1, 0, 0, 0, 0, 0, - 0, 0, 118, 115, 95, 50, - 95, 48, 0, 77, 105, 99, - 114, 111, 115, 111, 102, 116, - 32, 40, 82, 41, 32, 72, - 76, 83, 76, 32, 83, 104, - 97, 100, 101, 114, 32, 67, - 111, 109, 112, 105, 108, 101, - 114, 32, 57, 46, 50, 57, - 46, 57, 53, 50, 46, 51, - 49, 49, 49, 0, 81, 0, - 0, 5, 6, 0, 15, 160, - 0, 0, 128, 63, 0, 0, + 118, 115, 95, 50, 95, 48, + 0, 77, 105, 99, 114, 111, + 115, 111, 102, 116, 32, 40, + 82, 41, 32, 72, 76, 83, + 76, 32, 83, 104, 97, 100, + 101, 114, 32, 67, 111, 109, + 112, 105, 108, 101, 114, 32, + 57, 46, 50, 57, 46, 57, + 53, 50, 46, 51, 49, 49, + 49, 0, 81, 0, 0, 5, + 6, 0, 15, 160, 0, 0, + 128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 31, 0, - 0, 2, 0, 0, 0, 128, - 0, 0, 15, 144, 31, 0, - 0, 2, 5, 0, 0, 128, - 1, 0, 15, 144, 31, 0, - 0, 2, 10, 0, 0, 128, - 2, 0, 15, 144, 31, 0, - 0, 2, 10, 0, 1, 128, - 3, 0, 15, 144, 9, 0, - 0, 3, 0, 0, 1, 192, - 0, 0, 228, 144, 0, 0, - 228, 160, 9, 0, 0, 3, - 0, 0, 2, 192, 0, 0, - 228, 144, 1, 0, 228, 160, + 0, 0, 31, 0, 0, 2, + 0, 0, 0, 128, 0, 0, + 15, 144, 31, 0, 0, 2, + 5, 0, 0, 128, 1, 0, + 15, 144, 31, 0, 0, 2, + 10, 0, 0, 128, 2, 0, + 15, 144, 31, 0, 0, 2, + 10, 0, 1, 128, 3, 0, + 15, 144, 9, 0, 0, 3, + 0, 0, 1, 192, 0, 0, + 228, 144, 0, 0, 228, 160, 9, 0, 0, 3, 0, 0, - 4, 192, 0, 0, 228, 144, - 2, 0, 228, 160, 9, 0, - 0, 3, 0, 0, 8, 192, - 0, 0, 228, 144, 3, 0, - 228, 160, 1, 0, 0, 2, - 0, 0, 1, 128, 6, 0, - 0, 160, 2, 0, 0, 3, - 0, 0, 1, 128, 0, 0, - 0, 128, 4, 0, 0, 161, - 5, 0, 0, 3, 1, 0, - 15, 128, 2, 0, 228, 144, - 4, 0, 0, 160, 4, 0, - 0, 4, 0, 0, 15, 128, - 3, 0, 228, 144, 0, 0, - 0, 128, 1, 0, 228, 128, - 4, 0, 0, 4, 0, 0, - 7, 128, 5, 0, 228, 160, - 5, 0, 255, 160, 0, 0, - 228, 128, 11, 0, 0, 3, - 0, 0, 15, 128, 0, 0, - 228, 128, 6, 0, 85, 160, - 10, 0, 0, 3, 0, 0, - 15, 208, 0, 0, 228, 128, - 6, 0, 0, 160, 1, 0, - 0, 2, 0, 0, 3, 224, - 1, 0, 228, 144, 255, 255, - 0, 0 + 2, 192, 0, 0, 228, 144, + 1, 0, 228, 160, 9, 0, + 0, 3, 0, 0, 4, 192, + 0, 0, 228, 144, 2, 0, + 228, 160, 9, 0, 0, 3, + 0, 0, 8, 192, 0, 0, + 228, 144, 3, 0, 228, 160, + 1, 0, 0, 2, 0, 0, + 3, 128, 6, 0, 228, 160, + 2, 0, 0, 3, 0, 0, + 1, 128, 0, 0, 0, 128, + 4, 0, 0, 161, 5, 0, + 0, 3, 1, 0, 7, 128, + 2, 0, 228, 144, 4, 0, + 0, 160, 4, 0, 0, 4, + 0, 0, 13, 128, 3, 0, + 148, 144, 0, 0, 0, 128, + 1, 0, 148, 128, 4, 0, + 0, 4, 0, 0, 13, 128, + 5, 0, 148, 160, 5, 0, + 255, 160, 0, 0, 228, 128, + 11, 0, 0, 3, 1, 0, + 7, 128, 0, 0, 248, 128, + 6, 0, 85, 160, 11, 0, + 0, 3, 1, 0, 8, 128, + 0, 0, 85, 128, 4, 0, + 85, 160, 10, 0, 0, 3, + 0, 0, 15, 208, 1, 0, + 228, 128, 6, 0, 0, 160, + 1, 0, 0, 2, 0, 0, + 3, 224, 1, 0, 228, 144, + 255, 255, 0, 0 };