├── Samples ├── Image.gif ├── build.bat ├── WicBitmapRenderTarget.cpp ├── HwndRenderTarget.cpp ├── CreateImageEncoder.cpp ├── BitmapBrush.cpp ├── CreateBitmapFromWicBitmap.cpp ├── MakeResource.cpp ├── LinearGradient.cpp ├── DesktopDeviceContext.cpp ├── RadialGradient.cpp ├── HelloWorld.cpp ├── AnimationEfficient.cpp ├── Animation.cpp └── Image.cpp ├── README.md ├── LICENSE ├── debug.h └── handle.h /Samples/Image.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kennykerr/dx/HEAD/Samples/Image.gif -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # dx 2 | dx.h is a modern C++ library that aims to simplify DirectX-related development in C++. 3 | 4 | This is an archive of the dx.h library I wrote several years ago and originally published on CodePlex. 5 | -------------------------------------------------------------------------------- /Samples/build.bat: -------------------------------------------------------------------------------- 1 | cl /nologo /W4 MakeResource.cpp 2 | MakeResource.exe Image.gif > Image.cpp 3 | 4 | cl /nologo /W4 Animation.cpp 5 | cl /nologo /W4 AnimationEfficient.cpp 6 | cl /nologo /W4 BitmapBrush.cpp Image.cpp 7 | cl /nologo /W4 CreateBitmapFromWicBitmap.cpp Image.cpp 8 | cl /nologo /W4 CreateImageEncoder.cpp 9 | cl /nologo /W4 DesktopDeviceContext.cpp 10 | cl /nologo /W4 HelloWorld.cpp 11 | cl /nologo /W4 HwndRenderTarget.cpp 12 | cl /nologo /W4 LinearGradient.cpp 13 | cl /nologo /W4 RadialGradient.cpp 14 | cl /nologo /W4 WicBitmapRenderTarget.cpp 15 | 16 | del *.obj 17 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 Kenny Kerr 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /debug.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #ifdef _DEBUG 4 | #include 5 | #include 6 | #include 7 | #endif 8 | 9 | #ifdef _DEBUG 10 | #define ASSERT _ASSERTE 11 | #define VERIFY ASSERT 12 | #define VERIFY_(result, expression) ASSERT(result == expression) 13 | #else 14 | #define ASSERT __noop 15 | #define VERIFY(expression) (expression) 16 | #define VERIFY_(result, expression) (expression) 17 | #endif 18 | 19 | #ifdef _DEBUG 20 | struct Tracer 21 | { 22 | char const * m_filename; 23 | unsigned m_line; 24 | 25 | Tracer(char const * filename, unsigned const line) : 26 | m_filename { filename }, 27 | m_line { line } 28 | { 29 | 30 | } 31 | 32 | template 33 | auto operator()(wchar_t const * format, Args... args) const -> void 34 | { 35 | wchar_t buffer [400]; 36 | 37 | auto count = swprintf_s(buffer, 38 | L"%S(%d): ", 39 | m_filename, 40 | m_line); 41 | 42 | ASSERT(-1 != count); 43 | 44 | ASSERT(-1 != _snwprintf_s(buffer + count, 45 | _countof(buffer) - count, 46 | _countof(buffer) - count - 1, 47 | format, 48 | args...)); 49 | 50 | OutputDebugString(buffer); 51 | } 52 | }; 53 | #endif 54 | 55 | #ifdef _DEBUG 56 | #define TRACE Tracer(__FILE__, __LINE__) 57 | #else 58 | #define TRACE __noop 59 | #endif 60 | -------------------------------------------------------------------------------- /Samples/WicBitmapRenderTarget.cpp: -------------------------------------------------------------------------------- 1 | // This sample demonstrates how to use Direct2D to render to a Windows Imaging Component (WIC) bitmap 2 | // on the CPU (using a Direct3D WARP device driver). The resulting WIC bitmap is then encoded to 3 | // produce a PNG file. 4 | 5 | // for ShellExecute 6 | #ifndef UNICODE 7 | #define UNICODE 8 | #endif 9 | #pragma comment(lib, "shell32.lib") 10 | 11 | #include "..\dx.h" 12 | using namespace KennyKerr; 13 | 14 | Color const COLOR_BLUE(0.26f, 0.56f, 0.87f); 15 | wchar_t const * const FILENAME = L"C:\\temp\\dx.png"; 16 | 17 | int __stdcall wWinMain(HINSTANCE, HINSTANCE, PWSTR, int) 18 | { 19 | // Although DirectX does not require the COM apartment to be initialized, 20 | // the WIC factory relies on COM activation. 21 | 22 | ComInitialize com; 23 | 24 | { 25 | // Create the WIC factory and use it to create a bitmap that Direct2D will target. 26 | 27 | auto wicFactory = Wic::CreateFactory(); 28 | auto wicBitmap = wicFactory.CreateBitmap(SizeU(600, 400)); 29 | 30 | // Create the Direct2D factory and WIC render target. 31 | 32 | auto factory = Direct2D::CreateFactory(); 33 | auto target = factory.CreateWicBitmapRenderTarget(wicBitmap); 34 | 35 | // Draw a blue ellipse on a transparent background. 36 | 37 | auto brush = target.CreateSolidColorBrush(COLOR_BLUE); 38 | target.BeginDraw(); 39 | target.Clear(); 40 | 41 | target.DrawEllipse(Direct2D::Ellipse(Point2F(300.0f, 200.0f), 100.0f, 100.0f), 42 | brush, 43 | 50.0f); 44 | 45 | HR(target.EndDraw()); 46 | 47 | // Create a file stream object. 48 | 49 | auto stream = wicFactory.CreateStream(); 50 | HR(stream.InitializeFromFilename(FILENAME)); 51 | 52 | // Create a PNG encoder and prepare a frame based on the WIC bitmap. 53 | 54 | auto encoder = wicFactory.CreateEncoder(GUID_ContainerFormatPng); 55 | encoder.Initialize(stream); 56 | auto frame = encoder.CreateNewFrame(); 57 | frame.SetSize(wicBitmap.GetSize()); 58 | 59 | GUID format; 60 | wicBitmap.GetPixelFormat(format); 61 | frame.SetPixelFormat(format); 62 | 63 | frame.WriteSource(wicBitmap); 64 | 65 | // Commit the formatted results to disk. 66 | 67 | frame.Commit(); 68 | encoder.Commit(); 69 | } 70 | 71 | // Open the resulting file just to make sure it all worked! 72 | 73 | ShellExecute(nullptr, nullptr, FILENAME, nullptr, nullptr, SW_SHOWDEFAULT); 74 | } 75 | -------------------------------------------------------------------------------- /Samples/HwndRenderTarget.cpp: -------------------------------------------------------------------------------- 1 | // Just for fun, here's an entire Direct2D-based desktop application implemented 2 | // entirely in WinMain. 3 | 4 | #ifndef UNICODE 5 | #define UNICODE 6 | #endif 7 | 8 | #include "..\dx.h" 9 | 10 | #pragma comment(lib, "user32.lib") 11 | #pragma warning(disable: 4706) 12 | 13 | using namespace KennyKerr; 14 | 15 | Color const COLOR_WHITE(1.0f, 1.0f, 1.0f); 16 | Color const COLOR_BLUE(0.26f, 0.56f, 0.87f); 17 | 18 | static Direct2D::Factory factory; 19 | static Direct2D::HwndRenderTarget target; 20 | static Direct2D::SolidColorBrush brush; 21 | 22 | int __stdcall wWinMain(HINSTANCE module, HINSTANCE, PWSTR, int) 23 | { 24 | factory = Direct2D::CreateFactory(); 25 | 26 | WNDCLASS wc = {}; 27 | wc.hCursor = LoadCursor(nullptr, IDC_ARROW); 28 | wc.hInstance = module; 29 | wc.lpszClassName = L"window"; 30 | wc.style = CS_HREDRAW | CS_VREDRAW; 31 | 32 | wc.lpfnWndProc = [] (HWND window, UINT message, WPARAM wparam, LPARAM lparam) -> LRESULT 33 | { 34 | if (WM_PAINT == message) 35 | { 36 | PAINTSTRUCT ps; 37 | VERIFY(BeginPaint(window, &ps)); 38 | 39 | if (!target) 40 | { 41 | target = factory.CreateHwndRenderTarget(window); 42 | brush = target.CreateSolidColorBrush(COLOR_BLUE); 43 | } 44 | 45 | target.BeginDraw(); 46 | target.Clear(COLOR_WHITE); 47 | auto size = target.GetSize(); 48 | 49 | target.DrawRectangle(RectF(100.0f, 100.0f, size.Width - 100.0f, size.Height - 100.0f), 50 | brush, 51 | 50.0f); 52 | 53 | if (D2DERR_RECREATE_TARGET == target.EndDraw()) 54 | { 55 | target.Reset(); 56 | } 57 | 58 | EndPaint(window, &ps); 59 | return 0; 60 | } 61 | 62 | if (WM_SIZE == message) 63 | { 64 | if (target && S_OK != target.Resize(SizeU(LOWORD(lparam), HIWORD(lparam)))) 65 | { 66 | target.Reset(); 67 | } 68 | 69 | return 0; 70 | } 71 | 72 | if (WM_DESTROY == message) 73 | { 74 | PostQuitMessage(0); 75 | return 0; 76 | } 77 | 78 | return DefWindowProc(window, message, wparam, lparam); 79 | }; 80 | 81 | RegisterClass(&wc); 82 | 83 | CreateWindow(wc.lpszClassName, L"Direct2D", WS_OVERLAPPEDWINDOW | WS_VISIBLE, 84 | CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, 85 | nullptr, nullptr, module, nullptr); 86 | 87 | MSG message; 88 | BOOL result; 89 | 90 | while (result = GetMessage(&message, 0, 0, 0)) 91 | { 92 | if (-1 != result) DispatchMessage(&message); 93 | } 94 | 95 | brush.Reset(); 96 | target.Reset(); 97 | factory.Reset(); 98 | } 99 | -------------------------------------------------------------------------------- /Samples/CreateImageEncoder.cpp: -------------------------------------------------------------------------------- 1 | // This sample demonstrates how to use Direct2D to render a bitmap on the GPU (using a Direct3D device) 2 | // and then encode the resulting bitmap with the Windows Imaging Component (WIC) to produce a PNG file. 3 | 4 | // for ShellExecute 5 | #ifndef UNICODE 6 | #define UNICODE 7 | #endif 8 | #pragma comment(lib, "shell32.lib") 9 | 10 | #include "..\dx.h" 11 | using namespace KennyKerr; 12 | using namespace KennyKerr::Direct2D; 13 | 14 | Color const COLOR_GREEN(0.45f, 0.56f, 0.1f); 15 | wchar_t const * const FILENAME = L"C:\\temp\\dx.png"; 16 | 17 | int __stdcall wWinMain(HINSTANCE, HINSTANCE, PWSTR, int) 18 | { 19 | // Although DirectX does not require the COM apartment to be initialized, 20 | // the WIC factory relies on COM activation. 21 | 22 | ComInitialize com; 23 | 24 | { 25 | // Create the Direct3D device driver that represents the physical rendering device (the GPU). 26 | 27 | auto driver = Direct3D::CreateDevice(); 28 | 29 | // Create the Direct2D factory, the Direct2D device, and render target. 30 | 31 | auto factory = CreateFactory(); 32 | auto device = factory.CreateDevice(driver); 33 | auto target = device.CreateDeviceContext(); 34 | 35 | // Create the bitmap (on the GPU) that will act as the rendering surface. 36 | 37 | BitmapProperties1 props(BitmapOptions::Target, 38 | PixelFormat(Dxgi::Format::B8G8R8A8_UNORM, AlphaMode::Premultiplied)); 39 | 40 | auto bitmap = target.CreateBitmap(SizeU(600, 400), props); 41 | target.SetTarget(bitmap); 42 | 43 | // Draw a green ellipse on a transparent background. 44 | 45 | auto brush = target.CreateSolidColorBrush(COLOR_GREEN); 46 | target.BeginDraw(); 47 | target.Clear(); 48 | 49 | target.DrawEllipse(Direct2D::Ellipse(Point2F(300.0f, 200.0f), 100.0f, 100.0f), 50 | brush, 51 | 50.0f); 52 | 53 | HR(target.EndDraw()); 54 | 55 | // Create the WIC factory and a file stream object. 56 | 57 | auto wic = Wic::CreateFactory(); 58 | auto stream = wic.CreateStream(); 59 | HR(stream.InitializeFromFilename(FILENAME)); 60 | 61 | // Create a PNG encoder and a new frame to store the image. 62 | 63 | auto pngEncoder = wic.CreateEncoder(GUID_ContainerFormatPng); 64 | pngEncoder.Initialize(stream); 65 | auto frame = pngEncoder.CreateNewFrame(); 66 | 67 | // Create an image encoder to directly encode the Direct2D image into the frame. 68 | 69 | auto imageEncoder = wic.CreateImageEncoder(device); 70 | 71 | imageEncoder.WriteFrame(bitmap, 72 | frame); 73 | 74 | // Commit the formatted results to disk. 75 | 76 | frame.Commit(); 77 | pngEncoder.Commit(); 78 | } 79 | 80 | // Open the resulting file just to make sure it all worked! 81 | 82 | ShellExecute(nullptr, nullptr, FILENAME, nullptr, nullptr, SW_SHOWDEFAULT); 83 | } 84 | -------------------------------------------------------------------------------- /Samples/BitmapBrush.cpp: -------------------------------------------------------------------------------- 1 | // This sample illustrates how to create a bitmap brush and fill a shape with it. 2 | 3 | #define NOMINMAX 4 | #ifndef UNICODE 5 | #define UNICODE 6 | #endif 7 | #pragma comment(lib, "shell32.lib") 8 | 9 | #include "..\dx.h" 10 | #include // std::min 11 | 12 | using namespace KennyKerr; 13 | using namespace KennyKerr::Direct2D; 14 | 15 | unsigned char const * MakeResourceBuffer(); 16 | unsigned MakeResourceSize(); 17 | 18 | static Wic::FormatConverter LoadWicBitmap() 19 | { 20 | auto factory = Wic::CreateFactory(); 21 | auto stream = factory.CreateStream(); 22 | 23 | stream.InitializeFromMemory(const_cast(MakeResourceBuffer()), 24 | MakeResourceSize()); 25 | 26 | auto decoder = factory.CreateDecoderFromStream(stream); 27 | auto source = decoder.GetFrame(); 28 | 29 | auto image = factory.CreateFormatConverter(); 30 | image.Initialize(source); 31 | return image; 32 | } 33 | 34 | static void Draw(DeviceContext const & target) 35 | { 36 | target.Clear(); 37 | auto const size = target.GetSize(); 38 | 39 | Point2F center(size.Width / 2.0f, 40 | size.Height / 2.0f); 41 | 42 | auto radius = std::min(size.Width, size.Height) / 3.0f; 43 | 44 | // First, draw image with 50% transparency 45 | 46 | auto bitmap = target.CreateBitmapFromWicBitmap(LoadWicBitmap()); 47 | 48 | target.DrawBitmap(bitmap, 0.5f); 49 | 50 | // Next, fill circle with image 51 | 52 | auto bitmapBrush = target.CreateBitmapBrush(bitmap); 53 | 54 | target.FillEllipse(Direct2D::Ellipse(center, radius, radius), 55 | bitmapBrush); 56 | 57 | // Next, draw circle with red brush 58 | 59 | auto solid = target.CreateSolidColorBrush(Color(1.0f)); 60 | 61 | target.DrawEllipse(Direct2D::Ellipse(center, radius, radius), 62 | solid, 63 | 10.0f); 64 | } 65 | 66 | wchar_t const * const FILENAME = L"C:\\temp\\dx.png"; 67 | 68 | int __stdcall wWinMain(HINSTANCE, HINSTANCE, PWSTR, int) 69 | { 70 | ComInitialize com; 71 | 72 | { 73 | auto driver = Direct3D::CreateDevice(); 74 | auto factory = CreateFactory(); 75 | auto device = factory.CreateDevice(driver); 76 | auto target = device.CreateDeviceContext(); 77 | 78 | BitmapProperties1 props(BitmapOptions::Target, 79 | PixelFormat(Dxgi::Format::B8G8R8A8_UNORM, AlphaMode::Premultiplied)); 80 | 81 | auto bitmap = target.CreateBitmap(SizeU(800, 700), props); 82 | target.SetTarget(bitmap); 83 | 84 | target.BeginDraw(); 85 | Draw(target); 86 | HR(target.EndDraw()); 87 | 88 | auto wic = Wic::CreateFactory(); 89 | auto stream = wic.CreateStream(); 90 | HR(stream.InitializeFromFilename(FILENAME)); 91 | 92 | auto pngEncoder = wic.CreateEncoder(GUID_ContainerFormatPng); 93 | pngEncoder.Initialize(stream); 94 | auto frame = pngEncoder.CreateNewFrame(); 95 | 96 | auto imageEncoder = wic.CreateImageEncoder(device); 97 | 98 | imageEncoder.WriteFrame(bitmap, 99 | frame); 100 | 101 | frame.Commit(); 102 | pngEncoder.Commit(); 103 | } 104 | 105 | // Open the resulting file just to make sure it all worked! 106 | 107 | ShellExecute(nullptr, nullptr, FILENAME, nullptr, nullptr, SW_SHOWDEFAULT); 108 | } 109 | -------------------------------------------------------------------------------- /Samples/CreateBitmapFromWicBitmap.cpp: -------------------------------------------------------------------------------- 1 | // This sample demonstrates how to load an embedded resource (created with 2 | // MakeResource.cpp) as a bitmap so that it can be rendered with Direct2D. 3 | // This technique works perfectly well with desktop, Windows Store, 4 | // and Windows Phone apps. 5 | 6 | #ifndef UNICODE 7 | #define UNICODE 8 | #endif 9 | 10 | #include "..\dx.h" 11 | 12 | #pragma comment(lib, "user32.lib") 13 | #pragma warning(disable: 4706) 14 | 15 | using namespace KennyKerr; 16 | 17 | Color const COLOR_NOT_WHITE(0.97f, 0.8f, 0.68f); 18 | 19 | static Direct2D::Factory factory; 20 | static Direct2D::HwndRenderTarget target; 21 | static Direct2D::Bitmap bitmap; 22 | static Wic::FormatConverter image; 23 | 24 | unsigned char const * MakeResourceBuffer(); 25 | unsigned MakeResourceSize(); 26 | 27 | static void CreateDeviceIndependentResources() 28 | { 29 | auto factory = Wic::CreateFactory(); 30 | auto stream = factory.CreateStream(); 31 | 32 | stream.InitializeFromMemory(const_cast(MakeResourceBuffer()), 33 | MakeResourceSize()); 34 | 35 | auto decoder = factory.CreateDecoderFromStream(stream); 36 | auto source = decoder.GetFrame(); 37 | 38 | image = factory.CreateFormatConverter(); 39 | image.Initialize(source); 40 | } 41 | 42 | static void CreateDeviceResources() 43 | { 44 | bitmap = target.CreateBitmapFromWicBitmap(image); 45 | } 46 | 47 | static void Draw() 48 | { 49 | target.Clear(COLOR_NOT_WHITE); 50 | target.DrawBitmap(bitmap); 51 | } 52 | 53 | int __stdcall wWinMain(HINSTANCE module, HINSTANCE, PWSTR, int) 54 | { 55 | ComInitialize com; 56 | 57 | factory = Direct2D::CreateFactory(); 58 | CreateDeviceIndependentResources(); 59 | 60 | WNDCLASS wc = {}; 61 | wc.hCursor = LoadCursor(nullptr, IDC_ARROW); 62 | wc.hInstance = module; 63 | wc.lpszClassName = L"window"; 64 | wc.style = CS_HREDRAW | CS_VREDRAW; 65 | 66 | wc.lpfnWndProc = [] (HWND window, UINT message, WPARAM wparam, LPARAM lparam) -> LRESULT 67 | { 68 | if (WM_PAINT == message) 69 | { 70 | PAINTSTRUCT ps; 71 | VERIFY(BeginPaint(window, &ps)); 72 | 73 | if (!target) 74 | { 75 | target = factory.CreateHwndRenderTarget(window); 76 | CreateDeviceResources(); 77 | } 78 | 79 | target.BeginDraw(); 80 | 81 | Draw(); 82 | 83 | if (D2DERR_RECREATE_TARGET == target.EndDraw()) 84 | { 85 | target.Reset(); 86 | } 87 | 88 | EndPaint(window, &ps); 89 | return 0; 90 | } 91 | 92 | if (WM_SIZE == message) 93 | { 94 | if (target && S_OK != target.Resize(SizeU(LOWORD(lparam), HIWORD(lparam)))) 95 | { 96 | target.Reset(); 97 | } 98 | 99 | return 0; 100 | } 101 | 102 | if (WM_DESTROY == message) 103 | { 104 | PostQuitMessage(0); 105 | return 0; 106 | } 107 | 108 | return DefWindowProc(window, message, wparam, lparam); 109 | }; 110 | 111 | RegisterClass(&wc); 112 | 113 | CreateWindow(wc.lpszClassName, L"Direct2D", WS_OVERLAPPEDWINDOW | WS_VISIBLE, 114 | CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, 115 | nullptr, nullptr, module, nullptr); 116 | 117 | MSG message; 118 | BOOL result; 119 | 120 | while (result = GetMessage(&message, 0, 0, 0)) 121 | { 122 | if (-1 != result) DispatchMessage(&message); 123 | } 124 | 125 | image.Reset(); 126 | bitmap.Reset(); 127 | target.Reset(); 128 | factory.Reset(); 129 | } 130 | -------------------------------------------------------------------------------- /Samples/MakeResource.cpp: -------------------------------------------------------------------------------- 1 | // A very simple utility for embedding resources inside a project using C++ static 2 | // arrays. This tends to be the simplest and most efficient way to embed a resource 3 | // inside an executable. 4 | // 5 | // Compile: cl MakeResource.cpp 6 | // Run: MakeResource.exe Image.gif > Image.cpp 7 | 8 | #include 9 | #include 10 | 11 | namespace wrl = Microsoft::WRL::Wrappers; 12 | 13 | #define ASSERT(expr) _ASSERTE(expr) 14 | #ifdef _DEBUG 15 | #define VERIFY(expr) ASSERT(expr) 16 | #else 17 | #define VERIFY(expr) (expr) 18 | #endif 19 | 20 | class file_view 21 | { 22 | BYTE const * m_view; 23 | LARGE_INTEGER m_size; 24 | typedef wrl::HandleT MapHandle; 25 | 26 | file_view(file_view const &); 27 | file_view & operator=(file_view const &); 28 | public: 29 | 30 | file_view(char const * name) throw() : 31 | m_view(), 32 | m_size() 33 | { 34 | ASSERT(name); 35 | 36 | wrl::FileHandle const file(CreateFileA(name, 37 | GENERIC_READ, 38 | FILE_SHARE_READ, 39 | nullptr, // default security 40 | OPEN_EXISTING, 41 | FILE_ATTRIBUTE_NORMAL, 42 | nullptr)); // no template 43 | 44 | if (!file.IsValid()) return; 45 | VERIFY(GetFileSizeEx(file.Get(), &m_size)); 46 | if (m_size.QuadPart == 0) return; 47 | 48 | MapHandle const map(CreateFileMapping(file.Get(), 49 | nullptr, // default security 50 | PAGE_READONLY, 51 | 0, 0, // match file size 52 | nullptr)); // no name 53 | 54 | VERIFY(map.IsValid()); 55 | 56 | m_view = static_cast(MapViewOfFile(map.Get(), 57 | FILE_MAP_READ, 58 | 0, 0, // offset 59 | 0)); // match file size 60 | } 61 | 62 | ~file_view() throw() 63 | { 64 | if (valid()) 65 | { 66 | VERIFY(UnmapViewOfFile(m_view)); 67 | } 68 | } 69 | 70 | bool valid() const throw() // If !valid() call GetLastError for reason 71 | { 72 | return nullptr != m_view; 73 | } 74 | 75 | BYTE const * begin() const throw() 76 | { 77 | ASSERT(valid()); 78 | return m_view; 79 | } 80 | 81 | BYTE const * end() const throw() 82 | { 83 | return begin() + m_size.QuadPart; 84 | } 85 | }; 86 | 87 | int main(int argc, char ** argv) 88 | { 89 | if (2 != argc) 90 | { 91 | printf("MakeResource.exe input.png > output.cpp\n"); 92 | return 0; 93 | } 94 | 95 | file_view const file(argv[1]); 96 | 97 | if (!file.valid()) 98 | { 99 | printf("Failed to load resource.\n"); 100 | return 0; 101 | } 102 | 103 | printf("static unsigned char MAKE_RESOURCE_DATA[] =\n{"); 104 | 105 | unsigned column = 0; 106 | 107 | for (auto it = file.begin(); it != file.end(); ++it) 108 | { 109 | if (0 == column) 110 | { 111 | printf("\n "); 112 | } 113 | 114 | printf("0x%02x, ", *it); 115 | 116 | if (100 == ++column) 117 | { 118 | column = 0; 119 | } 120 | } 121 | 122 | printf("\n};\n\nunsigned char const * MakeResourceBuffer() { return MAKE_RESOURCE_DATA; }\nunsigned MakeResourceSize() { return sizeof(MAKE_RESOURCE_DATA); }\n"); 123 | } 124 | -------------------------------------------------------------------------------- /handle.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include 4 | #include "debug.h" 5 | 6 | namespace KennyKerr 7 | { 8 | template 9 | class unique_handle 10 | { 11 | using pointer = typename Traits::pointer; 12 | 13 | pointer m_value; 14 | 15 | auto close() throw() -> void 16 | { 17 | if (*this) 18 | { 19 | Traits::close(m_value); 20 | } 21 | } 22 | 23 | public: 24 | 25 | unique_handle(unique_handle const &) = delete; 26 | auto operator=(unique_handle const &) -> unique_handle & = delete; 27 | 28 | explicit unique_handle(pointer value = Traits::invalid()) throw() : 29 | m_value { value } 30 | { 31 | } 32 | 33 | unique_handle(unique_handle && other) throw() : 34 | m_value { other.release() } 35 | { 36 | } 37 | 38 | auto operator=(unique_handle && other) throw() -> unique_handle & 39 | { 40 | if (this != &other) 41 | { 42 | reset(other.release()); 43 | } 44 | 45 | return *this; 46 | } 47 | 48 | ~unique_handle() throw() 49 | { 50 | close(); 51 | } 52 | 53 | explicit operator bool() const throw() 54 | { 55 | return m_value != Traits::invalid(); 56 | } 57 | 58 | auto get() const throw() -> pointer 59 | { 60 | return m_value; 61 | } 62 | 63 | auto get_address_of() throw() -> pointer * 64 | { 65 | ASSERT(!*this); 66 | return &m_value; 67 | } 68 | 69 | auto release() throw() -> pointer 70 | { 71 | auto value = m_value; 72 | m_value = Traits::invalid(); 73 | return value; 74 | } 75 | 76 | auto reset(pointer value = Traits::invalid()) throw() -> bool 77 | { 78 | if (m_value != value) 79 | { 80 | close(); 81 | m_value = value; 82 | } 83 | 84 | return static_cast(*this); 85 | } 86 | 87 | auto swap(unique_handle & other) throw() -> void 88 | { 89 | std::swap(m_value, other.m_value); 90 | } 91 | }; 92 | 93 | template 94 | auto swap(unique_handle & left, 95 | unique_handle & right) throw() -> void 96 | { 97 | left.swap(right); 98 | } 99 | 100 | template 101 | auto operator==(unique_handle const & left, 102 | unique_handle const & right) throw() -> bool 103 | { 104 | return left.get() == right.get(); 105 | } 106 | 107 | template 108 | auto operator!=(unique_handle const & left, 109 | unique_handle const & right) throw() -> bool 110 | { 111 | return left.get() != right.get(); 112 | } 113 | 114 | template 115 | auto operator<(unique_handle const & left, 116 | unique_handle const & right) throw() -> bool 117 | { 118 | return left.get() < right.get(); 119 | } 120 | 121 | template 122 | auto operator>=(unique_handle const & left, 123 | unique_handle const & right) throw() -> bool 124 | { 125 | return left.get() >= right.get(); 126 | } 127 | 128 | template 129 | auto operator>(unique_handle const & left, 130 | unique_handle const & right) throw() -> bool 131 | { 132 | return left.get() > right.get(); 133 | } 134 | 135 | template 136 | auto operator<=(unique_handle const & left, 137 | unique_handle const & right) throw() -> bool 138 | { 139 | return left.get() <= right.get(); 140 | } 141 | 142 | struct null_handle_traits 143 | { 144 | using pointer = HANDLE; 145 | 146 | static auto invalid() throw() -> pointer 147 | { 148 | return nullptr; 149 | } 150 | 151 | static auto close(pointer value) throw() -> void 152 | { 153 | VERIFY(CloseHandle(value)); 154 | } 155 | }; 156 | 157 | struct invalid_handle_traits 158 | { 159 | using pointer = HANDLE; 160 | 161 | static auto invalid() throw() -> pointer 162 | { 163 | return INVALID_HANDLE_VALUE; 164 | } 165 | 166 | static auto close(pointer value) throw() -> void 167 | { 168 | VERIFY(CloseHandle(value)); 169 | } 170 | }; 171 | 172 | using null_handle = unique_handle; 173 | using invalid_handle = unique_handle; 174 | } 175 | -------------------------------------------------------------------------------- /Samples/LinearGradient.cpp: -------------------------------------------------------------------------------- 1 | #define NOMINMAX 2 | #ifndef UNICODE 3 | #define UNICODE 4 | #endif 5 | 6 | #pragma comment(lib, "user32.lib") 7 | #pragma warning(disable: 4706) 8 | 9 | #include "..\dx.h" 10 | 11 | using namespace KennyKerr; 12 | using namespace KennyKerr::Direct2D; 13 | 14 | Color const COLOR_WHITE(1.0f, 1.0f, 1.0f); 15 | Color const COLOR_BLUE(0.26f, 0.56f, 0.87f); 16 | 17 | static Factory1 factory; 18 | static DeviceContext target; 19 | static LinearGradientBrush brush; 20 | static Dxgi::SwapChain1 swapChain; 21 | 22 | static void CreateDeviceResources() 23 | { 24 | GradientStop stops[] = 25 | { 26 | GradientStop(0.0f, COLOR_WHITE), 27 | GradientStop(1.0f, COLOR_BLUE), 28 | }; 29 | 30 | auto collection = target.CreateGradientStopCollection(stops); 31 | brush = target.CreateLinearGradientBrush(collection); 32 | } 33 | 34 | static void ReleaseDevice() 35 | { 36 | target.Reset(); 37 | swapChain.Reset(); 38 | brush.Reset(); 39 | } 40 | 41 | static void Draw() 42 | { 43 | auto const size = target.GetSize(); 44 | brush.SetEndPoint(Point2F(size.Width, size.Height)); 45 | target.FillRectangle(RectF(0, 0, size.Width, size.Height), brush); 46 | } 47 | 48 | static void CreateDeviceSwapChainBitmap(Dxgi::SwapChain const & swapChain, 49 | DeviceContext const & target) 50 | { 51 | auto props = BitmapProperties1(BitmapOptions::Target | BitmapOptions::CannotDraw, 52 | PixelFormat(Dxgi::Format::B8G8R8A8_UNORM, AlphaMode::Ignore)); 53 | 54 | target.SetTarget(target.CreateBitmapFromDxgiSurface(swapChain, 55 | props)); 56 | } 57 | 58 | static void Render(HWND window) 59 | { 60 | if (!target) 61 | { 62 | auto device = Direct3D::CreateDevice(); 63 | target = factory.CreateDevice(device).CreateDeviceContext(); 64 | auto dxgi = device.GetDxgiFactory(); 65 | 66 | Dxgi::SwapChainDescription1 description; 67 | description.SwapEffect = Dxgi::SwapEffect::Discard; 68 | 69 | swapChain = dxgi.CreateSwapChainForHwnd(device, 70 | window, 71 | description); 72 | 73 | CreateDeviceSwapChainBitmap(swapChain, 74 | target); 75 | 76 | auto const dpi = factory.GetDesktopDpi(); 77 | target.SetDpi(dpi, dpi); 78 | CreateDeviceResources(); 79 | } 80 | 81 | target.BeginDraw(); 82 | Draw(); 83 | target.EndDraw(); 84 | 85 | auto const hr = swapChain.Present(); 86 | 87 | if (S_OK != hr && DXGI_STATUS_OCCLUDED != hr) 88 | { 89 | ReleaseDevice(); 90 | } 91 | } 92 | 93 | static void ResizeSwapChainBitmap() 94 | { 95 | target.SetTarget(); 96 | 97 | if (S_OK == swapChain.ResizeBuffers()) 98 | { 99 | CreateDeviceSwapChainBitmap(swapChain, 100 | target); 101 | } 102 | else 103 | { 104 | ReleaseDevice(); 105 | } 106 | } 107 | 108 | int __stdcall wWinMain(HINSTANCE module, HINSTANCE, PWSTR, int) 109 | { 110 | ComInitialize com; 111 | 112 | factory = CreateFactory(); 113 | 114 | WNDCLASS wc = {}; 115 | wc.hCursor = LoadCursor(nullptr, IDC_ARROW); 116 | wc.hInstance = module; 117 | wc.lpszClassName = L"window"; 118 | wc.style = CS_HREDRAW | CS_VREDRAW; 119 | 120 | wc.lpfnWndProc = [] (HWND window, UINT message, WPARAM wparam, LPARAM lparam) -> LRESULT 121 | { 122 | if (WM_PAINT == message) 123 | { 124 | PAINTSTRUCT ps; 125 | VERIFY(BeginPaint(window, &ps)); 126 | Render(window); 127 | EndPaint(window, &ps); 128 | return 0; 129 | } 130 | 131 | if (WM_SIZE == message) 132 | { 133 | if (target && SIZE_MINIMIZED != wparam) 134 | { 135 | ResizeSwapChainBitmap(); 136 | Render(window); 137 | } 138 | 139 | return 0; 140 | } 141 | 142 | if (WM_DISPLAYCHANGE == message) 143 | { 144 | Render(window); 145 | return 0; 146 | } 147 | 148 | if (WM_DESTROY == message) 149 | { 150 | PostQuitMessage(0); 151 | return 0; 152 | } 153 | 154 | return DefWindowProc(window, message, wparam, lparam); 155 | }; 156 | 157 | RegisterClass(&wc); 158 | 159 | CreateWindow(wc.lpszClassName, L"Direct2D", WS_OVERLAPPEDWINDOW | WS_VISIBLE, 160 | CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, 161 | nullptr, nullptr, module, nullptr); 162 | 163 | MSG message; 164 | BOOL result; 165 | 166 | while (result = GetMessage(&message, 0, 0, 0)) 167 | { 168 | if (-1 != result) DispatchMessage(&message); 169 | } 170 | 171 | ReleaseDevice(); 172 | factory.Reset(); 173 | } 174 | -------------------------------------------------------------------------------- /Samples/DesktopDeviceContext.cpp: -------------------------------------------------------------------------------- 1 | // Here's a minimal desktop window using the DeviceContext render target, 2 | // the preferred way of rendering with Direct2D 1.1. 3 | 4 | #define NOMINMAX 5 | #ifndef UNICODE 6 | #define UNICODE 7 | #endif 8 | 9 | #pragma comment(lib, "user32.lib") 10 | #pragma warning(disable: 4706) 11 | 12 | #include "..\dx.h" 13 | #include 14 | 15 | using namespace KennyKerr; 16 | using namespace KennyKerr::Direct2D; 17 | 18 | Color const COLOR_WHITE(1.0f, 1.0f, 1.0f); 19 | Color const COLOR_BLUE(0.26f, 0.56f, 0.87f); 20 | 21 | static Factory1 factory; 22 | static DeviceContext target; 23 | static SolidColorBrush brush; 24 | static Dxgi::SwapChain1 swapChain; 25 | 26 | static void CreateDeviceResources() 27 | { 28 | brush = target.CreateSolidColorBrush(COLOR_BLUE); 29 | } 30 | 31 | static void ReleaseDevice() 32 | { 33 | target.Reset(); 34 | swapChain.Reset(); 35 | brush.Reset(); 36 | } 37 | 38 | static void Draw() 39 | { 40 | target.Clear(COLOR_WHITE); 41 | auto const size = target.GetSize(); 42 | 43 | Point2F center(size.Width / 2.0f, 44 | size.Height / 2.0f); 45 | 46 | auto radius = std::min(size.Width, size.Height) / 3.0f; 47 | 48 | target.DrawEllipse(Direct2D::Ellipse(center, radius, radius), 49 | brush, 50 | 10.0f); 51 | } 52 | 53 | static void CreateDeviceSwapChainBitmap(Dxgi::SwapChain const & swapChain, 54 | DeviceContext const & target) 55 | { 56 | auto props = BitmapProperties1(BitmapOptions::Target | BitmapOptions::CannotDraw, 57 | PixelFormat(Dxgi::Format::B8G8R8A8_UNORM, AlphaMode::Ignore)); 58 | 59 | target.SetTarget(target.CreateBitmapFromDxgiSurface(swapChain, 60 | props)); 61 | } 62 | 63 | static void Render(HWND window) 64 | { 65 | if (!target) 66 | { 67 | auto device = Direct3D::CreateDevice(); 68 | target = factory.CreateDevice(device).CreateDeviceContext(); 69 | auto dxgi = device.GetDxgiFactory(); 70 | 71 | Dxgi::SwapChainDescription1 description; 72 | description.SwapEffect = Dxgi::SwapEffect::Discard; 73 | 74 | swapChain = dxgi.CreateSwapChainForHwnd(device, 75 | window, 76 | description); 77 | 78 | CreateDeviceSwapChainBitmap(swapChain, 79 | target); 80 | 81 | auto const dpi = factory.GetDesktopDpi(); 82 | target.SetDpi(dpi, dpi); 83 | CreateDeviceResources(); 84 | } 85 | 86 | target.BeginDraw(); 87 | Draw(); 88 | target.EndDraw(); 89 | 90 | auto const hr = swapChain.Present(); 91 | 92 | if (S_OK != hr && DXGI_STATUS_OCCLUDED != hr) 93 | { 94 | ReleaseDevice(); 95 | } 96 | } 97 | 98 | static void ResizeSwapChainBitmap() 99 | { 100 | target.SetTarget(); 101 | 102 | if (S_OK == swapChain.ResizeBuffers()) 103 | { 104 | CreateDeviceSwapChainBitmap(swapChain, 105 | target); 106 | } 107 | else 108 | { 109 | ReleaseDevice(); 110 | } 111 | } 112 | 113 | int __stdcall wWinMain(HINSTANCE module, HINSTANCE, PWSTR, int) 114 | { 115 | ComInitialize com; 116 | 117 | factory = CreateFactory(); 118 | 119 | WNDCLASS wc = {}; 120 | wc.hCursor = LoadCursor(nullptr, IDC_ARROW); 121 | wc.hInstance = module; 122 | wc.lpszClassName = L"window"; 123 | wc.style = CS_HREDRAW | CS_VREDRAW; 124 | 125 | wc.lpfnWndProc = [] (HWND window, UINT message, WPARAM wparam, LPARAM lparam) -> LRESULT 126 | { 127 | if (WM_PAINT == message) 128 | { 129 | PAINTSTRUCT ps; 130 | VERIFY(BeginPaint(window, &ps)); 131 | Render(window); 132 | EndPaint(window, &ps); 133 | return 0; 134 | } 135 | 136 | if (WM_SIZE == message) 137 | { 138 | if (target && SIZE_MINIMIZED != wparam) 139 | { 140 | ResizeSwapChainBitmap(); 141 | Render(window); 142 | } 143 | 144 | return 0; 145 | } 146 | 147 | if (WM_DISPLAYCHANGE == message) 148 | { 149 | Render(window); 150 | return 0; 151 | } 152 | 153 | if (WM_DESTROY == message) 154 | { 155 | PostQuitMessage(0); 156 | return 0; 157 | } 158 | 159 | return DefWindowProc(window, message, wparam, lparam); 160 | }; 161 | 162 | RegisterClass(&wc); 163 | 164 | CreateWindow(wc.lpszClassName, L"Direct2D", WS_OVERLAPPEDWINDOW | WS_VISIBLE, 165 | CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, 166 | nullptr, nullptr, module, nullptr); 167 | 168 | MSG message; 169 | BOOL result; 170 | 171 | while (result = GetMessage(&message, 0, 0, 0)) 172 | { 173 | if (-1 != result) DispatchMessage(&message); 174 | } 175 | 176 | ReleaseDevice(); 177 | factory.Reset(); 178 | } 179 | -------------------------------------------------------------------------------- /Samples/RadialGradient.cpp: -------------------------------------------------------------------------------- 1 | #define NOMINMAX 2 | #ifndef UNICODE 3 | #define UNICODE 4 | #endif 5 | 6 | #pragma comment(lib, "user32.lib") 7 | #pragma warning(disable: 4706) 8 | 9 | #include "..\dx.h" 10 | #include 11 | 12 | using namespace KennyKerr; 13 | using namespace KennyKerr::Direct2D; 14 | 15 | Color const COLOR_WHITE(1.0f, 1.0f, 1.0f); 16 | Color const COLOR_BLUE(0.26f, 0.56f, 0.87f); 17 | 18 | static Factory1 factory; 19 | static DeviceContext target; 20 | static RadialGradientBrush brush; 21 | static Dxgi::SwapChain1 swapChain; 22 | 23 | static void CreateDeviceResources() 24 | { 25 | GradientStop stops[] = 26 | { 27 | GradientStop(0.0f, COLOR_WHITE), 28 | GradientStop(1.0f, COLOR_BLUE), 29 | }; 30 | 31 | auto collection = target.CreateGradientStopCollection(stops, 32 | Gamma::_2_2, 33 | ExtendMode::Wrap); 34 | 35 | brush = target.CreateRadialGradientBrush(collection); 36 | } 37 | 38 | static void ReleaseDevice() 39 | { 40 | target.Reset(); 41 | swapChain.Reset(); 42 | brush.Reset(); 43 | } 44 | 45 | static void Draw() 46 | { 47 | auto const size = target.GetSize(); 48 | 49 | brush.SetCenter(Point2F(size.Width / 2.0f, size.Height / 2.0f)); 50 | 51 | auto radius = std::min(size.Width / 3.0f, size.Height / 3.0f); 52 | brush.SetRadiusX(radius); 53 | brush.SetRadiusY(radius); 54 | 55 | target.FillRectangle(RectF(0, 0, size.Width, size.Height), brush); 56 | } 57 | 58 | static void CreateDeviceSwapChainBitmap(Dxgi::SwapChain const & swapChain, 59 | DeviceContext const & target) 60 | { 61 | auto props = BitmapProperties1(BitmapOptions::Target | BitmapOptions::CannotDraw, 62 | PixelFormat(Dxgi::Format::B8G8R8A8_UNORM, AlphaMode::Ignore)); 63 | 64 | target.SetTarget(target.CreateBitmapFromDxgiSurface(swapChain, 65 | props)); 66 | } 67 | 68 | static void Render(HWND window) 69 | { 70 | if (!target) 71 | { 72 | auto device = Direct3D::CreateDevice(); 73 | target = factory.CreateDevice(device).CreateDeviceContext(); 74 | auto dxgi = device.GetDxgiFactory(); 75 | 76 | Dxgi::SwapChainDescription1 description; 77 | description.SwapEffect = Dxgi::SwapEffect::Discard; 78 | 79 | swapChain = dxgi.CreateSwapChainForHwnd(device, 80 | window, 81 | description); 82 | 83 | CreateDeviceSwapChainBitmap(swapChain, 84 | target); 85 | 86 | auto const dpi = factory.GetDesktopDpi(); 87 | target.SetDpi(dpi, dpi); 88 | CreateDeviceResources(); 89 | } 90 | 91 | target.BeginDraw(); 92 | Draw(); 93 | target.EndDraw(); 94 | 95 | auto const hr = swapChain.Present(); 96 | 97 | if (S_OK != hr && DXGI_STATUS_OCCLUDED != hr) 98 | { 99 | ReleaseDevice(); 100 | } 101 | } 102 | 103 | static void ResizeSwapChainBitmap() 104 | { 105 | target.SetTarget(); 106 | 107 | if (S_OK == swapChain.ResizeBuffers()) 108 | { 109 | CreateDeviceSwapChainBitmap(swapChain, 110 | target); 111 | } 112 | else 113 | { 114 | ReleaseDevice(); 115 | } 116 | } 117 | 118 | int __stdcall wWinMain(HINSTANCE module, HINSTANCE, PWSTR, int) 119 | { 120 | ComInitialize com; 121 | 122 | factory = CreateFactory(); 123 | 124 | WNDCLASS wc = {}; 125 | wc.hCursor = LoadCursor(nullptr, IDC_ARROW); 126 | wc.hInstance = module; 127 | wc.lpszClassName = L"window"; 128 | wc.style = CS_HREDRAW | CS_VREDRAW; 129 | 130 | wc.lpfnWndProc = [] (HWND window, UINT message, WPARAM wparam, LPARAM lparam) -> LRESULT 131 | { 132 | if (WM_PAINT == message) 133 | { 134 | PAINTSTRUCT ps; 135 | VERIFY(BeginPaint(window, &ps)); 136 | Render(window); 137 | EndPaint(window, &ps); 138 | return 0; 139 | } 140 | 141 | if (WM_SIZE == message) 142 | { 143 | if (target && SIZE_MINIMIZED != wparam) 144 | { 145 | ResizeSwapChainBitmap(); 146 | Render(window); 147 | } 148 | 149 | return 0; 150 | } 151 | 152 | if (WM_DISPLAYCHANGE == message) 153 | { 154 | Render(window); 155 | return 0; 156 | } 157 | 158 | if (WM_DESTROY == message) 159 | { 160 | PostQuitMessage(0); 161 | return 0; 162 | } 163 | 164 | return DefWindowProc(window, message, wparam, lparam); 165 | }; 166 | 167 | RegisterClass(&wc); 168 | 169 | CreateWindow(wc.lpszClassName, L"Direct2D", WS_OVERLAPPEDWINDOW | WS_VISIBLE, 170 | CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, 171 | nullptr, nullptr, module, nullptr); 172 | 173 | MSG message; 174 | BOOL result; 175 | 176 | while (result = GetMessage(&message, 0, 0, 0)) 177 | { 178 | if (-1 != result) DispatchMessage(&message); 179 | } 180 | 181 | ReleaseDevice(); 182 | factory.Reset(); 183 | } 184 | -------------------------------------------------------------------------------- /Samples/HelloWorld.cpp: -------------------------------------------------------------------------------- 1 | #define NOMINMAX 2 | #ifndef UNICODE 3 | #define UNICODE 4 | #endif 5 | 6 | #pragma comment(lib, "user32.lib") 7 | #pragma warning(disable: 4706) 8 | 9 | #include "..\dx.h" 10 | 11 | using namespace KennyKerr; 12 | using namespace KennyKerr::Direct2D; 13 | 14 | Color const COLOR_WHITE(1.0f, 1.0f, 1.0f); 15 | Color const COLOR_BLUE(0.26f, 0.56f, 0.87f); 16 | 17 | static Factory1 factory; 18 | static DeviceContext target; 19 | static SolidColorBrush brush; 20 | static Dxgi::SwapChain1 swapChain; 21 | static DirectWrite::TextLayout textLayout; 22 | 23 | static void CreateDeviceIndependentResources() 24 | { 25 | using namespace KennyKerr::DirectWrite; 26 | 27 | auto factory = DirectWrite::CreateFactory(); 28 | 29 | auto format = factory.CreateTextFormat(L"Candara", 30 | 100.0f); 31 | 32 | format.SetTextAlignment(TextAlignment::Center); 33 | format.SetParagraphAlignment(ParagraphAlignment::Center); 34 | 35 | WCHAR text[] = L"Hello World"; 36 | 37 | textLayout = factory.CreateTextLayout(text, 38 | _countof(text) - 1, 39 | format, 40 | 100.0f, 41 | 100.0f); 42 | } 43 | 44 | static void CreateDeviceResources() 45 | { 46 | brush = target.CreateSolidColorBrush(COLOR_BLUE); 47 | } 48 | 49 | static void ReleaseDevice() 50 | { 51 | target.Reset(); 52 | swapChain.Reset(); 53 | brush.Reset(); 54 | } 55 | 56 | static void Draw() 57 | { 58 | target.Clear(COLOR_WHITE); 59 | auto const size = target.GetSize(); 60 | 61 | textLayout.SetMaxWidth(size.Width); 62 | textLayout.SetMaxHeight(size.Height); 63 | 64 | target.DrawTextLayout(Point2F(), 65 | textLayout, 66 | brush); 67 | } 68 | 69 | static void CreateDeviceSwapChainBitmap(Dxgi::SwapChain const & swapChain, 70 | DeviceContext const & target) 71 | { 72 | auto props = BitmapProperties1(BitmapOptions::Target | BitmapOptions::CannotDraw, 73 | PixelFormat(Dxgi::Format::B8G8R8A8_UNORM, AlphaMode::Ignore)); 74 | 75 | target.SetTarget(target.CreateBitmapFromDxgiSurface(swapChain, 76 | props)); 77 | } 78 | 79 | static void Render(HWND window) 80 | { 81 | if (!target) 82 | { 83 | auto device = Direct3D::CreateDevice(); 84 | target = factory.CreateDevice(device).CreateDeviceContext(); 85 | auto dxgi = device.GetDxgiFactory(); 86 | 87 | Dxgi::SwapChainDescription1 description; 88 | description.SwapEffect = Dxgi::SwapEffect::Discard; 89 | 90 | swapChain = dxgi.CreateSwapChainForHwnd(device, 91 | window, 92 | description); 93 | 94 | CreateDeviceSwapChainBitmap(swapChain, 95 | target); 96 | 97 | auto const dpi = factory.GetDesktopDpi(); 98 | target.SetDpi(dpi, dpi); 99 | CreateDeviceResources(); 100 | } 101 | 102 | target.BeginDraw(); 103 | Draw(); 104 | target.EndDraw(); 105 | 106 | auto const hr = swapChain.Present(); 107 | 108 | if (S_OK != hr && DXGI_STATUS_OCCLUDED != hr) 109 | { 110 | ReleaseDevice(); 111 | } 112 | } 113 | 114 | static void ResizeSwapChainBitmap() 115 | { 116 | target.SetTarget(); 117 | 118 | if (S_OK == swapChain.ResizeBuffers()) 119 | { 120 | CreateDeviceSwapChainBitmap(swapChain, 121 | target); 122 | } 123 | else 124 | { 125 | ReleaseDevice(); 126 | } 127 | } 128 | 129 | int __stdcall wWinMain(HINSTANCE module, HINSTANCE, PWSTR, int) 130 | { 131 | ComInitialize com; 132 | 133 | factory = CreateFactory(); 134 | CreateDeviceIndependentResources(); 135 | 136 | WNDCLASS wc = {}; 137 | wc.hCursor = LoadCursor(nullptr, IDC_ARROW); 138 | wc.hInstance = module; 139 | wc.lpszClassName = L"window"; 140 | wc.style = CS_HREDRAW | CS_VREDRAW; 141 | 142 | wc.lpfnWndProc = [] (HWND window, UINT message, WPARAM wparam, LPARAM lparam) -> LRESULT 143 | { 144 | if (WM_PAINT == message) 145 | { 146 | PAINTSTRUCT ps; 147 | VERIFY(BeginPaint(window, &ps)); 148 | Render(window); 149 | EndPaint(window, &ps); 150 | return 0; 151 | } 152 | 153 | if (WM_SIZE == message) 154 | { 155 | if (target && SIZE_MINIMIZED != wparam) 156 | { 157 | ResizeSwapChainBitmap(); 158 | Render(window); 159 | } 160 | 161 | return 0; 162 | } 163 | 164 | if (WM_DISPLAYCHANGE == message) 165 | { 166 | Render(window); 167 | return 0; 168 | } 169 | 170 | if (WM_DESTROY == message) 171 | { 172 | PostQuitMessage(0); 173 | return 0; 174 | } 175 | 176 | return DefWindowProc(window, message, wparam, lparam); 177 | }; 178 | 179 | RegisterClass(&wc); 180 | 181 | CreateWindow(wc.lpszClassName, L"dx.codeplex.com", WS_OVERLAPPEDWINDOW | WS_VISIBLE, 182 | CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, 183 | nullptr, nullptr, module, nullptr); 184 | 185 | MSG message; 186 | BOOL result; 187 | 188 | while (result = GetMessage(&message, 0, 0, 0)) 189 | { 190 | if (-1 != result) DispatchMessage(&message); 191 | } 192 | 193 | ReleaseDevice(); 194 | factory.Reset(); 195 | } 196 | -------------------------------------------------------------------------------- /Samples/AnimationEfficient.cpp: -------------------------------------------------------------------------------- 1 | // This is variant of the Animation.cpp that only renders while the animation 2 | // manager is busy. This is more efficient as the message loop goes to sleep 3 | // once the animation concludes. A callback may be added to resume animation 4 | // as needed. 5 | 6 | #define NOMINMAX 7 | #ifndef UNICODE 8 | #define UNICODE 9 | #endif 10 | 11 | #pragma comment(lib, "user32.lib") 12 | #pragma warning(disable: 4706) 13 | 14 | #include "..\dx.h" 15 | 16 | using namespace KennyKerr; 17 | using namespace KennyKerr::Direct2D; 18 | using namespace KennyKerr::DirectWrite; 19 | 20 | Color const COLOR_WHITE(1.0f, 1.0f, 1.0f); 21 | Color const COLOR_BLUE(0.26f, 0.56f, 0.87f); 22 | 23 | static Direct2D::Factory1 factory; 24 | static Direct2D::DeviceContext target; 25 | static Dxgi::SwapChain1 swapChain; 26 | static Direct2D::SolidColorBrush brush; 27 | static DirectWrite::TextFormat textFormat; 28 | static Wam::Manager manager; 29 | static Wam::Variable variable; 30 | static Wam::SimpleTimer timer; 31 | 32 | static void CreateDeviceIndependentResources() 33 | { 34 | auto factory = DirectWrite::CreateFactory(); 35 | 36 | textFormat = factory.CreateTextFormat(L"Consolas", 37 | 140.0f); 38 | 39 | textFormat.SetTextAlignment(TextAlignment::Center); 40 | textFormat.SetParagraphAlignment(ParagraphAlignment::Center); 41 | 42 | manager = Wam::CreateManager(); 43 | auto library = Wam::CreateTransitionLibrary(); 44 | 45 | auto transition = library.CreateAccelerateDecelerateTransition( 46 | 10.0, 47 | 100.0, 48 | 0.2, 49 | 0.8); 50 | 51 | variable = manager.CreateAnimationVariable(0.0); 52 | 53 | manager.ScheduleTransition(variable, 54 | transition, 55 | timer.GetTime()); 56 | } 57 | 58 | static void CreateDeviceResources() 59 | { 60 | brush = target.CreateSolidColorBrush(COLOR_BLUE); 61 | } 62 | 63 | static void ReleaseDevice() 64 | { 65 | target.Reset(); 66 | swapChain.Reset(); 67 | brush.Reset(); 68 | } 69 | 70 | static void Draw() 71 | { 72 | target.Clear(COLOR_WHITE); 73 | auto const size = target.GetSize(); 74 | 75 | manager.Update(timer.GetTime()); 76 | auto value = variable.GetValue(); 77 | 78 | WCHAR text[10]; 79 | auto length = swprintf_s(text, L"%.1f", value); 80 | 81 | target.DrawText(text, 82 | length, 83 | textFormat, 84 | RectF(0.0f, 0.0f, size.Width, size.Height), 85 | brush); 86 | } 87 | 88 | static void CreateDeviceSwapChainBitmap(Dxgi::SwapChain const & swapChain, 89 | DeviceContext const & target) 90 | { 91 | auto props = BitmapProperties1(BitmapOptions::Target | BitmapOptions::CannotDraw, 92 | PixelFormat(Dxgi::Format::B8G8R8A8_UNORM, AlphaMode::Ignore)); 93 | 94 | target.SetTarget(target.CreateBitmapFromDxgiSurface(swapChain, 95 | props)); 96 | } 97 | 98 | static void Render(HWND window) 99 | { 100 | if (!target) 101 | { 102 | auto device = Direct3D::CreateDevice(); 103 | target = factory.CreateDevice(device).CreateDeviceContext(); 104 | auto dxgi = device.GetDxgiFactory(); 105 | 106 | Dxgi::SwapChainDescription1 description; 107 | description.SwapEffect = Dxgi::SwapEffect::Discard; 108 | 109 | swapChain = dxgi.CreateSwapChainForHwnd(device, 110 | window, 111 | description); 112 | 113 | CreateDeviceSwapChainBitmap(swapChain, 114 | target); 115 | 116 | auto const dpi = factory.GetDesktopDpi(); 117 | target.SetDpi(dpi, dpi); 118 | CreateDeviceResources(); 119 | } 120 | 121 | target.BeginDraw(); 122 | Draw(); 123 | target.EndDraw(); 124 | 125 | auto const hr = swapChain.Present(); 126 | 127 | if (S_OK != hr && DXGI_STATUS_OCCLUDED != hr) 128 | { 129 | ReleaseDevice(); 130 | } 131 | 132 | if (Wam::ManagerStatus::Busy == manager.GetStatus()) 133 | { 134 | InvalidateRect(window, nullptr, false); 135 | } 136 | } 137 | 138 | static void ResizeSwapChainBitmap() 139 | { 140 | target.SetTarget(); 141 | 142 | if (S_OK == swapChain.ResizeBuffers()) 143 | { 144 | CreateDeviceSwapChainBitmap(swapChain, 145 | target); 146 | } 147 | else 148 | { 149 | ReleaseDevice(); 150 | } 151 | } 152 | 153 | int __stdcall wWinMain(HINSTANCE module, HINSTANCE, PWSTR, int) 154 | { 155 | ComInitialize com; 156 | 157 | factory = Direct2D::CreateFactory(); 158 | CreateDeviceIndependentResources(); 159 | 160 | WNDCLASS wc = {}; 161 | wc.hCursor = LoadCursor(nullptr, IDC_ARROW); 162 | wc.hInstance = module; 163 | wc.lpszClassName = L"window"; 164 | wc.style = CS_HREDRAW | CS_VREDRAW; 165 | 166 | wc.lpfnWndProc = [] (HWND window, UINT message, WPARAM wparam, LPARAM lparam) -> LRESULT 167 | { 168 | if (WM_PAINT == message) 169 | { 170 | PAINTSTRUCT ps; 171 | VERIFY(BeginPaint(window, &ps)); 172 | Render(window); 173 | EndPaint(window, &ps); 174 | return 0; 175 | } 176 | 177 | if (WM_SIZE == message) 178 | { 179 | if (target && SIZE_MINIMIZED != wparam) 180 | { 181 | ResizeSwapChainBitmap(); 182 | Render(window); 183 | } 184 | 185 | return 0; 186 | } 187 | 188 | if (WM_DISPLAYCHANGE == message) 189 | { 190 | Render(window); 191 | return 0; 192 | } 193 | 194 | if (WM_DESTROY == message) 195 | { 196 | PostQuitMessage(0); 197 | return 0; 198 | } 199 | 200 | return DefWindowProc(window, message, wparam, lparam); 201 | }; 202 | 203 | RegisterClass(&wc); 204 | 205 | CreateWindow(wc.lpszClassName, L"dx.codeplex.com", WS_OVERLAPPEDWINDOW | WS_VISIBLE, 206 | CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, 207 | nullptr, nullptr, module, nullptr); 208 | 209 | MSG message; 210 | BOOL result; 211 | 212 | while (result = GetMessage(&message, 0, 0, 0)) 213 | { 214 | if (-1 != result) DispatchMessage(&message); 215 | } 216 | 217 | ReleaseDevice(); 218 | 219 | variable.Reset(); 220 | manager.Reset(); 221 | textFormat.Reset(); 222 | factory.Reset(); 223 | } 224 | -------------------------------------------------------------------------------- /Samples/Animation.cpp: -------------------------------------------------------------------------------- 1 | // This minimal animation sample illustrates how to use the animation manager to 2 | // schedule a transition to animate a variable's value. This sample uses 3 | // continuous rendering (typically 60fps). 4 | 5 | #define NOMINMAX 6 | #ifndef UNICODE 7 | #define UNICODE 8 | #endif 9 | 10 | #pragma comment(lib, "user32.lib") 11 | 12 | #include "..\dx.h" 13 | 14 | using namespace KennyKerr; 15 | using namespace KennyKerr::Direct2D; 16 | using namespace KennyKerr::DirectWrite; 17 | 18 | Color const COLOR_WHITE(1.0f, 1.0f, 1.0f); 19 | Color const COLOR_BLUE(0.26f, 0.56f, 0.87f); 20 | 21 | static Direct2D::Factory1 factory; 22 | static Direct2D::DeviceContext target; 23 | static Dxgi::SwapChain1 swapChain; 24 | static Direct2D::SolidColorBrush brush; 25 | static DirectWrite::TextFormat textFormat; 26 | static Wam::Manager manager; 27 | static Wam::Variable variable; 28 | static Wam::SimpleTimer timer; 29 | 30 | static void CreateDeviceIndependentResources() 31 | { 32 | auto factory = DirectWrite::CreateFactory(); 33 | 34 | textFormat = factory.CreateTextFormat(L"Consolas", 35 | 140.0f); 36 | 37 | textFormat.SetTextAlignment(TextAlignment::Center); 38 | textFormat.SetParagraphAlignment(ParagraphAlignment::Center); 39 | 40 | manager = Wam::CreateManager(); 41 | auto library = Wam::CreateTransitionLibrary(); 42 | 43 | auto transition = library.CreateAccelerateDecelerateTransition( 44 | 10.0, 45 | 100.0, 46 | 0.2, 47 | 0.8); 48 | 49 | variable = manager.CreateAnimationVariable(0.0); 50 | 51 | manager.ScheduleTransition(variable, 52 | transition, 53 | timer.GetTime()); 54 | } 55 | 56 | static void CreateDeviceResources() 57 | { 58 | brush = target.CreateSolidColorBrush(COLOR_BLUE); 59 | } 60 | 61 | static void ReleaseDevice() 62 | { 63 | target.Reset(); 64 | swapChain.Reset(); 65 | brush.Reset(); 66 | } 67 | 68 | static void Draw() 69 | { 70 | target.Clear(COLOR_WHITE); 71 | auto const size = target.GetSize(); 72 | 73 | manager.Update(timer.GetTime()); 74 | auto value = variable.GetValue(); 75 | 76 | WCHAR text[10]; 77 | auto length = swprintf_s(text, L"%.1f", value); 78 | 79 | target.DrawText(text, 80 | length, 81 | textFormat, 82 | RectF(0.0f, 0.0f, size.Width, size.Height), 83 | brush); 84 | } 85 | 86 | static void CreateDeviceSwapChainBitmap(Dxgi::SwapChain const & swapChain, 87 | DeviceContext const & target) 88 | { 89 | auto props = BitmapProperties1(BitmapOptions::Target | BitmapOptions::CannotDraw, 90 | PixelFormat(Dxgi::Format::B8G8R8A8_UNORM, AlphaMode::Ignore)); 91 | 92 | target.SetTarget(target.CreateBitmapFromDxgiSurface(swapChain, 93 | props)); 94 | } 95 | 96 | static void Render(HWND window) 97 | { 98 | if (!target) 99 | { 100 | auto device = Direct3D::CreateDevice(); 101 | target = factory.CreateDevice(device).CreateDeviceContext(); 102 | auto dxgi = device.GetDxgiFactory(); 103 | 104 | Dxgi::SwapChainDescription1 description; 105 | description.SwapEffect = Dxgi::SwapEffect::Discard; 106 | 107 | swapChain = dxgi.CreateSwapChainForHwnd(device, 108 | window, 109 | description); 110 | 111 | CreateDeviceSwapChainBitmap(swapChain, 112 | target); 113 | 114 | auto const dpi = factory.GetDesktopDpi(); 115 | target.SetDpi(dpi, dpi); 116 | CreateDeviceResources(); 117 | } 118 | 119 | target.BeginDraw(); 120 | Draw(); 121 | target.EndDraw(); 122 | 123 | auto const hr = swapChain.Present(); 124 | 125 | if (S_OK != hr && DXGI_STATUS_OCCLUDED != hr) 126 | { 127 | ReleaseDevice(); 128 | } 129 | } 130 | 131 | static void ResizeSwapChainBitmap() 132 | { 133 | target.SetTarget(); 134 | 135 | if (S_OK == swapChain.ResizeBuffers()) 136 | { 137 | CreateDeviceSwapChainBitmap(swapChain, 138 | target); 139 | } 140 | else 141 | { 142 | ReleaseDevice(); 143 | } 144 | } 145 | 146 | int __stdcall wWinMain(HINSTANCE module, HINSTANCE, PWSTR, int) 147 | { 148 | ComInitialize com; 149 | 150 | factory = Direct2D::CreateFactory(); 151 | CreateDeviceIndependentResources(); 152 | 153 | WNDCLASS wc = {}; 154 | wc.hCursor = LoadCursor(nullptr, IDC_ARROW); 155 | wc.hInstance = module; 156 | wc.lpszClassName = L"window"; 157 | wc.style = CS_HREDRAW | CS_VREDRAW; 158 | 159 | wc.lpfnWndProc = [] (HWND window, UINT message, WPARAM wparam, LPARAM lparam) -> LRESULT 160 | { 161 | if (WM_PAINT == message) 162 | { 163 | PAINTSTRUCT ps; 164 | VERIFY(BeginPaint(window, &ps)); 165 | Render(window); 166 | EndPaint(window, &ps); 167 | return 0; 168 | } 169 | 170 | if (WM_SIZE == message) 171 | { 172 | if (target && SIZE_MINIMIZED != wparam) 173 | { 174 | ResizeSwapChainBitmap(); 175 | Render(window); 176 | } 177 | 178 | return 0; 179 | } 180 | 181 | if (WM_DISPLAYCHANGE == message) 182 | { 183 | Render(window); 184 | return 0; 185 | } 186 | 187 | if (WM_DESTROY == message) 188 | { 189 | PostQuitMessage(0); 190 | return 0; 191 | } 192 | 193 | return DefWindowProc(window, message, wparam, lparam); 194 | }; 195 | 196 | RegisterClass(&wc); 197 | 198 | auto window = CreateWindow(wc.lpszClassName, L"dx.codeplex.com", WS_OVERLAPPEDWINDOW | WS_VISIBLE, 199 | CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, 200 | nullptr, nullptr, module, nullptr); 201 | ASSERT(window); 202 | 203 | MSG message; 204 | 205 | for (;;) 206 | { 207 | Render(window); 208 | 209 | while (PeekMessage(&message, 210 | nullptr, 211 | 0, 0, 212 | PM_REMOVE)) 213 | { 214 | DispatchMessage(&message); 215 | } 216 | 217 | if (WM_QUIT == message.message) 218 | { 219 | break; 220 | } 221 | } 222 | 223 | ReleaseDevice(); 224 | 225 | variable.Reset(); 226 | manager.Reset(); 227 | textFormat.Reset(); 228 | factory.Reset(); 229 | } 230 | -------------------------------------------------------------------------------- /Samples/Image.cpp: -------------------------------------------------------------------------------- 1 | static unsigned char MAKE_RESOURCE_DATA[] = 2 | { 3 | 0x47, 0x49, 0x46, 0x38, 0x39, 0x61, 0x05, 0x03, 0xb7, 0x02, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x03, 0x03, 0x03, 0x04, 0x04, 0x04, 0x05, 0x05, 0x05, 0x08, 0x08, 0x08, 0x09, 0x09, 0x09, 0x0b, 0x0b, 0x0b, 0x0c, 0x0c, 0x0c, 0x0d, 0x0d, 0x0d, 0x0e, 0x0e, 0x0e, 0x11, 0x11, 0x11, 0x12, 0x12, 0x12, 0x16, 0x16, 0x16, 0x17, 0x17, 0x17, 0x19, 0x19, 0x19, 0x1a, 0x1a, 0x1a, 0x1b, 0x1b, 0x1b, 0x20, 0x20, 0x20, 0x21, 0x21, 0x21, 0x22, 0x22, 0x22, 0x23, 0x23, 0x23, 0x24, 0x24, 0x24, 0x25, 0x25, 0x25, 0x26, 0x26, 0x26, 0x27, 0x27, 0x27, 0x2d, 0x2d, 0x2d, 0x2e, 0x2e, 0x2e, 4 | 0x2f, 0x2f, 0x2f, 0x30, 0x30, 0x30, 0x37, 0x37, 0x37, 0x38, 0x38, 0x38, 0x39, 0x39, 0x39, 0x3a, 0x3a, 0x3a, 0x3b, 0x3b, 0x3b, 0x41, 0x41, 0x41, 0x42, 0x42, 0x42, 0x44, 0x44, 0x44, 0x45, 0x45, 0x45, 0x46, 0x46, 0x46, 0x47, 0x47, 0x47, 0x4c, 0x4c, 0x4c, 0x4d, 0x4d, 0x4d, 0x4e, 0x4e, 0x4e, 0x4f, 0x4f, 0x4f, 0x51, 0x51, 0x51, 0x54, 0x54, 0x54, 0x56, 0x56, 0x56, 0x57, 0x57, 0x57, 0x58, 0x58, 0x58, 0x59, 0x59, 0x59, 0x5b, 0x5b, 0x5b, 0x5e, 0x5e, 0x5e, 0x60, 0x60, 0x60, 0x61, 0x61, 0x61, 0x62, 0x62, 0x62, 0x64, 0x64, 0x64, 0x65, 0x65, 0x65, 0x67, 0x67, 0x67, 0x69, 0x69, 0x69, 0x6a, 0x6a, 0x6a, 0x6c, 5 | 0x6c, 0x6c, 0x6d, 0x6d, 0x6d, 0x71, 0x71, 0x71, 0x73, 0x73, 0x73, 0x74, 0x74, 0x74, 0x76, 0x76, 0x76, 0x77, 0x77, 0x77, 0x7b, 0x7b, 0x7b, 0x7c, 0x7c, 0x7c, 0x7d, 0x7d, 0x7d, 0x7e, 0x7e, 0x7e, 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x80, 0x84, 0x84, 0x84, 0x85, 0x85, 0x85, 0x86, 0x86, 0x86, 0x88, 0x88, 0x88, 0x8a, 0x8a, 0x8a, 0x8b, 0x8b, 0x8b, 0x8c, 0x8c, 0x8c, 0x8d, 0x8d, 0x8d, 0x8e, 0x8e, 0x8e, 0x8f, 0x8f, 0x8f, 0x90, 0x90, 0x90, 0x91, 0x91, 0x91, 0x93, 0x93, 0x93, 0x95, 0x95, 0x95, 0x96, 0x96, 0x96, 0x97, 0x97, 0x97, 0x99, 0x99, 0x99, 0x9a, 0x9a, 0x9a, 0x9c, 0x9c, 0x9c, 0x9d, 0x9d, 0x9d, 0x9f, 0x9f, 6 | 0x9f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 7 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 8 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 9 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 10 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0xf9, 0x04, 0x01, 0x00, 0x00, 0xff, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x00, 0x05, 0x03, 0xb7, 0x02, 0x00, 0x08, 11 | 0xff, 0x00, 0xff, 0x09, 0x1c, 0x48, 0xb0, 0xa0, 0xc1, 0x83, 0x08, 0x13, 0x2a, 0x5c, 0xc8, 0xb0, 0xa1, 0xc3, 0x87, 0x10, 0x23, 0x4a, 0x9c, 0x48, 0xb1, 0xa2, 0xc5, 0x8b, 0x18, 0x33, 0x6a, 0xdc, 0xc8, 0xb1, 0xa3, 0xc7, 0x8f, 0x20, 0x43, 0x8a, 0x1c, 0x49, 0xb2, 0xa4, 0xc9, 0x93, 0x28, 0x53, 0xaa, 0x5c, 0xc9, 0xb2, 0xa5, 0x4b, 0x91, 0x5f, 0x62, 0xca, 0x9c, 0x79, 0x24, 0x46, 0x8c, 0x0a, 0x00, 0x72, 0xea, 0xdc, 0xc9, 0xb3, 0xa7, 0xcf, 0x9f, 0x40, 0x81, 0x3a, 0xb0, 0x19, 0x43, 0x4b, 0xcc, 0x97, 0x48, 0x93, 0x2a, 0x5d, 0xca, 0xb4, 0xa9, 0xd3, 0xa7, 0x50, 0xa3, 0x4a, 0x95, 0x1a, 0xd3, 0x26, 0x88, 0xa0, 12 | 0x58, 0xb3, 0x6a, 0xdd, 0xca, 0x15, 0x6b, 0x85, 0x18, 0x42, 0xa6, 0x8a, 0x1d, 0x4b, 0xb6, 0xac, 0xd9, 0xb3, 0x68, 0xd3, 0xaa, 0x0d, 0x59, 0x35, 0xc6, 0xd5, 0xae, 0x70, 0xe3, 0xca, 0x9d, 0x8b, 0x15, 0x41, 0x8c, 0x2f, 0x6b, 0xf3, 0xea, 0xdd, 0xcb, 0xb7, 0xaf, 0xdf, 0xbf, 0x7b, 0x63, 0x36, 0xb1, 0xe9, 0x80, 0xae, 0xe1, 0xc3, 0x88, 0x13, 0xe7, 0x2c, 0xd1, 0x03, 0x2f, 0xe0, 0xc7, 0x90, 0x23, 0x4b, 0x9e, 0x4c, 0x19, 0xf0, 0x97, 0x29, 0x36, 0x11, 0x28, 0xde, 0xcc, 0xb9, 0xf3, 0xe1, 0xaf, 0x53, 0x2a, 0x8b, 0x1e, 0x4d, 0xba, 0xb4, 0xe9, 0xd3, 0x12, 0xbf, 0xf4, 0xd8, 0xe0, 0xb9, 0xb5, 0xeb, 0xd7, 0x72, 13 | 0x37, 0x1c, 0x41, 0x4d, 0xbb, 0xb6, 0xed, 0xdb, 0xb8, 0x9f, 0x62, 0x8e, 0xa1, 0x19, 0xb6, 0xef, 0xdf, 0xc0, 0xb3, 0xca, 0xce, 0x4d, 0xbc, 0xb8, 0xf1, 0xe3, 0xc8, 0x17, 0x1e, 0x61, 0x1d, 0xbc, 0xb9, 0xf3, 0xe7, 0x3d, 0x2b, 0x04, 0x49, 0x4e, 0xbd, 0xba, 0xf5, 0xeb, 0x79, 0xbf, 0xd4, 0xe4, 0x0d, 0xbd, 0xbb, 0xf7, 0xef, 0x00, 0xa4, 0x63, 0x49, 0x1f, 0x4f, 0xbe, 0xbc, 0xf9, 0x91, 0x5f, 0x62, 0x80, 0x5f, 0xcf, 0x7e, 0xbd, 0x8d, 0xf3, 0xf0, 0xe3, 0xcb, 0x9f, 0x3f, 0x50, 0xcb, 0x8a, 0xf6, 0xf8, 0xf3, 0x7f, 0x2f, 0x41, 0xbf, 0xbf, 0xff, 0xff, 0xb5, 0xd9, 0xa7, 0xdf, 0x80, 0x04, 0x76, 0x07, 0x82, 0x17, 14 | 0x00, 0x26, 0xa8, 0xe0, 0x82, 0x6b, 0x09, 0x58, 0xe0, 0x83, 0x10, 0x3a, 0xa7, 0x02, 0x83, 0x14, 0x56, 0x68, 0x21, 0x52, 0x37, 0x44, 0xa8, 0xe1, 0x86, 0xcd, 0xf1, 0x70, 0xe1, 0x87, 0xba, 0x20, 0x86, 0x98, 0xd1, 0x14, 0xcc, 0x71, 0x68, 0xe2, 0x89, 0xaf, 0x39, 0x30, 0x9b, 0x88, 0x2c, 0xb6, 0xe8, 0xa2, 0x40, 0x3d, 0xf4, 0x86, 0xe2, 0x8c, 0x34, 0x7a, 0xb6, 0x01, 0x82, 0x2f, 0xe6, 0xa8, 0xa3, 0x7f, 0x4d, 0x94, 0x58, 0xe3, 0x8f, 0x40, 0x6e, 0x16, 0xc3, 0x8e, 0x44, 0x16, 0x79, 0x5d, 0x86, 0x41, 0x26, 0xa9, 0xa4, 0x62, 0x1b, 0x18, 0xe9, 0xe4, 0x93, 0xb4, 0xf5, 0xb8, 0xe4, 0x94, 0x54, 0x7e, 0x86, 0x23, 15 | 0x94, 0x58, 0x66, 0xe9, 0x17, 0x92, 0x55, 0x76, 0xe9, 0x65, 0x5c, 0x08, 0x30, 0xa1, 0xe5, 0x98, 0x64, 0x96, 0xa5, 0xde, 0x97, 0x68, 0xa6, 0xd9, 0xd5, 0x90, 0x65, 0xb6, 0xe9, 0x26, 0x52, 0x5f, 0x14, 0xa6, 0xe6, 0x9c, 0x74, 0x7a, 0xf5, 0xe6, 0x9d, 0x78, 0x92, 0x14, 0x67, 0x9d, 0x7c, 0xf6, 0xf9, 0xd3, 0x74, 0x79, 0x06, 0x2a, 0x68, 0x45, 0x67, 0xfa, 0x69, 0xe8, 0xa1, 0x39, 0x79, 0x38, 0xe8, 0xa2, 0x8c, 0x1e, 0x54, 0x28, 0xa2, 0x90, 0x1e, 0x2a, 0x66, 0xa3, 0x94, 0x06, 0x7a, 0x5f, 0xa4, 0x98, 0x42, 0x8a, 0xc0, 0x95, 0x95, 0x76, 0xaa, 0xe5, 0x11, 0x99, 0x86, 0x1a, 0xa9, 0x03, 0x9e, 0x96, 0x0a, 0xa5, 16 | 0x9c, 0xa2, 0xa6, 0x7a, 0x68, 0x05, 0xa6, 0xb6, 0x9a, 0x63, 0x09, 0xaa, 0xc6, 0x0a, 0x29, 0xab, 0xae, 0x9b, 0xd6, 0x7a, 0x21, 0x97, 0xb2, 0xe6, 0x6a, 0x28, 0xad, 0xb6, 0xf6, 0xea, 0x5f, 0x0f, 0xba, 0x06, 0x1b, 0x29, 0x08, 0xbe, 0x16, 0x7b, 0x5e, 0x13, 0xa8, 0x0a, 0xab, 0xac, 0xa4, 0xc6, 0x36, 0x5b, 0xdd, 0xa5, 0xcb, 0x46, 0x8b, 0x28, 0xaf, 0xce, 0x56, 0x7b, 0x1b, 0x4e, 0xd2, 0x66, 0x0b, 0xa9, 0xa2, 0xd6, 0x76, 0x5b, 0x1a, 0xb4, 0xda, 0x86, 0x6b, 0x28, 0xa9, 0xde, 0x96, 0x3b, 0x19, 0xae, 0xe2, 0xa6, 0xeb, 0x67, 0x93, 0xe6, 0xb6, 0xdb, 0x17, 0xb6, 0xea, 0xc6, 0x7b, 0x28, 0x09, 0xee, 0xd6, 0x9b, 17 | 0x16, 0xa8, 0xf2, 0xe6, 0x8b, 0x28, 0x9b, 0xf6, 0xf6, 0x2b, 0xd5, 0x5b, 0xfa, 0x06, 0x6c, 0xe8, 0xa4, 0xfe, 0x16, 0xbc, 0x94, 0x8c, 0x02, 0x27, 0xcc, 0x27, 0xbd, 0x06, 0x37, 0xdc, 0x12, 0xb0, 0x0a, 0x47, 0xdc, 0x27, 0xb9, 0x0e, 0x57, 0xac, 0x27, 0xbc, 0x12, 0x67, 0x5c, 0x27, 0xa7, 0x16, 0x1b, 0x37, 0xc5, 0x0d, 0x0a, 0xee, 0xa9, 0xf1, 0xc8, 0x7c, 0xbe, 0xd7, 0x71, 0x71, 0xf8, 0xe6, 0x04, 0x20, 0xc0, 0x24, 0xb7, 0x3c, 0x27, 0xb5, 0x27, 0xcf, 0xd3, 0x06, 0xf1, 0x4e, 0x08, 0xf8, 0x87, 0xb0, 0xcb, 0x38, 0xa7, 0xa9, 0x45, 0xcc, 0xa8, 0xa1, 0xcb, 0xd3, 0x8a, 0xf0, 0xf9, 0x98, 0xf3, 0xd0, 0x68, 0x12, 18 | 0xcb, 0xf3, 0x68, 0x8f, 0x02, 0x55, 0xb3, 0x79, 0x3e, 0x13, 0xed, 0x74, 0x97, 0x4b, 0x1f, 0x2d, 0x19, 0xac, 0x5c, 0x45, 0x8d, 0x5d, 0xd3, 0x4f, 0x67, 0x4d, 0x25, 0xbf, 0x52, 0xfb, 0x25, 0x34, 0x57, 0x30, 0x27, 0xf7, 0xb5, 0xd6, 0x64, 0x4f, 0x19, 0x76, 0xd7, 0x6a, 0x61, 0x3c, 0x97, 0x63, 0xc8, 0x8d, 0x5d, 0xf6, 0xdb, 0x4a, 0x5a, 0x8d, 0xf6, 0x59, 0x5f, 0xa8, 0x6d, 0xd8, 0xce, 0xc7, 0x25, 0x0b, 0xf7, 0xde, 0x53, 0x02, 0x3a, 0x37, 0x59, 0x5a, 0xe8, 0x9d, 0xd8, 0xd9, 0xb5, 0x09, 0xce, 0xf7, 0xe1, 0x41, 0x32, 0xfc, 0xb7, 0x54, 0x53, 0xdc, 0xdc, 0x19, 0xbb, 0xb6, 0x69, 0x81, 0xf8, 0xe4, 0x54, 0x52, 19 | 0xbc, 0x78, 0x53, 0x29, 0xfb, 0x26, 0xb7, 0x69, 0x58, 0x53, 0xee, 0x39, 0x8d, 0x97, 0x33, 0x35, 0x73, 0x73, 0x3d, 0xa0, 0x96, 0xf4, 0xe7, 0xa8, 0xd7, 0xe8, 0x77, 0xe8, 0x2c, 0x75, 0xfe, 0x1b, 0xe4, 0xa2, 0x65, 0x9e, 0xfa, 0xec, 0x35, 0x2a, 0xce, 0x3a, 0x4a, 0xa7, 0x77, 0x57, 0x7a, 0x65, 0x86, 0xd3, 0xee, 0xbb, 0x89, 0x96, 0xdf, 0x3e, 0x12, 0xd5, 0xf9, 0x85, 0x25, 0x59, 0xef, 0xbf, 0x27, 0xbf, 0xa1, 0xf0, 0x23, 0xb9, 0xcd, 0x5e, 0xf0, 0x7d, 0xb1, 0xac, 0xfc, 0xf4, 0x27, 0x86, 0xc6, 0xcb, 0x7c, 0x47, 0x76, 0x13, 0x08, 0xb2, 0x5f, 0xd4, 0x77, 0x4f, 0xe3, 0xea, 0xd7, 0x57, 0x54, 0xf7, 0x89, 0x5c, 20 | 0xe7, 0xe5, 0xfd, 0xf9, 0x28, 0x96, 0x1f, 0x3e, 0x44, 0x81, 0xd7, 0x08, 0xbd, 0x59, 0xae, 0xa3, 0x2f, 0xbf, 0x7e, 0x1f, 0xac, 0x1f, 0x51, 0x13, 0x8e, 0xcf, 0xb8, 0xfb, 0x59, 0xf9, 0xcf, 0xef, 0xff, 0x80, 0x84, 0xb3, 0x5f, 0x41, 0x64, 0x17, 0xa4, 0xed, 0x91, 0x85, 0x80, 0xff, 0x4b, 0xe0, 0x80, 0xde, 0x27, 0x40, 0x18, 0x7d, 0xc9, 0x68, 0x53, 0x41, 0xa0, 0x02, 0x27, 0x88, 0x9f, 0xcd, 0x09, 0x30, 0x77, 0x55, 0x5a, 0x81, 0x54, 0x24, 0x48, 0xc1, 0x0e, 0xb2, 0xa7, 0x81, 0x02, 0x01, 0xd7, 0x9c, 0xac, 0xd7, 0x14, 0x11, 0x7a, 0xf0, 0x84, 0xed, 0x01, 0xda, 0xf5, 0x88, 0xe7, 0x27, 0xf5, 0xb5, 0x04, 0x83, 21 | 0x28, 0x8c, 0xe1, 0x77, 0x4c, 0x26, 0x3c, 0xe7, 0xf1, 0xc9, 0x80, 0x2e, 0x91, 0xa1, 0x0e, 0xf3, 0x63, 0xbb, 0xc5, 0x65, 0x0f, 0x51, 0x08, 0x68, 0x02, 0x4b, 0xb4, 0xf0, 0xc3, 0x1d, 0x1a, 0xf1, 0x39, 0xb0, 0xfb, 0x5b, 0xae, 0x92, 0x48, 0x12, 0x0e, 0x1e, 0xf1, 0x89, 0xcd, 0x61, 0xe0, 0xd1, 0x82, 0x85, 0x00, 0xe3, 0x8d, 0x44, 0x08, 0x50, 0xcc, 0x22, 0x78, 0xa4, 0x18, 0xb3, 0x65, 0xf1, 0x27, 0x24, 0xfd, 0xd3, 0xa2, 0x18, 0x7f, 0x63, 0x41, 0x9e, 0x49, 0x0b, 0x01, 0x24, 0xd4, 0x88, 0x09, 0xc7, 0xc8, 0xc6, 0xe0, 0x7a, 0x28, 0x51, 0x5b, 0x15, 0x10, 0xe2, 0x45, 0x9c, 0xd8, 0xc6, 0x3a, 0xbe, 0x66, 0x6e, 22 | 0xea, 0xba, 0x0b, 0x45, 0xe2, 0x67, 0xc7, 0x3e, 0x7a, 0x06, 0x6d, 0xfa, 0x1a, 0xce, 0x42, 0x84, 0x50, 0x44, 0x3f, 0x1a, 0xd2, 0x35, 0x5d, 0x8b, 0x18, 0x51, 0x88, 0x52, 0xc8, 0x43, 0x3a, 0x12, 0x91, 0x53, 0x7c, 0xa4, 0x24, 0xff, 0x17, 0xc9, 0x49, 0x5a, 0x12, 0x7d, 0x3c, 0x5b, 0xe3, 0x25, 0x37, 0xe9, 0xbb, 0x98, 0xd1, 0x91, 0x93, 0xa0, 0xa4, 0xdc, 0xc9, 0x3e, 0x19, 0xca, 0x52, 0xf2, 0xad, 0x63, 0xa4, 0x34, 0xa5, 0x2a, 0xcb, 0x66, 0xb1, 0x54, 0xae, 0xf2, 0x95, 0x4f, 0xb3, 0x18, 0x2c, 0x67, 0x89, 0xb8, 0x32, 0xd6, 0x8b, 0x96, 0xb8, 0xdc, 0x1b, 0x17, 0xcd, 0x15, 0xc6, 0x5c, 0xfa, 0xd2, 0x65, 0x4c, 23 | 0xac, 0xd7, 0xe8, 0x7e, 0x49, 0xcc, 0x9c, 0x4d, 0x67, 0xc8, 0x60, 0xc5, 0x4c, 0xe6, 0xd0, 0xb8, 0xd5, 0x2f, 0x65, 0x3a, 0xd3, 0x65, 0x1c, 0x73, 0xd7, 0x33, 0xa7, 0x39, 0xb2, 0x82, 0x51, 0xf3, 0x9a, 0x11, 0xdb, 0x65, 0xb5, 0x90, 0x87, 0xcd, 0x6e, 0x6a, 0xab, 0x87, 0xe6, 0x1a, 0xa6, 0x37, 0xc7, 0x19, 0x2e, 0x15, 0xb6, 0x8b, 0x9c, 0xe8, 0x4c, 0x57, 0x33, 0xd3, 0xc9, 0xce, 0x6c, 0xd9, 0xab, 0x9d, 0xf0, 0x5c, 0x96, 0x2d, 0x9d, 0xc5, 0xc2, 0x78, 0xda, 0x53, 0x55, 0xda, 0xf4, 0xd5, 0x14, 0xee, 0xc9, 0xcf, 0x58, 0x05, 0xb3, 0x5a, 0xfd, 0x0c, 0xa8, 0xa8, 0xc0, 0x09, 0x50, 0x81, 0x1a, 0x34, 0x52, 0xcc, 24 | 0xb4, 0xd6, 0x41, 0x17, 0x8a, 0x28, 0x73, 0x31, 0xf4, 0xa1, 0x7d, 0x9a, 0x6d, 0x67, 0xaf, 0x7a, 0x09, 0xd1, 0x8a, 0x2e, 0xe9, 0x98, 0xd6, 0xc2, 0xa2, 0x45, 0x37, 0xfa, 0xa5, 0x68, 0x1a, 0x8b, 0xa3, 0x20, 0xed, 0x92, 0xb7, 0xb8, 0x19, 0xd2, 0x92, 0x9a, 0xe8, 0x9f, 0xbd, 0xd2, 0xa4, 0x49, 0x57, 0xca, 0x21, 0x1a, 0x36, 0xcb, 0x95, 0x2c, 0x8d, 0x69, 0x7e, 0x8c, 0xa0, 0x50, 0x99, 0xda, 0xd4, 0x44, 0x59, 0x28, 0xe8, 0x4d, 0x77, 0x1a, 0x21, 0x9d, 0xf2, 0xf4, 0xa7, 0x04, 0x72, 0x96, 0x0d, 0x81, 0x4a, 0x54, 0xe8, 0x48, 0xd4, 0x53, 0x30, 0x2d, 0xaa, 0x52, 0x5f, 0x83, 0x52, 0x53, 0x2d, 0xf5, 0xa9, 0xe0, 25 | 0xa1, 0x69, 0xb1, 0xa4, 0x07, 0xd5, 0xaa, 0x02, 0xa7, 0x59, 0x56, 0xcd, 0x6a, 0x70, 0xf2, 0x49, 0x29, 0xad, 0x7a, 0xd5, 0x37, 0x2e, 0x62, 0x74, 0xea, 0x57, 0xc7, 0xda, 0x9a, 0x62, 0xd5, 0x93, 0xac, 0x68, 0x35, 0xcc, 0x51, 0x1b, 0xa5, 0xd1, 0xb4, 0xba, 0xd5, 0x30, 0x4d, 0xad, 0xd4, 0x5b, 0xe7, 0x4a, 0x97, 0xb0, 0x76, 0x8a, 0xae, 0x78, 0x8d, 0x8b, 0x14, 0x6c, 0x95, 0xd7, 0xbe, 0x72, 0xc5, 0x56, 0xe2, 0xf4, 0xab, 0x60, 0x69, 0xc6, 0xd7, 0xc1, 0x1a, 0xb6, 0x27, 0x71, 0x5d, 0x54, 0x60, 0x0f, 0x2b, 0xd8, 0x25, 0xd4, 0x8a, 0xb1, 0x90, 0x55, 0x99, 0xab, 0x28, 0x1a, 0xd9, 0xb7, 0x12, 0x94, 0x52, 0x2a, 26 | 0xad, 0x2c, 0x5d, 0x5d, 0xb5, 0x4f, 0xcd, 0x1a, 0x96, 0xab, 0x79, 0xf2, 0xec, 0x61, 0xa5, 0x5a, 0xaa, 0xb3, 0x8a, 0x16, 0xaf, 0x70, 0xae, 0x3a, 0xed, 0x60, 0x2f, 0xcb, 0xa8, 0x46, 0xaa, 0x96, 0xac, 0xad, 0x92, 0xdc, 0x6b, 0xfb, 0x1a, 0xc0, 0x45, 0xcd, 0xd6, 0xaf, 0x8e, 0x2d, 0x15, 0x55, 0x6f, 0xeb, 0x56, 0x53, 0x7d, 0x81, 0xb7, 0x79, 0x65, 0xed, 0xa0, 0x80, 0x9b, 0x57, 0x53, 0x0d, 0x95, 0xb8, 0x59, 0x5d, 0xeb, 0x9d, 0x92, 0x8a, 0x5c, 0xa5, 0x62, 0x54, 0xae, 0xcd, 0x9d, 0x6b, 0xa9, 0x28, 0x9b, 0xb1, 0xce, 0x46, 0xf7, 0x70, 0xca, 0x75, 0x93, 0x75, 0x73, 0x46, 0xab, 0xc5, 0x5e, 0x57, 0x6b, 0xcf, 27 | 0x6d, 0x14, 0x75, 0x05, 0x86, 0x43, 0x92, 0x7e, 0x97, 0x68, 0x9e, 0xda, 0xee, 0xc8, 0x2c, 0xc8, 0x51, 0x04, 0x1c, 0x21, 0x01, 0x9c, 0xac, 0x6d, 0x68, 0x5b, 0xf6, 0xcf, 0xdd, 0x1a, 0x94, 0x86, 0x01, 0xe0, 0xdc, 0xa4, 0xa7, 0x60, 0x18, 0xb0, 0xfd, 0x1d, 0x04, 0xa2, 0x10, 0x14, 0x08, 0x0e, 0xf2, 0x7b, 0x49, 0xf9, 0xe2, 0x49, 0x63, 0x6b, 0x5d, 0x28, 0x03, 0x4d, 0xc0, 0xc9, 0x28, 0xdc, 0x55, 0x62, 0x89, 0x15, 0x88, 0x7a, 0xef, 0x99, 0x46, 0x83, 0x74, 0x60, 0x93, 0xd9, 0x2d, 0x13, 0x7f, 0xd3, 0xe5, 0x5f, 0x86, 0x8c, 0x17, 0x9b, 0x2e, 0x4d, 0x08, 0x7c, 0x2f, 0x99, 0xdb, 0xae, 0x0a, 0x2c, 0xc3, 0x12, 28 | 0xbe, 0x67, 0x84, 0x07, 0x42, 0x60, 0x4b, 0x76, 0xca, 0xb5, 0xd2, 0x0a, 0xf0, 0x43, 0xec, 0xdb, 0x4d, 0xd0, 0x0e, 0xc4, 0x07, 0x2d, 0x96, 0xa4, 0x81, 0xdf, 0x94, 0x30, 0x8a, 0x7c, 0xb8, 0x98, 0x04, 0x8b, 0xc8, 0x85, 0x2f, 0x59, 0x84, 0x4a, 0xfd, 0x58, 0x58, 0x28, 0x1e, 0x08, 0x3a, 0xed, 0xea, 0x10, 0x01, 0x6c, 0xb2, 0x52, 0x13, 0x8e, 0x57, 0x87, 0x1d, 0xc2, 0xdc, 0x59, 0x26, 0xd9, 0x20, 0x2d, 0xd8, 0xe4, 0x8e, 0xdb, 0x74, 0x64, 0x2a, 0x52, 0x84, 0xc6, 0xce, 0xc4, 0x5b, 0x45, 0x72, 0x2c, 0xc9, 0x22, 0x37, 0x2a, 0xca, 0xea, 0xaa, 0x48, 0x97, 0x69, 0x79, 0x11, 0x08, 0xe8, 0x97, 0x52, 0x6b, 0xce, 29 | 0x95, 0x45, 0xc8, 0x79, 0xe5, 0x81, 0x54, 0x81, 0xcc, 0x8f, 0x4c, 0xa8, 0xa0, 0xaa, 0x9c, 0x2b, 0x0d, 0x52, 0x84, 0xcf, 0xb3, 0xac, 0x30, 0x44, 0x2e, 0xf0, 0xe6, 0x46, 0xf5, 0xb8, 0x22, 0x99, 0x55, 0x66, 0x9d, 0x05, 0x82, 0x67, 0x47, 0x0a, 0xf7, 0x4d, 0x89, 0xce, 0xd6, 0x8a, 0x11, 0x02, 0x63, 0x62, 0x8a, 0x59, 0x22, 0x59, 0x7e, 0xca, 0xb2, 0x89, 0x03, 0x86, 0x43, 0x89, 0xc4, 0xf9, 0x95, 0x93, 0x3e, 0x48, 0xa3, 0x0f, 0x19, 0x6a, 0x2d, 0x55, 0x3a, 0x5a, 0x16, 0x41, 0xf3, 0x33, 0x2d, 0xe2, 0x64, 0x4d, 0x33, 0xea, 0xb7, 0x02, 0xfb, 0x22, 0x45, 0x8e, 0x4b, 0x4c, 0x8b, 0x64, 0xba, 0xc0, 0x70, 0x3e, 30 | 0x74, 0x45, 0x68, 0xed, 0x4b, 0x3d, 0x43, 0x64, 0xd4, 0x87, 0xa4, 0x94, 0x77, 0xc5, 0x25, 0x6b, 0x8a, 0x78, 0x73, 0xd1, 0xff, 0x70, 0xb3, 0x96, 0x37, 0x1d, 0xb0, 0x8b, 0xc0, 0x1a, 0x9b, 0x16, 0x19, 0x02, 0xb0, 0x0d, 0x49, 0x29, 0xd3, 0xaa, 0xeb, 0xd2, 0xb3, 0xc6, 0x26, 0xb6, 0x23, 0x32, 0x6d, 0x3f, 0x6e, 0x99, 0x4c, 0x09, 0x43, 0xf6, 0x40, 0x3e, 0x1d, 0x4a, 0x3f, 0x53, 0xa4, 0xdb, 0x7e, 0xa4, 0xd4, 0xa9, 0xe5, 0x89, 0x91, 0x67, 0x4f, 0xd3, 0x22, 0xe8, 0xee, 0xe3, 0xb7, 0xc7, 0xa4, 0xb0, 0x8c, 0x58, 0x9b, 0x98, 0x82, 0x7e, 0x48, 0xab, 0x1b, 0x2c, 0xde, 0x84, 0x95, 0x1a, 0x21, 0xe4, 0xe6, 0xe4, 31 | 0xbf, 0x07, 0x32, 0x64, 0x50, 0x32, 0x5b, 0x5f, 0xdb, 0x9e, 0x48, 0xc0, 0x2f, 0x39, 0x70, 0x81, 0xc8, 0xa0, 0x94, 0x8f, 0x6e, 0xd3, 0xba, 0x97, 0xa5, 0x91, 0x85, 0x4f, 0xb2, 0xe1, 0xff, 0x78, 0x78, 0x29, 0x0f, 0xae, 0xaf, 0x8a, 0x3b, 0x13, 0xe3, 0x1a, 0x0f, 0xe5, 0xbc, 0xb3, 0x74, 0xef, 0x74, 0x99, 0xb3, 0x22, 0x1f, 0xaf, 0xc8, 0x9d, 0x4d, 0xe9, 0xcb, 0x60, 0x46, 0x29, 0x4c, 0xdc, 0x03, 0x89, 0xf4, 0x2a, 0x31, 0xfe, 0x8f, 0x78, 0x1b, 0x12, 0xe6, 0x3b, 0x1a, 0xb6, 0xb8, 0xa6, 0x4c, 0x11, 0x55, 0xc3, 0x52, 0xc6, 0x11, 0xd9, 0x77, 0x28, 0x5b, 0xbe, 0x28, 0x8b, 0xa7, 0x8a, 0x23, 0x46, 0xef, 0x63, 32 | 0xc2, 0xf5, 0xad, 0x4a, 0x9c, 0xeb, 0xc8, 0xdd, 0xcd, 0xde, 0x48, 0xd2, 0xeb, 0x78, 0x11, 0xa1, 0x0f, 0xbd, 0x51, 0x13, 0x57, 0x96, 0xd3, 0x05, 0xf2, 0xcb, 0xaa, 0xaf, 0x72, 0xeb, 0x39, 0x8a, 0x98, 0xb9, 0x31, 0xc2, 0x47, 0x83, 0xb3, 0xfa, 0x95, 0x44, 0x1f, 0x54, 0xc9, 0xd5, 0xb9, 0x11, 0x40, 0x53, 0xfb, 0xec, 0x5f, 0xe7, 0x78, 0xbe, 0xc0, 0xfe, 0x8f, 0xa9, 0x6b, 0xd1, 0xeb, 0x68, 0x6f, 0x94, 0xdb, 0xfb, 0xdc, 0x11, 0xbb, 0x43, 0xf1, 0x22, 0x36, 0x7f, 0x24, 0xdd, 0x5d, 0xe4, 0x77, 0x4c, 0x79, 0xa4, 0xf0, 0x46, 0xb4, 0xc8, 0xca, 0x61, 0x99, 0x76, 0x41, 0x41, 0x5d, 0x5f, 0x83, 0x47, 0xbc, 0x0c, 33 | 0x7d, 0xfd, 0x90, 0x90, 0xbf, 0x72, 0xf0, 0x2d, 0xca, 0xba, 0xb2, 0x8a, 0xad, 0x11, 0xcd, 0xb7, 0xf1, 0x22, 0x96, 0xcf, 0xbb, 0xa1, 0x23, 0xc6, 0xf9, 0x8c, 0xb4, 0x95, 0x93, 0x36, 0x3e, 0x48, 0xe8, 0xe3, 0xde, 0xa8, 0xb5, 0xa7, 0x6b, 0xec, 0x1a, 0xd9, 0xfb, 0x13, 0x29, 0xff, 0x90, 0x5b, 0xcf, 0xb2, 0xf1, 0x82, 0xca, 0xd8, 0x47, 0x64, 0x9f, 0x78, 0xbc, 0xd3, 0x12, 0xf3, 0xdd, 0x2c, 0x6a, 0x82, 0xc4, 0x30, 0xcf, 0x7b, 0x1d, 0x62, 0x24, 0xf0, 0x97, 0xc4, 0x7d, 0xa0, 0x3c, 0x8f, 0xe4, 0x8f, 0xc8, 0x76, 0x92, 0x40, 0x97, 0x08, 0xf2, 0x2d, 0x09, 0x7c, 0x16, 0x65, 0x0c, 0xf8, 0xbc, 0xbe, 0xfb, 0xf1, 34 | 0x7f, 0xa9, 0xfc, 0x3c, 0x95, 0x5d, 0x5c, 0x9d, 0xde, 0x48, 0xf6, 0x9f, 0x18, 0xe2, 0x73, 0xff, 0xb2, 0xfa, 0x22, 0x92, 0x7c, 0xa4, 0xd8, 0xd6, 0x91, 0xf1, 0xf7, 0xfe, 0x22, 0x38, 0x26, 0x66, 0xf7, 0xf1, 0xf4, 0xfc, 0x88, 0xb1, 0x9f, 0x23, 0xee, 0x97, 0x61, 0xea, 0x11, 0xa2, 0x80, 0x62, 0xa2, 0x3f, 0x44, 0xcc, 0xa7, 0x2c, 0xf7, 0xb7, 0x11, 0xae, 0x77, 0x44, 0xb4, 0xf7, 0x10, 0x8b, 0x27, 0x7f, 0xd0, 0x95, 0x31, 0x03, 0x48, 0x80, 0x76, 0x94, 0x11, 0x84, 0x96, 0x4c, 0xff, 0x07, 0x22, 0x32, 0x97, 0x66, 0x22, 0xd1, 0x46, 0x38, 0x37, 0x7d, 0x57, 0x47, 0x29, 0xe6, 0xa5, 0x2e, 0xff, 0x97, 0x7f, 0x0a, 35 | 0x94, 0x6f, 0x11, 0xe1, 0x04, 0x1a, 0x08, 0x4a, 0x13, 0x08, 0x22, 0x23, 0x53, 0x7a, 0x1d, 0xa1, 0x73, 0x27, 0x84, 0x73, 0x11, 0xe8, 0x4c, 0xf3, 0x87, 0x27, 0xc5, 0x97, 0x2b, 0x2a, 0xd8, 0x11, 0x59, 0xe4, 0x51, 0x12, 0x61, 0x75, 0xfe, 0xd7, 0x29, 0x20, 0x28, 0x2d, 0x4c, 0xa6, 0x11, 0x60, 0x46, 0x41, 0x35, 0x98, 0x83, 0xd4, 0xe4, 0x29, 0x24, 0xd3, 0x80, 0x1d, 0x31, 0x83, 0xb3, 0x43, 0x73, 0x05, 0x51, 0x82, 0x10, 0xd7, 0x29, 0x4a, 0x28, 0x2b, 0x25, 0x11, 0x85, 0x9e, 0xc3, 0x84, 0x04, 0x61, 0x7b, 0xab, 0xf2, 0xf6, 0x62, 0x24, 0x73, 0x72, 0x1e, 0xf1, 0x78, 0x0a, 0xb4, 0x7f, 0x0a, 0xa1, 0x83, 0xca, 36 | 0x54, 0x62, 0x72, 0xa7, 0x30, 0xe1, 0xf7, 0x11, 0x1d, 0x48, 0x3d, 0x60, 0xa8, 0x10, 0x4e, 0x68, 0x4a, 0x27, 0x08, 0x22, 0x1b, 0xa6, 0x2f, 0x48, 0xd8, 0x11, 0x8d, 0xa3, 0x40, 0x74, 0x17, 0x7f, 0xd0, 0xe6, 0x29, 0xea, 0x17, 0x2a, 0x27, 0x41, 0x85, 0x64, 0xe3, 0x11, 0xca, 0x86, 0x4d, 0x11, 0x77, 0x27, 0x5e, 0xf8, 0x72, 0x28, 0xb1, 0x87, 0x38, 0x03, 0x3e, 0x19, 0xd1, 0x86, 0xab, 0xa4, 0x5b, 0x2d, 0xf3, 0x86, 0x02, 0x11, 0x87, 0xa8, 0x33, 0x72, 0x0e, 0x81, 0x87, 0xdd, 0x44, 0x86, 0x65, 0x18, 0x31, 0x72, 0x64, 0x12, 0x2c, 0x48, 0x39, 0x38, 0x88, 0x11, 0x62, 0x38, 0x4d, 0x90, 0xf8, 0x21, 0x7e, 0x28, 37 | 0x2b, 0x43, 0x08, 0x12, 0x9d, 0xb8, 0x37, 0x94, 0xf8, 0x10, 0x27, 0x90, 0x4e, 0xa6, 0x92, 0x86, 0xf9, 0x72, 0x8a, 0x20, 0x01, 0x8b, 0x5a, 0x73, 0x80, 0xdb, 0x87, 0x4e, 0x83, 0x88, 0x27, 0x88, 0x18, 0x2a, 0xd1, 0x37, 0x3c, 0x9f, 0xb3, 0x86, 0x0f, 0xf1, 0x82, 0xe8, 0xd4, 0x2a, 0x39, 0x33, 0x8a, 0x03, 0xd1, 0x83, 0x23, 0xb3, 0x8a, 0xdc, 0xd6, 0x4e, 0x3b, 0x40, 0x8c, 0x39, 0xc3, 0x85, 0x24, 0x81, 0x8c, 0x11, 0x03, 0x8d, 0x1c, 0x21, 0x8c, 0xae, 0x68, 0x2a, 0xc2, 0x97, 0x33, 0xbd, 0x18, 0x8d, 0x6f, 0xf3, 0x89, 0x1b, 0x41, 0x82, 0xf1, 0x14, 0x83, 0x83, 0xf2, 0x7d, 0x01, 0x63, 0x8c, 0x04, 0x21, 0x8d, 38 | 0xea, 0x52, 0x01, 0x41, 0x26, 0x12, 0xa1, 0x38, 0x4e, 0xe6, 0xf8, 0x21, 0x05, 0x78, 0x62, 0x2e, 0x71, 0x04, 0xbb, 0x98, 0x29, 0x67, 0x18, 0x12, 0xad, 0x78, 0x4f, 0xff, 0xb5, 0x12, 0x80, 0xe1, 0xf2, 0x8e, 0x04, 0x21, 0x32, 0x19, 0xa3, 0x8c, 0xf0, 0xc6, 0x4f, 0xf5, 0x33, 0x59, 0x44, 0xc3, 0x73, 0x29, 0x81, 0x8e, 0xb1, 0xa2, 0x8e, 0x2b, 0x61, 0x8d, 0xf1, 0x54, 0x58, 0x44, 0x43, 0x8d, 0x27, 0x91, 0x8a, 0xc2, 0x02, 0x8c, 0x18, 0x01, 0x8e, 0xfd, 0x24, 0x8e, 0x8b, 0x52, 0x8a, 0xc2, 0xb2, 0x8d, 0x28, 0x41, 0x91, 0xfe, 0x24, 0x82, 0x25, 0x21, 0x6d, 0x02, 0x25, 0x90, 0x12, 0xf7, 0x34, 0xfe, 0x68, 0x10, 39 | 0xc8, 0x22, 0x2d, 0x25, 0x20, 0x92, 0x26, 0xc1, 0x60, 0x07, 0xd5, 0x2b, 0x5a, 0x23, 0x91, 0x29, 0xd1, 0x04, 0x41, 0x08, 0x29, 0x16, 0xc9, 0x11, 0x81, 0x68, 0x50, 0x40, 0x60, 0x2b, 0x92, 0x98, 0x31, 0xf7, 0xf8, 0x12, 0x3f, 0x99, 0x26, 0x15, 0xe0, 0x05, 0x47, 0x91, 0x14, 0x2c, 0xf0, 0x50, 0x29, 0xf9, 0x21, 0xf5, 0x28, 0x2b, 0x41, 0x29, 0x94, 0x90, 0x42, 0x93, 0x2a, 0x91, 0x80, 0x0b, 0xe5, 0x2b, 0x64, 0xf3, 0x83, 0x2e, 0xb1, 0x92, 0x74, 0xd2, 0x92, 0x4f, 0x81, 0x91, 0x0f, 0x55, 0x7e, 0x62, 0xa5, 0x35, 0x56, 0xf4, 0x14, 0x5a, 0xb0, 0x48, 0x4d, 0xe9, 0x1b, 0x0e, 0x30, 0x96, 0x4e, 0x91, 0x94, 0x16, 40 | 0xb5, 0x94, 0x1f, 0xe2, 0x73, 0x2e, 0xe3, 0x96, 0x11, 0x31, 0x05, 0xfc, 0xe8, 0x1d, 0x0e, 0xf0, 0x94, 0x4b, 0x61, 0x01, 0x20, 0x55, 0x2c, 0x20, 0x99, 0x31, 0x52, 0xd9, 0x14, 0x3d, 0x60, 0x13, 0xf1, 0x08, 0x1d, 0x25, 0x60, 0x13, 0x78, 0xd9, 0x14, 0x05, 0xb7, 0x51, 0x60, 0x69, 0x2a, 0x15, 0x38, 0x32, 0x1e, 0x39, 0x16, 0x32, 0x61, 0x93, 0x48, 0x24, 0x04, 0x32, 0xb1, 0x16, 0xab, 0x57, 0x51, 0x72, 0xf9, 0x21, 0x0a, 0x39, 0x77, 0x91, 0xb1, 0x1b, 0x84, 0xc1, 0x15, 0x8b, 0x14, 0x9a, 0x7a, 0xf4, 0x17, 0x12, 0x5e, 0xb9, 0x97, 0xc6, 0x42, 0x8b, 0x1a, 0x53, 0x01, 0x4b, 0xd7, 0x2b, 0x3e, 0x30, 0x62, 0x26, 41 | 0x95, 0x8b, 0xa3, 0xb9, 0xb6, 0x37, 0x9b, 0x58, 0x2c, 0x30, 0x19, 0x53, 0xce, 0x72, 0x38, 0x39, 0xf9, 0x26, 0x7a, 0x69, 0x53, 0x3d, 0x69, 0x2c, 0x70, 0xe9, 0x34, 0x56, 0x38, 0x26, 0x48, 0xc0, 0x88, 0x01, 0x95, 0x99, 0x14, 0x48, 0x39, 0x6a, 0x49, 0x29, 0xbb, 0xc9, 0x53, 0xdb, 0xe4, 0x39, 0x08, 0x99, 0x27, 0xc4, 0xb9, 0x50, 0xe1, 0x65, 0x95, 0x9e, 0x83, 0x00, 0xab, 0xd9, 0x26, 0x5b, 0x10, 0x9d, 0x0c, 0x55, 0x2d, 0xbf, 0x49, 0x36, 0xc1, 0xd9, 0x22, 0x21, 0x00, 0x55, 0xd6, 0xd2, 0x98, 0x59, 0xe3, 0x00, 0xb3, 0x49, 0x26, 0xd9, 0x59, 0x55, 0xd3, 0xe9, 0x2b, 0x83, 0xe9, 0x9d, 0x2e, 0xb9, 0x23, 0x24, 42 | 0x99, 0x55, 0xdd, 0xd2, 0x9e, 0x65, 0xf3, 0x98, 0x2d, 0xa2, 0x9d, 0x21, 0xe5, 0x2d, 0xf4, 0x59, 0x36, 0xee, 0x45, 0x24, 0x6c, 0x39, 0x56, 0xeb, 0x69, 0x56, 0xd3, 0xa3, 0x22, 0x2d, 0x92, 0x9e, 0xbd, 0xa5, 0x9f, 0xdd, 0x43, 0xa0, 0x1f, 0x12, 0x9e, 0xd2, 0x55, 0x2e, 0xfb, 0x89, 0x38, 0x15, 0xf0, 0x97, 0xe6, 0x81, 0x03, 0x7d, 0x15, 0xa0, 0xc6, 0xf2, 0xa0, 0x93, 0x63, 0x92, 0xc5, 0xb1, 0x9c, 0x7d, 0xb9, 0xd5, 0x2e, 0x18, 0x3a, 0x39, 0x08, 0x70, 0x98, 0xc7, 0x11, 0x13, 0x37, 0x70, 0x96, 0xf9, 0xe9, 0xa1, 0x13, 0x34, 0x9a, 0xc8, 0x31, 0x04, 0x26, 0x1a, 0x53, 0x16, 0xda, 0x2c, 0x1f, 0x9a, 0x3a, 0x76, 43 | 0x31, 0x87, 0xa4, 0x11, 0x13, 0x5a, 0xf0, 0x00, 0xaa, 0x55, 0x2f, 0x31, 0x4a, 0x3b, 0x76, 0x61, 0x13, 0x12, 0xca, 0x17, 0x47, 0x50, 0x97, 0x6f, 0x65, 0x2f, 0x3b, 0x3a, 0x3d, 0x15, 0x90, 0x9c, 0x7c, 0xa1, 0x05, 0x37, 0xe9, 0x59, 0x05, 0xe9, 0x2e, 0x45, 0xda, 0x3d, 0x82, 0x94, 0x17, 0x25, 0x7a, 0x5e, 0x00, 0xd0, 0x2f, 0x4f, 0x3a, 0x3f, 0x2b, 0xe0, 0x8d, 0x2d, 0x21, 0x13, 0xcb, 0x41, 0xa5, 0x3e, 0xc1, 0x05, 0xfd, 0xb2, 0xa4, 0x32, 0xf4, 0x01, 0x3a, 0x71, 0x29, 0x31, 0x70, 0x9e, 0x24, 0xd1, 0x03, 0xa8, 0x79, 0x5e, 0x4d, 0x5a, 0x2f, 0x42, 0x2a, 0x3f, 0x13, 0xa0, 0x13, 0x45, 0x04, 0x02, 0x53, 0x30, 44 | 0x13, 0x76, 0x7a, 0xa7, 0x78, 0x6a, 0xa7, 0x53, 0x20, 0xa6, 0x5e, 0x0a, 0x14, 0x05, 0xd3, 0xa2, 0x93, 0x63, 0x00, 0x7d, 0x4a, 0x23, 0x60, 0xea, 0x2f, 0x83, 0x0a, 0x52, 0x6d, 0xfa, 0x4e, 0x87, 0xba, 0x51, 0x0d, 0xb3, 0xa8, 0x16, 0x55, 0xa8, 0x7f, 0xea, 0xa8, 0x0f, 0xd5, 0x8c, 0x0d, 0xb3, 0xa6, 0x92, 0x5a, 0x63, 0x61, 0x15, 0xb3, 0x99, 0x97, 0x9a, 0x4c, 0x16, 0x73, 0xa5, 0x9b, 0xda, 0x75, 0x16, 0x43, 0x8e, 0x9f, 0x7a, 0x4d, 0x98, 0x68, 0x30, 0x1c, 0x39, 0xaa, 0xa5, 0x94, 0xa8, 0x0d, 0x53, 0x7f, 0xa8, 0xca, 0x4e, 0x66, 0xd4, 0xaa, 0xed, 0x04, 0xa9, 0x1d, 0x03, 0xa8, 0xb0, 0x5a, 0x47, 0xaa, 0x5a, 45 | 0x31, 0x96, 0x5a, 0xab, 0x6c, 0x76, 0x34, 0x9a, 0xaa, 0xab, 0xa0, 0x24, 0xab, 0x27, 0x43, 0x9e, 0xbe, 0x3a, 0x4b, 0xb0, 0x69, 0x2f, 0x7d, 0x39, 0xac, 0xaf, 0x84, 0x36, 0xd9, 0x88, 0xac, 0x59, 0x08, 0x48, 0xcc, 0x0a, 0x83, 0x7f, 0x43, 0xab, 0xcf, 0x1a, 0x43, 0xc5, 0x5a, 0x30, 0xb9, 0x3a, 0xad, 0x93, 0x66, 0x74, 0x39, 0xbd, 0x8a, 0xad, 0x54, 0x77, 0x39, 0x9e, 0xca, 0xad, 0x6c, 0xa4, 0x91, 0x1d, 0x23, 0xaa, 0xe0, 0xfa, 0x48, 0xd5, 0xda, 0x30, 0xa7, 0x5a, 0xae, 0x32, 0x64, 0x9c, 0x8c, 0xc2, 0xaa, 0xea, 0x1a, 0x4a, 0xcc, 0xf3, 0xae, 0xaa, 0x24, 0xae, 0x3c, 0x23, 0xad, 0xf2, 0x0a, 0xa5, 0xd7, 0xb3, 46 | 0xad, 0xf7, 0x1a, 0x43, 0xe1, 0x73, 0xac, 0xfb, 0x9a, 0x45, 0xeb, 0x53, 0x88, 0xff, 0xda, 0x47, 0x94, 0x1a, 0x3e, 0xd7, 0x3a, 0xb0, 0x31, 0x94, 0x9b, 0x0e, 0xf3, 0xad, 0x08, 0x9b, 0x40, 0x0d, 0xd4, 0x9d, 0x0d, 0x7b, 0x44, 0x20, 0xf4, 0x0f, 0x07, 0x1b, 0xb1, 0x0a, 0x54, 0xb0, 0x02, 0x44, 0xae, 0x16, 0xdb, 0x41, 0x14, 0x90, 0x30, 0xb1, 0x02, 0x61, 0xaf, 0x1b, 0x0b, 0x37, 0x1e, 0x2b, 0x10, 0x7c, 0x1a, 0xb2, 0x13, 0x34, 0xb2, 0x02, 0x71, 0x7a, 0x26, 0xbb, 0x43, 0x28, 0x3b, 0x6e, 0x2b, 0xfb, 0x7e, 0x2d, 0x2b, 0xac, 0x2f, 0xeb, 0x3d, 0x30, 0xd0, 0xb2, 0x03, 0x21, 0xb0, 0x33, 0xfb, 0x3f, 0xec, 0x5a, 47 | 0x2d, 0x6f, 0x9a, 0xb3, 0x9e, 0x63, 0xb3, 0x05, 0x01, 0x90, 0x3e, 0x9b, 0x40, 0xa5, 0x6a, 0xb3, 0xcb, 0x3a, 0xb4, 0xfe, 0xf3, 0x9d, 0x97, 0x53, 0xb1, 0x48, 0x7b, 0x38, 0x40, 0x8b, 0x10, 0xe9, 0xda, 0xb4, 0x38, 0xf3, 0xb4, 0x09, 0x11, 0xb5, 0x52, 0x3b, 0x32, 0x35, 0x4b, 0xb5, 0x50, 0xcb, 0x58, 0x43, 0x21, 0x9a, 0x5e, 0x1b, 0x9a, 0x2b, 0x80, 0x9f, 0x4f, 0xb4, 0xb3, 0xf6, 0xc2, 0xb4, 0x3c, 0xe5, 0x5e, 0x47, 0xe9, 0x6c, 0x31, 0x21, 0x03, 0x62, 0x8b, 0x42, 0x10, 0x91, 0xa7, 0x70, 0x7b, 0x39, 0x32, 0xcb, 0x53, 0x58, 0xc9, 0x11, 0x32, 0xe0, 0x9a, 0xc1, 0x96, 0x10, 0x1e, 0x20, 0xb6, 0x18, 0xcc, 0x1b, 48 | 0x33, 0x0c, 0xfb, 0x50, 0x1b, 0xf0, 0x9e, 0x24, 0x31, 0x60, 0x86, 0x24, 0xab, 0x3f, 0x60, 0x13, 0x6d, 0xbb, 0x13, 0x14, 0x10, 0x03, 0x8a, 0x88, 0xab, 0x3f, 0xf5, 0x15, 0x36, 0x71, 0x9d, 0x2f, 0xc1, 0xb6, 0x75, 0xb4, 0x03, 0x53, 0xd0, 0x01, 0x89, 0xbb, 0x15, 0x57, 0x30, 0x4a, 0x36, 0xc5, 0x95, 0x68, 0x41, 0xb9, 0xe9, 0xb4, 0x01, 0x75, 0xdb, 0x2e, 0x75, 0x08, 0x52, 0x59, 0xea, 0x17, 0xb5, 0x49, 0x4e, 0x2f, 0x6a, 0x2f, 0xa5, 0xcb, 0x50, 0x2b, 0x20, 0xb9, 0x79, 0x91, 0xba, 0xe3, 0x44, 0x01, 0xc0, 0x6a, 0xaa, 0x06, 0xe5, 0xb9, 0xa2, 0xe1, 0x04, 0x38, 0x8a, 0x4e, 0x08, 0xd0, 0x9b, 0x15, 0x63, 0xb5, 49 | 0x97, 0x54, 0x14, 0xb6, 0xb1, 0xbb, 0xe8, 0xb4, 0xba, 0xed, 0xa2, 0x01, 0xe9, 0xf4, 0xba, 0xc6, 0x41, 0xbc, 0xe3, 0x74, 0xae, 0xcd, 0xa2, 0xaf, 0x96, 0x84, 0xbb, 0xc9, 0x81, 0x04, 0x1c, 0x40, 0x4e, 0x0a, 0xdb, 0x2a, 0xd0, 0x7b, 0x48, 0xa3, 0x5b, 0x1c, 0x06, 0xea, 0x4d, 0xce, 0xdb, 0x2b, 0xd9, 0xdb, 0x47, 0xb6, 0x68, 0x1d, 0x96, 0xd8, 0x4d, 0x66, 0x66, 0x2f, 0xe1, 0xdb, 0x46, 0x18, 0xf0, 0x1f, 0xba, 0x3b, 0xbb, 0xfd, 0x92, 0xbe, 0x6c, 0x04, 0xbb, 0xe6, 0x81, 0xb7, 0xd7, 0x54, 0xbb, 0xdd, 0x02, 0xbf, 0x63, 0xc4, 0x20, 0x39, 0x90, 0xb9, 0x93, 0x64, 0xbf, 0xd5, 0x82, 0xbf, 0x62, 0x54, 0x21, 0x3b, 50 | 0x49, 0x4d, 0x9b, 0xcb, 0x6b, 0x2e, 0x00, 0xac, 0x7d, 0x15, 0xc2, 0xbc, 0xd3, 0x64, 0xbc, 0xb6, 0x72, 0xc0, 0x50, 0x64, 0x9f, 0xfd, 0xb1, 0xbf, 0xd8, 0xd4, 0xb1, 0xde, 0xe2, 0xc0, 0x4f, 0x24, 0xb8, 0xff, 0x31, 0xc0, 0xce, 0xe4, 0xbb, 0xff, 0xcb, 0xa9, 0x22, 0xf2, 0x03, 0xfc, 0x7b, 0x48, 0xfe, 0x0b, 0xbe, 0x3b, 0xd8, 0x22, 0x0e, 0xe9, 0xc1, 0x1d, 0x4c, 0x4c, 0x22, 0xba, 0x20, 0x4a, 0x10, 0xc2, 0x7d, 0x44, 0xb6, 0x17, 0xe2, 0xaf, 0x2e, 0xa6, 0x23, 0x27, 0xfc, 0x4b, 0xb7, 0x6a, 0x2b, 0x38, 0xdb, 0x88, 0x3b, 0x02, 0xc2, 0xef, 0x76, 0x9b, 0xbf, 0xf4, 0xa3, 0x16, 0xa2, 0xc1, 0xe7, 0xe7, 0xc3, 0xb9, 51 | 0xa4, 0xa1, 0x09, 0x22, 0xc4, 0xbe, 0x74, 0xc3, 0xce, 0xa8, 0x2e, 0x2e, 0xbc, 0x18, 0x47, 0x60, 0x04, 0x27, 0x82, 0x25, 0x12, 0xac, 0x4c, 0xe7, 0x9b, 0x52, 0xf1, 0xd2, 0x8e, 0x70, 0x01, 0x02, 0x12, 0xc9, 0xa1, 0x3d, 0x95, 0x25, 0x48, 0x8c, 0x4b, 0xc6, 0x02, 0xbc, 0x73, 0x52, 0x00, 0x59, 0x01, 0x02, 0x8d, 0x21, 0x11, 0x54, 0xf9, 0x20, 0x46, 0x4c, 0x21, 0x33, 0xd0, 0xc4, 0x62, 0x44, 0xc1, 0xbd, 0xe2, 0xae, 0xea, 0xb2, 0x9c, 0x5f, 0x41, 0xa3, 0x12, 0x41, 0xa1, 0x1a, 0x52, 0x26, 0x53, 0x4c, 0x4c, 0x4f, 0x50, 0x2c, 0xa9, 0xc2, 0x00, 0x56, 0x00, 0xb7, 0x79, 0x8a, 0x05, 0x95, 0x69, 0xc7, 0xa0, 0x17, 52 | 0x21, 0x2b, 0xac, 0x23, 0x3c, 0x5c, 0x4c, 0xd3, 0x7e, 0x2c, 0x2a, 0x62, 0xe1, 0xc6, 0x86, 0x71, 0x27, 0x58, 0xbc, 0x4a, 0x2f, 0x40, 0x9d, 0x99, 0x62, 0xc8, 0x48, 0x51, 0xbd, 0x0f, 0x82, 0x27, 0x35, 0x0c, 0x4b, 0x96, 0x1c, 0x29, 0xb2, 0xb8, 0x14, 0x9a, 0x3c, 0x20, 0xdb, 0x6b, 0x24, 0x27, 0x00, 0xc9, 0x47, 0xd4, 0xc7, 0xb6, 0xd2, 0xb3, 0x3f, 0x62, 0x16, 0xa3, 0x5c, 0x41, 0x82, 0x42, 0x04, 0xa8, 0x0c, 0xb3, 0xa9, 0x05, 0xca, 0x67, 0xf1, 0xca, 0xec, 0x21, 0xbf, 0x5a, 0x32, 0xc9, 0xf0, 0x2a, 0x93, 0x90, 0xa2, 0xb4, 0x28, 0x31, 0xcb, 0x5a, 0xd1, 0x28, 0xbc, 0x5c, 0x68, 0xb5, 0x32, 0x94, 0x55, 0x02, 53 | 0xcc, 0x28, 0x51, 0x9a, 0xdf, 0x51, 0xca, 0xbb, 0x0c, 0xc6, 0xbd, 0x22, 0xc6, 0xf9, 0xb1, 0xc6, 0x2d, 0x81, 0xcb, 0xdd, 0x01, 0xc3, 0xf0, 0x51, 0xcc, 0x33, 0x8c, 0xc3, 0x87, 0xb2, 0x17, 0xc2, 0xec, 0x13, 0xd8, 0x1c, 0x1f, 0xda, 0x2c, 0x49, 0x8d, 0xdc, 0x27, 0x18, 0xfc, 0xc8, 0xde, 0x11, 0xce, 0xf2, 0x31, 0xce, 0x8e, 0x54, 0x2c, 0x73, 0xfb, 0x23, 0xce, 0x2c, 0x15, 0xdf, 0x9c, 0x13, 0xea, 0x3c, 0x1f, 0xec, 0xfc, 0x76, 0x9f, 0xac, 0x26, 0xca, 0x8c, 0x14, 0xf3, 0xdc, 0x2b, 0xf7, 0xdc, 0x47, 0x1f, 0x45, 0x27, 0xf5, 0x3c, 0x66, 0xcd, 0x11, 0xca, 0xc4, 0xac, 0x4a, 0x01, 0x3d, 0x27, 0x91, 0xf1, 0x9f, 54 | 0xbf, 0x61, 0x2c, 0xff, 0xfc, 0x79, 0x53, 0x35, 0x27, 0x40, 0x7c, 0x16, 0xc3, 0xe9, 0x1b, 0x09, 0xe0, 0x2c, 0x0f, 0xff, 0x9d, 0xbf, 0x09, 0xfd, 0x25, 0x06, 0xad, 0x17, 0x4d, 0x8c, 0x04, 0xd5, 0x92, 0xd1, 0x08, 0xec, 0x2b, 0x20, 0xfb, 0x1a, 0x1d, 0xed, 0xcd, 0xaf, 0x91, 0xc8, 0x9d, 0x22, 0xd2, 0x7f, 0x67, 0x2c, 0x32, 0xac, 0x21, 0x27, 0xcd, 0x17, 0x21, 0x0c, 0xc1, 0xa6, 0xc2, 0xd2, 0x12, 0x8b, 0x55, 0x5d, 0x12, 0xd3, 0x7d, 0xa1, 0xc0, 0x9b, 0xe1, 0x2d, 0x36, 0xcd, 0xb2, 0xcf, 0x5b, 0x25, 0x3a, 0xed, 0x17, 0x3e, 0x50, 0x56, 0x3e, 0x7d, 0x49, 0x3e, 0x95, 0x24, 0x43, 0xfd, 0x18, 0x3c, 0x1d, 0xc9, 55 | 0xde, 0xb2, 0x05, 0x3f, 0xcd, 0xaf, 0x4c, 0xe1, 0x20, 0x88, 0x45, 0x1f, 0xac, 0xbc, 0x1f, 0xc4, 0x11, 0x9f, 0x88, 0x61, 0x2e, 0x28, 0x30, 0xcf, 0xd3, 0xb3, 0x14, 0x71, 0xf8, 0x15, 0xcf, 0x79, 0x1d, 0x4a, 0xb2, 0xd4, 0x94, 0x81, 0xc7, 0x86, 0xd1, 0xb8, 0xcd, 0xd2, 0xc6, 0xe4, 0x8c, 0x14, 0xcc, 0x35, 0xd0, 0x4f, 0xf1, 0xce, 0xf8, 0x41, 0xd3, 0xb4, 0xc1, 0xd0, 0x70, 0x61, 0xd6, 0x9d, 0xe2, 0x02, 0x5e, 0xfd, 0x3b, 0x6e, 0x3d, 0x17, 0x70, 0xed, 0x14, 0x40, 0xf2, 0xd7, 0x2f, 0xe1, 0x84, 0xd7, 0xbb, 0x28, 0x51, 0xdd, 0x41, 0x2f, 0xb1, 0x77, 0xd4, 0x3c, 0x1a, 0x10, 0x1b, 0x54, 0xd8, 0xd1, 0xd4, 0x5b, 56 | 0x51, 0x2f, 0xfd, 0x97, 0xb7, 0x2b, 0x81, 0xcc, 0x76, 0x42, 0x1e, 0x25, 0x0d, 0x17, 0x85, 0x4d, 0x19, 0x76, 0xdd, 0x15, 0xf6, 0x32, 0x00, 0x94, 0x9d, 0x12, 0x0c, 0xbb, 0xd9, 0x93, 0xd1, 0xd8, 0xed, 0x31, 0xd6, 0xc7, 0xa1, 0xd5, 0x70, 0x51, 0x2f, 0x5f, 0xc0, 0xc5, 0xdd, 0x5a, 0x93, 0xae, 0x21, 0xd8, 0x2f, 0xf1, 0xb7, 0xad, 0x41, 0xda, 0xa2, 0xe1, 0x84, 0xe7, 0x6c, 0x2a, 0x43, 0x40, 0xbf, 0xf8, 0x8c, 0x12, 0xbe, 0x81, 0xc9, 0xb7, 0x41, 0xdb, 0x9c, 0x09, 0x41, 0xd7, 0xc6, 0xe1, 0x84, 0x2a, 0x5d, 0x29, 0x9d, 0xff, 0x9c, 0x6e, 0x29, 0x81, 0x88, 0xc0, 0x6d, 0x1b, 0xc2, 0x9d, 0x18, 0x48, 0x3a, 0x1e, 57 | 0x4e, 0xb8, 0xd8, 0x65, 0x82, 0x04, 0xae, 0xdd, 0xd6, 0x27, 0x51, 0x8f, 0xcd, 0x5d, 0x1b, 0x05, 0x22, 0xdb, 0x4f, 0xd1, 0x86, 0xbe, 0x42, 0xb8, 0x1b, 0x97, 0xdd, 0xce, 0xb1, 0xdd, 0xa8, 0xf1, 0xdc, 0x73, 0x41, 0xdc, 0xc9, 0x71, 0xdd, 0x91, 0x6d, 0x2a, 0x4e, 0xc0, 0xde, 0x66, 0x57, 0x12, 0x57, 0xad, 0x15, 0xb9, 0x4d, 0x1b, 0x99, 0xbd, 0x18, 0xfe, 0xd1, 0xd9, 0x7f, 0xd5, 0x29, 0x55, 0x00, 0xdf, 0xe3, 0x9d, 0xa6, 0xde, 0xa1, 0xde, 0xa7, 0x91, 0xd9, 0x78, 0x6d, 0x1c, 0x15, 0x2d, 0x17, 0x5a, 0xea, 0x26, 0xe5, 0xbb, 0xab, 0x23, 0x21, 0xcd, 0x3d, 0x21, 0xe0, 0xa6, 0x61, 0xaf, 0xfd, 0x09, 0x20, 0x4e, 58 | 0xa8, 0xd6, 0x0a, 0xce, 0xdb, 0xd0, 0x2c, 0x12, 0x47, 0xeb, 0x1d, 0xf5, 0x8d, 0x1a, 0x0e, 0x9e, 0x13, 0xfb, 0x8c, 0x1b, 0x4e, 0x58, 0xe0, 0x2f, 0x22, 0x02, 0x7b, 0xbd, 0x43, 0xb6, 0x6d, 0x10, 0xf8, 0x61, 0xde, 0xa6, 0xd3, 0x1c, 0xde, 0x6d, 0x16, 0x4e, 0xf8, 0xe2, 0xb5, 0xc1, 0xcc, 0xc5, 0xa4, 0xca, 0x21, 0x31, 0xdf, 0x74, 0x31, 0x1e, 0x3c, 0x00, 0x1c, 0x13, 0x6d, 0x1e, 0xe0, 0xdd, 0x26, 0xef, 0x7d, 0x4d, 0xff, 0x67, 0xda, 0x57, 0x75, 0x1d, 0x39, 0x7c, 0x18, 0x21, 0x7e, 0x1c, 0xfe, 0x8d, 0x15, 0x64, 0x62, 0x02, 0x27, 0xae, 0x45, 0x36, 0x0e, 0x12, 0xf7, 0xad, 0x13, 0x10, 0x5e, 0x1a, 0x1c, 0xd9, 59 | 0xe1, 0xf2, 0x71, 0x99, 0xed, 0x0d, 0x25, 0x0b, 0x2e, 0xe4, 0x57, 0x54, 0x20, 0xba, 0x4c, 0x1b, 0x72, 0xfd, 0x13, 0x5d, 0xcb, 0x22, 0x34, 0xbe, 0x15, 0xeb, 0xb8, 0x23, 0xe2, 0x4d, 0x4e, 0x51, 0xee, 0x11, 0x1f, 0xbe, 0xdf, 0xd4, 0x61, 0x74, 0x50, 0x35, 0xc0, 0xe2, 0x14, 0x3e, 0x17, 0xc7, 0xbd, 0x20, 0x55, 0xe0, 0xe4, 0xed, 0xf4, 0x7f, 0x11, 0x92, 0xe2, 0x7d, 0xa1, 0x18, 0x2d, 0x40, 0x24, 0xd3, 0xbd, 0x23, 0x5f, 0xec, 0x4d, 0x23, 0x81, 0xe3, 0x9c, 0xe1, 0xe7, 0x7a, 0x31, 0xe6, 0x3b, 0x41, 0xe7, 0x09, 0xf2, 0xe3, 0x2d, 0x82, 0x04, 0x0f, 0x70, 0x00, 0x0d, 0xf0, 0x90, 0xff, 0x23, 0xc1, 0x21, 0x55, 60 | 0x3e, 0x19, 0x3d, 0x2d, 0xe8, 0x39, 0x2e, 0x22, 0x92, 0xde, 0x4f, 0x24, 0x31, 0xe5, 0x58, 0x11, 0xe6, 0xa2, 0x21, 0xc7, 0x72, 0x21, 0xe3, 0x80, 0x61, 0xcd, 0x70, 0x4e, 0x21, 0x5f, 0x40, 0xb9, 0x0d, 0x20, 0xa8, 0xfc, 0x94, 0xe4, 0x03, 0x41, 0xe4, 0xe0, 0x81, 0xea, 0x21, 0xc1, 0xe8, 0x65, 0x5a, 0x24, 0x68, 0x1d, 0x17, 0xa4, 0x4e, 0x1e, 0x7a, 0xce, 0x13, 0x64, 0xcc, 0x4f, 0xa1, 0x8e, 0x22, 0x58, 0x2e, 0x19, 0x6f, 0x5a, 0xec, 0x0a, 0x72, 0xe6, 0x5a, 0x31, 0xbe, 0xe5, 0x51, 0x05, 0x18, 0x2e, 0x50, 0xff, 0x67, 0xd9, 0xec, 0x41, 0xdd, 0x7a, 0xb1, 0xe9, 0x45, 0x32, 0xe2, 0xff, 0xd1, 0xe5, 0x07, 0xa5, 61 | 0xe8, 0x02, 0x71, 0xe4, 0x05, 0x52, 0x1c, 0xd6, 0xce, 0xe9, 0xa7, 0x3e, 0x1f, 0x77, 0x0b, 0x52, 0x0c, 0x7c, 0x11, 0x3f, 0x42, 0xed, 0x6b, 0xa1, 0x18, 0x24, 0x5e, 0xe7, 0x73, 0x11, 0x1f, 0xaa, 0x0e, 0x51, 0x35, 0x00, 0xe0, 0xf0, 0x9c, 0x1b, 0x8a, 0x81, 0xec, 0x0b, 0x02, 0xe9, 0xd8, 0xc1, 0x02, 0x4f, 0x4e, 0x4b, 0xf3, 0x4e, 0x12, 0x49, 0xe2, 0xe8, 0x7e, 0xb1, 0xe1, 0x9d, 0x6e, 0x24, 0x0c, 0x2a, 0x17, 0xe3, 0x11, 0xef, 0x1b, 0x55, 0xc0, 0x23, 0xf1, 0xd2, 0xf9, 0x71, 0x1b, 0x66, 0x5b, 0xa5, 0x4e, 0xb2, 0xeb, 0x70, 0x91, 0xe6, 0xc5, 0xd1, 0xbe, 0x2c, 0x05, 0xc7, 0xc3, 0x9e, 0x24, 0x99, 0xce, 0x17, 62 | 0x4c, 0xf2, 0x24, 0x69, 0x0c, 0x9a, 0xc7, 0x81, 0x19, 0xcf, 0x0e, 0x52, 0xb2, 0x6e, 0x10, 0xb4, 0xbe, 0xc9, 0xb4, 0xa1, 0xb1, 0x3f, 0xd1, 0xe3, 0x16, 0x32, 0xe8, 0xb8, 0x81, 0x04, 0x25, 0x6f, 0x52, 0x27, 0x6f, 0x10, 0x11, 0x3f, 0xed, 0xb4, 0x11, 0xee, 0x46, 0xa2, 0xef, 0xa8, 0x71, 0xe0, 0x3c, 0x55, 0xf3, 0x22, 0x2a, 0x4e, 0x25, 0x39, 0xaf, 0x18, 0x58, 0xc2, 0xf3, 0xa4, 0xc1, 0xd6, 0x44, 0x05, 0xf4, 0x05, 0x81, 0xde, 0xd0, 0xa1, 0xee, 0x63, 0xf1, 0xf1, 0x50, 0x32, 0xf3, 0x4c, 0x6e, 0x1a, 0x5b, 0x00, 0xd9, 0x36, 0xff, 0xa5, 0xf4, 0x04, 0x91, 0xf2, 0x79, 0x6c, 0x1a, 0x04, 0x3f, 0x17, 0xd1, 0xad, 63 | 0x23, 0x07, 0xcf, 0xeb, 0xa3, 0xb1, 0xe4, 0x57, 0xaf, 0x12, 0x5f, 0xe2, 0xf4, 0x52, 0xc1, 0xf2, 0x3e, 0x91, 0x25, 0x45, 0x3d, 0x17, 0xcc, 0xae, 0x17, 0xaa, 0x5d, 0x54, 0x55, 0x6c, 0x12, 0x88, 0xce, 0x1e, 0xf8, 0x9e, 0x16, 0x25, 0x1b, 0x14, 0x59, 0xd2, 0xbd, 0x59, 0x1c, 0x19, 0xd4, 0x2b, 0x9f, 0x2b, 0x91, 0x26, 0xb6, 0x4e, 0x11, 0x66, 0xcb, 0xed, 0xf2, 0x11, 0xe3, 0x80, 0xb1, 0xe6, 0x56, 0xc5, 0x12, 0x75, 0xdf, 0x1e, 0x77, 0x7f, 0x16, 0x8a, 0x81, 0xda, 0x39, 0x62, 0xf4, 0x6a, 0xa1, 0xf8, 0x55, 0x65, 0xf8, 0x0b, 0x31, 0x27, 0x98, 0xaf, 0x14, 0x5d, 0x8f, 0xf0, 0x5a, 0x42, 0xf9, 0x66, 0x01, 0xba, 64 | 0x5e, 0xb5, 0xf9, 0x09, 0x21, 0xed, 0xa0, 0x23, 0x1a, 0x6f, 0x3a, 0x26, 0x52, 0xaf, 0xf7, 0x6a, 0xa1, 0xf0, 0x4f, 0xa5, 0xc4, 0x27, 0x51, 0x27, 0x68, 0xdf, 0x14, 0x8a, 0x31, 0xf8, 0x93, 0x21, 0xbb, 0x5d, 0x61, 0xf1, 0x51, 0xb1, 0x05, 0x61, 0x1f, 0x2d, 0xa2, 0x4b, 0xf6, 0xca, 0x83, 0x14, 0x5a, 0x7f, 0xfa, 0x93, 0xe1, 0xf0, 0x3b, 0x11, 0xcf, 0x21, 0x12, 0xf7, 0x5c, 0x01, 0x7b, 0xf2, 0x1c, 0x2d, 0x08, 0x10, 0x04, 0x46, 0x79, 0x7f, 0xfd, 0x8d, 0x3e, 0xa4, 0xcf, 0x10, 0x37, 0xaf, 0x21, 0xb3, 0xaf, 0x14, 0x46, 0x27, 0xf0, 0x17, 0xc2, 0xf7, 0x5d, 0x51, 0xfd, 0x19, 0x01, 0xfc, 0x7d, 0x82, 0xb7, 0x2b, 65 | 0xe6, 0x04, 0xae, 0x8f, 0x3a, 0x58, 0xcf, 0x10, 0x7e, 0x42, 0x19, 0x3a, 0x5f, 0xf4, 0x05, 0x4f, 0x16, 0x21, 0x1f, 0x29, 0x35, 0xf0, 0x00, 0xba, 0xcf, 0x10, 0x26, 0xae, 0x3c, 0xb0, 0x6f, 0x12, 0xb8, 0x8e, 0x22, 0xd9, 0xff, 0x12, 0x00, 0x71, 0x03, 0xc0, 0xb6, 0x40, 0x82, 0x05, 0x0d, 0x1e, 0x34, 0x88, 0xe0, 0xdf, 0x42, 0x86, 0x0d, 0x1d, 0x3e, 0x84, 0x18, 0x51, 0xe2, 0x44, 0x8a, 0x15, 0x2d, 0x5e, 0xc4, 0x98, 0x51, 0x63, 0x00, 0x84, 0x1d, 0x0f, 0x6a, 0x04, 0x19, 0xd2, 0x22, 0x0b, 0x8f, 0x25, 0x4d, 0x9e, 0x44, 0x99, 0x52, 0x25, 0xca, 0x0a, 0x22, 0x1b, 0x6e, 0x11, 0xb0, 0x52, 0xe6, 0x4c, 0x9a, 0x35, 66 | 0x6d, 0xde, 0xc4, 0x49, 0x90, 0x84, 0x4b, 0x9e, 0x0d, 0x73, 0xfe, 0x04, 0xaa, 0xb2, 0xe7, 0x50, 0xa2, 0x12, 0x11, 0x00, 0x8d, 0x51, 0x54, 0xe9, 0x52, 0xa6, 0x4d, 0x2d, 0x72, 0xac, 0xe9, 0x54, 0xea, 0x43, 0x0b, 0x41, 0xad, 0x5e, 0x35, 0xa9, 0x54, 0x09, 0x54, 0xac, 0x5d, 0xbd, 0x7e, 0xc5, 0xaa, 0x62, 0x6a, 0xc5, 0x29, 0x60, 0xcd, 0xda, 0x2c, 0x31, 0x56, 0x2d, 0xc5, 0xa0, 0x5a, 0xd6, 0xbe, 0x85, 0x1b, 0x97, 0xe1, 0x03, 0x9b, 0x6e, 0xe5, 0x2e, 0xad, 0xc2, 0xf5, 0xec, 0x5e, 0x94, 0x31, 0x01, 0x4c, 0x61, 0x1a, 0x81, 0xef, 0x60, 0xc2, 0x85, 0x9f, 0xdc, 0x65, 0x78, 0xb4, 0xf0, 0x62, 0x84, 0x88, 0xdf, 67 | 0x0a, 0x04, 0xea, 0x58, 0xf2, 0x64, 0x9e, 0x24, 0x6b, 0xf2, 0xa0, 0x4c, 0xd4, 0x32, 0x63, 0xce, 0x15, 0x4c, 0x38, 0x15, 0xcc, 0x59, 0xf4, 0xe8, 0x9b, 0xff, 0x92, 0x49, 0x8b, 0x06, 0x9c, 0xb9, 0xa9, 0xe2, 0x9f, 0xaa, 0x5d, 0xbf, 0x86, 0x38, 0x44, 0xef, 0x4a, 0x10, 0xb0, 0x79, 0x56, 0x3d, 0xcd, 0x57, 0xa1, 0xd4, 0xd0, 0xb9, 0x7d, 0xff, 0x36, 0xe8, 0x00, 0x71, 0x0c, 0xe0, 0x84, 0xd3, 0xda, 0x26, 0x1a, 0xf4, 0x38, 0x72, 0xe6, 0x94, 0x67, 0xaf, 0x6c, 0x1e, 0x32, 0x6f, 0x71, 0xaf, 0x1a, 0x91, 0x7c, 0xc9, 0x38, 0x80, 0xfa, 0xf6, 0xd3, 0xc2, 0xe5, 0x72, 0xe7, 0x1b, 0x9d, 0x67, 0xd0, 0xd4, 0xe2, 0xcd, 68 | 0xc3, 0x7d, 0x2e, 0xf4, 0x7c, 0x46, 0x16, 0xe9, 0xc1, 0xcf, 0x0c, 0x72, 0x11, 0x47, 0x82, 0x82, 0x08, 0xe2, 0x57, 0xac, 0xe2, 0xf7, 0xfd, 0x7e, 0xbe, 0xde, 0xdf, 0x96, 0xe5, 0xef, 0xab, 0xf2, 0xd6, 0xb3, 0x48, 0x88, 0xa0, 0x08, 0x44, 0x70, 0x2a, 0xf7, 0x50, 0x4a, 0x10, 0x23, 0xdc, 0x02, 0x9c, 0xc9, 0x22, 0x08, 0x4a, 0xca, 0xa2, 0x22, 0x0c, 0x20, 0xc4, 0xf0, 0xab, 0x1d, 0xe0, 0xaa, 0x20, 0x43, 0xac, 0x76, 0x6b, 0x70, 0xa2, 0x0d, 0x0e, 0x0c, 0xb1, 0xc4, 0xa1, 0x16, 0x3c, 0xc9, 0x44, 0xfc, 0x50, 0xf4, 0xb0, 0xa0, 0x8a, 0xb4, 0x33, 0x69, 0x27, 0x8a, 0xf4, 0x6b, 0xb1, 0xc6, 0xd2, 0xde, 0xb2, 0xd1, 69 | 0xaa, 0x01, 0x55, 0x64, 0x28, 0xa8, 0x0d, 0x78, 0x04, 0x52, 0xa3, 0x07, 0x67, 0x3a, 0x22, 0x48, 0x89, 0xda, 0xcb, 0x11, 0x21, 0x19, 0x25, 0x22, 0x82, 0xc5, 0x81, 0x3e, 0xa0, 0xe8, 0xc2, 0x24, 0xa7, 0x5c, 0x09, 0xc4, 0xa9, 0x8e, 0xa0, 0x32, 0x27, 0x2b, 0x83, 0x0c, 0xaa, 0x48, 0x23, 0xbf, 0x9c, 0x68, 0xb3, 0x99, 0x56, 0x00, 0x33, 0xa2, 0x21, 0xa7, 0xac, 0x68, 0x01, 0xe8, 0x24, 0xca, 0x2f, 0x4b, 0x37, 0x63, 0x54, 0x0b, 0x84, 0x37, 0x6f, 0xda, 0x51, 0x45, 0x00, 0x5b, 0x2b, 0x33, 0x4f, 0xe4, 0x87, 0x90, 0x70, 0xb2, 0x23, 0xff, 0xf4, 0x64, 0x68, 0x3a, 0x2a, 0x29, 0x6a, 0x72, 0x25, 0x2f, 0x26, 0xa2, 70 | 0x71, 0x4e, 0x45, 0x07, 0x52, 0x6b, 0xd1, 0x9a, 0xfe, 0xe4, 0x71, 0x05, 0x12, 0x01, 0x05, 0xb4, 0xcf, 0x8e, 0x28, 0x7d, 0x08, 0xc9, 0x24, 0x67, 0x94, 0xe9, 0x50, 0x89, 0x60, 0x74, 0x74, 0x51, 0x20, 0xc6, 0x0a, 0x95, 0xa6, 0x2f, 0x59, 0xc3, 0xe9, 0x47, 0x4c, 0xf5, 0xb4, 0xb4, 0xb1, 0x55, 0x1d, 0x3a, 0xd3, 0x43, 0x4e, 0x0d, 0x9d, 0x08, 0xd4, 0x52, 0xe7, 0x9c, 0x0a, 0xb2, 0x5b, 0x55, 0x22, 0x93, 0x4b, 0xa0, 0xbc, 0x7c, 0x15, 0xcc, 0x56, 0x3f, 0x0a, 0xb6, 0x21, 0x41, 0x5b, 0xf4, 0x34, 0xa2, 0x44, 0x53, 0xac, 0x75, 0x57, 0x45, 0x21, 0x55, 0xca, 0x59, 0x99, 0x8c, 0x9c, 0xb4, 0x58, 0x23, 0x87, 0x35, 71 | 0xa8, 0xce, 0x60, 0x35, 0xcd, 0x10, 0x4a, 0x89, 0xa4, 0x4c, 0x29, 0x29, 0x89, 0x60, 0x92, 0x76, 0xce, 0x22, 0x9a, 0xfa, 0xa2, 0x5c, 0xf5, 0x78, 0xec, 0xa1, 0x5a, 0x6b, 0x81, 0x8c, 0x55, 0xa5, 0x1b, 0xde, 0x85, 0xd5, 0x43, 0x55, 0x3f, 0x5d, 0x37, 0x22, 0x1a, 0xb0, 0x55, 0x17, 0x3c, 0x68, 0x87, 0xea, 0xb0, 0xdf, 0x93, 0x80, 0x35, 0x31, 0xe0, 0x9c, 0xfe, 0xa5, 0x37, 0x44, 0x19, 0x6c, 0xaa, 0x2d, 0xe1, 0x40, 0xf9, 0x15, 0xad, 0xa5, 0x59, 0x4d, 0xb2, 0x81, 0x22, 0x5b, 0x05, 0xde, 0x94, 0x29, 0x8c, 0x4f, 0xda, 0x32, 0xc4, 0xa0, 0x7a, 0x70, 0x18, 0x48, 0x27, 0x20, 0x66, 0x34, 0x64, 0x86, 0xb8, 0xdd, 72 | 0xcf, 0xc2, 0x93, 0xee, 0x8d, 0xa8, 0xcd, 0x8d, 0xa7, 0xec, 0xff, 0x98, 0x27, 0x03, 0x5f, 0x2e, 0x49, 0x5b, 0x04, 0xdd, 0x35, 0x39, 0x44, 0x92, 0x01, 0xc8, 0xb9, 0x21, 0xba, 0xf8, 0x5b, 0x52, 0x22, 0x05, 0x4c, 0x4a, 0x36, 0x22, 0x70, 0x69, 0xce, 0x71, 0xd4, 0xa2, 0x1c, 0x40, 0xda, 0xa3, 0x98, 0x09, 0xbc, 0x33, 0xa7, 0x9e, 0x55, 0xdc, 0x79, 0x6a, 0x86, 0x46, 0xe6, 0xcf, 0xa2, 0x2a, 0x38, 0x50, 0xb2, 0x68, 0x65, 0x9b, 0x46, 0xb3, 0x28, 0xb0, 0x3d, 0x52, 0xb1, 0x04, 0xa0, 0x10, 0xb6, 0xda, 0xbc, 0xaa, 0xd3, 0x5e, 0x08, 0x65, 0xea, 0x82, 0xa6, 0xa8, 0x83, 0x82, 0x08, 0xfe, 0x76, 0xec, 0x8c, 0x93, 73 | 0xb3, 0x9b, 0xd8, 0x12, 0x83, 0x12, 0x97, 0x6d, 0x04, 0x97, 0x55, 0xe9, 0x3e, 0xbf, 0x7f, 0xe6, 0x6e, 0x2c, 0xc0, 0xf3, 0x0e, 0x70, 0xc3, 0xa1, 0xb0, 0x44, 0xbc, 0xa0, 0xe5, 0x1a, 0x0c, 0x0a, 0x3b, 0xbf, 0x11, 0xe4, 0xba, 0xa6, 0x5e, 0x27, 0xc7, 0x7a, 0x3b, 0xb4, 0x7b, 0x52, 0xb3, 0xf1, 0x16, 0x9f, 0xd6, 0x88, 0x69, 0xcf, 0x09, 0x2a, 0x51, 0xd2, 0xc8, 0x26, 0x47, 0x10, 0x07, 0x9b, 0x36, 0xef, 0xd9, 0x6d, 0xdf, 0x58, 0x0f, 0xe9, 0x87, 0x9d, 0x47, 0x17, 0xed, 0xb0, 0x9e, 0x68, 0x27, 0x88, 0xee, 0xf5, 0x82, 0x02, 0x1d, 0x75, 0xe4, 0x8e, 0x8d, 0xd0, 0xf7, 0xb9, 0x34, 0x67, 0x6a, 0x68, 0xdc, 0x33, 74 | 0xec, 0xdd, 0x22, 0xc6, 0x71, 0x87, 0x1d, 0x39, 0xbe, 0x85, 0x27, 0x70, 0x6d, 0xe8, 0xff, 0xc9, 0xbc, 0x38, 0xb1, 0x86, 0xca, 0x61, 0xf6, 0xe3, 0x39, 0xeb, 0x49, 0xce, 0xed, 0x1b, 0x24, 0x0e, 0x28, 0xc9, 0xa7, 0x17, 0x4f, 0x7a, 0xf2, 0x5d, 0x3f, 0x0d, 0x6e, 0x90, 0x26, 0xdc, 0xbe, 0x45, 0xdb, 0x45, 0x6a, 0x9f, 0xe7, 0x04, 0x51, 0xc5, 0x89, 0xfc, 0xf3, 0x76, 0xb6, 0xd9, 0x77, 0xc2, 0x81, 0xb3, 0xaa, 0x0f, 0xa4, 0xec, 0x69, 0x72, 0x40, 0x0c, 0x04, 0x38, 0xc0, 0xfd, 0xc5, 0xcf, 0x2c, 0xd7, 0x83, 0x5f, 0xfb, 0x40, 0x76, 0x33, 0x9c, 0xd9, 0xcf, 0x36, 0x87, 0x43, 0xc9, 0xbc, 0x1c, 0xb8, 0x90, 0xea, 75 | 0x15, 0x07, 0x01, 0xba, 0x8b, 0x08, 0xfb, 0x54, 0x62, 0x04, 0x8b, 0x20, 0xa1, 0x80, 0x06, 0xbc, 0x4a, 0xf2, 0x26, 0x12, 0x35, 0xdc, 0xb1, 0xec, 0x3c, 0xca, 0x99, 0x60, 0x74, 0x42, 0x60, 0x13, 0x13, 0x3a, 0x10, 0x7d, 0xbf, 0x89, 0x81, 0x16, 0xbe, 0x30, 0x43, 0x1a, 0x7e, 0x61, 0x0a, 0x1f, 0x34, 0x89, 0x03, 0x2a, 0x94, 0x11, 0x27, 0x40, 0x10, 0x84, 0x37, 0x0a, 0x89, 0xe8, 0xda, 0x87, 0xa0, 0x76, 0x01, 0x25, 0x7f, 0x29, 0xa4, 0x8c, 0x0f, 0xcc, 0x87, 0x44, 0x1c, 0xbe, 0x49, 0x00, 0x22, 0x9c, 0x48, 0x6f, 0x7e, 0x78, 0xba, 0x90, 0x80, 0x10, 0x41, 0x23, 0xa2, 0x22, 0x12, 0x6d, 0x03, 0xbc, 0x69, 0x69, 76 | 0xf1, 0x6a, 0xda, 0x03, 0xcf, 0x01, 0x86, 0xe2, 0x02, 0x30, 0x4e, 0x71, 0x20, 0x14, 0x08, 0x89, 0xae, 0xda, 0x27, 0xb1, 0x13, 0x36, 0xd0, 0x8b, 0x99, 0x59, 0xa2, 0x17, 0x5f, 0x98, 0x23, 0x28, 0x5e, 0xc4, 0x78, 0x66, 0xac, 0xff, 0x1f, 0x48, 0x0c, 0x16, 0x3f, 0x02, 0xa1, 0xf0, 0x8d, 0xb6, 0x89, 0xe3, 0x1b, 0x9b, 0x58, 0xa3, 0x3a, 0x62, 0xa4, 0x73, 0x78, 0xb4, 0x49, 0x15, 0x7f, 0xb8, 0x40, 0xf1, 0xa4, 0xeb, 0x57, 0x7f, 0x04, 0xa4, 0x4d, 0x04, 0x07, 0x49, 0xea, 0x95, 0x91, 0x34, 0x1d, 0x70, 0xca, 0x21, 0x11, 0x19, 0x3c, 0x8d, 0x4c, 0xb1, 0x85, 0xc8, 0x29, 0x22, 0x9e, 0x28, 0xe9, 0x9a, 0x3b, 0xce, 77 | 0xe4, 0x71, 0xa3, 0x6c, 0x81, 0x25, 0x39, 0xe3, 0x35, 0xa5, 0x68, 0x72, 0x93, 0x2a, 0x39, 0x57, 0x27, 0xa7, 0x78, 0x1e, 0x2c, 0x8a, 0x72, 0x94, 0x99, 0x31, 0x81, 0x4d, 0x0a, 0x39, 0xc1, 0x41, 0xee, 0x47, 0x7d, 0x12, 0x71, 0x82, 0x0c, 0x8e, 0xf8, 0x10, 0x57, 0xbe, 0xf2, 0x24, 0xb1, 0xc4, 0x08, 0x09, 0xf9, 0x68, 0x1e, 0x1f, 0xdd, 0xd2, 0x35, 0x4a, 0x4c, 0xa4, 0x33, 0x1b, 0x52, 0x41, 0x08, 0xe1, 0x27, 0x04, 0xcf, 0xf9, 0xe5, 0x43, 0xa8, 0xe0, 0x43, 0x63, 0x1a, 0x04, 0x99, 0x17, 0x31, 0xdd, 0x0f, 0x87, 0x99, 0x99, 0x2e, 0x49, 0x33, 0x33, 0x5b, 0x08, 0xa4, 0x33, 0x4f, 0xa0, 0xca, 0xb3, 0x64, 0x93, 78 | 0x21, 0x1e, 0x60, 0xd6, 0x44, 0x08, 0xd0, 0xcd, 0x94, 0x28, 0x0d, 0x23, 0xf4, 0x8b, 0xdf, 0x29, 0x6d, 0xe3, 0x48, 0x5b, 0x9a, 0x53, 0x32, 0xe9, 0x94, 0x66, 0x2f, 0x81, 0x43, 0x91, 0x62, 0x76, 0xa4, 0x0b, 0x13, 0x21, 0x23, 0x3d, 0x39, 0x26, 0x4b, 0x33, 0x8a, 0x27, 0x94, 0x52, 0xf3, 0xa7, 0x73, 0x6c, 0x32, 0x4e, 0x4a, 0x6e, 0x25, 0x6b, 0x12, 0x41, 0x41, 0xab, 0x0e, 0x8a, 0x2f, 0x85, 0x66, 0x25, 0x23, 0x88, 0x14, 0x8f, 0x10, 0x71, 0xd2, 0xbc, 0x88, 0x2a, 0xc8, 0x26, 0x12, 0x2c, 0x69, 0x43, 0xd6, 0xf9, 0x9e, 0x66, 0xad, 0x29, 0x22, 0xf3, 0xec, 0x68, 0x49, 0xa5, 0x32, 0xd2, 0x04, 0x90, 0x46, 0xe7, 79 | 0x63, 0x29, 0x95, 0x8c, 0x06, 0x67, 0xc2, 0x46, 0x9c, 0x0e, 0xaf, 0x70, 0x11, 0x21, 0x97, 0x4b, 0x21, 0x02, 0xd3, 0x98, 0x5e, 0x0a, 0x23, 0xe1, 0x9c, 0xa5, 0x4d, 0xb3, 0xd8, 0xd3, 0xb8, 0xe4, 0x32, 0x9a, 0x4c, 0x65, 0x88, 0x45, 0xa9, 0x23, 0x11, 0xa9, 0xe6, 0xeb, 0x21, 0x44, 0x2d, 0xaa, 0xde, 0x2c, 0x22, 0xd2, 0x1f, 0x46, 0x67, 0x79, 0x10, 0x85, 0x6a, 0x5c, 0x64, 0xf3, 0xd4, 0xb0, 0x2e, 0x64, 0xa5, 0x03, 0xe5, 0xa8, 0x55, 0x1d, 0x82, 0xd5, 0xac, 0xba, 0x08, 0x23, 0x9b, 0xa4, 0x28, 0x62, 0xcc, 0xf6, 0x13, 0x92, 0x96, 0x95, 0x28, 0xe8, 0x24, 0xab, 0x5d, 0xff, 0x21, 0xd0, 0xc2, 0x4c, 0x04, 0x9e, 80 | 0x42, 0x7d, 0xc8, 0xc5, 0xda, 0x5a, 0xb2, 0x8b, 0x6c, 0x72, 0x97, 0x71, 0xb9, 0xa9, 0x5e, 0xdf, 0xb2, 0x33, 0xbb, 0x28, 0xf6, 0x1f, 0x55, 0x25, 0xcd, 0x44, 0x64, 0x07, 0xd8, 0x86, 0x6c, 0x73, 0xb0, 0x5a, 0xad, 0xc8, 0x2b, 0xe3, 0xfa, 0x1d, 0xf1, 0x39, 0x76, 0x2d, 0x3b, 0x9b, 0xa4, 0x63, 0xcf, 0x3a, 0x9a, 0x89, 0x31, 0x28, 0x22, 0x49, 0xe0, 0x66, 0x47, 0xff, 0x31, 0x32, 0x33, 0x44, 0xf6, 0xed, 0x35, 0xfc, 0x04, 0xab, 0x67, 0xa7, 0x92, 0x5a, 0x8f, 0xe8, 0xd3, 0xb1, 0x3a, 0x65, 0x0c, 0x66, 0x24, 0x22, 0x45, 0x93, 0xe8, 0x16, 0x22, 0x3a, 0x60, 0xe7, 0xf1, 0x30, 0x52, 0x4b, 0x3c, 0xba, 0xd6, 0x35, 81 | 0x6a, 0xbc, 0xc9, 0x61, 0x65, 0xbb, 0x3e, 0x5d, 0x2e, 0xb7, 0x21, 0x90, 0x5d, 0x0c, 0x45, 0x12, 0x6a, 0x92, 0xde, 0x09, 0x76, 0xb0, 0x08, 0xcc, 0xec, 0x2b, 0x2f, 0xf7, 0x1a, 0xae, 0xda, 0xc4, 0xb8, 0xce, 0x5d, 0x8a, 0x98, 0x38, 0x09, 0xde, 0x7f, 0x8c, 0xb6, 0x30, 0xbe, 0x8d, 0x08, 0x74, 0x0d, 0x82, 0xdd, 0x87, 0xa4, 0x20, 0xb8, 0xb8, 0xfb, 0x26, 0x5b, 0x5e, 0xa9, 0xdc, 0x46, 0x75, 0x96, 0xbc, 0x4d, 0x19, 0x6b, 0x54, 0xee, 0xcb, 0x10, 0xdc, 0x0e, 0x46, 0x42, 0x08, 0x11, 0x61, 0x06, 0x2e, 0x7b, 0x90, 0xf8, 0x4e, 0xa4, 0x9b, 0xb6, 0x41, 0x2e, 0x10, 0xf7, 0xbb, 0x14, 0x80, 0x2e, 0x57, 0xbd, 0x67, 82 | 0x41, 0x6f, 0x45, 0x90, 0x60, 0x81, 0x0a, 0x30, 0xc1, 0x22, 0xd6, 0x1d, 0xec, 0x47, 0x8d, 0x39, 0x3e, 0xd5, 0x58, 0x65, 0xc1, 0x4d, 0xd9, 0x99, 0x85, 0x3f, 0x6c, 0xd6, 0xf7, 0x7a, 0xb4, 0x29, 0x12, 0x18, 0x30, 0x66, 0xe5, 0xfb, 0xca, 0xef, 0x4e, 0xc6, 0x8f, 0x23, 0x2e, 0xca, 0xce, 0x50, 0x0a, 0xe3, 0xfe, 0x82, 0xe5, 0x93, 0x43, 0xa1, 0xad, 0x6a, 0xdf, 0x6a, 0x4c, 0xfa, 0x3a, 0x65, 0xae, 0x3f, 0xd9, 0x2c, 0x8c, 0x2b, 0x92, 0x63, 0x84, 0xf0, 0x14, 0xc6, 0x0f, 0xf6, 0x8a, 0x88, 0x95, 0x32, 0x82, 0x12, 0xe3, 0x4e, 0xc3, 0xc6, 0x7c, 0x8d, 0x87, 0x85, 0x5c, 0x94, 0x78, 0xa9, 0x15, 0xc6, 0xe6, 0x05, 83 | 0xcb, 0x52, 0x6a, 0x3c, 0xe0, 0xba, 0x7e, 0x75, 0x93, 0x51, 0x76, 0xe3, 0x94, 0x41, 0x22, 0x87, 0xde, 0x2e, 0x8a, 0x99, 0xbf, 0x7b, 0xe9, 0x71, 0x60, 0x53, 0x8c, 0x90, 0x02, 0x4b, 0xc4, 0xcb, 0x35, 0xed, 0x30, 0x50, 0x6c, 0x6b, 0x66, 0xeb, 0x34, 0x78, 0xc4, 0x48, 0xbe, 0x4a, 0x8b, 0x31, 0xe2, 0xb2, 0x35, 0x1b, 0x24, 0x23, 0x6f, 0xc6, 0xa3, 0x6b, 0x58, 0x9b, 0x93, 0x20, 0xd3, 0x39, 0x22, 0x8c, 0x35, 0x74, 0x43, 0x44, 0xd0, 0xe4, 0x82, 0xd4, 0xd5, 0x21, 0x5b, 0xee, 0xf3, 0x9f, 0xe9, 0xe9, 0x1a, 0xef, 0xf5, 0x33, 0xd1, 0x20, 0xd9, 0x59, 0x84, 0x13, 0x0d, 0x69, 0xab, 0x18, 0x99, 0x22, 0x58, 0xee, 84 | 0xb3, 0x5b, 0x2f, 0x02, 0x68, 0x33, 0x62, 0xf0, 0x2e, 0x52, 0xbe, 0xb4, 0x48, 0x76, 0x36, 0x67, 0x3a, 0x17, 0x0a, 0xcd, 0x52, 0x88, 0x08, 0x12, 0x38, 0xc0, 0xe8, 0xae, 0x62, 0x84, 0xd4, 0x53, 0x34, 0x35, 0x67, 0x7f, 0x72, 0xe3, 0x54, 0x5b, 0x84, 0xc8, 0x07, 0x49, 0x33, 0x79, 0x17, 0x1d, 0xea, 0xfd, 0xb0, 0xff, 0x97, 0x22, 0xb7, 0xfe, 0x61, 0xae, 0xe1, 0x82, 0x6c, 0x99, 0x28, 0xbb, 0xd7, 0x13, 0xa9, 0x72, 0x4a, 0x9e, 0xfd, 0x10, 0x4e, 0x13, 0x3b, 0xb2, 0x92, 0xee, 0x26, 0xab, 0xe1, 0xd2, 0xdd, 0xbc, 0x4e, 0xfb, 0x22, 0x0b, 0xeb, 0xf6, 0xb4, 0x5d, 0x6d, 0x6d, 0xb4, 0xda, 0x5a, 0xa1, 0xe4, 0x0c, 85 | 0xb3, 0xb7, 0x81, 0x69, 0xe7, 0x54, 0x0f, 0x9b, 0xdc, 0xb9, 0xe1, 0x75, 0x44, 0x98, 0x6d, 0xc5, 0xc9, 0xcc, 0x5b, 0x25, 0x9e, 0x56, 0x77, 0x45, 0x42, 0x9c, 0x6f, 0x6a, 0xbf, 0xfb, 0x34, 0x6d, 0x9e, 0x88, 0xbd, 0xe3, 0xd7, 0x58, 0xc4, 0x70, 0xbb, 0x26, 0x8c, 0xe4, 0xf7, 0x53, 0x6c, 0xb2, 0xdd, 0x84, 0xff, 0x63, 0xdc, 0xfe, 0x8e, 0xae, 0x46, 0x04, 0xde, 0x3e, 0x6d, 0xd7, 0x77, 0xa9, 0x0d, 0x9f, 0xc8, 0xce, 0xf0, 0x9d, 0x70, 0x77, 0x43, 0x7c, 0x30, 0xca, 0x9d, 0xf8, 0x10, 0x4d, 0x93, 0x6e, 0x8c, 0x37, 0xe4, 0xd7, 0x2a, 0x2e, 0x79, 0xb5, 0x3d, 0x6e, 0x15, 0xc5, 0x61, 0x7b, 0xd2, 0x8e, 0x79, 0xe8, 86 | 0x48, 0x4b, 0x6e, 0x91, 0xca, 0xe9, 0x77, 0xe6, 0x0c, 0x29, 0xe8, 0xca, 0xbb, 0x12, 0x92, 0x90, 0x7f, 0xcf, 0x31, 0x06, 0xa7, 0x09, 0xc2, 0x6f, 0x0e, 0x11, 0xd5, 0x85, 0xbb, 0xe1, 0x4c, 0xd6, 0xf9, 0x5e, 0x78, 0xae, 0x63, 0xc4, 0xa0, 0x7a, 0xe8, 0x2d, 0x43, 0xf4, 0xcd, 0xf9, 0x9c, 0xf4, 0xaf, 0xd4, 0x60, 0xe9, 0xe7, 0x76, 0x8c, 0xd3, 0x9f, 0x0e, 0x91, 0x4c, 0x0f, 0x3d, 0xa3, 0x54, 0x07, 0x8b, 0xa3, 0x1b, 0xd2, 0x73, 0xe1, 0x22, 0x86, 0xa6, 0x40, 0x09, 0xb6, 0xb7, 0x77, 0xd6, 0xb0, 0x99, 0x63, 0x18, 0xec, 0x40, 0x69, 0xb9, 0xc4, 0x99, 0x2e, 0x97, 0x1f, 0xe7, 0x44, 0xcf, 0x5b, 0x5f, 0xc8, 0xec, 87 | 0x86, 0xee, 0xf6, 0xb7, 0xc7, 0x56, 0xee, 0x1e, 0x58, 0x3f, 0x75, 0xe4, 0xf0, 0x2e, 0x91, 0x93, 0xfb, 0x79, 0xe6, 0x93, 0xed, 0xfb, 0xce, 0x5d, 0x32, 0x77, 0xc4, 0x92, 0x7c, 0xeb, 0x2b, 0x34, 0xba, 0xba, 0xf9, 0x9e, 0xf8, 0xe6, 0xff, 0x2e, 0x1e, 0xf0, 0x71, 0x81, 0x2d, 0x4e, 0xd2, 0xee, 0x6d, 0x68, 0xda, 0xbc, 0xe1, 0xd4, 0xa4, 0xfc, 0x4f, 0x8c, 0xfd, 0xe4, 0x03, 0xdf, 0x25, 0xe6, 0x37, 0x61, 0xf8, 0xe0, 0x8d, 0xb5, 0x6f, 0x8c, 0xe3, 0x39, 0xf4, 0x35, 0xe1, 0x02, 0x4f, 0xf6, 0xf8, 0xca, 0x82, 0x93, 0x47, 0xf5, 0x12, 0xd9, 0x59, 0xea, 0xd5, 0xed, 0xfa, 0xd7, 0xcb, 0x04, 0xe0, 0x18, 0x39, 0x3d, 88 | 0x9c, 0x1b, 0x7f, 0xf1, 0xdb, 0x33, 0x64, 0x67, 0x62, 0x17, 0x33, 0xef, 0x7b, 0x9f, 0x92, 0xb8, 0x5b, 0xbe, 0xf4, 0xba, 0xb6, 0x74, 0xf1, 0xf3, 0xae, 0x60, 0x7e, 0x03, 0x77, 0xf9, 0x7e, 0x77, 0x3e, 0x94, 0xe5, 0x12, 0xfc, 0x9a, 0x54, 0x7c, 0xf0, 0xa5, 0x1c, 0x2f, 0xbf, 0x27, 0x7f, 0xfd, 0x93, 0xb8, 0x93, 0xa1, 0xda, 0x8f, 0x0b, 0xd0, 0x67, 0x52, 0xe8, 0x99, 0x3b, 0xd5, 0xf3, 0xe2, 0x27, 0xbf, 0x4d, 0xcc, 0xaf, 0x11, 0xe2, 0x7e, 0x19, 0xfa, 0xd8, 0x97, 0xfe, 0x42, 0x3a, 0x4f, 0x13, 0xf6, 0x0b, 0x79, 0xfc, 0xf1, 0x47, 0x08, 0xe4, 0x9b, 0x08, 0xee, 0x4b, 0x2a, 0xb8, 0xc8, 0xbc, 0x3c, 0xca, 0x3f, 89 | 0x87, 0xc0, 0xab, 0xcb, 0x60, 0x0e, 0x92, 0xd8, 0x3c, 0x6b, 0xf9, 0x3f, 0x00, 0xf4, 0x26, 0x8d, 0x79, 0xbe, 0xb7, 0x08, 0x9f, 0x5d, 0x4b, 0x40, 0xae, 0x63, 0x18, 0xd8, 0xc8, 0xaf, 0x81, 0xa8, 0x18, 0x07, 0x8a, 0x40, 0x09, 0x1c, 0x88, 0x07, 0x74, 0x88, 0x6e, 0x8a, 0xb7, 0xd5, 0x28, 0xa7, 0x0c, 0x74, 0x08, 0xbd, 0xcb, 0x0c, 0x0f, 0x32, 0x2a, 0xfb, 0x09, 0x41, 0x09, 0x24, 0xc1, 0x12, 0xdc, 0xb0, 0xfb, 0x43, 0x40, 0x15, 0x34, 0x3e, 0xea, 0x93, 0x8b, 0x2d, 0xa8, 0xb9, 0x8e, 0xd8, 0xb8, 0xc9, 0x89, 0x41, 0x00, 0x94, 0x8a, 0xba, 0x0b, 0x34, 0x1b, 0xd4, 0x41, 0x15, 0x43, 0x54, 0x39, 0x99, 0x42, 0x0c, 90 | 0xf7, 0x3b, 0x89, 0xfe, 0xa3, 0x97, 0x20, 0x24, 0x3f, 0x7b, 0x62, 0x8a, 0xb3, 0x43, 0x24, 0xb6, 0x7b, 0x0b, 0x02, 0x9c, 0x89, 0x13, 0x2c, 0x3e, 0x26, 0x0c, 0x3f, 0xb5, 0xd8, 0x3f, 0x2b, 0x03, 0x42, 0x11, 0x2c, 0x3f, 0x52, 0xb1, 0xbf, 0xb8, 0x98, 0xbd, 0x9b, 0x10, 0x02, 0x1c, 0x74, 0x88, 0x0e, 0x24, 0x92, 0xb5, 0x40, 0x02, 0xfa, 0xb0, 0x1c, 0xf2, 0x81, 0xc2, 0xde, 0xf3, 0xff, 0x96, 0xa9, 0x50, 0x3f, 0x9f, 0x1b, 0xbe, 0xe8, 0x53, 0xc1, 0x05, 0xa4, 0x09, 0xdd, 0x2b, 0x8a, 0x2a, 0x88, 0x36, 0xca, 0x0a, 0x43, 0x31, 0x24, 0x1b, 0xb5, 0x50, 0x26, 0x7a, 0xcb, 0x43, 0xfc, 0xc3, 0xc1, 0xe3, 0x73, 0x0a, 91 | 0xc8, 0x03, 0x8a, 0x1f, 0xb4, 0x9a, 0x39, 0xa4, 0x3c, 0x34, 0xc2, 0x11, 0x3c, 0x12, 0x40, 0x97, 0xd0, 0x82, 0xa0, 0xb8, 0xc4, 0xa1, 0x63, 0xc1, 0xa2, 0x00, 0x37, 0xac, 0x70, 0xb6, 0x9c, 0xb1, 0x3e, 0x42, 0x14, 0xb5, 0xb7, 0xa8, 0x3f, 0x03, 0x0a, 0xc5, 0xa5, 0xb8, 0xc0, 0x9c, 0x10, 0x3a, 0x35, 0xfc, 0x87, 0xc2, 0x2b, 0x45, 0x97, 0x18, 0x02, 0x38, 0xfc, 0x0a, 0xe8, 0x51, 0xbe, 0xe5, 0x93, 0xc2, 0xb5, 0x20, 0xbb, 0xb1, 0xb9, 0x0b, 0x7c, 0x8a, 0x3c, 0x24, 0x3c, 0x42, 0x8c, 0x70, 0x82, 0x40, 0x7c, 0x31, 0xd4, 0xb9, 0xc5, 0x50, 0xc1, 0x82, 0x7f, 0x98, 0x01, 0x5a, 0xfb, 0x8a, 0xf9, 0x93, 0x0a, 0x33, 92 | 0xda, 0xc4, 0x04, 0x22, 0x3e, 0x35, 0x24, 0xb3, 0x95, 0xe8, 0x3f, 0x47, 0x34, 0x0b, 0xef, 0xeb, 0x99, 0x63, 0x5c, 0x14, 0x2b, 0x21, 0x02, 0x58, 0x14, 0x0d, 0x67, 0x94, 0x8a, 0x33, 0xdc, 0x1e, 0x82, 0x5b, 0x8b, 0x03, 0xac, 0x3c, 0x57, 0x6c, 0x08, 0x36, 0x94, 0x89, 0x0f, 0xfc, 0xb6, 0xc1, 0xb8, 0x3b, 0xbf, 0x01, 0xbd, 0x72, 0xc9, 0xc5, 0x7f, 0xf0, 0x00, 0x66, 0x3c, 0x1b, 0xca, 0xf8, 0x21, 0x2b, 0xb4, 0xc0, 0xe7, 0x51, 0xc7, 0x86, 0xf8, 0x42, 0x99, 0xe0, 0xc7, 0x88, 0x60, 0x47, 0xb0, 0x88, 0x47, 0xd4, 0x91, 0x44, 0x2a, 0x01, 0xb8, 0x2d, 0x98, 0x23, 0xd2, 0x68, 0x3e, 0xc7, 0x20, 0x47, 0xda, 0x69, 93 | 0x3a, 0xc1, 0xfb, 0xc7, 0xb6, 0x51, 0x44, 0x0a, 0xe2, 0x2b, 0xab, 0xd0, 0x34, 0xfb, 0xf9, 0x3a, 0x8c, 0xb1, 0xb3, 0x88, 0x21, 0x00, 0xc7, 0xae, 0xa0, 0x44, 0xd5, 0x40, 0x47, 0x89, 0x0c, 0xbc, 0x69, 0x54, 0xc1, 0x8c, 0x8c, 0x27, 0x87, 0xe8, 0xc1, 0xbd, 0xd8, 0xc8, 0x09, 0x0a, 0xc9, 0x1c, 0x19, 0xbd, 0xf4, 0x8a, 0xc9, 0x9f, 0x40, 0x80, 0x28, 0xb0, 0x0d, 0x03, 0x9a, 0xc1, 0x8b, 0x38, 0xc4, 0x9a, 0xd8, 0x49, 0x75, 0xb3, 0x24, 0x87, 0xe0, 0xc2, 0xbd, 0x48, 0xc5, 0xe9, 0x49, 0xc8, 0x1c, 0x09, 0x89, 0x60, 0xc2, 0x47, 0x83, 0x78, 0x48, 0xd7, 0xc0, 0xc2, 0xbc, 0x91, 0x2b, 0x7f, 0x74, 0xc5, 0x4f, 0xfc, 94 | 0x89, 0x43, 0x09, 0x48, 0xa2, 0x74, 0xa6, 0xa3, 0xb4, 0x91, 0xa1, 0xf8, 0x81, 0x9a, 0x34, 0x89, 0xa6, 0xcc, 0xc9, 0xed, 0x81, 0xc4, 0x67, 0x6c, 0x0b, 0x75, 0x24, 0xc6, 0x00, 0x41, 0x00, 0x25, 0xbb, 0xa5, 0x9c, 0x2b, 0x95, 0x99, 0x14, 0x89, 0x1f, 0x20, 0xa0, 0x9b, 0x08, 0xa0, 0x18, 0x70, 0x42, 0xd3, 0xc3, 0x43, 0x23, 0xfc, 0xc5, 0xdb, 0x5b, 0x4a, 0xb0, 0x40, 0x80, 0xba, 0x14, 0x9e, 0x87, 0x73, 0x96, 0xb7, 0xe8, 0x48, 0x93, 0xf8, 0x00, 0x56, 0x42, 0x90, 0x88, 0x1c, 0x9b, 0x19, 0x83, 0x0b, 0x2a, 0xd4, 0xc3, 0xdb, 0xbb, 0xca, 0x0c, 0x71, 0x00, 0xbf, 0xb4, 0xc5, 0xbd, 0xcc, 0x0d, 0x71, 0xff, 0x44, 95 | 0x22, 0xda, 0x19, 0x4b, 0xa9, 0x38, 0x45, 0xb4, 0xc0, 0x41, 0x6c, 0x6c, 0x11, 0x07, 0x30, 0x4c, 0x73, 0xf2, 0x4a, 0x0c, 0x29, 0xa9, 0x9e, 0x6c, 0x9a, 0x91, 0x33, 0x22, 0x15, 0xa4, 0xc5, 0x16, 0xa9, 0x80, 0xd0, 0xf4, 0xa7, 0xe9, 0xda, 0x95, 0xdf, 0xa3, 0x24, 0xa4, 0x1a, 0x1b, 0x0e, 0xc3, 0xcb, 0xf7, 0xbb, 0x3d, 0x3e, 0xb1, 0x91, 0xcc, 0xf4, 0x27, 0xad, 0xac, 0x26, 0x9c, 0xba, 0xc3, 0x7e, 0x91, 0x4c, 0x97, 0x58, 0xc5, 0x8b, 0x7c, 0xba, 0xa1, 0x84, 0x10, 0x2d, 0x94, 0x8c, 0x2f, 0x68, 0x82, 0x18, 0x90, 0x93, 0x97, 0x2c, 0x11, 0xd8, 0x0c, 0x95, 0x83, 0x1c, 0x25, 0xbb, 0x19, 0xc8, 0xb8, 0xf0, 0xc5, 96 | 0x9a, 0x50, 0x4e, 0x8c, 0x53, 0xc9, 0xe2, 0xd8, 0xce, 0xff, 0x88, 0x01, 0x22, 0x2c, 0x88, 0xef, 0x3c, 0x8f, 0x7d, 0xb9, 0x95, 0x68, 0x74, 0x20, 0xd3, 0xec, 0x17, 0x7d, 0x4c, 0x41, 0xd5, 0xe3, 0xa2, 0x00, 0x21, 0x4f, 0xa6, 0xf8, 0x02, 0x19, 0x58, 0x01, 0x6c, 0x01, 0x13, 0xc0, 0x9c, 0x93, 0x9f, 0x14, 0x1e, 0xda, 0xc4, 0x18, 0xde, 0x94, 0x8a, 0x92, 0xc4, 0xcd, 0xa7, 0xab, 0xc6, 0xfd, 0xd0, 0xc6, 0xa2, 0xf8, 0x02, 0x1c, 0x88, 0x81, 0xd5, 0xcc, 0xcb, 0x06, 0x61, 0x4b, 0x2a, 0x49, 0xc6, 0xb2, 0xca, 0xce, 0x72, 0xa1, 0x8c, 0xe2, 0xbc, 0xc1, 0xad, 0xeb, 0x4e, 0xdf, 0x28, 0xd0, 0x90, 0xf8, 0x82, 0x1e, 97 | 0x88, 0x81, 0xe0, 0x5c, 0xd0, 0x06, 0x01, 0x3f, 0x37, 0xb1, 0x4c, 0x69, 0xa2, 0x19, 0xdb, 0xec, 0xc5, 0x66, 0x1a, 0x3c, 0x92, 0x59, 0x81, 0x26, 0xa0, 0xcc, 0x81, 0xa0, 0x4e, 0x8c, 0xf8, 0x82, 0x23, 0x88, 0x01, 0xc4, 0xf4, 0x0a, 0xe8, 0x2c, 0x91, 0x79, 0x4c, 0x92, 0x11, 0x95, 0x26, 0x00, 0xbd, 0x15, 0x13, 0x3d, 0xc9, 0x9f, 0xa8, 0x28, 0xca, 0x69, 0xa3, 0x4a, 0x99, 0x10, 0x31, 0xca, 0x7c, 0xd1, 0x88, 0x60, 0x4e, 0xe7, 0x84, 0xb7, 0x3c, 0xf1, 0x4d, 0xfe, 0x91, 0xad, 0x4c, 0xec, 0x17, 0x1f, 0x95, 0x0b, 0xf5, 0xec, 0xc2, 0x92, 0x3b, 0xcb, 0x8e, 0xb0, 0x92, 0xa5, 0xb4, 0x51, 0x87, 0xb0, 0xa1, 0xf0, 98 | 0x64, 0xa9, 0x32, 0x19, 0xcc, 0x41, 0x59, 0xae, 0x5d, 0xb4, 0x11, 0x29, 0xa5, 0x3b, 0xad, 0x2b, 0x39, 0x92, 0x31, 0x32, 0x66, 0x84, 0xce, 0x19, 0x8a, 0x01, 0xfe, 0xbc, 0xa8, 0x32, 0x69, 0xd2, 0xdc, 0x38, 0x52, 0x9c, 0x62, 0xcc, 0x52, 0x31, 0xd3, 0xdb, 0x04, 0xa0, 0xa1, 0xf3, 0x81, 0x85, 0x7b, 0x88, 0xd1, 0xec, 0x08, 0x82, 0xf9, 0x82, 0x1b, 0x88, 0x81, 0x08, 0xcd, 0x10, 0x3d, 0xe1, 0x46, 0xf0, 0xf0, 0x4f, 0xa6, 0xe2, 0xd1, 0x2c, 0xc9, 0x53, 0x3d, 0x9d, 0x89, 0x56, 0xe4, 0x37, 0xcf, 0x5c, 0x09, 0xb5, 0x64, 0x88, 0x96, 0xf4, 0x11, 0x0f, 0xb5, 0x91, 0x2d, 0x2d, 0x91, 0x06, 0x0d, 0x10, 0xd9, 0x54, 99 | 0xac, 0x46, 0xbd, 0x1b, 0xd7, 0x40, 0x53, 0x7e, 0x53, 0x50, 0x95, 0x00, 0x9d, 0x21, 0x35, 0xa0, 0xf8, 0x5c, 0x8f, 0x51, 0xac, 0x91, 0x8d, 0xff, 0x5a, 0x30, 0x51, 0x6d, 0x91, 0xeb, 0x9c, 0x0c, 0x2a, 0x2d, 0xb3, 0x84, 0xd3, 0x4d, 0x9a, 0x88, 0xb7, 0x5c, 0x2d, 0x40, 0x39, 0xb5, 0x11, 0x58, 0xfd, 0x30, 0x59, 0xc5, 0x90, 0x0c, 0x85, 0x8b, 0x04, 0x5b, 0x1d, 0x8c, 0x43, 0xce, 0x70, 0xd1, 0xb7, 0x22, 0xd4, 0x13, 0x40, 0x25, 0x0c, 0x77, 0x84, 0x31, 0x61, 0xe5, 0x8f, 0x34, 0x44, 0x0e, 0x1a, 0x95, 0x89, 0x3a, 0x15, 0xb3, 0x0b, 0xcd, 0x16, 0x85, 0x6b, 0x28, 0x40, 0x31, 0x4f, 0x0c, 0x41, 0xcf, 0xb0, 0xd2, 100 | 0x54, 0xee, 0xd0, 0x4f, 0xb1, 0xa1, 0x48, 0x7e, 0x83, 0x98, 0x42, 0x6a, 0xd1, 0x37, 0xe1, 0x54, 0x13, 0x39, 0x9a, 0x62, 0xbb, 0xb4, 0x2f, 0x18, 0x57, 0xe0, 0x08, 0x57, 0xa9, 0xb8, 0xd3, 0x0a, 0x55, 0xb7, 0x64, 0x2d, 0x09, 0xf2, 0x5c, 0xd7, 0x1a, 0x29, 0x81, 0x18, 0xe8, 0x81, 0x19, 0x0a, 0x96, 0x39, 0x35, 0x8b, 0x07, 0x4d, 0x35, 0x63, 0x7d, 0x0f, 0xc5, 0xb4, 0x0d, 0x6b, 0xad, 0x92, 0x34, 0x5d, 0x09, 0x6c, 0x7d, 0x45, 0xbb, 0xf9, 0xd7, 0x80, 0x7d, 0xd4, 0x60, 0x71, 0xd6, 0xae, 0xa8, 0xc3, 0x69, 0x9b, 0x57, 0xce, 0x88, 0xcc, 0x36, 0x42, 0x8a, 0x92, 0xd3, 0xd7, 0x83, 0x70, 0x4d, 0x89, 0xc0, 0xd4, 101 | 0x5b, 0x99, 0x58, 0x81, 0x85, 0x9e, 0x6f, 0xa5, 0x0e, 0x50, 0x35, 0x34, 0x84, 0xf5, 0x0d, 0x85, 0x65, 0x0e, 0x69, 0x45, 0x89, 0x8a, 0x4d, 0x35, 0x27, 0xb9, 0x44, 0x55, 0xa5, 0x92, 0x93, 0xa5, 0x59, 0xe1, 0x79, 0xd7, 0xdc, 0x28, 0x57, 0xd9, 0xaa, 0xb4, 0xdf, 0xf8, 0xd9, 0xa6, 0x10, 0xcf, 0x60, 0xcc, 0x57, 0x93, 0xa0, 0xd5, 0x0e, 0xea, 0xd7, 0x9f, 0xd0, 0x59, 0x9c, 0xe2, 0x2d, 0xd2, 0xc8, 0xd8, 0x92, 0x23, 0x53, 0xac, 0x00, 0x01, 0x73, 0x64, 0xa6, 0x52, 0x45, 0x57, 0x8f, 0xa0, 0x90, 0xd4, 0x8c, 0x58, 0xda, 0x94, 0x58, 0x01, 0x80, 0x45, 0x59, 0xc7, 0x7a, 0x5a, 0xce, 0x60, 0xd9, 0x7c, 0x13, 0x82, 102 | 0x8d, 0xb5, 0x8a, 0x7a, 0xfd, 0xd1, 0x9c, 0x20, 0xd6, 0x44, 0x4b, 0xd6, 0x91, 0xbd, 0x88, 0xae, 0x25, 0x88, 0xaf, 0x15, 0x82, 0xb0, 0xfd, 0xb0, 0x9e, 0x2d, 0x8c, 0xa8, 0x1d, 0xbc, 0xa2, 0x05, 0x8b, 0x12, 0xd8, 0x59, 0xdb, 0xb0, 0x55, 0x6b, 0x7c, 0xba, 0xd9, 0x50, 0xdb, 0xa5, 0xa4, 0x5b, 0xbb, 0xbd, 0x34, 0x95, 0x25, 0x0c, 0xb5, 0xed, 0xb5, 0xa7, 0xa4, 0xab, 0xad, 0x25, 0x10, 0x38, 0xfd, 0xd0, 0x69, 0x63, 0xc2, 0xa4, 0x05, 0x89, 0x8b, 0x1d, 0x88, 0x0d, 0xb0, 0x54, 0x8c, 0xc3, 0xdc, 0x93, 0xd0, 0xdb, 0x0c, 0x6c, 0x82, 0xcd, 0xd4, 0x4e, 0x01, 0xfa, 0x5b, 0xf1, 0x30, 0xd4, 0x2a, 0xc5, 0x38, 0xa8, 103 | 0x80, 0xdc, 0x90, 0xe8, 0xdc, 0x81, 0x28, 0x01, 0xab, 0x4d, 0x38, 0xbc, 0xf5, 0x8a, 0xb2, 0xcd, 0x3f, 0x37, 0xa5, 0x89, 0x18, 0x28, 0xdd, 0x3e, 0x2a, 0xc6, 0x9b, 0xcb, 0xa5, 0xa6, 0x90, 0x9b, 0xb0, 0x0b, 0x2d, 0x7e, 0xfb, 0x9f, 0xaf, 0x60, 0xff, 0x55, 0x15, 0x94, 0xd1, 0x01, 0x42, 0xde, 0x01, 0xa2, 0x56, 0x4c, 0x99, 0x5a, 0x84, 0x08, 0xd2, 0x8a, 0x5c, 0x08, 0x9c, 0xf5, 0x8a, 0x12, 0x18, 0xce, 0xfb, 0x6a, 0xdd, 0xa1, 0x85, 0xde, 0x32, 0x41, 0x5b, 0x25, 0xcc, 0xde, 0x8b, 0xe0, 0x55, 0xdd, 0x68, 0x57, 0x33, 0x1b, 0x5e, 0xa0, 0x08, 0xdf, 0xee, 0xed, 0x99, 0xab, 0x30, 0x5f, 0x8c, 0x90, 0x5b, 0x10, 104 | 0xa8, 0x5e, 0xd9, 0xda, 0x82, 0x24, 0x74, 0x9a, 0xe0, 0x4d, 0x5f, 0xdf, 0x81, 0x52, 0xa0, 0x28, 0xde, 0x8a, 0x94, 0x5b, 0x82, 0x40, 0x80, 0xf2, 0xa5, 0xb1, 0x99, 0xf8, 0xdc, 0xf9, 0x15, 0x1e, 0x97, 0xa5, 0x89, 0xe7, 0x35, 0x5f, 0x17, 0x84, 0xb7, 0xcd, 0xbd, 0x34, 0x24, 0x90, 0x81, 0x12, 0x48, 0x8f, 0x0a, 0x10, 0x20, 0xb8, 0x05, 0xe0, 0xc9, 0x61, 0x58, 0x41, 0x8c, 0x60, 0x36, 0x29, 0x59, 0xce, 0x80, 0xd6, 0x0a, 0xd6, 0x60, 0x4a, 0x41, 0xdf, 0x0d, 0xce, 0x88, 0x90, 0x2d, 0x0c, 0xcd, 0xf5, 0xe0, 0x11, 0xfe, 0x92, 0xb4, 0x25, 0x61, 0x8d, 0xe8, 0x81, 0xfc, 0x35, 0x08, 0x88, 0x3d, 0xe1, 0x16, 0x46, 105 | 0x37, 0xa0, 0x58, 0x5d, 0x17, 0x8e, 0x0d, 0x6d, 0x05, 0x8b, 0x0a, 0x20, 0x60, 0x19, 0xc6, 0xe1, 0xb5, 0x10, 0x60, 0xd4, 0xcd, 0xe1, 0x89, 0x70, 0x82, 0x0b, 0xe6, 0x0c, 0x3f, 0xec, 0xe1, 0x21, 0x5e, 0x8b, 0x0e, 0x26, 0x62, 0x8d, 0x00, 0xe1, 0xc2, 0xb0, 0xe1, 0x23, 0x66, 0xe2, 0xa9, 0xa8, 0x5f, 0xba, 0x6a, 0xe2, 0x90, 0x90, 0x5e, 0xd1, 0x78, 0xdd, 0x28, 0xb6, 0xe2, 0x9e, 0x98, 0x60, 0x95, 0x88, 0xe1, 0x2b, 0x26, 0xc8, 0x53, 0x1d, 0x0d, 0x07, 0x90, 0x5f, 0x2e, 0x16, 0x63, 0x88, 0xb8, 0x8a, 0xdc, 0x1d, 0x63, 0x0a, 0xba, 0x52, 0xe3, 0x80, 0xdd, 0x33, 0x16, 0x63, 0x23, 0x66, 0x09, 0x63, 0x90, 0xa8, 106 | 0x02, 0x4a, 0x25, 0x0d, 0x30, 0x7e, 0xc3, 0xe3, 0x33, 0xb6, 0x0a, 0xec, 0x65, 0xe2, 0x01, 0x1d, 0x0d, 0xf6, 0xad, 0x63, 0x2b, 0xb6, 0x0a, 0x16, 0xee, 0x63, 0x88, 0xf0, 0x01, 0x2f, 0x1e, 0x8d, 0xfd, 0x0d, 0xe4, 0x21, 0x0e, 0x5c, 0x95, 0x30, 0xe3, 0x43, 0x8e, 0x35, 0x1a, 0x3e, 0x0b, 0x46, 0x96, 0x61, 0xd1, 0x0d, 0x50, 0x48, 0x76, 0x89, 0xad, 0xf9, 0x0d, 0x4a, 0x6e, 0x61, 0x37, 0xc6, 0xe4, 0xa2, 0x48, 0xe2, 0xb3, 0x40, 0xe0, 0x4d, 0x4e, 0xdf, 0x44, 0x4e, 0x89, 0xb6, 0x05, 0x65, 0xf9, 0xe8, 0x5a, 0xb7, 0x2c, 0x65, 0xe8, 0xcd, 0xe2, 0x94, 0x68, 0xdf, 0x54, 0x7e, 0x88, 0x21, 0x70, 0x64, 0xb9, 0x74, 107 | 0xe5, 0x08, 0xd6, 0xe4, 0x59, 0x66, 0x8a, 0x1f, 0xf6, 0x2f, 0x5b, 0x4e, 0xdf, 0x5a, 0xd6, 0xe5, 0xa6, 0x90, 0x63, 0x5e, 0xee, 0x65, 0x57, 0xb4, 0x0a, 0x52, 0x0e, 0x66, 0x29, 0x6e, 0xb2, 0x62, 0x86, 0x5e, 0x51, 0x46, 0x89, 0x56, 0x46, 0x66, 0x8a, 0x98, 0xc5, 0xab, 0x08, 0xe3, 0x66, 0x2e, 0xbe, 0x26, 0x58, 0x65, 0xd3, 0x92, 0x66, 0xb8, 0x98, 0x30, 0x39, 0xbb, 0xe6, 0x04, 0xec, 0x81, 0xd3, 0x9d, 0xe4, 0x6d, 0x9e, 0x8a, 0x38, 0xd6, 0x3c, 0x70, 0x1e, 0x3c, 0x2d, 0xe0, 0x5b, 0xfb, 0x25, 0x67, 0xc7, 0x68, 0x48, 0xee, 0x4d, 0x67, 0x8c, 0x3b, 0x82, 0x6a, 0xb6, 0x89, 0x1b, 0x6e, 0xe7, 0xa2, 0x78, 0x4c, 108 | 0x76, 0x9e, 0x99, 0x67, 0x6f, 0xdb, 0x61, 0xac, 0xb8, 0x67, 0xca, 0x30, 0xe0, 0x93, 0x58, 0xe3, 0x7d, 0x9e, 0xb2, 0x29, 0x08, 0x5a, 0xc2, 0x00, 0xe8, 0xcc, 0xb0, 0xe4, 0x92, 0xe0, 0xdf, 0x82, 0xf6, 0xac, 0xb3, 0x1d, 0x8d, 0x45, 0x55, 0xe8, 0xb1, 0x48, 0x56, 0xcb, 0x7d, 0x68, 0xd9, 0x92, 0xdc, 0xc5, 0xd8, 0xe2, 0x89, 0x86, 0x0b, 0x1c, 0x98, 0x0d, 0x8c, 0x26, 0xaf, 0xd0, 0x2d, 0x0e, 0x8e, 0xb6, 0x0d, 0x58, 0x26, 0x2c, 0x90, 0xd6, 0xab, 0x6e, 0xfe, 0x29, 0x92, 0x86, 0x0d, 0x27, 0x40, 0xe9, 0xb0, 0x32, 0xe7, 0xfd, 0x60, 0xdc, 0x95, 0x86, 0x69, 0x31, 0x7b, 0x67, 0x08, 0xb9, 0xe8, 0x98, 0xb6, 0xe9, 109 | 0x5e, 0xcb, 0xe7, 0xa9, 0xba, 0xe9, 0x9d, 0xce, 0x37, 0x81, 0x46, 0x4a, 0x9e, 0x06, 0xea, 0x4b, 0x63, 0xe8, 0x24, 0xc1, 0xe3, 0xa0, 0x36, 0xea, 0x3f, 0xaa, 0xe8, 0x16, 0x01, 0xe4, 0xa3, 0x66, 0x6a, 0x7f, 0xf2, 0x68, 0x45, 0x59, 0xe4, 0xa6, 0x96, 0x6a, 0x48, 0x32, 0xe9, 0x50, 0x99, 0xea, 0xab, 0x2e, 0xab, 0x5b, 0x29, 0x6a, 0xac, 0xe6, 0xb9, 0x6a, 0x93, 0x81, 0xe7, 0x0c, 0x11, 0xe2, 0xae, 0x16, 0xeb, 0x3f, 0x52, 0x66, 0x0f, 0x61, 0xe6, 0xb1, 0x46, 0xeb, 0x9c, 0xf1, 0xe6, 0xad, 0x4c, 0xeb, 0xb6, 0xa6, 0x24, 0xc7, 0xfd, 0x90, 0x79, 0x49, 0x6a, 0xe3, 0x74, 0xeb, 0xba, 0x9e, 0x1e, 0xdd, 0x50, 0xcc, 110 | 0x81, 0x1e, 0x66, 0xbb, 0xe6, 0x6b, 0x24, 0x3a, 0x67, 0x2d, 0x81, 0xd9, 0x85, 0x00, 0x8b, 0xb3, 0xee, 0xeb, 0xc2, 0x06, 0x94, 0x10, 0x0a, 0x6c, 0x1a, 0xac, 0x0e, 0xc3, 0x66, 0x6c, 0xe8, 0xf9, 0x6a, 0x60, 0x4b, 0xec, 0x88, 0x00, 0x8b, 0xaf, 0xa5, 0xd8, 0xc6, 0xb6, 0xec, 0xb4, 0x79, 0x94, 0x9a, 0x7e, 0x88, 0x27, 0x26, 0x0c, 0x07, 0xa6, 0xcb, 0xa8, 0xbe, 0xec, 0xd0, 0x46, 0x90, 0xb5, 0x1e, 0x08, 0x07, 0xd0, 0x6c, 0x89, 0x80, 0xeb, 0xc5, 0x10, 0xa0, 0xba, 0x05, 0x6d, 0xd1, 0x76, 0x6d, 0xca, 0xb8, 0xd7, 0xe0, 0x38, 0xed, 0x8a, 0x90, 0x64, 0xee, 0x00, 0x01, 0xd2, 0x6d, 0xed, 0xd7, 0xd6, 0x6d, 0xb2, 111 | 0x94, 0x6d, 0xde, 0xce, 0x92, 0xb9, 0x6c, 0x02, 0xc4, 0xdd, 0xed, 0xe1, 0x1e, 0x0b, 0xc8, 0x30, 0xed, 0x22, 0x2e, 0x97, 0xa6, 0x25, 0xee, 0xe5, 0xf6, 0x18, 0xb0, 0xf1, 0xec, 0x29, 0xc8, 0x6d, 0xe6, 0x96, 0xee, 0xa5, 0x28, 0x6b, 0x69, 0xb9, 0xdf, 0xe9, 0x67, 0xc6, 0xee, 0xa2, 0xc8, 0x69, 0x81, 0xd9, 0xea, 0xec, 0xf6, 0x6e, 0x87, 0x78, 0xec, 0xc0, 0xfc, 0xee, 0xf1, 0xae, 0x44, 0xcf, 0x21, 0xef, 0xf3, 0x26, 0x43, 0xf3, 0x46, 0xef, 0xf5, 0xa6, 0x40, 0xf5, 0x66, 0xef, 0xf7, 0xee, 0x89, 0xd8, 0xe6, 0x45, 0xf8, 0xa6, 0x6f, 0x91, 0x98, 0x6b, 0x9a, 0xa9, 0xef, 0xfc, 0x0e, 0x1d, 0xda, 0x89, 0x6e, 0xfd, 112 | 0x1e, 0x6f, 0xdc, 0xf9, 0x67, 0xff, 0x16, 0xf0, 0x7f, 0xc0, 0x1d, 0x79, 0x1e, 0xf0, 0xf3, 0xc6, 0x9d, 0xc8, 0x3e, 0xf0, 0xfa, 0x1e, 0xb4, 0xc6, 0x59, 0xea, 0x05, 0xf7, 0xee, 0xbf, 0x6e, 0x9a, 0xeb, 0x86, 0x70, 0xec, 0x26, 0xed, 0x8d, 0x71, 0xe8, 0x0a, 0xff, 0xef, 0xb2, 0xd3, 0x87, 0x70, 0x01, 0xbf, 0xcb, 0x0e, 0xcf, 0x6f, 0x67, 0xf9, 0xd7, 0xe4, 0x8d, 0x01, 0xd6, 0xae, 0xa1, 0xfe, 0x06, 0x71, 0xe9, 0x4e, 0xed, 0xbd, 0x20, 0x71, 0x01, 0x0a, 0xee, 0x13, 0x47, 0xf1, 0x14, 0x97, 0xf1, 0x85, 0xd0, 0xeb, 0xb3, 0x70, 0x00, 0x03, 0x9f, 0xf1, 0x1c, 0x8f, 0x16, 0xd1, 0xb8, 0x71, 0x1d, 0xf7, 0x71, 0x48, 113 | 0xed, 0x0f, 0x1c, 0xff, 0xf1, 0x21, 0xcf, 0xae, 0xd7, 0x69, 0x02, 0x22, 0x47, 0x72, 0xa2, 0xe0, 0x6c, 0xdf, 0xa8, 0x80, 0x23, 0x4f, 0xf2, 0x27, 0x47, 0xe1, 0xf7, 0x68, 0x72, 0x28, 0xa7, 0x72, 0x8a, 0xa8, 0xed, 0xdf, 0x98, 0xf2, 0x2a, 0xd7, 0xf2, 0x1e, 0xc9, 0x90, 0x2c, 0xdf, 0x72, 0x2a, 0xdf, 0x5e, 0xd2, 0xf0, 0xf2, 0x2f, 0x47, 0x72, 0x0a, 0x85, 0x90, 0x31, 0x27, 0xf3, 0x1f, 0xbf, 0x70, 0xea, 0xd8, 0x00, 0xc2, 0x4e, 0xf3, 0xef, 0xbe, 0x6f, 0x95, 0x28, 0x81, 0x06, 0xdf, 0x8b, 0x36, 0x7f, 0xbc, 0x73, 0x1d, 0x5f, 0xf2, 0x93, 0x5a, 0x88, 0xed, 0xb6, 0x0a, 0x3b, 0xbf, 0x73, 0x19, 0xaf, 0x71, 0x9a, 114 | 0xe0, 0x29, 0x33, 0x37, 0x0b, 0x3f, 0xff, 0x73, 0x0d, 0xaf, 0xee, 0x42, 0x6c, 0x08, 0x09, 0xef, 0x0a, 0x43, 0x3f, 0xf4, 0x05, 0x0f, 0xef, 0x83, 0x50, 0xd8, 0x2f, 0x08, 0x74, 0x1b, 0x73, 0xf3, 0x47, 0x17, 0xed, 0xe6, 0x2d, 0x88, 0x8d, 0x9b, 0x82, 0x2b, 0xef, 0x0a, 0x10, 0x88, 0x71, 0x4c, 0x7f, 0xed, 0x30, 0x47, 0x39, 0x86, 0xa0, 0xe6, 0xc5, 0x00, 0x75, 0x51, 0xd7, 0x6f, 0x3e, 0x37, 0x09, 0x05, 0x3f, 0x02, 0x52, 0x67, 0x98, 0x50, 0x57, 0xf5, 0xc6, 0x5e, 0x73, 0x8f, 0xe0, 0x4d, 0x21, 0xa8, 0xf5, 0x9f, 0x48, 0xf5, 0x59, 0x67, 0xef, 0x38, 0xb7, 0xe6, 0x8a, 0x58, 0x71, 0xab, 0xd8, 0x75, 0x5e, 0x3f, 115 | 0xef, 0x5c, 0x47, 0x88, 0xd3, 0x26, 0x74, 0xb3, 0x18, 0x76, 0x62, 0xf7, 0xee, 0x4a, 0x5f, 0x09, 0x56, 0xf5, 0xf5, 0xab, 0x90, 0x68, 0x66, 0xd7, 0xed, 0x3c, 0x9f, 0x89, 0x1e, 0x73, 0xf6, 0xaf, 0x20, 0x66, 0x6a, 0x2f, 0xec, 0x6c, 0x4f, 0x89, 0xd9, 0x66, 0x08, 0x4a, 0x67, 0x8c, 0x6d, 0xe7, 0xf6, 0xba, 0xd6, 0xf4, 0xcc, 0xe5, 0x89, 0x4e, 0x1f, 0xf7, 0x72, 0x5f, 0xee, 0x48, 0xd7, 0xdf, 0xa1, 0x38, 0xf5, 0xc1, 0x00, 0x77, 0x76, 0x9c, 0xaf, 0xeb, 0x60, 0xd7, 0x5a, 0xa2, 0x78, 0x75, 0xa5, 0xa3, 0x77, 0xe6, 0x86, 0x75, 0x74, 0x2f, 0x0a, 0x5c, 0xff, 0x8a, 0x79, 0xdf, 0x77, 0xbb, 0x66, 0x75, 0x2c, 0x65, 116 | 0x0a, 0x7b, 0x97, 0xb6, 0x81, 0x9f, 0x6e, 0x63, 0x37, 0x08, 0x81, 0x9f, 0x88, 0x64, 0x37, 0x25, 0x85, 0xc7, 0xee, 0x68, 0xf7, 0x08, 0x0a, 0x9f, 0x08, 0x46, 0x5f, 0x49, 0x89, 0x67, 0x6e, 0x99, 0x35, 0xf8, 0xa9, 0xf0, 0xf6, 0x8e, 0x20, 0x77, 0x8d, 0xef, 0xeb, 0x8f, 0x37, 0x89, 0xe5, 0x75, 0x8a, 0x2f, 0xf0, 0x74, 0xc3, 0x13, 0xf9, 0xec, 0xb6, 0x76, 0xda, 0x58, 0x8b, 0x29, 0x98, 0xe0, 0x0c, 0x5f, 0xf9, 0xcb, 0x76, 0x77, 0x00, 0xe8, 0xee, 0x26, 0x50, 0xbf, 0x99, 0x27, 0xef, 0x73, 0x37, 0x79, 0xb5, 0xc8, 0x77, 0x83, 0x90, 0x79, 0x9d, 0x0f, 0xed, 0x7e, 0x9f, 0x76, 0xa6, 0x00, 0xf8, 0x91, 0x16, 0xfa, 117 | 0xef, 0x2e, 0x78, 0x60, 0x83, 0xb9, 0xa0, 0x4f, 0x7a, 0xd1, 0xee, 0xf7, 0x9e, 0x7f, 0xfa, 0x37, 0xa7, 0x78, 0x84, 0x28, 0xfa, 0xa9, 0x87, 0x72, 0x86, 0x1f, 0x41, 0xac, 0x60, 0x7f, 0x74, 0x92, 0xf7, 0x08, 0xa9, 0xe7, 0xfa, 0x2d, 0x6f, 0xf9, 0x94, 0xb8, 0xfa, 0xb0, 0x27, 0x72, 0xaf, 0x07, 0x30, 0xb3, 0xbf, 0x73, 0x4d, 0x17, 0x72, 0xb5, 0xef, 0x70, 0x77, 0x2f, 0x7b, 0xb7, 0xd7, 0x71, 0x84, 0xaf, 0x0f, 0xb9, 0x4f, 0x73, 0x58, 0x6f, 0x7b, 0xbb, 0x5f, 0xf0, 0xa5, 0x2f, 0x88, 0xb8, 0xd7, 0x7b, 0x19, 0xd7, 0xfa, 0xee, 0xfe, 0xfb, 0xf1, 0xae, 0x7a, 0x83, 0xc8, 0xfb, 0xc1, 0xf7, 0x6f, 0x8e, 0x37, 0x08, 118 | 0xbf, 0x47, 0x7c, 0x0d, 0x47, 0xfb, 0xf1, 0x6c, 0xfc, 0x2a, 0x1f, 0x7b, 0x45, 0x8f, 0x7c, 0x2a, 0xaf, 0xe6, 0x90, 0xaf, 0xfc, 0x05, 0x9f, 0xb8, 0xcc, 0x20, 0x27, 0xf3, 0xe0, 0x74, 0x78, 0xce, 0xd7, 0x70, 0x01, 0x16, 0x7c, 0xd0, 0x47, 0x6f, 0x83, 0xbb, 0x74, 0xd2, 0xcf, 0x6f, 0xfe, 0x74, 0x7a, 0xd4, 0x9f, 0x71, 0x54, 0x61, 0x7d, 0x3a, 0x0b, 0x08, 0x00, 0x3b, 119 | }; 120 | 121 | unsigned char const * MakeResourceBuffer() { return MAKE_RESOURCE_DATA; } 122 | unsigned MakeResourceSize() { return sizeof(MAKE_RESOURCE_DATA); } 123 | --------------------------------------------------------------------------------