Add ktx
This commit is contained in:
@@ -0,0 +1,2 @@
|
||||
# Mac finder
|
||||
.DS_Store
|
||||
@@ -0,0 +1,3 @@
|
||||
# Single File Basis Universal Transcoder
|
||||
|
||||
Header and implementation generated using the [single file transcoder](../../single_file_transcoder) post-process script. Unlike the examples in that subproject here the transcoder header was kept as a seperate file (using the `-k` option, see the [README](../../single_file_transcoder/README.md)).
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,13 @@
|
||||
# Windows intermediate files
|
||||
bin/x86/
|
||||
bin/x64/
|
||||
|
||||
# VS project files
|
||||
*.vcxproj.user
|
||||
.vs/
|
||||
*.VC.db
|
||||
*.VC.opendb
|
||||
*.sdf
|
||||
*.suo
|
||||
*.opensdf
|
||||
*.aps
|
||||
@@ -0,0 +1,7 @@
|
||||
# Windows Previewers for Basis Universal
|
||||
|
||||
Build using Visual Studio from 2012 onwards. Enable from an Administrator console using `regsvr32 previewers.dll` (and remove using `regsvr32 /u previewers.dll`).
|
||||
|
||||

|
||||
|
||||
Work-in-progress. Prebuilt signed version and installer coming soon. Mac version to follow.
|
||||
@@ -0,0 +1,149 @@
|
||||
#include "basisthumbprovider.h"
|
||||
|
||||
#include <Shlwapi.h>
|
||||
|
||||
#include "basisu_transcoder.cpp"
|
||||
|
||||
#include "helpers.h"
|
||||
|
||||
#pragma comment(lib, "Shlwapi.lib")
|
||||
|
||||
using namespace basist;
|
||||
|
||||
BasisThumbProvider::BasisThumbProvider() : count(1), stream(NULL) {
|
||||
dprintf("BasisThumbProvider ctor");
|
||||
basisu_transcoder_init();
|
||||
}
|
||||
|
||||
BasisThumbProvider::~BasisThumbProvider() {
|
||||
dprintf("BasisThumbProvider **dtor**");
|
||||
if (stream) {
|
||||
stream->Release();
|
||||
stream = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
IFACEMETHODIMP BasisThumbProvider::QueryInterface(REFIID riid, void **ppv) {
|
||||
static const QITAB qit[] = {
|
||||
QITABENT(BasisThumbProvider, IThumbnailProvider),
|
||||
QITABENT(BasisThumbProvider, IInitializeWithStream),
|
||||
{0},
|
||||
};
|
||||
return QISearch(this, qit, riid, ppv);
|
||||
}
|
||||
|
||||
IFACEMETHODIMP_(ULONG) BasisThumbProvider::AddRef() {
|
||||
return InterlockedIncrement(&count);
|
||||
}
|
||||
|
||||
IFACEMETHODIMP_(ULONG) BasisThumbProvider::Release() {
|
||||
LONG refs = InterlockedDecrement(&count);
|
||||
if (refs == 0) {
|
||||
delete this;
|
||||
}
|
||||
return refs;
|
||||
}
|
||||
|
||||
IFACEMETHODIMP BasisThumbProvider::Initialize(IStream *pStream, DWORD grfMode) {
|
||||
dprintf("BasisThumbProvider::Initialize");
|
||||
HRESULT hr = HRESULT_FROM_WIN32(ERROR_ALREADY_INITIALIZED);
|
||||
if (!stream) {
|
||||
hr = pStream->QueryInterface(&stream);
|
||||
}
|
||||
return hr;
|
||||
}
|
||||
|
||||
// Note: thumbnails get written here: %LocalAppData%\Microsoft\Windows\Explorer
|
||||
IFACEMETHODIMP BasisThumbProvider::GetThumbnail(UINT cx, HBITMAP *phbmp, WTS_ALPHATYPE *pdwAlpha) {
|
||||
STATSTG stat;
|
||||
if (stream && SUCCEEDED(stream->Stat(&stat, STATFLAG_NONAME))) {
|
||||
if (void* data = malloc(static_cast<size_t>(stat.cbSize.LowPart))) {
|
||||
ULONG size = 0;
|
||||
if (SUCCEEDED(stream->Read(data, static_cast<ULONG>(stat.cbSize.LowPart), &size))) {
|
||||
if (size == stat.cbSize.LowPart) {
|
||||
basisu_transcoder transcoder;
|
||||
if (transcoder.validate_header(data, size)) {
|
||||
dprintf("Requested %d bytes for %dx%d image", size, cx, cx);
|
||||
basisu_image_info info;
|
||||
if (transcoder.get_image_info(data, size, info, 0)) {
|
||||
uint32_t level = 0;
|
||||
uint32_t descW = 0, descH = 0, blocks;
|
||||
for (uint32_t n = 0; n < info.m_total_levels; n++) {
|
||||
if (transcoder.get_image_level_desc(data, size, 0, n, descW, descH, blocks)) {
|
||||
dprintf("mipmap level w: %d, h: %d (blocks: %d)", descW, descH, blocks);
|
||||
if (cx >= std::max(descW, descH)) {
|
||||
level = n;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
basisu_file_info fileInfo;
|
||||
transcoder.get_file_info(data, size, fileInfo);
|
||||
if (transcoder.start_transcoding(data, size)) {
|
||||
uint32_t bytes = basis_get_uncompressed_bytes_per_pixel(transcoder_texture_format::cTFRGBA32) * descW * descH;
|
||||
dprintf("Started transcode (%dx%d @ %d bytes)", descW, descH, bytes);
|
||||
if (void* rgbBuf = malloc(bytes)) {
|
||||
// Note: the API expects total pixels here instead of blocks for cTFRGBA32
|
||||
if (transcoder.transcode_image_level(data, size, 0, level, rgbBuf, descW * descH, transcoder_texture_format::cTFRGBA32)) {
|
||||
dprintf("Decoded!!!!");
|
||||
*phbmp = rgbToBitmap(static_cast<uint32_t*>(rgbBuf), descW, descH, fileInfo.m_y_flipped);
|
||||
}
|
||||
delete rgbBuf;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
free(data);
|
||||
}
|
||||
}
|
||||
return (*phbmp) ? S_OK : S_FALSE;
|
||||
}
|
||||
|
||||
//********************************** Factory *********************************/
|
||||
|
||||
BasisThumbProviderFactory::BasisThumbProviderFactory() : count(1) {}
|
||||
|
||||
BasisThumbProviderFactory::~BasisThumbProviderFactory() {}
|
||||
|
||||
IFACEMETHODIMP BasisThumbProviderFactory::QueryInterface(REFIID riid, void **ppv) {
|
||||
static const QITAB qit[] = {
|
||||
QITABENT(BasisThumbProviderFactory, IClassFactory),
|
||||
{0},
|
||||
};
|
||||
return QISearch(this, qit, riid, ppv);
|
||||
}
|
||||
|
||||
IFACEMETHODIMP_(ULONG) BasisThumbProviderFactory::AddRef() {
|
||||
return InterlockedIncrement(&count);
|
||||
}
|
||||
|
||||
IFACEMETHODIMP_(ULONG) BasisThumbProviderFactory::Release() {
|
||||
LONG refs = InterlockedDecrement(&count);
|
||||
if (refs == 0) {
|
||||
delete this;
|
||||
}
|
||||
return refs;
|
||||
}
|
||||
|
||||
IFACEMETHODIMP BasisThumbProviderFactory::CreateInstance(IUnknown *pUnkOuter, REFIID riid, void **ppv) {
|
||||
HRESULT hr = CLASS_E_NOAGGREGATION;
|
||||
if (pUnkOuter == NULL) {
|
||||
hr = E_OUTOFMEMORY;
|
||||
if (BasisThumbProvider* provider = new (std::nothrow) BasisThumbProvider()) {
|
||||
hr = provider->QueryInterface(riid, ppv);
|
||||
provider->Release();
|
||||
}
|
||||
}
|
||||
return hr;
|
||||
}
|
||||
|
||||
IFACEMETHODIMP BasisThumbProviderFactory::LockServer(BOOL fLock) {
|
||||
if (fLock) {
|
||||
InterlockedIncrement(&count);
|
||||
} else {
|
||||
InterlockedDecrement(&count);
|
||||
}
|
||||
return S_OK;
|
||||
}
|
||||
@@ -0,0 +1,58 @@
|
||||
#pragma once
|
||||
|
||||
#include <Windows.h>
|
||||
#include <thumbcache.h>
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
class BasisThumbProvider : public IInitializeWithStream, public IThumbnailProvider
|
||||
{
|
||||
public:
|
||||
BasisThumbProvider();
|
||||
// IUnknown::QueryInterface()
|
||||
IFACEMETHODIMP QueryInterface(REFIID riid, void **ppv) override;
|
||||
// IUnknown::AddRef()
|
||||
IFACEMETHODIMP_(ULONG) AddRef() override;
|
||||
// IUnknown::Release()
|
||||
IFACEMETHODIMP_(ULONG) Release() override;
|
||||
|
||||
// IInitializeWithStream::Initialize()
|
||||
IFACEMETHODIMP Initialize(IStream *pStream, DWORD grfMode) override;
|
||||
|
||||
// IThumbnailProvider::GetThumbnail()
|
||||
IFACEMETHODIMP GetThumbnail(UINT cx, HBITMAP *phbmp, WTS_ALPHATYPE *pdwAlpha) override;
|
||||
|
||||
protected:
|
||||
virtual ~BasisThumbProvider();
|
||||
|
||||
private:
|
||||
LONG count;
|
||||
IStream* stream;
|
||||
};
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
class BasisThumbProviderFactory : public IClassFactory
|
||||
{
|
||||
public:
|
||||
BasisThumbProviderFactory();
|
||||
// IUnknown::QueryInterface()
|
||||
IFACEMETHODIMP QueryInterface(REFIID riid, void **ppv) override;
|
||||
// IUnknown::AddRef()
|
||||
IFACEMETHODIMP_(ULONG) AddRef() override;
|
||||
// IUnknown::Release()
|
||||
IFACEMETHODIMP_(ULONG) Release() override;
|
||||
|
||||
// IClassFactory::CreateInstance()
|
||||
IFACEMETHODIMP CreateInstance(IUnknown *pUnkOuter, REFIID riid, void **ppv) override;
|
||||
// IClassFactory::LockServer()
|
||||
IFACEMETHODIMP LockServer(BOOL fLock) override;
|
||||
|
||||
protected:
|
||||
virtual ~BasisThumbProviderFactory();
|
||||
|
||||
private:
|
||||
LONG count;
|
||||
};
|
||||
@@ -0,0 +1,55 @@
|
||||
#include "helpers.h"
|
||||
|
||||
#include <cassert>
|
||||
#include <cstdio>
|
||||
|
||||
void dprintf(char* const fmt, ...) {
|
||||
#ifdef _DEBUG
|
||||
va_list args;
|
||||
char buf[256];
|
||||
va_start(args, fmt);
|
||||
int len = vsnprintf_s(buf, sizeof buf, fmt, args);
|
||||
va_end (args);
|
||||
if (len > 0) {
|
||||
buf[sizeof buf - 1] = 0;
|
||||
OutputDebugStringA(buf);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
HBITMAP rgbToBitmap(const uint32_t* src, uint32_t const imgW, uint32_t const imgH, bool const flip) {
|
||||
/*
|
||||
* Creates a bitmap (a DIB) for the passed-in pixel size. Note that
|
||||
* negation of the height means top-down, origin upper-left, which is the
|
||||
* regular case.
|
||||
*
|
||||
* TODO: 16-bit variant instead?
|
||||
*/
|
||||
assert(src && imgW && imgH);
|
||||
BITMAPINFO bmi = {
|
||||
sizeof(bmi.bmiHeader)
|
||||
};
|
||||
bmi.bmiHeader.biWidth = imgW;
|
||||
bmi.bmiHeader.biHeight = (flip) ? imgH : -static_cast<int32_t>(imgH);
|
||||
bmi.bmiHeader.biPlanes = 1;
|
||||
bmi.bmiHeader.biBitCount = 32;
|
||||
bmi.bmiHeader.biCompression = BI_RGB;
|
||||
void* pixels = NULL;
|
||||
HBITMAP hbmp = CreateDIBSection(NULL, &bmi, DIB_RGB_COLORS, &pixels, NULL, 0);
|
||||
/*
|
||||
* RGBA to BGRA conversion.
|
||||
*
|
||||
* Note: we keep the alpha.
|
||||
*/
|
||||
if (hbmp && pixels) {
|
||||
uint32_t* dst = static_cast<uint32_t*>(pixels);
|
||||
for (unsigned xy = imgW * imgH; xy > 0; xy--) {
|
||||
uint32_t rgba = *src++;
|
||||
*dst++ = ((rgba & 0x000000FF) << 16)
|
||||
| ((rgba & 0xFF00FF00) )
|
||||
| ((rgba & 0x00FF0000) >> 16);
|
||||
}
|
||||
GdiFlush();
|
||||
}
|
||||
return hbmp;
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
#pragma once
|
||||
|
||||
#include <Windows.h>
|
||||
|
||||
#include <cstdint>
|
||||
|
||||
/**
|
||||
* Write a formatted string to the connected debugger (e.g. DebugView).
|
||||
*
|
||||
* \param[in] fmt content to write in \c printf format (followed by optional arguments)
|
||||
*/
|
||||
void dprintf(char* const fmt, ...);
|
||||
|
||||
/**
|
||||
* Converts raw RGBA data to a Windows BGRA bitmap.
|
||||
*
|
||||
* \param[in] src raw RGBA data
|
||||
* \param[in] imgW width of the decoded image
|
||||
* \param[in] imgH height of the decoded image
|
||||
* \return handle to a bitmap (ownership passed to the caller)
|
||||
*/
|
||||
HBITMAP rgbToBitmap(const uint32_t* src, uint32_t const imgW, uint32_t const imgH, bool const flip = false);
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 624 KiB |
@@ -0,0 +1,118 @@
|
||||
#include <Windows.h>
|
||||
#include <ShlObj.h>
|
||||
#include <tchar.h>
|
||||
|
||||
#include <new>
|
||||
|
||||
#include "basisthumbprovider.h"
|
||||
|
||||
#define SHELLEX_THUMBNAIL_CLSID _T("ShellEx\\{E357FCCD-A995-4576-B01F-234630154E96}")
|
||||
#define SHELLEX_PREVIEWER_CLSID _T("ShellEx\\{8895B1C6-B41F-4C1C-A562-0D564250836F}")
|
||||
|
||||
#define THUMBNAIL_HANDLER_TITLE _T("Basis Thumbnail Handler")
|
||||
#define THUMBNAIL_HANDLER_CLSID _T("{CD1F0EA0-283C-4D90-A41D-DEBD9207D91F}")
|
||||
|
||||
#define PREVIEWER_HANDLER_TITLE _T("Basis Previewer Handler")
|
||||
#define PREVIEWER_HANDLER_CLSID _T("{7B5DA275-3BB6-45AE-B0EB-E50187A28F13}")
|
||||
|
||||
#define FILE_EXTENSION _T(".basis")
|
||||
|
||||
static const CLSID CLSID_ThumbnailHandler = {0xCD1F0EA0, 0x283C, 0x4D90, {0xA4, 0x1D, 0xDE, 0xBD, 0x92, 0x07, 0xD9, 0x1F}};
|
||||
static const CLSID CLSID_PreviewerHandler = {0x7B5DA275, 0x3BB6, 0x45AE, {0xB0, 0xEB, 0xE5, 0x01, 0x87, 0xA2, 0x8F, 0x13}};
|
||||
|
||||
static TCHAR dllPath[MAX_PATH] = {0};
|
||||
|
||||
static LONG dllRefs = 0;
|
||||
|
||||
#ifndef BAIL_ON_FAIL
|
||||
#define BAIL_ON_FAIL(code) if (FAILED((hr = (code)))) return hr
|
||||
#endif
|
||||
|
||||
static HRESULT setRegKey(HKEY root, LPTSTR key, LPTSTR val, LPTSTR data) {
|
||||
HKEY hKey;
|
||||
HRESULT hr = HRESULT_FROM_WIN32(RegCreateKeyEx(root, key, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_SET_VALUE, NULL, &hKey, NULL));
|
||||
if (SUCCEEDED(hr)) {
|
||||
hr = HRESULT_FROM_WIN32(RegSetValueEx(hKey, val, 0, REG_SZ, reinterpret_cast<LPBYTE>(data), static_cast<DWORD>(_tcslen(data) * sizeof TCHAR)));
|
||||
RegCloseKey(hKey);
|
||||
}
|
||||
return hr;
|
||||
}
|
||||
|
||||
BOOL APIENTRY DllMain(HMODULE hInstDLL, DWORD reason, LPVOID /*reserved*/) {
|
||||
if (reason == DLL_PROCESS_ATTACH) {
|
||||
OutputDebugString(_T("DllMain"));
|
||||
if (GetModuleFileName(hInstDLL, dllPath, sizeof dllPath) == 0) {
|
||||
#ifdef _DEBUG
|
||||
OutputDebugString(_T("Failed to obtain DLL path"));
|
||||
#endif
|
||||
}
|
||||
DisableThreadLibraryCalls(hInstDLL);
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, void **ppv) {
|
||||
HRESULT hr = CLASS_E_CLASSNOTAVAILABLE;
|
||||
if (IsEqualCLSID(CLSID_ThumbnailHandler, rclsid)) {
|
||||
hr = E_OUTOFMEMORY;
|
||||
if (IClassFactory* factory = new (std::nothrow) BasisThumbProviderFactory()) {
|
||||
hr = factory->QueryInterface(riid, ppv);
|
||||
factory->Release();
|
||||
}
|
||||
}
|
||||
return hr;
|
||||
}
|
||||
|
||||
void DllAddRef() {
|
||||
#ifdef _DEBUG
|
||||
OutputDebugString(_T("DllAddRef"));
|
||||
#endif
|
||||
InterlockedIncrement(&dllRefs);
|
||||
}
|
||||
|
||||
void DllRelease() {
|
||||
#ifdef _DEBUG
|
||||
OutputDebugString(_T("DllRelease"));
|
||||
#endif
|
||||
InterlockedDecrement(&dllRefs);
|
||||
}
|
||||
|
||||
STDAPI DllCanUnloadNow() {
|
||||
#ifdef _DEBUG
|
||||
OutputDebugString(_T("DllCanUnloadNow"));
|
||||
#endif
|
||||
return (dllRefs == 0) ? S_OK : S_FALSE;
|
||||
}
|
||||
|
||||
// regsvr32 /s previewers.dll
|
||||
STDAPI DllRegisterServer() {
|
||||
HRESULT hr = E_FAIL;
|
||||
if (_tcslen(dllPath)) {
|
||||
BAIL_ON_FAIL(setRegKey(HKEY_LOCAL_MACHINE, _T("Software\\Classes\\CLSID\\") THUMBNAIL_HANDLER_CLSID, NULL, THUMBNAIL_HANDLER_TITLE));
|
||||
BAIL_ON_FAIL(setRegKey(HKEY_LOCAL_MACHINE, _T("Software\\Classes\\CLSID\\") THUMBNAIL_HANDLER_CLSID _T("\\InProcServer32"), NULL, dllPath));
|
||||
BAIL_ON_FAIL(setRegKey(HKEY_LOCAL_MACHINE, _T("Software\\Classes\\CLSID\\") THUMBNAIL_HANDLER_CLSID _T("\\InProcServer32"), _T("ThreadingModel"), _T("Apartment")));
|
||||
BAIL_ON_FAIL(setRegKey(HKEY_LOCAL_MACHINE, _T("Software\\Classes\\") FILE_EXTENSION _T("\\") SHELLEX_THUMBNAIL_CLSID, NULL, THUMBNAIL_HANDLER_CLSID));
|
||||
SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, NULL, NULL);
|
||||
}
|
||||
#ifdef _DEBUG
|
||||
if (SUCCEEDED(hr)) {
|
||||
OutputDebugString(_T("Previewer successfully registered"));
|
||||
}
|
||||
#endif
|
||||
return hr;
|
||||
}
|
||||
|
||||
// regsvr32 /s /u previewers.dll
|
||||
STDAPI DllUnregisterServer() {
|
||||
HRESULT hr = HRESULT_FROM_WIN32(RegDeleteTree(HKEY_LOCAL_MACHINE, _T("Software\\Classes\\CLSID\\") THUMBNAIL_HANDLER_CLSID));
|
||||
if (SUCCEEDED(hr)) {
|
||||
hr = HRESULT_FROM_WIN32(RegDeleteTree(HKEY_LOCAL_MACHINE, _T("Software\\Classes\\") FILE_EXTENSION _T("\\") SHELLEX_THUMBNAIL_CLSID));
|
||||
}
|
||||
#ifdef _DEBUG
|
||||
if (SUCCEEDED(hr)) {
|
||||
OutputDebugString(_T("Previewer successfully unregistered"));
|
||||
}
|
||||
#endif
|
||||
return hr;
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
EXPORTS
|
||||
DllGetClassObject PRIVATE
|
||||
DllCanUnloadNow PRIVATE
|
||||
DllRegisterServer PRIVATE
|
||||
DllUnregisterServer PRIVATE
|
||||
|
||||
@@ -0,0 +1,26 @@
|
||||
|
||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||
# Visual Studio 2012
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "previewers", "previewers.vcxproj", "{F3D4D2B1-20BF-44F2-B624-BE19C6911D4B}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|Win32 = Debug|Win32
|
||||
Debug|x64 = Debug|x64
|
||||
Release|Win32 = Release|Win32
|
||||
Release|x64 = Release|x64
|
||||
EndGlobalSection
|
||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||
{F3D4D2B1-20BF-44F2-B624-BE19C6911D4B}.Debug|Win32.ActiveCfg = Debug|Win32
|
||||
{F3D4D2B1-20BF-44F2-B624-BE19C6911D4B}.Debug|Win32.Build.0 = Debug|Win32
|
||||
{F3D4D2B1-20BF-44F2-B624-BE19C6911D4B}.Debug|x64.ActiveCfg = Debug|x64
|
||||
{F3D4D2B1-20BF-44F2-B624-BE19C6911D4B}.Debug|x64.Build.0 = Debug|x64
|
||||
{F3D4D2B1-20BF-44F2-B624-BE19C6911D4B}.Release|Win32.ActiveCfg = Release|Win32
|
||||
{F3D4D2B1-20BF-44F2-B624-BE19C6911D4B}.Release|Win32.Build.0 = Release|Win32
|
||||
{F3D4D2B1-20BF-44F2-B624-BE19C6911D4B}.Release|x64.ActiveCfg = Release|x64
|
||||
{F3D4D2B1-20BF-44F2-B624-BE19C6911D4B}.Release|x64.Build.0 = Release|x64
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
EndGlobalSection
|
||||
EndGlobal
|
||||
@@ -0,0 +1,187 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<ItemGroup Label="ProjectConfigurations">
|
||||
<ProjectConfiguration Include="Debug|Win32">
|
||||
<Configuration>Debug</Configuration>
|
||||
<Platform>Win32</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Debug|x64">
|
||||
<Configuration>Debug</Configuration>
|
||||
<Platform>x64</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Release|Win32">
|
||||
<Configuration>Release</Configuration>
|
||||
<Platform>Win32</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Release|x64">
|
||||
<Configuration>Release</Configuration>
|
||||
<Platform>x64</Platform>
|
||||
</ProjectConfiguration>
|
||||
</ItemGroup>
|
||||
<PropertyGroup Label="Globals">
|
||||
<ProjectGuid>{F3D4D2B1-20BF-44F2-B624-BE19C6911D4B}</ProjectGuid>
|
||||
<Keyword>Win32Proj</Keyword>
|
||||
<RootNamespace>previewers</RootNamespace>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
||||
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||
<UseDebugLibraries>true</UseDebugLibraries>
|
||||
<PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
|
||||
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||
<UseDebugLibraries>true</UseDebugLibraries>
|
||||
<PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
||||
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||
<UseDebugLibraries>false</UseDebugLibraries>
|
||||
<PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset>
|
||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
|
||||
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||
<UseDebugLibraries>false</UseDebugLibraries>
|
||||
<PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset>
|
||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
||||
<ImportGroup Label="ExtensionSettings">
|
||||
</ImportGroup>
|
||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<PropertyGroup Label="UserMacros" />
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
<LinkIncremental>true</LinkIncremental>
|
||||
<OutDir>$(SolutionDir)bin\$(PlatformShortName)\$(Configuration)\</OutDir>
|
||||
<IntDir>bin\$(PlatformShortName)\$(Configuration)\</IntDir>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||
<LinkIncremental>true</LinkIncremental>
|
||||
<IntDir>bin\$(PlatformShortName)\$(Configuration)\</IntDir>
|
||||
<OutDir>$(SolutionDir)bin\$(PlatformShortName)\$(Configuration)\</OutDir>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||
<LinkIncremental>false</LinkIncremental>
|
||||
<OutDir>$(SolutionDir)bin\$(PlatformShortName)\$(Configuration)\</OutDir>
|
||||
<IntDir>bin\$(PlatformShortName)\$(Configuration)\</IntDir>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||
<LinkIncremental>false</LinkIncremental>
|
||||
<IntDir>bin\$(PlatformShortName)\$(Configuration)\</IntDir>
|
||||
<OutDir>$(SolutionDir)bin\$(PlatformShortName)\$(Configuration)\</OutDir>
|
||||
</PropertyGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
<ClCompile>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<Optimization>Disabled</Optimization>
|
||||
<PreprocessorDefinitions>WIN32;_WIN32_WINNT=0x0601;_WINDOWS;_USRDLL;_ITERATOR_DEBUG_LEVEL=1;_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<SDLCheck>true</SDLCheck>
|
||||
<ExceptionHandling>false</ExceptionHandling>
|
||||
<RuntimeTypeInfo>false</RuntimeTypeInfo>
|
||||
<MinimalRebuild>false</MinimalRebuild>
|
||||
<AdditionalIncludeDirectories>..\lib;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<SubSystem>Windows</SubSystem>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<ModuleDefinitionFile>previewers.def</ModuleDefinitionFile>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||
<ClCompile>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<Optimization>Disabled</Optimization>
|
||||
<PreprocessorDefinitions>WIN32;_WIN32_WINNT=0x0601;_WINDOWS;_USRDLL;_ITERATOR_DEBUG_LEVEL=1;_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<SDLCheck>true</SDLCheck>
|
||||
<ExceptionHandling>false</ExceptionHandling>
|
||||
<RuntimeTypeInfo>false</RuntimeTypeInfo>
|
||||
<MinimalRebuild>false</MinimalRebuild>
|
||||
<AdditionalIncludeDirectories>..\lib;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<SubSystem>Windows</SubSystem>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<ModuleDefinitionFile>previewers.def</ModuleDefinitionFile>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||
<ClCompile>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<Optimization>Full</Optimization>
|
||||
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||
<PreprocessorDefinitions>WIN32;_WIN32_WINNT=0x0601;_WINDOWS;_USRDLL;_ITERATOR_DEBUG_LEVEL=0;NDEBUG;WIN32_LEAN_AND_MEAN;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<ExceptionHandling>false</ExceptionHandling>
|
||||
<RuntimeTypeInfo>false</RuntimeTypeInfo>
|
||||
<AdditionalIncludeDirectories>..\lib;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<SubSystem>Windows</SubSystem>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||
<OptimizeReferences>true</OptimizeReferences>
|
||||
<ModuleDefinitionFile>previewers.def</ModuleDefinitionFile>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||
<ClCompile>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<Optimization>Full</Optimization>
|
||||
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||
<PreprocessorDefinitions>WIN32;_WIN32_WINNT=0x0601;_WINDOWS;_USRDLL;_ITERATOR_DEBUG_LEVEL=0;NDEBUG;WIN32_LEAN_AND_MEAN;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<ExceptionHandling>false</ExceptionHandling>
|
||||
<RuntimeTypeInfo>false</RuntimeTypeInfo>
|
||||
<AdditionalIncludeDirectories>..\lib;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<SubSystem>Windows</SubSystem>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||
<OptimizeReferences>true</OptimizeReferences>
|
||||
<ModuleDefinitionFile>previewers.def</ModuleDefinitionFile>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="basisthumbprovider.h" />
|
||||
<ClInclude Include="..\lib\basisu_transcoder.h" />
|
||||
<ClInclude Include="helpers.h" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="basisthumbprovider.cpp" />
|
||||
<ClCompile Include="helpers.cpp" />
|
||||
<ClCompile Include="previewers.cpp">
|
||||
<CompileAsManaged Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</CompileAsManaged>
|
||||
<CompileAsManaged Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">false</CompileAsManaged>
|
||||
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
</PrecompiledHeader>
|
||||
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||
</PrecompiledHeader>
|
||||
<CompileAsManaged Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</CompileAsManaged>
|
||||
<CompileAsManaged Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</CompileAsManaged>
|
||||
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||
</PrecompiledHeader>
|
||||
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||
</PrecompiledHeader>
|
||||
</ClCompile>
|
||||
</ItemGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||
<ImportGroup Label="ExtensionTargets">
|
||||
</ImportGroup>
|
||||
</Project>
|
||||
@@ -0,0 +1,38 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<ItemGroup>
|
||||
<Filter Include="inc">
|
||||
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
|
||||
<Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions>
|
||||
</Filter>
|
||||
<Filter Include="src">
|
||||
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
|
||||
<Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
|
||||
</Filter>
|
||||
<Filter Include="res">
|
||||
<UniqueIdentifier>{f4f72237-4818-48a4-9192-33d12efece22}</UniqueIdentifier>
|
||||
</Filter>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="basisthumbprovider.h">
|
||||
<Filter>inc</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="helpers.h">
|
||||
<Filter>inc</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\lib\basisu_transcoder.h">
|
||||
<Filter>inc</Filter>
|
||||
</ClInclude>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="basisthumbprovider.cpp">
|
||||
<Filter>src</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="previewers.cpp">
|
||||
<Filter>src</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="helpers.cpp">
|
||||
<Filter>src</Filter>
|
||||
</ClCompile>
|
||||
</ItemGroup>
|
||||
</Project>
|
||||
@@ -0,0 +1,4 @@
|
||||
[*]
|
||||
insert_final_newline = true
|
||||
indent_style = tab
|
||||
indent_size = 4
|
||||
@@ -0,0 +1,2 @@
|
||||
# Don't commit the generated files
|
||||
basisu_transcoder.*
|
||||
@@ -0,0 +1,34 @@
|
||||
# Single File Basis Universal Transcoder
|
||||
|
||||
The script `combine.py` creates an _amalgamated_ C++ source file that can be used with or without `basisu_transcoder.h`. This _isn't_ a header-only file but it does offer a similar level of simplicity when integrating into a project.
|
||||
|
||||
Create `basisu_transcoder.cpp` from the transcoder sources using:
|
||||
```
|
||||
cd basis_universal/contrib/single_file_transcoder
|
||||
|
||||
python3 combine.py -r ../../transcoder -o basisu_transcoder.cpp basisu_transcoder-in.cpp
|
||||
```
|
||||
Then add the resulting file to your project (see the [example files](examples)).
|
||||
|
||||
If certain features will _never__ be enabled, e.g. `BASISD_SUPPORT_BC7_MODE6_OPAQUE_ONLY`, then `combine.py` can be told to exclude files with the `-x` option:
|
||||
```
|
||||
python3 combine.py -r ../../transcoder -x basisu_transcoder_tables_bc7_m6.inc -o basisu_transcoder.cpp basisu_transcoder-in.cpp
|
||||
```
|
||||
Excluding the BC7 mode 6 support reduces the generated source by 1.2MB, which is the choice taken in `basisu_transcoder-in.cpp` and used in the examples, with `create_transcoder.sh` running the above script, creating the final `basisu_transcoder.cpp`.
|
||||
|
||||
The combiner script can also generate separate amalgamated header and source files, using the `-k` option to keep the specified inline directive, and `-p` to keep the `#pragma once` directives in the header:
|
||||
```
|
||||
python3 combine.py -r ../../transcoder -o basisu_transcoder.h -p ../../transcoder/basisu_transcoder.h
|
||||
|
||||
python3 combine.py -r ../../transcoder -x basisu_transcoder_tables_bc7_m6.inc -k basisu_transcoder.h -o basisu_transcoder.cpp basisu_transcoder-in.cpp
|
||||
|
||||
```
|
||||
|
||||
Note: the amalgamation script was tested on Windows and Mac, requiring Python 3.8, with a fallback implementation as a shell script that will run on pretty much anything.
|
||||
|
||||
Why?
|
||||
----
|
||||
|
||||
Because all it now takes to support Basis Universal is the addition of a single file, two if using the header, with no configuration or further build steps (the out-of-the-box defaults tailor the included formats for various platforms).
|
||||
|
||||
The library is small, adding, for example, around 250kB to an Emscripten compiled WebAssembly project (with transcoding disabled for BC7 and ATC; disabling ASTC will remove a further 64kB, and `gzip` will approximately half the `wasm` file).
|
||||
@@ -0,0 +1,72 @@
|
||||
/**
|
||||
* Basis Universal single file library. Generated using:
|
||||
* \code
|
||||
* ./combine.py -r ../../transcoder -o basisu_transcoder.cpp basisu_transcoder-in.cpp
|
||||
* \endcode
|
||||
*/
|
||||
|
||||
/*
|
||||
* Transcoder build options for known platforms (iOS has ETC, ASTC and PVRTC;
|
||||
* Emscripten adds DXT to iOS's options; Android adds PVRTC2 to Emscripten's
|
||||
* options; other platforms build all except FXT1).
|
||||
*
|
||||
* See https://github.com/BinomialLLC/basis_universal#shrinking-the-transcoders-compiled-size
|
||||
*/
|
||||
#ifdef __APPLE__
|
||||
#include <TargetConditionals.h>
|
||||
#endif
|
||||
#if TARGET_OS_IPHONE
|
||||
#define BASISD_SUPPORT_DXT1 0
|
||||
#define BASISD_SUPPORT_DXT5A 0
|
||||
#endif
|
||||
#if TARGET_OS_IPHONE || defined(__EMSCRIPTEN__) || defined(__ANDROID__)
|
||||
#define BASISD_SUPPORT_BC7 0
|
||||
#define BASISD_SUPPORT_ATC 0
|
||||
#ifndef __ANDROID__
|
||||
#define BASISD_SUPPORT_PVRTC2 0
|
||||
#endif
|
||||
#endif
|
||||
#define BASISD_SUPPORT_FXT1 0
|
||||
|
||||
/*
|
||||
* KTX2 support disabled.
|
||||
*/
|
||||
#define BASISD_SUPPORT_KTX2 0
|
||||
|
||||
#include "basisu_transcoder.cpp"
|
||||
|
||||
/**
|
||||
* Collection of unused functions and const variables to work around \c
|
||||
* -Wunused-function and \c -Wunused-const-variable warnings.
|
||||
*
|
||||
* \todo LTO does its thing so any unused are removed but is there a better way?
|
||||
*/
|
||||
void _basisu_translib_dummy() {
|
||||
// These first ones are not used at all
|
||||
BASISU_NOTE_UNUSED(&basisu::byteswap16);
|
||||
BASISU_NOTE_UNUSED(&basisu::byteswap32);
|
||||
BASISU_NOTE_UNUSED(basisu::BASISU_PATH_SEPERATOR_CHAR);
|
||||
BASISU_NOTE_UNUSED(basisu::cHuffmanTotalSortedCodelengthCodes);
|
||||
BASISU_NOTE_UNUSED(basist::COLOR5_PAL0_DELTA_LO);
|
||||
BASISU_NOTE_UNUSED(basist::COLOR5_PAL0_DELTA_HI);
|
||||
BASISU_NOTE_UNUSED(basist::COLOR5_PAL1_DELTA_LO);
|
||||
BASISU_NOTE_UNUSED(basist::COLOR5_PAL1_DELTA_HI);
|
||||
BASISU_NOTE_UNUSED(basist::COLOR5_PAL2_DELTA_LO);
|
||||
BASISU_NOTE_UNUSED(basist::COLOR5_PAL2_DELTA_HI);
|
||||
BASISU_NOTE_UNUSED(basist::COLOR5_PAL2_PREV_HI);
|
||||
BASISU_NOTE_UNUSED(basist::COLOR5_PAL_MIN_DELTA_B_RUNLEN);
|
||||
BASISU_NOTE_UNUSED(basist::COLOR5_PAL_DELTA_5_RUNLEN_VLC_BITS);
|
||||
BASISU_NOTE_UNUSED(basist::NO_ENDPOINT_PRED_INDEX);
|
||||
BASISU_NOTE_UNUSED(basist::MAX_SELECTOR_HISTORY_BUF_SIZE);
|
||||
#if BASISD_SUPPORT_ETC2_EAC_A8
|
||||
// Unused but only when building with EAC
|
||||
BASISU_NOTE_UNUSED(basist::g_eac_modifier_table);
|
||||
#endif
|
||||
#if BASISD_SUPPORT_PVRTC1 == 0
|
||||
// Unused only when not building with PVRTC
|
||||
BASISU_NOTE_UNUSED(basist::g_etc1_inten_tables16);
|
||||
BASISU_NOTE_UNUSED(basist::g_etc1_inten_tables48);
|
||||
BASISU_NOTE_UNUSED(basist::g_etc_5_to_8);
|
||||
BASISU_NOTE_UNUSED(basist::g_etc1_x_selector_unpack);
|
||||
#endif
|
||||
}
|
||||
@@ -0,0 +1,234 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
# Tool to bundle multiple C/C++ source files, inlining any includes.
|
||||
#
|
||||
# Note: there are two types of exclusion options: the '-x' flag, which besides
|
||||
# excluding a file also adds an #error directive in place of the #include, and
|
||||
# the '-k' flag, which keeps the #include and doesn't inline the file. The
|
||||
# intended use cases are: '-x' for files that would normally be #if'd out, so
|
||||
# features that 100% won't be used in the amalgamated file, for which every
|
||||
# occurrence adds the error, and '-k' for headers that we wish to manually
|
||||
# include, such as a project's public API, for which occurrences after the first
|
||||
# are removed.
|
||||
#
|
||||
# Todo: the error handling could be better, which currently throws and halts
|
||||
# (which is functional just not very friendly).
|
||||
#
|
||||
# Author: Carl Woffenden, Numfum GmbH (this script is released under a CC0 license/Public Domain)
|
||||
|
||||
import argparse, re, sys
|
||||
|
||||
from pathlib import Path
|
||||
from typing import Any, List, Optional, Pattern, Set, TextIO
|
||||
|
||||
# Set of file roots when searching (equivalent to -I paths for the compiler).
|
||||
roots: Set[Path] = set()
|
||||
|
||||
# Set of (canonical) file Path objects to exclude from inlining (and not only
|
||||
# exclude but to add a compiler error directive when they're encountered).
|
||||
excludes: Set[Path] = set()
|
||||
|
||||
# Set of (canonical) file Path objects to keep as include directives.
|
||||
keeps: Set[Path] = set()
|
||||
|
||||
# Whether to keep the #pragma once directives (unlikely, since this will result
|
||||
# in a warning, but the option is there).
|
||||
keep_pragma: bool = False
|
||||
|
||||
# Destination file object (or stdout if no output file was supplied).
|
||||
destn:TextIO = sys.stdout
|
||||
|
||||
# Set of file Path objects previously inlined (and to ignore if reencountering).
|
||||
found: Set[Path] = set()
|
||||
|
||||
# Compiled regex Patern to handle the following type of file includes:
|
||||
#
|
||||
# #include "file"
|
||||
# #include "file"
|
||||
# # include "file"
|
||||
# #include "file"
|
||||
# #include "file" // comment
|
||||
# #include "file" // comment with quote "
|
||||
#
|
||||
# And all combinations of, as well as ignoring the following:
|
||||
#
|
||||
# #include <file>
|
||||
# //#include "file"
|
||||
# /*#include "file"*/
|
||||
#
|
||||
# We don't try to catch errors since the compiler will do this (and the code is
|
||||
# expected to be valid before processing) and we don't care what follows the
|
||||
# file (whether it's a valid comment or not, since anything after the quoted
|
||||
# string is ignored)
|
||||
#
|
||||
include_regex: Pattern = re.compile(r'^\s*#\s*include\s*"(.+?)"')
|
||||
|
||||
# Simple tests to prove include_regex's cases.
|
||||
#
|
||||
def test_match_include() -> bool:
|
||||
if (include_regex.match('#include "file"') and
|
||||
include_regex.match(' #include "file"') and
|
||||
include_regex.match('# include "file"') and
|
||||
include_regex.match('#include "file"') and
|
||||
include_regex.match('#include "file" // comment')):
|
||||
if (not include_regex.match('#include <file>') and
|
||||
not include_regex.match('//#include "file"') and
|
||||
not include_regex.match('/*#include "file"*/')):
|
||||
found = include_regex.match('#include "file" // "')
|
||||
if (found and found.group(1) == 'file'):
|
||||
print('#include match valid')
|
||||
return True
|
||||
return False
|
||||
|
||||
# Compiled regex Patern to handle "#pragma once" in various formats:
|
||||
#
|
||||
# #pragma once
|
||||
# #pragma once
|
||||
# # pragma once
|
||||
# #pragma once
|
||||
# #pragma once // comment
|
||||
#
|
||||
# Ignoring commented versions, same as include_regex.
|
||||
#
|
||||
pragma_regex: Pattern = re.compile(r'^\s*#\s*pragma\s*once\s*')
|
||||
|
||||
# Simple tests to prove pragma_regex's cases.
|
||||
#
|
||||
def text_match_pragma() -> bool:
|
||||
if (pragma_regex.match('#pragma once') and
|
||||
pragma_regex.match(' #pragma once') and
|
||||
pragma_regex.match('# pragma once') and
|
||||
pragma_regex.match('#pragma once') and
|
||||
pragma_regex.match('#pragma once // comment')):
|
||||
if (not pragma_regex.match('//#pragma once') and
|
||||
not pragma_regex.match('/*#pragma once*/')):
|
||||
print('#pragma once match valid')
|
||||
return True
|
||||
return False
|
||||
|
||||
# Finds 'file'. First the list of 'root' paths are searched, followed by the
|
||||
# the currently processing file's 'parent' path, returning a valid Path in
|
||||
# canonical form. If no match is found None is returned.
|
||||
#
|
||||
def resolve_include(file: str, parent: Optional[Path] = None) -> Optional[Path]:
|
||||
for root in roots:
|
||||
found = root.joinpath(file).resolve()
|
||||
if (found.is_file()):
|
||||
return found
|
||||
if (parent):
|
||||
found = parent.joinpath(file).resolve();
|
||||
else:
|
||||
found = Path(file)
|
||||
if (found.is_file()):
|
||||
return found
|
||||
return None
|
||||
|
||||
# Helper to resolve lists of files. 'file_list' is passed in from the arguments
|
||||
# and each entry resolved to its canonical path (like any include entry, either
|
||||
# from the list of root paths or the owning file's 'parent', which in this case
|
||||
# is case is the input file). The results are stored in 'resolved'.
|
||||
#
|
||||
def resolve_excluded_files(file_list: Optional[List[str]], resolved: Set[Path], parent: Optional[Path] = None) -> None:
|
||||
if (file_list):
|
||||
for filename in file_list:
|
||||
found = resolve_include(filename, parent)
|
||||
if (found):
|
||||
resolved.add(found)
|
||||
else:
|
||||
error_line(f'Warning: excluded file not found: {filename}')
|
||||
|
||||
# Writes 'line' to the open 'destn' (or stdout).
|
||||
#
|
||||
def write_line(line: str) -> None:
|
||||
print(line, file=destn)
|
||||
|
||||
# Logs 'line' to stderr. This is also used for general notifications that we
|
||||
# don't want to go to stdout (so the source can be piped).
|
||||
#
|
||||
def error_line(line: Any) -> None:
|
||||
print(line, file=sys.stderr)
|
||||
|
||||
# Inline the contents of 'file' (with any of its includes also inlined, etc.).
|
||||
#
|
||||
# Note: text encoding errors are ignored and replaced with ? when reading the
|
||||
# input files. This isn't ideal, but it's more than likely in the comments than
|
||||
# code and a) the text editor has probably also failed to read the same content,
|
||||
# and b) the compiler probably did too.
|
||||
#
|
||||
def add_file(file: Path, file_name: str = None) -> None:
|
||||
if (file.is_file()):
|
||||
if (not file_name):
|
||||
file_name = file.name
|
||||
error_line(f'Processing: {file_name}')
|
||||
with file.open('r', errors='replace') as opened:
|
||||
for line in opened:
|
||||
line = line.rstrip('\n')
|
||||
match_include = include_regex.match(line);
|
||||
if (match_include):
|
||||
# We have a quoted include directive so grab the file
|
||||
inc_name = match_include.group(1)
|
||||
resolved = resolve_include(inc_name, file.parent)
|
||||
if (resolved):
|
||||
if (resolved in excludes):
|
||||
# The file was excluded so error if the compiler uses it
|
||||
write_line(f'#error Using excluded file: {inc_name}')
|
||||
error_line(f'Excluding: {inc_name}')
|
||||
else:
|
||||
if (resolved not in found):
|
||||
# The file was not previously encountered
|
||||
found.add(resolved)
|
||||
if (resolved in keeps):
|
||||
# But the include was flagged to keep as included
|
||||
write_line(f'/**** *NOT* inlining {inc_name} ****/')
|
||||
write_line(line)
|
||||
error_line(f'Not inlining: {inc_name}')
|
||||
else:
|
||||
# The file was neither excluded nor seen before so inline it
|
||||
write_line(f'/**** start inlining {inc_name} ****/')
|
||||
add_file(resolved, inc_name)
|
||||
write_line(f'/**** ended inlining {inc_name} ****/')
|
||||
else:
|
||||
write_line(f'/**** skipping file: {inc_name} ****/')
|
||||
else:
|
||||
# The include file didn't resolve to a file
|
||||
write_line(f'#error Unable to find: {inc_name}')
|
||||
error_line(f'Error: Unable to find: {inc_name}')
|
||||
else:
|
||||
# Skip any 'pragma once' directives, otherwise write the source line
|
||||
if (keep_pragma or not pragma_regex.match(line)):
|
||||
write_line(line)
|
||||
else:
|
||||
error_line(f'Error: Invalid file: {file}')
|
||||
|
||||
# Start here
|
||||
parser = argparse.ArgumentParser(description='Amalgamate Tool', epilog=f'example: {sys.argv[0]} -r ../my/path -r ../other/path -o out.c in.c')
|
||||
parser.add_argument('-r', '--root', action='append', type=Path, help='file root search path')
|
||||
parser.add_argument('-x', '--exclude', action='append', help='file to completely exclude from inlining')
|
||||
parser.add_argument('-k', '--keep', action='append', help='file to exclude from inlining but keep the include directive')
|
||||
parser.add_argument('-p', '--pragma', action='store_true', default=False, help='keep any "#pragma once" directives (removed by default)')
|
||||
parser.add_argument('-o', '--output', type=argparse.FileType('w'), help='output file (otherwise stdout)')
|
||||
parser.add_argument('input', type=Path, help='input file')
|
||||
args = parser.parse_args()
|
||||
|
||||
# Fail early on an invalid input (and store it so we don't recurse)
|
||||
args.input = args.input.resolve(strict=True)
|
||||
found.add(args.input)
|
||||
|
||||
# Resolve all of the root paths upfront (we'll halt here on invalid roots)
|
||||
if (args.root):
|
||||
for path in args.root:
|
||||
roots.add(path.resolve(strict=True))
|
||||
|
||||
# The remaining params: so resolve the excluded files and #pragma once directive
|
||||
resolve_excluded_files(args.exclude, excludes, args.input.parent)
|
||||
resolve_excluded_files(args.keep, keeps, args.input.parent)
|
||||
keep_pragma = args.pragma;
|
||||
|
||||
# Then recursively process the input file
|
||||
try:
|
||||
if (args.output):
|
||||
destn = args.output
|
||||
add_file(args.input)
|
||||
finally:
|
||||
if (not destn):
|
||||
destn.close()
|
||||
@@ -0,0 +1,166 @@
|
||||
#!/bin/sh -e
|
||||
|
||||
# Tool to bundle multiple C/C++ source files, inlining any includes.
|
||||
#
|
||||
# Note: this POSIX-compliant script is many times slower than the original bash
|
||||
# implementation (due to the grep calls) but it runs and works everywhere.
|
||||
#
|
||||
# TODO: ROOTS, FOUND, etc., as arrays (since they fail on paths with spaces)
|
||||
# TODO: revert to Bash-only regex (the grep ones being too slow)
|
||||
#
|
||||
# Script released under a CC0 license.
|
||||
|
||||
# Common file roots
|
||||
ROOTS="."
|
||||
|
||||
# -x option excluded includes
|
||||
XINCS=""
|
||||
|
||||
# -k option includes to keep as include directives
|
||||
KINCS=""
|
||||
|
||||
# Files previously visited
|
||||
FOUND=""
|
||||
|
||||
# Optional destination file (empty string to write to stdout)
|
||||
DESTN=""
|
||||
|
||||
# Whether the "#pragma once" directives should be written to the output
|
||||
PONCE=0
|
||||
|
||||
# Prints the script usage then exits
|
||||
usage() {
|
||||
echo "Usage: $0 [-r <path>] [-x <header>] [-k <header>] [-o <outfile>] infile"
|
||||
echo " -r file root search path"
|
||||
echo " -x file to completely exclude from inlining"
|
||||
echo " -k file to exclude from inlining but keep the include directive"
|
||||
echo " -p keep any '#pragma once' directives (removed by default)"
|
||||
echo " -o output file (otherwise stdout)"
|
||||
echo "Example: $0 -r ../my/path - r ../other/path -o out.c in.c"
|
||||
exit 1
|
||||
}
|
||||
|
||||
# Tests that the grep implementation works as expected (older OSX grep fails)
|
||||
test_grep() {
|
||||
if ! echo '#include "foo"' | grep -Eq '^\s*#\s*include\s*".+"'; then
|
||||
echo "Aborting: the grep implementation fails to parse include lines"
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
# Tests if list $1 has item $2 (returning zero on a match)
|
||||
list_has_item() {
|
||||
if echo "$1" | grep -Eq "(^|\s*)$2(\$|\s*)"; then
|
||||
return 0
|
||||
else
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
# Adds a new line with the supplied arguments to $DESTN (or stdout)
|
||||
write_line() {
|
||||
if [ -n "$DESTN" ]; then
|
||||
printf '%s\n' "$@" >> "$DESTN"
|
||||
else
|
||||
printf '%s\n' "$@"
|
||||
fi
|
||||
}
|
||||
|
||||
# Adds the contents of $1 with any of its includes inlined
|
||||
add_file() {
|
||||
# Match the path
|
||||
local file=
|
||||
for root in $ROOTS; do
|
||||
if [ -f "$root/$1" ]; then
|
||||
file="$root/$1"
|
||||
fi
|
||||
done
|
||||
if [ -n "$file" ]; then
|
||||
if [ -n "$DESTN" ]; then
|
||||
# Log but only if not writing to stdout
|
||||
echo "Processing: $file"
|
||||
fi
|
||||
# Read the file
|
||||
local line=
|
||||
while IFS= read -r line; do
|
||||
if echo "$line" | grep -Eq '^\s*#\s*include\s*".+"'; then
|
||||
# We have an include directive so strip the (first) file
|
||||
local inc=$(echo "$line" | grep -Eo '".*"' | grep -Eo '\w*(\.?\w+)+' | head -1)
|
||||
if list_has_item "$XINCS" "$inc"; then
|
||||
# The file was excluded so error if the source attempts to use it
|
||||
write_line "#error Using excluded file: $inc"
|
||||
else
|
||||
if ! list_has_item "$FOUND" "$inc"; then
|
||||
# The file was not previously encountered
|
||||
FOUND="$FOUND $inc"
|
||||
if list_has_item "$KINCS" "$inc"; then
|
||||
# But the include was flagged to keep as included
|
||||
write_line "/**** *NOT* inlining $inc ****/"
|
||||
write_line "$line"
|
||||
else
|
||||
# The file was neither excluded nor seen before so inline it
|
||||
write_line "/**** start inlining $inc ****/"
|
||||
add_file "$inc"
|
||||
write_line "/**** ended inlining $inc ****/"
|
||||
fi
|
||||
else
|
||||
write_line "/**** skipping file: $inc ****/"
|
||||
fi
|
||||
fi
|
||||
else
|
||||
# Skip any 'pragma once' directives, otherwise write the source line
|
||||
local write=$PONCE
|
||||
if [ $write -eq 0 ]; then
|
||||
if echo "$line" | grep -Eqv '^\s*#\s*pragma\s*once\s*'; then
|
||||
write=1
|
||||
fi
|
||||
fi
|
||||
if [ $write -ne 0 ]; then
|
||||
write_line "$line"
|
||||
fi
|
||||
fi
|
||||
done < "$file"
|
||||
else
|
||||
write_line "#error Unable to find \"$1\""
|
||||
fi
|
||||
}
|
||||
|
||||
while getopts ":r:x:k:po:" opts; do
|
||||
case $opts in
|
||||
r)
|
||||
ROOTS="$ROOTS $OPTARG"
|
||||
;;
|
||||
x)
|
||||
XINCS="$XINCS $OPTARG"
|
||||
;;
|
||||
k)
|
||||
KINCS="$KINCS $OPTARG"
|
||||
;;
|
||||
p)
|
||||
PONCE=1
|
||||
;;
|
||||
o)
|
||||
DESTN="$OPTARG"
|
||||
;;
|
||||
*)
|
||||
usage
|
||||
;;
|
||||
esac
|
||||
done
|
||||
shift $((OPTIND-1))
|
||||
|
||||
if [ -n "$1" ]; then
|
||||
if [ -f "$1" ]; then
|
||||
if [ -n "$DESTN" ]; then
|
||||
printf "" > "$DESTN"
|
||||
fi
|
||||
test_grep
|
||||
add_file $1
|
||||
else
|
||||
echo "Input file not found: \"$1\""
|
||||
exit 1
|
||||
fi
|
||||
else
|
||||
usage
|
||||
fi
|
||||
exit 0
|
||||
@@ -0,0 +1,41 @@
|
||||
#!/bin/sh
|
||||
|
||||
# Temporary compiled binary
|
||||
OUT_FILE="tempbin"
|
||||
|
||||
echo "Amalgamating files... this can take a while"
|
||||
# Use the faster Python script if we have 3.8 or higher
|
||||
if python3 -c 'import sys; assert sys.version_info >= (3,8)' 2>/dev/null; then
|
||||
./combine.py -r ../../transcoder -o basisu_transcoder.cpp basisu_transcoder-in.cpp
|
||||
else
|
||||
./combine.sh -r ../../transcoder -o basisu_transcoder.cpp basisu_transcoder-in.cpp
|
||||
fi
|
||||
# Did combining work?
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "Combine script: FAILED"
|
||||
exit 1
|
||||
fi
|
||||
echo "Combine script: PASSED"
|
||||
|
||||
# Compile the generated output
|
||||
which cc > /dev/null
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "(Skipping compile test)"
|
||||
else
|
||||
cc -lm -std=c++11 -lstdc++ -Wall -Wextra -Werror -Os -g0 -fno-exceptions -fno-rtti -o $OUT_FILE examples/simple.cpp
|
||||
# Did compilation work?
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "Compiling simple.cpp: FAILED"
|
||||
exit 1
|
||||
fi
|
||||
# Run then delete the compiled output
|
||||
./$OUT_FILE
|
||||
retVal=$?
|
||||
rm -f $OUT_FILE
|
||||
# Did the test work?
|
||||
if [ $retVal -ne 0 ]; then
|
||||
echo "Running simple.cpp: FAILED"
|
||||
exit 1
|
||||
fi
|
||||
echo "Running simple.cpp: PASSED"
|
||||
fi
|
||||
@@ -0,0 +1,7 @@
|
||||
# Single File Basis Universal Examples
|
||||
|
||||
The examples `#include` the generated `basisu_transcoder.cpp` directly but work equally as well when including `basisu_transcoder.h` and compiling the amalgamated source separately.
|
||||
|
||||
`emscripten.cpp` is a bare-bones [Emscripten](https://github.com/emscripten-core/emscripten) compiled WebGL demo picking the best transcoder format for the sample texture (see the [original PNG image](testcard.png)).
|
||||
|
||||
The example files in this directory are released under a [Creative Commons Zero license](https://creativecommons.org/publicdomain/zero/1.0/).
|
||||
@@ -0,0 +1,568 @@
|
||||
/**
|
||||
* \file emscripten.cpp
|
||||
* Emscripten example of using the single-file \c basisu_transcoder.cpp. Draws
|
||||
* a rotating textured quad with data from the in-line compressed textures.
|
||||
* \n
|
||||
* Compile using:
|
||||
* \code
|
||||
* export "CC_FLAGS=-std=c++11 -Wall -Wextra -Werror -Os -g0 -flto --llvm-lto 3 -fno-exceptions -fno-rtti -lGL -DNDEBUG=1"
|
||||
* export "EM_FLAGS=-s ENVIRONMENT=web -s WASM=1 --shell-file shell.html --closure 1"
|
||||
* emcc $CC_FLAGS $EM_FLAGS -o out.html emscripten.cpp
|
||||
* \endcode
|
||||
* Alternatively include \c basisu_transcoder.h and compile \c
|
||||
* basisu_transcoder.cpp separately (the resulting binary is exactly the same
|
||||
* size):
|
||||
* \code
|
||||
* emcc $CC_FLAGS $EM_FLAGS -o out.html ../basisu_transcoder.cpp emscripten.cpp
|
||||
* \encode
|
||||
* To determine the WebAssembly size without the transcoder comment the \c
|
||||
* basisu_transcoder.cpp include (which stubs the texture creation).
|
||||
* \n
|
||||
* Example code released under a CC0 license.
|
||||
*/
|
||||
#include <cmath>
|
||||
#include <cstdio>
|
||||
#include <cstdlib>
|
||||
|
||||
#include <emscripten/emscripten.h>
|
||||
#include <emscripten/html5.h>
|
||||
|
||||
#include <GLES2/gl2.h>
|
||||
#include <GLES2/gl2ext.h>
|
||||
|
||||
#include "../basisu_transcoder.cpp"
|
||||
|
||||
//********************************* Test Data ********************************/
|
||||
|
||||
/**
|
||||
* Basis Universal compressed 256x256 RGB texture source (with mipmaps).
|
||||
* \n
|
||||
* See \c testcard.png for the original. Generate using:
|
||||
* \code
|
||||
* basisu -comp_level 5 -linear -global_sel_pal -y_flip -mipmap
|
||||
* \endcode
|
||||
*/
|
||||
static uint8_t const srcRgb[] = {
|
||||
#include "testcard.basis.inc"
|
||||
};
|
||||
|
||||
/**
|
||||
* Basis Universal compressed 256x256 RGBA texture source (with mipmaps).
|
||||
* \n
|
||||
* See \c testcard-rgba.png for the original. Generate using:
|
||||
* \code
|
||||
* basisu -comp_level 5 -linear -global_sel_pal -y_flip -mipmap
|
||||
* \endcode
|
||||
*/
|
||||
static uint8_t const srcRgba[] = {
|
||||
#include "testcard-rgba.basis.inc"
|
||||
};
|
||||
|
||||
//*************************** Program and Shaders ***************************/
|
||||
|
||||
/**
|
||||
* Program object ID.
|
||||
*/
|
||||
static GLuint progId = 0;
|
||||
|
||||
/**
|
||||
* Vertex shader ID.
|
||||
*/
|
||||
static GLuint vertId = 0;
|
||||
|
||||
/**
|
||||
* Fragment shader ID.
|
||||
*/
|
||||
static GLuint fragId = 0;
|
||||
|
||||
//********************************* Uniforms *********************************/
|
||||
|
||||
/**
|
||||
* Quad rotation angle ID.
|
||||
*/
|
||||
static GLint uRotId = -1;
|
||||
|
||||
/**
|
||||
* Texture ID.
|
||||
*/
|
||||
static GLint uTx0Id = -1;
|
||||
|
||||
//******************************* Shader Source ******************************/
|
||||
|
||||
/**
|
||||
* Vertex shader to draw texture mapped polys with an applied rotation.
|
||||
*/
|
||||
static GLchar const vertShader2D[] =
|
||||
#if GL_ES_VERSION_2_0
|
||||
"#version 100\n"
|
||||
"precision mediump float;\n"
|
||||
#else
|
||||
"#version 120\n"
|
||||
#endif
|
||||
"uniform float uRot;" // rotation
|
||||
"attribute vec2 aPos;" // vertex position coords
|
||||
"attribute vec2 aUV0;" // vertex texture UV0
|
||||
"varying vec2 vUV0;" // (passed to fragment shader)
|
||||
"void main() {"
|
||||
" float cosA = cos(radians(uRot));"
|
||||
" float sinA = sin(radians(uRot));"
|
||||
" mat3 rot = mat3(cosA, -sinA, 0.0,"
|
||||
" sinA, cosA, 0.0,"
|
||||
" 0.0, 0.0, 1.0);"
|
||||
" gl_Position = vec4(rot * vec3(aPos, 1.0), 1.0);"
|
||||
" vUV0 = aUV0;"
|
||||
"}";
|
||||
|
||||
/**
|
||||
* Fragment shader for the above polys.
|
||||
*/
|
||||
static GLchar const fragShader2D[] =
|
||||
#if GL_ES_VERSION_2_0
|
||||
"#version 100\n"
|
||||
"precision mediump float;\n"
|
||||
#else
|
||||
"#version 120\n"
|
||||
#endif
|
||||
"uniform sampler2D uTx0;"
|
||||
"varying vec2 vUV0;" // (passed from fragment shader)
|
||||
"void main() {"
|
||||
" gl_FragColor = texture2D(uTx0, vUV0);"
|
||||
"}";
|
||||
|
||||
/**
|
||||
* Helper to compile a shader.
|
||||
*
|
||||
* \param type shader type
|
||||
* \param text shader source
|
||||
* \return the shader ID (or zero if compilation failed)
|
||||
*/
|
||||
static GLuint compileShader(GLenum const type, const GLchar* text) {
|
||||
GLuint shader = glCreateShader(type);
|
||||
if (shader) {
|
||||
glShaderSource (shader, 1, &text, NULL);
|
||||
glCompileShader(shader);
|
||||
GLint compiled;
|
||||
glGetShaderiv(shader, GL_COMPILE_STATUS, &compiled);
|
||||
if (compiled) {
|
||||
return shader;
|
||||
} else {
|
||||
GLint logLen;
|
||||
glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &logLen);
|
||||
if (logLen > 1) {
|
||||
GLchar* logStr = static_cast<GLchar*>(malloc(logLen));
|
||||
glGetShaderInfoLog(shader, logLen, NULL, logStr);
|
||||
#ifndef NDEBUG
|
||||
printf("Shader compilation error: %s\n", logStr);
|
||||
#endif
|
||||
free(logStr);
|
||||
}
|
||||
glDeleteShader(shader);
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
//********************************** Helpers *********************************/
|
||||
|
||||
/**
|
||||
* Vertex position index.
|
||||
*/
|
||||
#define GL_VERT_POSXY_ID 0
|
||||
|
||||
/**
|
||||
* Vertex UV0 index.
|
||||
*/
|
||||
#define GL_VERT_TXUV0_ID 1
|
||||
|
||||
/**
|
||||
* \c GL vec2 storage type.
|
||||
*/
|
||||
struct vec2 {
|
||||
float x;
|
||||
float y;
|
||||
};
|
||||
|
||||
/**
|
||||
* Combined 2D vertex and 2D texture coordinates.
|
||||
*/
|
||||
struct posTex2d {
|
||||
struct vec2 pos;
|
||||
struct vec2 uv0;
|
||||
};
|
||||
|
||||
/**
|
||||
* Shortcut for \c emscripten_webgl_enable_extension().
|
||||
*/
|
||||
#ifndef GL_HAS_EXT
|
||||
#define GL_HAS_EXT(ctx, ext) emscripten_webgl_enable_extension(ctx, ext)
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Possibly missing GL enums.
|
||||
*
|
||||
* Note: GL_COMPRESSED_RGB_ETC1_WEBGL is the same as GL_ETC1_RGB8_OES
|
||||
*/
|
||||
#ifndef GL_ETC1_RGB8_OES
|
||||
#define GL_ETC1_RGB8_OES 0x8D64
|
||||
#endif
|
||||
#ifndef GL_COMPRESSED_RGB8_ETC2
|
||||
#define GL_COMPRESSED_RGB8_ETC2 0x9274
|
||||
#endif
|
||||
#ifndef GL_COMPRESSED_RGBA8_ETC2_EAC
|
||||
#define GL_COMPRESSED_RGBA8_ETC2_EAC 0x9278
|
||||
#endif
|
||||
#ifndef COMPRESSED_RGBA_ASTC_4x4_KHR
|
||||
#define COMPRESSED_RGBA_ASTC_4x4_KHR 0x93B0
|
||||
#endif
|
||||
|
||||
//***************************** Basis Universal ******************************/
|
||||
|
||||
/*
|
||||
* All of the BasisU code is within this block to enable building with or
|
||||
* without the library. Not including the transcoder will build a dummy
|
||||
* implementation to (roughly) determine the size.
|
||||
*/
|
||||
#ifdef BASISD_LIB_VERSION
|
||||
|
||||
using namespace basist;
|
||||
|
||||
/**
|
||||
* Shared codebook instance.
|
||||
*/
|
||||
static etc1_global_selector_codebook* globalCodebook = NULL;
|
||||
|
||||
/**
|
||||
* Returns a supported compressed texture format for a given context.
|
||||
*
|
||||
* \param[in] ctx WebGL context
|
||||
* \param[in] alpha \c true if the texture has an alpha channel
|
||||
* \return corresponding Basis format
|
||||
*/
|
||||
static transcoder_texture_format supports(EMSCRIPTEN_WEBGL_CONTEXT_HANDLE const ctx, bool const alpha) {
|
||||
#if BASISD_SUPPORT_PVRTC1 || !defined(BASISD_SUPPORT_PVRTC1)
|
||||
/*
|
||||
* Test for both prefixed and non-prefixed versions. This should grab iOS
|
||||
* and other ImgTec GPUs first as a preference.
|
||||
*
|
||||
* TODO: do older iOS expose ASTC to the browser and does it transcode to RGBA?
|
||||
*/
|
||||
static bool const pvr = GL_HAS_EXT(ctx, "WEBKIT_WEBGL_compressed_texture_pvrtc")
|
||||
|| GL_HAS_EXT(ctx, "WEBGL_compressed_texture_pvrtc");
|
||||
if (pvr) {
|
||||
return (alpha)
|
||||
? transcoder_texture_format::cTFPVRTC1_4_RGBA
|
||||
: transcoder_texture_format::cTFPVRTC1_4_RGB;
|
||||
}
|
||||
#endif
|
||||
#if BASISD_SUPPORT_ASTC || !defined(BASISD_SUPPORT_ASTC)
|
||||
/*
|
||||
* Then Android, ChromeOS and others with ASTC (newer iOS devices should
|
||||
* make the list but don't appear to be exposed from WebGL).
|
||||
*/
|
||||
static bool const astc = GL_HAS_EXT(ctx, "WEBGL_compressed_texture_astc");
|
||||
if (astc) {
|
||||
return transcoder_texture_format::cTFASTC_4x4_RGBA;
|
||||
}
|
||||
#endif
|
||||
#if BASISD_SUPPORT_DXT1 || !defined(BASISD_SUPPORT_DXT1)
|
||||
/*
|
||||
* We choose DXT next, since a worry is the browser will claim ETC support
|
||||
* then transcode (transcoding slower and with more artefacts). This gives
|
||||
* us desktop and various (usually Intel) Android devices.
|
||||
*/
|
||||
static bool const dxt = GL_HAS_EXT(ctx, "WEBGL_compressed_texture_s3tc")
|
||||
|| GL_HAS_EXT(ctx, "WEBKIT_WEBGL_compressed_texture_s3tc");
|
||||
if (dxt) {
|
||||
return (alpha)
|
||||
? transcoder_texture_format::cTFBC3_RGBA
|
||||
: transcoder_texture_format::cTFBC1_RGB;
|
||||
}
|
||||
#endif
|
||||
#if BASISD_SUPPORT_ETC2_EAC_A8 || !defined(BASISD_SUPPORT_ETC2_EAC_A8)
|
||||
/*
|
||||
* Then ETC2 (which may be incorrect).
|
||||
*/
|
||||
static bool const etc2 = GL_HAS_EXT(ctx, "WEBGL_compressed_texture_etc");
|
||||
if (etc2) {
|
||||
return (alpha)
|
||||
? transcoder_texture_format::cTFETC2_RGBA
|
||||
: transcoder_texture_format::cTFETC1_RGB;
|
||||
}
|
||||
#endif
|
||||
/*
|
||||
* Finally ETC1, falling back on RGBA.
|
||||
*
|
||||
* TODO: we might just prefer to transcode to dithered 565 once available
|
||||
*/
|
||||
static bool const etc1 = GL_HAS_EXT(ctx, "WEBGL_compressed_texture_etc1");
|
||||
if (etc1 && !alpha) {
|
||||
return transcoder_texture_format::cTFETC1_RGB;
|
||||
}
|
||||
/*
|
||||
* We choose 8888 over 4444 and 565 (in the hope that is is never chosen).
|
||||
*/
|
||||
return transcoder_texture_format::cTFRGBA32;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the equivalent GL type given a BasisU type.
|
||||
*
|
||||
* \note This relies on \c #supports() returning the supported formats, and so
|
||||
* only converts to the GL equivalents (without further testing for support).
|
||||
*
|
||||
* \param[in] type BasisU transcode target
|
||||
* \return equivalent GL type
|
||||
*/
|
||||
static GLenum toGlType(transcoder_texture_format const type) {
|
||||
switch (type) {
|
||||
case transcoder_texture_format::cTFETC1_RGB:
|
||||
return GL_ETC1_RGB8_OES;
|
||||
case transcoder_texture_format::cTFETC2_RGBA:
|
||||
return GL_COMPRESSED_RGBA8_ETC2_EAC;
|
||||
case transcoder_texture_format::cTFBC1_RGB:
|
||||
return GL_COMPRESSED_RGB_S3TC_DXT1_EXT;
|
||||
case transcoder_texture_format::cTFBC3_RGBA:
|
||||
return GL_COMPRESSED_RGBA_S3TC_DXT5_EXT;
|
||||
case transcoder_texture_format::cTFPVRTC1_4_RGB:
|
||||
return GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG;
|
||||
case transcoder_texture_format::cTFPVRTC1_4_RGBA:
|
||||
return GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG;
|
||||
case transcoder_texture_format::cTFASTC_4x4_RGBA:
|
||||
return GL_COMPRESSED_RGBA_ASTC_4x4_KHR;
|
||||
case transcoder_texture_format::cTFRGBA32:
|
||||
return GL_UNSIGNED_BYTE;
|
||||
case transcoder_texture_format::cTFRGB565:
|
||||
return GL_UNSIGNED_SHORT_5_6_5;
|
||||
default:
|
||||
return GL_UNSIGNED_SHORT_4_4_4_4;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Uploads the texture.
|
||||
*
|
||||
* \param[in] ctx ctx WebGL context
|
||||
* \param[in] name texture \e name
|
||||
* \param[in] data \c .basis file content
|
||||
* \param[in] size number of bytes in \a data
|
||||
* \return \c true if the texture was decoded and created
|
||||
*
|
||||
* \todo reuse the decode buffer (the first mips level should be able to contain the rest)
|
||||
*/
|
||||
bool upload(EMSCRIPTEN_WEBGL_CONTEXT_HANDLE const ctx, GLuint const name, const uint8_t* const data, size_t const size) {
|
||||
basisu_transcoder_init();
|
||||
if (!globalCodebook) {
|
||||
globalCodebook = new etc1_global_selector_codebook(g_global_selector_cb_size, g_global_selector_cb);
|
||||
}
|
||||
basisu_transcoder transcoder(globalCodebook);
|
||||
bool success = false;
|
||||
if (transcoder.validate_header(data, size)) {
|
||||
glBindTexture(GL_TEXTURE_2D, name);
|
||||
basisu_file_info fileInfo;
|
||||
if (transcoder.get_file_info(data, size, fileInfo)) {
|
||||
transcoder_texture_format type = supports(ctx, fileInfo.m_has_alpha_slices);
|
||||
basisu_image_info info;
|
||||
if (transcoder.get_image_info(data, size, info, 0)) {
|
||||
printf("Transcoding to type: %s (w: %d, h: %d, mips: %d)\n",
|
||||
basis_get_format_name(type), info.m_width, info.m_height,
|
||||
info.m_total_levels);
|
||||
if (transcoder.start_transcoding(data, size)) {
|
||||
uint32_t descW, descH, blocks;
|
||||
for (uint32_t level = 0; level < info.m_total_levels; level++) {
|
||||
// reset per level
|
||||
success = false;
|
||||
if (transcoder.get_image_level_desc(data, size, 0, level, descW, descH, blocks)) {
|
||||
uint32_t decSize;
|
||||
if (type == transcoder_texture_format::cTFPVRTC1_4_RGB ||
|
||||
type == transcoder_texture_format::cTFPVRTC1_4_RGBA)
|
||||
{
|
||||
decSize = (std::max(8U, (descW + 3) & ~3) *
|
||||
std::max(8U, (descH + 3) & ~3) * 4 + 7) / 8;
|
||||
} else {
|
||||
decSize = basis_get_bytes_per_block_or_pixel(type);
|
||||
if (basis_transcoder_format_is_uncompressed(type)) {
|
||||
decSize *= descW * descH;
|
||||
} else {
|
||||
decSize *= blocks;
|
||||
}
|
||||
}
|
||||
if (void* decBuf = malloc(decSize)) {
|
||||
if (basis_transcoder_format_is_uncompressed(type)) {
|
||||
// note that blocks becomes total number of pixels for RGB/RGBA
|
||||
blocks = descW * descH;
|
||||
}
|
||||
if (transcoder.transcode_image_level(data, size, 0, level, decBuf, blocks, type)) {
|
||||
if (basis_transcoder_format_is_uncompressed(type)) {
|
||||
glTexImage2D(GL_TEXTURE_2D, level, GL_RGBA,
|
||||
descW, descH, 0, GL_RGBA, toGlType(type), decBuf);
|
||||
} else {
|
||||
glCompressedTexImage2D(GL_TEXTURE_2D, level,
|
||||
toGlType(type), descW, descH, 0, decSize, decBuf);
|
||||
}
|
||||
success = true;
|
||||
}
|
||||
free(decBuf);
|
||||
}
|
||||
}
|
||||
if (!success) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return success;
|
||||
}
|
||||
|
||||
#else
|
||||
// dummy implementation
|
||||
bool upload(EMSCRIPTEN_WEBGL_CONTEXT_HANDLE /*ctx*/, GLuint /*name*/, const uint8_t* data, size_t size) {
|
||||
return (data[0] | data[size - 1]) != 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
//****************************************************************************/
|
||||
|
||||
/**
|
||||
* Current quad rotation angle (in degrees, updated per frame).
|
||||
*/
|
||||
static float rotDeg = 0.0f;
|
||||
|
||||
/**
|
||||
* Decoded textures (0 = opaque, 1 = transparent).
|
||||
*/
|
||||
static GLuint txName[2] = {};
|
||||
|
||||
/**
|
||||
* Emscripten (single) GL context.
|
||||
*/
|
||||
static EMSCRIPTEN_WEBGL_CONTEXT_HANDLE glCtx = 0;
|
||||
|
||||
/**
|
||||
* Emscripten resize handler.
|
||||
*/
|
||||
static EM_BOOL resize(int /*type*/, const EmscriptenUiEvent* /*e*/, void* /*data*/) {
|
||||
double surfaceW;
|
||||
double surfaceH;
|
||||
if (emscripten_get_element_css_size ("#canvas", &surfaceW, &surfaceH) == EMSCRIPTEN_RESULT_SUCCESS) {
|
||||
emscripten_set_canvas_element_size("#canvas", surfaceW, surfaceH);
|
||||
if (glCtx) {
|
||||
glViewport(0, 0, (int) surfaceW, (int) surfaceH);
|
||||
}
|
||||
}
|
||||
return EM_FALSE;
|
||||
}
|
||||
|
||||
/**
|
||||
* Boilerplate to create a WebGL context.
|
||||
*/
|
||||
static EM_BOOL initContext() {
|
||||
// Default attributes
|
||||
EmscriptenWebGLContextAttributes attr;
|
||||
emscripten_webgl_init_context_attributes(&attr);
|
||||
if ((glCtx = emscripten_webgl_create_context("#canvas", &attr))) {
|
||||
// Bind the context and fire a resize to get the initial size
|
||||
emscripten_webgl_make_context_current(glCtx);
|
||||
emscripten_set_resize_callback(EMSCRIPTEN_EVENT_TARGET_DOCUMENT, NULL, EM_FALSE, resize);
|
||||
resize(0, NULL, NULL);
|
||||
return EM_TRUE;
|
||||
}
|
||||
return EM_FALSE;
|
||||
}
|
||||
|
||||
/**
|
||||
* Called once per frame (clears the screen and draws the rotating quad).
|
||||
*/
|
||||
static void tick() {
|
||||
glClearColor(1.0f, 0.0f, 1.0f, 1.0f);
|
||||
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
||||
|
||||
if (uRotId >= 0) {
|
||||
glUniform1f(uRotId, rotDeg);
|
||||
rotDeg += 0.1f;
|
||||
if (rotDeg >= 360.0f) {
|
||||
rotDeg -= 360.0f;
|
||||
}
|
||||
glBindTexture(GL_TEXTURE_2D, txName[(lround(rotDeg / 45) & 1) != 0]);
|
||||
}
|
||||
|
||||
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, 0);
|
||||
glFlush();
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates the GL context, shaders and quad data, decompresses the .basis files
|
||||
* and 'uploads' the resulting textures.
|
||||
*/
|
||||
int main() {
|
||||
if (initContext()) {
|
||||
// Compile shaders and set the initial GL state
|
||||
if ((progId = glCreateProgram())) {
|
||||
vertId = compileShader(GL_VERTEX_SHADER, vertShader2D);
|
||||
fragId = compileShader(GL_FRAGMENT_SHADER, fragShader2D);
|
||||
|
||||
glBindAttribLocation(progId, GL_VERT_POSXY_ID, "aPos");
|
||||
glBindAttribLocation(progId, GL_VERT_TXUV0_ID, "aUV0");
|
||||
|
||||
glAttachShader(progId, vertId);
|
||||
glAttachShader(progId, fragId);
|
||||
glLinkProgram (progId);
|
||||
glUseProgram (progId);
|
||||
uRotId = glGetUniformLocation(progId, "uRot");
|
||||
uTx0Id = glGetUniformLocation(progId, "uTx0");
|
||||
if (uTx0Id >= 0) {
|
||||
glUniform1i(uTx0Id, 0);
|
||||
}
|
||||
|
||||
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
||||
glEnable(GL_BLEND);
|
||||
glDisable(GL_DITHER);
|
||||
|
||||
glCullFace(GL_BACK);
|
||||
glEnable(GL_CULL_FACE);
|
||||
}
|
||||
|
||||
GLuint vertsBuf = 0;
|
||||
GLuint indexBuf = 0;
|
||||
// Create the textured quad (vert positions then UVs)
|
||||
struct posTex2d verts2d[] = {
|
||||
{{-0.85f, -0.85f}, {0.0f, 0.0f}}, // BL
|
||||
{{ 0.85f, -0.85f}, {1.0f, 0.0f}}, // BR
|
||||
{{-0.85f, 0.85f}, {0.0f, 1.0f}}, // TL
|
||||
{{ 0.85f, 0.85f}, {1.0f, 1.0f}}, // TR
|
||||
};
|
||||
uint16_t index2d[] = {
|
||||
0, 1, 2,
|
||||
2, 1, 3,
|
||||
};
|
||||
glGenBuffers(1, &vertsBuf);
|
||||
glBindBuffer(GL_ARRAY_BUFFER, vertsBuf);
|
||||
glBufferData(GL_ARRAY_BUFFER,
|
||||
sizeof(verts2d), verts2d, GL_STATIC_DRAW);
|
||||
glVertexAttribPointer(GL_VERT_POSXY_ID, 2,
|
||||
GL_FLOAT, GL_FALSE, sizeof(struct posTex2d), 0);
|
||||
glVertexAttribPointer(GL_VERT_TXUV0_ID, 2,
|
||||
GL_FLOAT, GL_FALSE, sizeof(struct posTex2d),
|
||||
(void*) offsetof(struct posTex2d, uv0));
|
||||
glGenBuffers(1, &indexBuf);
|
||||
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBuf);
|
||||
glBufferData(GL_ELEMENT_ARRAY_BUFFER,
|
||||
sizeof(index2d), index2d, GL_STATIC_DRAW);
|
||||
glEnableVertexAttribArray(GL_VERT_POSXY_ID);
|
||||
glEnableVertexAttribArray(GL_VERT_TXUV0_ID);
|
||||
|
||||
glGenTextures(2, txName);
|
||||
if (upload(glCtx, txName[0], srcRgb, sizeof srcRgb) &&
|
||||
upload(glCtx, txName[1], srcRgba, sizeof srcRgba))
|
||||
{
|
||||
printf("Decoded!\n");
|
||||
}
|
||||
|
||||
emscripten_set_main_loop(tick, 0, EM_FALSE);
|
||||
emscripten_exit_with_live_runtime();
|
||||
} else {
|
||||
printf("Failed to init WebGL!\n");
|
||||
}
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
@@ -0,0 +1,25 @@
|
||||
<!doctype html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, maximum-scale=1.0, user-scalable=no, viewport-fit=cover" />
|
||||
<meta name="apple-mobile-web-app-capable" content="yes" />
|
||||
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" />
|
||||
<title>Emscripten Shell</title>
|
||||
<style>
|
||||
body {background:#333; font-family:"Verdana","Helvetica Neue","Helvetica","Arial",sans-serif; margin:1em 0;}
|
||||
#canvas{position:absolute; top:0px; left:0px; border:none; margin:0; width: 100%; height: 100%; overflow: hidden; display: block;}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<canvas id="canvas" oncontextmenu="event.preventDefault()"></canvas>
|
||||
<script>
|
||||
var Module = {
|
||||
canvas: (function() {
|
||||
return document.getElementById("canvas");
|
||||
})()
|
||||
};
|
||||
</script>
|
||||
{{{ SCRIPT }}}
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,54 @@
|
||||
/**
|
||||
* \file simple.cpp
|
||||
* Bare minimum example of using the single-file \c basisu_transcoder.cpp.
|
||||
* Opens an embedded \c .basis file to test that amalgamating the transcoder
|
||||
* worked.
|
||||
* \n
|
||||
* Compile using:
|
||||
* \code
|
||||
* cc -std=c++11 -lstdc++ simple.cpp
|
||||
* \endcode
|
||||
*
|
||||
* Example code released under a CC0 license.
|
||||
*/
|
||||
#include "../basisu_transcoder.cpp"
|
||||
|
||||
using namespace basist;
|
||||
|
||||
//********************************* Test Data ********************************/
|
||||
|
||||
/**
|
||||
* Basis Universal compressed 256x256 RGB texture source (with mipmaps).
|
||||
* \n
|
||||
* See \c testcard.png for the original. Generate using:
|
||||
* \code
|
||||
* basisu -comp_level 5 -linear -global_sel_pal -y_flip -mipmap
|
||||
* \endcode
|
||||
*/
|
||||
static uint8_t const srcRgb[] = {
|
||||
#include "testcard.basis.inc"
|
||||
};
|
||||
|
||||
//****************************************************************************/
|
||||
|
||||
|
||||
/**
|
||||
* Simple single-file test to test the transcoder can build and run.
|
||||
*/
|
||||
int main() {
|
||||
basisu_transcoder_init();
|
||||
|
||||
basisu_transcoder transcoder;
|
||||
if (transcoder.validate_header(srcRgb, sizeof srcRgb)) {
|
||||
basisu_file_info fileInfo;
|
||||
if (transcoder.get_file_info(srcRgb, sizeof srcRgb, fileInfo)) {
|
||||
basisu_image_info info;
|
||||
if (transcoder.get_image_info(srcRgb, sizeof srcRgb, info, 0)) {
|
||||
printf("Success (file w: %d, h: %d, mips: %d)\n",
|
||||
info.m_width, info.m_height, info.m_total_levels);
|
||||
return EXIT_SUCCESS;
|
||||
}
|
||||
}
|
||||
}
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
+1043
File diff suppressed because it is too large
Load Diff
BIN
Binary file not shown.
|
After Width: | Height: | Size: 12 KiB |
+703
@@ -0,0 +1,703 @@
|
||||
0x73, 0x42, 0x13, 0x00, 0x4d, 0x00, 0xfc, 0xe8, 0x9e, 0x20, 0x00, 0x00,
|
||||
0xcb, 0xa6, 0x09, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x57, 0x01, 0x1c, 0x01, 0x00, 0x00, 0xf5, 0x02, 0x00,
|
||||
0xa3, 0x02, 0x11, 0x04, 0x00, 0x00, 0x62, 0x09, 0x00, 0x73, 0x0d, 0x00,
|
||||
0x00, 0x73, 0x01, 0x00, 0x00, 0x4d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
|
||||
0x00, 0x01, 0x40, 0x00, 0x40, 0x00, 0xe6, 0x0e, 0x00, 0x00, 0x04, 0x0a,
|
||||
0x00, 0x00, 0x47, 0x63, 0x00, 0x00, 0x00, 0x01, 0x00, 0x80, 0x00, 0x80,
|
||||
0x00, 0x20, 0x00, 0x20, 0x00, 0xea, 0x18, 0x00, 0x00, 0xaf, 0x05, 0x00,
|
||||
0x00, 0x4c, 0xf0, 0x00, 0x00, 0x00, 0x02, 0x00, 0x40, 0x00, 0x40, 0x00,
|
||||
0x10, 0x00, 0x10, 0x00, 0x99, 0x1e, 0x00, 0x00, 0xa3, 0x01, 0x00, 0x00,
|
||||
0xd0, 0x9e, 0x00, 0x00, 0x00, 0x03, 0x00, 0x20, 0x00, 0x20, 0x00, 0x08,
|
||||
0x00, 0x08, 0x00, 0x3c, 0x20, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x00, 0xbc,
|
||||
0xfc, 0x00, 0x00, 0x00, 0x04, 0x00, 0x10, 0x00, 0x10, 0x00, 0x04, 0x00,
|
||||
0x04, 0x00, 0xb8, 0x20, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0xbe, 0x4b,
|
||||
0x00, 0x00, 0x00, 0x05, 0x00, 0x08, 0x00, 0x08, 0x00, 0x02, 0x00, 0x02,
|
||||
0x00, 0xd9, 0x20, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x04, 0xf6, 0x00,
|
||||
0x00, 0x00, 0x06, 0x00, 0x04, 0x00, 0x04, 0x00, 0x01, 0x00, 0x01, 0x00,
|
||||
0xe2, 0x20, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x64, 0x29, 0x00, 0x00,
|
||||
0x00, 0x07, 0x00, 0x02, 0x00, 0x02, 0x00, 0x01, 0x00, 0x01, 0x00, 0xe5,
|
||||
0x20, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0xbd, 0xa9, 0x00, 0x00, 0x00,
|
||||
0x08, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0xe8, 0x20,
|
||||
0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0xfc, 0xab, 0x20, 0x40, 0x04, 0x00,
|
||||
0x42, 0x10, 0x04, 0x60, 0xe0, 0x0f, 0x2d, 0xc9, 0x4a, 0xd1, 0x13, 0x30,
|
||||
0x43, 0x06, 0x02, 0x3c, 0xa0, 0x00, 0x87, 0x60, 0x18, 0x9a, 0x97, 0xf4,
|
||||
0xc3, 0x38, 0x36, 0xbb, 0x51, 0x95, 0xe6, 0x81, 0x00, 0x0f, 0x20, 0x48,
|
||||
0x61, 0x10, 0x06, 0x6e, 0x22, 0x45, 0x60, 0xd0, 0x3b, 0x5a, 0x79, 0x03,
|
||||
0x09, 0x02, 0x10, 0x01, 0x00, 0x00, 0x00, 0x40, 0x08, 0x14, 0x1e, 0xec,
|
||||
0x87, 0x4b, 0x4d, 0x51, 0xc0, 0x60, 0x99, 0x42, 0xd4, 0x84, 0x63, 0x88,
|
||||
0x0e, 0x8d, 0x48, 0x59, 0xf7, 0x5c, 0xfa, 0x9c, 0x33, 0x38, 0x3a, 0x1f,
|
||||
0xd5, 0x2d, 0x85, 0x1e, 0x44, 0x54, 0x40, 0xa4, 0xc6, 0x0a, 0x88, 0xff,
|
||||
0x66, 0xcd, 0x97, 0xf1, 0x7c, 0xa3, 0xf3, 0x9c, 0xa4, 0x56, 0xcb, 0x53,
|
||||
0xd0, 0x31, 0x64, 0x65, 0x4c, 0xc8, 0xea, 0x3e, 0x50, 0x3c, 0xce, 0xe9,
|
||||
0x5a, 0xed, 0xd4, 0x06, 0xec, 0x15, 0x3d, 0xc3, 0xaf, 0xd6, 0x69, 0x6b,
|
||||
0x36, 0x72, 0x2e, 0x51, 0x8b, 0xba, 0x94, 0x33, 0xfa, 0x59, 0x4d, 0xa9,
|
||||
0xf1, 0xf4, 0x9b, 0xbe, 0x9d, 0xd1, 0x87, 0xb9, 0xcd, 0x79, 0xdc, 0x97,
|
||||
0x52, 0xf2, 0x18, 0xec, 0xe3, 0x4f, 0xae, 0xbb, 0x7d, 0x4a, 0x49, 0x11,
|
||||
0xc1, 0x7d, 0x73, 0x02, 0xff, 0xcf, 0x9b, 0x5a, 0xb5, 0x32, 0xa0, 0x92,
|
||||
0x54, 0x17, 0xa1, 0x91, 0xd1, 0x0f, 0x6c, 0x22, 0xfd, 0x3c, 0xda, 0x34,
|
||||
0xc6, 0xf1, 0x61, 0x59, 0xfe, 0x9d, 0x6a, 0x17, 0x53, 0x30, 0xeb, 0x97,
|
||||
0xa2, 0x9d, 0x8e, 0xf4, 0x35, 0xff, 0xa0, 0x21, 0x30, 0xc4, 0x04, 0x40,
|
||||
0x8c, 0x98, 0xe4, 0x23, 0xee, 0x46, 0x01, 0x22, 0x65, 0x37, 0xe4, 0xf8,
|
||||
0x2b, 0xe7, 0xa7, 0xe5, 0xbc, 0x11, 0x03, 0xe2, 0x45, 0xd8, 0x90, 0xcf,
|
||||
0x03, 0xbf, 0x33, 0x70, 0xe0, 0xfa, 0xc8, 0x80, 0xf1, 0x3c, 0x2e, 0x84,
|
||||
0xf6, 0xa5, 0x03, 0xe0, 0x98, 0xc7, 0xc3, 0x1f, 0x87, 0xc9, 0xe6, 0xaa,
|
||||
0xba, 0x31, 0xc6, 0x80, 0x31, 0xa6, 0x5e, 0xcb, 0x00, 0x02, 0xca, 0xb5,
|
||||
0xb5, 0xae, 0x2b, 0xd6, 0x9f, 0x59, 0x7d, 0x61, 0x86, 0xea, 0x79, 0xc3,
|
||||
0xfc, 0x84, 0x36, 0x44, 0xdc, 0x45, 0xac, 0xe9, 0x49, 0x8e, 0x8c, 0xc8,
|
||||
0xd5, 0x13, 0x98, 0x6c, 0xff, 0xf9, 0xbe, 0xef, 0xe4, 0x92, 0x76, 0x8e,
|
||||
0xa3, 0xb6, 0xde, 0x33, 0x96, 0x49, 0x95, 0xa0, 0x67, 0xdb, 0xb6, 0x99,
|
||||
0x59, 0x6a, 0xad, 0x7c, 0x3e, 0x1f, 0xd9, 0xce, 0x7d, 0xd4, 0x5b, 0xf7,
|
||||
0x3c, 0x5a, 0xa6, 0x1f, 0x63, 0xac, 0xb5, 0xc6, 0x14, 0xe9, 0xf6, 0x97,
|
||||
0x93, 0x52, 0xea, 0xb2, 0x2c, 0x23, 0xb9, 0x52, 0x4a, 0xbc, 0xf7, 0xf4,
|
||||
0xde, 0x97, 0x73, 0x76, 0xce, 0x39, 0xd3, 0x34, 0x89, 0x99, 0xef, 0xba,
|
||||
0x2e, 0x9c, 0x73, 0x39, 0x8e, 0x63, 0xaa, 0xba, 0x7d, 0xdf, 0xbd, 0xef,
|
||||
0xfb, 0x44, 0xa4, 0xeb, 0xba, 0xee, 0xb3, 0x16, 0x5e, 0x15, 0x84, 0x10,
|
||||
0x50, 0x8d, 0x66, 0x0e, 0x8b, 0x31, 0xc8, 0x39, 0x93, 0xdb, 0xa3, 0x29,
|
||||
0xfa, 0x00, 0xf0, 0x8c, 0xc5, 0xc5, 0xb6, 0xcc, 0x2c, 0x66, 0xb6, 0x31,
|
||||
0xc6, 0xd7, 0x5c, 0x7f, 0x76, 0xf3, 0x8c, 0x13, 0x5f, 0xcb, 0x21, 0xf8,
|
||||
0x23, 0xa2, 0x08, 0xc9, 0x54, 0x49, 0x61, 0x18, 0xe2, 0x9e, 0x34, 0x98,
|
||||
0xcd, 0x6e, 0x45, 0xf4, 0x7f, 0x80, 0xac, 0xb2, 0x49, 0x12, 0xa3, 0x81,
|
||||
0xd7, 0xde, 0xc4, 0xdf, 0x37, 0xe0, 0x3c, 0xfc, 0xe4, 0x5f, 0x3c, 0x45,
|
||||
0x44, 0x5e, 0xf6, 0xec, 0x72, 0xde, 0x70, 0x16, 0x96, 0x7d, 0x1c, 0xfb,
|
||||
0xe1, 0x6f, 0xb4, 0x66, 0x8a, 0x7f, 0x2a, 0xcd, 0x13, 0x70, 0x72, 0x22,
|
||||
0x10, 0xe3, 0x09, 0xd8, 0x44, 0x06, 0x82, 0xec, 0xee, 0x10, 0xf4, 0x10,
|
||||
0x00, 0x21, 0x05, 0x44, 0x60, 0x1c, 0x56, 0xae, 0x56, 0x90, 0x86, 0xa1,
|
||||
0x5d, 0xf2, 0x8d, 0xa4, 0x00, 0x90, 0x54, 0x63, 0x58, 0x07, 0x31, 0xbd,
|
||||
0xdd, 0x48, 0x00, 0x03, 0x49, 0xe7, 0x70, 0x90, 0x52, 0x52, 0xf9, 0x1e,
|
||||
0xa4, 0x24, 0xa0, 0x49, 0x86, 0xc0, 0x08, 0x04, 0x20, 0x04, 0x12, 0x44,
|
||||
0x8f, 0xa5, 0x6d, 0x75, 0xbc, 0xda, 0xf3, 0x01, 0xb4, 0x92, 0x5d, 0x5d,
|
||||
0x3a, 0x49, 0x3d, 0x4f, 0xcc, 0xb3, 0xe4, 0x3c, 0xd6, 0x43, 0x40, 0xe4,
|
||||
0xee, 0xd4, 0x94, 0xd7, 0x70, 0x7e, 0x73, 0x69, 0x8d, 0xf9, 0xc3, 0x4e,
|
||||
0x09, 0x04, 0xf0, 0x02, 0x1c, 0xe1, 0xf2, 0xaa, 0x4a, 0x83, 0xe7, 0x65,
|
||||
0x81, 0x40, 0x52, 0xaa, 0x50, 0x6b, 0x77, 0xaf, 0xeb, 0xfa, 0xde, 0x30,
|
||||
0x0c, 0x16, 0x41, 0xef, 0xf7, 0x86, 0xd8, 0xaf, 0x11, 0xf1, 0x36, 0xd5,
|
||||
0xd3, 0x11, 0x12, 0xdf, 0x2c, 0x56, 0x65, 0xf4, 0x8d, 0x1f, 0xd6, 0xdd,
|
||||
0x71, 0x3b, 0xad, 0xb7, 0x0c, 0xcf, 0x41, 0xd3, 0x34, 0xe5, 0x38, 0x2d,
|
||||
0xed, 0x88, 0x2c, 0x6f, 0x50, 0x5a, 0x36, 0x30, 0x79, 0xfb, 0x24, 0xbf,
|
||||
0xd7, 0xa2, 0xac, 0x29, 0xea, 0x1f, 0xff, 0x06, 0x47, 0xdf, 0xb6, 0x6e,
|
||||
0x55, 0xa5, 0xce, 0xa1, 0x98, 0x0a, 0x8a, 0xcc, 0x46, 0xaa, 0x49, 0x90,
|
||||
0x0a, 0x0a, 0x02, 0xbe, 0x9c, 0x05, 0xe0, 0xf4, 0x89, 0xcb, 0x9a, 0x6e,
|
||||
0x3c, 0xa4, 0xf9, 0xd5, 0x29, 0xbe, 0xe2, 0x7c, 0x98, 0xb4, 0x72, 0x8f,
|
||||
0xd6, 0x52, 0x2b, 0xcf, 0xaf, 0x4f, 0x8b, 0x0a, 0xe4, 0x1c, 0x98, 0x91,
|
||||
0x88, 0x48, 0xa1, 0x4a, 0xad, 0x07, 0x40, 0x79, 0x60, 0xc1, 0xdc, 0xfc,
|
||||
0x22, 0x47, 0x4e, 0xdf, 0x28, 0x4d, 0x73, 0xfa, 0x7d, 0x29, 0xff, 0xbe,
|
||||
0x4f, 0xef, 0xfc, 0xaf, 0xb6, 0xfd, 0x79, 0xb2, 0x02, 0x22, 0x02, 0x04,
|
||||
0x6f, 0x34, 0x04, 0x20, 0x28, 0x00, 0x7f, 0xe4, 0xe7, 0x2d, 0xf4, 0xb2,
|
||||
0x70, 0x02, 0x29, 0x93, 0x89, 0x45, 0x19, 0x8d, 0x4c, 0x36, 0xb9, 0x81,
|
||||
0x2b, 0xbc, 0x57, 0x46, 0x07, 0x70, 0x1c, 0x72, 0x07, 0x83, 0xe1, 0x91,
|
||||
0xb2, 0x5b, 0x94, 0x92, 0x27, 0x1f, 0x98, 0xbc, 0xb1, 0x2d, 0x05, 0x00,
|
||||
0x00, 0xc0, 0x7f, 0x45, 0x97, 0xd7, 0x2e, 0x35, 0x47, 0x07, 0x11, 0x27,
|
||||
0x1f, 0x27, 0x45, 0x22, 0xe2, 0x54, 0xa9, 0xd4, 0x3c, 0xcd, 0x56, 0x5c,
|
||||
0x4a, 0x5d, 0x1c, 0x24, 0xc6, 0x65, 0xe3, 0xb2, 0x0f, 0x87, 0xea, 0x7b,
|
||||
0xd1, 0xbd, 0x2d, 0xd6, 0xab, 0x8f, 0x3f, 0x80, 0xe3, 0x4a, 0xc4, 0x28,
|
||||
0x49, 0xa7, 0x91, 0xf5, 0x6d, 0x12, 0x8e, 0xc3, 0xcd, 0xcd, 0xf6, 0x0f,
|
||||
0x0c, 0x88, 0x88, 0x0f, 0x0f, 0xaa, 0xaa, 0x0f, 0x0f, 0x6a, 0xaa, 0x0f,
|
||||
0x0f, 0x69, 0xaa, 0x0f, 0x0f, 0xfb, 0x2a, 0x0b, 0x03, 0xff, 0x78, 0x0b,
|
||||
0x01, 0xf9, 0xfa, 0x0a, 0x09, 0xfa, 0xfa, 0x0a, 0x09, 0xea, 0xbf, 0x2e,
|
||||
0x00, 0x80, 0x40, 0xed, 0xff, 0x15, 0x00, 0xe0, 0xeb, 0x15, 0x14, 0xea,
|
||||
0xed, 0x15, 0x14, 0xec, 0xf5, 0x15, 0x14, 0x6c, 0x75, 0x55, 0x35, 0x75,
|
||||
0x75, 0x75, 0x75, 0xb5, 0xff, 0x5f, 0x5d, 0x5d, 0xfd, 0x57, 0x55, 0x55,
|
||||
0x45, 0x7c, 0x8e, 0x98, 0xfc, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab,
|
||||
0xab, 0xa9, 0xab, 0xab, 0x37, 0xdc, 0xfb, 0x9b, 0x96, 0x52, 0x06, 0x00,
|
||||
0x27, 0x1d, 0xbe, 0x74, 0x7c, 0xdd, 0xb8, 0xd8, 0xd1, 0x73, 0x58, 0xab,
|
||||
0x52, 0xfa, 0x08, 0xff, 0xaa, 0x2e, 0xa4, 0xaa, 0xaa, 0xae, 0xa6, 0xac,
|
||||
0xab, 0xaa, 0xaa, 0x0e, 0x1f, 0x44, 0xaa, 0xaa, 0xaa, 0x3f, 0x87, 0xaa,
|
||||
0xaa, 0xea, 0x3f, 0x62, 0x47, 0x5d, 0x5d, 0xfd, 0x5f, 0x55, 0x55, 0x95,
|
||||
0x7f, 0x75, 0x75, 0xf5, 0x5f, 0x20, 0x68, 0xd9, 0x38, 0x58, 0x37, 0x01,
|
||||
0x82, 0x83, 0xbe, 0xc4, 0x0d, 0x7e, 0x7e, 0xd6, 0xfe, 0xfe, 0xfe, 0xd6,
|
||||
0xfe, 0xf6, 0xf6, 0xf6, 0xfe, 0xfe, 0xd6, 0xfe, 0xfe, 0x7e, 0x56, 0x7e,
|
||||
0x7e, 0xd2, 0xdf, 0xde, 0x4f, 0xf5, 0xfe, 0xfe, 0x5f, 0xf5, 0xfe, 0xfe,
|
||||
0x5f, 0x29, 0x71, 0x49, 0x55, 0xb5, 0xbb, 0x5b, 0x55, 0x15, 0x1e, 0x3e,
|
||||
0x55, 0x15, 0x1e, 0x3e, 0x4d, 0x15, 0x1e, 0xbe, 0x03, 0x07, 0x07, 0x07,
|
||||
0x07, 0x06, 0x06, 0x26, 0x3f, 0x78, 0x05, 0x0c, 0x1c, 0x2c, 0x0c, 0x0c,
|
||||
0x0c, 0xac, 0x0e, 0x0d, 0x0c, 0xac, 0x0e, 0x0c, 0x08, 0xa8, 0x5e, 0x3c,
|
||||
0xeb, 0x40, 0x02, 0x00, 0xa8, 0x1e, 0xf4, 0x00, 0x00, 0x80, 0x7c, 0x01,
|
||||
0x00, 0x80, 0xfe, 0x0f, 0x5e, 0x07, 0x00, 0x00, 0xfc, 0x07, 0x04, 0x04,
|
||||
0xf8, 0x07, 0x04, 0x04, 0x58, 0x9d, 0x07, 0x5b, 0x00, 0x00, 0x00, 0xc5,
|
||||
0x08, 0x7f, 0x00, 0x00, 0x80, 0xa0, 0x01, 0x00, 0x00, 0xa1, 0x2f, 0x9e,
|
||||
0x08, 0xcc, 0x2a, 0x45, 0xb1, 0x49, 0xd3, 0xa0, 0xd7, 0xf1, 0x49, 0x55,
|
||||
0x4d, 0x55, 0xbd, 0xa3, 0x73, 0xd0, 0x5a, 0x43, 0x43, 0x43, 0x5b, 0x43,
|
||||
0x43, 0x5b, 0xbd, 0xaf, 0x93, 0xf5, 0xf5, 0xf5, 0x75, 0xc4, 0x95, 0x19,
|
||||
0x75, 0x75, 0xf5, 0x80, 0xf4, 0xe0, 0x29, 0xe2, 0xf7, 0xef, 0xd3, 0xe6,
|
||||
0x63, 0x04, 0xd2, 0x02, 0x89, 0x1f, 0x1e, 0x54, 0x55, 0x1f, 0x1e, 0x54,
|
||||
0xd5, 0x1e, 0x1e, 0x54, 0xd3, 0x1e, 0x1e, 0xf4, 0xf5, 0x13, 0x14, 0xf4,
|
||||
0xf5, 0x59, 0x82, 0x82, 0x7e, 0x7e, 0xc0, 0x02, 0xde, 0xff, 0xc0, 0x82,
|
||||
0xca, 0xbe, 0x80, 0x80, 0xc0, 0xbe, 0x80, 0x80, 0xc0, 0xbf, 0x80, 0x80,
|
||||
0xd0, 0xbf, 0xc1, 0x80, 0xc0, 0x7f, 0xf1, 0x2d, 0x3a, 0x30, 0x30, 0xf4,
|
||||
0x3f, 0x30, 0x30, 0xb4, 0x36, 0x30, 0x30, 0xb0, 0x3a, 0x20, 0x20, 0xb0,
|
||||
0x5a, 0x3c, 0x27, 0x20, 0x60, 0xa5, 0x2a, 0x20, 0x20, 0xb9, 0x2b, 0x22,
|
||||
0x26, 0xb9, 0x9e, 0x89, 0x89, 0x49, 0xae, 0xaf, 0x0a, 0x48, 0xae, 0xad,
|
||||
0x0a, 0x08, 0x0c, 0xac, 0x0e, 0x0c, 0x0c, 0xac, 0x0d, 0x0d, 0x0c, 0xfc,
|
||||
0x0f, 0x0d, 0x0c, 0x14, 0xdf, 0xfe, 0x17, 0x18, 0x30, 0x28, 0xfe, 0x05,
|
||||
0x04, 0x04, 0xf6, 0x05, 0x04, 0x04, 0xfe, 0x85, 0x04, 0x04, 0xfe, 0x81,
|
||||
0x00, 0x00, 0x0e, 0x5e, 0xfe, 0x03, 0x00, 0x04, 0x48, 0x34, 0x7c, 0x81,
|
||||
0x00, 0x00, 0xa0, 0x0a, 0x00, 0x10, 0xb0, 0x1a, 0x10, 0x10, 0xa0, 0x1b,
|
||||
0x14, 0x10, 0xa0, 0x19, 0x04, 0x04, 0xa4, 0x0e, 0x04, 0x04, 0xa4, 0x0e,
|
||||
0x0c, 0x0c, 0xac, 0x0e, 0x0c, 0x0c, 0xad, 0x0e, 0x08, 0x08, 0xcc, 0x8b,
|
||||
0x17, 0x76, 0x01, 0x01, 0x01, 0xff, 0x01, 0x01, 0x01, 0xff, 0x01, 0x81,
|
||||
0x21, 0xff, 0x01, 0x81, 0x00, 0xfe, 0x01, 0x80, 0x80, 0xfe, 0x01, 0x80,
|
||||
0xc0, 0x8b, 0x1b, 0xf8, 0x87, 0x06, 0x06, 0xfe, 0x07, 0x06, 0x0e, 0xfe,
|
||||
0x0f, 0x06, 0x06, 0xfe, 0xaf, 0x06, 0x06, 0x7e, 0xaf, 0x06, 0x04, 0x6e,
|
||||
0x3f, 0x06, 0x06, 0x26, 0xdf, 0x06, 0x06, 0x26, 0x07, 0x06, 0x06, 0x56,
|
||||
0x24, 0xea, 0x00, 0x40, 0xc0, 0x70, 0x40, 0xc0, 0xd0, 0x70, 0x40, 0x80,
|
||||
0x90, 0x60, 0x60, 0x90, 0x80, 0x40, 0x70, 0xd0, 0xc0, 0x40, 0x70, 0xc0,
|
||||
0x40, 0x00, 0xd0, 0x80, 0x00, 0x00, 0x1c, 0xe1, 0x37, 0x30, 0x00, 0x10,
|
||||
0x10, 0x10, 0x10, 0x90, 0x10, 0x10, 0x10, 0x90, 0x3a, 0x00, 0x00, 0xb4,
|
||||
0x1b, 0x00, 0x00, 0xc0, 0x1b, 0x00, 0x40, 0x80, 0x0b, 0xdd, 0x0f, 0x01,
|
||||
0x00, 0x10, 0x30, 0x80, 0xf0, 0x17, 0x00, 0xc2, 0x1e, 0xdd, 0x70, 0x20,
|
||||
0x00, 0x00, 0x00, 0x61, 0xfb, 0x60, 0x2d, 0x07, 0x10, 0x18, 0x50, 0x00,
|
||||
0x08, 0x18, 0x50, 0x08, 0x08, 0x08, 0x58, 0x3d, 0x18, 0x06, 0x07, 0x05,
|
||||
0x04, 0x40, 0x03, 0x01, 0x00, 0x1c, 0xa4, 0x57, 0x02, 0x02, 0x02, 0xda,
|
||||
0xd4, 0xc0, 0xc4, 0xc0, 0xd0, 0xc0, 0xc0, 0xc0, 0xc1, 0x8b, 0x81, 0x81,
|
||||
0x81, 0x83, 0x00, 0x81, 0x81, 0x03, 0x00, 0x81, 0x83, 0x06, 0x00, 0x80,
|
||||
0x83, 0x16, 0x00, 0x80, 0xd7, 0x57, 0x00, 0x00, 0xbc, 0xfe, 0x03, 0x00,
|
||||
0xe8, 0xfe, 0x03, 0x00, 0x01, 0xfe, 0x43, 0x02, 0x03, 0xfe, 0x03, 0x02,
|
||||
0x02, 0xfe, 0x03, 0x02, 0x06, 0xbe, 0x03, 0x03, 0x56, 0xbf, 0x03, 0x03,
|
||||
0x57, 0xff, 0xab, 0xc0, 0xc0, 0xd0, 0xff, 0xc5, 0xf5, 0x60, 0x60, 0xe0,
|
||||
0x7f, 0x60, 0xe0, 0xe0, 0x7f, 0x60, 0x60, 0xe0, 0x6d, 0x60, 0x50, 0xa4,
|
||||
0x6d, 0x70, 0x70, 0xe8, 0x7f, 0x70, 0x70, 0xf0, 0x7f, 0x02, 0x0e, 0x04,
|
||||
0xf0, 0x0f, 0x09, 0x00, 0xf0, 0x0f, 0x08, 0x08, 0x58, 0x7d, 0xf0, 0xb9,
|
||||
0x1a, 0x10, 0x10, 0x70, 0x1b, 0x18, 0x18, 0x78, 0x1b, 0x09, 0x14, 0xf8,
|
||||
0x1f, 0x1c, 0x1c, 0xbc, 0xf9, 0x87, 0x06, 0x07, 0xf7, 0x87, 0x02, 0x05,
|
||||
0x75, 0x83, 0x06, 0x00, 0x78, 0x03, 0x00, 0x00, 0x70, 0x09, 0x00, 0x00,
|
||||
0x08, 0xf8, 0x15, 0x50, 0x6b, 0x39, 0x00, 0x00, 0x40, 0xc3, 0x81, 0x00,
|
||||
0xc0, 0xc1, 0x80, 0x40, 0xc0, 0xc1, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0,
|
||||
0xd0, 0xc0, 0xc0, 0xd0, 0xe0, 0xe0, 0xd0, 0xc0, 0xc0, 0xc0, 0xd0, 0xee,
|
||||
0xc1, 0xc0, 0xe0, 0xed, 0x07, 0x1b, 0x1c, 0x9e, 0xfc, 0x17, 0x1e, 0x16,
|
||||
0xfe, 0x1f, 0x4e, 0x66, 0xfe, 0x4f, 0x4c, 0x44, 0x74, 0x4f, 0x4f, 0x49,
|
||||
0x51, 0x4f, 0x4f, 0x49, 0x49, 0x57, 0x4f, 0x49, 0x49, 0x3f, 0x68, 0xce,
|
||||
0x26, 0xad, 0xef, 0x53, 0x40, 0xaa, 0xaa, 0x77, 0x60, 0xa0, 0xaf, 0x6f,
|
||||
0x60, 0xa0, 0xaf, 0xaf, 0x6c, 0xac, 0xaf, 0x6f, 0x6e, 0xa5, 0xa1, 0xd2,
|
||||
0x8b, 0x1f, 0x04, 0x2d, 0x7f, 0xbc, 0xbd, 0x7d, 0x78, 0x96, 0x04, 0x1e,
|
||||
0x2b, 0x95, 0x94, 0x2e, 0x0f, 0x94, 0x5b, 0x81, 0xb2, 0xd7, 0xb3, 0xeb,
|
||||
0xe8, 0x3a, 0xbd, 0xb8, 0xb8, 0xb8, 0xd8, 0x38, 0xfb, 0x7d, 0xfe, 0xea,
|
||||
0xea, 0xea, 0x5f, 0x5a, 0x55, 0x55, 0xfd, 0x6f, 0x9c, 0xe9, 0x29, 0xa6,
|
||||
0xac, 0x22, 0xec, 0x34, 0x45, 0x22, 0x6f, 0xd5, 0x87, 0x91, 0x41, 0x6a,
|
||||
0x45, 0x45, 0x25, 0x68, 0x45, 0x45, 0x65, 0x75, 0x45, 0x45, 0x45, 0x15,
|
||||
0x12, 0x19, 0x6c, 0x0a, 0x52, 0x51, 0x59, 0x09, 0x56, 0x55, 0x55, 0xc9,
|
||||
0xe1, 0xaa, 0xaa, 0xaa, 0x94, 0xf7, 0x08, 0xff, 0x01, 0x8e, 0xa5, 0x74,
|
||||
0x11, 0x76, 0x53, 0xde, 0x75, 0xac, 0x96, 0x1b, 0xe7, 0xfe, 0xab, 0xaa,
|
||||
0xac, 0xfe, 0xa7, 0xae, 0xac, 0x56, 0xaf, 0xae, 0xae, 0x0e, 0x12, 0xf5,
|
||||
0xe2, 0xea, 0xea, 0xe2, 0x87, 0x33, 0x95, 0x95, 0x95, 0xeb, 0x65, 0x65,
|
||||
0x65, 0xe5, 0xc1, 0x52, 0x65, 0x45, 0x45, 0x65, 0x48, 0x3b, 0xa4, 0x29,
|
||||
0x58, 0x51, 0x51, 0xe9, 0x18, 0xd3, 0xad, 0x6c, 0x1d, 0xdd, 0x8d, 0x62,
|
||||
0xc7, 0xc7, 0x8e, 0x36, 0xce, 0x87, 0xaa, 0x2a, 0x66, 0xe6, 0xf4, 0xcd,
|
||||
0xf4, 0x34, 0x16, 0xd8, 0x3f, 0x90, 0x15, 0xb8, 0xa9, 0xf0, 0xf0, 0xa0,
|
||||
0x20, 0x30, 0x57, 0x3c, 0xaf, 0x6a, 0x25, 0x20, 0xb0, 0x7a, 0x21, 0x2a,
|
||||
0x40, 0x57, 0x2f, 0x4e, 0x07, 0xf6, 0x2f, 0x04, 0x06, 0xfe, 0x0f, 0x0e,
|
||||
0x0e, 0xde, 0x0d, 0x0e, 0x0e, 0x3c, 0x43, 0x01, 0x03, 0x06, 0x12, 0x80,
|
||||
0x83, 0x0e, 0x5a, 0x80, 0x83, 0x5e, 0x48, 0x08, 0x38, 0xd0, 0x40, 0x2b,
|
||||
0x70, 0xd0, 0x41, 0x1f, 0x74, 0xd0, 0x02, 0x07, 0x7c, 0xd0, 0x03, 0x3d,
|
||||
0x3c, 0x40, 0x41, 0x2d, 0x28, 0x40, 0x41, 0x09, 0x28, 0x60, 0xc0, 0x29,
|
||||
0x30, 0x60, 0xd0, 0x20, 0x81, 0x01, 0x03, 0x05, 0x83, 0x21, 0x41, 0x01,
|
||||
0x85, 0x21, 0xe1, 0x00, 0x0c, 0x25, 0x61, 0x00, 0x0c, 0x45, 0x61, 0x00,
|
||||
0x0e, 0x43, 0x41, 0x00, 0x0a, 0x4a, 0x61, 0x01, 0x1a, 0x8e, 0x43, 0x01,
|
||||
0xd0, 0x34, 0x0e, 0x02, 0xd1, 0x24, 0x0a, 0x02, 0x60, 0x24, 0x0c, 0x06,
|
||||
0xe0, 0xa0, 0x05, 0x05, 0xa0, 0x2c, 0x07, 0x01, 0x28, 0x0d, 0x07, 0x01,
|
||||
0x24, 0x0c, 0x06, 0x03, 0x34, 0x18, 0x0c, 0x0a, 0x14, 0x05, 0x83, 0x21,
|
||||
0x41, 0x21, 0x81, 0x01, 0xe3, 0x20, 0x81, 0x01, 0x25, 0x60, 0xa0, 0x01,
|
||||
0xc5, 0xec, 0x1a, 0x10, 0x34, 0x1c, 0x0a, 0x28, 0x3c, 0x3c, 0x28, 0x29,
|
||||
0x3d, 0x3d, 0xa9, 0x2b, 0x30, 0x33, 0x70, 0x65, 0x3f, 0xa6, 0xea, 0x6f,
|
||||
0xef, 0x3f, 0xe8, 0x56, 0xfd, 0xef, 0xef, 0x07, 0xfc, 0xef, 0xef, 0x03,
|
||||
0xfc, 0xff, 0xfe, 0x7a, 0x40, 0xff, 0xef, 0xef, 0x55, 0xff, 0xef, 0xef,
|
||||
0x54, 0xff, 0xfe, 0xfe, 0x01, 0xdb, 0x01, 0x75, 0x68, 0xfa, 0xee, 0xe3,
|
||||
0x70, 0xba, 0xae, 0x23, 0x40, 0xba, 0x8e, 0x81, 0x07, 0x88, 0xfe, 0x23,
|
||||
0x00, 0x00, 0xd2, 0x2d, 0x00, 0x20, 0xc0, 0x0d, 0xd2, 0x6f, 0x72, 0x63,
|
||||
0x3c, 0xeb, 0x8d, 0xc9, 0xdd, 0x8d, 0xaa, 0xe2, 0x99, 0x7f, 0xd8, 0xd8,
|
||||
0x38, 0x39, 0xd9, 0xd8, 0x78, 0x98, 0xd9, 0x78, 0xf8, 0x9f, 0xdc, 0x18,
|
||||
0xf8, 0x9f, 0x1e, 0x1a, 0xf8, 0xff, 0x1f, 0x18, 0xf8, 0xfd, 0x1d, 0x18,
|
||||
0xf8, 0xc7, 0xff, 0xc0, 0xd0, 0xf4, 0xff, 0xc0, 0xc6, 0xe4, 0xff, 0xc3,
|
||||
0xc6, 0xcc, 0xff, 0xc8, 0xcc, 0xc8, 0xff, 0xd0, 0xef, 0xc0, 0xfe, 0xfe,
|
||||
0x7f, 0xc0, 0xfe, 0xfe, 0x7f, 0xd5, 0xdf, 0xde, 0x5f, 0x45, 0xf2, 0xb7,
|
||||
0xf7, 0x57, 0xf2, 0xa7, 0xf7, 0xf7, 0xf7, 0xa7, 0xf3, 0xf3, 0x23, 0x51,
|
||||
0x3b, 0xf8, 0x26, 0x90, 0xfb, 0xfd, 0x55, 0xfd, 0xff, 0xf9, 0xd1, 0xf9,
|
||||
0x13, 0x7f, 0x7f, 0x7a, 0x7f, 0xb8, 0x1b, 0xd5, 0x09, 0x6b, 0x32, 0xdd,
|
||||
0xff, 0xd7, 0x2a, 0x05, 0x28, 0x08, 0x9b, 0x26, 0x42, 0xe8, 0xab, 0x3b,
|
||||
0x21, 0x20, 0x30, 0x28, 0x89, 0xc0, 0x02, 0x19, 0x28, 0x30, 0x50, 0xd4,
|
||||
0x21, 0x0f, 0x5a, 0x40, 0x00, 0x0e, 0x1a, 0x50, 0x60, 0x3d, 0xfb, 0x28,
|
||||
0x0d, 0x0c, 0x18, 0x24, 0xe9, 0x3e, 0x96, 0x98, 0xf0, 0xe0, 0x80, 0x80,
|
||||
0xa0, 0xe0, 0xa1, 0x04, 0x32, 0xe0, 0xa3, 0x26, 0x3a, 0xf0, 0xe3, 0x6e,
|
||||
0x7a, 0x68, 0xf2, 0xdf, 0x41, 0x07, 0xfd, 0xbf, 0x80, 0x07, 0xfd, 0xf5,
|
||||
0x05, 0x05, 0x35, 0xe0, 0xbf, 0xe3, 0x20, 0xe0, 0xee, 0xe3, 0x60, 0x80,
|
||||
0xb6, 0xe3, 0x00, 0x00, 0xb2, 0xf7, 0x00, 0xc0, 0x83, 0x74, 0x0b, 0x00,
|
||||
0x08, 0x70, 0x83, 0x04, 0x40, 0x81, 0x83, 0x06, 0xc2, 0x1d, 0x16, 0x3f,
|
||||
0x58, 0x95, 0x90, 0x92, 0x5a, 0x97, 0x14, 0x13, 0xd9, 0x97, 0x14, 0x13,
|
||||
0xc3, 0xbf, 0xf0, 0xb0, 0xf0, 0xff, 0xe4, 0xf0, 0xe0, 0xbf, 0xe0, 0xa1,
|
||||
0xe2, 0xbf, 0xa0, 0xdd, 0xc2, 0xaf, 0x81, 0x89, 0xc8, 0x7f, 0x80, 0x80,
|
||||
0xc1, 0x3f, 0x00, 0x00, 0xe5, 0x3f, 0x05, 0x05, 0xc5, 0xf8, 0x0f, 0x09,
|
||||
0x47, 0xf3, 0x0f, 0x06, 0x43, 0x02, 0x09, 0x06, 0x43, 0x03, 0x0c, 0x4a,
|
||||
0xc3, 0x01, 0x06, 0x4b, 0x8b, 0x01, 0x00, 0x48, 0xeb, 0x61, 0x16, 0x9a,
|
||||
0x4d, 0xec, 0x10, 0xb4, 0xbd, 0x28, 0x60, 0xa4, 0xbc, 0x6c, 0x28, 0xbe,
|
||||
0xbe, 0x28, 0x28, 0xbe, 0xbe, 0xb8, 0xb9, 0xbe, 0xbe, 0xbe, 0xf8, 0x39,
|
||||
0xb3, 0x82, 0x59, 0xce, 0x7e, 0x7d, 0x4d, 0xa3, 0xf0, 0x4b, 0x04, 0xa6,
|
||||
0x03, 0x66, 0xe0, 0xe1, 0xab, 0xaa, 0xe8, 0xe9, 0xab, 0x28, 0xfa, 0xfa,
|
||||
0xfa, 0x28, 0xfa, 0xfa, 0xfa, 0x58, 0x9c, 0xbe, 0xbe, 0x3e, 0x94, 0x83,
|
||||
0xe5, 0xaa, 0xaa, 0x2a, 0xc1, 0xca, 0x8a, 0x0a, 0xc1, 0xe2, 0xfb, 0x97,
|
||||
0x97, 0x97, 0x96, 0xe6, 0x97, 0x97, 0x97, 0xe6, 0x96, 0x96, 0x96, 0x50,
|
||||
0xa7, 0x34, 0x04, 0x54, 0xa7, 0x36, 0x06, 0x54, 0x27, 0x2c, 0x2c, 0x5c,
|
||||
0x17, 0x34, 0x2c, 0x54, 0x07, 0x54, 0x2c, 0x57, 0x0f, 0x54, 0x24, 0x55,
|
||||
0x37, 0x04, 0x54, 0x57, 0x34, 0x14, 0x5c, 0x6f, 0x0a, 0x0d, 0x05, 0xd7,
|
||||
0x2d, 0x2d, 0x2d, 0xd7, 0x7d, 0x7d, 0x7d, 0xd3, 0xfc, 0xfd, 0xff, 0x01,
|
||||
0xde, 0xdf, 0xff, 0x81, 0x0e, 0x06, 0x01, 0x0d, 0xfa, 0xfc, 0x7c, 0xfa,
|
||||
0x49, 0xe0, 0x3a, 0x3c, 0xbc, 0x6a, 0x2a, 0x3c, 0xbc, 0x6a, 0x1a, 0x34,
|
||||
0xde, 0xc2, 0x3f, 0x34, 0x5d, 0xc7, 0x3f, 0x14, 0x54, 0x77, 0xb7, 0xc0,
|
||||
0x23, 0xa5, 0x5c, 0x5d, 0xf1, 0xb7, 0xf7, 0x97, 0x18, 0xe1, 0x6f, 0x75,
|
||||
0xc4, 0xb7, 0xcd, 0x87, 0x87, 0xaa, 0xaa, 0xec, 0x23, 0x0f, 0x0f, 0xa5,
|
||||
0xa5, 0x10, 0x58, 0xa0, 0x09, 0x1f, 0x50, 0x40, 0x09, 0x1b, 0x48, 0x40,
|
||||
0x01, 0x33, 0x60, 0x20, 0x81, 0xa3, 0xa2, 0x22, 0x80, 0xa7, 0xa6, 0xa6,
|
||||
0xfe, 0xaf, 0xae, 0xae, 0x2e, 0x2f, 0xaf, 0xae, 0xae, 0x1e, 0xfe, 0xa9,
|
||||
0xa9, 0xa9, 0xff, 0xab, 0xb5, 0xb5, 0xff, 0xab, 0xd5, 0xb5, 0x25, 0xc6,
|
||||
0x1e, 0xdb, 0x14, 0x69, 0x69, 0x19, 0x14, 0x69, 0x69, 0x14, 0x56, 0x16,
|
||||
0x0a, 0xb5, 0x5c, 0x2a, 0xb3, 0x51, 0xb3, 0x31, 0x8a, 0x54, 0xb7, 0x8a,
|
||||
0xa1, 0x11, 0x68, 0x5a, 0xa7, 0x2b, 0x82, 0xe9, 0xd2, 0xa2, 0xd4, 0xba,
|
||||
0xb2, 0xaa, 0x6a, 0x98, 0x3a, 0x58, 0xec, 0x88, 0x12, 0xa6, 0xf6, 0x5a,
|
||||
0x70, 0x3f, 0xff, 0x32, 0x86, 0xd6, 0xd7, 0x83, 0x82, 0xf5, 0x89, 0xd1,
|
||||
0xc9, 0x0a, 0x05, 0x83, 0xd5, 0x0b, 0x53, 0x81, 0xd5, 0x81, 0xd3, 0x8b,
|
||||
0x55, 0x01, 0xd1, 0x8b, 0xd5, 0x01, 0x81, 0x8b, 0x7d, 0x1c, 0x1c, 0x1c,
|
||||
0xfc, 0x1f, 0x1c, 0x18, 0xbc, 0x0f, 0x1c, 0x7c, 0xdc, 0x05, 0x1c, 0x74,
|
||||
0xfc, 0x57, 0x54, 0x44, 0xfc, 0xd2, 0xc0, 0x41, 0xfe, 0x93, 0xc0, 0x80,
|
||||
0xfd, 0x83, 0x82, 0x42, 0xf9, 0xeb, 0x12, 0x05, 0xd3, 0xd3, 0xab, 0x7f,
|
||||
0x93, 0xb2, 0xb5, 0x7b, 0xf9, 0x3f, 0xf4, 0x3b, 0xf0, 0xbf, 0xb6, 0x76,
|
||||
0xf5, 0x7f, 0xb6, 0x76, 0xf5, 0x3f, 0x36, 0x36, 0x33, 0x33, 0x63, 0x4e,
|
||||
0x4e, 0x36, 0x36, 0x4e, 0x4e, 0x66, 0x16, 0x0e, 0x06, 0x06, 0x06, 0x06,
|
||||
0xde, 0x26, 0x07, 0x06, 0x3e, 0x6e, 0x07, 0x34, 0xa6, 0x56, 0x07, 0x34,
|
||||
0xa4, 0x2c, 0xbf, 0xb8, 0x03, 0x20, 0x20, 0xa0, 0x4a, 0x01, 0x01, 0x81,
|
||||
0x2b, 0x03, 0x81, 0x80, 0xff, 0x91, 0x99, 0x91, 0xff, 0x81, 0xdf, 0xa1,
|
||||
0xff, 0x05, 0x3b, 0xc1, 0x7f, 0x11, 0x13, 0x83, 0x5f, 0x53, 0x53, 0x29,
|
||||
0xd5, 0x91, 0x54, 0x31, 0x50, 0xbd, 0x5c, 0x11, 0x50, 0x7d, 0x4d, 0x52,
|
||||
0x60, 0x75, 0x6c, 0x72, 0x70, 0x68, 0x68, 0x70, 0x72, 0x6c, 0x78, 0xf8,
|
||||
0x5a, 0xb0, 0x2f, 0xf4, 0xcb, 0x5a, 0x9e, 0x05, 0x70, 0xaa, 0xd4, 0x7f,
|
||||
0xbf, 0x8c, 0x44, 0xc0, 0xcc, 0x8c, 0x8d, 0xfd, 0xcf, 0x9c, 0x3c, 0xfc,
|
||||
0x0f, 0xfc, 0x0e, 0xad, 0x0e, 0x58, 0x98, 0x7d, 0xb9, 0x23, 0x26, 0x26,
|
||||
0xaa, 0x42, 0x66, 0x06, 0xee, 0x83, 0x62, 0x22, 0xaa, 0x02, 0x00, 0x40,
|
||||
0x0a, 0xcc, 0x9b, 0xc4, 0xd5, 0x9d, 0xef, 0xca, 0xa7, 0x56, 0xc1, 0x78,
|
||||
0x7a, 0xc5, 0x31, 0x0b, 0xb2, 0x0f, 0xd7, 0x8c, 0x98, 0x8d, 0x9b, 0x55,
|
||||
0xed, 0x17, 0x53, 0xb5, 0xe3, 0x56, 0x5b, 0x7d, 0xf5, 0xb5, 0x79, 0xf6,
|
||||
0xec, 0x50, 0x05, 0x77, 0x40, 0xde, 0xde, 0xde, 0x1e, 0x1c, 0x1e, 0xd3,
|
||||
0xc2, 0xf1, 0xd3, 0xff, 0xff, 0x82, 0x82, 0xff, 0x74, 0x0b, 0x80, 0x3b,
|
||||
0x20, 0x20, 0xa0, 0x4a, 0x20, 0x20, 0x20, 0x2e, 0xa5, 0xa1, 0x20, 0xab,
|
||||
0x80, 0x80, 0x80, 0x9a, 0xaa, 0x5f, 0x50, 0x00, 0x0a, 0x2e, 0x91, 0x91,
|
||||
0xc8, 0x7e, 0xdc, 0x0e, 0x0e, 0x1c, 0xec, 0x0e, 0x0d, 0xd4, 0x8e, 0x02,
|
||||
0x94, 0x6a, 0xfd, 0x03, 0xec, 0xaa, 0xae, 0x06, 0x88, 0x98, 0xa0, 0xfb,
|
||||
0xef, 0xd0, 0xc0, 0xff, 0xff, 0xc0, 0xd0, 0xef, 0xa0, 0x79, 0x94, 0xde,
|
||||
0x5c, 0x8a, 0xa8, 0x03, 0x41, 0x43, 0x4f, 0x5c, 0xc5, 0xca, 0x0a, 0x09,
|
||||
0xda, 0xaa, 0x81, 0x42, 0xc5, 0xaa, 0x80, 0xe9, 0x85, 0xc4, 0x41, 0x01,
|
||||
0xc1, 0xdb, 0x81, 0x6d, 0xa3, 0x8a, 0xc3, 0x5f, 0xf1, 0x8b, 0x8a, 0xc4,
|
||||
0x55, 0xc9, 0xe7, 0x8f, 0xa7, 0x2e, 0x45, 0x8c, 0xac, 0x91, 0x68, 0x94,
|
||||
0x81, 0x56, 0xf9, 0x49, 0x5c, 0x60, 0x49, 0xb7, 0x3e, 0x79, 0x8a, 0x6e,
|
||||
0x42, 0x5d, 0x1b, 0xa5, 0x91, 0x19, 0xa8, 0x3c, 0x76, 0x09, 0x7f, 0x0a,
|
||||
0x5b, 0x03, 0x0c, 0x48, 0xbc, 0xd2, 0xb3, 0x5c, 0x89, 0xab, 0xcc, 0x23,
|
||||
0xb5, 0xba, 0x60, 0x3a, 0xa0, 0x4c, 0x08, 0xc9, 0xc2, 0xbe, 0x7a, 0x71,
|
||||
0xf4, 0xee, 0x2a, 0x88, 0xfb, 0xa1, 0x71, 0xd6, 0x71, 0x1c, 0xbf, 0xd7,
|
||||
0xe7, 0xfb, 0x3c, 0x97, 0xfb, 0x93, 0xbb, 0xeb, 0xe5, 0x8f, 0xa9, 0x25,
|
||||
0x69, 0xb5, 0xc6, 0xb6, 0x81, 0x08, 0xfe, 0x02, 0xcd, 0xa4, 0xee, 0x15,
|
||||
0x44, 0xb2, 0x88, 0xa0, 0x88, 0x7f, 0x8b, 0xf4, 0xb7, 0x10, 0x5d, 0x54,
|
||||
0x5c, 0x9c, 0x1d, 0x5c, 0xa4, 0x28, 0xe8, 0x56, 0xc1, 0xe2, 0xe0, 0xe2,
|
||||
0xa2, 0x52, 0x28, 0x0a, 0x59, 0xa4, 0x28, 0xa8, 0x88, 0x6e, 0xba, 0xa4,
|
||||
0x0e, 0xc5, 0xe2, 0x24, 0x6e, 0xb7, 0xb8, 0x88, 0x0e, 0x25, 0x18, 0xfb,
|
||||
0x07, 0x6b, 0x85, 0xfc, 0xbd, 0xa4, 0x97, 0xbb, 0x3c, 0xc9, 0x3d, 0xdf,
|
||||
0xe7, 0xf9, 0xbe, 0xc9, 0x85, 0x77, 0xb0, 0xf3, 0x7b, 0x7e, 0xcf, 0x63,
|
||||
0xaf, 0x2a, 0xed, 0x24, 0xad, 0x30, 0xd6, 0x58, 0x6b, 0x8b, 0xda, 0x3b,
|
||||
0x62, 0x1d, 0xd3, 0x8e, 0xad, 0x96, 0x16, 0x69, 0xc2, 0xb8, 0x80, 0x10,
|
||||
0x6b, 0x51, 0x5b, 0xc7, 0x3a, 0x63, 0x0b, 0x1d, 0x14, 0xa3, 0xd4, 0x56,
|
||||
0xf7, 0x30, 0x54, 0x95, 0x29, 0x75, 0x01, 0xe3, 0x22, 0xea, 0x06, 0xc6,
|
||||
0xb8, 0x8f, 0x48, 0x1b, 0x4b, 0x8a, 0xd8, 0xfe, 0x30, 0xd1, 0x61, 0x88,
|
||||
0x65, 0x4a, 0x18, 0x65, 0x5c, 0x40, 0xa9, 0x65, 0x08, 0x26, 0xa8, 0xeb,
|
||||
0x09, 0x46, 0x64, 0x50, 0x71, 0x01, 0x49, 0x13, 0xb7, 0x30, 0xee, 0x20,
|
||||
0xf8, 0x83, 0x5a, 0x22, 0x2e, 0x22, 0x75, 0x13, 0x09, 0x8a, 0x88, 0xbd,
|
||||
0x2e, 0x23, 0x6a, 0x0b, 0x09, 0x62, 0x2f, 0x11, 0x84, 0x88, 0x25, 0x23,
|
||||
0xc4, 0x56, 0x17, 0x11, 0x37, 0x30, 0xe3, 0x22, 0x12, 0x37, 0x50, 0x21,
|
||||
0x21, 0xf8, 0xc3, 0x5e, 0x57, 0x50, 0x57, 0x90, 0xd7, 0xeb, 0xfd, 0xfe,
|
||||
0x7c, 0x3f, 0xcf, 0xe7, 0xfb, 0xfb, 0x7c, 0x7e, 0xcf, 0xf9, 0xfc, 0xce,
|
||||
0xef, 0xf9, 0x3d, 0xcf, 0x73, 0xb6, 0x99, 0x79, 0x7e, 0xbf, 0x39, 0xcb,
|
||||
0x73, 0x9e, 0xf3, 0x9c, 0xe7, 0x9c, 0xf3, 0x3b, 0x33, 0x73, 0xce, 0x79,
|
||||
0xa6, 0x33, 0x6f, 0x0c, 0x60, 0x12, 0x00, 0x21, 0x08, 0xc3, 0x40, 0x00,
|
||||
0xdc, 0x83, 0x4a, 0x6b, 0x09, 0x0e, 0x2f, 0x03, 0x04, 0x00, 0x7a, 0x65,
|
||||
0x73, 0x6b, 0x4b, 0xcb, 0xf5, 0x21, 0x07, 0xd1, 0x97, 0x11, 0x9c, 0x14,
|
||||
0x1c, 0x84, 0xc2, 0x09, 0x08, 0x89, 0x06, 0x82, 0x06, 0x12, 0x0d, 0x04,
|
||||
0x0d, 0x24, 0x1a, 0x08, 0x1a, 0x48, 0x34, 0x10, 0x34, 0x90, 0x68, 0x20,
|
||||
0x68, 0x20, 0xd1, 0x40, 0xd0, 0xd0, 0xd0, 0xd0, 0xd0, 0xd0, 0xd0, 0xd0,
|
||||
0xd0, 0xd0, 0xd0, 0xd0, 0xd0, 0xd0, 0xd0, 0xd0, 0x10, 0x12, 0x71, 0x69,
|
||||
0x9b, 0x9a, 0xcb, 0x5a, 0x9b, 0x8e, 0xcd, 0xa6, 0xd5, 0xd6, 0x89, 0xcd,
|
||||
0x60, 0x6e, 0x64, 0xac, 0x89, 0xb1, 0x8c, 0x01, 0x11, 0x21, 0x06, 0xbc,
|
||||
0xb4, 0xd7, 0xfa, 0x8f, 0xc5, 0x53, 0xfd, 0x55, 0xb3, 0x71, 0xce, 0x6c,
|
||||
0x9a, 0x2c, 0x3c, 0x80, 0x69, 0xb6, 0x02, 0x67, 0x3c, 0xed, 0xdc, 0x45,
|
||||
0x63, 0x63, 0x2f, 0xe3, 0xe7, 0xfc, 0xb5, 0x9d, 0x27, 0x59, 0xa4, 0x17,
|
||||
0x10, 0x62, 0x80, 0x21, 0xc4, 0x00, 0x43, 0x88, 0x01, 0x86, 0x10, 0x03,
|
||||
0x0c, 0x21, 0x06, 0x18, 0x42, 0x9f, 0x66, 0x93, 0xcc, 0xbd, 0xee, 0x66,
|
||||
0x66, 0x32, 0x73, 0xf4, 0x7a, 0x33, 0xa9, 0xfa, 0x31, 0xa3, 0x51, 0x8e,
|
||||
0x1e, 0x0d, 0x60, 0x47, 0x78, 0x75, 0x7a, 0xb9, 0x2b, 0x4e, 0x57, 0x8c,
|
||||
0xaa, 0x00, 0x1a, 0xed, 0x01, 0x54, 0x55, 0x00, 0xf9, 0x0b, 0x39, 0xf5,
|
||||
0x97, 0xff, 0xfe, 0x0b, 0x13, 0xa0, 0x0a, 0xa0, 0x0a, 0xa0, 0x0a, 0xa0,
|
||||
0x0a, 0xa0, 0x5e, 0x49, 0x78, 0x4f, 0x07, 0xdf, 0x09, 0x0f, 0x78, 0x0f,
|
||||
0x78, 0x8f, 0x1a, 0x7e, 0xe3, 0xed, 0x5c, 0xef, 0xbe, 0xec, 0xe5, 0x6e,
|
||||
0xe7, 0x0a, 0x0a, 0xc8, 0x3b, 0xb2, 0x13, 0x50, 0x05, 0x54, 0x01, 0x2d,
|
||||
0x14, 0x14, 0x90, 0x7e, 0x94, 0x9f, 0xfc, 0xbd, 0xae, 0xce, 0x8d, 0x1f,
|
||||
0xab, 0x3a, 0xb2, 0x1b, 0xaa, 0xa4, 0x2a, 0xa9, 0x4a, 0xd2, 0x2b, 0x71,
|
||||
0x88, 0x9b, 0x9d, 0x74, 0xf0, 0x13, 0xbb, 0x2a, 0xfd, 0xf5, 0x42, 0xba,
|
||||
0x4a, 0xc2, 0xed, 0x38, 0x79, 0x22, 0xb7, 0xf3, 0x08, 0x15, 0x07, 0x14,
|
||||
0x05, 0x50, 0x14, 0x40, 0x51, 0x00, 0x45, 0x01, 0x14, 0x05, 0xfa, 0x47,
|
||||
0xec, 0xbe, 0x43, 0x80, 0x82, 0x84, 0x08, 0x20, 0x02, 0x48, 0x21, 0xa2,
|
||||
0x52, 0xa4, 0x50, 0x35, 0x5f, 0xaa, 0xb7, 0xf8, 0x10, 0x7a, 0xa2, 0x56,
|
||||
0x97, 0x9f, 0x86, 0xde, 0x74, 0xbf, 0xb4, 0x33, 0xfa, 0x76, 0x3f, 0x4a,
|
||||
0x35, 0x84, 0xb0, 0xd9, 0x05, 0xdd, 0x99, 0x3c, 0x94, 0xba, 0x4c, 0x5b,
|
||||
0xe8, 0x42, 0xee, 0x9d, 0x82, 0x5e, 0xfc, 0xb3, 0xfe, 0x2d, 0x39, 0xfd,
|
||||
0x9b, 0x3c, 0x94, 0xaa, 0x5a, 0x90, 0xca, 0x64, 0x5e, 0x24, 0x21, 0x50,
|
||||
0xa5, 0xea, 0x43, 0x21, 0x84, 0x10, 0x98, 0xbc, 0xfa, 0x2b, 0x97, 0x3a,
|
||||
0x27, 0xb4, 0x4b, 0x08, 0xd0, 0x56, 0xa7, 0x9a, 0xdc, 0xdc, 0xf3, 0xfd,
|
||||
0x80, 0xd0, 0x4e, 0x8f, 0xd0, 0x39, 0x21, 0xe1, 0x55, 0x1d, 0x1d, 0xbd,
|
||||
0x82, 0x48, 0x4e, 0xf2, 0xc5, 0x65, 0x79, 0xac, 0x83, 0xa7, 0x96, 0x8e,
|
||||
0xc5, 0xd1, 0x51, 0x09, 0x9b, 0x5d, 0x20, 0x0d, 0x48, 0x5b, 0xe8, 0xc2,
|
||||
0x27, 0x1e, 0x16, 0x48, 0x3f, 0xed, 0xa7, 0x2f, 0xef, 0xc1, 0x3d, 0x16,
|
||||
0xd2, 0x02, 0xaf, 0xea, 0xe8, 0xe8, 0x84, 0xa8, 0x24, 0x1f, 0x93, 0x57,
|
||||
0xca, 0xcf, 0x5b, 0xb1, 0x07, 0x63, 0x87, 0xc7, 0xa3, 0xd7, 0x28, 0xb4,
|
||||
0xe9, 0x95, 0xa0, 0xad, 0x28, 0x8c, 0xe7, 0x16, 0xbb, 0x27, 0x76, 0xe9,
|
||||
0x95, 0x40, 0x24, 0xa2, 0x52, 0x52, 0xa6, 0x50, 0x35, 0x5f, 0x61, 0xd5,
|
||||
0x47, 0xe5, 0x65, 0xfd, 0xc9, 0x5e, 0xea, 0xcb, 0xe0, 0x0b, 0x35, 0xbc,
|
||||
0x82, 0xb6, 0xbb, 0xc1, 0x42, 0x40, 0x90, 0x56, 0xe8, 0xc6, 0x9f, 0xce,
|
||||
0xff, 0x6a, 0x2f, 0xc6, 0x99, 0x9c, 0x78, 0x05, 0x91, 0xc4, 0x9b, 0x16,
|
||||
0x0a, 0x96, 0x44, 0xf2, 0x21, 0x38, 0xd1, 0xda, 0x2f, 0x2d, 0x65, 0x28,
|
||||
0x84, 0xb6, 0x69, 0x68, 0x95, 0xe0, 0xfa, 0x01, 0xbe, 0xe8, 0xea, 0x41,
|
||||
0x09, 0xe1, 0x21, 0x1c, 0x0d, 0xbd, 0xaa, 0xa3, 0xd0, 0x6b, 0x9e, 0xda,
|
||||
0x32, 0xf7, 0x7f, 0xfb, 0x3f, 0x0f, 0x07, 0x4f, 0x27, 0xa0, 0xed, 0x6e,
|
||||
0x90, 0x06, 0xa4, 0x15, 0xba, 0xe1, 0x3d, 0x0b, 0xc8, 0xbf, 0x5d, 0xfc,
|
||||
0x24, 0xb7, 0x23, 0xf4, 0x9e, 0x0e, 0x9e, 0x34, 0xb1, 0xea, 0x2b, 0x4e,
|
||||
0x6e, 0x3c, 0xe0, 0x44, 0xb3, 0xa2, 0xac, 0x38, 0xa1, 0x6d, 0x27, 0x04,
|
||||
0xad, 0x2a, 0xc2, 0x4a, 0xcb, 0x1e, 0xd6, 0x49, 0x05, 0xa8, 0x10, 0x42,
|
||||
0x98, 0x52, 0xb4, 0x22, 0xdc, 0x57, 0x3d, 0xdc, 0x7e, 0x61, 0x47, 0x4c,
|
||||
0x5e, 0x8c, 0x4e, 0x72, 0x02, 0xda, 0x01, 0x48, 0xc1, 0x41, 0xd8, 0x15,
|
||||
0x7b, 0x04, 0x6d, 0x00, 0x48, 0x2a, 0xc6, 0x70, 0x7b, 0xcd, 0x9f, 0xe3,
|
||||
0x9b, 0xf3, 0xd5, 0x24, 0x30, 0x38, 0x49, 0x09, 0x54, 0xa9, 0xfa, 0xd4,
|
||||
0x3d, 0x9a, 0xab, 0x20, 0xb8, 0x2a, 0xca, 0x2a, 0x6d, 0xd0, 0x5e, 0xda,
|
||||
0xa8, 0x42, 0x54, 0x83, 0x7b, 0xfe, 0xe2, 0x79, 0x54, 0x01, 0xaa, 0x34,
|
||||
0xf4, 0x55, 0xd6, 0xa8, 0x8e, 0xf6, 0x3f, 0xc8, 0x82, 0x83, 0xd0, 0x57,
|
||||
0xe9, 0x50, 0xa5, 0x10, 0x76, 0x02, 0xa4, 0xbd, 0xe8, 0x0a, 0x69, 0x03,
|
||||
0x80, 0xaf, 0xd2, 0xa1, 0x4a, 0x27, 0xd3, 0xf6, 0x00, 0x77, 0xef, 0xab,
|
||||
0x70, 0xa8, 0x52, 0x08, 0x54, 0x2a, 0x85, 0xdb, 0xf1, 0xcd, 0xf3, 0x72,
|
||||
0xc2, 0x8a, 0x93, 0x28, 0xb4, 0xd3, 0x09, 0xed, 0x47, 0x1b, 0xd1, 0x49,
|
||||
0xac, 0x14, 0xd2, 0x39, 0x87, 0x28, 0xac, 0x10, 0x92, 0x30, 0x25, 0xdd,
|
||||
0x70, 0xfb, 0x57, 0x25, 0x27, 0x20, 0x92, 0xa7, 0x21, 0x54, 0xc7, 0x44,
|
||||
0xb1, 0x6a, 0x14, 0x5a, 0xed, 0x9d, 0x6e, 0x20, 0x97, 0x4a, 0x0b, 0x6c,
|
||||
0xf6, 0x8d, 0x6a, 0x2d, 0x3d, 0x63, 0xa5, 0x66, 0xb6, 0x52, 0x27, 0x54,
|
||||
0xd3, 0x78, 0x65, 0x3f, 0x52, 0xa5, 0x9a, 0x0a, 0x79, 0x86, 0x88, 0xae,
|
||||
0x81, 0x5a, 0xa4, 0x2d, 0x74, 0x21, 0xa9, 0x18, 0x4b, 0x2a, 0x01, 0xec,
|
||||
0x57, 0x9e, 0x82, 0x8f, 0xe1, 0x14, 0x68, 0xaa, 0xa8, 0x9d, 0x9d, 0xbe,
|
||||
0xaf, 0x10, 0xc2, 0x23, 0x4c, 0x82, 0x5a, 0x59, 0x7b, 0xf7, 0x99, 0x6a,
|
||||
0xee, 0x93, 0xbc, 0x4e, 0xad, 0x56, 0xab, 0x49, 0x70, 0xd9, 0xd5, 0x20,
|
||||
0x20, 0x6d, 0x29, 0x80, 0xf7, 0x4a, 0xec, 0xfd, 0xd9, 0x1d, 0x04, 0x7a,
|
||||
0x1a, 0xce, 0x3c, 0x47, 0x3c, 0x64, 0xf0, 0xcc, 0x01, 0x4e, 0xbc, 0x87,
|
||||
0x83, 0x9f, 0xcb, 0x07, 0xd5, 0x81, 0xc4, 0x1d, 0xe7, 0x1c, 0xa1, 0x26,
|
||||
0x21, 0x8f, 0x9c, 0xd7, 0x3e, 0xac, 0x86, 0x50, 0x0b, 0x0c, 0xc3, 0x39,
|
||||
0xe4, 0x80, 0x1c, 0x58, 0x23, 0x02, 0xed, 0x8b, 0x2e, 0x78, 0x0f, 0x07,
|
||||
0x4f, 0x27, 0x20, 0xaa, 0x51, 0x6f, 0x0f, 0xb3, 0x47, 0x4f, 0x9a, 0x8a,
|
||||
0x5d, 0x2c, 0x3f, 0x12, 0x9d, 0x10, 0xb1, 0x59, 0x8b, 0x94, 0x88, 0x6b,
|
||||
0xba, 0xec, 0x9a, 0x65, 0x33, 0x6b, 0x36, 0x9b, 0x52, 0x53, 0xa8, 0xb1,
|
||||
0x59, 0xd2, 0x41, 0x68, 0x33, 0xe6, 0x10, 0x69, 0xe2, 0x37, 0x05, 0x17,
|
||||
0x01, 0x51, 0xf5, 0x61, 0xe4, 0xeb, 0x9e, 0x86, 0x54, 0x61, 0x70, 0x10,
|
||||
0xa6, 0xd2, 0x9b, 0x16, 0xd5, 0x7b, 0x4a, 0x51, 0x41, 0xc3, 0x68, 0x26,
|
||||
0xff, 0x2e, 0x15, 0xa1, 0x99, 0xdf, 0xe1, 0xa6, 0x43, 0x85, 0x50, 0xab,
|
||||
0x08, 0x84, 0xaa, 0x08, 0xc3, 0x69, 0xb5, 0xdf, 0x55, 0xe6, 0x2c, 0x54,
|
||||
0x0e, 0xb8, 0x0a, 0x20, 0x74, 0x02, 0xda, 0xd5, 0x85, 0x94, 0xd5, 0x58,
|
||||
0x50, 0x09, 0x60, 0x1e, 0xdc, 0xa9, 0x3e, 0x39, 0x25, 0x91, 0xbc, 0x12,
|
||||
0xd5, 0xfb, 0x56, 0x35, 0xd5, 0x82, 0x93, 0x2a, 0xc9, 0x57, 0x45, 0x95,
|
||||
0x87, 0xb3, 0xb2, 0xa8, 0x35, 0x9a, 0x42, 0x34, 0x85, 0x25, 0xa9, 0x51,
|
||||
0x24, 0x50, 0x84, 0x36, 0x13, 0x40, 0xa2, 0x49, 0x90, 0xfb, 0x4a, 0x4a,
|
||||
0x02, 0xa7, 0xee, 0x6a, 0xae, 0x72, 0x8f, 0x9e, 0x85, 0x80, 0xf0, 0x89,
|
||||
0x0e, 0x1a, 0x12, 0x82, 0xd7, 0xc1, 0x4c, 0x0d, 0x01, 0xc5, 0x2c, 0x34,
|
||||
0xe7, 0xae, 0xdf, 0x15, 0x5c, 0x08, 0x8e, 0xd5, 0x40, 0x30, 0x06, 0x84,
|
||||
0x40, 0x09, 0x70, 0x74, 0x02, 0xda, 0xd5, 0x05, 0x9f, 0xe0, 0xa0, 0x54,
|
||||
0x02, 0xf0, 0x9e, 0x17, 0x2f, 0xe0, 0x59, 0x08, 0x11, 0x5d, 0xc3, 0x96,
|
||||
0x42, 0xd9, 0x95, 0xbc, 0x32, 0x3a, 0xa9, 0x38, 0x15, 0x06, 0x61, 0x59,
|
||||
0x4e, 0x47, 0x47, 0xe9, 0x0a, 0x11, 0x07, 0x14, 0x14, 0x50, 0x68, 0xb3,
|
||||
0xa2, 0x8c, 0x42, 0x20, 0xd2, 0x5d, 0xdc, 0xa5, 0x06, 0x27, 0x11, 0x59,
|
||||
0x4f, 0xe9, 0x9a, 0x56, 0xab, 0xb2, 0x74, 0x10, 0xa6, 0x9c, 0x2d, 0xf8,
|
||||
0x2a, 0x80, 0xd0, 0x39, 0x01, 0x27, 0x20, 0x02, 0x14, 0xa1, 0x08, 0x45,
|
||||
0x28, 0x42, 0x11, 0x8a, 0x50, 0x84, 0x22, 0x14, 0xa1, 0x08, 0x45, 0x28,
|
||||
0x42, 0x11, 0x8a, 0x30, 0xe5, 0x6c, 0x41, 0x29, 0x04, 0x90, 0xb2, 0x9b,
|
||||
0x66, 0x2b, 0xf0, 0x2a, 0xc2, 0x12, 0x3d, 0x81, 0x4a, 0x57, 0x55, 0x02,
|
||||
0x09, 0x61, 0xa2, 0x82, 0x24, 0x49, 0x92, 0x24, 0x49, 0x92, 0x24, 0x49,
|
||||
0x92, 0x24, 0x49, 0x92, 0x09, 0x65, 0x12, 0x02, 0x09, 0x82, 0xef, 0xa5,
|
||||
0xe1, 0x3a, 0xbf, 0x5e, 0x3a, 0x24, 0x2a, 0x01, 0xf8, 0x44, 0x87, 0x14,
|
||||
0x28, 0x9d, 0x03, 0x49, 0x92, 0x24, 0x49, 0x92, 0x24, 0x49, 0x92, 0x24,
|
||||
0x49, 0x92, 0x24, 0x7d, 0x12, 0xc7, 0x44, 0x25, 0x00, 0x9f, 0x58, 0xe3,
|
||||
0x57, 0x48, 0xa3, 0xaf, 0x75, 0x39, 0x44, 0x21, 0x10, 0x9d, 0x44, 0x28,
|
||||
0x48, 0x92, 0x24, 0x49, 0x92, 0x24, 0x49, 0x92, 0x24, 0x49, 0x92, 0x24,
|
||||
0x19, 0x95, 0x51, 0x08, 0x44, 0x22, 0xff, 0x54, 0x42, 0x08, 0xdb, 0x53,
|
||||
0x0c, 0xe6, 0x4a, 0x2a, 0x01, 0xa4, 0x2c, 0x46, 0xa7, 0x34, 0x87, 0x7e,
|
||||
0x70, 0xf2, 0xc1, 0xf5, 0x9d, 0xc8, 0x3b, 0xe9, 0x0b, 0xe5, 0x85, 0x7d,
|
||||
0x42, 0x9e, 0xe8, 0x13, 0xf2, 0x44, 0x9f, 0x90, 0x27, 0xfa, 0x84, 0x3c,
|
||||
0xd1, 0x27, 0xe4, 0x89, 0x3e, 0x91, 0xb2, 0x18, 0x33, 0x95, 0x00, 0x52,
|
||||
0x66, 0x89, 0xcb, 0x97, 0x29, 0x01, 0x3c, 0xc2, 0xe4, 0x84, 0x50, 0x94,
|
||||
0x1e, 0x10, 0x12, 0x04, 0x41, 0x10, 0x04, 0x41, 0x10, 0x04, 0x41, 0x10,
|
||||
0x04, 0x41, 0x78, 0x08, 0x9f, 0xbc, 0x32, 0x41, 0xec, 0x59, 0x49, 0xe0,
|
||||
0xc2, 0xd3, 0x21, 0x69, 0x38, 0x79, 0x28, 0xbd, 0xa7, 0x43, 0x22, 0xd0,
|
||||
0xb9, 0xe4, 0x01, 0x25, 0x41, 0x10, 0x04, 0x41, 0x10, 0x04, 0x41, 0x10,
|
||||
0x04, 0x41, 0x78, 0x4f, 0x87, 0xa4, 0x5d, 0x0b, 0xbc, 0xa2, 0x81, 0x5f,
|
||||
0x99, 0x4a, 0x20, 0x9c, 0x58, 0xe9, 0x62, 0xf2, 0xca, 0x28, 0x8c, 0x4a,
|
||||
0x21, 0x41, 0x10, 0x04, 0x41, 0x10, 0x04, 0x41, 0x10, 0x04, 0x41, 0x10,
|
||||
0x44, 0x14, 0x46, 0x21, 0x10, 0x89, 0xfc, 0x32, 0x85, 0x92, 0xb2, 0xbd,
|
||||
0x9b, 0xd2, 0x5c, 0xa6, 0x05, 0x29, 0x8b, 0x31, 0x2b, 0xd0, 0x0a, 0x80,
|
||||
0xfa, 0x00, 0x54, 0x71, 0x02, 0xda, 0x06, 0x34, 0x08, 0xa0, 0xef, 0x04,
|
||||
0x44, 0xca, 0xce, 0x24, 0x53, 0x08, 0x20, 0x65, 0xa9, 0xf9, 0xe9, 0xc2,
|
||||
0x09, 0x91, 0x5f, 0x5f, 0x51, 0x98, 0x68, 0x12, 0x44, 0xa2, 0x15, 0xad,
|
||||
0x9c, 0x10, 0x09, 0x22, 0x59, 0x12, 0x00, 0xdf, 0x2d, 0x24, 0xb0, 0x8e,
|
||||
0x1e, 0x9f, 0x0e, 0x89, 0x34, 0xf0, 0x89, 0x0e, 0x89, 0xb4, 0x02, 0x40,
|
||||
0x00, 0xa4, 0x15, 0x00, 0x02, 0xa0, 0x10, 0x80, 0x4f, 0x74, 0x48, 0xb4,
|
||||
0xc0, 0x27, 0xac, 0xf0, 0x3d, 0x14, 0x02, 0xfa, 0x51, 0xa7, 0x8c, 0x34,
|
||||
0x91, 0x88, 0xb4, 0x52, 0xda, 0x2d, 0x04, 0xa2, 0x32, 0x2a, 0x81, 0xc8,
|
||||
0x6c, 0x19, 0xae, 0x51, 0x28, 0x94, 0x07, 0xd1, 0xab, 0x6a, 0x91, 0x13,
|
||||
0x97, 0x49, 0x83, 0x94, 0xc5, 0x98, 0x49, 0x2b, 0x00, 0x04, 0x40, 0x27,
|
||||
0xa0, 0x6d, 0x80, 0x00, 0xe8, 0x04, 0x44, 0xca, 0xce, 0x24, 0x53, 0x08,
|
||||
0x20, 0x65, 0x59, 0xba, 0xd3, 0x3f, 0x53, 0x65, 0x42, 0xc0, 0x5d, 0xed,
|
||||
0x85, 0x8b, 0xc9, 0x09, 0x91, 0x20, 0x12, 0xad, 0x68, 0x25, 0x04, 0x12,
|
||||
0x44, 0xb2, 0x24, 0xc0, 0xeb, 0x85, 0x44, 0xc3, 0x01, 0xe9, 0xa1, 0xf7,
|
||||
0x98, 0x28, 0x04, 0xe0, 0x13, 0x1d, 0x12, 0x69, 0x05, 0x80, 0x00, 0x48,
|
||||
0x2b, 0x00, 0x04, 0x40, 0x21, 0x00, 0x9f, 0xe8, 0x90, 0x68, 0xc1, 0x2c,
|
||||
0xe1, 0xf0, 0xa1, 0x12, 0x69, 0x8a, 0x6f, 0x0e, 0x1a, 0x63, 0x21, 0x2c,
|
||||
0x0a, 0x89, 0xf6, 0x28, 0xed, 0x16, 0x02, 0x51, 0x19, 0x95, 0x40, 0x74,
|
||||
0x47, 0x76, 0xa2, 0x51, 0x29, 0x09, 0x67, 0xe1, 0x0c, 0x1e, 0xf1, 0x9a,
|
||||
0x99, 0x16, 0x24, 0x97, 0x2d, 0x64, 0x89, 0x06, 0xaa, 0xe7, 0x00, 0x27,
|
||||
0xba, 0x5b, 0x08, 0x6b, 0x09, 0x12, 0xd4, 0x83, 0x04, 0xf5, 0xa0, 0x2b,
|
||||
0x48, 0x2e, 0x98, 0xcb, 0xcc, 0x01, 0x4e, 0x8e, 0x83, 0xbd, 0xce, 0x69,
|
||||
0x08, 0x59, 0xc1, 0x92, 0xe0, 0x7d, 0x26, 0x9a, 0x04, 0x91, 0x84, 0x00,
|
||||
0x8d, 0xd0, 0x3a, 0x41, 0x24, 0x4b, 0xba, 0x1f, 0x21, 0xd1, 0xd0, 0x27,
|
||||
0xfe, 0x6e, 0x67, 0x7f, 0x44, 0xa4, 0x81, 0xf7, 0x74, 0x48, 0x14, 0x02,
|
||||
0x20, 0x0d, 0x28, 0x84, 0x35, 0x41, 0x10, 0x04, 0x41, 0x78, 0x55, 0x47,
|
||||
0x4f, 0x0b, 0x96, 0xd5, 0x9f, 0x3b, 0xcf, 0x2d, 0x28, 0x95, 0x40, 0x4c,
|
||||
0x7e, 0xfb, 0x9a, 0x2c, 0x85, 0x32, 0xc6, 0x42, 0xa8, 0x04, 0x84, 0xd6,
|
||||
0x85, 0x32, 0x2a, 0x81, 0xfc, 0x09, 0xab, 0x44, 0xa1, 0x14, 0xb1, 0x48,
|
||||
0xd9, 0x9d, 0x8b, 0xdb, 0xee, 0xe0, 0xc4, 0xb9, 0x1b, 0xa4, 0x40, 0x43,
|
||||
0x66, 0x0e, 0x70, 0x42, 0x25, 0x00, 0x0a, 0x61, 0x4d, 0x10, 0x04, 0x41,
|
||||
0x10, 0x29, 0x88, 0x31, 0x53, 0xb8, 0x41, 0xe7, 0x6c, 0x2f, 0xc7, 0x1c,
|
||||
0x0d, 0x41, 0x52, 0x02, 0x09, 0x65, 0xfa, 0xe4, 0xe0, 0x24, 0x01, 0x24,
|
||||
0x21, 0x40, 0x23, 0xb4, 0x4e, 0x10, 0x09, 0x58, 0x5a, 0xb6, 0xfc, 0x10,
|
||||
0x09, 0x20, 0x09, 0x09, 0xf8, 0x44, 0x87, 0x74, 0x72, 0x4e, 0x17, 0x71,
|
||||
0x22, 0xf4, 0x89, 0x0e, 0x89, 0x42, 0x00, 0xa4, 0x01, 0x85, 0xb0, 0x26,
|
||||
0x08, 0x82, 0x20, 0x08, 0x9f, 0xe8, 0x90, 0x12, 0x90, 0x6f, 0xbe, 0xfe,
|
||||
0xf4, 0x2d, 0xf8, 0x04, 0x87, 0x44, 0x21, 0x10, 0x73, 0x88, 0xc3, 0xf2,
|
||||
0x0a, 0xeb, 0x37, 0xcf, 0xe8, 0x24, 0x0a, 0x01, 0x27, 0x84, 0xd0, 0x3a,
|
||||
0x3a, 0x89, 0xf2, 0xe4, 0xd9, 0x8c, 0x5c, 0xe9, 0x59, 0x46, 0x61, 0x74,
|
||||
0x22, 0x39, 0x49, 0x41, 0x8d, 0x99, 0xca, 0x1f, 0xef, 0x79, 0x97, 0xc9,
|
||||
0xd1, 0x10, 0x18, 0x1c, 0x84, 0xcc, 0x01, 0x4e, 0xe8, 0x04, 0xb4, 0x3f,
|
||||
0x41, 0x10, 0x04, 0x41, 0xa4, 0x10, 0xcc, 0xe5, 0xf5, 0xca, 0x56, 0x1e,
|
||||
0xbc, 0xf7, 0xb5, 0x93, 0x94, 0x9d, 0x49, 0x56, 0xb0, 0x24, 0x84, 0x89,
|
||||
0xf8, 0xf3, 0x66, 0xef, 0x23, 0x41, 0x24, 0x27, 0x04, 0x8d, 0xd0, 0x3a,
|
||||
0x41, 0xa4, 0xe5, 0xfb, 0xdd, 0x63, 0x12, 0x40, 0xa2, 0xa1, 0x4f, 0x74,
|
||||
0x48, 0x24, 0x1c, 0x16, 0xbb, 0xfd, 0xf9, 0xd7, 0xf3, 0x2e, 0x3c, 0x85,
|
||||
0x00, 0x48, 0x03, 0x0a, 0x61, 0x4d, 0x10, 0x04, 0x41, 0x10, 0x3e, 0x31,
|
||||
0xaf, 0x1f, 0xf8, 0xe8, 0x63, 0xec, 0x0f, 0xef, 0xd0, 0xc0, 0x7b, 0x38,
|
||||
0x78, 0xd2, 0xc4, 0xe4, 0xa3, 0xe5, 0x89, 0xbf, 0x21, 0x68, 0x51, 0x08,
|
||||
0xa1, 0x04, 0x94, 0xd6, 0x51, 0xec, 0x23, 0xb8, 0x94, 0x6d, 0x21, 0x50,
|
||||
0x14, 0x12, 0x85, 0x42, 0x99, 0xb2, 0x33, 0xc9, 0x14, 0x02, 0xf8, 0x74,
|
||||
0x5e, 0xdf, 0xb8, 0xc0, 0xac, 0x3f, 0xf9, 0x71, 0x07, 0xff, 0x67, 0x31,
|
||||
0xe6, 0x98, 0x61, 0xc8, 0x31, 0xc3, 0x90, 0x63, 0x86, 0x21, 0xc7, 0x0c,
|
||||
0x43, 0x8e, 0x19, 0x86, 0x1c, 0x33, 0x0c, 0x39, 0x66, 0x18, 0x72, 0xcc,
|
||||
0x88, 0xc8, 0xf9, 0xd1, 0x1b, 0xe1, 0x81, 0xb6, 0xc3, 0x8e, 0xe6, 0x4b,
|
||||
0x0a, 0x01, 0xa4, 0x4c, 0x43, 0x96, 0x94, 0x40, 0x42, 0x99, 0x84, 0x00,
|
||||
0x31, 0xd5, 0x88, 0xef, 0x65, 0x68, 0xe9, 0x18, 0xf0, 0x09, 0x40, 0x3d,
|
||||
0x00, 0x15, 0x25, 0x15, 0x25, 0x15, 0x25, 0x15, 0x25, 0x15, 0x25, 0x15,
|
||||
0x65, 0xba, 0x97, 0xcd, 0x97, 0x39, 0xe8, 0x84, 0x34, 0x0a, 0x20, 0x4e,
|
||||
0x48, 0x78, 0x47, 0x07, 0x47, 0xaf, 0x20, 0x48, 0x83, 0xd3, 0xfb, 0xfe,
|
||||
0xe9, 0x22, 0x0f, 0x21, 0xce, 0xa1, 0x53, 0xa0, 0x08, 0x29, 0x42, 0x8a,
|
||||
0x90, 0x22, 0xa4, 0x08, 0x29, 0x42, 0x6e, 0x24, 0x59, 0x76, 0x39, 0xf8,
|
||||
0x86, 0x67, 0xa1, 0x8a, 0x57, 0x10, 0x14, 0x02, 0xf0, 0x0a, 0x07, 0xa1,
|
||||
0x57, 0x22, 0x96, 0x2e, 0x96, 0x4e, 0x28, 0x04, 0xee, 0x89, 0x97, 0x75,
|
||||
0x82, 0x31, 0x3a, 0x89, 0x91, 0x88, 0x11, 0x88, 0x11, 0x88, 0x11, 0x88,
|
||||
0x11, 0x88, 0x11, 0x88, 0xee, 0xc4, 0xf5, 0xe1, 0xfd, 0x9d, 0xc7, 0x85,
|
||||
0x57, 0x42, 0x09, 0x44, 0xa5, 0x38, 0x91, 0x94, 0x29, 0x27, 0xf3, 0x39,
|
||||
0x66, 0x35, 0xe6, 0x98, 0x61, 0xc8, 0x31, 0xe3, 0x1c, 0x6e, 0xbb, 0xd3,
|
||||
0xe4, 0xc9, 0x0b, 0xa7, 0x71, 0x03, 0xf9, 0x8f, 0x0c, 0x43, 0x8e, 0x19,
|
||||
0x86, 0x1c, 0x33, 0x0c, 0x39, 0x66, 0x18, 0x72, 0xcc, 0x30, 0xe4, 0x45,
|
||||
0xc6, 0xb2, 0xff, 0xdb, 0xbf, 0xf9, 0x5b, 0x80, 0x21, 0x47, 0x07, 0x43,
|
||||
0x88, 0x02, 0x83, 0x8b, 0xa4, 0x41, 0x14, 0x9c, 0x10, 0x25, 0x39, 0xa4,
|
||||
0x40, 0x70, 0x3e, 0x20, 0x54, 0x07, 0x40, 0xb1, 0x2b, 0xba, 0xc7, 0x4b,
|
||||
0x23, 0x42, 0x11, 0x00, 0x11, 0x00, 0x11, 0x00, 0x11, 0x00, 0xc9, 0x4f,
|
||||
0x22, 0x7e, 0xec, 0xc2, 0x95, 0x04, 0x0a, 0x42, 0x0a, 0x42, 0x0a, 0x42,
|
||||
0x0a, 0x42, 0x2a, 0x09, 0x78, 0x51, 0x47, 0xe9, 0x86, 0x02, 0xaa, 0x80,
|
||||
0x2a, 0xa0, 0x85, 0x82, 0x02, 0x76, 0x56, 0x1f, 0xfc, 0xf3, 0xe3, 0xde,
|
||||
0xd9, 0x7e, 0xba, 0xe2, 0x16, 0x59, 0x43, 0x9f, 0x2b, 0x56, 0xd0, 0x95,
|
||||
0xe2, 0x2e, 0xb4, 0x67, 0x57, 0x7d, 0xa4, 0xbb, 0x8f, 0x73, 0x96, 0xc5,
|
||||
0x55, 0x09, 0x0e, 0xec, 0x8a, 0x2a, 0xa9, 0x4a, 0xaa, 0x92, 0xaa, 0x24,
|
||||
0x85, 0x40, 0xe1, 0x35, 0x8b, 0x30, 0x08, 0xe0, 0x48, 0x88, 0x00, 0x22,
|
||||
0xb8, 0xec, 0x7f, 0xff, 0xb1, 0x5f, 0xba, 0x68, 0x2e, 0x29, 0x59, 0x10,
|
||||
0xd9, 0x32, 0x5c, 0x72, 0xe7, 0xa4, 0x1a, 0x17, 0x13, 0xff, 0xeb, 0x77,
|
||||
0x3e, 0xe9, 0x96, 0x02, 0x44, 0x00, 0x11, 0x40, 0x04, 0x10, 0x01, 0x44,
|
||||
0x00, 0x71, 0x22, 0x92, 0xef, 0xd3, 0x40, 0x28, 0x01, 0x48, 0x34, 0x10,
|
||||
0x34, 0x90, 0x68, 0x20, 0x68, 0x20, 0xd1, 0x40, 0xd0, 0x40, 0xa2, 0x81,
|
||||
0xa0, 0x81, 0x44, 0x03, 0x41, 0x03, 0x89, 0x06, 0x82, 0x06, 0x12, 0x0d,
|
||||
0x04, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d,
|
||||
0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x01, 0xf9, 0xd5, 0xa7, 0xe1, 0xfc, 0x9a,
|
||||
0xed, 0xe9, 0xd0, 0xbb, 0xf0, 0xac, 0xf4, 0x35, 0xd5, 0x5a, 0x87, 0xdc,
|
||||
0x52, 0xeb, 0xc0, 0x3f, 0x4b, 0xf9, 0x28, 0xef, 0xad, 0x9e, 0xd5, 0x8a,
|
||||
0x91, 0xd1, 0x84, 0x7b, 0x13, 0x77, 0x0e, 0x2d, 0xc7, 0x25, 0xb5, 0xa6,
|
||||
0xa5, 0x56, 0xe3, 0x08, 0x4d, 0x4b, 0xad, 0x46, 0x70, 0xe7, 0x2d, 0x6d,
|
||||
0x9e, 0xa5, 0x6c, 0x37, 0x8b, 0x6a, 0xe0, 0x74, 0x59, 0x78, 0x8a, 0x1a,
|
||||
0x83, 0x4c, 0x3d, 0x1d, 0xfd, 0x7f, 0xf4, 0xee, 0x77, 0xbd, 0xdb, 0x5d,
|
||||
0x89, 0xb1, 0x74, 0xe6, 0x77, 0xa5, 0xf7, 0x0a, 0x3d, 0x83, 0x2a, 0x7a,
|
||||
0xe8, 0xe9, 0x96, 0xf4, 0xd0, 0xdd, 0xbd, 0x44, 0xbb, 0xe4, 0xd6, 0xff,
|
||||
0xd5, 0xfc, 0xdb, 0x58, 0xcc, 0x37, 0xe7, 0xf9, 0xf0, 0x49, 0x2e, 0x66,
|
||||
0x7f, 0xf5, 0x17, 0xee, 0x7d, 0x86, 0x31, 0x3c, 0xbc, 0x18, 0x1e, 0x8e,
|
||||
0xc3, 0xc3, 0xbb, 0xc3, 0xc3, 0x1f, 0x0e, 0xff, 0xcc, 0xb3, 0xfe, 0x0f,
|
||||
0x6d, 0xb0, 0x1a, 0x3b, 0xbc, 0x18, 0x1e, 0xfe, 0x79, 0x78, 0xcd, 0xab,
|
||||
0x8b, 0x5f, 0x43, 0xbb, 0x35, 0x6e, 0x67, 0x61, 0x53, 0x63, 0xdb, 0xfc,
|
||||
0x65, 0x2e, 0x7d, 0xc6, 0xab, 0x67, 0xa7, 0x55, 0xdb, 0x43, 0xe1, 0x56,
|
||||
0xa7, 0x74, 0xc7, 0x23, 0x13, 0x28, 0x44, 0xf5, 0xbf, 0x69, 0x6e, 0xfd,
|
||||
0x34, 0x07, 0xde, 0xfb, 0xf1, 0x5b, 0x06, 0xe7, 0xcb, 0xea, 0xa4, 0x53,
|
||||
0xee, 0x0e, 0xab, 0xb4, 0xf3, 0x8c, 0x78, 0xd0, 0xd7, 0xbe, 0xd0, 0xcd,
|
||||
0xe2, 0x5f, 0x1c, 0xf5, 0x44, 0x9f, 0xbf, 0x60, 0xb3, 0xc5, 0xf2, 0x6a,
|
||||
0x3d, 0x6d, 0x6e, 0x18, 0xe3, 0x3a, 0xab, 0x43, 0x0b, 0x30, 0xe7, 0x68,
|
||||
0x57, 0xda, 0x89, 0xfe, 0xe9, 0x50, 0x10, 0xdf, 0xef, 0x73, 0x67, 0xd6,
|
||||
0xf9, 0xec, 0x4f, 0x3f, 0x21, 0x73, 0x24, 0x0f, 0xcf, 0xfd, 0xd5, 0xbc,
|
||||
0x5b, 0x1f, 0xcf, 0x59, 0x95, 0xa5, 0x6c, 0xfa, 0x76, 0x66, 0x4e, 0x6d,
|
||||
0x79, 0x75, 0xdf, 0xb7, 0x5d, 0x1e, 0xa0, 0x68, 0xd9, 0x60, 0xce, 0x06,
|
||||
0x1b, 0xda, 0xc1, 0xc1, 0x85, 0x46, 0x2e, 0x8f, 0xd1, 0xcd, 0xde, 0x09,
|
||||
0x61, 0x89, 0x76, 0xc9, 0xd6, 0x9b, 0x5c, 0x1d, 0x9e, 0x79, 0xcc, 0xda,
|
||||
0xa6, 0x76, 0x7a, 0xe9, 0xdd, 0x3d, 0x4d, 0x6b, 0x7a, 0x75, 0x30, 0xbb,
|
||||
0xd3, 0x7b, 0x5f, 0xef, 0xed, 0xa5, 0x7f, 0xac, 0xff, 0x61, 0xa7, 0xbd,
|
||||
0x97, 0x93, 0xdf, 0x28, 0xbd, 0x48, 0x7e, 0xb5, 0x62, 0xed, 0xaf, 0xda,
|
||||
0xb3, 0x9f, 0x78, 0xd8, 0x6a, 0xad, 0xc2, 0x1a, 0xda, 0xad, 0xa5, 0xfa,
|
||||
0x2d, 0x7f, 0x7e, 0xea, 0x36, 0xa7, 0x2b, 0x96, 0x66, 0x27, 0x87, 0xbc,
|
||||
0xc1, 0xb3, 0x0d, 0xbc, 0xe2, 0x5e, 0xfb, 0xa0, 0xe5, 0xf7, 0xe8, 0xff,
|
||||
0xe9, 0x9a, 0x23, 0x2a, 0x63, 0x77, 0x7d, 0x79, 0xc7, 0x05, 0xfc, 0x4f,
|
||||
0xaf, 0x8a, 0xb0, 0x4a, 0x3b, 0xcf, 0xd8, 0x66, 0xfe, 0x4b, 0x5f, 0xf4,
|
||||
0xf5, 0xbe, 0x79, 0x6b, 0xe3, 0xf1, 0xed, 0xc5, 0x8c, 0x51, 0xd7, 0x4f,
|
||||
0xbb, 0xb1, 0xd7, 0xe5, 0xe0, 0x66, 0x27, 0x2f, 0xe6, 0x1e, 0x58, 0x34,
|
||||
0x2a, 0x9b, 0xa2, 0x76, 0xc7, 0x93, 0xa5, 0x2d, 0x6c, 0xbe, 0x57, 0xff,
|
||||
0xe0, 0xa1, 0xf7, 0x87, 0xdd, 0xf9, 0xa0, 0x1c, 0x9d, 0x3e, 0xd9, 0xf3,
|
||||
0x3c, 0xe1, 0x6a, 0xe4, 0xaa, 0x2c, 0x65, 0xa3, 0x7e, 0xab, 0xdd, 0x3b,
|
||||
0xb1, 0x77, 0xe4, 0xec, 0xad, 0x84, 0xe7, 0x08, 0xcf, 0xae, 0x6d, 0xe5,
|
||||
0x7f, 0x94, 0x5e, 0x97, 0xff, 0x8a, 0x7c, 0xb6, 0x7e, 0x77, 0xf7, 0x98,
|
||||
0x35, 0xee, 0xfa, 0xee, 0x16, 0x76, 0xb1, 0x6b, 0x37, 0x57, 0x5f, 0x1e,
|
||||
0xbb, 0xb5, 0x24, 0x95, 0xbd, 0x67, 0xbd, 0xfa, 0x7f, 0x2e, 0x2c, 0xd1,
|
||||
0x2e, 0x79, 0x22, 0x8f, 0xec, 0x7d, 0x53, 0x59, 0xaf, 0xd7, 0x79, 0xe9,
|
||||
0x76, 0x9f, 0x9d, 0xeb, 0xf5, 0x35, 0x47, 0xb4, 0x1d, 0xc3, 0xeb, 0x74,
|
||||
0x9c, 0xb6, 0x1c, 0x71, 0xb6, 0xe1, 0x72, 0x72, 0x4e, 0x40, 0x84, 0x15,
|
||||
0xcb, 0x32, 0xf8, 0xa6, 0xde, 0x3e, 0x99, 0x2b, 0xb7, 0x86, 0x66, 0xc7,
|
||||
0xaf, 0x5c, 0xd7, 0x7a, 0xaa, 0x9f, 0xea, 0xa7, 0x83, 0x8e, 0x31, 0xbd,
|
||||
0x8b, 0x74, 0x46, 0x73, 0x4a, 0xa8, 0x80, 0xbb, 0x2b, 0xae, 0x64, 0x77,
|
||||
0x32, 0x99, 0x66, 0xc0, 0x97, 0xbe, 0xbe, 0xe6, 0xdf, 0xd3, 0xaf, 0x32,
|
||||
0xf2, 0x1f, 0x54, 0xfd, 0x89, 0x20, 0xbe, 0x2c, 0x43, 0xcd, 0xae, 0xbd,
|
||||
0x3f, 0x5e, 0xef, 0xd6, 0xef, 0xf1, 0x77, 0xb7, 0x66, 0xd9, 0xd8, 0xad,
|
||||
0xf5, 0xc7, 0x6c, 0x75, 0xce, 0xd9, 0xba, 0xe1, 0x4f, 0xe9, 0xed, 0xbb,
|
||||
0xb1, 0x61, 0x8c, 0xeb, 0x5c, 0xed, 0xc5, 0x3d, 0x84, 0x96, 0x41, 0xae,
|
||||
0xaf, 0x39, 0x79, 0xea, 0xf2, 0xde, 0xef, 0xb6, 0x94, 0xd2, 0x97, 0x43,
|
||||
0xbb, 0x3f, 0xba, 0x72, 0xb3, 0x16, 0x9c, 0xd0, 0x2e, 0x8e, 0xe0, 0xc2,
|
||||
0x88, 0x20, 0xa5, 0xba, 0x2b, 0xf4, 0xe3, 0x9f, 0xae, 0x1e, 0x16, 0x9c,
|
||||
0x89, 0x96, 0x2e, 0xd4, 0xda, 0xb7, 0xca, 0x58, 0xb7, 0x02, 0xba, 0xd1,
|
||||
0x72, 0x68, 0x09, 0x5a, 0x64, 0x8b, 0x6c, 0x91, 0x2d, 0x72, 0xd8, 0x6a,
|
||||
0x0d, 0x07, 0xd1, 0xd2, 0x85, 0xd5, 0x65, 0x0c, 0x6a, 0x56, 0x47, 0x79,
|
||||
0x88, 0x92, 0x5d, 0xe5, 0x5d, 0x78, 0x53, 0xbd, 0x2b, 0xfd, 0x9a, 0x4c,
|
||||
0x97, 0x1a, 0x34, 0xd4, 0xa0, 0xa1, 0x06, 0x0d, 0x35, 0x68, 0xa8, 0x41,
|
||||
0x43, 0x8d, 0xee, 0x9f, 0xa9, 0x40, 0x83, 0x5f, 0xd4, 0xda, 0x67, 0xf3,
|
||||
0x8c, 0x9b, 0x77, 0x5c, 0x41, 0xc9, 0xb2, 0xd6, 0x77, 0xce, 0xdd, 0xb7,
|
||||
0xed, 0xfe, 0x7c, 0xae, 0x0d, 0x25, 0xc7, 0x72, 0xff, 0x03, 0x96, 0xa7,
|
||||
0xbf, 0x9e, 0xb1, 0xdc, 0x9b, 0xe3, 0xb7, 0xf7, 0x69, 0x12, 0xb7, 0xdf,
|
||||
0xff, 0xe6, 0xc6, 0xa8, 0x99, 0xcf, 0x36, 0xde, 0x6e, 0xf4, 0xd9, 0x61,
|
||||
0x74, 0xce, 0x59, 0x3f, 0xef, 0xf2, 0x72, 0xdc, 0x78, 0xbe, 0x55, 0xa3,
|
||||
0x8d, 0x16, 0xea, 0x1c, 0xec, 0x9a, 0x5c, 0x76, 0x44, 0x17, 0x9c, 0x5f,
|
||||
0x50, 0x52, 0xef, 0x9e, 0xe1, 0xf6, 0xa1, 0x34, 0x57, 0x58, 0x7e, 0xed,
|
||||
0xfe, 0x2e, 0x8a, 0x65, 0xba, 0x6b, 0x37, 0x71, 0x9c, 0x73, 0x1d, 0xc7,
|
||||
0xa6, 0x1f, 0xad, 0xb1, 0xbb, 0xba, 0xd6, 0x56, 0xdb, 0x55, 0xfd, 0x0a,
|
||||
0xc2, 0xc8, 0xa7, 0xab, 0xdb, 0xd7, 0x05, 0x54, 0xca, 0x86, 0x3b, 0xc2,
|
||||
0xad, 0x93, 0x75, 0xad, 0x2f, 0x0f, 0x7a, 0x03, 0x1b, 0x31, 0xb8, 0xb2,
|
||||
0xb1, 0x9c, 0x9a, 0xa3, 0x52, 0xe9, 0x77, 0x02, 0xe5, 0xd1, 0x66, 0x86,
|
||||
0xa6, 0x85, 0xfe, 0xce, 0xc0, 0x81, 0xb2, 0xe2, 0xd6, 0xee, 0x5b, 0xba,
|
||||
0xd3, 0x47, 0x7d, 0x0d, 0xad, 0x0c, 0x8c, 0xe4, 0x80, 0x93, 0xca, 0x5a,
|
||||
0x44, 0x31, 0xa4, 0x44, 0x2f, 0x30, 0x3d, 0x75, 0xd5, 0xb5, 0x21, 0x75,
|
||||
0xfb, 0x8d, 0xe4, 0x91, 0x73, 0x3c, 0x4f, 0x7c, 0xb2, 0x87, 0x45, 0x57,
|
||||
0x39, 0xe0, 0x36, 0x2e, 0xc4, 0xec, 0x8e, 0x2a, 0x9f, 0x3d, 0x5d, 0xdf,
|
||||
0x5e, 0x71, 0xad, 0x38, 0xa2, 0xa3, 0x7e, 0xa7, 0x1b, 0x9f, 0x14, 0x3b,
|
||||
0x50, 0x63, 0x5a, 0xec, 0x4d, 0x8d, 0xdf, 0xfa, 0xc0, 0x75, 0xbc, 0xfe,
|
||||
0x88, 0x43, 0xe9, 0xaa, 0xc5, 0xfd, 0xf7, 0x7e, 0x7e, 0x55, 0x96, 0xb2,
|
||||
0x53, 0x79, 0xb5, 0xae, 0x46, 0xa9, 0xc9, 0x61, 0x15, 0xff, 0x28, 0xf5,
|
||||
0x7d, 0x8c, 0x3f, 0x3d, 0xa1, 0x4e, 0xb9, 0x55, 0x30, 0x8d, 0x03, 0x59,
|
||||
0x80, 0xb9, 0xfa, 0x67, 0xbb, 0x66, 0x8e, 0x2f, 0x32, 0xb2, 0xb6, 0x95,
|
||||
0xb1, 0x9f, 0xd1, 0x2b, 0x15, 0x61, 0x7c, 0xbb, 0x64, 0x51, 0xff, 0xdb,
|
||||
0xd2, 0x0f, 0xfb, 0xe5, 0x78, 0xfe, 0xd2, 0xb7, 0x0f, 0x9a, 0xdd, 0x9b,
|
||||
0x2c, 0x27, 0x4d, 0x2f, 0x85, 0x65, 0x17, 0x8e, 0xf0, 0x76, 0x4f, 0xa8,
|
||||
0xa0, 0x7a, 0xeb, 0xb6, 0x7b, 0xf1, 0x68, 0x86, 0xce, 0x7f, 0x20, 0x4a,
|
||||
0x59, 0xef, 0xcf, 0xa3, 0xf3, 0x5e, 0xfd, 0xca, 0xab, 0xb2, 0x5b, 0xb3,
|
||||
0x6d, 0x37, 0x8d, 0xf9, 0xf3, 0x99, 0x54, 0x56, 0xa6, 0x75, 0x4f, 0x8b,
|
||||
0xbd, 0xc2, 0x02, 0xa8, 0x08, 0x46, 0x15, 0xa9, 0x5d, 0xb8, 0xc6, 0xa4,
|
||||
0xef, 0x9f, 0xfb, 0x41, 0x89, 0xa1, 0xd5, 0x8e, 0xe9, 0x98, 0x52, 0x1e,
|
||||
0x78, 0xc1, 0x61, 0xe1, 0x5c, 0x1a, 0x61, 0x68, 0x5a, 0x90, 0x76, 0xc9,
|
||||
0x51, 0x25, 0x58, 0x92, 0x25, 0x62, 0x20, 0x83, 0x2f, 0x4a, 0x6d, 0x87,
|
||||
0xb2, 0xd2, 0x94, 0x17, 0x5f, 0xe8, 0xc9, 0xdf, 0x14, 0xe3, 0x9e, 0x8d,
|
||||
0xc8, 0x56, 0x69, 0xfc, 0xd6, 0xb9, 0xf1, 0x22, 0x45, 0x4f, 0xaf, 0xf6,
|
||||
0x32, 0x81, 0x24, 0x1a, 0xa4, 0x56, 0x38, 0xaa, 0x94, 0xc6, 0xfc, 0xfd,
|
||||
0x85, 0x63, 0x65, 0x25, 0x8c, 0x6c, 0xa7, 0x34, 0x1e, 0x8e, 0xec, 0x78,
|
||||
0xfb, 0xc8, 0x39, 0x9f, 0xd0, 0xf3, 0x2d, 0xfe, 0x64, 0x4e, 0x9e, 0xf9,
|
||||
0xcd, 0xa3, 0x28, 0xb6, 0xaf, 0xf1, 0xc5, 0x84, 0xf6, 0x91, 0x6f, 0x6b,
|
||||
0xa2, 0xf6, 0xd4, 0x05, 0x2d, 0xa3, 0x6f, 0x55, 0x5d, 0x93, 0xfa, 0xfd,
|
||||
0x3f, 0x75, 0xe9, 0x1b, 0xff, 0x28, 0x27, 0x69, 0x73, 0xd4, 0x68, 0xe4,
|
||||
0xd2, 0xd3, 0x51, 0x03, 0x95, 0x5d, 0xab, 0xfa, 0x1a, 0x1a, 0x6b, 0xeb,
|
||||
0x15, 0xba, 0xf8, 0x99, 0xc5, 0xf4, 0xc2, 0x0b, 0x29, 0xb2, 0xf0, 0xa2,
|
||||
0x33, 0xda, 0xed, 0x76, 0xbb, 0xdd, 0x6e, 0xb7, 0xdb, 0xed, 0x76, 0x7b,
|
||||
0xdb, 0x93, 0x0f, 0x7c, 0x7d, 0x9b, 0x53, 0x1d, 0x54, 0x84, 0x66, 0x5b,
|
||||
0x9d, 0xf1, 0x43, 0xb9, 0xff, 0x86, 0x8a, 0xae, 0xa5, 0xfa, 0xa4, 0xf2,
|
||||
0x5d, 0x3f, 0x7e, 0xe3, 0x12, 0x46, 0x61, 0x6a, 0xea, 0x42, 0x8f, 0x8f,
|
||||
0x5a, 0x50, 0x10, 0xc9, 0x1d, 0x9e, 0xf4, 0xd4, 0xfd, 0x54, 0xed, 0xdb,
|
||||
0x6e, 0x95, 0xa5, 0xfe, 0xc9, 0xc8, 0xac, 0xfe, 0x2b, 0xac, 0x45, 0x30,
|
||||
0x29, 0x66, 0xb4, 0xdb, 0x6d, 0x8d, 0x99, 0x79, 0x97, 0xbf, 0x5e, 0x15,
|
||||
0x4f, 0x05, 0x49, 0xba, 0x93, 0x7b, 0x37, 0x92, 0x76, 0xbb, 0xdd, 0x16,
|
||||
0xeb, 0x61, 0xfc, 0x45, 0x77, 0xf1, 0x6a, 0x3e, 0xa9, 0x75, 0x1b, 0x75,
|
||||
0x53, 0x1b, 0xa5, 0x55, 0x6f, 0xe1, 0xab, 0x96, 0xd1, 0x0f, 0x7e, 0xcd,
|
||||
0x8b, 0x39, 0x1a, 0xf5, 0x84, 0x5f, 0x46, 0x97, 0xb8, 0xd7, 0xac, 0x9f,
|
||||
0x0e, 0xb5, 0xba, 0xa5, 0xb5, 0x86, 0xa6, 0x26, 0x7d, 0xa5, 0xae, 0xe6,
|
||||
0xa0, 0x3e, 0x7a, 0x5b, 0xa7, 0xad, 0xc3, 0x7c, 0x3a, 0x06, 0xa7, 0x6a,
|
||||
0x68, 0x1a, 0xdd, 0x43, 0x1a, 0xf2, 0x4f, 0x5f, 0xfe, 0xdb, 0xbd, 0x67,
|
||||
0x3d, 0xbd, 0xd1, 0x8c, 0xf6, 0xce, 0x61, 0xc5, 0x89, 0x9e, 0x21, 0x0d,
|
||||
0x79, 0xe2, 0x90, 0x86, 0x94, 0x62, 0x48, 0x8f, 0x04, 0xf9, 0xe4, 0xbd,
|
||||
0xf3, 0x61, 0x8b, 0xe3, 0xeb, 0x8b, 0xcd, 0x0f, 0x8d, 0xb5, 0x8c, 0xdc,
|
||||
0xc2, 0xf1, 0xe6, 0xdd, 0x9c, 0x7f, 0xc9, 0x7a, 0x50, 0xae, 0x6d, 0xf6,
|
||||
0x4d, 0x78, 0xf3, 0xee, 0x7f, 0xed, 0xf1, 0xb1, 0xe3, 0x1e, 0x60, 0x52,
|
||||
0xff, 0xe4, 0xc6, 0xc4, 0xdb, 0xfa, 0xfb, 0x07, 0xbb, 0xb6, 0x76, 0xbc,
|
||||
0x89, 0xb9, 0x3f, 0x1c, 0xff, 0x77, 0x57, 0x7e, 0xb1, 0x76, 0x7c, 0x73,
|
||||
0x53, 0x96, 0x3f, 0x7c, 0x3d, 0xcd, 0xca, 0x8b, 0xd3, 0xa7, 0x9a, 0xf6,
|
||||
0xfa, 0xb1, 0xbf, 0x9f, 0x50, 0x3f, 0xec, 0xda, 0xcf, 0xb2, 0xab, 0x6b,
|
||||
0xed, 0x11, 0x2f, 0x1d, 0x12, 0xfb, 0xf2, 0x3b, 0x6c, 0x7c, 0x63, 0x9a,
|
||||
0x7d, 0xb8, 0x5a, 0x3f, 0x5c, 0xff, 0xd5, 0x09, 0xff, 0x32, 0x65, 0x36,
|
||||
0xf8, 0x07, 0x77, 0x2a, 0x9d, 0xb7, 0x3a, 0xf8, 0xee, 0x2d, 0xfd, 0xc7,
|
||||
0x65, 0x1d, 0x9d, 0x5a, 0x59, 0x8f, 0xa7, 0xe7, 0xda, 0xd6, 0x5b, 0x6b,
|
||||
0xbf, 0x47, 0xda, 0x9f, 0x5a, 0x3d, 0x14, 0xeb, 0x5e, 0xfb, 0x33, 0x3b,
|
||||
0x93, 0xa9, 0xe7, 0xfa, 0xc6, 0xd2, 0xa4, 0xc6, 0x0c, 0x76, 0x3f, 0xf7,
|
||||
0x14, 0x1e, 0xa1, 0x1c, 0x3c, 0x81, 0xd9, 0x94, 0xc9, 0x2f, 0xd8, 0x73,
|
||||
0xf0, 0xd5, 0x1d, 0x9d, 0x38, 0x9c, 0x6d, 0x86, 0xf8, 0xe1, 0x62, 0xfa,
|
||||
0xf0, 0x47, 0xf6, 0x66, 0x8e, 0xb6, 0x3d, 0x3c, 0xff, 0xc6, 0xae, 0xc4,
|
||||
0x7e, 0x95, 0x73, 0x11, 0xd9, 0xff, 0x7e, 0x46, 0x1b, 0x95, 0xeb, 0x10,
|
||||
0xd9, 0xda, 0x71, 0xf7, 0x13, 0xc5, 0xd1, 0x1b, 0xe8, 0xcb, 0x96, 0x7a,
|
||||
0xc9, 0x97, 0xb8, 0xbe, 0x32, 0xdd, 0xdb, 0x22, 0x7c, 0xfc, 0x52, 0xc7,
|
||||
0x73, 0xfc, 0xd5, 0xaf, 0xd7, 0xcd, 0x9c, 0x72, 0xca, 0xe8, 0x7e, 0x99,
|
||||
0x7d, 0x67, 0x1f, 0x7f, 0xf9, 0xca, 0x9e, 0xf7, 0x2c, 0xdf, 0x5e, 0xb9,
|
||||
0x3c, 0x38, 0x31, 0xa0, 0xee, 0x23, 0xe3, 0x9b, 0xad, 0xc1, 0xa9, 0x61,
|
||||
0x7f, 0x6b, 0xcd, 0x58, 0x66, 0xe5, 0x95, 0x8b, 0xa2, 0xff, 0x1f, 0xc6,
|
||||
0x7c, 0xc1, 0xdf, 0xd3, 0x5f, 0x18, 0xf3, 0xdd, 0xac, 0xcb, 0x7f, 0x39,
|
||||
0x3c, 0x30, 0x18, 0x9e, 0x0c, 0xae, 0x5b, 0x73, 0x9d, 0x17, 0x3e, 0x44,
|
||||
0x77, 0xfa, 0xd0, 0x60, 0x3c, 0x78, 0xe7, 0x13, 0xbf, 0x9d, 0xca, 0x84,
|
||||
0x95, 0x9e, 0x7f, 0x78, 0x79, 0xad, 0x63, 0x56, 0xd8, 0x84, 0xd4, 0x3a,
|
||||
0xe5, 0x9b, 0x29, 0xdd, 0xe3, 0xa2, 0x67, 0x3c, 0x21, 0x8e, 0x27, 0x0c,
|
||||
0x9d, 0x4d, 0xfb, 0xfd, 0x72, 0xb0, 0x1a, 0xf4, 0x79, 0x1f, 0x78, 0x9b,
|
||||
0xb7, 0xa8, 0xd5, 0x8f, 0x8d, 0x75, 0x74, 0x76, 0x6d, 0xff, 0xe2, 0xf8,
|
||||
0xa3, 0xc7, 0xee, 0x8e, 0x8b, 0xe9, 0x33, 0x8a, 0x8e, 0x1b, 0x83, 0xbd,
|
||||
0x1f, 0x3e, 0xe7, 0xb3, 0xb6, 0xeb, 0xdd, 0x9b, 0x9f, 0x5d, 0xcc, 0x69,
|
||||
0xc6, 0x62, 0x8f, 0x5b, 0x9f, 0x77, 0xb3, 0xbe, 0xb3, 0xcf, 0x9d, 0xfc,
|
||||
0xff, 0x46, 0x5e, 0x0f, 0x70, 0xf8, 0xfb, 0xd6, 0xd7, 0x3c, 0xbc, 0x5a,
|
||||
0xce, 0xad, 0x7d, 0xcd, 0x39, 0x67, 0xfd, 0x3d, 0x97, 0x27, 0x6f, 0xfa,
|
||||
0x66, 0x76, 0xfb, 0x32, 0x82, 0xdb, 0x91, 0xdb, 0xb9, 0xc9, 0xe7, 0xee,
|
||||
0x70, 0xe2, 0x60, 0xf7, 0xb6, 0xd3, 0x43, 0xf8, 0xe2, 0xdb, 0x9a, 0xb7,
|
||||
0x6c, 0xb1, 0xed, 0xf7, 0x6f, 0xf1, 0xde, 0x7d, 0x64, 0x77, 0x07, 0xd3,
|
||||
0xa7, 0x36, 0xfc, 0xe6, 0xa6, 0x26, 0xd7, 0x3e, 0x3a, 0x86, 0x8f, 0x9d,
|
||||
0x11, 0x5d, 0x2b, 0xa3, 0x38, 0xc8, 0xc6, 0x75, 0x38, 0xfb, 0x0c, 0x99,
|
||||
0xd3, 0xb3, 0xbf, 0xce, 0xba, 0x8d, 0xa7, 0x8f, 0xed, 0xde, 0x0d, 0x36,
|
||||
0xaf, 0xa5, 0x70, 0x4c, 0xf7, 0xef, 0x7f, 0x7d, 0xab, 0xe3, 0x1b, 0x72,
|
||||
0xa0, 0xbc, 0x36, 0xc7, 0x38, 0x2c, 0xdc, 0xed, 0xef, 0x4f, 0x7e, 0xe9,
|
||||
0x06, 0xaf, 0x0f, 0x78, 0xf9, 0xe0, 0xf6, 0x8f, 0x1e, 0xea, 0xb8, 0x9b,
|
||||
0x78, 0x87, 0xdb, 0x27, 0x75, 0x55, 0xde, 0x39, 0x68, 0x15, 0xef, 0x08,
|
||||
0xf9, 0xaf, 0x1b, 0x1d, 0xfa, 0xcc, 0xcd, 0x71, 0x71, 0x00, 0xdc, 0x2e,
|
||||
0xbf, 0xc0, 0x2f, 0x73, 0x60, 0x9f, 0x73, 0xf4, 0x1f, 0x93, 0xf9, 0x0b,
|
||||
0xf6, 0x8f, 0xdb, 0xfb, 0x12, 0x3e, 0x8a, 0x83, 0x00, 0xa7, 0x1b, 0x6f,
|
||||
0x76, 0x40, 0x5c, 0xe7, 0x7f, 0x02, 0xb9, 0xf3, 0x85, 0x79, 0x6b, 0x0f,
|
||||
0x79, 0x6b, 0x79
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 7.9 KiB |
Reference in New Issue
Block a user