├── 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 ├── 3DCube.cpp └── Image.cpp ├── .hgignore ├── README.md ├── debug.h ├── LICENSE └── handle.h /Samples/Image.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sdcb/dx/HEAD/Samples/Image.gif -------------------------------------------------------------------------------- /.hgignore: -------------------------------------------------------------------------------- 1 | syntax: glob 2 | 3 | Runner\* 4 | Samples\*.exe 5 | Samples\*.obj 6 | -------------------------------------------------------------------------------- /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 | cl /nologo /W4 /EHsc 3DCube.cpp 16 | 17 | del *.obj 18 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Project Description 2 | dx.h is a modern C++ library that aims to simplify DirectX-related development in C++. 3 | 4 | It’s designed to make DirectX programming elegant and fun without sacrificing performance. There’s no documentation yet, but a growing collection of samples should get you started. It focuses on Direct2D but also includes support for Direct3D, DXGI, DirectWrite, the Windows Imaging Component (WIC), and the Windows Animation Manager (WAM). 5 | 6 | dx.h is compatible with Windows 7, Windows 8, Windows 8.1 (both desktop and Windows Store projects), and Windows Phone 8. The Direct2D 1.0 subset should even work on Windows Vista. 7 | 8 | Want to learn about Direct2D and DirectComposition? Check out https://app.pluralsight.com/profile/author/kenny-kerr. 9 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Microsoft Public License (Ms-PL) 2 | 3 | This license governs use of the accompanying software. If you use the software, you accept this license. If you do not accept the license, do not use the software. 4 | 5 | 1. Definitions 6 | 7 | The terms "reproduce," "reproduction," "derivative works," and "distribution" have the same meaning here as under U.S. copyright law. 8 | 9 | A "contribution" is the original software, or any additions or changes to the software. 10 | 11 | A "contributor" is any person that distributes its contribution under this license. 12 | 13 | "Licensed patents" are a contributor's patent claims that read directly on its contribution. 14 | 15 | 2. Grant of Rights 16 | 17 | (A) Copyright Grant- Subject to the terms of this license, including the license conditions and limitations in section 3, each contributor grants you a non-exclusive, worldwide, royalty-free copyright license to reproduce its contribution, prepare derivative works of its contribution, and distribute its contribution or any derivative works that you create. 18 | 19 | (B) Patent Grant- Subject to the terms of this license, including the license conditions and limitations in section 3, each contributor grants you a non-exclusive, worldwide, royalty-free license under its licensed patents to make, have made, use, sell, offer for sale, import, and/or otherwise dispose of its contribution in the software or derivative works of the contribution in the software. 20 | 21 | 3. Conditions and Limitations 22 | 23 | (A) No Trademark License- This license does not grant you rights to use any contributors' name, logo, or trademarks. 24 | 25 | (B) If you bring a patent claim against any contributor over patents that you claim are infringed by the software, your patent license from such contributor to the software ends automatically. 26 | 27 | (C) If you distribute any portion of the software, you must retain all copyright, patent, trademark, and attribution notices that are present in the software. 28 | 29 | (D) If you distribute any portion of the software in source code form, you may do so only under this license by including a complete copy of this license with your distribution. If you distribute any portion of the software in compiled or object code form, you may only do so under a license that complies with this license. 30 | 31 | (E) The software is licensed "as-is." You bear the risk of using it. The contributors give no express warranties, guarantees or conditions. You may have additional consumer rights under your local laws which this license cannot change. To the extent permitted under your local laws, the contributors exclude the implied warranties of merchantability, fitness for a particular purpose and non-infringement. 32 | -------------------------------------------------------------------------------- /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/3DCube.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 | #include 14 | #include 15 | 16 | using namespace std; 17 | using namespace DirectX; 18 | using namespace KennyKerr; 19 | using namespace KennyKerr::Direct3D; 20 | using namespace KennyKerr::DirectWrite; 21 | 22 | Color const COLOR_CORNFLOWERBLUE(0.392156899f, 0.584313750f, 0.929411829f, 1.000000000f); 23 | 24 | struct ModelViewProjection 25 | { 26 | XMFLOAT4X4 model; 27 | XMFLOAT4X4 view; 28 | XMFLOAT4X4 projection; 29 | }; 30 | 31 | // Used to send per-vertex data to the vertex shader. 32 | struct VertexPositionColor 33 | { 34 | XMFLOAT3 pos; 35 | XMFLOAT3 color; 36 | }; 37 | 38 | static const char SimpleVS[] = R"( 39 | // A constant buffer that stores the three basic column-major matrices for composing geometry. 40 | cbuffer ModelViewProjectionConstantBuffer : register(b0) 41 | { 42 | matrix model; 43 | matrix view; 44 | matrix projection; 45 | }; 46 | 47 | // Per-vertex data used as input to the vertex shader. 48 | struct VertexShaderInput 49 | { 50 | float3 pos : POSITION; 51 | float3 color : COLOR0; 52 | }; 53 | 54 | // Per-pixel color data passed through the pixel shader. 55 | struct PixelShaderInput 56 | { 57 | float4 pos : SV_POSITION; 58 | float3 color : COLOR0; 59 | }; 60 | 61 | // Simple shader to do vertex processing on the GPU. 62 | PixelShaderInput main( VertexShaderInput input ) 63 | { 64 | PixelShaderInput output; 65 | float4 pos = float4(input.pos, 1.0f); 66 | 67 | // Transform the vertex position into projected space. 68 | pos = mul( pos, model ); 69 | pos = mul( pos, view ); 70 | pos = mul( pos, projection ); 71 | output.pos = pos; 72 | 73 | // Pass the color through without modification. 74 | output.color = input.color; 75 | 76 | return output; 77 | } 78 | )"; 79 | 80 | static char SimplePS[] = R"( 81 | // Per-pixel color data passed through the pixel shader. 82 | struct PixelShaderInput 83 | { 84 | float4 pos : SV_POSITION; 85 | float3 color : COLOR0; 86 | }; 87 | 88 | // A pass-through function for the (interpolated) color data. 89 | float4 main( PixelShaderInput input ) : SV_TARGET 90 | { 91 | return float4(input.color, 1.0f); 92 | } 93 | )"; 94 | 95 | static Direct3D::Device device; 96 | static Direct3D::DeviceContext context; 97 | static Direct3D::RenderTargetView renderTargetView; 98 | static Direct3D::DepthStencilView depthStencilView; 99 | static Direct3D::VertexShader vertexShader; 100 | static Direct3D::InputLayout inputLayout; 101 | static Direct3D::PixelShader pixelShader; 102 | static Direct3D::Buffer constantsBuffer; 103 | static Direct3D::Buffer vertexBuffer; 104 | static Direct3D::Buffer indexBuffer; 105 | ModelViewProjection constants; 106 | unsigned indexCount; 107 | 108 | static Dxgi::SwapChain1 swapChain; 109 | static Wam::Manager manager; 110 | static Wam::Variable variable; 111 | static Wam::SimpleTimer timer; 112 | 113 | static void CreateDeviceIndependentResources() 114 | { 115 | manager = Wam::CreateManager(); 116 | auto library = Wam::CreateTransitionLibrary(); 117 | 118 | auto transition = library.CreateAccelerateDecelerateTransition( 119 | 10.0, 120 | 100.0, 121 | 0.2, 122 | 0.8); 123 | 124 | variable = manager.CreateAnimationVariable(0.0); 125 | 126 | manager.ScheduleTransition(variable, 127 | transition, 128 | timer.GetTime()); 129 | } 130 | 131 | static void ReleaseDeviceIndependentResources() 132 | { 133 | variable.Reset(); 134 | manager.Reset(); 135 | } 136 | 137 | static string GetCompileTargetSuffix() 138 | { 139 | switch (device.GetFeatureLevel()) 140 | { 141 | case FeatureLevel::_9_1: 142 | case FeatureLevel::_9_2: 143 | return "_4_0_level_9_1"; 144 | 145 | case FeatureLevel::_9_3: 146 | return "_4_0_level_9_3"; 147 | 148 | case FeatureLevel::_10_0: 149 | return "_4_0"; 150 | 151 | case FeatureLevel::_10_1: 152 | return "_4_1"; 153 | 154 | case FeatureLevel::_11_0: 155 | return "_5_0"; 156 | } 157 | 158 | return "_5_1"; 159 | } 160 | 161 | static void CreateDeviceResources() 162 | { 163 | auto targetSuffix = GetCompileTargetSuffix(); 164 | 165 | auto vertexShaderCode = Direct3D::Compile(("vs" + targetSuffix).c_str(), SimpleVS, _countof(SimpleVS)); 166 | vertexShader = device.CreateVertexShader(vertexShaderCode.GetBufferPointer(), vertexShaderCode.GetBufferSize()); 167 | 168 | const InputElementDescription vertexDesc[] = 169 | { 170 | InputElementDescription{ Dxgi::Format::R32G32B32_FLOAT, "POSITION", 0, 0, 0 }, 171 | InputElementDescription{ Dxgi::Format::R32G32B32_FLOAT, "COLOR", 0, 0, 12 }, 172 | }; 173 | 174 | inputLayout = device.CreateInputLayout(vertexDesc, _countof(vertexDesc), vertexShaderCode.GetBufferPointer(), vertexShaderCode.GetBufferSize()); 175 | 176 | auto pixelShaderCode = Direct3D::Compile(("ps" + targetSuffix).c_str(), SimplePS, _countof(SimplePS)); 177 | pixelShader = device.CreatePixelShader(pixelShaderCode.GetBufferPointer(), pixelShaderCode.GetBufferSize()); 178 | 179 | constantsBuffer = device.CreateBuffer(BufferDescription{ sizeof(ModelViewProjection), BindFlag::ConstantBuffer }); 180 | 181 | const VertexPositionColor cubeVertices[] = 182 | { 183 | { XMFLOAT3(-0.5f, -0.5f, -0.5f), XMFLOAT3(0.0f, 0.0f, 0.0f) }, 184 | { XMFLOAT3(-0.5f, -0.5f, 0.5f), XMFLOAT3(0.0f, 0.0f, 1.0f) }, 185 | { XMFLOAT3(-0.5f, 0.5f, -0.5f), XMFLOAT3(0.0f, 1.0f, 0.0f) }, 186 | { XMFLOAT3(-0.5f, 0.5f, 0.5f), XMFLOAT3(0.0f, 1.0f, 1.0f) }, 187 | { XMFLOAT3(0.5f, -0.5f, -0.5f), XMFLOAT3(1.0f, 0.0f, 0.0f) }, 188 | { XMFLOAT3(0.5f, -0.5f, 0.5f), XMFLOAT3(1.0f, 0.0f, 1.0f) }, 189 | { XMFLOAT3(0.5f, 0.5f, -0.5f), XMFLOAT3(1.0f, 1.0f, 0.0f) }, 190 | { XMFLOAT3(0.5f, 0.5f, 0.5f), XMFLOAT3(1.0f, 1.0f, 1.0f) }, 191 | }; 192 | 193 | vertexBuffer = device.CreateBuffer(BufferDescription{ sizeof(cubeVertices), BindFlag::VertexBuffer }, SubresourceData{ &cubeVertices }); 194 | 195 | // Load mesh indices. Each trio of indices represents 196 | // a triangle to be rendered on the screen. 197 | // For example: 0,2,1 means that the vertices with indexes 198 | // 0, 2 and 1 from the vertex buffer compose the 199 | // first triangle of this mesh. 200 | const unsigned short cubeIndices[] = 201 | { 202 | 0, 2, 1, // -x 203 | 1, 2, 3, 204 | 205 | 4, 5, 6, // +x 206 | 5, 7, 6, 207 | 208 | 0, 1, 5, // -y 209 | 0, 5, 4, 210 | 211 | 2, 6, 7, // +y 212 | 2, 7, 3, 213 | 214 | 0, 4, 6, // -z 215 | 0, 6, 2, 216 | 217 | 1, 3, 7, // +z 218 | 1, 7, 5, 219 | }; 220 | 221 | indexCount = _countof(cubeIndices); 222 | indexBuffer = device.CreateBuffer(BufferDescription{ sizeof(cubeIndices), BindFlag::IndexBuffer }, SubresourceData{ &cubeIndices }); 223 | } 224 | 225 | static void ReleaseDevice() 226 | { 227 | device.Reset(); 228 | context.Reset(); 229 | renderTargetView.Reset(); 230 | swapChain.Reset(); 231 | } 232 | 233 | static void Draw() 234 | { 235 | manager.Update(timer.GetTime()); 236 | auto radians = static_cast(variable.GetValue()); 237 | 238 | XMStoreFloat4x4(&constants.model, XMMatrixTranspose(XMMatrixRotationY(radians))); 239 | 240 | context.ClearRenderTargetView(renderTargetView, COLOR_CORNFLOWERBLUE); 241 | context.ClearDepthStencilView(depthStencilView); 242 | 243 | context.UpdateSubresource(constantsBuffer, &constants); 244 | 245 | Buffer vertexBuffers[] ={ vertexBuffer }; 246 | unsigned strides[] ={ sizeof(VertexPositionColor) }; 247 | unsigned offsets[] ={ 0 }; 248 | context.IASetVertexBuffers(0, 1, vertexBuffers, strides, offsets); 249 | 250 | context.IASetIndexBuffer(indexBuffer); 251 | 252 | context.IASetPrimitiveTopology(PrimitiveTopology::TriangleList); 253 | 254 | context.IASetInputLayout(inputLayout); 255 | 256 | context.VSSetShader(vertexShader); 257 | 258 | context.VSSetConstantBuffers(0, 1, &constantsBuffer); 259 | 260 | context.PSSetShader(pixelShader); 261 | 262 | context.DrawIndexed(indexCount); 263 | } 264 | 265 | static void CreateDeviceSwapChainBitmap(Dxgi::SwapChain1 const & swapChain, 266 | DeviceContext const & context) 267 | { 268 | auto desc = swapChain.GetDescription1(); 269 | auto width = static_cast(desc.Width); 270 | auto height = static_cast(desc.Height); 271 | 272 | renderTargetView = device.CreateRenderTargetView(swapChain); 273 | 274 | auto depthStencil = device.CreateTexture2D(TextureDescription2D{ Dxgi::Format::D24_UNORM_S8_UINT, desc.Width, desc.Height, 1, 1, BindFlag::DepthStencil }); 275 | depthStencilView = device.CreateDepthStencilView(depthStencil, DepthStencilViewDescription{ DSVDimension::Texture2D }); 276 | 277 | context.OMSetRenderTargets(1, &renderTargetView, depthStencilView); 278 | 279 | ViewPort viewPorts( 0, 0, width, height ); 280 | context.RSSetViewports(1, &viewPorts); 281 | 282 | auto aspectRatio = width / height; 283 | auto fovAngleY = 70.0f * XM_PI / 180.0f; 284 | 285 | // Note that the OrientationTransform3D matrix is post-multiplied here 286 | // in order to correctly orient the scene to match the display orientation. 287 | // This post-multiplication step is required for any draw calls that are 288 | // made to the swap chain render target. For draw calls to other targets, 289 | // this transform should not be applied. 290 | 291 | // This sample makes use of a right-handed coordinate system using row-major matrices. 292 | auto perspectiveMatrix = XMMatrixPerspectiveFovRH(fovAngleY, aspectRatio, 0.01f, 100.0f); 293 | 294 | XMStoreFloat4x4(&constants.projection, XMMatrixTranspose(perspectiveMatrix)); 295 | 296 | // Eye is at (0,0.7,1.5), looking at point (0,-0.1,0) with the up-vector along the y-axis. 297 | const XMVECTORF32 eye = { 0.0f, 0.7f, 1.5f, 0.0f }; 298 | const XMVECTORF32 at = { 0.0f, -0.1f, 0.0f, 0.0f }; 299 | const XMVECTORF32 up = { 0.0f, 1.0f, 0.0f, 0.0f }; 300 | 301 | XMStoreFloat4x4(&constants.view, XMMatrixTranspose(XMMatrixLookAtRH(eye, at, up))); 302 | } 303 | 304 | static void Render(HWND window) 305 | { 306 | if (!context) 307 | { 308 | device = Direct3D::CreateDevice(); 309 | context = device.GetImmediateContext(); 310 | auto dxgi = device.GetDxgiFactory(); 311 | 312 | Dxgi::SwapChainDescription1 description; 313 | description.SwapEffect = Dxgi::SwapEffect::Discard; 314 | 315 | swapChain = dxgi.CreateSwapChainForHwnd(device, 316 | window, 317 | description); 318 | 319 | CreateDeviceSwapChainBitmap(swapChain, 320 | context); 321 | 322 | CreateDeviceResources(); 323 | } 324 | 325 | Draw(); 326 | 327 | auto const hr = swapChain.Present(); 328 | 329 | if (S_OK != hr && DXGI_STATUS_OCCLUDED != hr) 330 | { 331 | ReleaseDevice(); 332 | } 333 | } 334 | 335 | static void ResizeSwapChainBitmap() 336 | { 337 | context.OMSetRenderTargets(); 338 | renderTargetView.Reset(); 339 | depthStencilView.Reset(); 340 | 341 | if (S_OK == swapChain.ResizeBuffers()) 342 | { 343 | CreateDeviceSwapChainBitmap(swapChain, 344 | context); 345 | } 346 | else 347 | { 348 | ReleaseDevice(); 349 | } 350 | } 351 | 352 | int __stdcall wWinMain(HINSTANCE module, HINSTANCE, PWSTR, int) 353 | { 354 | ComInitialize com; 355 | 356 | CreateDeviceIndependentResources(); 357 | 358 | WNDCLASS wc = {}; 359 | wc.hCursor = LoadCursor(nullptr, IDC_ARROW); 360 | wc.hInstance = module; 361 | wc.lpszClassName = L"window"; 362 | wc.style = CS_HREDRAW | CS_VREDRAW; 363 | 364 | wc.lpfnWndProc = [] (HWND window, UINT message, WPARAM wparam, LPARAM lparam) -> LRESULT 365 | { 366 | if (WM_PAINT == message) 367 | { 368 | PAINTSTRUCT ps; 369 | VERIFY(BeginPaint(window, &ps)); 370 | Render(window); 371 | EndPaint(window, &ps); 372 | return 0; 373 | } 374 | 375 | if (WM_SIZE == message) 376 | { 377 | if (context && SIZE_MINIMIZED != wparam) 378 | { 379 | ResizeSwapChainBitmap(); 380 | Render(window); 381 | } 382 | 383 | return 0; 384 | } 385 | 386 | if (WM_DISPLAYCHANGE == message) 387 | { 388 | Render(window); 389 | return 0; 390 | } 391 | 392 | if (WM_DESTROY == message) 393 | { 394 | PostQuitMessage(0); 395 | return 0; 396 | } 397 | 398 | return DefWindowProc(window, message, wparam, lparam); 399 | }; 400 | 401 | RegisterClass(&wc); 402 | 403 | auto window = CreateWindow(wc.lpszClassName, L"dx.codeplex.com", WS_OVERLAPPEDWINDOW | WS_VISIBLE, 404 | CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, 405 | nullptr, nullptr, module, nullptr); 406 | ASSERT(window); 407 | 408 | MSG message; 409 | 410 | for (;;) 411 | { 412 | Render(window); 413 | 414 | while (PeekMessage(&message, 415 | nullptr, 416 | 0, 0, 417 | PM_REMOVE)) 418 | { 419 | DispatchMessage(&message); 420 | } 421 | 422 | if (WM_QUIT == message.message) 423 | { 424 | break; 425 | } 426 | } 427 | 428 | ReleaseDevice(); 429 | ReleaseDeviceIndependentResources(); 430 | } 431 | -------------------------------------------------------------------------------- /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 | --------------------------------------------------------------------------------